From: Rudolf Polzer Date: Thu, 12 Sep 2013 16:17:01 +0000 (+0200) Subject: Move libraries into subdirectories for better selectivity when building. X-Git-Tag: xonotic-v0.8.0~78 X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fxonotic.git;a=commitdiff_plain;h=85864bd56ab6212ceba8b493afe8a54b14a9abb2 Move libraries into subdirectories for better selectivity when building. --- diff --git a/misc/builddeps/dp.linux32/bin/blind_id b/misc/builddeps/dp.linux32/bin/blind_id deleted file mode 100755 index 35bb6834..00000000 Binary files a/misc/builddeps/dp.linux32/bin/blind_id and /dev/null differ diff --git a/misc/builddeps/dp.linux32/bin/cjpeg b/misc/builddeps/dp.linux32/bin/cjpeg deleted file mode 100755 index 4ff73ae3..00000000 Binary files a/misc/builddeps/dp.linux32/bin/cjpeg and /dev/null differ diff --git a/misc/builddeps/dp.linux32/bin/djpeg b/misc/builddeps/dp.linux32/bin/djpeg deleted file mode 100755 index 536a162a..00000000 Binary files a/misc/builddeps/dp.linux32/bin/djpeg and /dev/null differ diff --git a/misc/builddeps/dp.linux32/bin/jpegtran b/misc/builddeps/dp.linux32/bin/jpegtran deleted file mode 100755 index 0b11f924..00000000 Binary files a/misc/builddeps/dp.linux32/bin/jpegtran and /dev/null differ diff --git a/misc/builddeps/dp.linux32/bin/ode-config b/misc/builddeps/dp.linux32/bin/ode-config deleted file mode 100755 index dddc75da..00000000 --- a/misc/builddeps/dp.linux32/bin/ode-config +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/sh - -prefix=/usr/local -exec_prefix=${prefix} -exec_prefix_set=no - -usage="\ -Usage: ode-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]" - -if test $# -eq 0; then - echo "${usage}" 1>&2 - exit 1 -fi - -while test $# -gt 0; do - case "$1" in - -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - case $1 in - --prefix=*) - prefix=$optarg - if test $exec_prefix_set = no ; then - exec_prefix=$optarg - fi - ;; - --prefix) - echo $prefix - ;; - --exec-prefix=*) - exec_prefix=$optarg - exec_prefix_set=yes - ;; - --exec-prefix) - echo $exec_prefix - ;; - --version) - echo 0.12 - ;; - --cflags) - echo -I${prefix}/include -DdDOUBLE - ;; - --libs) - echo -L${exec_prefix}/lib -lode - ;; - *) - echo "${usage}" 1>&2 - exit 1 - ;; - esac - shift -done diff --git a/misc/builddeps/dp.linux32/bin/rdjpgcom b/misc/builddeps/dp.linux32/bin/rdjpgcom deleted file mode 100755 index 123dd9f6..00000000 Binary files a/misc/builddeps/dp.linux32/bin/rdjpgcom and /dev/null differ diff --git a/misc/builddeps/dp.linux32/bin/wrjpgcom b/misc/builddeps/dp.linux32/bin/wrjpgcom deleted file mode 100755 index 2408dee8..00000000 Binary files a/misc/builddeps/dp.linux32/bin/wrjpgcom and /dev/null differ diff --git a/misc/builddeps/dp.linux32/include/d0_blind_id/d0.h b/misc/builddeps/dp.linux32/include/d0_blind_id/d0.h deleted file mode 100644 index 4c8708e3..00000000 --- a/misc/builddeps/dp.linux32/include/d0_blind_id/d0.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * FILE: d0.h - * AUTHOR: Rudolf Polzer - divVerent@xonotic.org - * - * Copyright (c) 2010, Rudolf Polzer - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $Format:commit %H$ - * $Id: 6c55afeb50f24bd316079ae46582e65f8020b19b $ - */ - -#ifndef __D0_H__ -#define __D0_H__ - -#include // size_t - -#define D0_EXPORT __attribute__((__visibility__("default"))) -#define D0_USED __attribute__((used)) -#define D0_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -#define D0_BOOL int - -typedef void *(d0_malloc_t)(size_t len); -typedef void (d0_free_t)(void *p); -typedef void *(d0_createmutex_t)(void); -typedef void (d0_destroymutex_t)(void *); -typedef int (d0_lockmutex_t)(void *); // zero on success -typedef int (d0_unlockmutex_t)(void *); // zero on success - -extern d0_malloc_t *d0_malloc; -extern d0_free_t *d0_free; -extern d0_createmutex_t *d0_createmutex; -extern d0_destroymutex_t *d0_destroymutex; -extern d0_lockmutex_t *d0_lockmutex; -extern d0_unlockmutex_t *d0_unlockmutex; - -void d0_setmallocfuncs(d0_malloc_t *m, d0_free_t *f); -void d0_setmutexfuncs(d0_createmutex_t *c, d0_destroymutex_t *d, d0_lockmutex_t *l, d0_unlockmutex_t *u); -void d0_initfuncs(void); // initializes them, this needs to be only called internally once - -extern const char *d0_bsd_license_notice; - -#endif diff --git a/misc/builddeps/dp.linux32/include/d0_blind_id/d0_blind_id.h b/misc/builddeps/dp.linux32/include/d0_blind_id/d0_blind_id.h deleted file mode 100644 index f546b679..00000000 --- a/misc/builddeps/dp.linux32/include/d0_blind_id/d0_blind_id.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * FILE: d0_blind_id.h - * AUTHOR: Rudolf Polzer - divVerent@xonotic.org - * - * Copyright (c) 2010, Rudolf Polzer - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $Format:commit %H$ - * $Id: bf838f43093aceadcd2d20071684f1e7148a4332 $ - */ - -#ifndef __D0_BLIND_ID_H__ -#define __D0_BLIND_ID_H__ - -#include "d0.h" - -typedef struct d0_blind_id_s d0_blind_id_t; -typedef D0_BOOL (*d0_fastreject_function) (const d0_blind_id_t *ctx, void *pass); - -D0_EXPORT D0_WARN_UNUSED_RESULT d0_blind_id_t *d0_blind_id_new(void); -D0_EXPORT void d0_blind_id_free(d0_blind_id_t *a); -D0_EXPORT void d0_blind_id_clear(d0_blind_id_t *ctx); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_copy(d0_blind_id_t *ctx, const d0_blind_id_t *src); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_generate_private_key(d0_blind_id_t *ctx, int k); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_generate_private_key_fastreject(d0_blind_id_t *ctx, int k, d0_fastreject_function reject, void *pass); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_read_private_key(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_read_public_key(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_write_private_key(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_write_public_key(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_fingerprint64_public_key(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_generate_private_id_modulus(d0_blind_id_t *ctx); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_read_private_id_modulus(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_write_private_id_modulus(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_generate_private_id_start(d0_blind_id_t *ctx); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_generate_private_id_request(d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_answer_private_id_request(const d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_finish_private_id_request(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_read_private_id_request_camouflage(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_write_private_id_request_camouflage(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_read_private_id(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_read_public_id(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_write_private_id(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_write_public_id(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_authenticate_with_private_id_start(d0_blind_id_t *ctx, D0_BOOL is_first, D0_BOOL send_modulus, const char *message, size_t msglen, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_authenticate_with_private_id_challenge(d0_blind_id_t *ctx, D0_BOOL is_first, D0_BOOL recv_modulus, const char *inbuf, size_t inbuflen, char *outbuf, size_t *outbuflen, D0_BOOL *status); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_authenticate_with_private_id_response(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_authenticate_with_private_id_verify(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen, char *msg, size_t *msglen, D0_BOOL *status); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_authenticate_with_private_id_generate_missing_signature(d0_blind_id_t *ctx); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_sign_with_private_id_sign(d0_blind_id_t *ctx, D0_BOOL is_first, D0_BOOL send_modulus, const char *message, size_t msglen, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_sign_with_private_id_sign_detached(d0_blind_id_t *ctx, D0_BOOL is_first, D0_BOOL send_modulus, const char *message, size_t msglen, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_sign_with_private_id_verify(d0_blind_id_t *ctx, D0_BOOL is_first, D0_BOOL recv_modulus, const char *inbuf, size_t inbuflen, char *msg, size_t *msglen, D0_BOOL *status); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_sign_with_private_id_verify_detached(d0_blind_id_t *ctx, D0_BOOL is_first, D0_BOOL recv_modulus, const char *inbuf, size_t inbuflen, const char *msg, size_t msglen, D0_BOOL *status); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_fingerprint64_public_id(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_verify_public_id(const d0_blind_id_t *ctx, D0_BOOL *status); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_verify_private_id(const d0_blind_id_t *ctx); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_sessionkey_public_id(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); // can only be done after successful key exchange, this performs a modpow; key length is limited by SHA_DIGESTSIZE for now; also ONLY valid after successful d0_blind_id_authenticate_with_private_id_verify/d0_blind_id_fingerprint64_public_id - -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_INITIALIZE(void); -D0_EXPORT void d0_blind_id_SHUTDOWN(void); - -D0_EXPORT void d0_blind_id_util_sha256(char *out, const char *in, size_t n); - -// for exporting -D0_EXPORT void d0_blind_id_setmallocfuncs(d0_malloc_t *m, d0_free_t *f); -D0_EXPORT void d0_blind_id_setmutexfuncs(d0_createmutex_t *c, d0_destroymutex_t *d, d0_lockmutex_t *l, d0_unlockmutex_t *u); - -#endif diff --git a/misc/builddeps/dp.linux32/include/d0_blind_id/d0_rijndael.h b/misc/builddeps/dp.linux32/include/d0_blind_id/d0_rijndael.h deleted file mode 100644 index e1c8f71b..00000000 --- a/misc/builddeps/dp.linux32/include/d0_blind_id/d0_rijndael.h +++ /dev/null @@ -1,21 +0,0 @@ -// from http://www.efgh.com/software/rijndael.htm (public domain) - -#ifndef H__RIJNDAEL -#define H__RIJNDAEL - -#include "d0.h" - -D0_EXPORT int d0_rijndael_setup_encrypt(unsigned long *rk, const unsigned char *key, - int keybits); -D0_EXPORT int d0_rijndael_setup_decrypt(unsigned long *rk, const unsigned char *key, - int keybits); -D0_EXPORT void d0_rijndael_encrypt(const unsigned long *rk, int nrounds, - const unsigned char plaintext[16], unsigned char ciphertext[16]); -D0_EXPORT void d0_rijndael_decrypt(const unsigned long *rk, int nrounds, - const unsigned char ciphertext[16], unsigned char plaintext[16]); - -#define D0_RIJNDAEL_KEYLENGTH(keybits) ((keybits)/8) -#define D0_RIJNDAEL_RKLENGTH(keybits) ((keybits)/8+28) -#define D0_RIJNDAEL_NROUNDS(keybits) ((keybits)/32+6) - -#endif diff --git a/misc/builddeps/dp.linux32/include/gmp.h b/misc/builddeps/dp.linux32/include/gmp.h deleted file mode 100644 index 7b531f57..00000000 --- a/misc/builddeps/dp.linux32/include/gmp.h +++ /dev/null @@ -1,2280 +0,0 @@ -/* Definitions for GNU multiple precision functions. -*- mode: c -*- - -Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, -2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP Library is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 3 of the License, or (at your -option) any later version. - -The GNU MP 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 Lesser General Public -License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ - -#ifndef __GMP_H__ - -#if defined (__cplusplus) -#include /* for std::istream, std::ostream, std::string */ -#include -#endif - - -/* Instantiated by configure. */ -#if ! defined (__GMP_WITHIN_CONFIGURE) -#define __GMP_HAVE_HOST_CPU_FAMILY_power 0 -#define __GMP_HAVE_HOST_CPU_FAMILY_powerpc 0 -#define GMP_LIMB_BITS 32 -#define GMP_NAIL_BITS 0 -#endif -#define GMP_NUMB_BITS (GMP_LIMB_BITS - GMP_NAIL_BITS) -#define GMP_NUMB_MASK ((~ __GMP_CAST (mp_limb_t, 0)) >> GMP_NAIL_BITS) -#define GMP_NUMB_MAX GMP_NUMB_MASK -#define GMP_NAIL_MASK (~ GMP_NUMB_MASK) - - -/* The following (everything under ifndef __GNU_MP__) must be identical in - gmp.h and mp.h to allow both to be included in an application or during - the library build. */ -#ifndef __GNU_MP__ -#define __GNU_MP__ 5 - -#define __need_size_t /* tell gcc stddef.h we only want size_t */ -#if defined (__cplusplus) -#include /* for size_t */ -#else -#include /* for size_t */ -#endif -#undef __need_size_t - -/* Instantiated by configure. */ -#if ! defined (__GMP_WITHIN_CONFIGURE) -/* #undef _LONG_LONG_LIMB */ -#define __GMP_LIBGMP_DLL 0 -#endif - - -/* __STDC__ - some ANSI compilers define this only to 0, hence the use of - "defined" and not "__STDC__-0". In particular Sun workshop C 5.0 - sets __STDC__ to 0, but requires "##" for token pasting. - - _AIX - gnu ansidecl.h asserts that all known AIX compilers are ANSI but - don't always define __STDC__. - - __DECC - current versions of DEC C (5.9 for instance) for alpha are ANSI, - but don't define __STDC__ in their default mode. Don't know if old - versions might have been K&R, but let's not worry about that unless - someone is still using one. - - _mips - gnu ansidecl.h says the RISC/OS MIPS compiler is ANSI in SVR4 - mode, but doesn't define __STDC__. - - _MSC_VER - Microsoft C is ANSI, but __STDC__ is undefined unless the /Za - option is given (in which case it's 1). - - _WIN32 - tested for by gnu ansidecl.h, no doubt on the assumption that - all w32 compilers are ansi. - - Note: This same set of tests is used by gen-psqr.c and - demos/expr/expr-impl.h, so if anything needs adding, then be sure to - update those too. */ - -#if defined (__STDC__) \ - || defined (__cplusplus) \ - || defined (_AIX) \ - || defined (__DECC) \ - || (defined (__mips) && defined (_SYSTYPE_SVR4)) \ - || defined (_MSC_VER) \ - || defined (_WIN32) -#define __GMP_HAVE_CONST 1 -#define __GMP_HAVE_PROTOTYPES 1 -#define __GMP_HAVE_TOKEN_PASTE 1 -#else -#define __GMP_HAVE_CONST 0 -#define __GMP_HAVE_PROTOTYPES 0 -#define __GMP_HAVE_TOKEN_PASTE 0 -#endif - - -#if __GMP_HAVE_CONST -#define __gmp_const const -#define __gmp_signed signed -#else -#define __gmp_const -#define __gmp_signed -#endif - - -/* __GMP_DECLSPEC supports Windows DLL versions of libgmp, and is empty in - all other circumstances. - - When compiling objects for libgmp, __GMP_DECLSPEC is an export directive, - or when compiling for an application it's an import directive. The two - cases are differentiated by __GMP_WITHIN_GMP defined by the GMP Makefiles - (and not defined from an application). - - __GMP_DECLSPEC_XX is similarly used for libgmpxx. __GMP_WITHIN_GMPXX - indicates when building libgmpxx, and in that case libgmpxx functions are - exports, but libgmp functions which might get called are imports. - - libmp.la uses __GMP_DECLSPEC, just as if it were libgmp.la. libgmp and - libmp don't call each other, so there's no conflict or confusion. - - Libtool DLL_EXPORT define is not used. - - There's no attempt to support GMP built both static and DLL. Doing so - would mean applications would have to tell us which of the two is going - to be used when linking, and that seems very tedious and error prone if - using GMP by hand, and equally tedious from a package since autoconf and - automake don't give much help. - - __GMP_DECLSPEC is required on all documented global functions and - variables, the various internals in gmp-impl.h etc can be left unadorned. - But internals used by the test programs or speed measuring programs - should have __GMP_DECLSPEC, and certainly constants or variables must - have it or the wrong address will be resolved. - - In gcc __declspec can go at either the start or end of a prototype. - - In Microsoft C __declspec must go at the start, or after the type like - void __declspec(...) *foo()". There's no __dllexport or anything to - guard against someone foolish #defining dllexport. _export used to be - available, but no longer. - - In Borland C _export still exists, but needs to go after the type, like - "void _export foo();". Would have to change the __GMP_DECLSPEC syntax to - make use of that. Probably more trouble than it's worth. */ - -#if defined (__GNUC__) -#define __GMP_DECLSPEC_EXPORT __declspec(__dllexport__) -#define __GMP_DECLSPEC_IMPORT __declspec(__dllimport__) -#endif -#if defined (_MSC_VER) || defined (__BORLANDC__) -#define __GMP_DECLSPEC_EXPORT __declspec(dllexport) -#define __GMP_DECLSPEC_IMPORT __declspec(dllimport) -#endif -#ifdef __WATCOMC__ -#define __GMP_DECLSPEC_EXPORT __export -#define __GMP_DECLSPEC_IMPORT __import -#endif -#ifdef __IBMC__ -#define __GMP_DECLSPEC_EXPORT _Export -#define __GMP_DECLSPEC_IMPORT _Import -#endif - -#if __GMP_LIBGMP_DLL -#if __GMP_WITHIN_GMP -/* compiling to go into a DLL libgmp */ -#define __GMP_DECLSPEC __GMP_DECLSPEC_EXPORT -#else -/* compiling to go into an application which will link to a DLL libgmp */ -#define __GMP_DECLSPEC __GMP_DECLSPEC_IMPORT -#endif -#else -/* all other cases */ -#define __GMP_DECLSPEC -#endif - - -#ifdef __GMP_SHORT_LIMB -typedef unsigned int mp_limb_t; -typedef int mp_limb_signed_t; -#else -#ifdef _LONG_LONG_LIMB -typedef unsigned long long int mp_limb_t; -typedef long long int mp_limb_signed_t; -#else -typedef unsigned long int mp_limb_t; -typedef long int mp_limb_signed_t; -#endif -#endif -typedef unsigned long int mp_bitcnt_t; - -/* For reference, note that the name __mpz_struct gets into C++ mangled - function names, which means although the "__" suggests an internal, we - must leave this name for binary compatibility. */ -typedef struct -{ - int _mp_alloc; /* Number of *limbs* allocated and pointed - to by the _mp_d field. */ - int _mp_size; /* abs(_mp_size) is the number of limbs the - last field points to. If _mp_size is - negative this is a negative number. */ - mp_limb_t *_mp_d; /* Pointer to the limbs. */ -} __mpz_struct; - -#endif /* __GNU_MP__ */ - - -typedef __mpz_struct MP_INT; /* gmp 1 source compatibility */ -typedef __mpz_struct mpz_t[1]; - -typedef mp_limb_t * mp_ptr; -typedef __gmp_const mp_limb_t * mp_srcptr; -#if defined (_CRAY) && ! defined (_CRAYMPP) -/* plain `int' is much faster (48 bits) */ -#define __GMP_MP_SIZE_T_INT 1 -typedef int mp_size_t; -typedef int mp_exp_t; -#else -#define __GMP_MP_SIZE_T_INT 0 -typedef long int mp_size_t; -typedef long int mp_exp_t; -#endif - -typedef struct -{ - __mpz_struct _mp_num; - __mpz_struct _mp_den; -} __mpq_struct; - -typedef __mpq_struct MP_RAT; /* gmp 1 source compatibility */ -typedef __mpq_struct mpq_t[1]; - -typedef struct -{ - int _mp_prec; /* Max precision, in number of `mp_limb_t's. - Set by mpf_init and modified by - mpf_set_prec. The area pointed to by the - _mp_d field contains `prec' + 1 limbs. */ - int _mp_size; /* abs(_mp_size) is the number of limbs the - last field points to. If _mp_size is - negative this is a negative number. */ - mp_exp_t _mp_exp; /* Exponent, in the base of `mp_limb_t'. */ - mp_limb_t *_mp_d; /* Pointer to the limbs. */ -} __mpf_struct; - -/* typedef __mpf_struct MP_FLOAT; */ -typedef __mpf_struct mpf_t[1]; - -/* Available random number generation algorithms. */ -typedef enum -{ - GMP_RAND_ALG_DEFAULT = 0, - GMP_RAND_ALG_LC = GMP_RAND_ALG_DEFAULT /* Linear congruential. */ -} gmp_randalg_t; - -/* Random state struct. */ -typedef struct -{ - mpz_t _mp_seed; /* _mp_d member points to state of the generator. */ - gmp_randalg_t _mp_alg; /* Currently unused. */ - union { - void *_mp_lc; /* Pointer to function pointers structure. */ - } _mp_algdata; -} __gmp_randstate_struct; -typedef __gmp_randstate_struct gmp_randstate_t[1]; - -/* Types for function declarations in gmp files. */ -/* ??? Should not pollute user name space with these ??? */ -typedef __gmp_const __mpz_struct *mpz_srcptr; -typedef __mpz_struct *mpz_ptr; -typedef __gmp_const __mpf_struct *mpf_srcptr; -typedef __mpf_struct *mpf_ptr; -typedef __gmp_const __mpq_struct *mpq_srcptr; -typedef __mpq_struct *mpq_ptr; - - -/* This is not wanted in mp.h, so put it outside the __GNU_MP__ common - section. */ -#if __GMP_LIBGMP_DLL -#if __GMP_WITHIN_GMPXX -/* compiling to go into a DLL libgmpxx */ -#define __GMP_DECLSPEC_XX __GMP_DECLSPEC_EXPORT -#else -/* compiling to go into a application which will link to a DLL libgmpxx */ -#define __GMP_DECLSPEC_XX __GMP_DECLSPEC_IMPORT -#endif -#else -/* all other cases */ -#define __GMP_DECLSPEC_XX -#endif - - -#if __GMP_HAVE_PROTOTYPES -#define __GMP_PROTO(x) x -#else -#define __GMP_PROTO(x) () -#endif - -#ifndef __MPN -#if __GMP_HAVE_TOKEN_PASTE -#define __MPN(x) __gmpn_##x -#else -#define __MPN(x) __gmpn_/**/x -#endif -#endif - -/* For reference, "defined(EOF)" cannot be used here. In g++ 2.95.4, - defines EOF but not FILE. */ -#if defined (FILE) \ - || defined (H_STDIO) \ - || defined (_H_STDIO) /* AIX */ \ - || defined (_STDIO_H) /* glibc, Sun, SCO */ \ - || defined (_STDIO_H_) /* BSD, OSF */ \ - || defined (__STDIO_H) /* Borland */ \ - || defined (__STDIO_H__) /* IRIX */ \ - || defined (_STDIO_INCLUDED) /* HPUX */ \ - || defined (__dj_include_stdio_h_) /* DJGPP */ \ - || defined (_FILE_DEFINED) /* Microsoft */ \ - || defined (__STDIO__) /* Apple MPW MrC */ \ - || defined (_MSL_STDIO_H) /* Metrowerks */ \ - || defined (_STDIO_H_INCLUDED) /* QNX4 */ \ - || defined (_ISO_STDIO_ISO_H) /* Sun C++ */ -#define _GMP_H_HAVE_FILE 1 -#endif - -/* In ISO C, if a prototype involving "struct obstack *" is given without - that structure defined, then the struct is scoped down to just the - prototype, causing a conflict if it's subsequently defined for real. So - only give prototypes if we've got obstack.h. */ -#if defined (_OBSTACK_H) /* glibc */ -#define _GMP_H_HAVE_OBSTACK 1 -#endif - -/* The prototypes for gmp_vprintf etc are provided only if va_list is - available, via an application having included or . - Usually va_list is a typedef so can't be tested directly, but C99 - specifies that va_start is a macro (and it was normally a macro on past - systems too), so look for that. - - will define some sort of va_list for vprintf and vfprintf, but - let's not bother trying to use that since it's not standard and since - application uses for gmp_vprintf etc will almost certainly require the - whole or anyway. */ - -#ifdef va_start -#define _GMP_H_HAVE_VA_LIST 1 -#endif - -/* Test for gcc >= maj.min, as per __GNUC_PREREQ in glibc */ -#if defined (__GNUC__) && defined (__GNUC_MINOR__) -#define __GMP_GNUC_PREREQ(maj, min) \ - ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) -#else -#define __GMP_GNUC_PREREQ(maj, min) 0 -#endif - -/* "pure" is in gcc 2.96 and up, see "(gcc)Function Attributes". Basically - it means a function does nothing but examine its arguments and memory - (global or via arguments) to generate a return value, but changes nothing - and has no side-effects. __GMP_NO_ATTRIBUTE_CONST_PURE lets - tune/common.c etc turn this off when trying to write timing loops. */ -#if __GMP_GNUC_PREREQ (2,96) && ! defined (__GMP_NO_ATTRIBUTE_CONST_PURE) -#define __GMP_ATTRIBUTE_PURE __attribute__ ((__pure__)) -#else -#define __GMP_ATTRIBUTE_PURE -#endif - - -/* __GMP_CAST allows us to use static_cast in C++, so our macros are clean - to "g++ -Wold-style-cast". - - Casts in "extern inline" code within an extern "C" block don't induce - these warnings, so __GMP_CAST only needs to be used on documented - macros. */ - -#ifdef __cplusplus -#define __GMP_CAST(type, expr) (static_cast (expr)) -#else -#define __GMP_CAST(type, expr) ((type) (expr)) -#endif - - -/* An empty "throw ()" means the function doesn't throw any C++ exceptions, - this can save some stack frame info in applications. - - Currently it's given only on functions which never divide-by-zero etc, - don't allocate memory, and are expected to never need to allocate memory. - This leaves open the possibility of a C++ throw from a future GMP - exceptions scheme. - - mpz_set_ui etc are omitted to leave open the lazy allocation scheme - described in doc/tasks.html. mpz_get_d etc are omitted to leave open - exceptions for float overflows. - - Note that __GMP_NOTHROW must be given on any inlines the same as on their - prototypes (for g++ at least, where they're used together). Note also - that g++ 3.0 demands that __GMP_NOTHROW is before other attributes like - __GMP_ATTRIBUTE_PURE. */ - -#if defined (__cplusplus) -#define __GMP_NOTHROW throw () -#else -#define __GMP_NOTHROW -#endif - - -/* PORTME: What other compilers have a useful "extern inline"? "static - inline" would be an acceptable substitute if the compiler (or linker) - discards unused statics. */ - - /* gcc has __inline__ in all modes, including strict ansi. Give a prototype - for an inline too, so as to correctly specify "dllimport" on windows, in - case the function is called rather than inlined. - GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 - inline semantics, unless -fgnu89-inline is used. */ -#ifdef __GNUC__ -#if (defined __GNUC_STDC_INLINE__) || (__GNUC__ == 4 && __GNUC_MINOR__ == 2) -#define __GMP_EXTERN_INLINE extern __inline__ __attribute__ ((__gnu_inline__)) -#else -#define __GMP_EXTERN_INLINE extern __inline__ -#endif -#define __GMP_INLINE_PROTOTYPES 1 -#endif - -/* DEC C (eg. version 5.9) supports "static __inline foo()", even in -std1 - strict ANSI mode. Inlining is done even when not optimizing (ie. -O0 - mode, which is the default), but an unnecessary local copy of foo is - emitted unless -O is used. "extern __inline" is accepted, but the - "extern" appears to be ignored, ie. it becomes a plain global function - but which is inlined within its file. Don't know if all old versions of - DEC C supported __inline, but as a start let's do the right thing for - current versions. */ -#ifdef __DECC -#define __GMP_EXTERN_INLINE static __inline -#endif - -/* SCO OpenUNIX 8 cc supports "static inline foo()" but not in -Xc strict - ANSI mode (__STDC__ is 1 in that mode). Inlining only actually takes - place under -O. Without -O "foo" seems to be emitted whether it's used - or not, which is wasteful. "extern inline foo()" isn't useful, the - "extern" is apparently ignored, so foo is inlined if possible but also - emitted as a global, which causes multiple definition errors when - building a shared libgmp. */ -#ifdef __SCO_VERSION__ -#if __SCO_VERSION__ > 400000000 && __STDC__ != 1 \ - && ! defined (__GMP_EXTERN_INLINE) -#define __GMP_EXTERN_INLINE static inline -#endif -#endif - -/* Microsoft's C compiler accepts __inline */ -#ifdef _MSC_VER -#define __GMP_EXTERN_INLINE __inline -#endif - -/* Recent enough Sun C compilers want "inline" */ -#if defined (__SUNPRO_C) && __SUNPRO_C >= 0x560 \ - && ! defined (__GMP_EXTERN_INLINE) -#define __GMP_EXTERN_INLINE inline -#endif - -/* Somewhat older Sun C compilers want "static inline" */ -#if defined (__SUNPRO_C) && __SUNPRO_C >= 0x540 \ - && ! defined (__GMP_EXTERN_INLINE) -#define __GMP_EXTERN_INLINE static inline -#endif - - -/* C++ always has "inline" and since it's a normal feature the linker should - discard duplicate non-inlined copies, or if it doesn't then that's a - problem for everyone, not just GMP. */ -#if defined (__cplusplus) && ! defined (__GMP_EXTERN_INLINE) -#define __GMP_EXTERN_INLINE inline -#endif - -/* Don't do any inlining within a configure run, since if the compiler ends - up emitting copies of the code into the object file it can end up - demanding the various support routines (like mpn_popcount) for linking, - making the "alloca" test and perhaps others fail. And on hppa ia64 a - pre-release gcc 3.2 was seen not respecting the "extern" in "extern - __inline__", triggering this problem too. */ -#if defined (__GMP_WITHIN_CONFIGURE) && ! __GMP_WITHIN_CONFIGURE_INLINE -#undef __GMP_EXTERN_INLINE -#endif - -/* By default, don't give a prototype when there's going to be an inline - version. Note in particular that Cray C++ objects to the combination of - prototype and inline. */ -#ifdef __GMP_EXTERN_INLINE -#ifndef __GMP_INLINE_PROTOTYPES -#define __GMP_INLINE_PROTOTYPES 0 -#endif -#else -#define __GMP_INLINE_PROTOTYPES 1 -#endif - - -#define __GMP_ABS(x) ((x) >= 0 ? (x) : -(x)) -#define __GMP_MAX(h,i) ((h) > (i) ? (h) : (i)) - -/* __GMP_USHRT_MAX is not "~ (unsigned short) 0" because short is promoted - to int by "~". */ -#define __GMP_UINT_MAX (~ (unsigned) 0) -#define __GMP_ULONG_MAX (~ (unsigned long) 0) -#define __GMP_USHRT_MAX ((unsigned short) ~0) - - -/* __builtin_expect is in gcc 3.0, and not in 2.95. */ -#if __GMP_GNUC_PREREQ (3,0) -#define __GMP_LIKELY(cond) __builtin_expect ((cond) != 0, 1) -#define __GMP_UNLIKELY(cond) __builtin_expect ((cond) != 0, 0) -#else -#define __GMP_LIKELY(cond) (cond) -#define __GMP_UNLIKELY(cond) (cond) -#endif - -#ifdef _CRAY -#define __GMP_CRAY_Pragma(str) _Pragma (str) -#else -#define __GMP_CRAY_Pragma(str) -#endif - - -/* Allow direct user access to numerator and denominator of a mpq_t object. */ -#define mpq_numref(Q) (&((Q)->_mp_num)) -#define mpq_denref(Q) (&((Q)->_mp_den)) - - -#if defined (__cplusplus) -extern "C" { -using std::FILE; -#endif - -#define mp_set_memory_functions __gmp_set_memory_functions -__GMP_DECLSPEC void mp_set_memory_functions __GMP_PROTO ((void *(*) (size_t), - void *(*) (void *, size_t, size_t), - void (*) (void *, size_t))) __GMP_NOTHROW; - -#define mp_get_memory_functions __gmp_get_memory_functions -__GMP_DECLSPEC void mp_get_memory_functions __GMP_PROTO ((void *(**) (size_t), - void *(**) (void *, size_t, size_t), - void (**) (void *, size_t))) __GMP_NOTHROW; - -#define mp_bits_per_limb __gmp_bits_per_limb -__GMP_DECLSPEC extern __gmp_const int mp_bits_per_limb; - -#define gmp_errno __gmp_errno -__GMP_DECLSPEC extern int gmp_errno; - -#define gmp_version __gmp_version -__GMP_DECLSPEC extern __gmp_const char * __gmp_const gmp_version; - - -/**************** Random number routines. ****************/ - -/* obsolete */ -#define gmp_randinit __gmp_randinit -__GMP_DECLSPEC void gmp_randinit __GMP_PROTO ((gmp_randstate_t, gmp_randalg_t, ...)); - -#define gmp_randinit_default __gmp_randinit_default -__GMP_DECLSPEC void gmp_randinit_default __GMP_PROTO ((gmp_randstate_t)); - -#define gmp_randinit_lc_2exp __gmp_randinit_lc_2exp -__GMP_DECLSPEC void gmp_randinit_lc_2exp __GMP_PROTO ((gmp_randstate_t, - mpz_srcptr, unsigned long int, - mp_bitcnt_t)); - -#define gmp_randinit_lc_2exp_size __gmp_randinit_lc_2exp_size -__GMP_DECLSPEC int gmp_randinit_lc_2exp_size __GMP_PROTO ((gmp_randstate_t, mp_bitcnt_t)); - -#define gmp_randinit_mt __gmp_randinit_mt -__GMP_DECLSPEC void gmp_randinit_mt __GMP_PROTO ((gmp_randstate_t)); - -#define gmp_randinit_set __gmp_randinit_set -__GMP_DECLSPEC void gmp_randinit_set __GMP_PROTO ((gmp_randstate_t, __gmp_const __gmp_randstate_struct *)); - -#define gmp_randseed __gmp_randseed -__GMP_DECLSPEC void gmp_randseed __GMP_PROTO ((gmp_randstate_t, mpz_srcptr)); - -#define gmp_randseed_ui __gmp_randseed_ui -__GMP_DECLSPEC void gmp_randseed_ui __GMP_PROTO ((gmp_randstate_t, unsigned long int)); - -#define gmp_randclear __gmp_randclear -__GMP_DECLSPEC void gmp_randclear __GMP_PROTO ((gmp_randstate_t)); - -#define gmp_urandomb_ui __gmp_urandomb_ui -__GMP_DECLSPEC unsigned long gmp_urandomb_ui __GMP_PROTO ((gmp_randstate_t, unsigned long)); - -#define gmp_urandomm_ui __gmp_urandomm_ui -__GMP_DECLSPEC unsigned long gmp_urandomm_ui __GMP_PROTO ((gmp_randstate_t, unsigned long)); - - -/**************** Formatted output routines. ****************/ - -#define gmp_asprintf __gmp_asprintf -__GMP_DECLSPEC int gmp_asprintf __GMP_PROTO ((char **, __gmp_const char *, ...)); - -#define gmp_fprintf __gmp_fprintf -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC int gmp_fprintf __GMP_PROTO ((FILE *, __gmp_const char *, ...)); -#endif - -#define gmp_obstack_printf __gmp_obstack_printf -#if defined (_GMP_H_HAVE_OBSTACK) -__GMP_DECLSPEC int gmp_obstack_printf __GMP_PROTO ((struct obstack *, __gmp_const char *, ...)); -#endif - -#define gmp_obstack_vprintf __gmp_obstack_vprintf -#if defined (_GMP_H_HAVE_OBSTACK) && defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_obstack_vprintf __GMP_PROTO ((struct obstack *, __gmp_const char *, va_list)); -#endif - -#define gmp_printf __gmp_printf -__GMP_DECLSPEC int gmp_printf __GMP_PROTO ((__gmp_const char *, ...)); - -#define gmp_snprintf __gmp_snprintf -__GMP_DECLSPEC int gmp_snprintf __GMP_PROTO ((char *, size_t, __gmp_const char *, ...)); - -#define gmp_sprintf __gmp_sprintf -__GMP_DECLSPEC int gmp_sprintf __GMP_PROTO ((char *, __gmp_const char *, ...)); - -#define gmp_vasprintf __gmp_vasprintf -#if defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vasprintf __GMP_PROTO ((char **, __gmp_const char *, va_list)); -#endif - -#define gmp_vfprintf __gmp_vfprintf -#if defined (_GMP_H_HAVE_FILE) && defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vfprintf __GMP_PROTO ((FILE *, __gmp_const char *, va_list)); -#endif - -#define gmp_vprintf __gmp_vprintf -#if defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vprintf __GMP_PROTO ((__gmp_const char *, va_list)); -#endif - -#define gmp_vsnprintf __gmp_vsnprintf -#if defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vsnprintf __GMP_PROTO ((char *, size_t, __gmp_const char *, va_list)); -#endif - -#define gmp_vsprintf __gmp_vsprintf -#if defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vsprintf __GMP_PROTO ((char *, __gmp_const char *, va_list)); -#endif - - -/**************** Formatted input routines. ****************/ - -#define gmp_fscanf __gmp_fscanf -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC int gmp_fscanf __GMP_PROTO ((FILE *, __gmp_const char *, ...)); -#endif - -#define gmp_scanf __gmp_scanf -__GMP_DECLSPEC int gmp_scanf __GMP_PROTO ((__gmp_const char *, ...)); - -#define gmp_sscanf __gmp_sscanf -__GMP_DECLSPEC int gmp_sscanf __GMP_PROTO ((__gmp_const char *, __gmp_const char *, ...)); - -#define gmp_vfscanf __gmp_vfscanf -#if defined (_GMP_H_HAVE_FILE) && defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vfscanf __GMP_PROTO ((FILE *, __gmp_const char *, va_list)); -#endif - -#define gmp_vscanf __gmp_vscanf -#if defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vscanf __GMP_PROTO ((__gmp_const char *, va_list)); -#endif - -#define gmp_vsscanf __gmp_vsscanf -#if defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vsscanf __GMP_PROTO ((__gmp_const char *, __gmp_const char *, va_list)); -#endif - - -/**************** Integer (i.e. Z) routines. ****************/ - -#define _mpz_realloc __gmpz_realloc -#define mpz_realloc __gmpz_realloc -__GMP_DECLSPEC void *_mpz_realloc __GMP_PROTO ((mpz_ptr, mp_size_t)); - -#define mpz_abs __gmpz_abs -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_abs) -__GMP_DECLSPEC void mpz_abs __GMP_PROTO ((mpz_ptr, mpz_srcptr)); -#endif - -#define mpz_add __gmpz_add -__GMP_DECLSPEC void mpz_add __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_add_ui __gmpz_add_ui -__GMP_DECLSPEC void mpz_add_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_addmul __gmpz_addmul -__GMP_DECLSPEC void mpz_addmul __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_addmul_ui __gmpz_addmul_ui -__GMP_DECLSPEC void mpz_addmul_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_and __gmpz_and -__GMP_DECLSPEC void mpz_and __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_array_init __gmpz_array_init -__GMP_DECLSPEC void mpz_array_init __GMP_PROTO ((mpz_ptr, mp_size_t, mp_size_t)); - -#define mpz_bin_ui __gmpz_bin_ui -__GMP_DECLSPEC void mpz_bin_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_bin_uiui __gmpz_bin_uiui -__GMP_DECLSPEC void mpz_bin_uiui __GMP_PROTO ((mpz_ptr, unsigned long int, unsigned long int)); - -#define mpz_cdiv_q __gmpz_cdiv_q -__GMP_DECLSPEC void mpz_cdiv_q __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_cdiv_q_2exp __gmpz_cdiv_q_2exp -__GMP_DECLSPEC void mpz_cdiv_q_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long)); - -#define mpz_cdiv_q_ui __gmpz_cdiv_q_ui -__GMP_DECLSPEC unsigned long int mpz_cdiv_q_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_cdiv_qr __gmpz_cdiv_qr -__GMP_DECLSPEC void mpz_cdiv_qr __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_cdiv_qr_ui __gmpz_cdiv_qr_ui -__GMP_DECLSPEC unsigned long int mpz_cdiv_qr_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_cdiv_r __gmpz_cdiv_r -__GMP_DECLSPEC void mpz_cdiv_r __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_cdiv_r_2exp __gmpz_cdiv_r_2exp -__GMP_DECLSPEC void mpz_cdiv_r_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); - -#define mpz_cdiv_r_ui __gmpz_cdiv_r_ui -__GMP_DECLSPEC unsigned long int mpz_cdiv_r_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_cdiv_ui __gmpz_cdiv_ui -__GMP_DECLSPEC unsigned long int mpz_cdiv_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE; - -#define mpz_clear __gmpz_clear -__GMP_DECLSPEC void mpz_clear __GMP_PROTO ((mpz_ptr)); - -#define mpz_clears __gmpz_clears -__GMP_DECLSPEC void mpz_clears __GMP_PROTO ((mpz_ptr, ...)); - -#define mpz_clrbit __gmpz_clrbit -__GMP_DECLSPEC void mpz_clrbit __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); - -#define mpz_cmp __gmpz_cmp -__GMP_DECLSPEC int mpz_cmp __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_cmp_d __gmpz_cmp_d -__GMP_DECLSPEC int mpz_cmp_d __GMP_PROTO ((mpz_srcptr, double)) __GMP_ATTRIBUTE_PURE; - -#define _mpz_cmp_si __gmpz_cmp_si -__GMP_DECLSPEC int _mpz_cmp_si __GMP_PROTO ((mpz_srcptr, signed long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define _mpz_cmp_ui __gmpz_cmp_ui -__GMP_DECLSPEC int _mpz_cmp_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_cmpabs __gmpz_cmpabs -__GMP_DECLSPEC int mpz_cmpabs __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_cmpabs_d __gmpz_cmpabs_d -__GMP_DECLSPEC int mpz_cmpabs_d __GMP_PROTO ((mpz_srcptr, double)) __GMP_ATTRIBUTE_PURE; - -#define mpz_cmpabs_ui __gmpz_cmpabs_ui -__GMP_DECLSPEC int mpz_cmpabs_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_com __gmpz_com -__GMP_DECLSPEC void mpz_com __GMP_PROTO ((mpz_ptr, mpz_srcptr)); - -#define mpz_combit __gmpz_combit -__GMP_DECLSPEC void mpz_combit __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); - -#define mpz_congruent_p __gmpz_congruent_p -__GMP_DECLSPEC int mpz_congruent_p __GMP_PROTO ((mpz_srcptr, mpz_srcptr, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_congruent_2exp_p __gmpz_congruent_2exp_p -__GMP_DECLSPEC int mpz_congruent_2exp_p __GMP_PROTO ((mpz_srcptr, mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_congruent_ui_p __gmpz_congruent_ui_p -__GMP_DECLSPEC int mpz_congruent_ui_p __GMP_PROTO ((mpz_srcptr, unsigned long, unsigned long)) __GMP_ATTRIBUTE_PURE; - -#define mpz_divexact __gmpz_divexact -__GMP_DECLSPEC void mpz_divexact __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_divexact_ui __gmpz_divexact_ui -__GMP_DECLSPEC void mpz_divexact_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long)); - -#define mpz_divisible_p __gmpz_divisible_p -__GMP_DECLSPEC int mpz_divisible_p __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_divisible_ui_p __gmpz_divisible_ui_p -__GMP_DECLSPEC int mpz_divisible_ui_p __GMP_PROTO ((mpz_srcptr, unsigned long)) __GMP_ATTRIBUTE_PURE; - -#define mpz_divisible_2exp_p __gmpz_divisible_2exp_p -__GMP_DECLSPEC int mpz_divisible_2exp_p __GMP_PROTO ((mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_dump __gmpz_dump -__GMP_DECLSPEC void mpz_dump __GMP_PROTO ((mpz_srcptr)); - -#define mpz_export __gmpz_export -__GMP_DECLSPEC void *mpz_export __GMP_PROTO ((void *, size_t *, int, size_t, int, size_t, mpz_srcptr)); - -#define mpz_fac_ui __gmpz_fac_ui -__GMP_DECLSPEC void mpz_fac_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); - -#define mpz_fdiv_q __gmpz_fdiv_q -__GMP_DECLSPEC void mpz_fdiv_q __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_fdiv_q_2exp __gmpz_fdiv_q_2exp -__GMP_DECLSPEC void mpz_fdiv_q_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); - -#define mpz_fdiv_q_ui __gmpz_fdiv_q_ui -__GMP_DECLSPEC unsigned long int mpz_fdiv_q_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_fdiv_qr __gmpz_fdiv_qr -__GMP_DECLSPEC void mpz_fdiv_qr __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_fdiv_qr_ui __gmpz_fdiv_qr_ui -__GMP_DECLSPEC unsigned long int mpz_fdiv_qr_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_fdiv_r __gmpz_fdiv_r -__GMP_DECLSPEC void mpz_fdiv_r __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_fdiv_r_2exp __gmpz_fdiv_r_2exp -__GMP_DECLSPEC void mpz_fdiv_r_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); - -#define mpz_fdiv_r_ui __gmpz_fdiv_r_ui -__GMP_DECLSPEC unsigned long int mpz_fdiv_r_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_fdiv_ui __gmpz_fdiv_ui -__GMP_DECLSPEC unsigned long int mpz_fdiv_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE; - -#define mpz_fib_ui __gmpz_fib_ui -__GMP_DECLSPEC void mpz_fib_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); - -#define mpz_fib2_ui __gmpz_fib2_ui -__GMP_DECLSPEC void mpz_fib2_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, unsigned long int)); - -#define mpz_fits_sint_p __gmpz_fits_sint_p -__GMP_DECLSPEC int mpz_fits_sint_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_fits_slong_p __gmpz_fits_slong_p -__GMP_DECLSPEC int mpz_fits_slong_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_fits_sshort_p __gmpz_fits_sshort_p -__GMP_DECLSPEC int mpz_fits_sshort_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_fits_uint_p __gmpz_fits_uint_p -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_uint_p) -__GMP_DECLSPEC int mpz_fits_uint_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_fits_ulong_p __gmpz_fits_ulong_p -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_ulong_p) -__GMP_DECLSPEC int mpz_fits_ulong_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_fits_ushort_p __gmpz_fits_ushort_p -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_ushort_p) -__GMP_DECLSPEC int mpz_fits_ushort_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_gcd __gmpz_gcd -__GMP_DECLSPEC void mpz_gcd __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_gcd_ui __gmpz_gcd_ui -__GMP_DECLSPEC unsigned long int mpz_gcd_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_gcdext __gmpz_gcdext -__GMP_DECLSPEC void mpz_gcdext __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_get_d __gmpz_get_d -__GMP_DECLSPEC double mpz_get_d __GMP_PROTO ((mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_get_d_2exp __gmpz_get_d_2exp -__GMP_DECLSPEC double mpz_get_d_2exp __GMP_PROTO ((signed long int *, mpz_srcptr)); - -#define mpz_get_si __gmpz_get_si -__GMP_DECLSPEC /* signed */ long int mpz_get_si __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_get_str __gmpz_get_str -__GMP_DECLSPEC char *mpz_get_str __GMP_PROTO ((char *, int, mpz_srcptr)); - -#define mpz_get_ui __gmpz_get_ui -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_get_ui) -__GMP_DECLSPEC unsigned long int mpz_get_ui __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_getlimbn __gmpz_getlimbn -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_getlimbn) -__GMP_DECLSPEC mp_limb_t mpz_getlimbn __GMP_PROTO ((mpz_srcptr, mp_size_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_hamdist __gmpz_hamdist -__GMP_DECLSPEC mp_bitcnt_t mpz_hamdist __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_import __gmpz_import -__GMP_DECLSPEC void mpz_import __GMP_PROTO ((mpz_ptr, size_t, int, size_t, int, size_t, __gmp_const void *)); - -#define mpz_init __gmpz_init -__GMP_DECLSPEC void mpz_init __GMP_PROTO ((mpz_ptr)); - -#define mpz_init2 __gmpz_init2 -__GMP_DECLSPEC void mpz_init2 __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); - -#define mpz_inits __gmpz_inits -__GMP_DECLSPEC void mpz_inits __GMP_PROTO ((mpz_ptr, ...)); - -#define mpz_init_set __gmpz_init_set -__GMP_DECLSPEC void mpz_init_set __GMP_PROTO ((mpz_ptr, mpz_srcptr)); - -#define mpz_init_set_d __gmpz_init_set_d -__GMP_DECLSPEC void mpz_init_set_d __GMP_PROTO ((mpz_ptr, double)); - -#define mpz_init_set_si __gmpz_init_set_si -__GMP_DECLSPEC void mpz_init_set_si __GMP_PROTO ((mpz_ptr, signed long int)); - -#define mpz_init_set_str __gmpz_init_set_str -__GMP_DECLSPEC int mpz_init_set_str __GMP_PROTO ((mpz_ptr, __gmp_const char *, int)); - -#define mpz_init_set_ui __gmpz_init_set_ui -__GMP_DECLSPEC void mpz_init_set_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); - -#define mpz_inp_raw __gmpz_inp_raw -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpz_inp_raw __GMP_PROTO ((mpz_ptr, FILE *)); -#endif - -#define mpz_inp_str __gmpz_inp_str -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpz_inp_str __GMP_PROTO ((mpz_ptr, FILE *, int)); -#endif - -#define mpz_invert __gmpz_invert -__GMP_DECLSPEC int mpz_invert __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_ior __gmpz_ior -__GMP_DECLSPEC void mpz_ior __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_jacobi __gmpz_jacobi -__GMP_DECLSPEC int mpz_jacobi __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_kronecker mpz_jacobi /* alias */ - -#define mpz_kronecker_si __gmpz_kronecker_si -__GMP_DECLSPEC int mpz_kronecker_si __GMP_PROTO ((mpz_srcptr, long)) __GMP_ATTRIBUTE_PURE; - -#define mpz_kronecker_ui __gmpz_kronecker_ui -__GMP_DECLSPEC int mpz_kronecker_ui __GMP_PROTO ((mpz_srcptr, unsigned long)) __GMP_ATTRIBUTE_PURE; - -#define mpz_si_kronecker __gmpz_si_kronecker -__GMP_DECLSPEC int mpz_si_kronecker __GMP_PROTO ((long, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_ui_kronecker __gmpz_ui_kronecker -__GMP_DECLSPEC int mpz_ui_kronecker __GMP_PROTO ((unsigned long, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_lcm __gmpz_lcm -__GMP_DECLSPEC void mpz_lcm __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_lcm_ui __gmpz_lcm_ui -__GMP_DECLSPEC void mpz_lcm_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long)); - -#define mpz_legendre mpz_jacobi /* alias */ - -#define mpz_lucnum_ui __gmpz_lucnum_ui -__GMP_DECLSPEC void mpz_lucnum_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); - -#define mpz_lucnum2_ui __gmpz_lucnum2_ui -__GMP_DECLSPEC void mpz_lucnum2_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, unsigned long int)); - -#define mpz_millerrabin __gmpz_millerrabin -__GMP_DECLSPEC int mpz_millerrabin __GMP_PROTO ((mpz_srcptr, int)) __GMP_ATTRIBUTE_PURE; - -#define mpz_mod __gmpz_mod -__GMP_DECLSPEC void mpz_mod __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_mod_ui mpz_fdiv_r_ui /* same as fdiv_r because divisor unsigned */ - -#define mpz_mul __gmpz_mul -__GMP_DECLSPEC void mpz_mul __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_mul_2exp __gmpz_mul_2exp -__GMP_DECLSPEC void mpz_mul_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); - -#define mpz_mul_si __gmpz_mul_si -__GMP_DECLSPEC void mpz_mul_si __GMP_PROTO ((mpz_ptr, mpz_srcptr, long int)); - -#define mpz_mul_ui __gmpz_mul_ui -__GMP_DECLSPEC void mpz_mul_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_neg __gmpz_neg -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_neg) -__GMP_DECLSPEC void mpz_neg __GMP_PROTO ((mpz_ptr, mpz_srcptr)); -#endif - -#define mpz_nextprime __gmpz_nextprime -__GMP_DECLSPEC void mpz_nextprime __GMP_PROTO ((mpz_ptr, mpz_srcptr)); - -#define mpz_out_raw __gmpz_out_raw -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpz_out_raw __GMP_PROTO ((FILE *, mpz_srcptr)); -#endif - -#define mpz_out_str __gmpz_out_str -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpz_out_str __GMP_PROTO ((FILE *, int, mpz_srcptr)); -#endif - -#define mpz_perfect_power_p __gmpz_perfect_power_p -__GMP_DECLSPEC int mpz_perfect_power_p __GMP_PROTO ((mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_perfect_square_p __gmpz_perfect_square_p -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_perfect_square_p) -__GMP_DECLSPEC int mpz_perfect_square_p __GMP_PROTO ((mpz_srcptr)) __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_popcount __gmpz_popcount -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_popcount) -__GMP_DECLSPEC mp_bitcnt_t mpz_popcount __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_pow_ui __gmpz_pow_ui -__GMP_DECLSPEC void mpz_pow_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_powm __gmpz_powm -__GMP_DECLSPEC void mpz_powm __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_powm_sec __gmpz_powm_sec -__GMP_DECLSPEC void mpz_powm_sec __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_powm_ui __gmpz_powm_ui -__GMP_DECLSPEC void mpz_powm_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr)); - -#define mpz_probab_prime_p __gmpz_probab_prime_p -__GMP_DECLSPEC int mpz_probab_prime_p __GMP_PROTO ((mpz_srcptr, int)) __GMP_ATTRIBUTE_PURE; - -#define mpz_random __gmpz_random -__GMP_DECLSPEC void mpz_random __GMP_PROTO ((mpz_ptr, mp_size_t)); - -#define mpz_random2 __gmpz_random2 -__GMP_DECLSPEC void mpz_random2 __GMP_PROTO ((mpz_ptr, mp_size_t)); - -#define mpz_realloc2 __gmpz_realloc2 -__GMP_DECLSPEC void mpz_realloc2 __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); - -#define mpz_remove __gmpz_remove -__GMP_DECLSPEC unsigned long int mpz_remove __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_root __gmpz_root -__GMP_DECLSPEC int mpz_root __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_rootrem __gmpz_rootrem -__GMP_DECLSPEC void mpz_rootrem __GMP_PROTO ((mpz_ptr,mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_rrandomb __gmpz_rrandomb -__GMP_DECLSPEC void mpz_rrandomb __GMP_PROTO ((mpz_ptr, gmp_randstate_t, mp_bitcnt_t)); - -#define mpz_scan0 __gmpz_scan0 -__GMP_DECLSPEC mp_bitcnt_t mpz_scan0 __GMP_PROTO ((mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_scan1 __gmpz_scan1 -__GMP_DECLSPEC mp_bitcnt_t mpz_scan1 __GMP_PROTO ((mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_set __gmpz_set -__GMP_DECLSPEC void mpz_set __GMP_PROTO ((mpz_ptr, mpz_srcptr)); - -#define mpz_set_d __gmpz_set_d -__GMP_DECLSPEC void mpz_set_d __GMP_PROTO ((mpz_ptr, double)); - -#define mpz_set_f __gmpz_set_f -__GMP_DECLSPEC void mpz_set_f __GMP_PROTO ((mpz_ptr, mpf_srcptr)); - -#define mpz_set_q __gmpz_set_q -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_set_q) -__GMP_DECLSPEC void mpz_set_q __GMP_PROTO ((mpz_ptr, mpq_srcptr)); -#endif - -#define mpz_set_si __gmpz_set_si -__GMP_DECLSPEC void mpz_set_si __GMP_PROTO ((mpz_ptr, signed long int)); - -#define mpz_set_str __gmpz_set_str -__GMP_DECLSPEC int mpz_set_str __GMP_PROTO ((mpz_ptr, __gmp_const char *, int)); - -#define mpz_set_ui __gmpz_set_ui -__GMP_DECLSPEC void mpz_set_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); - -#define mpz_setbit __gmpz_setbit -__GMP_DECLSPEC void mpz_setbit __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); - -#define mpz_size __gmpz_size -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_size) -__GMP_DECLSPEC size_t mpz_size __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_sizeinbase __gmpz_sizeinbase -__GMP_DECLSPEC size_t mpz_sizeinbase __GMP_PROTO ((mpz_srcptr, int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_sqrt __gmpz_sqrt -__GMP_DECLSPEC void mpz_sqrt __GMP_PROTO ((mpz_ptr, mpz_srcptr)); - -#define mpz_sqrtrem __gmpz_sqrtrem -__GMP_DECLSPEC void mpz_sqrtrem __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr)); - -#define mpz_sub __gmpz_sub -__GMP_DECLSPEC void mpz_sub __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_sub_ui __gmpz_sub_ui -__GMP_DECLSPEC void mpz_sub_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_ui_sub __gmpz_ui_sub -__GMP_DECLSPEC void mpz_ui_sub __GMP_PROTO ((mpz_ptr, unsigned long int, mpz_srcptr)); - -#define mpz_submul __gmpz_submul -__GMP_DECLSPEC void mpz_submul __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_submul_ui __gmpz_submul_ui -__GMP_DECLSPEC void mpz_submul_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_swap __gmpz_swap -__GMP_DECLSPEC void mpz_swap __GMP_PROTO ((mpz_ptr, mpz_ptr)) __GMP_NOTHROW; - -#define mpz_tdiv_ui __gmpz_tdiv_ui -__GMP_DECLSPEC unsigned long int mpz_tdiv_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE; - -#define mpz_tdiv_q __gmpz_tdiv_q -__GMP_DECLSPEC void mpz_tdiv_q __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_tdiv_q_2exp __gmpz_tdiv_q_2exp -__GMP_DECLSPEC void mpz_tdiv_q_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); - -#define mpz_tdiv_q_ui __gmpz_tdiv_q_ui -__GMP_DECLSPEC unsigned long int mpz_tdiv_q_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_tdiv_qr __gmpz_tdiv_qr -__GMP_DECLSPEC void mpz_tdiv_qr __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_tdiv_qr_ui __gmpz_tdiv_qr_ui -__GMP_DECLSPEC unsigned long int mpz_tdiv_qr_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_tdiv_r __gmpz_tdiv_r -__GMP_DECLSPEC void mpz_tdiv_r __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_tdiv_r_2exp __gmpz_tdiv_r_2exp -__GMP_DECLSPEC void mpz_tdiv_r_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); - -#define mpz_tdiv_r_ui __gmpz_tdiv_r_ui -__GMP_DECLSPEC unsigned long int mpz_tdiv_r_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_tstbit __gmpz_tstbit -__GMP_DECLSPEC int mpz_tstbit __GMP_PROTO ((mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_ui_pow_ui __gmpz_ui_pow_ui -__GMP_DECLSPEC void mpz_ui_pow_ui __GMP_PROTO ((mpz_ptr, unsigned long int, unsigned long int)); - -#define mpz_urandomb __gmpz_urandomb -__GMP_DECLSPEC void mpz_urandomb __GMP_PROTO ((mpz_ptr, gmp_randstate_t, mp_bitcnt_t)); - -#define mpz_urandomm __gmpz_urandomm -__GMP_DECLSPEC void mpz_urandomm __GMP_PROTO ((mpz_ptr, gmp_randstate_t, mpz_srcptr)); - -#define mpz_xor __gmpz_xor -#define mpz_eor __gmpz_xor -__GMP_DECLSPEC void mpz_xor __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - - -/**************** Rational (i.e. Q) routines. ****************/ - -#define mpq_abs __gmpq_abs -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpq_abs) -__GMP_DECLSPEC void mpq_abs __GMP_PROTO ((mpq_ptr, mpq_srcptr)); -#endif - -#define mpq_add __gmpq_add -__GMP_DECLSPEC void mpq_add __GMP_PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); - -#define mpq_canonicalize __gmpq_canonicalize -__GMP_DECLSPEC void mpq_canonicalize __GMP_PROTO ((mpq_ptr)); - -#define mpq_clear __gmpq_clear -__GMP_DECLSPEC void mpq_clear __GMP_PROTO ((mpq_ptr)); - -#define mpq_clears __gmpq_clears -__GMP_DECLSPEC void mpq_clears __GMP_PROTO ((mpq_ptr, ...)); - -#define mpq_cmp __gmpq_cmp -__GMP_DECLSPEC int mpq_cmp __GMP_PROTO ((mpq_srcptr, mpq_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define _mpq_cmp_si __gmpq_cmp_si -__GMP_DECLSPEC int _mpq_cmp_si __GMP_PROTO ((mpq_srcptr, long, unsigned long)) __GMP_ATTRIBUTE_PURE; - -#define _mpq_cmp_ui __gmpq_cmp_ui -__GMP_DECLSPEC int _mpq_cmp_ui __GMP_PROTO ((mpq_srcptr, unsigned long int, unsigned long int)) __GMP_ATTRIBUTE_PURE; - -#define mpq_div __gmpq_div -__GMP_DECLSPEC void mpq_div __GMP_PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); - -#define mpq_div_2exp __gmpq_div_2exp -__GMP_DECLSPEC void mpq_div_2exp __GMP_PROTO ((mpq_ptr, mpq_srcptr, mp_bitcnt_t)); - -#define mpq_equal __gmpq_equal -__GMP_DECLSPEC int mpq_equal __GMP_PROTO ((mpq_srcptr, mpq_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpq_get_num __gmpq_get_num -__GMP_DECLSPEC void mpq_get_num __GMP_PROTO ((mpz_ptr, mpq_srcptr)); - -#define mpq_get_den __gmpq_get_den -__GMP_DECLSPEC void mpq_get_den __GMP_PROTO ((mpz_ptr, mpq_srcptr)); - -#define mpq_get_d __gmpq_get_d -__GMP_DECLSPEC double mpq_get_d __GMP_PROTO ((mpq_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpq_get_str __gmpq_get_str -__GMP_DECLSPEC char *mpq_get_str __GMP_PROTO ((char *, int, mpq_srcptr)); - -#define mpq_init __gmpq_init -__GMP_DECLSPEC void mpq_init __GMP_PROTO ((mpq_ptr)); - -#define mpq_inits __gmpq_inits -__GMP_DECLSPEC void mpq_inits __GMP_PROTO ((mpq_ptr, ...)); - -#define mpq_inp_str __gmpq_inp_str -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpq_inp_str __GMP_PROTO ((mpq_ptr, FILE *, int)); -#endif - -#define mpq_inv __gmpq_inv -__GMP_DECLSPEC void mpq_inv __GMP_PROTO ((mpq_ptr, mpq_srcptr)); - -#define mpq_mul __gmpq_mul -__GMP_DECLSPEC void mpq_mul __GMP_PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); - -#define mpq_mul_2exp __gmpq_mul_2exp -__GMP_DECLSPEC void mpq_mul_2exp __GMP_PROTO ((mpq_ptr, mpq_srcptr, mp_bitcnt_t)); - -#define mpq_neg __gmpq_neg -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpq_neg) -__GMP_DECLSPEC void mpq_neg __GMP_PROTO ((mpq_ptr, mpq_srcptr)); -#endif - -#define mpq_out_str __gmpq_out_str -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpq_out_str __GMP_PROTO ((FILE *, int, mpq_srcptr)); -#endif - -#define mpq_set __gmpq_set -__GMP_DECLSPEC void mpq_set __GMP_PROTO ((mpq_ptr, mpq_srcptr)); - -#define mpq_set_d __gmpq_set_d -__GMP_DECLSPEC void mpq_set_d __GMP_PROTO ((mpq_ptr, double)); - -#define mpq_set_den __gmpq_set_den -__GMP_DECLSPEC void mpq_set_den __GMP_PROTO ((mpq_ptr, mpz_srcptr)); - -#define mpq_set_f __gmpq_set_f -__GMP_DECLSPEC void mpq_set_f __GMP_PROTO ((mpq_ptr, mpf_srcptr)); - -#define mpq_set_num __gmpq_set_num -__GMP_DECLSPEC void mpq_set_num __GMP_PROTO ((mpq_ptr, mpz_srcptr)); - -#define mpq_set_si __gmpq_set_si -__GMP_DECLSPEC void mpq_set_si __GMP_PROTO ((mpq_ptr, signed long int, unsigned long int)); - -#define mpq_set_str __gmpq_set_str -__GMP_DECLSPEC int mpq_set_str __GMP_PROTO ((mpq_ptr, __gmp_const char *, int)); - -#define mpq_set_ui __gmpq_set_ui -__GMP_DECLSPEC void mpq_set_ui __GMP_PROTO ((mpq_ptr, unsigned long int, unsigned long int)); - -#define mpq_set_z __gmpq_set_z -__GMP_DECLSPEC void mpq_set_z __GMP_PROTO ((mpq_ptr, mpz_srcptr)); - -#define mpq_sub __gmpq_sub -__GMP_DECLSPEC void mpq_sub __GMP_PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); - -#define mpq_swap __gmpq_swap -__GMP_DECLSPEC void mpq_swap __GMP_PROTO ((mpq_ptr, mpq_ptr)) __GMP_NOTHROW; - - -/**************** Float (i.e. F) routines. ****************/ - -#define mpf_abs __gmpf_abs -__GMP_DECLSPEC void mpf_abs __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_add __gmpf_add -__GMP_DECLSPEC void mpf_add __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); - -#define mpf_add_ui __gmpf_add_ui -__GMP_DECLSPEC void mpf_add_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); -#define mpf_ceil __gmpf_ceil -__GMP_DECLSPEC void mpf_ceil __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_clear __gmpf_clear -__GMP_DECLSPEC void mpf_clear __GMP_PROTO ((mpf_ptr)); - -#define mpf_clears __gmpf_clears -__GMP_DECLSPEC void mpf_clears __GMP_PROTO ((mpf_ptr, ...)); - -#define mpf_cmp __gmpf_cmp -__GMP_DECLSPEC int mpf_cmp __GMP_PROTO ((mpf_srcptr, mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_cmp_d __gmpf_cmp_d -__GMP_DECLSPEC int mpf_cmp_d __GMP_PROTO ((mpf_srcptr, double)) __GMP_ATTRIBUTE_PURE; - -#define mpf_cmp_si __gmpf_cmp_si -__GMP_DECLSPEC int mpf_cmp_si __GMP_PROTO ((mpf_srcptr, signed long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_cmp_ui __gmpf_cmp_ui -__GMP_DECLSPEC int mpf_cmp_ui __GMP_PROTO ((mpf_srcptr, unsigned long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_div __gmpf_div -__GMP_DECLSPEC void mpf_div __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); - -#define mpf_div_2exp __gmpf_div_2exp -__GMP_DECLSPEC void mpf_div_2exp __GMP_PROTO ((mpf_ptr, mpf_srcptr, mp_bitcnt_t)); - -#define mpf_div_ui __gmpf_div_ui -__GMP_DECLSPEC void mpf_div_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); - -#define mpf_dump __gmpf_dump -__GMP_DECLSPEC void mpf_dump __GMP_PROTO ((mpf_srcptr)); - -#define mpf_eq __gmpf_eq -__GMP_DECLSPEC int mpf_eq __GMP_PROTO ((mpf_srcptr, mpf_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE; - -#define mpf_fits_sint_p __gmpf_fits_sint_p -__GMP_DECLSPEC int mpf_fits_sint_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_fits_slong_p __gmpf_fits_slong_p -__GMP_DECLSPEC int mpf_fits_slong_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_fits_sshort_p __gmpf_fits_sshort_p -__GMP_DECLSPEC int mpf_fits_sshort_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_fits_uint_p __gmpf_fits_uint_p -__GMP_DECLSPEC int mpf_fits_uint_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_fits_ulong_p __gmpf_fits_ulong_p -__GMP_DECLSPEC int mpf_fits_ulong_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_fits_ushort_p __gmpf_fits_ushort_p -__GMP_DECLSPEC int mpf_fits_ushort_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_floor __gmpf_floor -__GMP_DECLSPEC void mpf_floor __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_get_d __gmpf_get_d -__GMP_DECLSPEC double mpf_get_d __GMP_PROTO ((mpf_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpf_get_d_2exp __gmpf_get_d_2exp -__GMP_DECLSPEC double mpf_get_d_2exp __GMP_PROTO ((signed long int *, mpf_srcptr)); - -#define mpf_get_default_prec __gmpf_get_default_prec -__GMP_DECLSPEC mp_bitcnt_t mpf_get_default_prec __GMP_PROTO ((void)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_get_prec __gmpf_get_prec -__GMP_DECLSPEC mp_bitcnt_t mpf_get_prec __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_get_si __gmpf_get_si -__GMP_DECLSPEC long mpf_get_si __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_get_str __gmpf_get_str -__GMP_DECLSPEC char *mpf_get_str __GMP_PROTO ((char *, mp_exp_t *, int, size_t, mpf_srcptr)); - -#define mpf_get_ui __gmpf_get_ui -__GMP_DECLSPEC unsigned long mpf_get_ui __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_init __gmpf_init -__GMP_DECLSPEC void mpf_init __GMP_PROTO ((mpf_ptr)); - -#define mpf_init2 __gmpf_init2 -__GMP_DECLSPEC void mpf_init2 __GMP_PROTO ((mpf_ptr, mp_bitcnt_t)); - -#define mpf_inits __gmpf_inits -__GMP_DECLSPEC void mpf_inits __GMP_PROTO ((mpf_ptr, ...)); - -#define mpf_init_set __gmpf_init_set -__GMP_DECLSPEC void mpf_init_set __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_init_set_d __gmpf_init_set_d -__GMP_DECLSPEC void mpf_init_set_d __GMP_PROTO ((mpf_ptr, double)); - -#define mpf_init_set_si __gmpf_init_set_si -__GMP_DECLSPEC void mpf_init_set_si __GMP_PROTO ((mpf_ptr, signed long int)); - -#define mpf_init_set_str __gmpf_init_set_str -__GMP_DECLSPEC int mpf_init_set_str __GMP_PROTO ((mpf_ptr, __gmp_const char *, int)); - -#define mpf_init_set_ui __gmpf_init_set_ui -__GMP_DECLSPEC void mpf_init_set_ui __GMP_PROTO ((mpf_ptr, unsigned long int)); - -#define mpf_inp_str __gmpf_inp_str -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpf_inp_str __GMP_PROTO ((mpf_ptr, FILE *, int)); -#endif - -#define mpf_integer_p __gmpf_integer_p -__GMP_DECLSPEC int mpf_integer_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_mul __gmpf_mul -__GMP_DECLSPEC void mpf_mul __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); - -#define mpf_mul_2exp __gmpf_mul_2exp -__GMP_DECLSPEC void mpf_mul_2exp __GMP_PROTO ((mpf_ptr, mpf_srcptr, mp_bitcnt_t)); - -#define mpf_mul_ui __gmpf_mul_ui -__GMP_DECLSPEC void mpf_mul_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); - -#define mpf_neg __gmpf_neg -__GMP_DECLSPEC void mpf_neg __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_out_str __gmpf_out_str -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpf_out_str __GMP_PROTO ((FILE *, int, size_t, mpf_srcptr)); -#endif - -#define mpf_pow_ui __gmpf_pow_ui -__GMP_DECLSPEC void mpf_pow_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); - -#define mpf_random2 __gmpf_random2 -__GMP_DECLSPEC void mpf_random2 __GMP_PROTO ((mpf_ptr, mp_size_t, mp_exp_t)); - -#define mpf_reldiff __gmpf_reldiff -__GMP_DECLSPEC void mpf_reldiff __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); - -#define mpf_set __gmpf_set -__GMP_DECLSPEC void mpf_set __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_set_d __gmpf_set_d -__GMP_DECLSPEC void mpf_set_d __GMP_PROTO ((mpf_ptr, double)); - -#define mpf_set_default_prec __gmpf_set_default_prec -__GMP_DECLSPEC void mpf_set_default_prec __GMP_PROTO ((mp_bitcnt_t)) __GMP_NOTHROW; - -#define mpf_set_prec __gmpf_set_prec -__GMP_DECLSPEC void mpf_set_prec __GMP_PROTO ((mpf_ptr, mp_bitcnt_t)); - -#define mpf_set_prec_raw __gmpf_set_prec_raw -__GMP_DECLSPEC void mpf_set_prec_raw __GMP_PROTO ((mpf_ptr, mp_bitcnt_t)) __GMP_NOTHROW; - -#define mpf_set_q __gmpf_set_q -__GMP_DECLSPEC void mpf_set_q __GMP_PROTO ((mpf_ptr, mpq_srcptr)); - -#define mpf_set_si __gmpf_set_si -__GMP_DECLSPEC void mpf_set_si __GMP_PROTO ((mpf_ptr, signed long int)); - -#define mpf_set_str __gmpf_set_str -__GMP_DECLSPEC int mpf_set_str __GMP_PROTO ((mpf_ptr, __gmp_const char *, int)); - -#define mpf_set_ui __gmpf_set_ui -__GMP_DECLSPEC void mpf_set_ui __GMP_PROTO ((mpf_ptr, unsigned long int)); - -#define mpf_set_z __gmpf_set_z -__GMP_DECLSPEC void mpf_set_z __GMP_PROTO ((mpf_ptr, mpz_srcptr)); - -#define mpf_size __gmpf_size -__GMP_DECLSPEC size_t mpf_size __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_sqrt __gmpf_sqrt -__GMP_DECLSPEC void mpf_sqrt __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_sqrt_ui __gmpf_sqrt_ui -__GMP_DECLSPEC void mpf_sqrt_ui __GMP_PROTO ((mpf_ptr, unsigned long int)); - -#define mpf_sub __gmpf_sub -__GMP_DECLSPEC void mpf_sub __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); - -#define mpf_sub_ui __gmpf_sub_ui -__GMP_DECLSPEC void mpf_sub_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); - -#define mpf_swap __gmpf_swap -__GMP_DECLSPEC void mpf_swap __GMP_PROTO ((mpf_ptr, mpf_ptr)) __GMP_NOTHROW; - -#define mpf_trunc __gmpf_trunc -__GMP_DECLSPEC void mpf_trunc __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_ui_div __gmpf_ui_div -__GMP_DECLSPEC void mpf_ui_div __GMP_PROTO ((mpf_ptr, unsigned long int, mpf_srcptr)); - -#define mpf_ui_sub __gmpf_ui_sub -__GMP_DECLSPEC void mpf_ui_sub __GMP_PROTO ((mpf_ptr, unsigned long int, mpf_srcptr)); - -#define mpf_urandomb __gmpf_urandomb -__GMP_DECLSPEC void mpf_urandomb __GMP_PROTO ((mpf_t, gmp_randstate_t, mp_bitcnt_t)); - - -/************ Low level positive-integer (i.e. N) routines. ************/ - -/* This is ugly, but we need to make user calls reach the prefixed function. */ - -#define mpn_add __MPN(add) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_add) -__GMP_DECLSPEC mp_limb_t mpn_add __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t)); -#endif - -#define mpn_add_1 __MPN(add_1) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_add_1) -__GMP_DECLSPEC mp_limb_t mpn_add_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)) __GMP_NOTHROW; -#endif - -#define mpn_add_n __MPN(add_n) -__GMP_DECLSPEC mp_limb_t mpn_add_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); - -#define mpn_addmul_1 __MPN(addmul_1) -__GMP_DECLSPEC mp_limb_t mpn_addmul_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_cmp __MPN(cmp) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_cmp) -__GMP_DECLSPEC int mpn_cmp __GMP_PROTO ((mp_srcptr, mp_srcptr, mp_size_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpn_divexact_by3(dst,src,size) \ - mpn_divexact_by3c (dst, src, size, __GMP_CAST (mp_limb_t, 0)) - -#define mpn_divexact_by3c __MPN(divexact_by3c) -__GMP_DECLSPEC mp_limb_t mpn_divexact_by3c __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_divmod_1(qp,np,nsize,dlimb) \ - mpn_divrem_1 (qp, __GMP_CAST (mp_size_t, 0), np, nsize, dlimb) - -#define mpn_divrem __MPN(divrem) -__GMP_DECLSPEC mp_limb_t mpn_divrem __GMP_PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t)); - -#define mpn_divrem_1 __MPN(divrem_1) -__GMP_DECLSPEC mp_limb_t mpn_divrem_1 __GMP_PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_divrem_2 __MPN(divrem_2) -__GMP_DECLSPEC mp_limb_t mpn_divrem_2 __GMP_PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr)); - -#define mpn_gcd __MPN(gcd) -__GMP_DECLSPEC mp_size_t mpn_gcd __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t)); - -#define mpn_gcd_1 __MPN(gcd_1) -__GMP_DECLSPEC mp_limb_t mpn_gcd_1 __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_gcdext_1 __MPN(gcdext_1) -__GMP_DECLSPEC mp_limb_t mpn_gcdext_1 __GMP_PROTO ((mp_limb_signed_t *, mp_limb_signed_t *, mp_limb_t, mp_limb_t)); - -#define mpn_gcdext __MPN(gcdext) -__GMP_DECLSPEC mp_size_t mpn_gcdext __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t *, mp_ptr, mp_size_t, mp_ptr, mp_size_t)); - -#define mpn_get_str __MPN(get_str) -__GMP_DECLSPEC size_t mpn_get_str __GMP_PROTO ((unsigned char *, int, mp_ptr, mp_size_t)); - -#define mpn_hamdist __MPN(hamdist) -__GMP_DECLSPEC mp_bitcnt_t mpn_hamdist __GMP_PROTO ((mp_srcptr, mp_srcptr, mp_size_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpn_lshift __MPN(lshift) -__GMP_DECLSPEC mp_limb_t mpn_lshift __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int)); - -#define mpn_mod_1 __MPN(mod_1) -__GMP_DECLSPEC mp_limb_t mpn_mod_1 __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_mul __MPN(mul) -__GMP_DECLSPEC mp_limb_t mpn_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)); - -#define mpn_mul_1 __MPN(mul_1) -__GMP_DECLSPEC mp_limb_t mpn_mul_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_mul_n __MPN(mul_n) -__GMP_DECLSPEC void mpn_mul_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); - -#define mpn_sqr __MPN(sqr) -__GMP_DECLSPEC void mpn_sqr __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); - -#define mpn_neg __MPN(neg) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_neg) -__GMP_DECLSPEC mp_limb_t mpn_neg __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -#endif - -#define mpn_com __MPN(com) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_com) -__GMP_DECLSPEC void mpn_com __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -#endif - -#define mpn_perfect_square_p __MPN(perfect_square_p) -__GMP_DECLSPEC int mpn_perfect_square_p __GMP_PROTO ((mp_srcptr, mp_size_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_perfect_power_p __MPN(perfect_power_p) -__GMP_DECLSPEC int mpn_perfect_power_p __GMP_PROTO ((mp_srcptr, mp_size_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_popcount __MPN(popcount) -__GMP_DECLSPEC mp_bitcnt_t mpn_popcount __GMP_PROTO ((mp_srcptr, mp_size_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpn_pow_1 __MPN(pow_1) -__GMP_DECLSPEC mp_size_t mpn_pow_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_ptr)); - -/* undocumented now, but retained here for upward compatibility */ -#define mpn_preinv_mod_1 __MPN(preinv_mod_1) -__GMP_DECLSPEC mp_limb_t mpn_preinv_mod_1 __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_random __MPN(random) -__GMP_DECLSPEC void mpn_random __GMP_PROTO ((mp_ptr, mp_size_t)); - -#define mpn_random2 __MPN(random2) -__GMP_DECLSPEC void mpn_random2 __GMP_PROTO ((mp_ptr, mp_size_t)); - -#define mpn_rshift __MPN(rshift) -__GMP_DECLSPEC mp_limb_t mpn_rshift __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int)); - -#define mpn_scan0 __MPN(scan0) -__GMP_DECLSPEC mp_bitcnt_t mpn_scan0 __GMP_PROTO ((mp_srcptr, mp_bitcnt_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_scan1 __MPN(scan1) -__GMP_DECLSPEC mp_bitcnt_t mpn_scan1 __GMP_PROTO ((mp_srcptr, mp_bitcnt_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_set_str __MPN(set_str) -__GMP_DECLSPEC mp_size_t mpn_set_str __GMP_PROTO ((mp_ptr, __gmp_const unsigned char *, size_t, int)); - -#define mpn_sqrtrem __MPN(sqrtrem) -__GMP_DECLSPEC mp_size_t mpn_sqrtrem __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t)); - -#define mpn_sub __MPN(sub) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_sub) -__GMP_DECLSPEC mp_limb_t mpn_sub __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t)); -#endif - -#define mpn_sub_1 __MPN(sub_1) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_sub_1) -__GMP_DECLSPEC mp_limb_t mpn_sub_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)) __GMP_NOTHROW; -#endif - -#define mpn_sub_n __MPN(sub_n) -__GMP_DECLSPEC mp_limb_t mpn_sub_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); - -#define mpn_submul_1 __MPN(submul_1) -__GMP_DECLSPEC mp_limb_t mpn_submul_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_tdiv_qr __MPN(tdiv_qr) -__GMP_DECLSPEC void mpn_tdiv_qr __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)); - -#define mpn_and_n __MPN(and_n) -__GMP_DECLSPEC void mpn_and_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_andn_n __MPN(andn_n) -__GMP_DECLSPEC void mpn_andn_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_nand_n __MPN(nand_n) -__GMP_DECLSPEC void mpn_nand_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_ior_n __MPN(ior_n) -__GMP_DECLSPEC void mpn_ior_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_iorn_n __MPN(iorn_n) -__GMP_DECLSPEC void mpn_iorn_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_nior_n __MPN(nior_n) -__GMP_DECLSPEC void mpn_nior_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_xor_n __MPN(xor_n) -__GMP_DECLSPEC void mpn_xor_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_xnor_n __MPN(xnor_n) -__GMP_DECLSPEC void mpn_xnor_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); - -#define mpn_copyi __MPN(copyi) -__GMP_DECLSPEC void mpn_copyi __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -#define mpn_copyd __MPN(copyd) -__GMP_DECLSPEC void mpn_copyd __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -#define mpn_zero __MPN(zero) -__GMP_DECLSPEC void mpn_zero __GMP_PROTO ((mp_ptr, mp_size_t)); - -/**************** mpz inlines ****************/ - -/* The following are provided as inlines where possible, but always exist as - library functions too, for binary compatibility. - - Within gmp itself this inlining generally isn't relied on, since it - doesn't get done for all compilers, whereas if something is worth - inlining then it's worth arranging always. - - There are two styles of inlining here. When the same bit of code is - wanted for the inline as for the library version, then __GMP_FORCE_foo - arranges for that code to be emitted and the __GMP_EXTERN_INLINE - directive suppressed, eg. mpz_fits_uint_p. When a different bit of code - is wanted for the inline than for the library version, then - __GMP_FORCE_foo arranges the inline to be suppressed, eg. mpz_abs. */ - -#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpz_abs) -__GMP_EXTERN_INLINE void -mpz_abs (mpz_ptr __gmp_w, mpz_srcptr __gmp_u) -{ - if (__gmp_w != __gmp_u) - mpz_set (__gmp_w, __gmp_u); - __gmp_w->_mp_size = __GMP_ABS (__gmp_w->_mp_size); -} -#endif - -#if GMP_NAIL_BITS == 0 -#define __GMPZ_FITS_UTYPE_P(z,maxval) \ - mp_size_t __gmp_n = z->_mp_size; \ - mp_ptr __gmp_p = z->_mp_d; \ - return (__gmp_n == 0 || (__gmp_n == 1 && __gmp_p[0] <= maxval)); -#else -#define __GMPZ_FITS_UTYPE_P(z,maxval) \ - mp_size_t __gmp_n = z->_mp_size; \ - mp_ptr __gmp_p = z->_mp_d; \ - return (__gmp_n == 0 || (__gmp_n == 1 && __gmp_p[0] <= maxval) \ - || (__gmp_n == 2 && __gmp_p[1] <= ((mp_limb_t) maxval >> GMP_NUMB_BITS))); -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_uint_p) -#if ! defined (__GMP_FORCE_mpz_fits_uint_p) -__GMP_EXTERN_INLINE -#endif -int -mpz_fits_uint_p (mpz_srcptr __gmp_z) __GMP_NOTHROW -{ - __GMPZ_FITS_UTYPE_P (__gmp_z, __GMP_UINT_MAX); -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_ulong_p) -#if ! defined (__GMP_FORCE_mpz_fits_ulong_p) -__GMP_EXTERN_INLINE -#endif -int -mpz_fits_ulong_p (mpz_srcptr __gmp_z) __GMP_NOTHROW -{ - __GMPZ_FITS_UTYPE_P (__gmp_z, __GMP_ULONG_MAX); -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_ushort_p) -#if ! defined (__GMP_FORCE_mpz_fits_ushort_p) -__GMP_EXTERN_INLINE -#endif -int -mpz_fits_ushort_p (mpz_srcptr __gmp_z) __GMP_NOTHROW -{ - __GMPZ_FITS_UTYPE_P (__gmp_z, __GMP_USHRT_MAX); -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_get_ui) -#if ! defined (__GMP_FORCE_mpz_get_ui) -__GMP_EXTERN_INLINE -#endif -unsigned long -mpz_get_ui (mpz_srcptr __gmp_z) __GMP_NOTHROW -{ - mp_ptr __gmp_p = __gmp_z->_mp_d; - mp_size_t __gmp_n = __gmp_z->_mp_size; - mp_limb_t __gmp_l = __gmp_p[0]; - /* This is a "#if" rather than a plain "if" so as to avoid gcc warnings - about "<< GMP_NUMB_BITS" exceeding the type size, and to avoid Borland - C++ 6.0 warnings about condition always true for something like - "__GMP_ULONG_MAX < GMP_NUMB_MASK". */ -#if GMP_NAIL_BITS == 0 || defined (_LONG_LONG_LIMB) - /* limb==long and no nails, or limb==longlong, one limb is enough */ - return (__gmp_n != 0 ? __gmp_l : 0); -#else - /* limb==long and nails, need two limbs when available */ - __gmp_n = __GMP_ABS (__gmp_n); - if (__gmp_n <= 1) - return (__gmp_n != 0 ? __gmp_l : 0); - else - return __gmp_l + (__gmp_p[1] << GMP_NUMB_BITS); -#endif -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_getlimbn) -#if ! defined (__GMP_FORCE_mpz_getlimbn) -__GMP_EXTERN_INLINE -#endif -mp_limb_t -mpz_getlimbn (mpz_srcptr __gmp_z, mp_size_t __gmp_n) __GMP_NOTHROW -{ - mp_limb_t __gmp_result = 0; - if (__GMP_LIKELY (__gmp_n >= 0 && __gmp_n < __GMP_ABS (__gmp_z->_mp_size))) - __gmp_result = __gmp_z->_mp_d[__gmp_n]; - return __gmp_result; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpz_neg) -__GMP_EXTERN_INLINE void -mpz_neg (mpz_ptr __gmp_w, mpz_srcptr __gmp_u) -{ - if (__gmp_w != __gmp_u) - mpz_set (__gmp_w, __gmp_u); - __gmp_w->_mp_size = - __gmp_w->_mp_size; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_perfect_square_p) -#if ! defined (__GMP_FORCE_mpz_perfect_square_p) -__GMP_EXTERN_INLINE -#endif -int -mpz_perfect_square_p (mpz_srcptr __gmp_a) -{ - mp_size_t __gmp_asize; - int __gmp_result; - - __gmp_asize = __gmp_a->_mp_size; - __gmp_result = (__gmp_asize >= 0); /* zero is a square, negatives are not */ - if (__GMP_LIKELY (__gmp_asize > 0)) - __gmp_result = mpn_perfect_square_p (__gmp_a->_mp_d, __gmp_asize); - return __gmp_result; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_popcount) -#if ! defined (__GMP_FORCE_mpz_popcount) -__GMP_EXTERN_INLINE -#endif -mp_bitcnt_t -mpz_popcount (mpz_srcptr __gmp_u) __GMP_NOTHROW -{ - mp_size_t __gmp_usize; - mp_bitcnt_t __gmp_result; - - __gmp_usize = __gmp_u->_mp_size; - __gmp_result = (__gmp_usize < 0 ? __GMP_ULONG_MAX : 0); - if (__GMP_LIKELY (__gmp_usize > 0)) - __gmp_result = mpn_popcount (__gmp_u->_mp_d, __gmp_usize); - return __gmp_result; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_set_q) -#if ! defined (__GMP_FORCE_mpz_set_q) -__GMP_EXTERN_INLINE -#endif -void -mpz_set_q (mpz_ptr __gmp_w, mpq_srcptr __gmp_u) -{ - mpz_tdiv_q (__gmp_w, mpq_numref (__gmp_u), mpq_denref (__gmp_u)); -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_size) -#if ! defined (__GMP_FORCE_mpz_size) -__GMP_EXTERN_INLINE -#endif -size_t -mpz_size (mpz_srcptr __gmp_z) __GMP_NOTHROW -{ - return __GMP_ABS (__gmp_z->_mp_size); -} -#endif - - -/**************** mpq inlines ****************/ - -#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpq_abs) -__GMP_EXTERN_INLINE void -mpq_abs (mpq_ptr __gmp_w, mpq_srcptr __gmp_u) -{ - if (__gmp_w != __gmp_u) - mpq_set (__gmp_w, __gmp_u); - __gmp_w->_mp_num._mp_size = __GMP_ABS (__gmp_w->_mp_num._mp_size); -} -#endif - -#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpq_neg) -__GMP_EXTERN_INLINE void -mpq_neg (mpq_ptr __gmp_w, mpq_srcptr __gmp_u) -{ - if (__gmp_w != __gmp_u) - mpq_set (__gmp_w, __gmp_u); - __gmp_w->_mp_num._mp_size = - __gmp_w->_mp_num._mp_size; -} -#endif - - -/**************** mpn inlines ****************/ - -/* The comments with __GMPN_ADD_1 below apply here too. - - The test for FUNCTION returning 0 should predict well. If it's assumed - {yp,ysize} will usually have a random number of bits then the high limb - won't be full and a carry out will occur a good deal less than 50% of the - time. - - ysize==0 isn't a documented feature, but is used internally in a few - places. - - Producing cout last stops it using up a register during the main part of - the calculation, though gcc (as of 3.0) on an "if (mpn_add (...))" - doesn't seem able to move the true and false legs of the conditional up - to the two places cout is generated. */ - -#define __GMPN_AORS(cout, wp, xp, xsize, yp, ysize, FUNCTION, TEST) \ - do { \ - mp_size_t __gmp_i; \ - mp_limb_t __gmp_x; \ - \ - /* ASSERT ((ysize) >= 0); */ \ - /* ASSERT ((xsize) >= (ysize)); */ \ - /* ASSERT (MPN_SAME_OR_SEPARATE2_P (wp, xsize, xp, xsize)); */ \ - /* ASSERT (MPN_SAME_OR_SEPARATE2_P (wp, xsize, yp, ysize)); */ \ - \ - __gmp_i = (ysize); \ - if (__gmp_i != 0) \ - { \ - if (FUNCTION (wp, xp, yp, __gmp_i)) \ - { \ - do \ - { \ - if (__gmp_i >= (xsize)) \ - { \ - (cout) = 1; \ - goto __gmp_done; \ - } \ - __gmp_x = (xp)[__gmp_i]; \ - } \ - while (TEST); \ - } \ - } \ - if ((wp) != (xp)) \ - __GMPN_COPY_REST (wp, xp, xsize, __gmp_i); \ - (cout) = 0; \ - __gmp_done: \ - ; \ - } while (0) - -#define __GMPN_ADD(cout, wp, xp, xsize, yp, ysize) \ - __GMPN_AORS (cout, wp, xp, xsize, yp, ysize, mpn_add_n, \ - (((wp)[__gmp_i++] = (__gmp_x + 1) & GMP_NUMB_MASK) == 0)) -#define __GMPN_SUB(cout, wp, xp, xsize, yp, ysize) \ - __GMPN_AORS (cout, wp, xp, xsize, yp, ysize, mpn_sub_n, \ - (((wp)[__gmp_i++] = (__gmp_x - 1) & GMP_NUMB_MASK), __gmp_x == 0)) - - -/* The use of __gmp_i indexing is designed to ensure a compile time src==dst - remains nice and clear to the compiler, so that __GMPN_COPY_REST can - disappear, and the load/add/store gets a chance to become a - read-modify-write on CISC CPUs. - - Alternatives: - - Using a pair of pointers instead of indexing would be possible, but gcc - isn't able to recognise compile-time src==dst in that case, even when the - pointers are incremented more or less together. Other compilers would - very likely have similar difficulty. - - gcc could use "if (__builtin_constant_p(src==dst) && src==dst)" or - similar to detect a compile-time src==dst. This works nicely on gcc - 2.95.x, it's not good on gcc 3.0 where __builtin_constant_p(p==p) seems - to be always false, for a pointer p. But the current code form seems - good enough for src==dst anyway. - - gcc on x86 as usual doesn't give particularly good flags handling for the - carry/borrow detection. It's tempting to want some multi instruction asm - blocks to help it, and this was tried, but in truth there's only a few - instructions to save and any gain is all too easily lost by register - juggling setting up for the asm. */ - -#if GMP_NAIL_BITS == 0 -#define __GMPN_AORS_1(cout, dst, src, n, v, OP, CB) \ - do { \ - mp_size_t __gmp_i; \ - mp_limb_t __gmp_x, __gmp_r; \ - \ - /* ASSERT ((n) >= 1); */ \ - /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, n)); */ \ - \ - __gmp_x = (src)[0]; \ - __gmp_r = __gmp_x OP (v); \ - (dst)[0] = __gmp_r; \ - if (CB (__gmp_r, __gmp_x, (v))) \ - { \ - (cout) = 1; \ - for (__gmp_i = 1; __gmp_i < (n);) \ - { \ - __gmp_x = (src)[__gmp_i]; \ - __gmp_r = __gmp_x OP 1; \ - (dst)[__gmp_i] = __gmp_r; \ - ++__gmp_i; \ - if (!CB (__gmp_r, __gmp_x, 1)) \ - { \ - if ((src) != (dst)) \ - __GMPN_COPY_REST (dst, src, n, __gmp_i); \ - (cout) = 0; \ - break; \ - } \ - } \ - } \ - else \ - { \ - if ((src) != (dst)) \ - __GMPN_COPY_REST (dst, src, n, 1); \ - (cout) = 0; \ - } \ - } while (0) -#endif - -#if GMP_NAIL_BITS >= 1 -#define __GMPN_AORS_1(cout, dst, src, n, v, OP, CB) \ - do { \ - mp_size_t __gmp_i; \ - mp_limb_t __gmp_x, __gmp_r; \ - \ - /* ASSERT ((n) >= 1); */ \ - /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, n)); */ \ - \ - __gmp_x = (src)[0]; \ - __gmp_r = __gmp_x OP (v); \ - (dst)[0] = __gmp_r & GMP_NUMB_MASK; \ - if (__gmp_r >> GMP_NUMB_BITS != 0) \ - { \ - (cout) = 1; \ - for (__gmp_i = 1; __gmp_i < (n);) \ - { \ - __gmp_x = (src)[__gmp_i]; \ - __gmp_r = __gmp_x OP 1; \ - (dst)[__gmp_i] = __gmp_r & GMP_NUMB_MASK; \ - ++__gmp_i; \ - if (__gmp_r >> GMP_NUMB_BITS == 0) \ - { \ - if ((src) != (dst)) \ - __GMPN_COPY_REST (dst, src, n, __gmp_i); \ - (cout) = 0; \ - break; \ - } \ - } \ - } \ - else \ - { \ - if ((src) != (dst)) \ - __GMPN_COPY_REST (dst, src, n, 1); \ - (cout) = 0; \ - } \ - } while (0) -#endif - -#define __GMPN_ADDCB(r,x,y) ((r) < (y)) -#define __GMPN_SUBCB(r,x,y) ((x) < (y)) - -#define __GMPN_ADD_1(cout, dst, src, n, v) \ - __GMPN_AORS_1(cout, dst, src, n, v, +, __GMPN_ADDCB) -#define __GMPN_SUB_1(cout, dst, src, n, v) \ - __GMPN_AORS_1(cout, dst, src, n, v, -, __GMPN_SUBCB) - - -/* Compare {xp,size} and {yp,size}, setting "result" to positive, zero or - negative. size==0 is allowed. On random data usually only one limb will - need to be examined to get a result, so it's worth having it inline. */ -#define __GMPN_CMP(result, xp, yp, size) \ - do { \ - mp_size_t __gmp_i; \ - mp_limb_t __gmp_x, __gmp_y; \ - \ - /* ASSERT ((size) >= 0); */ \ - \ - (result) = 0; \ - __gmp_i = (size); \ - while (--__gmp_i >= 0) \ - { \ - __gmp_x = (xp)[__gmp_i]; \ - __gmp_y = (yp)[__gmp_i]; \ - if (__gmp_x != __gmp_y) \ - { \ - /* Cannot use __gmp_x - __gmp_y, may overflow an "int" */ \ - (result) = (__gmp_x > __gmp_y ? 1 : -1); \ - break; \ - } \ - } \ - } while (0) - - -#if defined (__GMPN_COPY) && ! defined (__GMPN_COPY_REST) -#define __GMPN_COPY_REST(dst, src, size, start) \ - do { \ - /* ASSERT ((start) >= 0); */ \ - /* ASSERT ((start) <= (size)); */ \ - __GMPN_COPY ((dst)+(start), (src)+(start), (size)-(start)); \ - } while (0) -#endif - -/* Copy {src,size} to {dst,size}, starting at "start". This is designed to - keep the indexing dst[j] and src[j] nice and simple for __GMPN_ADD_1, - __GMPN_ADD, etc. */ -#if ! defined (__GMPN_COPY_REST) -#define __GMPN_COPY_REST(dst, src, size, start) \ - do { \ - mp_size_t __gmp_j; \ - /* ASSERT ((size) >= 0); */ \ - /* ASSERT ((start) >= 0); */ \ - /* ASSERT ((start) <= (size)); */ \ - /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, size)); */ \ - __GMP_CRAY_Pragma ("_CRI ivdep"); \ - for (__gmp_j = (start); __gmp_j < (size); __gmp_j++) \ - (dst)[__gmp_j] = (src)[__gmp_j]; \ - } while (0) -#endif - -/* Enhancement: Use some of the smarter code from gmp-impl.h. Maybe use - mpn_copyi if there's a native version, and if we don't mind demanding - binary compatibility for it (on targets which use it). */ - -#if ! defined (__GMPN_COPY) -#define __GMPN_COPY(dst, src, size) __GMPN_COPY_REST (dst, src, size, 0) -#endif - - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_add) -#if ! defined (__GMP_FORCE_mpn_add) -__GMP_EXTERN_INLINE -#endif -mp_limb_t -mpn_add (mp_ptr __gmp_wp, mp_srcptr __gmp_xp, mp_size_t __gmp_xsize, mp_srcptr __gmp_yp, mp_size_t __gmp_ysize) -{ - mp_limb_t __gmp_c; - __GMPN_ADD (__gmp_c, __gmp_wp, __gmp_xp, __gmp_xsize, __gmp_yp, __gmp_ysize); - return __gmp_c; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_add_1) -#if ! defined (__GMP_FORCE_mpn_add_1) -__GMP_EXTERN_INLINE -#endif -mp_limb_t -mpn_add_1 (mp_ptr __gmp_dst, mp_srcptr __gmp_src, mp_size_t __gmp_size, mp_limb_t __gmp_n) __GMP_NOTHROW -{ - mp_limb_t __gmp_c; - __GMPN_ADD_1 (__gmp_c, __gmp_dst, __gmp_src, __gmp_size, __gmp_n); - return __gmp_c; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_cmp) -#if ! defined (__GMP_FORCE_mpn_cmp) -__GMP_EXTERN_INLINE -#endif -int -mpn_cmp (mp_srcptr __gmp_xp, mp_srcptr __gmp_yp, mp_size_t __gmp_size) __GMP_NOTHROW -{ - int __gmp_result; - __GMPN_CMP (__gmp_result, __gmp_xp, __gmp_yp, __gmp_size); - return __gmp_result; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_sub) -#if ! defined (__GMP_FORCE_mpn_sub) -__GMP_EXTERN_INLINE -#endif -mp_limb_t -mpn_sub (mp_ptr __gmp_wp, mp_srcptr __gmp_xp, mp_size_t __gmp_xsize, mp_srcptr __gmp_yp, mp_size_t __gmp_ysize) -{ - mp_limb_t __gmp_c; - __GMPN_SUB (__gmp_c, __gmp_wp, __gmp_xp, __gmp_xsize, __gmp_yp, __gmp_ysize); - return __gmp_c; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_sub_1) -#if ! defined (__GMP_FORCE_mpn_sub_1) -__GMP_EXTERN_INLINE -#endif -mp_limb_t -mpn_sub_1 (mp_ptr __gmp_dst, mp_srcptr __gmp_src, mp_size_t __gmp_size, mp_limb_t __gmp_n) __GMP_NOTHROW -{ - mp_limb_t __gmp_c; - __GMPN_SUB_1 (__gmp_c, __gmp_dst, __gmp_src, __gmp_size, __gmp_n); - return __gmp_c; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_neg) -#if ! defined (__GMP_FORCE_mpn_neg) -__GMP_EXTERN_INLINE -#endif -mp_limb_t -mpn_neg (mp_ptr __gmp_rp, mp_srcptr __gmp_up, mp_size_t __gmp_n) -{ - mp_limb_t __gmp_ul, __gmp_cy; - __gmp_cy = 0; - do { - __gmp_ul = *__gmp_up++; - *__gmp_rp++ = -__gmp_ul - __gmp_cy; - __gmp_cy |= __gmp_ul != 0; - } while (--__gmp_n != 0); - return __gmp_cy; -} -#endif - -#if defined (__cplusplus) -} -#endif - - -/* Allow faster testing for negative, zero, and positive. */ -#define mpz_sgn(Z) ((Z)->_mp_size < 0 ? -1 : (Z)->_mp_size > 0) -#define mpf_sgn(F) ((F)->_mp_size < 0 ? -1 : (F)->_mp_size > 0) -#define mpq_sgn(Q) ((Q)->_mp_num._mp_size < 0 ? -1 : (Q)->_mp_num._mp_size > 0) - -/* When using GCC, optimize certain common comparisons. */ -#if defined (__GNUC__) && __GNUC__ >= 2 -#define mpz_cmp_ui(Z,UI) \ - (__builtin_constant_p (UI) && (UI) == 0 \ - ? mpz_sgn (Z) : _mpz_cmp_ui (Z,UI)) -#define mpz_cmp_si(Z,SI) \ - (__builtin_constant_p (SI) && (SI) == 0 ? mpz_sgn (Z) \ - : __builtin_constant_p (SI) && (SI) > 0 \ - ? _mpz_cmp_ui (Z, __GMP_CAST (unsigned long int, SI)) \ - : _mpz_cmp_si (Z,SI)) -#define mpq_cmp_ui(Q,NUI,DUI) \ - (__builtin_constant_p (NUI) && (NUI) == 0 \ - ? mpq_sgn (Q) : _mpq_cmp_ui (Q,NUI,DUI)) -#define mpq_cmp_si(q,n,d) \ - (__builtin_constant_p ((n) >= 0) && (n) >= 0 \ - ? mpq_cmp_ui (q, __GMP_CAST (unsigned long, n), d) \ - : _mpq_cmp_si (q, n, d)) -#else -#define mpz_cmp_ui(Z,UI) _mpz_cmp_ui (Z,UI) -#define mpz_cmp_si(Z,UI) _mpz_cmp_si (Z,UI) -#define mpq_cmp_ui(Q,NUI,DUI) _mpq_cmp_ui (Q,NUI,DUI) -#define mpq_cmp_si(q,n,d) _mpq_cmp_si(q,n,d) -#endif - - -/* Using "&" rather than "&&" means these can come out branch-free. Every - mpz_t has at least one limb allocated, so fetching the low limb is always - allowed. */ -#define mpz_odd_p(z) (((z)->_mp_size != 0) & __GMP_CAST (int, (z)->_mp_d[0])) -#define mpz_even_p(z) (! mpz_odd_p (z)) - - -/**************** C++ routines ****************/ - -#ifdef __cplusplus -__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpz_srcptr); -__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpq_srcptr); -__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpf_srcptr); -__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpz_ptr); -__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpq_ptr); -__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpf_ptr); -#endif - - -/* Source-level compatibility with GMP 2 and earlier. */ -#define mpn_divmod(qp,np,nsize,dp,dsize) \ - mpn_divrem (qp, __GMP_CAST (mp_size_t, 0), np, nsize, dp, dsize) - -/* Source-level compatibility with GMP 1. */ -#define mpz_mdiv mpz_fdiv_q -#define mpz_mdivmod mpz_fdiv_qr -#define mpz_mmod mpz_fdiv_r -#define mpz_mdiv_ui mpz_fdiv_q_ui -#define mpz_mdivmod_ui(q,r,n,d) \ - (((r) == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d)) -#define mpz_mmod_ui(r,n,d) \ - (((r) == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d)) - -/* Useful synonyms, but not quite compatible with GMP 1. */ -#define mpz_div mpz_fdiv_q -#define mpz_divmod mpz_fdiv_qr -#define mpz_div_ui mpz_fdiv_q_ui -#define mpz_divmod_ui mpz_fdiv_qr_ui -#define mpz_div_2exp mpz_fdiv_q_2exp -#define mpz_mod_2exp mpz_fdiv_r_2exp - -enum -{ - GMP_ERROR_NONE = 0, - GMP_ERROR_UNSUPPORTED_ARGUMENT = 1, - GMP_ERROR_DIVISION_BY_ZERO = 2, - GMP_ERROR_SQRT_OF_NEGATIVE = 4, - GMP_ERROR_INVALID_ARGUMENT = 8 -}; - -/* Define CC and CFLAGS which were used to build this version of GMP */ -#define __GMP_CC "gcc -std=gnu99" -#define __GMP_CFLAGS "-m32 -O2 -pedantic -fomit-frame-pointer -mtune=pentiumpro -march=pentiumpro" - -/* Major version number is the value of __GNU_MP__ too, above and in mp.h. */ -#define __GNU_MP_VERSION 5 -#define __GNU_MP_VERSION_MINOR 0 -#define __GNU_MP_VERSION_PATCHLEVEL 1 -#define __GMP_MP_RELEASE (__GNU_MP_VERSION * 10000 + __GNU_MP_VERSION_MINOR * 100 + __GNU_MP_VERSION_PATCHLEVEL) - -#define __GMP_H__ -#endif /* __GMP_H__ */ diff --git a/misc/builddeps/dp.linux32/include/jconfig.h b/misc/builddeps/dp.linux32/include/jconfig.h deleted file mode 100644 index 966b1d51..00000000 --- a/misc/builddeps/dp.linux32/include/jconfig.h +++ /dev/null @@ -1,54 +0,0 @@ -/* jconfig.h. Generated from jconfig.cfg by configure. */ -/* jconfig.cfg --- source file edited by configure script */ -/* see jconfig.txt for explanations */ - -#define HAVE_PROTOTYPES 1 -#define HAVE_UNSIGNED_CHAR 1 -#define HAVE_UNSIGNED_SHORT 1 -/* #undef void */ -/* #undef const */ -/* #undef CHAR_IS_UNSIGNED */ -#define HAVE_STDDEF_H 1 -#define HAVE_STDLIB_H 1 -#define HAVE_LOCALE_H 1 -/* #undef NEED_BSD_STRINGS */ -/* #undef NEED_SYS_TYPES_H */ -/* #undef NEED_FAR_POINTERS */ -/* #undef NEED_SHORT_EXTERNAL_NAMES */ -/* Define this if you get warnings about undefined structures. */ -/* #undef INCOMPLETE_TYPES_BROKEN */ - -/* Define "boolean" as unsigned char, not int, on Windows systems. */ -#ifdef _WIN32 -#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ -typedef unsigned char boolean; -#endif -#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ -#endif - -#ifdef JPEG_INTERNALS - -/* #undef RIGHT_SHIFT_IS_UNSIGNED */ -#define INLINE __inline__ -/* These are for configuring the JPEG memory manager. */ -/* #undef DEFAULT_MAX_MEM */ -/* #undef NO_MKTEMP */ - -#endif /* JPEG_INTERNALS */ - -#ifdef JPEG_CJPEG_DJPEG - -#define BMP_SUPPORTED /* BMP image file format */ -#define GIF_SUPPORTED /* GIF image file format */ -#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ -/* #undef RLE_SUPPORTED */ -#define TARGA_SUPPORTED /* Targa image file format */ - -/* #undef TWO_FILE_COMMANDLINE */ -/* #undef NEED_SIGNAL_CATCHER */ -/* #undef DONT_USE_B_MODE */ - -/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ -/* #undef PROGRESS_REPORT */ - -#endif /* JPEG_CJPEG_DJPEG */ diff --git a/misc/builddeps/dp.linux32/include/jerror.h b/misc/builddeps/dp.linux32/include/jerror.h deleted file mode 100644 index 1cfb2b19..00000000 --- a/misc/builddeps/dp.linux32/include/jerror.h +++ /dev/null @@ -1,304 +0,0 @@ -/* - * jerror.h - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * Modified 1997-2009 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the error and message codes for the JPEG library. - * Edit this file to add new codes, or to translate the message strings to - * some other language. - * A set of error-reporting macros are defined too. Some applications using - * the JPEG library may wish to include this file to get the error codes - * and/or the macros. - */ - -/* - * To define the enum list of message codes, include this file without - * defining macro JMESSAGE. To create a message string table, include it - * again with a suitable JMESSAGE definition (see jerror.c for an example). - */ -#ifndef JMESSAGE -#ifndef JERROR_H -/* First time through, define the enum list */ -#define JMAKE_ENUM_LIST -#else -/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ -#define JMESSAGE(code,string) -#endif /* JERROR_H */ -#endif /* JMESSAGE */ - -#ifdef JMAKE_ENUM_LIST - -typedef enum { - -#define JMESSAGE(code,string) code , - -#endif /* JMAKE_ENUM_LIST */ - -JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ - -/* For maintenance convenience, list is alphabetical by message code name */ -JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") -JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") -JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") -JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") -JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request") -JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") -JMESSAGE(JERR_BAD_DCTSIZE, "DCT scaled block size %dx%d not supported") -JMESSAGE(JERR_BAD_DROP_SAMPLING, - "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c") -JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") -JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") -JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") -JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") -JMESSAGE(JERR_BAD_LIB_VERSION, - "Wrong JPEG library version: library is %d, caller expects %d") -JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") -JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") -JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") -JMESSAGE(JERR_BAD_PROGRESSION, - "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") -JMESSAGE(JERR_BAD_PROG_SCRIPT, - "Invalid progressive parameters at scan script entry %d") -JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") -JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") -JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") -JMESSAGE(JERR_BAD_STRUCT_SIZE, - "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") -JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") -JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") -JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") -JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") -JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") -JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") -JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") -JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") -JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") -JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") -JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") -JMESSAGE(JERR_EMS_READ, "Read from EMS failed") -JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") -JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") -JMESSAGE(JERR_FILE_READ, "Input file read error") -JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") -JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") -JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") -JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") -JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") -JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") -JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") -JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, - "Cannot transcode due to multiple use of quantization table %d") -JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") -JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") -JMESSAGE(JERR_NOTIMPL, "Not implemented yet") -JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") -JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined") -JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") -JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") -JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") -JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") -JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") -JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") -JMESSAGE(JERR_QUANT_COMPONENTS, - "Cannot quantize more than %d color components") -JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") -JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") -JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") -JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") -JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") -JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") -JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF") -JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") -JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") -JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") -JMESSAGE(JERR_TFILE_WRITE, - "Write failed on temporary file --- out of disk space?") -JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") -JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") -JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") -JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") -JMESSAGE(JERR_XMS_READ, "Read from XMS failed") -JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") -JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) -JMESSAGE(JMSG_VERSION, JVERSION) -JMESSAGE(JTRC_16BIT_TABLES, - "Caution: quantization tables are too coarse for baseline JPEG") -JMESSAGE(JTRC_ADOBE, - "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") -JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") -JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") -JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") -JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") -JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") -JMESSAGE(JTRC_DRI, "Define Restart Interval %u") -JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") -JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") -JMESSAGE(JTRC_EOI, "End Of Image") -JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") -JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") -JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, - "Warning: thumbnail image size does not match data length %u") -JMESSAGE(JTRC_JFIF_EXTENSION, - "JFIF extension marker: type 0x%02x, length %u") -JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") -JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") -JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") -JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") -JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") -JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") -JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") -JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") -JMESSAGE(JTRC_RST, "RST%d") -JMESSAGE(JTRC_SMOOTH_NOTIMPL, - "Smoothing not supported with nonstandard sampling ratios") -JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") -JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") -JMESSAGE(JTRC_SOI, "Start of Image") -JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") -JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") -JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") -JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") -JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") -JMESSAGE(JTRC_THUMB_JPEG, - "JFIF extension marker: JPEG-compressed thumbnail image, length %u") -JMESSAGE(JTRC_THUMB_PALETTE, - "JFIF extension marker: palette thumbnail image, length %u") -JMESSAGE(JTRC_THUMB_RGB, - "JFIF extension marker: RGB thumbnail image, length %u") -JMESSAGE(JTRC_UNKNOWN_IDS, - "Unrecognized component IDs %d %d %d, assuming YCbCr") -JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") -JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") -JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") -JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code") -JMESSAGE(JWRN_BOGUS_PROGRESSION, - "Inconsistent progression sequence for component %d coefficient %d") -JMESSAGE(JWRN_EXTRANEOUS_DATA, - "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") -JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") -JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") -JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") -JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") -JMESSAGE(JWRN_MUST_RESYNC, - "Corrupt JPEG data: found marker 0x%02x instead of RST%d") -JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") -JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") - -#ifdef JMAKE_ENUM_LIST - - JMSG_LASTMSGCODE -} J_MESSAGE_CODE; - -#undef JMAKE_ENUM_LIST -#endif /* JMAKE_ENUM_LIST */ - -/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ -#undef JMESSAGE - - -#ifndef JERROR_H -#define JERROR_H - -/* Macros to simplify using the error and trace message stuff */ -/* The first parameter is either type of cinfo pointer */ - -/* Fatal errors (print message and exit) */ -#define ERREXIT(cinfo,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT1(cinfo,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT2(cinfo,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT3(cinfo,code,p1,p2,p3) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (cinfo)->err->msg_parm.i[3] = (p4), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (cinfo)->err->msg_parm.i[3] = (p4), \ - (cinfo)->err->msg_parm.i[4] = (p5), \ - (cinfo)->err->msg_parm.i[5] = (p6), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXITS(cinfo,code,str) \ - ((cinfo)->err->msg_code = (code), \ - strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) - -#define MAKESTMT(stuff) do { stuff } while (0) - -/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ -#define WARNMS(cinfo,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) -#define WARNMS1(cinfo,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) -#define WARNMS2(cinfo,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) - -/* Informational/debugging messages */ -#define TRACEMS(cinfo,lvl,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS1(cinfo,lvl,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS2(cinfo,lvl,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - _mp[4] = (p5); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMSS(cinfo,lvl,code,str) \ - ((cinfo)->err->msg_code = (code), \ - strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) - -#endif /* JERROR_H */ diff --git a/misc/builddeps/dp.linux32/include/jmorecfg.h b/misc/builddeps/dp.linux32/include/jmorecfg.h deleted file mode 100644 index 928d052c..00000000 --- a/misc/builddeps/dp.linux32/include/jmorecfg.h +++ /dev/null @@ -1,371 +0,0 @@ -/* - * jmorecfg.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 1997-2009 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains additional configuration options that customize the - * JPEG software for special applications or support machine-dependent - * optimizations. Most users will not need to touch this file. - */ - - -/* - * Define BITS_IN_JSAMPLE as either - * 8 for 8-bit sample values (the usual setting) - * 12 for 12-bit sample values - * Only 8 and 12 are legal data precisions for lossy JPEG according to the - * JPEG standard, and the IJG code does not support anything else! - * We do not support run-time selection of data precision, sorry. - */ - -#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ - - -/* - * Maximum number of components (color channels) allowed in JPEG image. - * To meet the letter of the JPEG spec, set this to 255. However, darn - * few applications need more than 4 channels (maybe 5 for CMYK + alpha - * mask). We recommend 10 as a reasonable compromise; use 4 if you are - * really short on memory. (Each allowed component costs a hundred or so - * bytes of storage, whether actually used in an image or not.) - */ - -#define MAX_COMPONENTS 10 /* maximum number of image components */ - - -/* - * Basic data types. - * You may need to change these if you have a machine with unusual data - * type sizes; for example, "char" not 8 bits, "short" not 16 bits, - * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, - * but it had better be at least 16. - */ - -/* Representation of a single sample (pixel element value). - * We frequently allocate large arrays of these, so it's important to keep - * them small. But if you have memory to burn and access to char or short - * arrays is very slow on your hardware, you might want to change these. - */ - -#if BITS_IN_JSAMPLE == 8 -/* JSAMPLE should be the smallest type that will hold the values 0..255. - * You can use a signed char by having GETJSAMPLE mask it with 0xFF. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JSAMPLE; -#ifdef CHAR_IS_UNSIGNED -#define GETJSAMPLE(value) ((int) (value)) -#else -#define GETJSAMPLE(value) ((int) (value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - -#define MAXJSAMPLE 255 -#define CENTERJSAMPLE 128 - -#endif /* BITS_IN_JSAMPLE == 8 */ - - -#if BITS_IN_JSAMPLE == 12 -/* JSAMPLE should be the smallest type that will hold the values 0..4095. - * On nearly all machines "short" will do nicely. - */ - -typedef short JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#define MAXJSAMPLE 4095 -#define CENTERJSAMPLE 2048 - -#endif /* BITS_IN_JSAMPLE == 12 */ - - -/* Representation of a DCT frequency coefficient. - * This should be a signed value of at least 16 bits; "short" is usually OK. - * Again, we allocate large arrays of these, but you can change to int - * if you have memory to burn and "short" is really slow. - */ - -typedef short JCOEF; - - -/* Compressed datastreams are represented as arrays of JOCTET. - * These must be EXACTLY 8 bits wide, at least once they are written to - * external storage. Note that when using the stdio data source/destination - * managers, this is also the data type passed to fread/fwrite. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JOCTET; -#define GETJOCTET(value) (value) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JOCTET; -#ifdef CHAR_IS_UNSIGNED -#define GETJOCTET(value) (value) -#else -#define GETJOCTET(value) ((value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - - -/* These typedefs are used for various table entries and so forth. - * They must be at least as wide as specified; but making them too big - * won't cost a huge amount of memory, so we don't provide special - * extraction code like we did for JSAMPLE. (In other words, these - * typedefs live at a different point on the speed/space tradeoff curve.) - */ - -/* UINT8 must hold at least the values 0..255. */ - -#ifdef HAVE_UNSIGNED_CHAR -typedef unsigned char UINT8; -#else /* not HAVE_UNSIGNED_CHAR */ -#ifdef CHAR_IS_UNSIGNED -typedef char UINT8; -#else /* not CHAR_IS_UNSIGNED */ -typedef short UINT8; -#endif /* CHAR_IS_UNSIGNED */ -#endif /* HAVE_UNSIGNED_CHAR */ - -/* UINT16 must hold at least the values 0..65535. */ - -#ifdef HAVE_UNSIGNED_SHORT -typedef unsigned short UINT16; -#else /* not HAVE_UNSIGNED_SHORT */ -typedef unsigned int UINT16; -#endif /* HAVE_UNSIGNED_SHORT */ - -/* INT16 must hold at least the values -32768..32767. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ -typedef short INT16; -#endif - -/* INT32 must hold at least signed 32-bit values. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ -#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ -#ifndef _BASETSD_H /* MinGW is slightly different */ -#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ -typedef long INT32; -#endif -#endif -#endif -#endif - -/* Datatype used for image dimensions. The JPEG standard only supports - * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore - * "unsigned int" is sufficient on all machines. However, if you need to - * handle larger images and you don't mind deviating from the spec, you - * can change this datatype. - */ - -typedef unsigned int JDIMENSION; - -#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ - - -/* These macros are used in all function definitions and extern declarations. - * You could modify them if you need to change function linkage conventions; - * in particular, you'll need to do that to make the library a Windows DLL. - * Another application is to make all functions global for use with debuggers - * or code profilers that require it. - */ - -/* a function called through method pointers: */ -#define METHODDEF(type) static type -/* a function used only in its module: */ -#define LOCAL(type) static type -/* a function referenced thru EXTERNs: */ -#define GLOBAL(type) type -/* a reference to a GLOBAL function: */ -#define EXTERN(type) extern type - - -/* This macro is used to declare a "method", that is, a function pointer. - * We want to supply prototype parameters if the compiler can cope. - * Note that the arglist parameter must be parenthesized! - * Again, you can customize this if you need special linkage keywords. - */ - -#ifdef HAVE_PROTOTYPES -#define JMETHOD(type,methodname,arglist) type (*methodname) arglist -#else -#define JMETHOD(type,methodname,arglist) type (*methodname) () -#endif - - -/* Here is the pseudo-keyword for declaring pointers that must be "far" - * on 80x86 machines. Most of the specialized coding for 80x86 is handled - * by just saying "FAR *" where such a pointer is needed. In a few places - * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. - */ - -#ifndef FAR -#ifdef NEED_FAR_POINTERS -#define FAR far -#else -#define FAR -#endif -#endif - - -/* - * On a few systems, type boolean and/or its values FALSE, TRUE may appear - * in standard header files. Or you may have conflicts with application- - * specific header files that you want to include together with these files. - * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. - */ - -#ifndef HAVE_BOOLEAN -typedef int boolean; -#endif -#ifndef FALSE /* in case these macros already exist */ -#define FALSE 0 /* values of boolean */ -#endif -#ifndef TRUE -#define TRUE 1 -#endif - - -/* - * The remaining options affect code selection within the JPEG library, - * but they don't need to be visible to most applications using the library. - * To minimize application namespace pollution, the symbols won't be - * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. - */ - -#ifdef JPEG_INTERNALS -#define JPEG_INTERNAL_OPTIONS -#endif - -#ifdef JPEG_INTERNAL_OPTIONS - - -/* - * These defines indicate whether to include various optional functions. - * Undefining some of these symbols will produce a smaller but less capable - * library. Note that you can leave certain source files out of the - * compilation/linking process if you've #undef'd the corresponding symbols. - * (You may HAVE to do that if your compiler doesn't like null source files.) - */ - -/* Capability options common to encoder and decoder: */ - -#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ -#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ -#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ - -/* Encoder capability options: */ - -#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/ -#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ -/* Note: if you selected 12-bit data precision, it is dangerous to turn off - * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit - * precision, so jchuff.c normally uses entropy optimization to compute - * usable tables for higher precision. If you don't want to do optimization, - * you'll have to supply different default Huffman tables. - * The exact same statements apply for progressive JPEG: the default tables - * don't work for progressive mode. (This may get fixed, however.) - */ -#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ - -/* Decoder capability options: */ - -#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ -#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ -#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ -#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ -#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ -#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ -#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ - -/* more capability options later, no doubt */ - - -/* - * Ordering of RGB data in scanlines passed to or from the application. - * If your application wants to deal with data in the order B,G,R, just - * change these macros. You can also deal with formats such as R,G,B,X - * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing - * the offsets will also change the order in which colormap data is organized. - * RESTRICTIONS: - * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. - * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not - * useful if you are using JPEG color spaces other than YCbCr or grayscale. - * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE - * is not 3 (they don't understand about dummy color components!). So you - * can't use color quantization if you change that value. - */ - -#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ -#define RGB_GREEN 1 /* Offset of Green */ -#define RGB_BLUE 2 /* Offset of Blue */ -#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ - - -/* Definitions for speed-related optimizations. */ - - -/* If your compiler supports inline functions, define INLINE - * as the inline keyword; otherwise define it as empty. - */ - -#ifndef INLINE -#ifdef __GNUC__ /* for instance, GNU C knows about inline */ -#define INLINE __inline__ -#endif -#ifndef INLINE -#define INLINE /* default is to define it as empty */ -#endif -#endif - - -/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying - * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER - * as short on such a machine. MULTIPLIER must be at least 16 bits wide. - */ - -#ifndef MULTIPLIER -#define MULTIPLIER int /* type for fastest integer multiply */ -#endif - - -/* FAST_FLOAT should be either float or double, whichever is done faster - * by your compiler. (Note that this type is only used in the floating point - * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) - * Typically, float is faster in ANSI C compilers, while double is faster in - * pre-ANSI compilers (because they insist on converting to double anyway). - * The code below therefore chooses float if we have ANSI-style prototypes. - */ - -#ifndef FAST_FLOAT -#ifdef HAVE_PROTOTYPES -#define FAST_FLOAT float -#else -#define FAST_FLOAT double -#endif -#endif - -#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/misc/builddeps/dp.linux32/include/jpeglib.h b/misc/builddeps/dp.linux32/include/jpeglib.h deleted file mode 100644 index 5039d4bf..00000000 --- a/misc/builddeps/dp.linux32/include/jpeglib.h +++ /dev/null @@ -1,1158 +0,0 @@ -/* - * jpeglib.h - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * Modified 2002-2009 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the application interface for the JPEG library. - * Most applications using the library need only include this file, - * and perhaps jerror.h if they want to know the exact error codes. - */ - -#ifndef JPEGLIB_H -#define JPEGLIB_H - -/* - * First we include the configuration files that record how this - * installation of the JPEG library is set up. jconfig.h can be - * generated automatically for many systems. jmorecfg.h contains - * manual configuration options that most people need not worry about. - */ - -#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ -#include "jconfig.h" /* widely used configuration options */ -#endif -#include "jmorecfg.h" /* seldom changed options */ - - -#ifdef __cplusplus -#ifndef DONT_USE_EXTERN_C -extern "C" { -#endif -#endif - -/* Version ID for the JPEG library. - * Might be useful for tests like "#if JPEG_LIB_VERSION >= 80". - */ - -#define JPEG_LIB_VERSION 80 /* Version 8.0 */ - - -/* Various constants determining the sizes of things. - * All of these are specified by the JPEG standard, so don't change them - * if you want to be compatible. - */ - -#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ -#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ -#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ -#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ -#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ -#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ -#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ -/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; - * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. - * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU - * to handle it. We even let you do this from the jconfig.h file. However, - * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe - * sometimes emits noncompliant files doesn't mean you should too. - */ -#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ -#ifndef D_MAX_BLOCKS_IN_MCU -#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ -#endif - - -/* Data structures for images (arrays of samples and of DCT coefficients). - * On 80x86 machines, the image arrays are too big for near pointers, - * but the pointer arrays can fit in near memory. - */ - -typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ -typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ -typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ - -typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ -typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ -typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ -typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ - -typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ - - -/* Types for JPEG compression parameters and working tables. */ - - -/* DCT coefficient quantization tables. */ - -typedef struct { - /* This array gives the coefficient quantizers in natural array order - * (not the zigzag order in which they are stored in a JPEG DQT marker). - * CAUTION: IJG versions prior to v6a kept this array in zigzag order. - */ - UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JQUANT_TBL; - - -/* Huffman coding tables. */ - -typedef struct { - /* These two fields directly represent the contents of a JPEG DHT marker */ - UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ - /* length k bits; bits[0] is unused */ - UINT8 huffval[256]; /* The symbols, in order of incr code length */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JHUFF_TBL; - - -/* Basic info about one component (color channel). */ - -typedef struct { - /* These values are fixed over the whole image. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOF marker. */ - int component_id; /* identifier for this component (0..255) */ - int component_index; /* its index in SOF or cinfo->comp_info[] */ - int h_samp_factor; /* horizontal sampling factor (1..4) */ - int v_samp_factor; /* vertical sampling factor (1..4) */ - int quant_tbl_no; /* quantization table selector (0..3) */ - /* These values may vary between scans. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOS marker. */ - /* The decompressor output side may not use these variables. */ - int dc_tbl_no; /* DC entropy table selector (0..3) */ - int ac_tbl_no; /* AC entropy table selector (0..3) */ - - /* Remaining fields should be treated as private by applications. */ - - /* These values are computed during compression or decompression startup: */ - /* Component's size in DCT blocks. - * Any dummy blocks added to complete an MCU are not counted; therefore - * these values do not depend on whether a scan is interleaved or not. - */ - JDIMENSION width_in_blocks; - JDIMENSION height_in_blocks; - /* Size of a DCT block in samples, - * reflecting any scaling we choose to apply during the DCT step. - * Values from 1 to 16 are supported. - * Note that different components may receive different DCT scalings. - */ - int DCT_h_scaled_size; - int DCT_v_scaled_size; - /* The downsampled dimensions are the component's actual, unpadded number - * of samples at the main buffer (preprocessing/compression interface); - * DCT scaling is included, so - * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE) - * and similarly for height. - */ - JDIMENSION downsampled_width; /* actual width in samples */ - JDIMENSION downsampled_height; /* actual height in samples */ - /* This flag is used only for decompression. In cases where some of the - * components will be ignored (eg grayscale output from YCbCr image), - * we can skip most computations for the unused components. - */ - boolean component_needed; /* do we need the value of this component? */ - - /* These values are computed before starting a scan of the component. */ - /* The decompressor output side may not use these variables. */ - int MCU_width; /* number of blocks per MCU, horizontally */ - int MCU_height; /* number of blocks per MCU, vertically */ - int MCU_blocks; /* MCU_width * MCU_height */ - int MCU_sample_width; /* MCU width in samples: MCU_width * DCT_h_scaled_size */ - int last_col_width; /* # of non-dummy blocks across in last MCU */ - int last_row_height; /* # of non-dummy blocks down in last MCU */ - - /* Saved quantization table for component; NULL if none yet saved. - * See jdinput.c comments about the need for this information. - * This field is currently used only for decompression. - */ - JQUANT_TBL * quant_table; - - /* Private per-component storage for DCT or IDCT subsystem. */ - void * dct_table; -} jpeg_component_info; - - -/* The script for encoding a multiple-scan file is an array of these: */ - -typedef struct { - int comps_in_scan; /* number of components encoded in this scan */ - int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ - int Ss, Se; /* progressive JPEG spectral selection parms */ - int Ah, Al; /* progressive JPEG successive approx. parms */ -} jpeg_scan_info; - -/* The decompressor can save APPn and COM markers in a list of these: */ - -typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; - -struct jpeg_marker_struct { - jpeg_saved_marker_ptr next; /* next in list, or NULL */ - UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ - unsigned int original_length; /* # bytes of data in the file */ - unsigned int data_length; /* # bytes of data saved at data[] */ - JOCTET FAR * data; /* the data contained in the marker */ - /* the marker length word is not counted in data_length or original_length */ -}; - -/* Known color spaces. */ - -typedef enum { - JCS_UNKNOWN, /* error/unspecified */ - JCS_GRAYSCALE, /* monochrome */ - JCS_RGB, /* red/green/blue */ - JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ - JCS_CMYK, /* C/M/Y/K */ - JCS_YCCK /* Y/Cb/Cr/K */ -} J_COLOR_SPACE; - -/* DCT/IDCT algorithm options. */ - -typedef enum { - JDCT_ISLOW, /* slow but accurate integer algorithm */ - JDCT_IFAST, /* faster, less accurate integer method */ - JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ -} J_DCT_METHOD; - -#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ -#define JDCT_DEFAULT JDCT_ISLOW -#endif -#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ -#define JDCT_FASTEST JDCT_IFAST -#endif - -/* Dithering options for decompression. */ - -typedef enum { - JDITHER_NONE, /* no dithering */ - JDITHER_ORDERED, /* simple ordered dither */ - JDITHER_FS /* Floyd-Steinberg error diffusion dither */ -} J_DITHER_MODE; - - -/* Common fields between JPEG compression and decompression master structs. */ - -#define jpeg_common_fields \ - struct jpeg_error_mgr * err; /* Error handler module */\ - struct jpeg_memory_mgr * mem; /* Memory manager module */\ - struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ - void * client_data; /* Available for use by application */\ - boolean is_decompressor; /* So common code can tell which is which */\ - int global_state /* For checking call sequence validity */ - -/* Routines that are to be used by both halves of the library are declared - * to receive a pointer to this structure. There are no actual instances of - * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. - */ -struct jpeg_common_struct { - jpeg_common_fields; /* Fields common to both master struct types */ - /* Additional fields follow in an actual jpeg_compress_struct or - * jpeg_decompress_struct. All three structs must agree on these - * initial fields! (This would be a lot cleaner in C++.) - */ -}; - -typedef struct jpeg_common_struct * j_common_ptr; -typedef struct jpeg_compress_struct * j_compress_ptr; -typedef struct jpeg_decompress_struct * j_decompress_ptr; - - -/* Master record for a compression instance */ - -struct jpeg_compress_struct { - jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ - - /* Destination for compressed data */ - struct jpeg_destination_mgr * dest; - - /* Description of source image --- these fields must be filled in by - * outer application before starting compression. in_color_space must - * be correct before you can even call jpeg_set_defaults(). - */ - - JDIMENSION image_width; /* input image width */ - JDIMENSION image_height; /* input image height */ - int input_components; /* # of color components in input image */ - J_COLOR_SPACE in_color_space; /* colorspace of input image */ - - double input_gamma; /* image gamma of input image */ - - /* Compression parameters --- these fields must be set before calling - * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to - * initialize everything to reasonable defaults, then changing anything - * the application specifically wants to change. That way you won't get - * burnt when new parameters are added. Also note that there are several - * helper routines to simplify changing parameters. - */ - - unsigned int scale_num, scale_denom; /* fraction by which to scale image */ - - JDIMENSION jpeg_width; /* scaled JPEG image width */ - JDIMENSION jpeg_height; /* scaled JPEG image height */ - /* Dimensions of actual JPEG image that will be written to file, - * derived from input dimensions by scaling factors above. - * These fields are computed by jpeg_start_compress(). - * You can also use jpeg_calc_jpeg_dimensions() to determine these values - * in advance of calling jpeg_start_compress(). - */ - - int data_precision; /* bits of precision in image data */ - - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - int q_scale_factor[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined, - * and corresponding scale factors (percentage, initialized 100). - */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - int num_scans; /* # of entries in scan_info array */ - const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ - /* The default value of scan_info is NULL, which causes a single-scan - * sequential JPEG file to be emitted. To create a multi-scan file, - * set num_scans and scan_info to point to an array of scan definitions. - */ - - boolean raw_data_in; /* TRUE=caller supplies downsampled data */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - boolean do_fancy_downsampling; /* TRUE=apply fancy downsampling */ - int smoothing_factor; /* 1..100, or 0 for no input smoothing */ - J_DCT_METHOD dct_method; /* DCT algorithm selector */ - - /* The restart interval can be specified in absolute MCUs by setting - * restart_interval, or in MCU rows by setting restart_in_rows - * (in which case the correct restart_interval will be figured - * for each scan). - */ - unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ - int restart_in_rows; /* if > 0, MCU rows per restart interval */ - - /* Parameters controlling emission of special markers. */ - - boolean write_JFIF_header; /* should a JFIF marker be written? */ - UINT8 JFIF_major_version; /* What to write for the JFIF version number */ - UINT8 JFIF_minor_version; - /* These three values are not used by the JPEG code, merely copied */ - /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ - /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ - /* ratio is defined by X_density/Y_density even when density_unit=0. */ - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean write_Adobe_marker; /* should an Adobe marker be written? */ - - /* State variable: index of next scanline to be written to - * jpeg_write_scanlines(). Application may use this to control its - * processing loop, e.g., "while (next_scanline < image_height)". - */ - - JDIMENSION next_scanline; /* 0 .. image_height-1 */ - - /* Remaining fields are known throughout compressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during compression startup - */ - boolean progressive_mode; /* TRUE if scan script uses progressive mode */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ - int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ - /* The coefficient controller receives data in units of MCU rows as defined - * for fully interleaved scans (whether the JPEG file is interleaved or not). - * There are v_samp_factor * DCTSIZE sample rows of each component in an - * "iMCU" (interleaved MCU) row. - */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[C_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - int block_size; /* the basic DCT block size: 1..16 */ - const int * natural_order; /* natural-order position array */ - int lim_Se; /* min( Se, DCTSIZE2-1 ) */ - - /* - * Links to compression subobjects (methods and private variables of modules) - */ - struct jpeg_comp_master * master; - struct jpeg_c_main_controller * main; - struct jpeg_c_prep_controller * prep; - struct jpeg_c_coef_controller * coef; - struct jpeg_marker_writer * marker; - struct jpeg_color_converter * cconvert; - struct jpeg_downsampler * downsample; - struct jpeg_forward_dct * fdct; - struct jpeg_entropy_encoder * entropy; - jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ - int script_space_size; -}; - - -/* Master record for a decompression instance */ - -struct jpeg_decompress_struct { - jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ - - /* Source of compressed data */ - struct jpeg_source_mgr * src; - - /* Basic description of image --- filled in by jpeg_read_header(). */ - /* Application may inspect these values to decide how to process image. */ - - JDIMENSION image_width; /* nominal image width (from SOF marker) */ - JDIMENSION image_height; /* nominal image height */ - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - /* Decompression processing parameters --- these fields must be set before - * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes - * them to default values. - */ - - J_COLOR_SPACE out_color_space; /* colorspace for output */ - - unsigned int scale_num, scale_denom; /* fraction by which to scale image */ - - double output_gamma; /* image gamma wanted in output */ - - boolean buffered_image; /* TRUE=multiple output passes */ - boolean raw_data_out; /* TRUE=downsampled data wanted */ - - J_DCT_METHOD dct_method; /* IDCT algorithm selector */ - boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ - boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ - - boolean quantize_colors; /* TRUE=colormapped output wanted */ - /* the following are ignored if not quantize_colors: */ - J_DITHER_MODE dither_mode; /* type of color dithering to use */ - boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ - int desired_number_of_colors; /* max # colors to use in created colormap */ - /* these are significant only in buffered-image mode: */ - boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ - boolean enable_external_quant;/* enable future use of external colormap */ - boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ - - /* Description of actual output image that will be returned to application. - * These fields are computed by jpeg_start_decompress(). - * You can also use jpeg_calc_output_dimensions() to determine these values - * in advance of calling jpeg_start_decompress(). - */ - - JDIMENSION output_width; /* scaled image width */ - JDIMENSION output_height; /* scaled image height */ - int out_color_components; /* # of color components in out_color_space */ - int output_components; /* # of color components returned */ - /* output_components is 1 (a colormap index) when quantizing colors; - * otherwise it equals out_color_components. - */ - int rec_outbuf_height; /* min recommended height of scanline buffer */ - /* If the buffer passed to jpeg_read_scanlines() is less than this many rows - * high, space and time will be wasted due to unnecessary data copying. - * Usually rec_outbuf_height will be 1 or 2, at most 4. - */ - - /* When quantizing colors, the output colormap is described by these fields. - * The application can supply a colormap by setting colormap non-NULL before - * calling jpeg_start_decompress; otherwise a colormap is created during - * jpeg_start_decompress or jpeg_start_output. - * The map has out_color_components rows and actual_number_of_colors columns. - */ - int actual_number_of_colors; /* number of entries in use */ - JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ - - /* State variables: these variables indicate the progress of decompression. - * The application may examine these but must not modify them. - */ - - /* Row index of next scanline to be read from jpeg_read_scanlines(). - * Application may use this to control its processing loop, e.g., - * "while (output_scanline < output_height)". - */ - JDIMENSION output_scanline; /* 0 .. output_height-1 */ - - /* Current input scan number and number of iMCU rows completed in scan. - * These indicate the progress of the decompressor input side. - */ - int input_scan_number; /* Number of SOS markers seen so far */ - JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ - - /* The "output scan number" is the notional scan being displayed by the - * output side. The decompressor will not allow output scan/row number - * to get ahead of input scan/row, but it can fall arbitrarily far behind. - */ - int output_scan_number; /* Nominal scan number being displayed */ - JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ - - /* Current progression status. coef_bits[c][i] indicates the precision - * with which component c's DCT coefficient i (in zigzag order) is known. - * It is -1 when no data has yet been received, otherwise it is the point - * transform (shift) value for the most recent scan of the coefficient - * (thus, 0 at completion of the progression). - * This pointer is NULL when reading a non-progressive file. - */ - int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ - - /* Internal JPEG parameters --- the application usually need not look at - * these fields. Note that the decompressor output side may not use - * any parameters that can change between scans. - */ - - /* Quantization and Huffman tables are carried forward across input - * datastreams when processing abbreviated JPEG datastreams. - */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - /* These parameters are never carried across datastreams, since they - * are given in SOF/SOS markers or defined to be reset by SOI. - */ - - int data_precision; /* bits of precision in image data */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - boolean is_baseline; /* TRUE if Baseline SOF0 encountered */ - boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ - - /* These fields record data obtained from optional markers recognized by - * the JPEG library. - */ - boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ - /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ - UINT8 JFIF_major_version; /* JFIF version number */ - UINT8 JFIF_minor_version; - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ - UINT8 Adobe_transform; /* Color transform code from Adobe marker */ - - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - - /* Aside from the specific data retained from APPn markers known to the - * library, the uninterpreted contents of any or all APPn and COM markers - * can be saved in a list for examination by the application. - */ - jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ - - /* Remaining fields are known throughout decompressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during decompression startup - */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ - int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ - /* The coefficient controller's input and output progress is measured in - * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows - * in fully interleaved JPEG scans, but are used whether the scan is - * interleaved or not. We define an iMCU row as v_samp_factor DCT block - * rows of each component. Therefore, the IDCT output contains - * v_samp_factor*DCT_v_scaled_size sample rows of a component per iMCU row. - */ - - JSAMPLE * sample_range_limit; /* table for fast range-limiting */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - * Note that the decompressor output side must not use these fields. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[D_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - /* These fields are derived from Se of first SOS marker. - */ - int block_size; /* the basic DCT block size: 1..16 */ - const int * natural_order; /* natural-order position array for entropy decode */ - int lim_Se; /* min( Se, DCTSIZE2-1 ) for entropy decode */ - - /* This field is shared between entropy decoder and marker parser. - * It is either zero or the code of a JPEG marker that has been - * read from the data source, but has not yet been processed. - */ - int unread_marker; - - /* - * Links to decompression subobjects (methods, private variables of modules) - */ - struct jpeg_decomp_master * master; - struct jpeg_d_main_controller * main; - struct jpeg_d_coef_controller * coef; - struct jpeg_d_post_controller * post; - struct jpeg_input_controller * inputctl; - struct jpeg_marker_reader * marker; - struct jpeg_entropy_decoder * entropy; - struct jpeg_inverse_dct * idct; - struct jpeg_upsampler * upsample; - struct jpeg_color_deconverter * cconvert; - struct jpeg_color_quantizer * cquantize; -}; - - -/* "Object" declarations for JPEG modules that may be supplied or called - * directly by the surrounding application. - * As with all objects in the JPEG library, these structs only define the - * publicly visible methods and state variables of a module. Additional - * private fields may exist after the public ones. - */ - - -/* Error handler object */ - -struct jpeg_error_mgr { - /* Error exit handler: does not return to caller */ - JMETHOD(void, error_exit, (j_common_ptr cinfo)); - /* Conditionally emit a trace or warning message */ - JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); - /* Routine that actually outputs a trace or error message */ - JMETHOD(void, output_message, (j_common_ptr cinfo)); - /* Format a message string for the most recent JPEG error or message */ - JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); -#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ - /* Reset error state variables at start of a new image */ - JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); - - /* The message ID code and any parameters are saved here. - * A message can have one string parameter or up to 8 int parameters. - */ - int msg_code; -#define JMSG_STR_PARM_MAX 80 - union { - int i[8]; - char s[JMSG_STR_PARM_MAX]; - } msg_parm; - - /* Standard state variables for error facility */ - - int trace_level; /* max msg_level that will be displayed */ - - /* For recoverable corrupt-data errors, we emit a warning message, - * but keep going unless emit_message chooses to abort. emit_message - * should count warnings in num_warnings. The surrounding application - * can check for bad data by seeing if num_warnings is nonzero at the - * end of processing. - */ - long num_warnings; /* number of corrupt-data warnings */ - - /* These fields point to the table(s) of error message strings. - * An application can change the table pointer to switch to a different - * message list (typically, to change the language in which errors are - * reported). Some applications may wish to add additional error codes - * that will be handled by the JPEG library error mechanism; the second - * table pointer is used for this purpose. - * - * First table includes all errors generated by JPEG library itself. - * Error code 0 is reserved for a "no such error string" message. - */ - const char * const * jpeg_message_table; /* Library errors */ - int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ - /* Second table can be added by application (see cjpeg/djpeg for example). - * It contains strings numbered first_addon_message..last_addon_message. - */ - const char * const * addon_message_table; /* Non-library errors */ - int first_addon_message; /* code for first string in addon table */ - int last_addon_message; /* code for last string in addon table */ -}; - - -/* Progress monitor object */ - -struct jpeg_progress_mgr { - JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); - - long pass_counter; /* work units completed in this pass */ - long pass_limit; /* total number of work units in this pass */ - int completed_passes; /* passes completed so far */ - int total_passes; /* total number of passes expected */ -}; - - -/* Data destination object for compression */ - -struct jpeg_destination_mgr { - JOCTET * next_output_byte; /* => next byte to write in buffer */ - size_t free_in_buffer; /* # of byte spaces remaining in buffer */ - - JMETHOD(void, init_destination, (j_compress_ptr cinfo)); - JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); - JMETHOD(void, term_destination, (j_compress_ptr cinfo)); -}; - - -/* Data source object for decompression */ - -struct jpeg_source_mgr { - const JOCTET * next_input_byte; /* => next byte to read from buffer */ - size_t bytes_in_buffer; /* # of bytes remaining in buffer */ - - JMETHOD(void, init_source, (j_decompress_ptr cinfo)); - JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); - JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); - JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); - JMETHOD(void, term_source, (j_decompress_ptr cinfo)); -}; - - -/* Memory manager object. - * Allocates "small" objects (a few K total), "large" objects (tens of K), - * and "really big" objects (virtual arrays with backing store if needed). - * The memory manager does not allow individual objects to be freed; rather, - * each created object is assigned to a pool, and whole pools can be freed - * at once. This is faster and more convenient than remembering exactly what - * to free, especially where malloc()/free() are not too speedy. - * NB: alloc routines never return NULL. They exit to error_exit if not - * successful. - */ - -#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ -#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ -#define JPOOL_NUMPOOLS 2 - -typedef struct jvirt_sarray_control * jvirt_sarray_ptr; -typedef struct jvirt_barray_control * jvirt_barray_ptr; - - -struct jpeg_memory_mgr { - /* Method pointers */ - JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, - JDIMENSION samplesperrow, - JDIMENSION numrows)); - JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, - JDIMENSION blocksperrow, - JDIMENSION numrows)); - JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION samplesperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION blocksperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); - JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, - jvirt_sarray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, - jvirt_barray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); - JMETHOD(void, self_destruct, (j_common_ptr cinfo)); - - /* Limit on memory allocation for this JPEG object. (Note that this is - * merely advisory, not a guaranteed maximum; it only affects the space - * used for virtual-array buffers.) May be changed by outer application - * after creating the JPEG object. - */ - long max_memory_to_use; - - /* Maximum allocation request accepted by alloc_large. */ - long max_alloc_chunk; -}; - - -/* Routine signature for application-supplied marker processing methods. - * Need not pass marker code since it is stored in cinfo->unread_marker. - */ -typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); - - -/* Declarations for routines called by application. - * The JPP macro hides prototype parameters from compilers that can't cope. - * Note JPP requires double parentheses. - */ - -#ifdef HAVE_PROTOTYPES -#define JPP(arglist) arglist -#else -#define JPP(arglist) () -#endif - - -/* Short forms of external names for systems with brain-damaged linkers. - * We shorten external names to be unique in the first six letters, which - * is good enough for all known systems. - * (If your compiler itself needs names to be unique in less than 15 - * characters, you are out of luck. Get a better compiler.) - */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_std_error jStdError -#define jpeg_CreateCompress jCreaCompress -#define jpeg_CreateDecompress jCreaDecompress -#define jpeg_destroy_compress jDestCompress -#define jpeg_destroy_decompress jDestDecompress -#define jpeg_stdio_dest jStdDest -#define jpeg_stdio_src jStdSrc -#define jpeg_mem_dest jMemDest -#define jpeg_mem_src jMemSrc -#define jpeg_set_defaults jSetDefaults -#define jpeg_set_colorspace jSetColorspace -#define jpeg_default_colorspace jDefColorspace -#define jpeg_set_quality jSetQuality -#define jpeg_set_linear_quality jSetLQuality -#define jpeg_default_qtables jDefQTables -#define jpeg_add_quant_table jAddQuantTable -#define jpeg_quality_scaling jQualityScaling -#define jpeg_simple_progression jSimProgress -#define jpeg_suppress_tables jSuppressTables -#define jpeg_alloc_quant_table jAlcQTable -#define jpeg_alloc_huff_table jAlcHTable -#define jpeg_start_compress jStrtCompress -#define jpeg_write_scanlines jWrtScanlines -#define jpeg_finish_compress jFinCompress -#define jpeg_calc_jpeg_dimensions jCjpegDimensions -#define jpeg_write_raw_data jWrtRawData -#define jpeg_write_marker jWrtMarker -#define jpeg_write_m_header jWrtMHeader -#define jpeg_write_m_byte jWrtMByte -#define jpeg_write_tables jWrtTables -#define jpeg_read_header jReadHeader -#define jpeg_start_decompress jStrtDecompress -#define jpeg_read_scanlines jReadScanlines -#define jpeg_finish_decompress jFinDecompress -#define jpeg_read_raw_data jReadRawData -#define jpeg_has_multiple_scans jHasMultScn -#define jpeg_start_output jStrtOutput -#define jpeg_finish_output jFinOutput -#define jpeg_input_complete jInComplete -#define jpeg_new_colormap jNewCMap -#define jpeg_consume_input jConsumeInput -#define jpeg_core_output_dimensions jCoreDimensions -#define jpeg_calc_output_dimensions jCalcDimensions -#define jpeg_save_markers jSaveMarkers -#define jpeg_set_marker_processor jSetMarker -#define jpeg_read_coefficients jReadCoefs -#define jpeg_write_coefficients jWrtCoefs -#define jpeg_copy_critical_parameters jCopyCrit -#define jpeg_abort_compress jAbrtCompress -#define jpeg_abort_decompress jAbrtDecompress -#define jpeg_abort jAbort -#define jpeg_destroy jDestroy -#define jpeg_resync_to_restart jResyncRestart -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Default error-management setup */ -EXTERN(struct jpeg_error_mgr *) jpeg_std_error - JPP((struct jpeg_error_mgr * err)); - -/* Initialization of JPEG compression objects. - * jpeg_create_compress() and jpeg_create_decompress() are the exported - * names that applications should call. These expand to calls on - * jpeg_CreateCompress and jpeg_CreateDecompress with additional information - * passed for version mismatch checking. - * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. - */ -#define jpeg_create_compress(cinfo) \ - jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_compress_struct)) -#define jpeg_create_decompress(cinfo) \ - jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_decompress_struct)) -EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, - int version, size_t structsize)); -EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, - int version, size_t structsize)); -/* Destruction of JPEG compression objects */ -EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); - -/* Standard data source and destination managers: stdio streams. */ -/* Caller is responsible for opening the file before and closing after. */ -EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); -EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); - -/* Data source and destination managers: memory buffers. */ -EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, - unsigned char ** outbuffer, - unsigned long * outsize)); -EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo, - unsigned char * inbuffer, - unsigned long insize)); - -/* Default parameter setup for compression */ -EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); -/* Compression parameter setup aids */ -EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, - J_COLOR_SPACE colorspace)); -EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, - boolean force_baseline)); -EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, - int scale_factor, - boolean force_baseline)); -EXTERN(void) jpeg_default_qtables JPP((j_compress_ptr cinfo, - boolean force_baseline)); -EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, - const unsigned int *basic_table, - int scale_factor, - boolean force_baseline)); -EXTERN(int) jpeg_quality_scaling JPP((int quality)); -EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, - boolean suppress)); -EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); -EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); - -/* Main entry points for compression */ -EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, - boolean write_all_tables)); -EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION num_lines)); -EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); - -/* Precalculate JPEG dimensions for current compression parameters. */ -EXTERN(void) jpeg_calc_jpeg_dimensions JPP((j_compress_ptr cinfo)); - -/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION num_lines)); - -/* Write a special marker. See libjpeg.txt concerning safe usage. */ -EXTERN(void) jpeg_write_marker - JPP((j_compress_ptr cinfo, int marker, - const JOCTET * dataptr, unsigned int datalen)); -/* Same, but piecemeal. */ -EXTERN(void) jpeg_write_m_header - JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); -EXTERN(void) jpeg_write_m_byte - JPP((j_compress_ptr cinfo, int val)); - -/* Alternate compression function: just write an abbreviated table file */ -EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); - -/* Decompression startup: read start of JPEG datastream to see what's there */ -EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, - boolean require_image)); -/* Return value is one of: */ -#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ -#define JPEG_HEADER_OK 1 /* Found valid image datastream */ -#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ -/* If you pass require_image = TRUE (normal case), you need not check for - * a TABLES_ONLY return code; an abbreviated file will cause an error exit. - * JPEG_SUSPENDED is only possible if you use a data source module that can - * give a suspension return (the stdio source module doesn't). - */ - -/* Main entry points for decompression */ -EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); -EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION max_lines)); -EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); - -/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION max_lines)); - -/* Additional entry points for buffered-image mode. */ -EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, - int scan_number)); -EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); -EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); -/* Return value is one of: */ -/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ -#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ -#define JPEG_REACHED_EOI 2 /* Reached end of image */ -#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ -#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ - -/* Precalculate output dimensions for current decompression parameters. */ -EXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); - -/* Control saving of COM and APPn markers into marker_list. */ -EXTERN(void) jpeg_save_markers - JPP((j_decompress_ptr cinfo, int marker_code, - unsigned int length_limit)); - -/* Install a special processing method for COM or APPn markers. */ -EXTERN(void) jpeg_set_marker_processor - JPP((j_decompress_ptr cinfo, int marker_code, - jpeg_marker_parser_method routine)); - -/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ -EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, - jvirt_barray_ptr * coef_arrays)); -EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, - j_compress_ptr dstinfo)); - -/* If you choose to abort compression or decompression before completing - * jpeg_finish_(de)compress, then you need to clean up to release memory, - * temporary files, etc. You can just call jpeg_destroy_(de)compress - * if you're done with the JPEG object, but if you want to clean it up and - * reuse it, call this: - */ -EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); - -/* Generic versions of jpeg_abort and jpeg_destroy that work on either - * flavor of JPEG object. These may be more convenient in some places. - */ -EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); -EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); - -/* Default restart-marker-resync procedure for use by data source modules */ -EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, - int desired)); - - -/* These marker codes are exported since applications and data source modules - * are likely to want to use them. - */ - -#define JPEG_RST0 0xD0 /* RST0 marker code */ -#define JPEG_EOI 0xD9 /* EOI marker code */ -#define JPEG_APP0 0xE0 /* APP0 marker code */ -#define JPEG_COM 0xFE /* COM marker code */ - - -/* If we have a brain-damaged compiler that emits warnings (or worse, errors) - * for structure definitions that are never filled in, keep it quiet by - * supplying dummy definitions for the various substructures. - */ - -#ifdef INCOMPLETE_TYPES_BROKEN -#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ -struct jvirt_sarray_control { long dummy; }; -struct jvirt_barray_control { long dummy; }; -struct jpeg_comp_master { long dummy; }; -struct jpeg_c_main_controller { long dummy; }; -struct jpeg_c_prep_controller { long dummy; }; -struct jpeg_c_coef_controller { long dummy; }; -struct jpeg_marker_writer { long dummy; }; -struct jpeg_color_converter { long dummy; }; -struct jpeg_downsampler { long dummy; }; -struct jpeg_forward_dct { long dummy; }; -struct jpeg_entropy_encoder { long dummy; }; -struct jpeg_decomp_master { long dummy; }; -struct jpeg_d_main_controller { long dummy; }; -struct jpeg_d_coef_controller { long dummy; }; -struct jpeg_d_post_controller { long dummy; }; -struct jpeg_input_controller { long dummy; }; -struct jpeg_marker_reader { long dummy; }; -struct jpeg_entropy_decoder { long dummy; }; -struct jpeg_inverse_dct { long dummy; }; -struct jpeg_upsampler { long dummy; }; -struct jpeg_color_deconverter { long dummy; }; -struct jpeg_color_quantizer { long dummy; }; -#endif /* JPEG_INTERNALS */ -#endif /* INCOMPLETE_TYPES_BROKEN */ - - -/* - * The JPEG library modules define JPEG_INTERNALS before including this file. - * The internal structure declarations are read only when that is true. - * Applications using the library should not include jpegint.h, but may wish - * to include jerror.h. - */ - -#ifdef JPEG_INTERNALS -#include "jpegint.h" /* fetch private declarations */ -#include "jerror.h" /* fetch error codes too */ -#endif - -#ifdef __cplusplus -#ifndef DONT_USE_EXTERN_C -} -#endif -#endif - -#endif /* JPEGLIB_H */ diff --git a/misc/builddeps/dp.linux32/include/ode/collision.h b/misc/builddeps/dp.linux32/include/ode/collision.h deleted file mode 100644 index e89726cb..00000000 --- a/misc/builddeps/dp.linux32/include/ode/collision.h +++ /dev/null @@ -1,1523 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COLLISION_H_ -#define _ODE_COLLISION_H_ - -#include -#include -#include -// Include odeinit.h for backward compatibility as some of initialization APIs -// were initally declared in current header. -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup collide Collision Detection - * - * ODE has two main components: a dynamics simulation engine and a collision - * detection engine. The collision engine is given information about the - * shape of each body. At each time step it figures out which bodies touch - * each other and passes the resulting contact point information to the user. - * The user in turn creates contact joints between bodies. - * - * Using ODE's collision detection is optional - an alternative collision - * detection system can be used as long as it can supply the right kinds of - * contact information. - */ - - -/* ************************************************************************ */ -/* general functions */ - -/** - * @brief Destroy a geom, removing it from any space. - * - * Destroy a geom, removing it from any space it is in first. This one - * function destroys a geom of any type, but to create a geom you must call - * a creation function for that type. - * - * When a space is destroyed, if its cleanup mode is 1 (the default) then all - * the geoms in that space are automatically destroyed as well. - * - * @param geom the geom to be destroyed. - * @ingroup collide - */ -ODE_API void dGeomDestroy (dGeomID geom); - - -/** - * @brief Set the user-defined data pointer stored in the geom. - * - * @param geom the geom to hold the data - * @param data the data pointer to be stored - * @ingroup collide - */ -ODE_API void dGeomSetData (dGeomID geom, void* data); - - -/** - * @brief Get the user-defined data pointer stored in the geom. - * - * @param geom the geom containing the data - * @ingroup collide - */ -ODE_API void *dGeomGetData (dGeomID geom); - - -/** - * @brief Set the body associated with a placeable geom. - * - * Setting a body on a geom automatically combines the position vector and - * rotation matrix of the body and geom, so that setting the position or - * orientation of one will set the value for both objects. Setting a body - * ID of zero gives the geom its own position and rotation, independent - * from any body. If the geom was previously connected to a body then its - * new independent position/rotation is set to the current position/rotation - * of the body. - * - * Calling these functions on a non-placeable geom results in a runtime - * error in the debug build of ODE. - * - * @param geom the geom to connect - * @param body the body to attach to the geom - * @ingroup collide - */ -ODE_API void dGeomSetBody (dGeomID geom, dBodyID body); - - -/** - * @brief Get the body associated with a placeable geom. - * @param geom the geom to query. - * @sa dGeomSetBody - * @ingroup collide - */ -ODE_API dBodyID dGeomGetBody (dGeomID geom); - - -/** - * @brief Set the position vector of a placeable geom. - * - * If the geom is attached to a body, the body's position will also be changed. - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to set. - * @param x the new X coordinate. - * @param y the new Y coordinate. - * @param z the new Z coordinate. - * @sa dBodySetPosition - * @ingroup collide - */ -ODE_API void dGeomSetPosition (dGeomID geom, dReal x, dReal y, dReal z); - - -/** - * @brief Set the rotation matrix of a placeable geom. - * - * If the geom is attached to a body, the body's rotation will also be changed. - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to set. - * @param R the new rotation matrix. - * @sa dBodySetRotation - * @ingroup collide - */ -ODE_API void dGeomSetRotation (dGeomID geom, const dMatrix3 R); - - -/** - * @brief Set the rotation of a placeable geom. - * - * If the geom is attached to a body, the body's rotation will also be changed. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to set. - * @param Q the new rotation. - * @sa dBodySetQuaternion - * @ingroup collide - */ -ODE_API void dGeomSetQuaternion (dGeomID geom, const dQuaternion Q); - - -/** - * @brief Get the position vector of a placeable geom. - * - * If the geom is attached to a body, the body's position will be returned. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to query. - * @returns A pointer to the geom's position vector. - * @remarks The returned value is a pointer to the geom's internal - * data structure. It is valid until any changes are made - * to the geom. - * @sa dBodyGetPosition - * @ingroup collide - */ -ODE_API const dReal * dGeomGetPosition (dGeomID geom); - - -/** - * @brief Copy the position of a geom into a vector. - * @ingroup collide - * @param geom the geom to query - * @param pos a copy of the geom position - * @sa dGeomGetPosition - */ -ODE_API void dGeomCopyPosition (dGeomID geom, dVector3 pos); - - -/** - * @brief Get the rotation matrix of a placeable geom. - * - * If the geom is attached to a body, the body's rotation will be returned. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to query. - * @returns A pointer to the geom's rotation matrix. - * @remarks The returned value is a pointer to the geom's internal - * data structure. It is valid until any changes are made - * to the geom. - * @sa dBodyGetRotation - * @ingroup collide - */ -ODE_API const dReal * dGeomGetRotation (dGeomID geom); - - -/** - * @brief Get the rotation matrix of a placeable geom. - * - * If the geom is attached to a body, the body's rotation will be returned. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to query. - * @param R a copy of the geom rotation - * @sa dGeomGetRotation - * @ingroup collide - */ -ODE_API void dGeomCopyRotation(dGeomID geom, dMatrix3 R); - - -/** - * @brief Get the rotation quaternion of a placeable geom. - * - * If the geom is attached to a body, the body's quaternion will be returned. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to query. - * @param result a copy of the rotation quaternion. - * @sa dBodyGetQuaternion - * @ingroup collide - */ -ODE_API void dGeomGetQuaternion (dGeomID geom, dQuaternion result); - - -/** - * @brief Return the axis-aligned bounding box. - * - * Return in aabb an axis aligned bounding box that surrounds the given geom. - * The aabb array has elements (minx, maxx, miny, maxy, minz, maxz). If the - * geom is a space, a bounding box that surrounds all contained geoms is - * returned. - * - * This function may return a pre-computed cached bounding box, if it can - * determine that the geom has not moved since the last time the bounding - * box was computed. - * - * @param geom the geom to query - * @param aabb the returned bounding box - * @ingroup collide - */ -ODE_API void dGeomGetAABB (dGeomID geom, dReal aabb[6]); - - -/** - * @brief Determing if a geom is a space. - * @param geom the geom to query - * @returns Non-zero if the geom is a space, zero otherwise. - * @ingroup collide - */ -ODE_API int dGeomIsSpace (dGeomID geom); - - -/** - * @brief Query for the space containing a particular geom. - * @param geom the geom to query - * @returns The space that contains the geom, or NULL if the geom is - * not contained by a space. - * @ingroup collide - */ -ODE_API dSpaceID dGeomGetSpace (dGeomID); - - -/** - * @brief Given a geom, this returns its class. - * - * The ODE classes are: - * @li dSphereClass - * @li dBoxClass - * @li dCylinderClass - * @li dPlaneClass - * @li dRayClass - * @li dConvexClass - * @li dGeomTransformClass - * @li dTriMeshClass - * @li dSimpleSpaceClass - * @li dHashSpaceClass - * @li dQuadTreeSpaceClass - * @li dFirstUserClass - * @li dLastUserClass - * - * User-defined class will return their own number. - * - * @param geom the geom to query - * @returns The geom class ID. - * @ingroup collide - */ -ODE_API int dGeomGetClass (dGeomID geom); - - -/** - * @brief Set the "category" bitfield for the given geom. - * - * The category bitfield is used by spaces to govern which geoms will - * interact with each other. The bitfield is guaranteed to be at least - * 32 bits wide. The default category values for newly created geoms - * have all bits set. - * - * @param geom the geom to set - * @param bits the new bitfield value - * @ingroup collide - */ -ODE_API void dGeomSetCategoryBits (dGeomID geom, unsigned long bits); - - -/** - * @brief Set the "collide" bitfield for the given geom. - * - * The collide bitfield is used by spaces to govern which geoms will - * interact with each other. The bitfield is guaranteed to be at least - * 32 bits wide. The default category values for newly created geoms - * have all bits set. - * - * @param geom the geom to set - * @param bits the new bitfield value - * @ingroup collide - */ -ODE_API void dGeomSetCollideBits (dGeomID geom, unsigned long bits); - - -/** - * @brief Get the "category" bitfield for the given geom. - * - * @param geom the geom to set - * @param bits the new bitfield value - * @sa dGeomSetCategoryBits - * @ingroup collide - */ -ODE_API unsigned long dGeomGetCategoryBits (dGeomID); - - -/** - * @brief Get the "collide" bitfield for the given geom. - * - * @param geom the geom to set - * @param bits the new bitfield value - * @sa dGeomSetCollideBits - * @ingroup collide - */ -ODE_API unsigned long dGeomGetCollideBits (dGeomID); - - -/** - * @brief Enable a geom. - * - * Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2, - * although they can still be members of a space. New geoms are created in - * the enabled state. - * - * @param geom the geom to enable - * @sa dGeomDisable - * @sa dGeomIsEnabled - * @ingroup collide - */ -ODE_API void dGeomEnable (dGeomID geom); - - -/** - * @brief Disable a geom. - * - * Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2, - * although they can still be members of a space. New geoms are created in - * the enabled state. - * - * @param geom the geom to disable - * @sa dGeomDisable - * @sa dGeomIsEnabled - * @ingroup collide - */ -ODE_API void dGeomDisable (dGeomID geom); - - -/** - * @brief Check to see if a geom is enabled. - * - * Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2, - * although they can still be members of a space. New geoms are created in - * the enabled state. - * - * @param geom the geom to query - * @returns Non-zero if the geom is enabled, zero otherwise. - * @sa dGeomDisable - * @sa dGeomIsEnabled - * @ingroup collide - */ -ODE_API int dGeomIsEnabled (dGeomID geom); - - -enum -{ - dGeomCommonControlClass = 0, - dGeomColliderControlClass = 1 -}; - -enum -{ - dGeomCommonAnyControlCode = 0, - - dGeomColliderSetMergeSphereContactsControlCode = 1, - dGeomColliderGetMergeSphereContactsControlCode = 2 -}; - -enum -{ - dGeomColliderMergeContactsValue__Default = 0, // Used with Set... to restore default value - dGeomColliderMergeContactsValue_None = 1, - dGeomColliderMergeContactsValue_Normals = 2, - dGeomColliderMergeContactsValue_Full = 3 -}; - -/** - * @brief Execute low level control operation for geometry. - * - * The variable the dataSize points to must be initialized before the call. - * If the size does not match the one expected for the control class/code function - * changes it to the size expected and returns failure. This implies the function - * can be called with NULL data and zero size to test if control class/code is supported - * and obtain required data size for it. - * - * dGeomCommonAnyControlCode applies to any control class and returns success if - * at least one control code is available for the given class with given geom. - * - * Currently there are the folliwing control classes supported: - * @li dGeomColliderControlClass - * - * For dGeomColliderControlClass there are the following codes available: - * @li dGeomColliderSetMergeSphereContactsControlCode (arg of type int, dGeomColliderMergeContactsValue_*) - * @li dGeomColliderGetMergeSphereContactsControlCode (arg of type int, dGeomColliderMergeContactsValue_*) - * - * @param geom the geom to control - * @param controlClass the control class - * @param controlCode the control code for the class - * @param dataValue the control argument pointer - * @param dataSize the control argument size provided or expected - * @returns Boolean execution status - * @ingroup collide - */ -ODE_API int dGeomLowLevelControl (dGeomID geom, int controlClass, int controlCode, void *dataValue, int *dataSize); - - -/** - * @brief Get world position of a relative point on geom. - * - * Calling this function on a non-placeable geom results in the same point being - * returned. - * - * @ingroup collide - * @param result will contain the result. - */ -ODE_API void dGeomGetRelPointPos -( - dGeomID geom, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief takes a point in global coordinates and returns - * the point's position in geom-relative coordinates. - * - * Calling this function on a non-placeable geom results in the same point being - * returned. - * - * @remarks - * This is the inverse of dGeomGetRelPointPos() - * @ingroup collide - * @param result will contain the result. - */ -ODE_API void dGeomGetPosRelPoint -( - dGeomID geom, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Convert from geom-local to world coordinates. - * - * Calling this function on a non-placeable geom results in the same vector being - * returned. - * - * @ingroup collide - * @param result will contain the result. - */ -ODE_API void dGeomVectorToWorld -( - dGeomID geom, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Convert from world to geom-local coordinates. - * - * Calling this function on a non-placeable geom results in the same vector being - * returned. - * - * @ingroup collide - * @param result will contain the result. - */ -ODE_API void dGeomVectorFromWorld -( - dGeomID geom, dReal px, dReal py, dReal pz, - dVector3 result -); - - -/* ************************************************************************ */ -/* geom offset from body */ - -/** - * @brief Set the local offset position of a geom from its body. - * - * Sets the geom's positional offset in local coordinates. - * After this call, the geom will be at a new position determined from the - * body's position and the offset. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param x the new X coordinate. - * @param y the new Y coordinate. - * @param z the new Z coordinate. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetPosition (dGeomID geom, dReal x, dReal y, dReal z); - - -/** - * @brief Set the local offset rotation matrix of a geom from its body. - * - * Sets the geom's rotational offset in local coordinates. - * After this call, the geom will be at a new position determined from the - * body's position and the offset. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param R the new rotation matrix. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetRotation (dGeomID geom, const dMatrix3 R); - - -/** - * @brief Set the local offset rotation of a geom from its body. - * - * Sets the geom's rotational offset in local coordinates. - * After this call, the geom will be at a new position determined from the - * body's position and the offset. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param Q the new rotation. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetQuaternion (dGeomID geom, const dQuaternion Q); - - -/** - * @brief Set the offset position of a geom from its body. - * - * Sets the geom's positional offset to move it to the new world - * coordinates. - * After this call, the geom will be at the world position passed in, - * and the offset will be the difference from the current body position. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param x the new X coordinate. - * @param y the new Y coordinate. - * @param z the new Z coordinate. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetWorldPosition (dGeomID geom, dReal x, dReal y, dReal z); - - -/** - * @brief Set the offset rotation of a geom from its body. - * - * Sets the geom's rotational offset to orient it to the new world - * rotation matrix. - * After this call, the geom will be at the world orientation passed in, - * and the offset will be the difference from the current body orientation. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param R the new rotation matrix. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetWorldRotation (dGeomID geom, const dMatrix3 R); - - -/** - * @brief Set the offset rotation of a geom from its body. - * - * Sets the geom's rotational offset to orient it to the new world - * rotation matrix. - * After this call, the geom will be at the world orientation passed in, - * and the offset will be the difference from the current body orientation. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param Q the new rotation. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetWorldQuaternion (dGeomID geom, const dQuaternion); - - -/** - * @brief Clear any offset from the geom. - * - * If the geom has an offset, it is eliminated and the geom is - * repositioned at the body's position. If the geom has no offset, - * this function does nothing. - * This is more efficient than calling dGeomSetOffsetPosition(zero) - * and dGeomSetOffsetRotation(identiy), because this function actually - * eliminates the offset, rather than leaving it as the identity transform. - * - * @param geom the geom to have its offset destroyed. - * @ingroup collide - */ -ODE_API void dGeomClearOffset(dGeomID geom); - - -/** - * @brief Check to see whether the geom has an offset. - * - * This function will return non-zero if the offset has been created. - * Note that there is a difference between a geom with no offset, - * and a geom with an offset that is the identity transform. - * In the latter case, although the observed behaviour is identical, - * there is a unnecessary computation involved because the geom will - * be applying the transform whenever it needs to recalculate its world - * position. - * - * @param geom the geom to query. - * @returns Non-zero if the geom has an offset, zero otherwise. - * @ingroup collide - */ -ODE_API int dGeomIsOffset(dGeomID geom); - - -/** - * @brief Get the offset position vector of a geom. - * - * Returns the positional offset of the geom in local coordinates. - * If the geom has no offset, this function returns the zero vector. - * - * @param geom the geom to query. - * @returns A pointer to the geom's offset vector. - * @remarks The returned value is a pointer to the geom's internal - * data structure. It is valid until any changes are made - * to the geom. - * @ingroup collide - */ -ODE_API const dReal * dGeomGetOffsetPosition (dGeomID geom); - - -/** - * @brief Copy the offset position vector of a geom. - * - * Returns the positional offset of the geom in local coordinates. - * If the geom has no offset, this function returns the zero vector. - * - * @param geom the geom to query. - * @param pos returns the offset position - * @ingroup collide - */ -ODE_API void dGeomCopyOffsetPosition (dGeomID geom, dVector3 pos); - - -/** - * @brief Get the offset rotation matrix of a geom. - * - * Returns the rotational offset of the geom in local coordinates. - * If the geom has no offset, this function returns the identity - * matrix. - * - * @param geom the geom to query. - * @returns A pointer to the geom's offset rotation matrix. - * @remarks The returned value is a pointer to the geom's internal - * data structure. It is valid until any changes are made - * to the geom. - * @ingroup collide - */ -ODE_API const dReal * dGeomGetOffsetRotation (dGeomID geom); - - -/** - * @brief Copy the offset rotation matrix of a geom. - * - * Returns the rotational offset of the geom in local coordinates. - * If the geom has no offset, this function returns the identity - * matrix. - * - * @param geom the geom to query. - * @param R returns the rotation matrix. - * @ingroup collide - */ -ODE_API void dGeomCopyOffsetRotation (dGeomID geom, dMatrix3 R); - - -/** - * @brief Get the offset rotation quaternion of a geom. - * - * Returns the rotation offset of the geom as a quaternion. - * If the geom has no offset, the identity quaternion is returned. - * - * @param geom the geom to query. - * @param result a copy of the rotation quaternion. - * @ingroup collide - */ -ODE_API void dGeomGetOffsetQuaternion (dGeomID geom, dQuaternion result); - - -/* ************************************************************************ */ -/* collision detection */ - -/* - * Just generate any contacts (disables any contact refining). - */ -#define CONTACTS_UNIMPORTANT 0x80000000 - -/** - * - * @brief Given two geoms o1 and o2 that potentially intersect, - * generate contact information for them. - * - * Internally, this just calls the correct class-specific collision - * functions for o1 and o2. - * - * @param o1 The first geom to test. - * @param o2 The second geom to test. - * - * @param flags The flags specify how contacts should be generated if - * the geoms touch. The lower 16 bits of flags is an integer that - * specifies the maximum number of contact points to generate. You must - * ask for at least one contact. - * Additionally, following bits may be set: - * CONTACTS_UNIMPORTANT -- just generate any contacts (skip contact refining). - * All other bits in flags must be set to zero. In the future the other bits - * may be used to select from different contact generation strategies. - * - * @param contact Points to an array of dContactGeom structures. The array - * must be able to hold at least the maximum number of contacts. These - * dContactGeom structures may be embedded within larger structures in the - * array -- the skip parameter is the byte offset from one dContactGeom to - * the next in the array. If skip is sizeof(dContactGeom) then contact - * points to a normal (C-style) array. It is an error for skip to be smaller - * than sizeof(dContactGeom). - * - * @returns If the geoms intersect, this function returns the number of contact - * points generated (and updates the contact array), otherwise it returns 0 - * (and the contact array is not touched). - * - * @remarks If a space is passed as o1 or o2 then this function will collide - * all objects contained in o1 with all objects contained in o2, and return - * the resulting contact points. This method for colliding spaces with geoms - * (or spaces with spaces) provides no user control over the individual - * collisions. To get that control, use dSpaceCollide or dSpaceCollide2 instead. - * - * @remarks If o1 and o2 are the same geom then this function will do nothing - * and return 0. Technically speaking an object intersects with itself, but it - * is not useful to find contact points in this case. - * - * @remarks This function does not care if o1 and o2 are in the same space or not - * (or indeed if they are in any space at all). - * - * @ingroup collide - */ -ODE_API int dCollide (dGeomID o1, dGeomID o2, int flags, dContactGeom *contact, - int skip); - -/** - * @brief Determines which pairs of geoms in a space may potentially intersect, - * and calls the callback function for each candidate pair. - * - * @param space The space to test. - * - * @param data Passed from dSpaceCollide directly to the callback - * function. Its meaning is user defined. The o1 and o2 arguments are the - * geoms that may be near each other. - * - * @param callback A callback function is of type @ref dNearCallback. - * - * @remarks Other spaces that are contained within the colliding space are - * not treated specially, i.e. they are not recursed into. The callback - * function may be passed these contained spaces as one or both geom - * arguments. - * - * @remarks dSpaceCollide() is guaranteed to pass all intersecting geom - * pairs to the callback function, but may also pass close but - * non-intersecting pairs. The number of these calls depends on the - * internal algorithms used by the space. Thus you should not expect - * that dCollide will return contacts for every pair passed to the - * callback. - * - * @sa dSpaceCollide2 - * @ingroup collide - */ -ODE_API void dSpaceCollide (dSpaceID space, void *data, dNearCallback *callback); - - -/** - * @brief Determines which geoms from one space may potentially intersect with - * geoms from another space, and calls the callback function for each candidate - * pair. - * - * @param space1 The first space to test. - * - * @param space2 The second space to test. - * - * @param data Passed from dSpaceCollide directly to the callback - * function. Its meaning is user defined. The o1 and o2 arguments are the - * geoms that may be near each other. - * - * @param callback A callback function is of type @ref dNearCallback. - * - * @remarks This function can also test a single non-space geom against a - * space. This function is useful when there is a collision hierarchy, i.e. - * when there are spaces that contain other spaces. - * - * @remarks Other spaces that are contained within the colliding space are - * not treated specially, i.e. they are not recursed into. The callback - * function may be passed these contained spaces as one or both geom - * arguments. - * - * @remarks Sublevel value of space affects how the spaces are iterated. - * Both spaces are recursed only if their sublevels match. Otherwise, only - * the space with greater sublevel is recursed and the one with lesser sublevel - * is used as a geom itself. - * - * @remarks dSpaceCollide2() is guaranteed to pass all intersecting geom - * pairs to the callback function, but may also pass close but - * non-intersecting pairs. The number of these calls depends on the - * internal algorithms used by the space. Thus you should not expect - * that dCollide will return contacts for every pair passed to the - * callback. - * - * @sa dSpaceCollide - * @sa dSpaceSetSublevel - * @ingroup collide - */ -ODE_API void dSpaceCollide2 (dGeomID space1, dGeomID space2, void *data, dNearCallback *callback); - - -/* ************************************************************************ */ -/* standard classes */ - -/* the maximum number of user classes that are supported */ -enum { - dMaxUserClasses = 4 -}; - -/* class numbers - each geometry object needs a unique number */ -enum { - dSphereClass = 0, - dBoxClass, - dCapsuleClass, - dCylinderClass, - dPlaneClass, - dRayClass, - dConvexClass, - dGeomTransformClass, - dTriMeshClass, - dHeightfieldClass, - - dFirstSpaceClass, - dSimpleSpaceClass = dFirstSpaceClass, - dHashSpaceClass, - dSweepAndPruneSpaceClass, // SAP - dQuadTreeSpaceClass, - dLastSpaceClass = dQuadTreeSpaceClass, - - dFirstUserClass, - dLastUserClass = dFirstUserClass + dMaxUserClasses - 1, - dGeomNumClasses -}; - - -/** - * @defgroup collide_sphere Sphere Class - * @ingroup collide - */ - -/** - * @brief Create a sphere geom of the given radius, and return its ID. - * - * @param space a space to contain the new geom. May be null. - * @param radius the radius of the sphere. - * - * @returns A new sphere geom. - * - * @remarks The point of reference for a sphere is its center. - * - * @sa dGeomDestroy - * @sa dGeomSphereSetRadius - * @ingroup collide_sphere - */ -ODE_API dGeomID dCreateSphere (dSpaceID space, dReal radius); - - -/** - * @brief Set the radius of a sphere geom. - * - * @param sphere the sphere to set. - * @param radius the new radius. - * - * @sa dGeomSphereGetRadius - * @ingroup collide_sphere - */ -ODE_API void dGeomSphereSetRadius (dGeomID sphere, dReal radius); - - -/** - * @brief Retrieves the radius of a sphere geom. - * - * @param sphere the sphere to query. - * - * @sa dGeomSphereSetRadius - * @ingroup collide_sphere - */ -ODE_API dReal dGeomSphereGetRadius (dGeomID sphere); - - -/** - * @brief Calculate the depth of the a given point within a sphere. - * - * @param sphere the sphere to query. - * @param x the X coordinate of the point. - * @param y the Y coordinate of the point. - * @param z the Z coordinate of the point. - * - * @returns The depth of the point. Points inside the sphere will have a - * positive depth, points outside it will have a negative depth, and points - * on the surface will have a depth of zero. - * - * @ingroup collide_sphere - */ -ODE_API dReal dGeomSpherePointDepth (dGeomID sphere, dReal x, dReal y, dReal z); - - -//--> Convex Functions -ODE_API dGeomID dCreateConvex (dSpaceID space, - dReal *_planes, - unsigned int _planecount, - dReal *_points, - unsigned int _pointcount,unsigned int *_polygons); - -ODE_API void dGeomSetConvex (dGeomID g, - dReal *_planes, - unsigned int _count, - dReal *_points, - unsigned int _pointcount,unsigned int *_polygons); -//<-- Convex Functions - -/** - * @defgroup collide_box Box Class - * @ingroup collide - */ - -/** - * @brief Create a box geom with the provided side lengths. - * - * @param space a space to contain the new geom. May be null. - * @param lx the length of the box along the X axis - * @param ly the length of the box along the Y axis - * @param lz the length of the box along the Z axis - * - * @returns A new box geom. - * - * @remarks The point of reference for a box is its center. - * - * @sa dGeomDestroy - * @sa dGeomBoxSetLengths - * @ingroup collide_box - */ -ODE_API dGeomID dCreateBox (dSpaceID space, dReal lx, dReal ly, dReal lz); - - -/** - * @brief Set the side lengths of the given box. - * - * @param box the box to set - * @param lx the length of the box along the X axis - * @param ly the length of the box along the Y axis - * @param lz the length of the box along the Z axis - * - * @sa dGeomBoxGetLengths - * @ingroup collide_box - */ -ODE_API void dGeomBoxSetLengths (dGeomID box, dReal lx, dReal ly, dReal lz); - - -/** - * @brief Get the side lengths of a box. - * - * @param box the box to query - * @param result the returned side lengths - * - * @sa dGeomBoxSetLengths - * @ingroup collide_box - */ -ODE_API void dGeomBoxGetLengths (dGeomID box, dVector3 result); - - -/** - * @brief Return the depth of a point in a box. - * - * @param box the box to query - * @param x the X coordinate of the point to test. - * @param y the Y coordinate of the point to test. - * @param z the Z coordinate of the point to test. - * - * @returns The depth of the point. Points inside the box will have a - * positive depth, points outside it will have a negative depth, and points - * on the surface will have a depth of zero. - */ -ODE_API dReal dGeomBoxPointDepth (dGeomID box, dReal x, dReal y, dReal z); - - -ODE_API dGeomID dCreatePlane (dSpaceID space, dReal a, dReal b, dReal c, dReal d); -ODE_API void dGeomPlaneSetParams (dGeomID plane, dReal a, dReal b, dReal c, dReal d); -ODE_API void dGeomPlaneGetParams (dGeomID plane, dVector4 result); -ODE_API dReal dGeomPlanePointDepth (dGeomID plane, dReal x, dReal y, dReal z); - -ODE_API dGeomID dCreateCapsule (dSpaceID space, dReal radius, dReal length); -ODE_API void dGeomCapsuleSetParams (dGeomID ccylinder, dReal radius, dReal length); -ODE_API void dGeomCapsuleGetParams (dGeomID ccylinder, dReal *radius, dReal *length); -ODE_API dReal dGeomCapsulePointDepth (dGeomID ccylinder, dReal x, dReal y, dReal z); - -// For now we want to have a backwards compatible C-API, note: C++ API is not. -#define dCreateCCylinder dCreateCapsule -#define dGeomCCylinderSetParams dGeomCapsuleSetParams -#define dGeomCCylinderGetParams dGeomCapsuleGetParams -#define dGeomCCylinderPointDepth dGeomCapsulePointDepth -#define dCCylinderClass dCapsuleClass - -ODE_API dGeomID dCreateCylinder (dSpaceID space, dReal radius, dReal length); -ODE_API void dGeomCylinderSetParams (dGeomID cylinder, dReal radius, dReal length); -ODE_API void dGeomCylinderGetParams (dGeomID cylinder, dReal *radius, dReal *length); - -ODE_API dGeomID dCreateRay (dSpaceID space, dReal length); -ODE_API void dGeomRaySetLength (dGeomID ray, dReal length); -ODE_API dReal dGeomRayGetLength (dGeomID ray); -ODE_API void dGeomRaySet (dGeomID ray, dReal px, dReal py, dReal pz, - dReal dx, dReal dy, dReal dz); -ODE_API void dGeomRayGet (dGeomID ray, dVector3 start, dVector3 dir); - -/* - * Set/get ray flags that influence ray collision detection. - * These flags are currently only noticed by the trimesh collider, because - * they can make a major differences there. - */ -ODE_API void dGeomRaySetParams (dGeomID g, int FirstContact, int BackfaceCull); -ODE_API void dGeomRayGetParams (dGeomID g, int *FirstContact, int *BackfaceCull); -ODE_API void dGeomRaySetClosestHit (dGeomID g, int closestHit); -ODE_API int dGeomRayGetClosestHit (dGeomID g); - -#include "collision_trimesh.h" - -ODE_API dGeomID dCreateGeomTransform (dSpaceID space); -ODE_API void dGeomTransformSetGeom (dGeomID g, dGeomID obj); -ODE_API dGeomID dGeomTransformGetGeom (dGeomID g); -ODE_API void dGeomTransformSetCleanup (dGeomID g, int mode); -ODE_API int dGeomTransformGetCleanup (dGeomID g); -ODE_API void dGeomTransformSetInfo (dGeomID g, int mode); -ODE_API int dGeomTransformGetInfo (dGeomID g); - - -/* ************************************************************************ */ -/* heightfield functions */ - - -// Data storage for heightfield data. -struct dxHeightfieldData; -typedef struct dxHeightfieldData* dHeightfieldDataID; - - -/** - * @brief Callback prototype - * - * Used by the callback heightfield data type to sample a height for a - * given cell position. - * - * @param p_user_data User data specified when creating the dHeightfieldDataID - * @param x The index of a sample in the local x axis. It is a value - * in the range zero to ( nWidthSamples - 1 ). - * @param x The index of a sample in the local z axis. It is a value - * in the range zero to ( nDepthSamples - 1 ). - * - * @return The sample height which is then scaled and offset using the - * values specified when the heightfield data was created. - * - * @ingroup collide - */ -typedef dReal dHeightfieldGetHeight( void* p_user_data, int x, int z ); - - - -/** - * @brief Creates a heightfield geom. - * - * Uses the information in the given dHeightfieldDataID to construct - * a geom representing a heightfield in a collision space. - * - * @param space The space to add the geom to. - * @param data The dHeightfieldDataID created by dGeomHeightfieldDataCreate and - * setup by dGeomHeightfieldDataBuildCallback, dGeomHeightfieldDataBuildByte, - * dGeomHeightfieldDataBuildShort or dGeomHeightfieldDataBuildFloat. - * @param bPlaceable If non-zero this geom can be transformed in the world using the - * usual functions such as dGeomSetPosition and dGeomSetRotation. If the geom is - * not set as placeable, then it uses a fixed orientation where the global y axis - * represents the dynamic 'height' of the heightfield. - * - * @return A geom id to reference this geom in other calls. - * - * @ingroup collide - */ -ODE_API dGeomID dCreateHeightfield( dSpaceID space, - dHeightfieldDataID data, int bPlaceable ); - - -/** - * @brief Creates a new empty dHeightfieldDataID. - * - * Allocates a new dHeightfieldDataID and returns it. You must call - * dGeomHeightfieldDataDestroy to destroy it after the geom has been removed. - * The dHeightfieldDataID value is used when specifying a data format type. - * - * @return A dHeightfieldDataID for use with dGeomHeightfieldDataBuildCallback, - * dGeomHeightfieldDataBuildByte, dGeomHeightfieldDataBuildShort or - * dGeomHeightfieldDataBuildFloat. - * @ingroup collide - */ -ODE_API dHeightfieldDataID dGeomHeightfieldDataCreate(void); - - -/** - * @brief Destroys a dHeightfieldDataID. - * - * Deallocates a given dHeightfieldDataID and all managed resources. - * - * @param d A dHeightfieldDataID created by dGeomHeightfieldDataCreate - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataDestroy( dHeightfieldDataID d ); - - - -/** - * @brief Configures a dHeightfieldDataID to use a callback to - * retrieve height data. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is computed by - * the user and it should use the given callback when determining - * the height of a given element of it's shape. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildCallback( dHeightfieldDataID d, - void* pUserData, dHeightfieldGetHeight* pCallback, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Configures a dHeightfieldDataID to use height data in byte format. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is stored as a rectangular - * array of bytes (8 bit unsigned) representing the height at each sample point. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param pHeightData A pointer to the height data. - * @param bCopyHeightData When non-zero the height data is copied to an - * internal store. When zero the height data is accessed by reference and - * so must persist throughout the lifetime of the heightfield. - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildByte( dHeightfieldDataID d, - const unsigned char* pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Configures a dHeightfieldDataID to use height data in short format. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is stored as a rectangular - * array of shorts (16 bit signed) representing the height at each sample point. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param pHeightData A pointer to the height data. - * @param bCopyHeightData When non-zero the height data is copied to an - * internal store. When zero the height data is accessed by reference and - * so must persist throughout the lifetime of the heightfield. - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildShort( dHeightfieldDataID d, - const short* pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Configures a dHeightfieldDataID to use height data in - * single precision floating point format. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is stored as a rectangular - * array of single precision floats representing the height at each - * sample point. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param pHeightData A pointer to the height data. - * @param bCopyHeightData When non-zero the height data is copied to an - * internal store. When zero the height data is accessed by reference and - * so must persist throughout the lifetime of the heightfield. - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildSingle( dHeightfieldDataID d, - const float* pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Configures a dHeightfieldDataID to use height data in - * double precision floating point format. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is stored as a rectangular - * array of double precision floats representing the height at each - * sample point. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param pHeightData A pointer to the height data. - * @param bCopyHeightData When non-zero the height data is copied to an - * internal store. When zero the height data is accessed by reference and - * so must persist throughout the lifetime of the heightfield. - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildDouble( dHeightfieldDataID d, - const double* pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Manually set the minimum and maximum height bounds. - * - * This call allows you to set explicit min / max values after initial - * creation typically for callback heightfields which default to +/- infinity, - * or those whose data has changed. This must be set prior to binding with a - * geom, as the the AABB is not recomputed after it's first generation. - * - * @remarks The minimum and maximum values are used to compute the AABB - * for the heightfield which is used for early rejection of collisions. - * A close fit will yield a more efficient collision check. - * - * @param d A dHeightfieldDataID created by dGeomHeightfieldDataCreate - * @param min_height The new minimum height value. Scale, offset and thickness is then applied. - * @param max_height The new maximum height value. Scale and offset is then applied. - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataSetBounds( dHeightfieldDataID d, - dReal minHeight, dReal maxHeight ); - - -/** - * @brief Assigns a dHeightfieldDataID to a heightfield geom. - * - * Associates the given dHeightfieldDataID with a heightfield geom. - * This is done without affecting the GEOM_PLACEABLE flag. - * - * @param g A geom created by dCreateHeightfield - * @param d A dHeightfieldDataID created by dGeomHeightfieldDataCreate - * @ingroup collide - */ -ODE_API void dGeomHeightfieldSetHeightfieldData( dGeomID g, dHeightfieldDataID d ); - - -/** - * @brief Gets the dHeightfieldDataID bound to a heightfield geom. - * - * Returns the dHeightfieldDataID associated with a heightfield geom. - * - * @param g A geom created by dCreateHeightfield - * @return The dHeightfieldDataID which may be NULL if none was assigned. - * @ingroup collide - */ -ODE_API dHeightfieldDataID dGeomHeightfieldGetHeightfieldData( dGeomID g ); - - - -/* ************************************************************************ */ -/* utility functions */ - -ODE_API void dClosestLineSegmentPoints (const dVector3 a1, const dVector3 a2, - const dVector3 b1, const dVector3 b2, - dVector3 cp1, dVector3 cp2); - -ODE_API int dBoxTouchesBox (const dVector3 _p1, const dMatrix3 R1, - const dVector3 side1, const dVector3 _p2, - const dMatrix3 R2, const dVector3 side2); - -// The meaning of flags parameter is the same as in dCollide() -ODE_API int dBoxBox (const dVector3 p1, const dMatrix3 R1, - const dVector3 side1, const dVector3 p2, - const dMatrix3 R2, const dVector3 side2, - dVector3 normal, dReal *depth, int *return_code, - int flags, dContactGeom *contact, int skip); - -ODE_API void dInfiniteAABB (dGeomID geom, dReal aabb[6]); - - -/* ************************************************************************ */ -/* custom classes */ - -typedef void dGetAABBFn (dGeomID, dReal aabb[6]); -typedef int dColliderFn (dGeomID o1, dGeomID o2, - int flags, dContactGeom *contact, int skip); -typedef dColliderFn * dGetColliderFnFn (int num); -typedef void dGeomDtorFn (dGeomID o); -typedef int dAABBTestFn (dGeomID o1, dGeomID o2, dReal aabb[6]); - -typedef struct dGeomClass { - int bytes; - dGetColliderFnFn *collider; - dGetAABBFn *aabb; - dAABBTestFn *aabb_test; - dGeomDtorFn *dtor; -} dGeomClass; - -ODE_API int dCreateGeomClass (const dGeomClass *classptr); -ODE_API void * dGeomGetClassData (dGeomID); -ODE_API dGeomID dCreateGeom (int classnum); - -/** - * @brief Sets a custom collider function for two geom classes. - * - * @param i The first geom class handled by this collider - * @param j The second geom class handled by this collider - * @param fn The collider function to use to determine collisions. - * @ingroup collide - */ -ODE_API void dSetColliderOverride (int i, int j, dColliderFn *fn); - - -/* ************************************************************************ */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/collision_space.h b/misc/builddeps/dp.linux32/include/ode/collision_space.h deleted file mode 100644 index bf7ef9b4..00000000 --- a/misc/builddeps/dp.linux32/include/ode/collision_space.h +++ /dev/null @@ -1,182 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COLLISION_SPACE_H_ -#define _ODE_COLLISION_SPACE_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct dContactGeom; - -/** - * @brief User callback for geom-geom collision testing. - * - * @param data The user data object, as passed to dSpaceCollide. - * @param o1 The first geom being tested. - * @param o2 The second geom being test. - * - * @remarks The callback function can call dCollide on o1 and o2 to generate - * contact points between each pair. Then these contact points may be added - * to the simulation as contact joints. The user's callback function can of - * course chose not to call dCollide for any pair, e.g. if the user decides - * that those pairs should not interact. - * - * @ingroup collide - */ -typedef void dNearCallback (void *data, dGeomID o1, dGeomID o2); - - -ODE_API dSpaceID dSimpleSpaceCreate (dSpaceID space); -ODE_API dSpaceID dHashSpaceCreate (dSpaceID space); -ODE_API dSpaceID dQuadTreeSpaceCreate (dSpaceID space, const dVector3 Center, const dVector3 Extents, int Depth); - - -// SAP -// Order XZY or ZXY usually works best, if your Y is up. -#define dSAP_AXES_XYZ ((0)|(1<<2)|(2<<4)) -#define dSAP_AXES_XZY ((0)|(2<<2)|(1<<4)) -#define dSAP_AXES_YXZ ((1)|(0<<2)|(2<<4)) -#define dSAP_AXES_YZX ((1)|(2<<2)|(0<<4)) -#define dSAP_AXES_ZXY ((2)|(0<<2)|(1<<4)) -#define dSAP_AXES_ZYX ((2)|(1<<2)|(0<<4)) - -ODE_API dSpaceID dSweepAndPruneSpaceCreate( dSpaceID space, int axisorder ); - - - -ODE_API void dSpaceDestroy (dSpaceID); - -ODE_API void dHashSpaceSetLevels (dSpaceID space, int minlevel, int maxlevel); -ODE_API void dHashSpaceGetLevels (dSpaceID space, int *minlevel, int *maxlevel); - -ODE_API void dSpaceSetCleanup (dSpaceID space, int mode); -ODE_API int dSpaceGetCleanup (dSpaceID space); - -/** -* @brief Sets sublevel value for a space. -* -* Sublevel affects how the space is handled in dSpaceCollide2 when it is collided -* with another space. If sublevels of both spaces match, the function iterates -* geometries of both spaces and collides them with each other. If sublevel of one -* space is greater than the sublevel of another one, only the geometries of the -* space with greater sublevel are iterated, another space is passed into -* collision callback as a geometry itself. By default all the spaces are assigned -* zero sublevel. -* -* @note -* The space sublevel @e IS @e NOT automatically updated when one space is inserted -* into another or removed from one. It is a client's responsibility to update sublevel -* value if necessary. -* -* @param space the space to modify -* @param sublevel the sublevel value to be assigned -* @ingroup collide -* @see dSpaceGetSublevel -* @see dSpaceCollide2 -*/ -ODE_API void dSpaceSetSublevel (dSpaceID space, int sublevel); - -/** -* @brief Gets sublevel value of a space. -* -* Sublevel affects how the space is handled in dSpaceCollide2 when it is collided -* with another space. See @c dSpaceSetSublevel for more details. -* -* @param space the space to query -* @returns the sublevel value of the space -* @ingroup collide -* @see dSpaceSetSublevel -* @see dSpaceCollide2 -*/ -ODE_API int dSpaceGetSublevel (dSpaceID space); - - -/** -* @brief Sets manual cleanup flag for a space. -* -* Manual cleanup flag marks a space as eligible for manual thread data cleanup. -* This function should be called for every space object right after creation in -* case if ODE has been initialized with @c dInitFlagManualThreadCleanup flag. -* -* Failure to set manual cleanup flag for a space may lead to some resources -* remaining leaked until the program exit. -* -* @param space the space to modify -* @param mode 1 for manual cleanup mode and 0 for default cleanup mode -* @ingroup collide -* @see dSpaceGetManualCleanup -* @see dInitODE2 -*/ -ODE_API void dSpaceSetManualCleanup (dSpaceID space, int mode); - -/** -* @brief Get manual cleanup flag of a space. -* -* Manual cleanup flag marks a space space as eligible for manual thread data cleanup. -* See @c dSpaceSetManualCleanup for more details. -* -* @param space the space to query -* @returns 1 for manual cleanup mode and 0 for default cleanup mode of the space -* @ingroup collide -* @see dSpaceSetManualCleanup -* @see dInitODE2 -*/ -ODE_API int dSpaceGetManualCleanup (dSpaceID space); - -ODE_API void dSpaceAdd (dSpaceID, dGeomID); -ODE_API void dSpaceRemove (dSpaceID, dGeomID); -ODE_API int dSpaceQuery (dSpaceID, dGeomID); -ODE_API void dSpaceClean (dSpaceID); -ODE_API int dSpaceGetNumGeoms (dSpaceID); -ODE_API dGeomID dSpaceGetGeom (dSpaceID, int i); - -/** - * @brief Given a space, this returns its class. - * - * The ODE classes are: - * @li dSimpleSpaceClass - * @li dHashSpaceClass - * @li dSweepAndPruneSpaceClass - * @li dQuadTreeSpaceClass - * @li dFirstUserClass - * @li dLastUserClass - * - * The class id not defined by the user should be between - * dFirstSpaceClass and dLastSpaceClass. - * - * User-defined class will return their own number. - * - * @param space the space to query - * @returns The space class ID. - * @ingroup collide - */ -ODE_API int dSpaceGetClass(dSpaceID space); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/collision_trimesh.h b/misc/builddeps/dp.linux32/include/ode/collision_trimesh.h deleted file mode 100644 index f263a9ea..00000000 --- a/misc/builddeps/dp.linux32/include/ode/collision_trimesh.h +++ /dev/null @@ -1,216 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* - * TriMesh code by Erwin de Vries. - * - * Trimesh data. - * This is where the actual vertexdata (pointers), and BV tree is stored. - * Vertices should be single precision! - * This should be more sophisticated, so that the user can easyly implement - * another collision library, but this is a lot of work, and also costs some - * performance because some data has to be copied. - */ - -#ifndef _ODE_COLLISION_TRIMESH_H_ -#define _ODE_COLLISION_TRIMESH_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Data storage for triangle meshes. - */ -struct dxTriMeshData; -typedef struct dxTriMeshData* dTriMeshDataID; - -/* - * These dont make much sense now, but they will later when we add more - * features. - */ -ODE_API dTriMeshDataID dGeomTriMeshDataCreate(void); -ODE_API void dGeomTriMeshDataDestroy(dTriMeshDataID g); - - - -enum { TRIMESH_FACE_NORMALS }; -ODE_API void dGeomTriMeshDataSet(dTriMeshDataID g, int data_id, void* in_data); -ODE_API void* dGeomTriMeshDataGet(dTriMeshDataID g, int data_id); - - - -/** - * We need to set the last transform after each time step for - * accurate collision response. These functions get and set that transform. - * It is stored per geom instance, rather than per dTriMeshDataID. - */ -ODE_API void dGeomTriMeshSetLastTransform( dGeomID g, dMatrix4 last_trans ); -ODE_API dReal* dGeomTriMeshGetLastTransform( dGeomID g ); - -/* - * Build a TriMesh data object with single precision vertex data. - */ -ODE_API void dGeomTriMeshDataBuildSingle(dTriMeshDataID g, - const void* Vertices, int VertexStride, int VertexCount, - const void* Indices, int IndexCount, int TriStride); -/* same again with a normals array (used as trimesh-trimesh optimization) */ -ODE_API void dGeomTriMeshDataBuildSingle1(dTriMeshDataID g, - const void* Vertices, int VertexStride, int VertexCount, - const void* Indices, int IndexCount, int TriStride, - const void* Normals); -/* -* Build a TriMesh data object with double precision vertex data. -*/ -ODE_API void dGeomTriMeshDataBuildDouble(dTriMeshDataID g, - const void* Vertices, int VertexStride, int VertexCount, - const void* Indices, int IndexCount, int TriStride); -/* same again with a normals array (used as trimesh-trimesh optimization) */ -ODE_API void dGeomTriMeshDataBuildDouble1(dTriMeshDataID g, - const void* Vertices, int VertexStride, int VertexCount, - const void* Indices, int IndexCount, int TriStride, - const void* Normals); - -/* - * Simple build. Single/double precision based on dSINGLE/dDOUBLE! - */ -ODE_API void dGeomTriMeshDataBuildSimple(dTriMeshDataID g, - const dReal* Vertices, int VertexCount, - const dTriIndex* Indices, int IndexCount); -/* same again with a normals array (used as trimesh-trimesh optimization) */ -ODE_API void dGeomTriMeshDataBuildSimple1(dTriMeshDataID g, - const dReal* Vertices, int VertexCount, - const dTriIndex* Indices, int IndexCount, - const int* Normals); - -/* Preprocess the trimesh data to remove mark unnecessary edges and vertices */ -ODE_API void dGeomTriMeshDataPreprocess(dTriMeshDataID g); -/* Get and set the internal preprocessed trimesh data buffer, for loading and saving */ -ODE_API void dGeomTriMeshDataGetBuffer(dTriMeshDataID g, unsigned char** buf, int* bufLen); -ODE_API void dGeomTriMeshDataSetBuffer(dTriMeshDataID g, unsigned char* buf); - - -/* - * Per triangle callback. Allows the user to say if he wants a collision with - * a particular triangle. - */ -typedef int dTriCallback(dGeomID TriMesh, dGeomID RefObject, int TriangleIndex); -ODE_API void dGeomTriMeshSetCallback(dGeomID g, dTriCallback* Callback); -ODE_API dTriCallback* dGeomTriMeshGetCallback(dGeomID g); - -/* - * Per object callback. Allows the user to get the list of triangles in 1 - * shot. Maybe we should remove this one. - */ -typedef void dTriArrayCallback(dGeomID TriMesh, dGeomID RefObject, const int* TriIndices, int TriCount); -ODE_API void dGeomTriMeshSetArrayCallback(dGeomID g, dTriArrayCallback* ArrayCallback); -ODE_API dTriArrayCallback* dGeomTriMeshGetArrayCallback(dGeomID g); - -/* - * Ray callback. - * Allows the user to say if a ray collides with a triangle on barycentric - * coords. The user can for example sample a texture with alpha transparency - * to determine if a collision should occur. - */ -typedef int dTriRayCallback(dGeomID TriMesh, dGeomID Ray, int TriangleIndex, dReal u, dReal v); -ODE_API void dGeomTriMeshSetRayCallback(dGeomID g, dTriRayCallback* Callback); -ODE_API dTriRayCallback* dGeomTriMeshGetRayCallback(dGeomID g); - -/* - * Triangle merging callback. - * Allows the user to generate a fake triangle index for a new contact generated - * from merging of two other contacts. That index could later be used by the - * user to determine attributes of original triangles used as sources for a - * merged contact. - */ -typedef int dTriTriMergeCallback(dGeomID TriMesh, int FirstTriangleIndex, int SecondTriangleIndex); -ODE_API void dGeomTriMeshSetTriMergeCallback(dGeomID g, dTriTriMergeCallback* Callback); -ODE_API dTriTriMergeCallback* dGeomTriMeshGetTriMergeCallback(dGeomID g); - -/* - * Trimesh class - * Construction. Callbacks are optional. - */ -ODE_API dGeomID dCreateTriMesh(dSpaceID space, dTriMeshDataID Data, dTriCallback* Callback, dTriArrayCallback* ArrayCallback, dTriRayCallback* RayCallback); - -ODE_API void dGeomTriMeshSetData(dGeomID g, dTriMeshDataID Data); -ODE_API dTriMeshDataID dGeomTriMeshGetData(dGeomID g); - - -// enable/disable/check temporal coherence -ODE_API void dGeomTriMeshEnableTC(dGeomID g, int geomClass, int enable); -ODE_API int dGeomTriMeshIsTCEnabled(dGeomID g, int geomClass); - -/* - * Clears the internal temporal coherence caches. When a geom has its - * collision checked with a trimesh once, data is stored inside the trimesh. - * With large worlds with lots of seperate objects this list could get huge. - * We should be able to do this automagically. - */ -ODE_API void dGeomTriMeshClearTCCache(dGeomID g); - - -/* - * returns the TriMeshDataID - */ -ODE_API dTriMeshDataID dGeomTriMeshGetTriMeshDataID(dGeomID g); - -/* - * Gets a triangle. - */ -ODE_API void dGeomTriMeshGetTriangle(dGeomID g, int Index, dVector3* v0, dVector3* v1, dVector3* v2); - -/* - * Gets the point on the requested triangle and the given barycentric - * coordinates. - */ -ODE_API void dGeomTriMeshGetPoint(dGeomID g, int Index, dReal u, dReal v, dVector3 Out); - -/* - -This is how the strided data works: - -struct StridedVertex{ - dVector3 Vertex; - // Userdata -}; -int VertexStride = sizeof(StridedVertex); - -struct StridedTri{ - int Indices[3]; - // Userdata -}; -int TriStride = sizeof(StridedTri); - -*/ - - -ODE_API int dGeomTriMeshGetTriangleCount (dGeomID g); - -ODE_API void dGeomTriMeshDataUpdate(dTriMeshDataID g); - -#ifdef __cplusplus -} -#endif - -#endif /* _ODE_COLLISION_TRIMESH_H_ */ - diff --git a/misc/builddeps/dp.linux32/include/ode/common.h b/misc/builddeps/dp.linux32/include/ode/common.h deleted file mode 100644 index d7b2bba7..00000000 --- a/misc/builddeps/dp.linux32/include/ode/common.h +++ /dev/null @@ -1,420 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COMMON_H_ -#define _ODE_COMMON_H_ -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -#define PURE_INLINE static __inline - - -/* configuration stuff */ - -/* constants */ - -/* pi and 1/sqrt(2) are defined here if necessary because they don't get - * defined in on some platforms (like MS-Windows) - */ - -#ifndef M_PI -#define M_PI REAL(3.1415926535897932384626433832795029) -#endif -#ifndef M_SQRT1_2 -#define M_SQRT1_2 REAL(0.7071067811865475244008443621048490) -#endif - - -/* debugging: - * IASSERT is an internal assertion, i.e. a consistency check. if it fails - * we want to know where. - * UASSERT is a user assertion, i.e. if it fails a nice error message - * should be printed for the user. - * AASSERT is an arguments assertion, i.e. if it fails "bad argument(s)" - * is printed. - * DEBUGMSG just prints out a message - */ - -# if defined(__STDC__) && __STDC_VERSION__ >= 199901L -# define __FUNCTION__ __func__ -# endif -#ifndef dNODEBUG -# ifdef __GNUC__ -# define dIASSERT(a) { if (!(a)) { dDebug (d_ERR_IASSERT, \ - "assertion \"" #a "\" failed in %s() [%s:%u]",__FUNCTION__,__FILE__,__LINE__); } } -# define dUASSERT(a,msg) { if (!(a)) { dDebug (d_ERR_UASSERT, \ - msg " in %s()", __FUNCTION__); } } -# define dDEBUGMSG(msg) { dMessage (d_ERR_UASSERT, \ - msg " in %s() [%s:%u]", __FUNCTION__,__FILE__,__LINE__); } -# else // not __GNUC__ -# define dIASSERT(a) { if (!(a)) { dDebug (d_ERR_IASSERT, \ - "assertion \"" #a "\" failed in %s:%u",__FILE__,__LINE__); } } -# define dUASSERT(a,msg) { if (!(a)) { dDebug (d_ERR_UASSERT, \ - msg " (%s:%u)", __FILE__,__LINE__); } } -# define dDEBUGMSG(msg) { dMessage (d_ERR_UASSERT, \ - msg " (%s:%u)", __FILE__,__LINE__); } -# endif -# define dIVERIFY(a) dIASSERT(a) -#else -# define dIASSERT(a) ((void)0) -# define dUASSERT(a,msg) ((void)0) -# define dDEBUGMSG(msg) ((void)0) -# define dIVERIFY(a) ((void)(a)) -#endif - -# ifdef __GNUC__ -# define dICHECK(a) { if (!(a)) { dDebug (d_ERR_IASSERT, \ - "assertion \"" #a "\" failed in %s() [%s:%u]",__FUNCTION__,__FILE__,__LINE__); *(int *)0 = 0; } } -# else // not __GNUC__ -# define dICHECK(a) { if (!(a)) { dDebug (d_ERR_IASSERT, \ - "assertion \"" #a "\" failed in %s:%u",__FILE__,__LINE__); *(int *)0 = 0; } } -# endif - -// Argument assert is a special case of user assert -#define dAASSERT(a) dUASSERT(a,"Bad argument(s)") - -/* floating point data type, vector, matrix and quaternion types */ - -#if defined(dSINGLE) -typedef float dReal; -#ifdef dDOUBLE -#error You can only #define dSINGLE or dDOUBLE, not both. -#endif // dDOUBLE -#elif defined(dDOUBLE) -typedef double dReal; -#else -#error You must #define dSINGLE or dDOUBLE -#endif - -// Detect if we've got both trimesh engines enabled. -#if dTRIMESH_ENABLED -#if dTRIMESH_OPCODE && dTRIMESH_GIMPACT -#error You can only #define dTRIMESH_OPCODE or dTRIMESH_GIMPACT, not both. -#endif -#endif // dTRIMESH_ENABLED - -// Define a type for indices, either 16 or 32 bit, based on build option -// TODO: Currently GIMPACT only supports 32 bit indices. -#if dTRIMESH_16BIT_INDICES -#if dTRIMESH_GIMPACT -typedef uint32 dTriIndex; -#else // dTRIMESH_GIMPACT -typedef uint16 dTriIndex; -#endif // dTRIMESH_GIMPACT -#else // dTRIMESH_16BIT_INDICES -typedef uint32 dTriIndex; -#endif // dTRIMESH_16BIT_INDICES - -/* round an integer up to a multiple of 4, except that 0 and 1 are unmodified - * (used to compute matrix leading dimensions) - */ -#define dPAD(a) (((a) > 1) ? ((((a)-1)|3)+1) : (a)) - -/* these types are mainly just used in headers */ -typedef dReal dVector3[4]; -typedef dReal dVector4[4]; -typedef dReal dMatrix3[4*3]; -typedef dReal dMatrix4[4*4]; -typedef dReal dMatrix6[8*6]; -typedef dReal dQuaternion[4]; - - -/* precision dependent scalar math functions */ - -#if defined(dSINGLE) - -#define REAL(x) (x ## f) /* form a constant */ -#define dRecip(x) ((1.0f/(x))) /* reciprocal */ -#define dSqrt(x) (sqrtf(x)) /* square root */ -#define dRecipSqrt(x) ((1.0f/sqrtf(x))) /* reciprocal square root */ -#define dSin(x) (sinf(x)) /* sine */ -#define dCos(x) (cosf(x)) /* cosine */ -#define dFabs(x) (fabsf(x)) /* absolute value */ -#define dAtan2(y,x) (atan2f(y,x)) /* arc tangent with 2 args */ -#define dFMod(a,b) (fmodf(a,b)) /* modulo */ -#define dFloor(x) floorf(x) /* floor */ -#define dCeil(x) ceilf(x) /* floor */ -#define dCopySign(a,b) ((dReal)copysignf(a,b)) /* copy value sign */ -#define dNextAfter(x, y) nextafterf(x, y) /* next value after */ - -#if defined(_ODE__NEXTAFTERF_REQUIRED) -float _nextafterf(float x, float y); -#endif - -#ifdef HAVE___ISNANF -#define dIsNan(x) (__isnanf(x)) -#elif defined(HAVE__ISNANF) -#define dIsNan(x) (_isnanf(x)) -#elif defined(HAVE_ISNANF) -#define dIsNan(x) (isnanf(x)) -#else - /* - fall back to _isnan which is the VC way, - this may seem redundant since we already checked - for _isnan before, but if isnan is detected by - configure but is not found during compilation - we should always make sure we check for __isnanf, - _isnanf and isnanf in that order before falling - back to a default - */ -#define dIsNan(x) (_isnan(x)) -#endif - -#elif defined(dDOUBLE) - -#define REAL(x) (x) -#define dRecip(x) (1.0/(x)) -#define dSqrt(x) sqrt(x) -#define dRecipSqrt(x) (1.0/sqrt(x)) -#define dSin(x) sin(x) -#define dCos(x) cos(x) -#define dFabs(x) fabs(x) -#define dAtan2(y,x) atan2((y),(x)) -#define dFMod(a,b) (fmod((a),(b))) -#define dFloor(x) floor(x) -#define dCeil(x) ceil(x) -#define dCopySign(a,b) (copysign((a),(b))) -#define dNextAfter(x, y) nextafter(x, y) - -#undef _ODE__NEXTAFTERF_REQUIRED - -#ifdef HAVE___ISNAN -#define dIsNan(x) (__isnan(x)) -#elif defined(HAVE__ISNAN) -#define dIsNan(x) (_isnan(x)) -#elif defined(HAVE_ISNAN) -#define dIsNan(x) (isnan(x)) -#else -#define dIsNan(x) (_isnan(x)) -#endif - -#else -#error You must #define dSINGLE or dDOUBLE -#endif - -/* internal object types (all prefixed with `dx') */ - -struct dxWorld; /* dynamics world */ -struct dxSpace; /* collision space */ -struct dxBody; /* rigid body (dynamics object) */ -struct dxGeom; /* geometry (collision object) */ -struct dxJoint; -struct dxJointNode; -struct dxJointGroup; -struct dxWorldProcessThreadingManager; - -typedef struct dxWorld *dWorldID; -typedef struct dxSpace *dSpaceID; -typedef struct dxBody *dBodyID; -typedef struct dxGeom *dGeomID; -typedef struct dxJoint *dJointID; -typedef struct dxJointGroup *dJointGroupID; -typedef struct dxWorldProcessThreadingManager *dWorldStepThreadingManagerID; - -/* error numbers */ - -enum { - d_ERR_UNKNOWN = 0, /* unknown error */ - d_ERR_IASSERT, /* internal assertion failed */ - d_ERR_UASSERT, /* user assertion failed */ - d_ERR_LCP /* user assertion failed */ -}; - - -/* joint type numbers */ - -typedef enum { - dJointTypeNone = 0, /* or "unknown" */ - dJointTypeBall, - dJointTypeHinge, - dJointTypeSlider, - dJointTypeContact, - dJointTypeUniversal, - dJointTypeHinge2, - dJointTypeFixed, - dJointTypeNull, - dJointTypeAMotor, - dJointTypeLMotor, - dJointTypePlane2D, - dJointTypePR, - dJointTypePU, - dJointTypePiston -} dJointType; - - -/* an alternative way of setting joint parameters, using joint parameter - * structures and member constants. we don't actually do this yet. - */ - -/* -typedef struct dLimot { - int mode; - dReal lostop, histop; - dReal vel, fmax; - dReal fudge_factor; - dReal bounce, soft; - dReal suspension_erp, suspension_cfm; -} dLimot; - -enum { - dLimotLoStop = 0x0001, - dLimotHiStop = 0x0002, - dLimotVel = 0x0004, - dLimotFMax = 0x0008, - dLimotFudgeFactor = 0x0010, - dLimotBounce = 0x0020, - dLimotSoft = 0x0040 -}; -*/ - - -/* standard joint parameter names. why are these here? - because we don't want - * to include all the joint function definitions in joint.cpp. hmmmm. - * MSVC complains if we call D_ALL_PARAM_NAMES_X with a blank second argument, - * which is why we have the D_ALL_PARAM_NAMES macro as well. please copy and - * paste between these two. - */ - -#define D_ALL_PARAM_NAMES(start) \ - /* parameters for limits and motors */ \ - dParamLoStop = start, \ - dParamHiStop, \ - dParamVel, \ - dParamFMax, \ - dParamFudgeFactor, \ - dParamBounce, \ - dParamCFM, \ - dParamStopERP, \ - dParamStopCFM, \ - /* parameters for suspension */ \ - dParamSuspensionERP, \ - dParamSuspensionCFM, \ - dParamERP, \ - - ////////////////////////////////////////////////////////////////////////////// - /// \enum D_ALL_PARAM_NAMES_X - /// - /// \var dParamGroup This is the starting value of the different group - /// (i.e. dParamGroup1, dParamGroup2, dParamGroup3) - /// It also helps in the use of parameter - /// (dParamGroup2 | dParamFMax) == dParamFMax2 - ////////////////////////////////////////////////////////////////////////////// -#define D_ALL_PARAM_NAMES_X(start,x) \ - dParamGroup ## x = start, \ - /* parameters for limits and motors */ \ - dParamLoStop ## x = start, \ - dParamHiStop ## x, \ - dParamVel ## x, \ - dParamFMax ## x, \ - dParamFudgeFactor ## x, \ - dParamBounce ## x, \ - dParamCFM ## x, \ - dParamStopERP ## x, \ - dParamStopCFM ## x, \ - /* parameters for suspension */ \ - dParamSuspensionERP ## x, \ - dParamSuspensionCFM ## x, \ - dParamERP ## x, - -enum { - D_ALL_PARAM_NAMES(0) - dParamsInGroup, ///< Number of parameter in a group - D_ALL_PARAM_NAMES_X(0x000,1) - D_ALL_PARAM_NAMES_X(0x100,2) - D_ALL_PARAM_NAMES_X(0x200,3) - - /* add a multiple of this constant to the basic parameter numbers to get - * the parameters for the second, third etc axes. - */ - dParamGroup=0x100 -}; - - -/* angular motor mode numbers */ - -enum { - dAMotorUser = 0, - dAMotorEuler = 1 -}; - - -/* joint force feedback information */ - -typedef struct dJointFeedback { - dVector3 f1; /* force applied to body 1 */ - dVector3 t1; /* torque applied to body 1 */ - dVector3 f2; /* force applied to body 2 */ - dVector3 t2; /* torque applied to body 2 */ -} dJointFeedback; - - -/* private functions that must be implemented by the collision library: - * (1) indicate that a geom has moved, (2) get the next geom in a body list. - * these functions are called whenever the position of geoms connected to a - * body have changed, e.g. with dBodySetPosition(), dBodySetRotation(), or - * when the ODE step function updates the body state. - */ - -void dGeomMoved (dGeomID); -dGeomID dGeomGetBodyNext (dGeomID); - -/** - * dGetConfiguration returns the specific ODE build configuration as - * a string of tokens. The string can be parsed in a similar way to - * the OpenGL extension mechanism, the naming convention should be - * familiar too. The following extensions are reported: - * - * ODE - * ODE_single_precision - * ODE_double_precision - * ODE_EXT_no_debug - * ODE_EXT_trimesh - * ODE_EXT_opcode - * ODE_EXT_gimpact - * ODE_EXT_malloc_not_alloca - * ODE_EXT_gyroscopic - * ODE_OPC_16bit_indices - * ODE_OPC_new_collider -*/ -ODE_API const char* dGetConfiguration (void); - -/** - * Helper to check for a token in the ODE configuration string. - * Caution, this function is case sensitive. - * - * @param token A configuration token, see dGetConfiguration for details - * - * @return 1 if exact token is present, 0 if not present - */ -ODE_API int dCheckConfiguration( const char* token ); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/compatibility.h b/misc/builddeps/dp.linux32/include/ode/compatibility.h deleted file mode 100644 index b3709866..00000000 --- a/misc/builddeps/dp.linux32/include/ode/compatibility.h +++ /dev/null @@ -1,40 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COMPATIBILITY_H_ -#define _ODE_COMPATIBILITY_H_ - -/* - * ODE's backward compatibility system ensures that as ODE's API - * evolves, user code will not break. - */ - -/* - * These new rotation function names are more consistent with the - * rest of the API. - */ -#define dQtoR(q,R) dRfromQ((R),(q)) -#define dRtoQ(R,q) dQfromR((q),(R)) -#define dWtoDQ(w,q,dq) dDQfromW((dq),(w),(q)) - - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/contact.h b/misc/builddeps/dp.linux32/include/ode/contact.h deleted file mode 100644 index 8bb810f5..00000000 --- a/misc/builddeps/dp.linux32/include/ode/contact.h +++ /dev/null @@ -1,104 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_CONTACT_H_ -#define _ODE_CONTACT_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -enum { - dContactMu2 = 0x001, - dContactFDir1 = 0x002, - dContactBounce = 0x004, - dContactSoftERP = 0x008, - dContactSoftCFM = 0x010, - dContactMotion1 = 0x020, - dContactMotion2 = 0x040, - dContactMotionN = 0x080, - dContactSlip1 = 0x100, - dContactSlip2 = 0x200, - - dContactApprox0 = 0x0000, - dContactApprox1_1 = 0x1000, - dContactApprox1_2 = 0x2000, - dContactApprox1 = 0x3000 -}; - - -typedef struct dSurfaceParameters { - /* must always be defined */ - int mode; - dReal mu; - - /* only defined if the corresponding flag is set in mode */ - dReal mu2; - dReal bounce; - dReal bounce_vel; - dReal soft_erp; - dReal soft_cfm; - dReal motion1,motion2,motionN; - dReal slip1,slip2; -} dSurfaceParameters; - - -/** - * @brief Describe the contact point between two geoms. - * - * If two bodies touch, or if a body touches a static feature in its - * environment, the contact is represented by one or more "contact - * points", described by dContactGeom. - * - * The convention is that if body 1 is moved along the normal vector by - * a distance depth (or equivalently if body 2 is moved the same distance - * in the opposite direction) then the contact depth will be reduced to - * zero. This means that the normal vector points "in" to body 1. - * - * @ingroup collide - */ -typedef struct dContactGeom { - dVector3 pos; ///< contact position - dVector3 normal; ///< normal vector - dReal depth; ///< penetration depth - dGeomID g1,g2; ///< the colliding geoms - int side1,side2; ///< (to be documented) -} dContactGeom; - - -/* contact info used by contact joint */ - -typedef struct dContact { - dSurfaceParameters surface; - dContactGeom geom; - dVector3 fdir1; -} dContact; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/error.h b/misc/builddeps/dp.linux32/include/ode/error.h deleted file mode 100644 index 20b9ba45..00000000 --- a/misc/builddeps/dp.linux32/include/ode/error.h +++ /dev/null @@ -1,63 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* this comes from the `reuse' library. copy any changes back to the source */ - -#ifndef _ODE_ERROR_H_ -#define _ODE_ERROR_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* all user defined error functions have this type. error and debug functions - * should not return. - */ -typedef void dMessageFunction (int errnum, const char *msg, va_list ap); - -/* set a new error, debug or warning handler. if fn is 0, the default handlers - * are used. - */ -ODE_API void dSetErrorHandler (dMessageFunction *fn); -ODE_API void dSetDebugHandler (dMessageFunction *fn); -ODE_API void dSetMessageHandler (dMessageFunction *fn); - -/* return the current error, debug or warning handler. if the return value is - * 0, the default handlers are in place. - */ -ODE_API dMessageFunction *dGetErrorHandler(void); -ODE_API dMessageFunction *dGetDebugHandler(void); -ODE_API dMessageFunction *dGetMessageHandler(void); - -/* generate a fatal error, debug trap or a message. */ -ODE_API void dError (int num, const char *msg, ...); -ODE_API void dDebug (int num, const char *msg, ...); -ODE_API void dMessage (int num, const char *msg, ...); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/export-dif.h b/misc/builddeps/dp.linux32/include/ode/export-dif.h deleted file mode 100644 index f6578ac7..00000000 --- a/misc/builddeps/dp.linux32/include/ode/export-dif.h +++ /dev/null @@ -1,40 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_EXPORT_DIF_ -#define _ODE_EXPORT_DIF_ - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - -ODE_API void dWorldExportDIF (dWorldID w, FILE *file, const char *world_name); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/mass.h b/misc/builddeps/dp.linux32/include/ode/mass.h deleted file mode 100644 index d74500c9..00000000 --- a/misc/builddeps/dp.linux32/include/ode/mass.h +++ /dev/null @@ -1,144 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_MASS_H_ -#define _ODE_MASS_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct dMass; -typedef struct dMass dMass; - -/** - * Check if a mass structure has valid value. - * The function check if the mass and innertia matrix are positive definits - * - * @param m A mass structure to check - * - * @return 1 if both codition are met - */ -ODE_API int dMassCheck(const dMass *m); - -ODE_API void dMassSetZero (dMass *); - -ODE_API void dMassSetParameters (dMass *, dReal themass, - dReal cgx, dReal cgy, dReal cgz, - dReal I11, dReal I22, dReal I33, - dReal I12, dReal I13, dReal I23); - -ODE_API void dMassSetSphere (dMass *, dReal density, dReal radius); -ODE_API void dMassSetSphereTotal (dMass *, dReal total_mass, dReal radius); - -ODE_API void dMassSetCapsule (dMass *, dReal density, int direction, - dReal radius, dReal length); -ODE_API void dMassSetCapsuleTotal (dMass *, dReal total_mass, int direction, - dReal radius, dReal length); - -ODE_API void dMassSetCylinder (dMass *, dReal density, int direction, - dReal radius, dReal length); -ODE_API void dMassSetCylinderTotal (dMass *, dReal total_mass, int direction, - dReal radius, dReal length); - -ODE_API void dMassSetBox (dMass *, dReal density, - dReal lx, dReal ly, dReal lz); -ODE_API void dMassSetBoxTotal (dMass *, dReal total_mass, - dReal lx, dReal ly, dReal lz); - -ODE_API void dMassSetTrimesh (dMass *, dReal density, dGeomID g); - -ODE_API void dMassSetTrimeshTotal (dMass *m, dReal total_mass, dGeomID g); - -ODE_API void dMassAdjust (dMass *, dReal newmass); - -ODE_API void dMassTranslate (dMass *, dReal x, dReal y, dReal z); - -ODE_API void dMassRotate (dMass *, const dMatrix3 R); - -ODE_API void dMassAdd (dMass *a, const dMass *b); - - -// Backwards compatible API -ODE_API ODE_API_DEPRECATED void dMassSetCappedCylinder(dMass *a, dReal b, int c, dReal d, dReal e); -ODE_API ODE_API_DEPRECATED void dMassSetCappedCylinderTotal(dMass *a, dReal b, int c, dReal d, dReal e); - - -struct dMass { - dReal mass; - dVector3 c; - dMatrix3 I; - -#ifdef __cplusplus - dMass() - { dMassSetZero (this); } - void setZero() - { dMassSetZero (this); } - void setParameters (dReal themass, dReal cgx, dReal cgy, dReal cgz, - dReal I11, dReal I22, dReal I33, - dReal I12, dReal I13, dReal I23) - { dMassSetParameters (this,themass,cgx,cgy,cgz,I11,I22,I33,I12,I13,I23); } - - void setSphere (dReal density, dReal radius) - { dMassSetSphere (this,density,radius); } - void setSphereTotal (dReal total, dReal radius) - { dMassSetSphereTotal (this,total,radius); } - - void setCapsule (dReal density, int direction, dReal radius, dReal length) - { dMassSetCapsule (this,density,direction,radius,length); } - void setCapsuleTotal (dReal total, int direction, dReal radius, dReal length) - { dMassSetCapsule (this,total,direction,radius,length); } - - void setCylinder(dReal density, int direction, dReal radius, dReal length) - { dMassSetCylinder (this,density,direction,radius,length); } - void setCylinderTotal(dReal total, int direction, dReal radius, dReal length) - { dMassSetCylinderTotal (this,total,direction,radius,length); } - - void setBox (dReal density, dReal lx, dReal ly, dReal lz) - { dMassSetBox (this,density,lx,ly,lz); } - void setBoxTotal (dReal total, dReal lx, dReal ly, dReal lz) - { dMassSetBoxTotal (this,total,lx,ly,lz); } - - void setTrimesh(dReal density, dGeomID g) - { dMassSetTrimesh (this, density, g); } - void setTrimeshTotal(dReal total, dGeomID g) - { dMassSetTrimeshTotal (this, total, g); } - - void adjust (dReal newmass) - { dMassAdjust (this,newmass); } - void translate (dReal x, dReal y, dReal z) - { dMassTranslate (this,x,y,z); } - void rotate (const dMatrix3 R) - { dMassRotate (this,R); } - void add (const dMass *b) - { dMassAdd (this,b); } -#endif -}; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/matrix.h b/misc/builddeps/dp.linux32/include/ode/matrix.h deleted file mode 100644 index e177f44f..00000000 --- a/misc/builddeps/dp.linux32/include/ode/matrix.h +++ /dev/null @@ -1,280 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* optimized and unoptimized vector and matrix functions */ - -#ifndef _ODE_MATRIX_H_ -#define _ODE_MATRIX_H_ - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - -/* set a vector/matrix of size n to all zeros, or to a specific value. */ - -ODE_API void dSetZero (dReal *a, int n); -ODE_API void dSetValue (dReal *a, int n, dReal value); - - -/* get the dot product of two n*1 vectors. if n <= 0 then - * zero will be returned (in which case a and b need not be valid). - */ - -ODE_API dReal dDot (const dReal *a, const dReal *b, int n); - - -/* get the dot products of (a0,b), (a1,b), etc and return them in outsum. - * all vectors are n*1. if n <= 0 then zeroes will be returned (in which case - * the input vectors need not be valid). this function is somewhat faster - * than calling dDot() for all of the combinations separately. - */ - -/* NOT INCLUDED in the library for now. -void dMultidot2 (const dReal *a0, const dReal *a1, - const dReal *b, dReal *outsum, int n); -*/ - - -/* matrix multiplication. all matrices are stored in standard row format. - * the digit refers to the argument that is transposed: - * 0: A = B * C (sizes: A:p*r B:p*q C:q*r) - * 1: A = B' * C (sizes: A:p*r B:q*p C:q*r) - * 2: A = B * C' (sizes: A:p*r B:p*q C:r*q) - * case 1,2 are equivalent to saying that the operation is A=B*C but - * B or C are stored in standard column format. - */ - -ODE_API void dMultiply0 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); -ODE_API void dMultiply1 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); -ODE_API void dMultiply2 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); - - -/* do an in-place cholesky decomposition on the lower triangle of the n*n - * symmetric matrix A (which is stored by rows). the resulting lower triangle - * will be such that L*L'=A. return 1 on success and 0 on failure (on failure - * the matrix is not positive definite). - */ - -ODE_API int dFactorCholesky (dReal *A, int n); - - -/* solve for x: L*L'*x = b, and put the result back into x. - * L is size n*n, b is size n*1. only the lower triangle of L is considered. - */ - -ODE_API void dSolveCholesky (const dReal *L, dReal *b, int n); - - -/* compute the inverse of the n*n positive definite matrix A and put it in - * Ainv. this is not especially fast. this returns 1 on success (A was - * positive definite) or 0 on failure (not PD). - */ - -ODE_API int dInvertPDMatrix (const dReal *A, dReal *Ainv, int n); - - -/* check whether an n*n matrix A is positive definite, return 1/0 (yes/no). - * positive definite means that x'*A*x > 0 for any x. this performs a - * cholesky decomposition of A. if the decomposition fails then the matrix - * is not positive definite. A is stored by rows. A is not altered. - */ - -ODE_API int dIsPositiveDefinite (const dReal *A, int n); - - -/* factorize a matrix A into L*D*L', where L is lower triangular with ones on - * the diagonal, and D is diagonal. - * A is an n*n matrix stored by rows, with a leading dimension of n rounded - * up to 4. L is written into the strict lower triangle of A (the ones are not - * written) and the reciprocal of the diagonal elements of D are written into - * d. - */ -ODE_API void dFactorLDLT (dReal *A, dReal *d, int n, int nskip); - - -/* solve L*x=b, where L is n*n lower triangular with ones on the diagonal, - * and x,b are n*1. b is overwritten with x. - * the leading dimension of L is `nskip'. - */ -ODE_API void dSolveL1 (const dReal *L, dReal *b, int n, int nskip); - - -/* solve L'*x=b, where L is n*n lower triangular with ones on the diagonal, - * and x,b are n*1. b is overwritten with x. - * the leading dimension of L is `nskip'. - */ -ODE_API void dSolveL1T (const dReal *L, dReal *b, int n, int nskip); - - -/* in matlab syntax: a(1:n) = a(1:n) .* d(1:n) */ - -ODE_API void dVectorScale (dReal *a, const dReal *d, int n); - - -/* given `L', a n*n lower triangular matrix with ones on the diagonal, - * and `d', a n*1 vector of the reciprocal diagonal elements of an n*n matrix - * D, solve L*D*L'*x=b where x,b are n*1. x overwrites b. - * the leading dimension of L is `nskip'. - */ - -ODE_API void dSolveLDLT (const dReal *L, const dReal *d, dReal *b, int n, int nskip); - - -/* given an L*D*L' factorization of an n*n matrix A, return the updated - * factorization L2*D2*L2' of A plus the following "top left" matrix: - * - * [ b a' ] <-- b is a[0] - * [ a 0 ] <-- a is a[1..n-1] - * - * - L has size n*n, its leading dimension is nskip. L is lower triangular - * with ones on the diagonal. only the lower triangle of L is referenced. - * - d has size n. d contains the reciprocal diagonal elements of D. - * - a has size n. - * the result is written into L, except that the left column of L and d[0] - * are not actually modified. see ldltaddTL.m for further comments. - */ -ODE_API void dLDLTAddTL (dReal *L, dReal *d, const dReal *a, int n, int nskip); - - -/* given an L*D*L' factorization of a permuted matrix A, produce a new - * factorization for row and column `r' removed. - * - A has size n1*n1, its leading dimension in nskip. A is symmetric and - * positive definite. only the lower triangle of A is referenced. - * A itself may actually be an array of row pointers. - * - L has size n2*n2, its leading dimension in nskip. L is lower triangular - * with ones on the diagonal. only the lower triangle of L is referenced. - * - d has size n2. d contains the reciprocal diagonal elements of D. - * - p is a permutation vector. it contains n2 indexes into A. each index - * must be in the range 0..n1-1. - * - r is the row/column of L to remove. - * the new L will be written within the old L, i.e. will have the same leading - * dimension. the last row and column of L, and the last element of d, are - * undefined on exit. - * - * a fast O(n^2) algorithm is used. see ldltremove.m for further comments. - */ -ODE_API void dLDLTRemove (dReal **A, const int *p, dReal *L, dReal *d, - int n1, int n2, int r, int nskip); - - -/* given an n*n matrix A (with leading dimension nskip), remove the r'th row - * and column by moving elements. the new matrix will have the same leading - * dimension. the last row and column of A are untouched on exit. - */ -ODE_API void dRemoveRowCol (dReal *A, int n, int nskip, int r); - - -#if defined(__ODE__) - -void _dSetZero (dReal *a, size_t n); -void _dSetValue (dReal *a, size_t n, dReal value); -dReal _dDot (const dReal *a, const dReal *b, int n); -void _dMultiply0 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); -void _dMultiply1 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); -void _dMultiply2 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); -int _dFactorCholesky (dReal *A, int n, void *tmpbuf); -void _dSolveCholesky (const dReal *L, dReal *b, int n, void *tmpbuf); -int _dInvertPDMatrix (const dReal *A, dReal *Ainv, int n, void *tmpbuf); -int _dIsPositiveDefinite (const dReal *A, int n, void *tmpbuf); -void _dFactorLDLT (dReal *A, dReal *d, int n, int nskip); -void _dSolveL1 (const dReal *L, dReal *b, int n, int nskip); -void _dSolveL1T (const dReal *L, dReal *b, int n, int nskip); -void _dVectorScale (dReal *a, const dReal *d, int n); -void _dSolveLDLT (const dReal *L, const dReal *d, dReal *b, int n, int nskip); -void _dLDLTAddTL (dReal *L, dReal *d, const dReal *a, int n, int nskip, void *tmpbuf); -void _dLDLTRemove (dReal **A, const int *p, dReal *L, dReal *d, int n1, int n2, int r, int nskip, void *tmpbuf); -void _dRemoveRowCol (dReal *A, int n, int nskip, int r); - -PURE_INLINE size_t _dEstimateFactorCholeskyTmpbufSize(int n) -{ - return dPAD(n) * sizeof(dReal); -} - -PURE_INLINE size_t _dEstimateSolveCholeskyTmpbufSize(int n) -{ - return dPAD(n) * sizeof(dReal); -} - -PURE_INLINE size_t _dEstimateInvertPDMatrixTmpbufSize(int n) -{ - size_t FactorCholesky_size = _dEstimateFactorCholeskyTmpbufSize(n); - size_t SolveCholesky_size = _dEstimateSolveCholeskyTmpbufSize(n); - size_t MaxCholesky_size = FactorCholesky_size > SolveCholesky_size ? FactorCholesky_size : SolveCholesky_size; - return dPAD(n) * (n + 1) * sizeof(dReal) + MaxCholesky_size; -} - -PURE_INLINE size_t _dEstimateIsPositiveDefiniteTmpbufSize(int n) -{ - return dPAD(n) * n * sizeof(dReal) + _dEstimateFactorCholeskyTmpbufSize(n); -} - -PURE_INLINE size_t _dEstimateLDLTAddTLTmpbufSize(int nskip) -{ - return nskip * 2 * sizeof(dReal); -} - -PURE_INLINE size_t _dEstimateLDLTRemoveTmpbufSize(int n2, int nskip) -{ - return n2 * sizeof(dReal) + _dEstimateLDLTAddTLTmpbufSize(nskip); -} - -// For internal use -#define dSetZero(a, n) _dSetZero(a, n) -#define dSetValue(a, n, value) _dSetValue(a, n, value) -#define dDot(a, b, n) _dDot(a, b, n) -#define dMultiply0(A, B, C, p, q, r) _dMultiply0(A, B, C, p, q, r) -#define dMultiply1(A, B, C, p, q, r) _dMultiply1(A, B, C, p, q, r) -#define dMultiply2(A, B, C, p, q, r) _dMultiply2(A, B, C, p, q, r) -#define dFactorCholesky(A, n, tmpbuf) _dFactorCholesky(A, n, tmpbuf) -#define dSolveCholesky(L, b, n, tmpbuf) _dSolveCholesky(L, b, n, tmpbuf) -#define dInvertPDMatrix(A, Ainv, n, tmpbuf) _dInvertPDMatrix(A, Ainv, n, tmpbuf) -#define dIsPositiveDefinite(A, n, tmpbuf) _dIsPositiveDefinite(A, n, tmpbuf) -#define dFactorLDLT(A, d, n, nskip) _dFactorLDLT(A, d, n, nskip) -#define dSolveL1(L, b, n, nskip) _dSolveL1(L, b, n, nskip) -#define dSolveL1T(L, b, n, nskip) _dSolveL1T(L, b, n, nskip) -#define dVectorScale(a, d, n) _dVectorScale(a, d, n) -#define dSolveLDLT(L, d, b, n, nskip) _dSolveLDLT(L, d, b, n, nskip) -#define dLDLTAddTL(L, d, a, n, nskip, tmpbuf) _dLDLTAddTL(L, d, a, n, nskip, tmpbuf) -#define dLDLTRemove(A, p, L, d, n1, n2, r, nskip, tmpbuf) _dLDLTRemove(A, p, L, d, n1, n2, r, nskip, tmpbuf) -#define dRemoveRowCol(A, n, nskip, r) _dRemoveRowCol(A, n, nskip, r) - - -#define dEstimateFactorCholeskyTmpbufSize(n) _dEstimateFactorCholeskyTmpbufSize(n) -#define dEstimateSolveCholeskyTmpbufSize(n) _dEstimateSolveCholeskyTmpbufSize(n) -#define dEstimateInvertPDMatrixTmpbufSize(n) _dEstimateInvertPDMatrixTmpbufSize(n) -#define dEstimateIsPositiveDefiniteTmpbufSize(n) _dEstimateIsPositiveDefiniteTmpbufSize(n) -#define dEstimateLDLTAddTLTmpbufSize(nskip) _dEstimateLDLTAddTLTmpbufSize(nskip) -#define dEstimateLDLTRemoveTmpbufSize(n2, nskip) _dEstimateLDLTRemoveTmpbufSize(n2, nskip) - - -#endif // defined(__ODE__) - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/memory.h b/misc/builddeps/dp.linux32/include/ode/memory.h deleted file mode 100644 index 361061c1..00000000 --- a/misc/builddeps/dp.linux32/include/ode/memory.h +++ /dev/null @@ -1,59 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* this comes from the `reuse' library. copy any changes back to the source */ - -#ifndef _ODE_MEMORY_H_ -#define _ODE_MEMORY_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* function types to allocate and free memory */ -typedef void * dAllocFunction (size_t size); -typedef void * dReallocFunction (void *ptr, size_t oldsize, size_t newsize); -typedef void dFreeFunction (void *ptr, size_t size); - -/* set new memory management functions. if fn is 0, the default handlers are - * used. */ -ODE_API void dSetAllocHandler (dAllocFunction *fn); -ODE_API void dSetReallocHandler (dReallocFunction *fn); -ODE_API void dSetFreeHandler (dFreeFunction *fn); - -/* get current memory management functions */ -ODE_API dAllocFunction *dGetAllocHandler (void); -ODE_API dReallocFunction *dGetReallocHandler (void); -ODE_API dFreeFunction *dGetFreeHandler (void); - -/* allocate and free memory. */ -ODE_API void * dAlloc (size_t size); -ODE_API void * dRealloc (void *ptr, size_t oldsize, size_t newsize); -ODE_API void dFree (void *ptr, size_t size); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/misc.h b/misc/builddeps/dp.linux32/include/ode/misc.h deleted file mode 100644 index 0c55fc5b..00000000 --- a/misc/builddeps/dp.linux32/include/ode/misc.h +++ /dev/null @@ -1,85 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* miscellaneous math functions. these are mostly useful for testing */ - -#ifndef _ODE_MISC_H_ -#define _ODE_MISC_H_ - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - -/* return 1 if the random number generator is working. */ -ODE_API int dTestRand(void); - -/* return next 32 bit random number. this uses a not-very-random linear - * congruential method. - */ -ODE_API unsigned long dRand(void); - -/* get and set the current random number seed. */ -ODE_API unsigned long dRandGetSeed(void); -ODE_API void dRandSetSeed (unsigned long s); - -/* return a random integer between 0..n-1. the distribution will get worse - * as n approaches 2^32. - */ -ODE_API int dRandInt (int n); - -/* return a random real number between 0..1 */ -ODE_API dReal dRandReal(void); - -/* print out a matrix */ -#ifdef __cplusplus -ODE_API void dPrintMatrix (const dReal *A, int n, int m, char *fmt = "%10.4f ", - FILE *f=stdout); -#else -ODE_API void dPrintMatrix (const dReal *A, int n, int m, char *fmt, FILE *f); -#endif - -/* make a random vector with entries between +/- range. A has n elements. */ -ODE_API void dMakeRandomVector (dReal *A, int n, dReal range); - -/* make a random matrix with entries between +/- range. A has size n*m. */ -ODE_API void dMakeRandomMatrix (dReal *A, int n, int m, dReal range); - -/* clear the upper triangle of a square matrix */ -ODE_API void dClearUpperTriangle (dReal *A, int n); - -/* return the maximum element difference between the two n*m matrices */ -ODE_API dReal dMaxDifference (const dReal *A, const dReal *B, int n, int m); - -/* return the maximum element difference between the lower triangle of two - * n*n matrices */ -ODE_API dReal dMaxDifferenceLowerTriangle (const dReal *A, const dReal *B, int n); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/objects.h b/misc/builddeps/dp.linux32/include/ode/objects.h deleted file mode 100644 index 379de010..00000000 --- a/misc/builddeps/dp.linux32/include/ode/objects.h +++ /dev/null @@ -1,2975 +0,0 @@ - - -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_OBJECTS_H_ -#define _ODE_OBJECTS_H_ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup world World - * - * The world object is a container for rigid bodies and joints. Objects in - * different worlds can not interact, for example rigid bodies from two - * different worlds can not collide. - * - * All the objects in a world exist at the same point in time, thus one - * reason to use separate worlds is to simulate systems at different rates. - * Most applications will only need one world. - */ - - -/** - * @brief Create a new, empty world and return its ID number. - * @return an identifier - * @ingroup world - */ -ODE_API dWorldID dWorldCreate(void); - - -/** - * @brief Destroy a world and everything in it. - * - * This includes all bodies, and all joints that are not part of a joint - * group. Joints that are part of a joint group will be deactivated, and - * can be destroyed by calling, for example, dJointGroupEmpty(). - * @ingroup world - * @param world the identifier for the world the be destroyed. - */ -ODE_API void dWorldDestroy (dWorldID world); - - -/** - * @brief Set the world's global gravity vector. - * - * The units are m/s^2, so Earth's gravity vector would be (0,0,-9.81), - * assuming that +z is up. The default is no gravity, i.e. (0,0,0). - * - * @ingroup world - */ -ODE_API void dWorldSetGravity (dWorldID, dReal x, dReal y, dReal z); - - -/** - * @brief Get the gravity vector for a given world. - * @ingroup world - */ -ODE_API void dWorldGetGravity (dWorldID, dVector3 gravity); - - -/** - * @brief Set the global ERP value, that controls how much error - * correction is performed in each time step. - * @ingroup world - * @param dWorldID the identifier of the world. - * @param erp Typical values are in the range 0.1--0.8. The default is 0.2. - */ -ODE_API void dWorldSetERP (dWorldID, dReal erp); - -/** - * @brief Get the error reduction parameter. - * @ingroup world - * @return ERP value - */ -ODE_API dReal dWorldGetERP (dWorldID); - - -/** - * @brief Set the global CFM (constraint force mixing) value. - * @ingroup world - * @param cfm Typical values are in the range @m{10^{-9}} -- 1. - * The default is 10^-5 if single precision is being used, or 10^-10 - * if double precision is being used. - */ -ODE_API void dWorldSetCFM (dWorldID, dReal cfm); - -/** - * @brief Get the constraint force mixing value. - * @ingroup world - * @return CFM value - */ -ODE_API dReal dWorldGetCFM (dWorldID); - - -/** - * @brief Set the world to use shared working memory along with another world. - * - * The worlds allocate working memory internally for simulation stepping. This - * memory is cached among the calls to @c dWordStep and @c dWorldQuickStep. - * Similarly, several worlds can be set up to share this memory caches thus - * reducing overall memory usage by cost of making worlds inappropriate for - * simultaneous simulation in multiple threads. - * - * If null value is passed for @a from_world parameter the world is detached from - * sharing and returns to defaults for working memory, reservation policy and - * memory manager as if just created. This can also be used to enable use of shared - * memory for a world that has already had working memory allocated privately. - * Normally using shared memory after a world has its private working memory allocated - * is prohibited. - * - * Allocation policy used can only increase world's internal reserved memory size - * and never decreases it. @c dWorldCleanupWorkingMemory can be used to release - * working memory for a world in case if number of objects/joint decreases - * significantly in it. - * - * With sharing working memory worlds also automatically share memory reservation - * policy and memory manager. Thus, these parameters need to be customized for - * initial world to be used as sharing source only. - * - * Failure result status means a memory allocation failure. - * - * @param w The world to use the shared memory with. - * @param from_world Null or the world the shared memory is to be used from. - * @returns 1 for success and 0 for failure. - * - * @ingroup world - * @see dWorldCleanupWorkingMemory - * @see dWorldSetStepMemoryReservationPolicy - * @see dWorldSetStepMemoryManager - */ -ODE_API int dWorldUseSharedWorkingMemory(dWorldID w, dWorldID from_world/*=NULL*/); - -/** - * @brief Release internal working memory allocated for world - * - * The worlds allocate working memory internally for simulation stepping. This - * function can be used to free world's internal memory cache in case if number of - * objects/joints in the world decreases significantly. By default, internal - * allocation policy is used to only increase cache size as necessary and never - * decrease it. - * - * If a world shares its working memory with other worlds the cache deletion - * affects all the linked worlds. However the shared status itself remains intact. - * - * The function call does affect neither memory reservation policy nor memory manager. - * - * @param w The world to release working memory for. - * - * @ingroup world - * @see dWorldUseSharedWorkingMemory - * @see dWorldSetStepMemoryReservationPolicy - * @see dWorldSetStepMemoryManager - */ -ODE_API void dWorldCleanupWorkingMemory(dWorldID w); - -#define dWORLDSTEP_RESERVEFACTOR_DEFAULT 1.2f -#define dWORLDSTEP_RESERVESIZE_DEFAULT 65536U - -/** - * @struct dWorldStepReserveInfo - * @brief Memory reservation policy descriptor structure for world stepping functions. - * - * @c struct_size should be assigned the size of the structure. - * - * @c reserve_factor is a quotient that is multiplied by required memory size - * to allocate extra reserve whenever reallocation is needed. - * - * @c reserve_minimum is a minimum size that is checked against whenever reallocation - * is needed to allocate expected working memory minimum at once without extra - * reallocations as number of bodies/joints grows. - * - * @ingroup world - * @see dWorldSetStepMemoryReservationPolicy - */ -typedef struct -{ - unsigned struct_size; - float reserve_factor; // Use float as precision does not matter here - unsigned reserve_minimum; - -} dWorldStepReserveInfo; - -/** - * @brief Set memory reservation policy for world to be used with simulation stepping functions - * - * The function allows to customize reservation policy to be used for internal - * memory which is allocated to aid simulation for a world. By default, values - * of @c dWORLDSTEP_RESERVEFACTOR_DEFAULT and @c dWORLDSTEP_RESERVESIZE_DEFAULT - * are used. - * - * Passing @a policyinfo argument as NULL results in reservation policy being - * reset to defaults as if the world has been just created. The content of - * @a policyinfo structure is copied internally and does not need to remain valid - * after the call returns. - * - * If the world uses working memory sharing, changing memory reservation policy - * affects all the worlds linked together. - * - * Failure result status means a memory allocation failure. - * - * @param w The world to change memory reservation policy for. - * @param policyinfo Null or a pointer to policy descriptor structure. - * @returns 1 for success and 0 for failure. - * - * @ingroup world - * @see dWorldUseSharedWorkingMemory - */ -ODE_API int dWorldSetStepMemoryReservationPolicy(dWorldID w, const dWorldStepReserveInfo *policyinfo/*=NULL*/); - -/** -* @struct dWorldStepMemoryFunctionsInfo -* @brief World stepping memory manager descriptor structure -* -* This structure is intended to define the functions of memory manager to be used -* with world stepping functions. -* -* @c struct_size should be assigned the size of the structure -* -* @c alloc_block is a function to allocate memory block of given size. -* -* @c shrink_block is a function to shrink existing memory block to a smaller size. -* It must preserve the contents of block head while shrinking. The new block size -* is guaranteed to be always less than the existing one. -* -* @c free_block is a function to delete existing memory block. -* -* @ingroup init -* @see dWorldSetStepMemoryManager -*/ -typedef struct -{ - unsigned struct_size; - void *(*alloc_block)(size_t block_size); - void *(*shrink_block)(void *block_pointer, size_t block_current_size, size_t block_smaller_size); - void (*free_block)(void *block_pointer, size_t block_current_size); - -} dWorldStepMemoryFunctionsInfo; - -/** -* @brief Set memory manager for world to be used with simulation stepping functions -* -* The function allows to customize memory manager to be used for internal -* memory allocation during simulation for a world. By default, @c dAlloc/@c dRealloc/@c dFree -* based memory manager is used. -* -* Passing @a memfuncs argument as NULL results in memory manager being -* reset to default one as if the world has been just created. The content of -* @a memfuncs structure is copied internally and does not need to remain valid -* after the call returns. -* -* If the world uses working memory sharing, changing memory manager -* affects all the worlds linked together. -* -* Failure result status means a memory allocation failure. -* -* @param w The world to change memory reservation policy for. -* @param memfuncs Null or a pointer to memory manager descriptor structure. -* @returns 1 for success and 0 for failure. -* -* @ingroup world -* @see dWorldUseSharedWorkingMemory -*/ -ODE_API int dWorldSetStepMemoryManager(dWorldID w, const dWorldStepMemoryFunctionsInfo *memfuncs); - -/** - * @brief Step the world. - * - * This uses a "big matrix" method that takes time on the order of m^3 - * and memory on the order of m^2, where m is the total number of constraint - * rows. For large systems this will use a lot of memory and can be very slow, - * but this is currently the most accurate method. - * - * Failure result status means that the memory allocation has failed for operation. - * In such a case all the objects remain in unchanged state and simulation can be - * retried as soon as more memory is available. - * - * @param w The world to be stepped - * @param stepsize The number of seconds that the simulation has to advance. - * @returns 1 for success and 0 for failure - * - * @ingroup world - */ -ODE_API int dWorldStep (dWorldID w, dReal stepsize); - -/** - * @brief Quick-step the world. - * - * This uses an iterative method that takes time on the order of m*N - * and memory on the order of m, where m is the total number of constraint - * rows N is the number of iterations. - * For large systems this is a lot faster than dWorldStep(), - * but it is less accurate. - * - * QuickStep is great for stacks of objects especially when the - * auto-disable feature is used as well. - * However, it has poor accuracy for near-singular systems. - * Near-singular systems can occur when using high-friction contacts, motors, - * or certain articulated structures. For example, a robot with multiple legs - * sitting on the ground may be near-singular. - * - * There are ways to help overcome QuickStep's inaccuracy problems: - * - * \li Increase CFM. - * \li Reduce the number of contacts in your system (e.g. use the minimum - * number of contacts for the feet of a robot or creature). - * \li Don't use excessive friction in the contacts. - * \li Use contact slip if appropriate - * \li Avoid kinematic loops (however, kinematic loops are inevitable in - * legged creatures). - * \li Don't use excessive motor strength. - * \liUse force-based motors instead of velocity-based motors. - * - * Increasing the number of QuickStep iterations may help a little bit, but - * it is not going to help much if your system is really near singular. - * - * Failure result status means that the memory allocation has failed for operation. - * In such a case all the objects remain in unchanged state and simulation can be - * retried as soon as more memory is available. - * - * @param w The world to be stepped - * @param stepsize The number of seconds that the simulation has to advance. - * @returns 1 for success and 0 for failure - * - * @ingroup world - */ -ODE_API int dWorldQuickStep (dWorldID w, dReal stepsize); - - -/** -* @brief Converts an impulse to a force. -* @ingroup world -* @remarks -* If you want to apply a linear or angular impulse to a rigid body, -* instead of a force or a torque, then you can use this function to convert -* the desired impulse into a force/torque vector before calling the -* BodyAdd... function. -* The current algorithm simply scales the impulse by 1/stepsize, -* where stepsize is the step size for the next step that will be taken. -* This function is given a dWorldID because, in the future, the force -* computation may depend on integrator parameters that are set as -* properties of the world. -*/ -ODE_API void dWorldImpulseToForce -( - dWorldID, dReal stepsize, - dReal ix, dReal iy, dReal iz, dVector3 force - ); - - -/** - * @brief Set the number of iterations that the QuickStep method performs per - * step. - * @ingroup world - * @remarks - * More iterations will give a more accurate solution, but will take - * longer to compute. - * @param num The default is 20 iterations. - */ -ODE_API void dWorldSetQuickStepNumIterations (dWorldID, int num); - - -/** - * @brief Get the number of iterations that the QuickStep method performs per - * step. - * @ingroup world - * @return nr of iterations - */ -ODE_API int dWorldGetQuickStepNumIterations (dWorldID); - -/** - * @brief Set the SOR over-relaxation parameter - * @ingroup world - * @param over_relaxation value to use by SOR - */ -ODE_API void dWorldSetQuickStepW (dWorldID, dReal over_relaxation); - -/** - * @brief Get the SOR over-relaxation parameter - * @ingroup world - * @returns the over-relaxation setting - */ -ODE_API dReal dWorldGetQuickStepW (dWorldID); - -/* World contact parameter functions */ - -/** - * @brief Set the maximum correcting velocity that contacts are allowed - * to generate. - * @ingroup world - * @param vel The default value is infinity (i.e. no limit). - * @remarks - * Reducing this value can help prevent "popping" of deeply embedded objects. - */ -ODE_API void dWorldSetContactMaxCorrectingVel (dWorldID, dReal vel); - -/** - * @brief Get the maximum correcting velocity that contacts are allowed - * to generated. - * @ingroup world - */ -ODE_API dReal dWorldGetContactMaxCorrectingVel (dWorldID); - -/** - * @brief Set the depth of the surface layer around all geometry objects. - * @ingroup world - * @remarks - * Contacts are allowed to sink into the surface layer up to the given - * depth before coming to rest. - * @param depth The default value is zero. - * @remarks - * Increasing this to some small value (e.g. 0.001) can help prevent - * jittering problems due to contacts being repeatedly made and broken. - */ -ODE_API void dWorldSetContactSurfaceLayer (dWorldID, dReal depth); - -/** - * @brief Get the depth of the surface layer around all geometry objects. - * @ingroup world - * @returns the depth - */ -ODE_API dReal dWorldGetContactSurfaceLayer (dWorldID); - - -/** - * @defgroup disable Automatic Enabling and Disabling - * @ingroup world bodies - * - * Every body can be enabled or disabled. Enabled bodies participate in the - * simulation, while disabled bodies are turned off and do not get updated - * during a simulation step. New bodies are always created in the enabled state. - * - * A disabled body that is connected through a joint to an enabled body will be - * automatically re-enabled at the next simulation step. - * - * Disabled bodies do not consume CPU time, therefore to speed up the simulation - * bodies should be disabled when they come to rest. This can be done automatically - * with the auto-disable feature. - * - * If a body has its auto-disable flag turned on, it will automatically disable - * itself when - * @li It has been idle for a given number of simulation steps. - * @li It has also been idle for a given amount of simulation time. - * - * A body is considered to be idle when the magnitudes of both its - * linear average velocity and angular average velocity are below given thresholds. - * The sample size for the average defaults to one and can be disabled by setting - * to zero with - * - * Thus, every body has six auto-disable parameters: an enabled flag, a idle step - * count, an idle time, linear/angular average velocity thresholds, and the - * average samples count. - * - * Newly created bodies get these parameters from world. - */ - -/** - * @brief Get auto disable linear threshold for newly created bodies. - * @ingroup disable - * @return the threshold - */ -ODE_API dReal dWorldGetAutoDisableLinearThreshold (dWorldID); - -/** - * @brief Set auto disable linear threshold for newly created bodies. - * @param linear_threshold default is 0.01 - * @ingroup disable - */ -ODE_API void dWorldSetAutoDisableLinearThreshold (dWorldID, dReal linear_threshold); - -/** - * @brief Get auto disable angular threshold for newly created bodies. - * @ingroup disable - * @return the threshold - */ -ODE_API dReal dWorldGetAutoDisableAngularThreshold (dWorldID); - -/** - * @brief Set auto disable angular threshold for newly created bodies. - * @param linear_threshold default is 0.01 - * @ingroup disable - */ -ODE_API void dWorldSetAutoDisableAngularThreshold (dWorldID, dReal angular_threshold); - -/** - * @brief Get auto disable linear average threshold for newly created bodies. - * @ingroup disable - * @return the threshold - */ -ODE_API dReal dWorldGetAutoDisableLinearAverageThreshold (dWorldID); - -/** - * @brief Set auto disable linear average threshold for newly created bodies. - * @param linear_average_threshold default is 0.01 - * @ingroup disable - */ -ODE_API void dWorldSetAutoDisableLinearAverageThreshold (dWorldID, dReal linear_average_threshold); - -/** - * @brief Get auto disable angular average threshold for newly created bodies. - * @ingroup disable - * @return the threshold - */ -ODE_API dReal dWorldGetAutoDisableAngularAverageThreshold (dWorldID); - -/** - * @brief Set auto disable angular average threshold for newly created bodies. - * @param linear_average_threshold default is 0.01 - * @ingroup disable - */ -ODE_API void dWorldSetAutoDisableAngularAverageThreshold (dWorldID, dReal angular_average_threshold); - -/** - * @brief Get auto disable sample count for newly created bodies. - * @ingroup disable - * @return number of samples used - */ -ODE_API int dWorldGetAutoDisableAverageSamplesCount (dWorldID); - -/** - * @brief Set auto disable average sample count for newly created bodies. - * @ingroup disable - * @param average_samples_count Default is 1, meaning only instantaneous velocity is used. - * Set to zero to disable sampling and thus prevent any body from auto-disabling. - */ -ODE_API void dWorldSetAutoDisableAverageSamplesCount (dWorldID, unsigned int average_samples_count ); - -/** - * @brief Get auto disable steps for newly created bodies. - * @ingroup disable - * @return nr of steps - */ -ODE_API int dWorldGetAutoDisableSteps (dWorldID); - -/** - * @brief Set auto disable steps for newly created bodies. - * @ingroup disable - * @param steps default is 10 - */ -ODE_API void dWorldSetAutoDisableSteps (dWorldID, int steps); - -/** - * @brief Get auto disable time for newly created bodies. - * @ingroup disable - * @return nr of seconds - */ -ODE_API dReal dWorldGetAutoDisableTime (dWorldID); - -/** - * @brief Set auto disable time for newly created bodies. - * @ingroup disable - * @param time default is 0 seconds - */ -ODE_API void dWorldSetAutoDisableTime (dWorldID, dReal time); - -/** - * @brief Get auto disable flag for newly created bodies. - * @ingroup disable - * @return 0 or 1 - */ -ODE_API int dWorldGetAutoDisableFlag (dWorldID); - -/** - * @brief Set auto disable flag for newly created bodies. - * @ingroup disable - * @param do_auto_disable default is false. - */ -ODE_API void dWorldSetAutoDisableFlag (dWorldID, int do_auto_disable); - - -/** - * @defgroup damping Damping - * @ingroup bodies world - * - * Damping serves two purposes: reduce simulation instability, and to allow - * the bodies to come to rest (and possibly auto-disabling them). - * - * Bodies are constructed using the world's current damping parameters. Setting - * the scales to 0 disables the damping. - * - * Here is how it is done: after every time step linear and angular - * velocities are tested against the corresponding thresholds. If they - * are above, they are multiplied by (1 - scale). So a negative scale value - * will actually increase the speed, and values greater than one will - * make the object oscillate every step; both can make the simulation unstable. - * - * To disable damping just set the damping scale to zero. - * - * You can also limit the maximum angular velocity. In contrast to the damping - * functions, the angular velocity is affected before the body is moved. - * This means that it will introduce errors in joints that are forcing the body - * to rotate too fast. Some bodies have naturally high angular velocities - * (like cars' wheels), so you may want to give them a very high (like the default, - * dInfinity) limit. - * - * @note The velocities are damped after the stepper function has moved the - * object. Otherwise the damping could introduce errors in joints. First the - * joint constraints are processed by the stepper (moving the body), then - * the damping is applied. - * - * @note The damping happens right after the moved callback is called; this way - * it still possible use the exact velocities the body has acquired during the - * step. You can even use the callback to create your own customized damping. - */ - -/** - * @brief Get the world's linear damping threshold. - * @ingroup damping - */ -ODE_API dReal dWorldGetLinearDampingThreshold (dWorldID w); - -/** - * @brief Set the world's linear damping threshold. - * @param threshold The damping won't be applied if the linear speed is - * below this threshold. Default is 0.01. - * @ingroup damping - */ -ODE_API void dWorldSetLinearDampingThreshold(dWorldID w, dReal threshold); - -/** - * @brief Get the world's angular damping threshold. - * @ingroup damping - */ -ODE_API dReal dWorldGetAngularDampingThreshold (dWorldID w); - -/** - * @brief Set the world's angular damping threshold. - * @param threshold The damping won't be applied if the angular speed is - * below this threshold. Default is 0.01. - * @ingroup damping - */ -ODE_API void dWorldSetAngularDampingThreshold(dWorldID w, dReal threshold); - -/** - * @brief Get the world's linear damping scale. - * @ingroup damping - */ -ODE_API dReal dWorldGetLinearDamping (dWorldID w); - -/** - * @brief Set the world's linear damping scale. - * @param scale The linear damping scale that is to be applied to bodies. - * Default is 0 (no damping). Should be in the interval [0, 1]. - * @ingroup damping - */ -ODE_API void dWorldSetLinearDamping (dWorldID w, dReal scale); - -/** - * @brief Get the world's angular damping scale. - * @ingroup damping - */ -ODE_API dReal dWorldGetAngularDamping (dWorldID w); - -/** - * @brief Set the world's angular damping scale. - * @param scale The angular damping scale that is to be applied to bodies. - * Default is 0 (no damping). Should be in the interval [0, 1]. - * @ingroup damping - */ -ODE_API void dWorldSetAngularDamping(dWorldID w, dReal scale); - -/** - * @brief Convenience function to set body linear and angular scales. - * @param linear_scale The linear damping scale that is to be applied to bodies. - * @param angular_scale The angular damping scale that is to be applied to bodies. - * @ingroup damping - */ -ODE_API void dWorldSetDamping(dWorldID w, - dReal linear_scale, - dReal angular_scale); - -/** - * @brief Get the default maximum angular speed. - * @ingroup damping - * @sa dBodyGetMaxAngularSpeed() - */ -ODE_API dReal dWorldGetMaxAngularSpeed (dWorldID w); - - -/** - * @brief Set the default maximum angular speed for new bodies. - * @ingroup damping - * @sa dBodySetMaxAngularSpeed() - */ -ODE_API void dWorldSetMaxAngularSpeed (dWorldID w, dReal max_speed); - - - -/** - * @defgroup bodies Rigid Bodies - * - * A rigid body has various properties from the point of view of the - * simulation. Some properties change over time: - * - * @li Position vector (x,y,z) of the body's point of reference. - * Currently the point of reference must correspond to the body's center of mass. - * @li Linear velocity of the point of reference, a vector (vx,vy,vz). - * @li Orientation of a body, represented by a quaternion (qs,qx,qy,qz) or - * a 3x3 rotation matrix. - * @li Angular velocity vector (wx,wy,wz) which describes how the orientation - * changes over time. - * - * Other body properties are usually constant over time: - * - * @li Mass of the body. - * @li Position of the center of mass with respect to the point of reference. - * In the current implementation the center of mass and the point of - * reference must coincide. - * @li Inertia matrix. This is a 3x3 matrix that describes how the body's mass - * is distributed around the center of mass. Conceptually each body has an - * x-y-z coordinate frame embedded in it that moves and rotates with the body. - * - * The origin of this coordinate frame is the body's point of reference. Some values - * in ODE (vectors, matrices etc) are relative to the body coordinate frame, and others - * are relative to the global coordinate frame. - * - * Note that the shape of a rigid body is not a dynamical property (except insofar as - * it influences the various mass properties). It is only collision detection that cares - * about the detailed shape of the body. - */ - - -/** - * @brief Get auto disable linear average threshold. - * @ingroup bodies disable - * @return the threshold - */ -ODE_API dReal dBodyGetAutoDisableLinearThreshold (dBodyID); - -/** - * @brief Set auto disable linear average threshold. - * @ingroup bodies disable - * @return the threshold - */ -ODE_API void dBodySetAutoDisableLinearThreshold (dBodyID, dReal linear_average_threshold); - -/** - * @brief Get auto disable angular average threshold. - * @ingroup bodies disable - * @return the threshold - */ -ODE_API dReal dBodyGetAutoDisableAngularThreshold (dBodyID); - -/** - * @brief Set auto disable angular average threshold. - * @ingroup bodies disable - * @return the threshold - */ -ODE_API void dBodySetAutoDisableAngularThreshold (dBodyID, dReal angular_average_threshold); - -/** - * @brief Get auto disable average size (samples count). - * @ingroup bodies disable - * @return the nr of steps/size. - */ -ODE_API int dBodyGetAutoDisableAverageSamplesCount (dBodyID); - -/** - * @brief Set auto disable average buffer size (average steps). - * @ingroup bodies disable - * @param average_samples_count the nr of samples to review. - */ -ODE_API void dBodySetAutoDisableAverageSamplesCount (dBodyID, unsigned int average_samples_count); - - -/** - * @brief Get auto steps a body must be thought of as idle to disable - * @ingroup bodies disable - * @return the nr of steps - */ -ODE_API int dBodyGetAutoDisableSteps (dBodyID); - -/** - * @brief Set auto disable steps. - * @ingroup bodies disable - * @param steps the nr of steps. - */ -ODE_API void dBodySetAutoDisableSteps (dBodyID, int steps); - -/** - * @brief Get auto disable time. - * @ingroup bodies disable - * @return nr of seconds - */ -ODE_API dReal dBodyGetAutoDisableTime (dBodyID); - -/** - * @brief Set auto disable time. - * @ingroup bodies disable - * @param time nr of seconds. - */ -ODE_API void dBodySetAutoDisableTime (dBodyID, dReal time); - -/** - * @brief Get auto disable flag. - * @ingroup bodies disable - * @return 0 or 1 - */ -ODE_API int dBodyGetAutoDisableFlag (dBodyID); - -/** - * @brief Set auto disable flag. - * @ingroup bodies disable - * @param do_auto_disable 0 or 1 - */ -ODE_API void dBodySetAutoDisableFlag (dBodyID, int do_auto_disable); - -/** - * @brief Set auto disable defaults. - * @remarks - * Set the values for the body to those set as default for the world. - * @ingroup bodies disable - */ -ODE_API void dBodySetAutoDisableDefaults (dBodyID); - - -/** - * @brief Retrieves the world attached to te given body. - * @remarks - * - * @ingroup bodies - */ -ODE_API dWorldID dBodyGetWorld (dBodyID); - -/** - * @brief Create a body in given world. - * @remarks - * Default mass parameters are at position (0,0,0). - * @ingroup bodies - */ -ODE_API dBodyID dBodyCreate (dWorldID); - -/** - * @brief Destroy a body. - * @remarks - * All joints that are attached to this body will be put into limbo: - * i.e. unattached and not affecting the simulation, but they will NOT be - * deleted. - * @ingroup bodies - */ -ODE_API void dBodyDestroy (dBodyID); - -/** - * @brief Set the body's user-data pointer. - * @ingroup bodies - * @param data arbitraty pointer - */ -ODE_API void dBodySetData (dBodyID, void *data); - -/** - * @brief Get the body's user-data pointer. - * @ingroup bodies - * @return a pointer to the user's data. - */ -ODE_API void *dBodyGetData (dBodyID); - -/** - * @brief Set position of a body. - * @remarks - * After setting, the outcome of the simulation is undefined - * if the new configuration is inconsistent with the joints/constraints - * that are present. - * @ingroup bodies - */ -ODE_API void dBodySetPosition (dBodyID, dReal x, dReal y, dReal z); - -/** - * @brief Set the orientation of a body. - * @ingroup bodies - * @remarks - * After setting, the outcome of the simulation is undefined - * if the new configuration is inconsistent with the joints/constraints - * that are present. - */ -ODE_API void dBodySetRotation (dBodyID, const dMatrix3 R); - -/** - * @brief Set the orientation of a body. - * @ingroup bodies - * @remarks - * After setting, the outcome of the simulation is undefined - * if the new configuration is inconsistent with the joints/constraints - * that are present. - */ -ODE_API void dBodySetQuaternion (dBodyID, const dQuaternion q); - -/** - * @brief Set the linear velocity of a body. - * @ingroup bodies - */ -ODE_API void dBodySetLinearVel (dBodyID, dReal x, dReal y, dReal z); - -/** - * @brief Set the angular velocity of a body. - * @ingroup bodies - */ -ODE_API void dBodySetAngularVel (dBodyID, dReal x, dReal y, dReal z); - -/** - * @brief Get the position of a body. - * @ingroup bodies - * @remarks - * When getting, the returned values are pointers to internal data structures, - * so the vectors are valid until any changes are made to the rigid body - * system structure. - * @sa dBodyCopyPosition - */ -ODE_API const dReal * dBodyGetPosition (dBodyID); - - -/** - * @brief Copy the position of a body into a vector. - * @ingroup bodies - * @param body the body to query - * @param pos a copy of the body position - * @sa dBodyGetPosition - */ -ODE_API void dBodyCopyPosition (dBodyID body, dVector3 pos); - - -/** - * @brief Get the rotation of a body. - * @ingroup bodies - * @return pointer to a 4x3 rotation matrix. - */ -ODE_API const dReal * dBodyGetRotation (dBodyID); - - -/** - * @brief Copy the rotation of a body. - * @ingroup bodies - * @param body the body to query - * @param R a copy of the rotation matrix - * @sa dBodyGetRotation - */ -ODE_API void dBodyCopyRotation (dBodyID, dMatrix3 R); - - -/** - * @brief Get the rotation of a body. - * @ingroup bodies - * @return pointer to 4 scalars that represent the quaternion. - */ -ODE_API const dReal * dBodyGetQuaternion (dBodyID); - - -/** - * @brief Copy the orientation of a body into a quaternion. - * @ingroup bodies - * @param body the body to query - * @param quat a copy of the orientation quaternion - * @sa dBodyGetQuaternion - */ -ODE_API void dBodyCopyQuaternion(dBodyID body, dQuaternion quat); - - -/** - * @brief Get the linear velocity of a body. - * @ingroup bodies - */ -ODE_API const dReal * dBodyGetLinearVel (dBodyID); - -/** - * @brief Get the angular velocity of a body. - * @ingroup bodies - */ -ODE_API const dReal * dBodyGetAngularVel (dBodyID); - -/** - * @brief Set the mass of a body. - * @ingroup bodies - */ -ODE_API void dBodySetMass (dBodyID, const dMass *mass); - -/** - * @brief Get the mass of a body. - * @ingroup bodies - */ -ODE_API void dBodyGetMass (dBodyID, dMass *mass); - -/** - * @brief Add force at centre of mass of body in absolute coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddForce (dBodyID, dReal fx, dReal fy, dReal fz); - -/** - * @brief Add torque at centre of mass of body in absolute coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddTorque (dBodyID, dReal fx, dReal fy, dReal fz); - -/** - * @brief Add force at centre of mass of body in coordinates relative to body. - * @ingroup bodies - */ -ODE_API void dBodyAddRelForce (dBodyID, dReal fx, dReal fy, dReal fz); - -/** - * @brief Add torque at centre of mass of body in coordinates relative to body. - * @ingroup bodies - */ -ODE_API void dBodyAddRelTorque (dBodyID, dReal fx, dReal fy, dReal fz); - -/** - * @brief Add force at specified point in body in global coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); -/** - * @brief Add force at specified point in body in local coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); -/** - * @brief Add force at specified point in body in global coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddRelForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); -/** - * @brief Add force at specified point in body in local coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddRelForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); - -/** - * @brief Return the current accumulated force vector. - * @return points to an array of 3 reals. - * @remarks - * The returned values are pointers to internal data structures, so - * the vectors are only valid until any changes are made to the rigid - * body system. - * @ingroup bodies - */ -ODE_API const dReal * dBodyGetForce (dBodyID); - -/** - * @brief Return the current accumulated torque vector. - * @return points to an array of 3 reals. - * @remarks - * The returned values are pointers to internal data structures, so - * the vectors are only valid until any changes are made to the rigid - * body system. - * @ingroup bodies - */ -ODE_API const dReal * dBodyGetTorque (dBodyID); - -/** - * @brief Set the body force accumulation vector. - * @remarks - * This is mostly useful to zero the force and torque for deactivated bodies - * before they are reactivated, in the case where the force-adding functions - * were called on them while they were deactivated. - * @ingroup bodies - */ -ODE_API void dBodySetForce (dBodyID b, dReal x, dReal y, dReal z); - -/** - * @brief Set the body torque accumulation vector. - * @remarks - * This is mostly useful to zero the force and torque for deactivated bodies - * before they are reactivated, in the case where the force-adding functions - * were called on them while they were deactivated. - * @ingroup bodies - */ -ODE_API void dBodySetTorque (dBodyID b, dReal x, dReal y, dReal z); - -/** - * @brief Get world position of a relative point on body. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyGetRelPointPos -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Get velocity vector in global coords of a relative point on body. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyGetRelPointVel -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Get velocity vector in global coords of a globally - * specified point on a body. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyGetPointVel -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief takes a point in global coordinates and returns - * the point's position in body-relative coordinates. - * @remarks - * This is the inverse of dBodyGetRelPointPos() - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyGetPosRelPoint -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Convert from local to world coordinates. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyVectorToWorld -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Convert from world to local coordinates. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyVectorFromWorld -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief controls the way a body's orientation is updated at each timestep. - * @ingroup bodies - * @param mode can be 0 or 1: - * \li 0: An ``infinitesimal'' orientation update is used. - * This is fast to compute, but it can occasionally cause inaccuracies - * for bodies that are rotating at high speed, especially when those - * bodies are joined to other bodies. - * This is the default for every new body that is created. - * \li 1: A ``finite'' orientation update is used. - * This is more costly to compute, but will be more accurate for high - * speed rotations. - * @remarks - * Note however that high speed rotations can result in many types of - * error in a simulation, and the finite mode will only fix one of those - * sources of error. - */ -ODE_API void dBodySetFiniteRotationMode (dBodyID, int mode); - -/** - * @brief sets the finite rotation axis for a body. - * @ingroup bodies - * @remarks - * This is axis only has meaning when the finite rotation mode is set - * If this axis is zero (0,0,0), full finite rotations are performed on - * the body. - * If this axis is nonzero, the body is rotated by performing a partial finite - * rotation along the axis direction followed by an infinitesimal rotation - * along an orthogonal direction. - * @remarks - * This can be useful to alleviate certain sources of error caused by quickly - * spinning bodies. For example, if a car wheel is rotating at high speed - * you can call this function with the wheel's hinge axis as the argument to - * try and improve its behavior. - */ -ODE_API void dBodySetFiniteRotationAxis (dBodyID, dReal x, dReal y, dReal z); - -/** - * @brief Get the way a body's orientation is updated each timestep. - * @ingroup bodies - * @return the mode 0 (infitesimal) or 1 (finite). - */ -ODE_API int dBodyGetFiniteRotationMode (dBodyID); - -/** - * @brief Get the finite rotation axis. - * @param result will contain the axis. - * @ingroup bodies - */ -ODE_API void dBodyGetFiniteRotationAxis (dBodyID, dVector3 result); - -/** - * @brief Get the number of joints that are attached to this body. - * @ingroup bodies - * @return nr of joints - */ -ODE_API int dBodyGetNumJoints (dBodyID b); - -/** - * @brief Return a joint attached to this body, given by index. - * @ingroup bodies - * @param index valid range is 0 to n-1 where n is the value returned by - * dBodyGetNumJoints(). - */ -ODE_API dJointID dBodyGetJoint (dBodyID, int index); - - - - -/** - * @brief Set rigid body to dynamic state (default). - * @param dBodyID identification of body. - * @ingroup bodies - */ -ODE_API void dBodySetDynamic (dBodyID); - -/** - * @brief Set rigid body to kinematic state. - * When in kinematic state the body isn't simulated as a dynamic - * body (it's "unstoppable", doesn't respond to forces), - * but can still affect dynamic bodies (e.g. in joints). - * Kinematic bodies can be controlled by position and velocity. - * @note A kinematic body has infinite mass. If you set its mass - * to something else, it loses the kinematic state and behaves - * as a normal dynamic body. - * @param dBodyID identification of body. - * @ingroup bodies - */ -ODE_API void dBodySetKinematic (dBodyID); - -/** - * @brief Check wether a body is in kinematic state. - * @ingroup bodies - * @return 1 if a body is kinematic or 0 if it is dynamic. - */ -ODE_API int dBodyIsKinematic (dBodyID); - -/** - * @brief Manually enable a body. - * @param dBodyID identification of body. - * @ingroup bodies - */ -ODE_API void dBodyEnable (dBodyID); - -/** - * @brief Manually disable a body. - * @ingroup bodies - * @remarks - * A disabled body that is connected through a joint to an enabled body will - * be automatically re-enabled at the next simulation step. - */ -ODE_API void dBodyDisable (dBodyID); - -/** - * @brief Check wether a body is enabled. - * @ingroup bodies - * @return 1 if a body is currently enabled or 0 if it is disabled. - */ -ODE_API int dBodyIsEnabled (dBodyID); - -/** - * @brief Set whether the body is influenced by the world's gravity or not. - * @ingroup bodies - * @param mode when nonzero gravity affects this body. - * @remarks - * Newly created bodies are always influenced by the world's gravity. - */ -ODE_API void dBodySetGravityMode (dBodyID b, int mode); - -/** - * @brief Get whether the body is influenced by the world's gravity or not. - * @ingroup bodies - * @return nonzero means gravity affects this body. - */ -ODE_API int dBodyGetGravityMode (dBodyID b); - -/** - * @brief Set the 'moved' callback of a body. - * - * Whenever a body has its position or rotation changed during the - * timestep, the callback will be called (with body as the argument). - * Use it to know which body may need an update in an external - * structure (like a 3D engine). - * - * @param b the body that needs to be watched. - * @param callback the callback to be invoked when the body moves. Set to zero - * to disable. - * @ingroup bodies - */ -ODE_API void dBodySetMovedCallback(dBodyID b, void (*callback)(dBodyID)); - - -/** - * @brief Return the first geom associated with the body. - * - * You can traverse through the geoms by repeatedly calling - * dBodyGetNextGeom(). - * - * @return the first geom attached to this body, or 0. - * @ingroup bodies - */ -ODE_API dGeomID dBodyGetFirstGeom (dBodyID b); - - -/** - * @brief returns the next geom associated with the same body. - * @param g a geom attached to some body. - * @return the next geom attached to the same body, or 0. - * @sa dBodyGetFirstGeom - * @ingroup bodies - */ -ODE_API dGeomID dBodyGetNextGeom (dGeomID g); - - -/** - * @brief Resets the damping settings to the current world's settings. - * @ingroup bodies damping - */ -ODE_API void dBodySetDampingDefaults(dBodyID b); - -/** - * @brief Get the body's linear damping scale. - * @ingroup bodies damping - */ -ODE_API dReal dBodyGetLinearDamping (dBodyID b); - -/** - * @brief Set the body's linear damping scale. - * @param scale The linear damping scale. Should be in the interval [0, 1]. - * @ingroup bodies damping - * @remarks From now on the body will not use the world's linear damping - * scale until dBodySetDampingDefaults() is called. - * @sa dBodySetDampingDefaults() - */ -ODE_API void dBodySetLinearDamping(dBodyID b, dReal scale); - -/** - * @brief Get the body's angular damping scale. - * @ingroup bodies damping - * @remarks If the body's angular damping scale was not set, this function - * returns the world's angular damping scale. - */ -ODE_API dReal dBodyGetAngularDamping (dBodyID b); - -/** - * @brief Set the body's angular damping scale. - * @param scale The angular damping scale. Should be in the interval [0, 1]. - * @ingroup bodies damping - * @remarks From now on the body will not use the world's angular damping - * scale until dBodyResetAngularDamping() is called. - * @sa dBodyResetAngularDamping() - */ -ODE_API void dBodySetAngularDamping(dBodyID b, dReal scale); - -/** - * @brief Convenience function to set linear and angular scales at once. - * @param linear_scale The linear damping scale. Should be in the interval [0, 1]. - * @param angular_scale The angular damping scale. Should be in the interval [0, 1]. - * @ingroup bodies damping - * @sa dBodySetLinearDamping() dBodySetAngularDamping() - */ -ODE_API void dBodySetDamping(dBodyID b, dReal linear_scale, dReal angular_scale); - -/** - * @brief Get the body's linear damping threshold. - * @ingroup bodies damping - */ -ODE_API dReal dBodyGetLinearDampingThreshold (dBodyID b); - -/** - * @brief Set the body's linear damping threshold. - * @param threshold The linear threshold to be used. Damping - * is only applied if the linear speed is above this limit. - * @ingroup bodies damping - */ -ODE_API void dBodySetLinearDampingThreshold(dBodyID b, dReal threshold); - -/** - * @brief Get the body's angular damping threshold. - * @ingroup bodies damping - */ -ODE_API dReal dBodyGetAngularDampingThreshold (dBodyID b); - -/** - * @brief Set the body's angular damping threshold. - * @param threshold The angular threshold to be used. Damping is - * only used if the angular speed is above this limit. - * @ingroup bodies damping - */ -ODE_API void dBodySetAngularDampingThreshold(dBodyID b, dReal threshold); - -/** - * @brief Get the body's maximum angular speed. - * @ingroup damping bodies - * @sa dWorldGetMaxAngularSpeed() - */ -ODE_API dReal dBodyGetMaxAngularSpeed (dBodyID b); - -/** - * @brief Set the body's maximum angular speed. - * @ingroup damping bodies - * @sa dWorldSetMaxAngularSpeed() dBodyResetMaxAngularSpeed() - * The default value is dInfinity, but it's a good idea to limit - * it at less than 500 if the body has the gyroscopic term - * enabled. - */ -ODE_API void dBodySetMaxAngularSpeed(dBodyID b, dReal max_speed); - - - -/** - * @brief Get the body's gyroscopic state. - * - * @return nonzero if gyroscopic term computation is enabled (default), - * zero otherwise. - * @ingroup bodies - */ -ODE_API int dBodyGetGyroscopicMode(dBodyID b); - - -/** - * @brief Enable/disable the body's gyroscopic term. - * - * Disabling the gyroscopic term of a body usually improves - * stability. It also helps turning spining objects, like cars' - * wheels. - * - * @param enabled nonzero (default) to enable gyroscopic term, 0 - * to disable. - * @ingroup bodies - */ -ODE_API void dBodySetGyroscopicMode(dBodyID b, int enabled); - - - - -/** - * @defgroup joints Joints - * - * In real life a joint is something like a hinge, that is used to connect two - * objects. - * In ODE a joint is very similar: It is a relationship that is enforced between - * two bodies so that they can only have certain positions and orientations - * relative to each other. - * This relationship is called a constraint -- the words joint and - * constraint are often used interchangeably. - * - * A joint has a set of parameters that can be set. These include: - * - * - * \li dParamLoStop Low stop angle or position. Setting this to - * -dInfinity (the default value) turns off the low stop. - * For rotational joints, this stop must be greater than -pi to be - * effective. - * \li dParamHiStop High stop angle or position. Setting this to - * dInfinity (the default value) turns off the high stop. - * For rotational joints, this stop must be less than pi to be - * effective. - * If the high stop is less than the low stop then both stops will - * be ineffective. - * \li dParamVel Desired motor velocity (this will be an angular or - * linear velocity). - * \li dParamFMax The maximum force or torque that the motor will use to - * achieve the desired velocity. - * This must always be greater than or equal to zero. - * Setting this to zero (the default value) turns off the motor. - * \li dParamFudgeFactor The current joint stop/motor implementation has - * a small problem: - * when the joint is at one stop and the motor is set to move it away - * from the stop, too much force may be applied for one time step, - * causing a ``jumping'' motion. - * This fudge factor is used to scale this excess force. - * It should have a value between zero and one (the default value). - * If the jumping motion is too visible in a joint, the value can be - * reduced. - * Making this value too small can prevent the motor from being able to - * move the joint away from a stop. - * \li dParamBounce The bouncyness of the stops. - * This is a restitution parameter in the range 0..1. - * 0 means the stops are not bouncy at all, 1 means maximum bouncyness. - * \li dParamCFM The constraint force mixing (CFM) value used when not - * at a stop. - * \li dParamStopERP The error reduction parameter (ERP) used by the - * stops. - * \li dParamStopCFM The constraint force mixing (CFM) value used by the - * stops. Together with the ERP value this can be used to get spongy or - * soft stops. - * Note that this is intended for unpowered joints, it does not really - * work as expected when a powered joint reaches its limit. - * \li dParamSuspensionERP Suspension error reduction parameter (ERP). - * Currently this is only implemented on the hinge-2 joint. - * \li dParamSuspensionCFM Suspension constraint force mixing (CFM) value. - * Currently this is only implemented on the hinge-2 joint. - * - * If a particular parameter is not implemented by a given joint, setting it - * will have no effect. - * These parameter names can be optionally followed by a digit (2 or 3) - * to indicate the second or third set of parameters, e.g. for the second axis - * in a hinge-2 joint, or the third axis in an AMotor joint. - */ - - -/** - * @brief Create a new joint of the ball type. - * @ingroup joints - * @remarks - * The joint is initially in "limbo" (i.e. it has no effect on the simulation) - * because it does not connect to any bodies. - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateBall (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the hinge type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateHinge (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the slider type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateSlider (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the contact type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateContact (dWorldID, dJointGroupID, const dContact *); - -/** - * @brief Create a new joint of the hinge2 type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateHinge2 (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the universal type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateUniversal (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the PR (Prismatic and Rotoide) type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreatePR (dWorldID, dJointGroupID); - - /** - * @brief Create a new joint of the PU (Prismatic and Universal) type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ - ODE_API dJointID dJointCreatePU (dWorldID, dJointGroupID); - - /** - * @brief Create a new joint of the Piston type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given - * joint group. - */ - ODE_API dJointID dJointCreatePiston (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the fixed type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateFixed (dWorldID, dJointGroupID); - -ODE_API dJointID dJointCreateNull (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the A-motor type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateAMotor (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the L-motor type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateLMotor (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the plane-2d type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreatePlane2D (dWorldID, dJointGroupID); - -/** - * @brief Destroy a joint. - * @ingroup joints - * - * disconnects it from its attached bodies and removing it from the world. - * However, if the joint is a member of a group then this function has no - * effect - to destroy that joint the group must be emptied or destroyed. - */ -ODE_API void dJointDestroy (dJointID); - - -/** - * @brief Create a joint group - * @ingroup joints - * @param max_size deprecated. Set to 0. - */ -ODE_API dJointGroupID dJointGroupCreate (int max_size); - -/** - * @brief Destroy a joint group. - * @ingroup joints - * - * All joints in the joint group will be destroyed. - */ -ODE_API void dJointGroupDestroy (dJointGroupID); - -/** - * @brief Empty a joint group. - * @ingroup joints - * - * All joints in the joint group will be destroyed, - * but the joint group itself will not be destroyed. - */ -ODE_API void dJointGroupEmpty (dJointGroupID); - -/** - * @brief Return the number of bodies attached to the joint - * @ingroup joints - */ -ODE_API int dJointGetNumBodies(dJointID); - -/** - * @brief Attach the joint to some new bodies. - * @ingroup joints - * - * If the joint is already attached, it will be detached from the old bodies - * first. - * To attach this joint to only one body, set body1 or body2 to zero - a zero - * body refers to the static environment. - * Setting both bodies to zero puts the joint into "limbo", i.e. it will - * have no effect on the simulation. - * @remarks - * Some joints, like hinge-2 need to be attached to two bodies to work. - */ -ODE_API void dJointAttach (dJointID, dBodyID body1, dBodyID body2); - -/** - * @brief Manually enable a joint. - * @param dJointID identification of joint. - * @ingroup joints - */ -ODE_API void dJointEnable (dJointID); - -/** - * @brief Manually disable a joint. - * @ingroup joints - * @remarks - * A disabled joint will not affect the simulation, but will maintain the anchors and - * axes so it can be enabled later. - */ -ODE_API void dJointDisable (dJointID); - -/** - * @brief Check wether a joint is enabled. - * @ingroup joints - * @return 1 if a joint is currently enabled or 0 if it is disabled. - */ -ODE_API int dJointIsEnabled (dJointID); - -/** - * @brief Set the user-data pointer - * @ingroup joints - */ -ODE_API void dJointSetData (dJointID, void *data); - -/** - * @brief Get the user-data pointer - * @ingroup joints - */ -ODE_API void *dJointGetData (dJointID); - -/** - * @brief Get the type of the joint - * @ingroup joints - * @return the type, being one of these: - * \li dJointTypeBall - * \li dJointTypeHinge - * \li dJointTypeSlider - * \li dJointTypeContact - * \li dJointTypeUniversal - * \li dJointTypeHinge2 - * \li dJointTypeFixed - * \li dJointTypeNull - * \li dJointTypeAMotor - * \li dJointTypeLMotor - * \li dJointTypePlane2D - * \li dJointTypePR - * \li dJointTypePU - * \li dJointTypePiston - */ -ODE_API dJointType dJointGetType (dJointID); - -/** - * @brief Return the bodies that this joint connects. - * @ingroup joints - * @param index return the first (0) or second (1) body. - * @remarks - * If one of these returned body IDs is zero, the joint connects the other body - * to the static environment. - * If both body IDs are zero, the joint is in ``limbo'' and has no effect on - * the simulation. - */ -ODE_API dBodyID dJointGetBody (dJointID, int index); - -/** - * @brief Sets the datastructure that is to receive the feedback. - * - * The feedback can be used by the user, so that it is known how - * much force an individual joint exerts. - * @ingroup joints - */ -ODE_API void dJointSetFeedback (dJointID, dJointFeedback *); - -/** - * @brief Gets the datastructure that is to receive the feedback. - * @ingroup joints - */ -ODE_API dJointFeedback *dJointGetFeedback (dJointID); - -/** - * @brief Set the joint anchor point. - * @ingroup joints - * - * The joint will try to keep this point on each body - * together. The input is specified in world coordinates. - */ -ODE_API void dJointSetBallAnchor (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief Set the joint anchor point. - * @ingroup joints - */ -ODE_API void dJointSetBallAnchor2 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief Param setting for Ball joints - * @ingroup joints - */ -ODE_API void dJointSetBallParam (dJointID, int parameter, dReal value); - -/** - * @brief Set hinge anchor parameter. - * @ingroup joints - */ -ODE_API void dJointSetHingeAnchor (dJointID, dReal x, dReal y, dReal z); - -ODE_API void dJointSetHingeAnchorDelta (dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); - -/** - * @brief Set hinge axis. - * @ingroup joints - */ -ODE_API void dJointSetHingeAxis (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief Set the Hinge axis as if the 2 bodies were already at angle appart. - * @ingroup joints - * - * This function initialize the Axis and the relative orientation of each body - * as if body1 was rotated around the axis by the angle value. \br - * Ex: - *
- * dJointSetHingeAxis(jId, 1, 0, 0);
- * // If you request the position you will have: dJointGetHingeAngle(jId) == 0
- * dJointSetHingeAxisDelta(jId, 1, 0, 0, 0.23);
- * // If you request the position you will have: dJointGetHingeAngle(jId) == 0.23
- * 
- - * @param j The Hinge joint ID for which the axis will be set - * @param x The X component of the axis in world frame - * @param y The Y component of the axis in world frame - * @param z The Z component of the axis in world frame - * @param angle The angle for the offset of the relative orientation. - * As if body1 was rotated by angle when the Axis was set (see below). - * The rotation is around the new Hinge axis. - * - * @note Usually the function dJointSetHingeAxis set the current position of body1 - * and body2 as the zero angle position. This function set the current position - * as the if the 2 bodies where \b angle appart. - * @warning Calling dJointSetHingeAnchor or dJointSetHingeAxis will reset the "zero" - * angle position. - */ -ODE_API void dJointSetHingeAxisOffset (dJointID j, dReal x, dReal y, dReal z, dReal angle); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetHingeParam (dJointID, int parameter, dReal value); - -/** - * @brief Applies the torque about the hinge axis. - * - * That is, it applies a torque with specified magnitude in the direction - * of the hinge axis, to body 1, and with the same magnitude but in opposite - * direction to body 2. This function is just a wrapper for dBodyAddTorque()} - * @ingroup joints - */ -ODE_API void dJointAddHingeTorque(dJointID joint, dReal torque); - -/** - * @brief set the joint axis - * @ingroup joints - */ -ODE_API void dJointSetSliderAxis (dJointID, dReal x, dReal y, dReal z); - -/** - * @ingroup joints - */ -ODE_API void dJointSetSliderAxisDelta (dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetSliderParam (dJointID, int parameter, dReal value); - -/** - * @brief Applies the given force in the slider's direction. - * - * That is, it applies a force with specified magnitude, in the direction of - * slider's axis, to body1, and with the same magnitude but opposite - * direction to body2. This function is just a wrapper for dBodyAddForce(). - * @ingroup joints - */ -ODE_API void dJointAddSliderForce(dJointID joint, dReal force); - -/** - * @brief set anchor - * @ingroup joints - */ -ODE_API void dJointSetHinge2Anchor (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetHinge2Axis1 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetHinge2Axis2 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetHinge2Param (dJointID, int parameter, dReal value); - -/** - * @brief Applies torque1 about the hinge2's axis 1, torque2 about the - * hinge2's axis 2. - * @remarks This function is just a wrapper for dBodyAddTorque(). - * @ingroup joints - */ -ODE_API void dJointAddHinge2Torques(dJointID joint, dReal torque1, dReal torque2); - -/** - * @brief set anchor - * @ingroup joints - */ -ODE_API void dJointSetUniversalAnchor (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetUniversalAxis1 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief Set the Universal axis1 as if the 2 bodies were already at - * offset1 and offset2 appart with respect to axis1 and axis2. - * @ingroup joints - * - * This function initialize the axis1 and the relative orientation of - * each body as if body1 was rotated around the new axis1 by the offset1 - * value and as if body2 was rotated around the axis2 by offset2. \br - * Ex: -*
- * dJointSetHuniversalAxis1(jId, 1, 0, 0);
- * // If you request the position you will have: dJointGetUniversalAngle1(jId) == 0
- * // If you request the position you will have: dJointGetUniversalAngle2(jId) == 0
- * dJointSetHuniversalAxis1Offset(jId, 1, 0, 0, 0.2, 0.17);
- * // If you request the position you will have: dJointGetUniversalAngle1(jId) == 0.2
- * // If you request the position you will have: dJointGetUniversalAngle2(jId) == 0.17
- * 
- * - * @param j The Hinge joint ID for which the axis will be set - * @param x The X component of the axis in world frame - * @param y The Y component of the axis in world frame - * @param z The Z component of the axis in world frame - * @param angle The angle for the offset of the relative orientation. - * As if body1 was rotated by angle when the Axis was set (see below). - * The rotation is around the new Hinge axis. - * - * @note Usually the function dJointSetHingeAxis set the current position of body1 - * and body2 as the zero angle position. This function set the current position - * as the if the 2 bodies where \b offsets appart. - * - * @note Any previous offsets are erased. - * - * @warning Calling dJointSetUniversalAnchor, dJointSetUnivesalAxis1, - * dJointSetUniversalAxis2, dJointSetUniversalAxis2Offset - * will reset the "zero" angle position. - */ -ODE_API void dJointSetUniversalAxis1Offset (dJointID, dReal x, dReal y, dReal z, - dReal offset1, dReal offset2); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetUniversalAxis2 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief Set the Universal axis2 as if the 2 bodies were already at - * offset1 and offset2 appart with respect to axis1 and axis2. - * @ingroup joints - * - * This function initialize the axis2 and the relative orientation of - * each body as if body1 was rotated around the axis1 by the offset1 - * value and as if body2 was rotated around the new axis2 by offset2. \br - * Ex: - *
- * dJointSetHuniversalAxis2(jId, 0, 1, 0);
- * // If you request the position you will have: dJointGetUniversalAngle1(jId) == 0
- * // If you request the position you will have: dJointGetUniversalAngle2(jId) == 0
- * dJointSetHuniversalAxis2Offset(jId, 0, 1, 0, 0.2, 0.17);
- * // If you request the position you will have: dJointGetUniversalAngle1(jId) == 0.2
- * // If you request the position you will have: dJointGetUniversalAngle2(jId) == 0.17
- * 
- - * @param j The Hinge joint ID for which the axis will be set - * @param x The X component of the axis in world frame - * @param y The Y component of the axis in world frame - * @param z The Z component of the axis in world frame - * @param angle The angle for the offset of the relative orientation. - * As if body1 was rotated by angle when the Axis was set (see below). - * The rotation is around the new Hinge axis. - * - * @note Usually the function dJointSetHingeAxis set the current position of body1 - * and body2 as the zero angle position. This function set the current position - * as the if the 2 bodies where \b offsets appart. - * - * @note Any previous offsets are erased. - * - * @warning Calling dJointSetUniversalAnchor, dJointSetUnivesalAxis1, - * dJointSetUniversalAxis2, dJointSetUniversalAxis2Offset - * will reset the "zero" angle position. - */ - - -ODE_API void dJointSetUniversalAxis2Offset (dJointID, dReal x, dReal y, dReal z, - dReal offset1, dReal offset2); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetUniversalParam (dJointID, int parameter, dReal value); - -/** - * @brief Applies torque1 about the universal's axis 1, torque2 about the - * universal's axis 2. - * @remarks This function is just a wrapper for dBodyAddTorque(). - * @ingroup joints - */ -ODE_API void dJointAddUniversalTorques(dJointID joint, dReal torque1, dReal torque2); - - -/** - * @brief set anchor - * @ingroup joints - */ -ODE_API void dJointSetPRAnchor (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set the axis for the prismatic articulation - * @ingroup joints - */ -ODE_API void dJointSetPRAxis1 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set the axis for the rotoide articulation - * @ingroup joints - */ -ODE_API void dJointSetPRAxis2 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set joint parameter - * @ingroup joints - * - * @note parameterX where X equal 2 refer to parameter for the rotoide articulation - */ -ODE_API void dJointSetPRParam (dJointID, int parameter, dReal value); - -/** - * @brief Applies the torque about the rotoide axis of the PR joint - * - * That is, it applies a torque with specified magnitude in the direction - * of the rotoide axis, to body 1, and with the same magnitude but in opposite - * direction to body 2. This function is just a wrapper for dBodyAddTorque()} - * @ingroup joints - */ -ODE_API void dJointAddPRTorque (dJointID j, dReal torque); - - - /** - * @brief set anchor - * @ingroup joints - */ - ODE_API void dJointSetPUAnchor (dJointID, dReal x, dReal y, dReal z); - - /** - * @brief set anchor - * @ingroup joints - */ - ODE_API_DEPRECATED ODE_API void dJointSetPUAnchorDelta (dJointID, dReal x, dReal y, dReal z, - dReal dx, dReal dy, dReal dz); - - /** - * @brief Set the PU anchor as if the 2 bodies were already at [dx, dy, dz] appart. - * @ingroup joints - * - * This function initialize the anchor and the relative position of each body - * as if the position between body1 and body2 was already the projection of [dx, dy, dz] - * along the Piston axis. (i.e as if the body1 was at its current position - [dx,dy,dy] when the - * axis is set). - * Ex: - *
-   * dReal offset = 3;
-   * dVector3 axis;
-   * dJointGetPUAxis(jId, axis);
-   * dJointSetPUAnchor(jId, 0, 0, 0);
-   * // If you request the position you will have: dJointGetPUPosition(jId) == 0
-   * dJointSetPUAnchorOffset(jId, 0, 0, 0, axis[X]*offset, axis[Y]*offset, axis[Z]*offset);
-   * // If you request the position you will have: dJointGetPUPosition(jId) == offset
-   * 
- * @param j The PU joint for which the anchor point will be set - * @param x The X position of the anchor point in world frame - * @param y The Y position of the anchor point in world frame - * @param z The Z position of the anchor point in world frame - * @param dx A delta to be substracted to the X position as if the anchor was set - * when body1 was at current_position[X] - dx - * @param dx A delta to be substracted to the Y position as if the anchor was set - * when body1 was at current_position[Y] - dy - * @param dx A delta to be substracted to the Z position as if the anchor was set - * when body1 was at current_position[Z] - dz - */ - ODE_API void dJointSetPUAnchorOffset (dJointID, dReal x, dReal y, dReal z, - dReal dx, dReal dy, dReal dz); - - /** - * @brief set the axis for the first axis or the universal articulation - * @ingroup joints - */ - ODE_API void dJointSetPUAxis1 (dJointID, dReal x, dReal y, dReal z); - - /** - * @brief set the axis for the second axis or the universal articulation - * @ingroup joints - */ - ODE_API void dJointSetPUAxis2 (dJointID, dReal x, dReal y, dReal z); - - /** - * @brief set the axis for the prismatic articulation - * @ingroup joints - */ - ODE_API void dJointSetPUAxis3 (dJointID, dReal x, dReal y, dReal z); - - /** - * @brief set the axis for the prismatic articulation - * @ingroup joints - * @note This function was added for convenience it is the same as - * dJointSetPUAxis3 - */ - ODE_API void dJointSetPUAxisP (dJointID id, dReal x, dReal y, dReal z); - - - - /** - * @brief set joint parameter - * @ingroup joints - * - * @note parameterX where X equal 2 refer to parameter for second axis of the - * universal articulation - * @note parameterX where X equal 3 refer to parameter for prismatic - * articulation - */ - ODE_API void dJointSetPUParam (dJointID, int parameter, dReal value); - - /** - * @brief Applies the torque about the rotoide axis of the PU joint - * - * That is, it applies a torque with specified magnitude in the direction - * of the rotoide axis, to body 1, and with the same magnitude but in opposite - * direction to body 2. This function is just a wrapper for dBodyAddTorque()} - * @ingroup joints - */ - ODE_API void dJointAddPUTorque (dJointID j, dReal torque); - - - - - /** - * @brief set the joint anchor - * @ingroup joints - */ - ODE_API void dJointSetPistonAnchor (dJointID, dReal x, dReal y, dReal z); - - /** - * @brief Set the Piston anchor as if the 2 bodies were already at [dx,dy, dz] appart. - * @ingroup joints - * - * This function initialize the anchor and the relative position of each body - * as if the position between body1 and body2 was already the projection of [dx, dy, dz] - * along the Piston axis. (i.e as if the body1 was at its current position - [dx,dy,dy] when the - * axis is set). - * Ex: - *
-   * dReal offset = 3;
-   * dVector3 axis;
-   * dJointGetPistonAxis(jId, axis);
-   * dJointSetPistonAnchor(jId, 0, 0, 0);
-   * // If you request the position you will have: dJointGetPistonPosition(jId) == 0
-   * dJointSetPistonAnchorOffset(jId, 0, 0, 0, axis[X]*offset, axis[Y]*offset, axis[Z]*offset);
-   * // If you request the position you will have: dJointGetPistonPosition(jId) == offset
-   * 
- * @param j The Piston joint for which the anchor point will be set - * @param x The X position of the anchor point in world frame - * @param y The Y position of the anchor point in world frame - * @param z The Z position of the anchor point in world frame - * @param dx A delta to be substracted to the X position as if the anchor was set - * when body1 was at current_position[X] - dx - * @param dx A delta to be substracted to the Y position as if the anchor was set - * when body1 was at current_position[Y] - dy - * @param dx A delta to be substracted to the Z position as if the anchor was set - * when body1 was at current_position[Z] - dz - */ - ODE_API void dJointSetPistonAnchorOffset(dJointID j, dReal x, dReal y, dReal z, - dReal dx, dReal dy, dReal dz); - - /** - * @brief set the joint axis - * @ingroup joints - */ - ODE_API void dJointSetPistonAxis (dJointID, dReal x, dReal y, dReal z); - - /** - * This function set prismatic axis of the joint and also set the position - * of the joint. - * - * @ingroup joints - * @param j The joint affected by this function - * @param x The x component of the axis - * @param y The y component of the axis - * @param z The z component of the axis - * @param dx The Initial position of the prismatic join in the x direction - * @param dy The Initial position of the prismatic join in the y direction - * @param dz The Initial position of the prismatic join in the z direction - */ - ODE_API_DEPRECATED ODE_API void dJointSetPistonAxisDelta (dJointID j, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); - - /** - * @brief set joint parameter - * @ingroup joints - */ - ODE_API void dJointSetPistonParam (dJointID, int parameter, dReal value); - - /** - * @brief Applies the given force in the slider's direction. - * - * That is, it applies a force with specified magnitude, in the direction of - * prismatic's axis, to body1, and with the same magnitude but opposite - * direction to body2. This function is just a wrapper for dBodyAddForce(). - * @ingroup joints - */ - ODE_API void dJointAddPistonForce (dJointID joint, dReal force); - - -/** - * @brief Call this on the fixed joint after it has been attached to - * remember the current desired relative offset and desired relative - * rotation between the bodies. - * @ingroup joints - */ -ODE_API void dJointSetFixed (dJointID); - -/* - * @brief Sets joint parameter - * - * @ingroup joints - */ -ODE_API void dJointSetFixedParam (dJointID, int parameter, dReal value); - -/** - * @brief set the nr of axes - * @param num 0..3 - * @ingroup joints - */ -ODE_API void dJointSetAMotorNumAxes (dJointID, int num); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetAMotorAxis (dJointID, int anum, int rel, - dReal x, dReal y, dReal z); - -/** - * @brief Tell the AMotor what the current angle is along axis anum. - * - * This function should only be called in dAMotorUser mode, because in this - * mode the AMotor has no other way of knowing the joint angles. - * The angle information is needed if stops have been set along the axis, - * but it is not needed for axis motors. - * @ingroup joints - */ -ODE_API void dJointSetAMotorAngle (dJointID, int anum, dReal angle); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetAMotorParam (dJointID, int parameter, dReal value); - -/** - * @brief set mode - * @ingroup joints - */ -ODE_API void dJointSetAMotorMode (dJointID, int mode); - -/** - * @brief Applies torque0 about the AMotor's axis 0, torque1 about the - * AMotor's axis 1, and torque2 about the AMotor's axis 2. - * @remarks - * If the motor has fewer than three axes, the higher torques are ignored. - * This function is just a wrapper for dBodyAddTorque(). - * @ingroup joints - */ -ODE_API void dJointAddAMotorTorques (dJointID, dReal torque1, dReal torque2, dReal torque3); - -/** - * @brief Set the number of axes that will be controlled by the LMotor. - * @param num can range from 0 (which effectively deactivates the joint) to 3. - * @ingroup joints - */ -ODE_API void dJointSetLMotorNumAxes (dJointID, int num); - -/** - * @brief Set the AMotor axes. - * @param anum selects the axis to change (0,1 or 2). - * @param rel Each axis can have one of three ``relative orientation'' modes - * \li 0: The axis is anchored to the global frame. - * \li 1: The axis is anchored to the first body. - * \li 2: The axis is anchored to the second body. - * @remarks The axis vector is always specified in global coordinates - * regardless of the setting of rel. - * @ingroup joints - */ -ODE_API void dJointSetLMotorAxis (dJointID, int anum, int rel, dReal x, dReal y, dReal z); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetLMotorParam (dJointID, int parameter, dReal value); - -/** - * @ingroup joints - */ -ODE_API void dJointSetPlane2DXParam (dJointID, int parameter, dReal value); - -/** - * @ingroup joints - */ - -ODE_API void dJointSetPlane2DYParam (dJointID, int parameter, dReal value); - -/** - * @ingroup joints - */ -ODE_API void dJointSetPlane2DAngleParam (dJointID, int parameter, dReal value); - -/** - * @brief Get the joint anchor point, in world coordinates. - * - * This returns the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - */ -ODE_API void dJointGetBallAnchor (dJointID, dVector3 result); - -/** - * @brief Get the joint anchor point, in world coordinates. - * - * This returns the point on body 2. You can think of a ball and socket - * joint as trying to keep the result of dJointGetBallAnchor() and - * dJointGetBallAnchor2() the same. If the joint is perfectly satisfied, - * this function will return the same value as dJointGetBallAnchor() to - * within roundoff errors. dJointGetBallAnchor2() can be used, along with - * dJointGetBallAnchor(), to see how far the joint has come apart. - */ -ODE_API void dJointGetBallAnchor2 (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetBallParam (dJointID, int parameter); - -/** - * @brief Get the hinge anchor point, in world coordinates. - * - * This returns the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ -ODE_API void dJointGetHingeAnchor (dJointID, dVector3 result); - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return The point on body 2. If the joint is perfectly satisfied, - * this will return the same value as dJointGetHingeAnchor(). - * If not, this value will be slightly different. - * This can be used, for example, to see how far the joint has come apart. - * @ingroup joints - */ -ODE_API void dJointGetHingeAnchor2 (dJointID, dVector3 result); - -/** - * @brief get axis - * @ingroup joints - */ -ODE_API void dJointGetHingeAxis (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetHingeParam (dJointID, int parameter); - -/** - * @brief Get the hinge angle. - * - * The angle is measured between the two bodies, or between the body and - * the static environment. - * The angle will be between -pi..pi. - * Give the relative rotation with respect to the Hinge axis of Body 1 with - * respect to Body 2. - * When the hinge anchor or axis is set, the current position of the attached - * bodies is examined and that position will be the zero angle. - * @ingroup joints - */ -ODE_API dReal dJointGetHingeAngle (dJointID); - -/** - * @brief Get the hinge angle time derivative. - * @ingroup joints - */ -ODE_API dReal dJointGetHingeAngleRate (dJointID); - -/** - * @brief Get the slider linear position (i.e. the slider's extension) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - - * The position is the distance, with respect to the zero position, - * along the slider axis of body 1 with respect to - * body 2. (A NULL body is replaced by the world). - * @ingroup joints - */ -ODE_API dReal dJointGetSliderPosition (dJointID); - -/** - * @brief Get the slider linear position's time derivative. - * @ingroup joints - */ -ODE_API dReal dJointGetSliderPositionRate (dJointID); - -/** - * @brief Get the slider axis - * @ingroup joints - */ -ODE_API void dJointGetSliderAxis (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetSliderParam (dJointID, int parameter); - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ -ODE_API void dJointGetHinge2Anchor (dJointID, dVector3 result); - -/** - * @brief Get the joint anchor point, in world coordinates. - * This returns the point on body 2. If the joint is perfectly satisfied, - * this will return the same value as dJointGetHinge2Anchor. - * If not, this value will be slightly different. - * This can be used, for example, to see how far the joint has come apart. - * @ingroup joints - */ -ODE_API void dJointGetHinge2Anchor2 (dJointID, dVector3 result); - -/** - * @brief Get joint axis - * @ingroup joints - */ -ODE_API void dJointGetHinge2Axis1 (dJointID, dVector3 result); - -/** - * @brief Get joint axis - * @ingroup joints - */ -ODE_API void dJointGetHinge2Axis2 (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetHinge2Param (dJointID, int parameter); - -/** - * @brief Get angle - * @ingroup joints - */ -ODE_API dReal dJointGetHinge2Angle1 (dJointID); - -/** - * @brief Get time derivative of angle - * @ingroup joints - */ -ODE_API dReal dJointGetHinge2Angle1Rate (dJointID); - -/** - * @brief Get time derivative of angle - * @ingroup joints - */ -ODE_API dReal dJointGetHinge2Angle2Rate (dJointID); - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ -ODE_API void dJointGetUniversalAnchor (dJointID, dVector3 result); - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return This returns the point on body 2. - * @remarks - * You can think of the ball and socket part of a universal joint as - * trying to keep the result of dJointGetBallAnchor() and - * dJointGetBallAnchor2() the same. If the joint is - * perfectly satisfied, this function will return the same value - * as dJointGetUniversalAnchor() to within roundoff errors. - * dJointGetUniversalAnchor2() can be used, along with - * dJointGetUniversalAnchor(), to see how far the joint has come apart. - * @ingroup joints - */ -ODE_API void dJointGetUniversalAnchor2 (dJointID, dVector3 result); - -/** - * @brief Get axis - * @ingroup joints - */ -ODE_API void dJointGetUniversalAxis1 (dJointID, dVector3 result); - -/** - * @brief Get axis - * @ingroup joints - */ -ODE_API void dJointGetUniversalAxis2 (dJointID, dVector3 result); - - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalParam (dJointID, int parameter); - -/** - * @brief Get both angles at the same time. - * @ingroup joints - * - * @param joint The universal joint for which we want to calculate the angles - * @param angle1 The angle between the body1 and the axis 1 - * @param angle2 The angle between the body2 and the axis 2 - * - * @note This function combine getUniversalAngle1 and getUniversalAngle2 together - * and try to avoid redundant calculation - */ -ODE_API void dJointGetUniversalAngles (dJointID, dReal *angle1, dReal *angle2); - -/** - * @brief Get angle - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalAngle1 (dJointID); - -/** - * @brief Get angle - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalAngle2 (dJointID); - -/** - * @brief Get time derivative of angle - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalAngle1Rate (dJointID); - -/** - * @brief Get time derivative of angle - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalAngle2Rate (dJointID); - - - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ -ODE_API void dJointGetPRAnchor (dJointID, dVector3 result); - -/** - * @brief Get the PR linear position (i.e. the prismatic's extension) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - * - * The position is the "oriented" length between the - * position = (Prismatic axis) dot_product [(body1 + offset) - (body2 + anchor2)] - * - * @ingroup joints - */ -ODE_API dReal dJointGetPRPosition (dJointID); - -/** - * @brief Get the PR linear position's time derivative - * - * @ingroup joints - */ -ODE_API dReal dJointGetPRPositionRate (dJointID); - - -/** - * @brief Get the PR angular position (i.e. the twist between the 2 bodies) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - * @ingroup joints - */ -ODE_API dReal dJointGetPRAngle (dJointID); - -/** - * @brief Get the PR angular position's time derivative - * - * @ingroup joints - */ -ODE_API dReal dJointGetPRAngleRate (dJointID); - - -/** - * @brief Get the prismatic axis - * @ingroup joints - */ -ODE_API void dJointGetPRAxis1 (dJointID, dVector3 result); - -/** - * @brief Get the Rotoide axis - * @ingroup joints - */ -ODE_API void dJointGetPRAxis2 (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetPRParam (dJointID, int parameter); - - - - /** - * @brief Get the joint anchor point, in world coordinates. - * @return the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ - ODE_API void dJointGetPUAnchor (dJointID, dVector3 result); - - /** - * @brief Get the PU linear position (i.e. the prismatic's extension) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - * - * The position is the "oriented" length between the - * position = (Prismatic axis) dot_product [(body1 + offset) - (body2 + anchor2)] - * - * @ingroup joints - */ - ODE_API dReal dJointGetPUPosition (dJointID); - - /** - * @brief Get the PR linear position's time derivative - * - * @ingroup joints - */ - ODE_API dReal dJointGetPUPositionRate (dJointID); - - /** - * @brief Get the first axis of the universal component of the joint - * @ingroup joints - */ - ODE_API void dJointGetPUAxis1 (dJointID, dVector3 result); - - /** - * @brief Get the second axis of the Universal component of the joint - * @ingroup joints - */ - ODE_API void dJointGetPUAxis2 (dJointID, dVector3 result); - - /** - * @brief Get the prismatic axis - * @ingroup joints - */ - ODE_API void dJointGetPUAxis3 (dJointID, dVector3 result); - - /** - * @brief Get the prismatic axis - * @ingroup joints - * - * @note This function was added for convenience it is the same as - * dJointGetPUAxis3 - */ - ODE_API void dJointGetPUAxisP (dJointID id, dVector3 result); - - - - - /** - * @brief Get both angles at the same time. - * @ingroup joints - * - * @param joint The Prismatic universal joint for which we want to calculate the angles - * @param angle1 The angle between the body1 and the axis 1 - * @param angle2 The angle between the body2 and the axis 2 - * - * @note This function combine dJointGetPUAngle1 and dJointGetPUAngle2 together - * and try to avoid redundant calculation - */ - ODE_API void dJointGetPUAngles (dJointID, dReal *angle1, dReal *angle2); - - /** - * @brief Get angle - * @ingroup joints - */ - ODE_API dReal dJointGetPUAngle1 (dJointID); - - /** - * @brief * @brief Get time derivative of angle1 - * - * @ingroup joints - */ - ODE_API dReal dJointGetPUAngle1Rate (dJointID); - - - /** - * @brief Get angle - * @ingroup joints - */ - ODE_API dReal dJointGetPUAngle2 (dJointID); - - /** - * @brief * @brief Get time derivative of angle2 - * - * @ingroup joints - */ - ODE_API dReal dJointGetPUAngle2Rate (dJointID); - - /** - * @brief get joint parameter - * @ingroup joints - */ - ODE_API dReal dJointGetPUParam (dJointID, int parameter); - - - - - -/** - * @brief Get the Piston linear position (i.e. the piston's extension) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - * @ingroup joints - */ - ODE_API dReal dJointGetPistonPosition (dJointID); - - /** - * @brief Get the piston linear position's time derivative. - * @ingroup joints - */ - ODE_API dReal dJointGetPistonPositionRate (dJointID); - -/** - * @brief Get the Piston angular position (i.e. the twist between the 2 bodies) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - * @ingroup joints - */ - ODE_API dReal dJointGetPistonAngle (dJointID); - - /** - * @brief Get the piston angular position's time derivative. - * @ingroup joints - */ - ODE_API dReal dJointGetPistonAngleRate (dJointID); - - - /** - * @brief Get the joint anchor - * - * This returns the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2 in direction perpendicular - * to the prismatic axis. - * - * @ingroup joints - */ - ODE_API void dJointGetPistonAnchor (dJointID, dVector3 result); - - /** - * @brief Get the joint anchor w.r.t. body 2 - * - * This returns the point on body 2. You can think of a Piston - * joint as trying to keep the result of dJointGetPistonAnchor() and - * dJointGetPistonAnchor2() the same in the direction perpendicular to the - * pirsmatic axis. If the joint is perfectly satisfied, - * this function will return the same value as dJointGetPistonAnchor() to - * within roundoff errors. dJointGetPistonAnchor2() can be used, along with - * dJointGetPistonAnchor(), to see how far the joint has come apart. - * - * @ingroup joints - */ - ODE_API void dJointGetPistonAnchor2 (dJointID, dVector3 result); - - /** - * @brief Get the prismatic axis (This is also the rotoide axis. - * @ingroup joints - */ - ODE_API void dJointGetPistonAxis (dJointID, dVector3 result); - - /** - * @brief get joint parameter - * @ingroup joints - */ - ODE_API dReal dJointGetPistonParam (dJointID, int parameter); - - - /** - * @brief Get the number of angular axes that will be controlled by the - * AMotor. - * @param num can range from 0 (which effectively deactivates the - * joint) to 3. - * This is automatically set to 3 in dAMotorEuler mode. - * @ingroup joints - */ -ODE_API int dJointGetAMotorNumAxes (dJointID); - -/** - * @brief Get the AMotor axes. - * @param anum selects the axis to change (0,1 or 2). - * @param rel Each axis can have one of three ``relative orientation'' modes. - * \li 0: The axis is anchored to the global frame. - * \li 1: The axis is anchored to the first body. - * \li 2: The axis is anchored to the second body. - * @ingroup joints - */ -ODE_API void dJointGetAMotorAxis (dJointID, int anum, dVector3 result); - -/** - * @brief Get axis - * @remarks - * The axis vector is always specified in global coordinates regardless - * of the setting of rel. - * There are two GetAMotorAxis functions, one to return the axis and one to - * return the relative mode. - * - * For dAMotorEuler mode: - * \li Only axes 0 and 2 need to be set. Axis 1 will be determined - automatically at each time step. - * \li Axes 0 and 2 must be perpendicular to each other. - * \li Axis 0 must be anchored to the first body, axis 2 must be anchored - to the second body. - * @ingroup joints - */ -ODE_API int dJointGetAMotorAxisRel (dJointID, int anum); - -/** - * @brief Get the current angle for axis. - * @remarks - * In dAMotorUser mode this is simply the value that was set with - * dJointSetAMotorAngle(). - * In dAMotorEuler mode this is the corresponding euler angle. - * @ingroup joints - */ -ODE_API dReal dJointGetAMotorAngle (dJointID, int anum); - -/** - * @brief Get the current angle rate for axis anum. - * @remarks - * In dAMotorUser mode this is always zero, as not enough information is - * available. - * In dAMotorEuler mode this is the corresponding euler angle rate. - * @ingroup joints - */ -ODE_API dReal dJointGetAMotorAngleRate (dJointID, int anum); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetAMotorParam (dJointID, int parameter); - -/** - * @brief Get the angular motor mode. - * @param mode must be one of the following constants: - * \li dAMotorUser The AMotor axes and joint angle settings are entirely - * controlled by the user. This is the default mode. - * \li dAMotorEuler Euler angles are automatically computed. - * The axis a1 is also automatically computed. - * The AMotor axes must be set correctly when in this mode, - * as described below. - * When this mode is initially set the current relative orientations - * of the bodies will correspond to all euler angles at zero. - * @ingroup joints - */ -ODE_API int dJointGetAMotorMode (dJointID); - -/** - * @brief Get nr of axes. - * @ingroup joints - */ -ODE_API int dJointGetLMotorNumAxes (dJointID); - -/** - * @brief Get axis. - * @ingroup joints - */ -ODE_API void dJointGetLMotorAxis (dJointID, int anum, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetLMotorParam (dJointID, int parameter); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetFixedParam (dJointID, int parameter); - - -/** - * @ingroup joints - */ -ODE_API dJointID dConnectingJoint (dBodyID, dBodyID); - -/** - * @ingroup joints - */ -ODE_API int dConnectingJointList (dBodyID, dBodyID, dJointID*); - -/** - * @brief Utility function - * @return 1 if the two bodies are connected together by - * a joint, otherwise return 0. - * @ingroup joints - */ -ODE_API int dAreConnected (dBodyID, dBodyID); - -/** - * @brief Utility function - * @return 1 if the two bodies are connected together by - * a joint that does not have type @arg{joint_type}, otherwise return 0. - * @param body1 A body to check. - * @param body2 A body to check. - * @param joint_type is a dJointTypeXXX constant. - * This is useful for deciding whether to add contact joints between two bodies: - * if they are already connected by non-contact joints then it may not be - * appropriate to add contacts, however it is okay to add more contact between- - * bodies that already have contacts. - * @ingroup joints - */ -ODE_API int dAreConnectedExcluding (dBodyID body1, dBodyID body2, int joint_type); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/ode.h b/misc/builddeps/dp.linux32/include/ode/ode.h deleted file mode 100644 index af74e50f..00000000 --- a/misc/builddeps/dp.linux32/include/ode/ode.h +++ /dev/null @@ -1,48 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_ODE_H_ -#define _ODE_ODE_H_ - -/* include *everything* here */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/odeconfig.h b/misc/builddeps/dp.linux32/include/ode/odeconfig.h deleted file mode 100644 index 6e32fc65..00000000 --- a/misc/builddeps/dp.linux32/include/ode/odeconfig.h +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef ODECONFIG_H -#define ODECONFIG_H - -/* Pull in the standard headers */ -#include -#include -#include -#include -#include -#include -#include -#include - - -#if defined(ODE_DLL) || defined(ODE_LIB) -#define __ODE__ -#endif - -/* Define a DLL export symbol for those platforms that need it */ -#if defined(_MSC_VER) - #if defined(ODE_DLL) - #define ODE_API __declspec(dllexport) - #elif !defined(ODE_LIB) - #define ODE_DLL_API __declspec(dllimport) - #endif -#endif - -#if !defined(ODE_API) - #define ODE_API -#endif - -#if defined(_MSC_VER) -# define ODE_API_DEPRECATED __declspec(deprecated) -#elif defined (__GNUC__) && ( (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) ) -# define ODE_API_DEPRECATED __attribute__((__deprecated__)) -#else -# define ODE_API_DEPRECATED -#endif - -/* Well-defined common data types...need to define for 64 bit systems */ -#if defined(_M_IA64) || defined(__ia64__) || defined(_M_AMD64) || defined(__x86_64__) - #define X86_64_SYSTEM 1 - typedef int int32; - typedef unsigned int uint32; - typedef short int16; - typedef unsigned short uint16; - typedef signed char int8; - typedef unsigned char uint8; -#else - typedef int int32; - typedef unsigned int uint32; - typedef short int16; - typedef unsigned short uint16; - typedef signed char int8; - typedef unsigned char uint8; -#endif - -/* Visual C does not define these functions */ -#if defined(_MSC_VER) - #define copysignf(x, y) ((float)_copysign(x, y)) - #define copysign(x, y) _copysign(x, y) - #define nextafterf(x, y) _nextafterf(x, y) - #define nextafter(x, y) _nextafter(x, y) - #if !defined(_WIN64) - #define _ODE__NEXTAFTERF_REQUIRED - #endif -#endif - - - -/* Define the dInfinity macro */ -#ifdef INFINITY - #define dInfinity INFINITY -#elif defined(HUGE_VAL) - #ifdef dSINGLE - #ifdef HUGE_VALF - #define dInfinity HUGE_VALF - #else - #define dInfinity ((float)HUGE_VAL) - #endif - #else - #define dInfinity HUGE_VAL - #endif -#else - #ifdef dSINGLE - #define dInfinity ((float)(1.0/0.0)) - #else - #define dInfinity (1.0/0.0) - #endif -#endif - - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/odecpp.h b/misc/builddeps/dp.linux32/include/ode/odecpp.h deleted file mode 100644 index f7348925..00000000 --- a/misc/builddeps/dp.linux32/include/ode/odecpp.h +++ /dev/null @@ -1,1353 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001, 2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* C++ interface for non-collision stuff */ - - -#ifndef _ODE_ODECPP_H_ -#define _ODE_ODECPP_H_ -#ifdef __cplusplus - - - - -//namespace ode { - - -class dWorldSimpleIDContainer { -protected: - dWorldID _id; - - dWorldSimpleIDContainer(): _id(0) {} - ~dWorldSimpleIDContainer() { destroy(); } - - void destroy() { - if (_id) { - dWorldDestroy(_id); - _id = 0; - } - } -}; - -class dWorldDynamicIDContainer: public dWorldSimpleIDContainer { -protected: - virtual ~dWorldDynamicIDContainer() {} -}; - -template -class dWorldTemplate: public dWorldTemplateBase { - // intentionally undefined, don't use these - dWorldTemplate (const dWorldTemplate &); - void operator= (const dWorldTemplate &); - -protected: - dWorldID get_id() const { return dWorldTemplateBase::_id; } - void set_id(dWorldID value) { dWorldTemplateBase::_id = value; } - -public: - dWorldTemplate() - { set_id(dWorldCreate()); } - - dWorldID id() const - { return get_id(); } - operator dWorldID() const - { return get_id(); } - - void setGravity (dReal x, dReal y, dReal z) - { dWorldSetGravity (get_id(), x, y, z); } - void setGravity (const dVector3 g) - { setGravity (g[0], g[1], g[2]); } - void getGravity (dVector3 g) const - { dWorldGetGravity (get_id(), g); } - - void setERP (dReal erp) - { dWorldSetERP(get_id(), erp); } - dReal getERP() const - { return dWorldGetERP(get_id()); } - - void setCFM (dReal cfm) - { dWorldSetCFM(get_id(), cfm); } - dReal getCFM() const - { return dWorldGetCFM(get_id()); } - - void step (dReal stepsize) - { dWorldStep (get_id(), stepsize); } - - void quickStep(dReal stepsize) - { dWorldQuickStep (get_id(), stepsize); } - void setQuickStepNumIterations(int num) - { dWorldSetQuickStepNumIterations (get_id(), num); } - int getQuickStepNumIterations() const - { return dWorldGetQuickStepNumIterations (get_id()); } - void setQuickStepW(dReal over_relaxation) - { dWorldSetQuickStepW (get_id(), over_relaxation); } - dReal getQuickStepW() const - { return dWorldGetQuickStepW (get_id()); } - - void setAutoDisableLinearThreshold (dReal threshold) - { dWorldSetAutoDisableLinearThreshold (get_id(), threshold); } - dReal getAutoDisableLinearThreshold() const - { return dWorldGetAutoDisableLinearThreshold (get_id()); } - void setAutoDisableAngularThreshold (dReal threshold) - { dWorldSetAutoDisableAngularThreshold (get_id(), threshold); } - dReal getAutoDisableAngularThreshold() const - { return dWorldGetAutoDisableAngularThreshold (get_id()); } - void setAutoDisableSteps (int steps) - { dWorldSetAutoDisableSteps (get_id(), steps); } - int getAutoDisableSteps() const - { return dWorldGetAutoDisableSteps (get_id()); } - void setAutoDisableTime (dReal time) - { dWorldSetAutoDisableTime (get_id(), time); } - dReal getAutoDisableTime() const - { return dWorldGetAutoDisableTime (get_id()); } - void setAutoDisableFlag (int do_auto_disable) - { dWorldSetAutoDisableFlag (get_id(), do_auto_disable); } - int getAutoDisableFlag() const - { return dWorldGetAutoDisableFlag (get_id()); } - - dReal getLinearDampingThreshold() const - { return dWorldGetLinearDampingThreshold(get_id()); } - void setLinearDampingThreshold(dReal threshold) - { dWorldSetLinearDampingThreshold(get_id(), threshold); } - dReal getAngularDampingThreshold() const - { return dWorldGetAngularDampingThreshold(get_id()); } - void setAngularDampingThreshold(dReal threshold) - { dWorldSetAngularDampingThreshold(get_id(), threshold); } - dReal getLinearDamping() const - { return dWorldGetLinearDamping(get_id()); } - void setLinearDamping(dReal scale) - { dWorldSetLinearDamping(get_id(), scale); } - dReal getAngularDamping() const - { return dWorldGetAngularDamping(get_id()); } - void setAngularDamping(dReal scale) - { dWorldSetAngularDamping(get_id(), scale); } - void setDamping(dReal linear_scale, dReal angular_scale) - { dWorldSetDamping(get_id(), linear_scale, angular_scale); } - - dReal getMaxAngularSpeed() const - { return dWorldGetMaxAngularSpeed(get_id()); } - void setMaxAngularSpeed(dReal max_speed) - { dWorldSetMaxAngularSpeed(get_id(), max_speed); } - - void setContactSurfaceLayer(dReal depth) - { dWorldSetContactSurfaceLayer (get_id(), depth); } - dReal getContactSurfaceLayer() const - { return dWorldGetContactSurfaceLayer (get_id()); } - - void impulseToForce (dReal stepsize, dReal ix, dReal iy, dReal iz, - dVector3 force) - { dWorldImpulseToForce (get_id(), stepsize, ix, iy, iz, force); } -}; - - -class dBodySimpleIDContainer { -protected: - dBodyID _id; - - dBodySimpleIDContainer(): _id(0) {} - ~dBodySimpleIDContainer() { destroy(); } - - void destroy() { - if (_id) { - dBodyDestroy(_id); - _id = 0; - } - } -}; - -class dBodyDynamicIDContainer: public dBodySimpleIDContainer { -protected: - virtual ~dBodyDynamicIDContainer() {} -}; - -template -class dBodyTemplate: public dBodyTemplateBase { - // intentionally undefined, don't use these - dBodyTemplate (const dBodyTemplate &); - void operator= (const dBodyTemplate &); - -protected: - dBodyID get_id() const { return dBodyTemplateBase::_id; } - void set_id(dBodyID value) { dBodyTemplateBase::_id = value; } - - void destroy() { dBodyTemplateBase::destroy(); } - -public: - dBodyTemplate() - { } - dBodyTemplate (dWorldID world) - { set_id(dBodyCreate(world)); } - dBodyTemplate (dWorldTemplate& world) - { set_id(dBodyCreate(world.id())); } - - void create (dWorldID world) { - destroy(); - set_id(dBodyCreate(world)); - } - void create (dWorldTemplate& world) { - create(world.id()); - } - - dBodyID id() const - { return get_id(); } - operator dBodyID() const - { return get_id(); } - - void setData (void *data) - { dBodySetData (get_id(), data); } - void *getData() const - { return dBodyGetData (get_id()); } - - void setPosition (dReal x, dReal y, dReal z) - { dBodySetPosition (get_id(), x, y, z); } - void setPosition (const dVector3 p) - { setPosition(p[0], p[1], p[2]); } - - void setRotation (const dMatrix3 R) - { dBodySetRotation (get_id(), R); } - void setQuaternion (const dQuaternion q) - { dBodySetQuaternion (get_id(), q); } - void setLinearVel (dReal x, dReal y, dReal z) - { dBodySetLinearVel (get_id(), x, y, z); } - void setLinearVel (const dVector3 v) - { setLinearVel(v[0], v[1], v[2]); } - void setAngularVel (dReal x, dReal y, dReal z) - { dBodySetAngularVel (get_id(), x, y, z); } - void setAngularVel (const dVector3 v) - { setAngularVel (v[0], v[1], v[2]); } - - const dReal * getPosition() const - { return dBodyGetPosition (get_id()); } - const dReal * getRotation() const - { return dBodyGetRotation (get_id()); } - const dReal * getQuaternion() const - { return dBodyGetQuaternion (get_id()); } - const dReal * getLinearVel() const - { return dBodyGetLinearVel (get_id()); } - const dReal * getAngularVel() const - { return dBodyGetAngularVel (get_id()); } - - void setMass (const dMass *mass) - { dBodySetMass (get_id(), mass); } - void setMass (const dMass &mass) - { setMass (&mass); } - dMass getMass () const - { dMass mass; dBodyGetMass (get_id(), &mass); return mass; } - - void addForce (dReal fx, dReal fy, dReal fz) - { dBodyAddForce (get_id(), fx, fy, fz); } - void addForce (const dVector3 f) - { addForce (f[0], f[1], f[2]); } - void addTorque (dReal fx, dReal fy, dReal fz) - { dBodyAddTorque (get_id(), fx, fy, fz); } - void addTorque (const dVector3 t) - { addTorque(t[0], t[1], t[2]); } - - void addRelForce (dReal fx, dReal fy, dReal fz) - { dBodyAddRelForce (get_id(), fx, fy, fz); } - void addRelForce (const dVector3 f) - { addRelForce (f[0], f[1], f[2]); } - void addRelTorque (dReal fx, dReal fy, dReal fz) - { dBodyAddRelTorque (get_id(), fx, fy, fz); } - void addRelTorque (const dVector3 t) - { addRelTorque (t[0], t[1], t[2]); } - - void addForceAtPos (dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) - { dBodyAddForceAtPos (get_id(), fx, fy, fz, px, py, pz); } - void addForceAtPos (const dVector3 f, const dVector3 p) - { addForceAtPos (f[0], f[1], f[2], p[0], p[1], p[2]); } - - void addForceAtRelPos (dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) - { dBodyAddForceAtRelPos (get_id(), fx, fy, fz, px, py, pz); } - void addForceAtRelPos (const dVector3 f, const dVector3 p) - { addForceAtRelPos (f[0], f[1], f[2], p[0], p[1], p[2]); } - - void addRelForceAtPos (dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) - { dBodyAddRelForceAtPos (get_id(), fx, fy, fz, px, py, pz); } - void addRelForceAtPos (const dVector3 f, const dVector3 p) - { addRelForceAtPos (f[0], f[1], f[2], p[0], p[1], p[2]); } - - void addRelForceAtRelPos (dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) - { dBodyAddRelForceAtRelPos (get_id(), fx, fy, fz, px, py, pz); } - void addRelForceAtRelPos (const dVector3 f, const dVector3 p) - { addRelForceAtRelPos (f[0], f[1], f[2], p[0], p[1], p[2]); } - - const dReal * getForce() const - { return dBodyGetForce(get_id()); } - const dReal * getTorque() const - { return dBodyGetTorque(get_id()); } - void setForce (dReal x, dReal y, dReal z) - { dBodySetForce (get_id(), x, y, z); } - void setForce (const dVector3 f) - { setForce (f[0], f[1], f[2]); } - void setTorque (dReal x, dReal y, dReal z) - { dBodySetTorque (get_id(), x, y, z); } - void setTorque (const dVector3 t) - { setTorque (t[0], t[1], t[2]); } - - void setDynamic() - { dBodySetDynamic (get_id()); } - void setKinematic() - { dBodySetKinematic (get_id()); } - bool isKinematic() const - { return dBodyIsKinematic (get_id()) != 0; } - - void enable() - { dBodyEnable (get_id()); } - void disable() - { dBodyDisable (get_id()); } - bool isEnabled() const - { return dBodyIsEnabled (get_id()) != 0; } - - void getRelPointPos (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyGetRelPointPos (get_id(), px, py, pz, result); } - void getRelPointPos (const dVector3 p, dVector3 result) const - { getRelPointPos (p[0], p[1], p[2], result); } - - void getRelPointVel (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyGetRelPointVel (get_id(), px, py, pz, result); } - void getRelPointVel (const dVector3 p, dVector3 result) const - { getRelPointVel (p[0], p[1], p[2], result); } - - void getPointVel (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyGetPointVel (get_id(), px, py, pz, result); } - void getPointVel (const dVector3 p, dVector3 result) const - { getPointVel (p[0], p[1], p[2], result); } - - void getPosRelPoint (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyGetPosRelPoint (get_id(), px, py, pz, result); } - void getPosRelPoint (const dVector3 p, dVector3 result) const - { getPosRelPoint (p[0], p[1], p[2], result); } - - void vectorToWorld (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyVectorToWorld (get_id(), px, py, pz, result); } - void vectorToWorld (const dVector3 p, dVector3 result) const - { vectorToWorld (p[0], p[1], p[2], result); } - - void vectorFromWorld (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyVectorFromWorld (get_id(), px, py, pz, result); } - void vectorFromWorld (const dVector3 p, dVector3 result) const - { vectorFromWorld (p[0], p[1], p[2], result); } - - void setFiniteRotationMode (bool mode) - { dBodySetFiniteRotationMode (get_id(), mode); } - - void setFiniteRotationAxis (dReal x, dReal y, dReal z) - { dBodySetFiniteRotationAxis (get_id(), x, y, z); } - void setFiniteRotationAxis (const dVector3 a) - { setFiniteRotationAxis (a[0], a[1], a[2]); } - - bool getFiniteRotationMode() const - { return dBodyGetFiniteRotationMode (get_id()) != 0; } - void getFiniteRotationAxis (dVector3 result) const - { dBodyGetFiniteRotationAxis (get_id(), result); } - - int getNumJoints() const - { return dBodyGetNumJoints (get_id()); } - dJointID getJoint (int index) const - { return dBodyGetJoint (get_id(), index); } - - void setGravityMode (bool mode) - { dBodySetGravityMode (get_id(), mode); } - bool getGravityMode() const - { return dBodyGetGravityMode (get_id()) != 0; } - - bool isConnectedTo (dBodyID body) const - { return dAreConnected (get_id(), body) != 0; } - - void setAutoDisableLinearThreshold (dReal threshold) - { dBodySetAutoDisableLinearThreshold (get_id(), threshold); } - dReal getAutoDisableLinearThreshold() const - { return dBodyGetAutoDisableLinearThreshold (get_id()); } - void setAutoDisableAngularThreshold (dReal threshold) - { dBodySetAutoDisableAngularThreshold (get_id(), threshold); } - dReal getAutoDisableAngularThreshold() const - { return dBodyGetAutoDisableAngularThreshold (get_id()); } - void setAutoDisableSteps (int steps) - { dBodySetAutoDisableSteps (get_id(), steps); } - int getAutoDisableSteps() const - { return dBodyGetAutoDisableSteps (get_id()); } - void setAutoDisableTime (dReal time) - { dBodySetAutoDisableTime (get_id(), time); } - dReal getAutoDisableTime() const - { return dBodyGetAutoDisableTime (get_id()); } - void setAutoDisableFlag (bool do_auto_disable) - { dBodySetAutoDisableFlag (get_id(), do_auto_disable); } - bool getAutoDisableFlag() const - { return dBodyGetAutoDisableFlag (get_id()) != 0; } - - dReal getLinearDamping() const - { return dBodyGetLinearDamping(get_id()); } - void setLinearDamping(dReal scale) - { dBodySetLinearDamping(get_id(), scale); } - dReal getAngularDamping() const - { return dBodyGetAngularDamping(get_id()); } - void setAngularDamping(dReal scale) - { dBodySetAngularDamping(get_id(), scale); } - void setDamping(dReal linear_scale, dReal angular_scale) - { dBodySetDamping(get_id(), linear_scale, angular_scale); } - dReal getLinearDampingThreshold() const - { return dBodyGetLinearDampingThreshold(get_id()); } - void setLinearDampingThreshold(dReal threshold) const - { dBodySetLinearDampingThreshold(get_id(), threshold); } - dReal getAngularDampingThreshold() const - { return dBodyGetAngularDampingThreshold(get_id()); } - void setAngularDampingThreshold(dReal threshold) - { dBodySetAngularDampingThreshold(get_id(), threshold); } - void setDampingDefaults() - { dBodySetDampingDefaults(get_id()); } - - dReal getMaxAngularSpeed() const - { return dBodyGetMaxAngularSpeed(get_id()); } - void setMaxAngularSpeed(dReal max_speed) - { dBodySetMaxAngularSpeed(get_id(), max_speed); } - - bool getGyroscopicMode() const - { return dBodyGetGyroscopicMode(get_id()) != 0; } - void setGyroscopicMode(bool mode) - { dBodySetGyroscopicMode(get_id(), mode); } - -}; - - -class dJointGroupSimpleIDContainer { -protected: - dJointGroupID _id; - - dJointGroupSimpleIDContainer(): _id(0) {} - ~dJointGroupSimpleIDContainer() { destroy(); } - - void destroy() { - if (_id) { - dJointGroupDestroy(_id); - _id = 0; - } - } -}; - -class dJointGroupDynamicIDContainer: public dJointGroupSimpleIDContainer { -protected: - virtual ~dJointGroupDynamicIDContainer() {} -}; - -template -class dJointGroupTemplate: public dJointGroupTemplateBase { - // intentionally undefined, don't use these - dJointGroupTemplate (const dJointGroupTemplate &); - void operator= (const dJointGroupTemplate &); - -protected: - dJointGroupID get_id() const { return dJointGroupTemplateBase::_id; } - void set_id(dJointGroupID value) { dJointGroupTemplateBase::_id = value; } - - void destroy() { dJointGroupTemplateBase::destroy(); } - -public: - dJointGroupTemplate () - { set_id(dJointGroupCreate(0)); } - - void create () { - destroy(); - set_id(dJointGroupCreate(0)); - } - - dJointGroupID id() const - { return get_id(); } - operator dJointGroupID() const - { return get_id(); } - - void empty() - { dJointGroupEmpty (get_id()); } - void clear() - { empty(); } -}; - - -class dJointSimpleIDContainer { -protected: - dJointID _id; - - dJointSimpleIDContainer(): _id(0) {} - ~dJointSimpleIDContainer() { destroy(); } - - void destroy() { - if (_id) { - dJointDestroy (_id); - _id = 0; - } - } -}; - -class dJointDynamicIDContainer: public dJointSimpleIDContainer { -protected: - virtual ~dJointDynamicIDContainer() {} -}; - -template -class dJointTemplate: public dJointTemplateBase { -private: - // intentionally undefined, don't use these - dJointTemplate (const dJointTemplate &) ; - void operator= (const dJointTemplate &); - -protected: - dJointID get_id() const { return dJointTemplateBase::_id; } - void set_id(dJointID value) { dJointTemplateBase::_id = value; } - - void destroy() { dJointTemplateBase::destroy(); } - -protected: - dJointTemplate() // don't let user construct pure dJointTemplate objects - { } - -public: - dJointID id() const - { return get_id(); } - operator dJointID() const - { return get_id(); } - - int getNumBodies() const - { return dJointGetNumBodies(get_id()); } - - void attach (dBodyID body1, dBodyID body2) - { dJointAttach (get_id(), body1, body2); } - void attach (dBodyTemplate& body1, dBodyTemplate& body2) - { attach(body1.id(), body2.id()); } - - void enable() - { dJointEnable (get_id()); } - void disable() - { dJointDisable (get_id()); } - bool isEnabled() const - { return dJointIsEnabled (get_id()) != 0; } - - void setData (void *data) - { dJointSetData (get_id(), data); } - void *getData() const - { return dJointGetData (get_id()); } - - dJointType getType() const - { return dJointGetType (get_id()); } - - dBodyID getBody (int index) const - { return dJointGetBody (get_id(), index); } - - void setFeedback(dJointFeedback *fb) - { dJointSetFeedback(get_id(), fb); } - dJointFeedback *getFeedback() const - { return dJointGetFeedback(get_id()); } - - // If not implemented it will do nothing as describe in the doc - virtual void setParam (int, dReal) {}; - virtual dReal getParam (int) const { return 0; } -}; - - -template -class dBallJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dBallJointTemplate (const dBallJointTemplate &); - void operator= (const dBallJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dBallJointTemplate() { } - dBallJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateBall(world, group)); } - dBallJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateBall(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateBall(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetBallAnchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor (a[0], a[1], a[2]); } - void getAnchor (dVector3 result) const - { dJointGetBallAnchor (get_id(), result); } - void getAnchor2 (dVector3 result) const - { dJointGetBallAnchor2 (get_id(), result); } - virtual void setParam (int parameter, dReal value) - { dJointSetBallParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetBallParam (get_id(), parameter); } - // TODO: expose params through methods -} ; - - -template -class dHingeJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dHingeJointTemplate (const dHingeJointTemplate &); - void operator = (const dHingeJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dHingeJointTemplate() { } - dHingeJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateHinge(world, group)); } - dHingeJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateHinge(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateHinge (world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetHingeAnchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor (a[0], a[1], a[2]); } - void getAnchor (dVector3 result) const - { dJointGetHingeAnchor (get_id(), result); } - void getAnchor2 (dVector3 result) const - { dJointGetHingeAnchor2 (get_id(), result); } - - void setAxis (dReal x, dReal y, dReal z) - { dJointSetHingeAxis (get_id(), x, y, z); } - void setAxis (const dVector3 a) - { setAxis(a[0], a[1], a[2]); } - void getAxis (dVector3 result) const - { dJointGetHingeAxis (get_id(), result); } - - dReal getAngle() const - { return dJointGetHingeAngle (get_id()); } - dReal getAngleRate() const - { return dJointGetHingeAngleRate (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetHingeParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetHingeParam (get_id(), parameter); } - // TODO: expose params through methods - - void addTorque (dReal torque) - { dJointAddHingeTorque(get_id(), torque); } -}; - - -template -class dSliderJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dSliderJointTemplate (const dSliderJointTemplate &); - void operator = (const dSliderJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dSliderJointTemplate() { } - dSliderJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateSlider(world, group)); } - dSliderJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateSlider(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateSlider(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAxis (dReal x, dReal y, dReal z) - { dJointSetSliderAxis (get_id(), x, y, z); } - void setAxis (const dVector3 a) - { setAxis (a[0], a[1], a[2]); } - void getAxis (dVector3 result) const - { dJointGetSliderAxis (get_id(), result); } - - dReal getPosition() const - { return dJointGetSliderPosition (get_id()); } - dReal getPositionRate() const - { return dJointGetSliderPositionRate (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetSliderParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetSliderParam (get_id(), parameter); } - // TODO: expose params through methods - - void addForce (dReal force) - { dJointAddSliderForce(get_id(), force); } -}; - - -template -class dUniversalJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dUniversalJointTemplate (const dUniversalJointTemplate &); - void operator = (const dUniversalJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dUniversalJointTemplate() { } - dUniversalJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateUniversal(world, group)); } - dUniversalJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateUniversal(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateUniversal(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetUniversalAnchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor(a[0], a[1], a[2]); } - void setAxis1 (dReal x, dReal y, dReal z) - { dJointSetUniversalAxis1 (get_id(), x, y, z); } - void setAxis1 (const dVector3 a) - { setAxis1 (a[0], a[1], a[2]); } - void setAxis2 (dReal x, dReal y, dReal z) - { dJointSetUniversalAxis2 (get_id(), x, y, z); } - void setAxis2 (const dVector3 a) - { setAxis2 (a[0], a[1], a[2]); } - - void getAnchor (dVector3 result) const - { dJointGetUniversalAnchor (get_id(), result); } - void getAnchor2 (dVector3 result) const - { dJointGetUniversalAnchor2 (get_id(), result); } - void getAxis1 (dVector3 result) const - { dJointGetUniversalAxis1 (get_id(), result); } - void getAxis2 (dVector3 result) const - { dJointGetUniversalAxis2 (get_id(), result); } - - virtual void setParam (int parameter, dReal value) - { dJointSetUniversalParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetUniversalParam (get_id(), parameter); } - // TODO: expose params through methods - - void getAngles(dReal *angle1, dReal *angle2) const - { dJointGetUniversalAngles (get_id(), angle1, angle2); } - - dReal getAngle1() const - { return dJointGetUniversalAngle1 (get_id()); } - dReal getAngle1Rate() const - { return dJointGetUniversalAngle1Rate (get_id()); } - dReal getAngle2() const - { return dJointGetUniversalAngle2 (get_id()); } - dReal getAngle2Rate() const - { return dJointGetUniversalAngle2Rate (get_id()); } - - void addTorques (dReal torque1, dReal torque2) - { dJointAddUniversalTorques(get_id(), torque1, torque2); } -}; - - -template -class dHinge2JointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dHinge2JointTemplate (const dHinge2JointTemplate &); - void operator = (const dHinge2JointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dHinge2JointTemplate() { } - dHinge2JointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateHinge2(world, group)); } - dHinge2JointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateHinge2(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateHinge2(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetHinge2Anchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor(a[0], a[1], a[2]); } - void setAxis1 (dReal x, dReal y, dReal z) - { dJointSetHinge2Axis1 (get_id(), x, y, z); } - void setAxis1 (const dVector3 a) - { setAxis1 (a[0], a[1], a[2]); } - void setAxis2 (dReal x, dReal y, dReal z) - { dJointSetHinge2Axis2 (get_id(), x, y, z); } - void setAxis2 (const dVector3 a) - { setAxis2 (a[0], a[1], a[2]); } - - void getAnchor (dVector3 result) const - { dJointGetHinge2Anchor (get_id(), result); } - void getAnchor2 (dVector3 result) const - { dJointGetHinge2Anchor2 (get_id(), result); } - void getAxis1 (dVector3 result) const - { dJointGetHinge2Axis1 (get_id(), result); } - void getAxis2 (dVector3 result) const - { dJointGetHinge2Axis2 (get_id(), result); } - - dReal getAngle1() const - { return dJointGetHinge2Angle1 (get_id()); } - dReal getAngle1Rate() const - { return dJointGetHinge2Angle1Rate (get_id()); } - dReal getAngle2Rate() const - { return dJointGetHinge2Angle2Rate (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetHinge2Param (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetHinge2Param (get_id(), parameter); } - // TODO: expose params through methods - - void addTorques(dReal torque1, dReal torque2) - { dJointAddHinge2Torques(get_id(), torque1, torque2); } -}; - - -template -class dPRJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dPRJointTemplate (const dPRJointTemplate &); - void operator = (const dPRJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dPRJointTemplate() { } - dPRJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreatePR(world, group)); } - dPRJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreatePR(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreatePR(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetPRAnchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor (a[0], a[1], a[2]); } - void setAxis1 (dReal x, dReal y, dReal z) - { dJointSetPRAxis1 (get_id(), x, y, z); } - void setAxis1 (const dVector3 a) - { setAxis1(a[0], a[1], a[2]); } - void setAxis2 (dReal x, dReal y, dReal z) - { dJointSetPRAxis2 (get_id(), x, y, z); } - void setAxis2 (const dVector3 a) - { setAxis2(a[0], a[1], a[2]); } - - void getAnchor (dVector3 result) const - { dJointGetPRAnchor (get_id(), result); } - void getAxis1 (dVector3 result) const - { dJointGetPRAxis1 (get_id(), result); } - void getAxis2 (dVector3 result) const - { dJointGetPRAxis2 (get_id(), result); } - - dReal getPosition() const - { return dJointGetPRPosition (get_id()); } - dReal getPositionRate() const - { return dJointGetPRPositionRate (get_id()); } - - dReal getAngle() const - { return dJointGetPRAngle (get_id()); } - dReal getAngleRate() const - { return dJointGetPRAngleRate (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetPRParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetPRParam (get_id(), parameter); } -}; - - - -template -class dPUJointTemplate : public dJointTemplate -{ -private: - // intentionally undefined, don't use these - dPUJointTemplate (const dPUJointTemplate &); - void operator = (const dPUJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dPUJointTemplate() { } - dPUJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreatePU(world, group)); } - dPUJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreatePU(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) - { - destroy(); - set_id(dJointCreatePU(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetPUAnchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor (a[0], a[1], a[2]); } - void setAxis1 (dReal x, dReal y, dReal z) - { dJointSetPUAxis1 (get_id(), x, y, z); } - void setAxis1 (const dVector3 a) - { setAxis1(a[0], a[1], a[2]); } - void setAxis2 (dReal x, dReal y, dReal z) - { dJointSetPUAxis2 (get_id(), x, y, z); } - void setAxis3 (dReal x, dReal y, dReal z) - { dJointSetPUAxis3 (get_id(), x, y, z); } - void setAxis3 (const dVector3 a) - { setAxis3(a[0], a[1], a[2]); } - void setAxisP (dReal x, dReal y, dReal z) - { dJointSetPUAxis3 (get_id(), x, y, z); } - void setAxisP (const dVector3 a) - { setAxisP(a[0], a[1], a[2]); } - - virtual void getAnchor (dVector3 result) const - { dJointGetPUAnchor (get_id(), result); } - void getAxis1 (dVector3 result) const - { dJointGetPUAxis1 (get_id(), result); } - void getAxis2 (dVector3 result) const - { dJointGetPUAxis2 (get_id(), result); } - void getAxis3 (dVector3 result) const - { dJointGetPUAxis3 (get_id(), result); } - void getAxisP (dVector3 result) const - { dJointGetPUAxis3 (get_id(), result); } - - dReal getAngle1() const - { return dJointGetPUAngle1 (get_id()); } - dReal getAngle1Rate() const - { return dJointGetPUAngle1Rate (get_id()); } - dReal getAngle2() const - { return dJointGetPUAngle2 (get_id()); } - dReal getAngle2Rate() const - { return dJointGetPUAngle2Rate (get_id()); } - - dReal getPosition() const - { return dJointGetPUPosition (get_id()); } - dReal getPositionRate() const - { return dJointGetPUPositionRate (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetPUParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetPUParam (get_id(), parameter); } - // TODO: expose params through methods -}; - - - - - -template -class dPistonJointTemplate : public dJointTemplate -{ -private: - // intentionally undefined, don't use these - dPistonJointTemplate (const dPistonJointTemplate &); - void operator = (const dPistonJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dPistonJointTemplate() { } - dPistonJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreatePiston(world, group)); } - dPistonJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreatePiston(world, group)); } - - void create (dWorldID world, dJointGroupID group=0) - { - destroy(); - set_id(dJointCreatePiston(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetPistonAnchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor (a[0], a[1], a[2]); } - void getAnchor (dVector3 result) const - { dJointGetPistonAnchor (get_id(), result); } - void getAnchor2 (dVector3 result) const - { dJointGetPistonAnchor2 (get_id(), result); } - - void setAxis (dReal x, dReal y, dReal z) - { dJointSetPistonAxis (get_id(), x, y, z); } - void setAxis (const dVector3 a) - { setAxis(a[0], a[1], a[2]); } - void getAxis (dVector3 result) const - { dJointGetPistonAxis (get_id(), result); } - - dReal getPosition() const - { return dJointGetPistonPosition (get_id()); } - dReal getPositionRate() const - { return dJointGetPistonPositionRate (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetPistonParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetPistonParam (get_id(), parameter); } - // TODO: expose params through methods - - void addForce (dReal force) - { dJointAddPistonForce (get_id(), force); } -}; - - - -template -class dFixedJointTemplate : public dJointTemplate -{ -private: - // intentionally undefined, don't use these - dFixedJointTemplate (const dFixedJointTemplate &); - void operator = (const dFixedJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dFixedJointTemplate() { } - dFixedJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateFixed(world, group)); } - dFixedJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateFixed(world, group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateFixed(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void set() - { dJointSetFixed (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetFixedParam (get_id(), parameter, value); } - - virtual dReal getParam (int parameter) const - { return dJointGetFixedParam (get_id(), parameter); } - // TODO: expose params through methods -}; - - -template -class dContactJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dContactJointTemplate (const dContactJointTemplate &); - void operator = (const dContactJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dContactJointTemplate() { } - dContactJointTemplate (dWorldID world, dJointGroupID group, dContact *contact) - { set_id(dJointCreateContact(world, group, contact)); } - dContactJointTemplate (dWorldTemplate& world, dJointGroupID group, dContact *contact) - { set_id(dJointCreateContact(world.id(), group, contact)); } - - void create (dWorldID world, dJointGroupID group, dContact *contact) { - destroy(); - set_id(dJointCreateContact(world, group, contact)); - } - - void create (dWorldTemplate& world, dJointGroupID group, dContact *contact) - { create(world.id(), group, contact); } -}; - - -template -class dNullJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dNullJointTemplate (const dNullJointTemplate &); - void operator = (const dNullJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dNullJointTemplate() { } - dNullJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateNull(world, group)); } - dNullJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateNull (world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateNull(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } -}; - - -template -class dAMotorJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dAMotorJointTemplate (const dAMotorJointTemplate &); - void operator = (const dAMotorJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dAMotorJointTemplate() { } - dAMotorJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateAMotor(world, group)); } - dAMotorJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateAMotor(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateAMotor(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setMode (int mode) - { dJointSetAMotorMode (get_id(), mode); } - int getMode() const - { return dJointGetAMotorMode (get_id()); } - - void setNumAxes (int num) - { dJointSetAMotorNumAxes (get_id(), num); } - int getNumAxes() const - { return dJointGetAMotorNumAxes (get_id()); } - - void setAxis (int anum, int rel, dReal x, dReal y, dReal z) - { dJointSetAMotorAxis (get_id(), anum, rel, x, y, z); } - void setAxis (int anum, int rel, const dVector3 a) - { setAxis(anum, rel, a[0], a[1], a[2]); } - void getAxis (int anum, dVector3 result) const - { dJointGetAMotorAxis (get_id(), anum, result); } - int getAxisRel (int anum) const - { return dJointGetAMotorAxisRel (get_id(), anum); } - - void setAngle (int anum, dReal angle) - { dJointSetAMotorAngle (get_id(), anum, angle); } - dReal getAngle (int anum) const - { return dJointGetAMotorAngle (get_id(), anum); } - dReal getAngleRate (int anum) - { return dJointGetAMotorAngleRate (get_id(), anum); } - - void setParam (int parameter, dReal value) - { dJointSetAMotorParam (get_id(), parameter, value); } - dReal getParam (int parameter) const - { return dJointGetAMotorParam (get_id(), parameter); } - // TODO: expose params through methods - - void addTorques(dReal torque1, dReal torque2, dReal torque3) - { dJointAddAMotorTorques(get_id(), torque1, torque2, torque3); } -}; - - -template -class dLMotorJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dLMotorJointTemplate (const dLMotorJointTemplate &); - void operator = (const dLMotorJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dLMotorJointTemplate() { } - dLMotorJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateLMotor(world, group)); } - dLMotorJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateLMotor(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateLMotor(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setNumAxes (int num) - { dJointSetLMotorNumAxes (get_id(), num); } - int getNumAxes() const - { return dJointGetLMotorNumAxes (get_id()); } - - void setAxis (int anum, int rel, dReal x, dReal y, dReal z) - { dJointSetLMotorAxis (get_id(), anum, rel, x, y, z); } - void setAxis (int anum, int rel, const dVector3 a) - { setAxis(anum, rel, a[0], a[1], a[2]); } - void getAxis (int anum, dVector3 result) const - { dJointGetLMotorAxis (get_id(), anum, result); } - - void setParam (int parameter, dReal value) - { dJointSetLMotorParam (get_id(), parameter, value); } - dReal getParam (int parameter) const - { return dJointGetLMotorParam (get_id(), parameter); } - // TODO: expose params through methods -}; - -//} - -#if !defined(dODECPP_WORLD_TEMPLATE_BASE) - -#if defined(dODECPP_BODY_TEMPLATE_BASE) || defined(dODECPP_JOINTGROUP_TEMPLATE_BASE) || defined(dODECPP_JOINT_TEMPLATE_BASE) -#error All the odecpp template bases must be defined or not defined together -#endif - -#define dODECPP_WORLD_TEMPLATE_BASE dWorldDynamicIDContainer -#define dODECPP_BODY_TEMPLATE_BASE dBodyDynamicIDContainer -#define dODECPP_JOINTGROUP_TEMPLATE_BASE dJointGroupDynamicIDContainer -#define dODECPP_JOINT_TEMPLATE_BASE dJointDynamicIDContainer - -#else // #if defined(dODECPP_WORLD_TEMPLATE_BASE) - -#if !defined(dODECPP_BODY_TEMPLATE_BASE) || !defined(dODECPP_JOINTGROUP_TEMPLATE_BASE) || !defined(dODECPP_JOINT_TEMPLATE_BASE) -#error All the odecpp template bases must be defined or not defined together -#endif - -#endif // #if defined(dODECPP_WORLD_TEMPLATE_BASE) - - -typedef dWorldTemplate dWorld; -typedef dBodyTemplate dBody; -typedef dJointGroupTemplate dJointGroup; -typedef dJointTemplate dJoint; -typedef dBallJointTemplate dBallJoint; -typedef dHingeJointTemplate dHingeJoint; -typedef dSliderJointTemplate dSliderJoint; -typedef dUniversalJointTemplate dUniversalJoint; -typedef dHinge2JointTemplate dHinge2Joint; -typedef dPRJointTemplate dPRJoint; -typedef dPUJointTemplate dPUJoint; -typedef dPistonJointTemplate dPistonJoint; -typedef dFixedJointTemplate dFixedJoint; -typedef dContactJointTemplate dContactJoint; -typedef dNullJointTemplate dNullJoint; -typedef dAMotorJointTemplate dAMotorJoint; -typedef dLMotorJointTemplate dLMotorJoint; - - -#endif -#endif - -// Local variables: -// mode:c++ -// c-basic-offset:2 -// End: diff --git a/misc/builddeps/dp.linux32/include/ode/odecpp_collision.h b/misc/builddeps/dp.linux32/include/ode/odecpp_collision.h deleted file mode 100644 index 2377a5ef..00000000 --- a/misc/builddeps/dp.linux32/include/ode/odecpp_collision.h +++ /dev/null @@ -1,429 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* C++ interface for new collision API */ - - -#ifndef _ODE_ODECPP_COLLISION_H_ -#define _ODE_ODECPP_COLLISION_H_ -#ifdef __cplusplus - -//#include - -//namespace ode { - -class dGeom { - // intentionally undefined, don't use these - dGeom (dGeom &); - void operator= (dGeom &); - -protected: - dGeomID _id; - - dGeom() - { _id = 0; } -public: - ~dGeom() - { if (_id) dGeomDestroy (_id); } - - dGeomID id() const - { return _id; } - operator dGeomID() const - { return _id; } - - void destroy() { - if (_id) dGeomDestroy (_id); - _id = 0; - } - - int getClass() const - { return dGeomGetClass (_id); } - - dSpaceID getSpace() const - { return dGeomGetSpace (_id); } - - void setData (void *data) - { dGeomSetData (_id,data); } - void *getData() const - { return dGeomGetData (_id); } - - void setBody (dBodyID b) - { dGeomSetBody (_id,b); } - dBodyID getBody() const - { return dGeomGetBody (_id); } - - void setPosition (dReal x, dReal y, dReal z) - { dGeomSetPosition (_id,x,y,z); } - const dReal * getPosition() const - { return dGeomGetPosition (_id); } - - void setRotation (const dMatrix3 R) - { dGeomSetRotation (_id,R); } - const dReal * getRotation() const - { return dGeomGetRotation (_id); } - - void setQuaternion (const dQuaternion quat) - { dGeomSetQuaternion (_id,quat); } - void getQuaternion (dQuaternion quat) const - { dGeomGetQuaternion (_id,quat); } - - void getAABB (dReal aabb[6]) const - { dGeomGetAABB (_id, aabb); } - - int isSpace() - { return dGeomIsSpace (_id); } - - void setCategoryBits (unsigned long bits) - { dGeomSetCategoryBits (_id, bits); } - void setCollideBits (unsigned long bits) - { dGeomSetCollideBits (_id, bits); } - unsigned long getCategoryBits() - { return dGeomGetCategoryBits (_id); } - unsigned long getCollideBits() - { return dGeomGetCollideBits (_id); } - - void enable() - { dGeomEnable (_id); } - void disable() - { dGeomDisable (_id); } - int isEnabled() - { return dGeomIsEnabled (_id); } - - void getRelPointPos (dReal px, dReal py, dReal pz, dVector3 result) const - { dGeomGetRelPointPos (_id, px, py, pz, result); } - void getRelPointPos (const dVector3 p, dVector3 result) const - { getRelPointPos (p[0], p[1], p[2], result); } - - void getPosRelPoint (dReal px, dReal py, dReal pz, dVector3 result) const - { dGeomGetPosRelPoint (_id, px, py, pz, result); } - void getPosRelPoint (const dVector3 p, dVector3 result) const - { getPosRelPoint (p[0], p[1], p[2], result); } - - void vectorToWorld (dReal px, dReal py, dReal pz, dVector3 result) const - { dGeomVectorToWorld (_id, px, py, pz, result); } - void vectorToWorld (const dVector3 p, dVector3 result) const - { vectorToWorld (p[0], p[1], p[2], result); } - - void vectorFromWorld (dReal px, dReal py, dReal pz, dVector3 result) const - { dGeomVectorFromWorld (_id, px, py, pz, result); } - void vectorFromWorld (const dVector3 p, dVector3 result) const - { vectorFromWorld (p[0], p[1], p[2], result); } - - void collide2 (dGeomID g, void *data, dNearCallback *callback) - { dSpaceCollide2 (_id,g,data,callback); } -}; - - -class dSpace : public dGeom { - // intentionally undefined, don't use these - dSpace (dSpace &); - void operator= (dSpace &); - -protected: - // the default constructor is protected so that you - // can't instance this class. you must instance one - // of its subclasses instead. - dSpace () { _id = 0; } - -public: - dSpaceID id() const - { return (dSpaceID) _id; } - operator dSpaceID() const - { return (dSpaceID) _id; } - - void setCleanup (int mode) - { dSpaceSetCleanup (id(), mode); } - int getCleanup() - { return dSpaceGetCleanup (id()); } - - void add (dGeomID x) - { dSpaceAdd (id(), x); } - void remove (dGeomID x) - { dSpaceRemove (id(), x); } - int query (dGeomID x) - { return dSpaceQuery (id(),x); } - - int getNumGeoms() - { return dSpaceGetNumGeoms (id()); } - dGeomID getGeom (int i) - { return dSpaceGetGeom (id(),i); } - - void collide (void *data, dNearCallback *callback) - { dSpaceCollide (id(),data,callback); } -}; - - -class dSimpleSpace : public dSpace { - // intentionally undefined, don't use these - dSimpleSpace (dSimpleSpace &); - void operator= (dSimpleSpace &); - -public: - dSimpleSpace () - { _id = (dGeomID) dSimpleSpaceCreate (0); } - dSimpleSpace (dSpace &space) - { _id = (dGeomID) dSimpleSpaceCreate (space.id()); } - dSimpleSpace (dSpaceID space) - { _id = (dGeomID) dSimpleSpaceCreate (space); } -}; - - -class dHashSpace : public dSpace { - // intentionally undefined, don't use these - dHashSpace (dHashSpace &); - void operator= (dHashSpace &); - -public: - dHashSpace () - { _id = (dGeomID) dHashSpaceCreate (0); } - dHashSpace (dSpace &space) - { _id = (dGeomID) dHashSpaceCreate (space.id()); } - dHashSpace (dSpaceID space) - { _id = (dGeomID) dHashSpaceCreate (space); } - - void setLevels (int minlevel, int maxlevel) - { dHashSpaceSetLevels (id(),minlevel,maxlevel); } -}; - - -class dQuadTreeSpace : public dSpace { - // intentionally undefined, don't use these - dQuadTreeSpace (dQuadTreeSpace &); - void operator= (dQuadTreeSpace &); - -public: - dQuadTreeSpace (const dVector3 center, const dVector3 extents, int depth) - { _id = (dGeomID) dQuadTreeSpaceCreate (0,center,extents,depth); } - dQuadTreeSpace (dSpace &space, const dVector3 center, const dVector3 extents, int depth) - { _id = (dGeomID) dQuadTreeSpaceCreate (space.id(),center,extents,depth); } - dQuadTreeSpace (dSpaceID space, const dVector3 center, const dVector3 extents, int depth) - { _id = (dGeomID) dQuadTreeSpaceCreate (space,center,extents,depth); } -}; - - -class dSphere : public dGeom { - // intentionally undefined, don't use these - dSphere (dSphere &); - void operator= (dSphere &); - -public: - dSphere () { } - dSphere (dReal radius) - { _id = dCreateSphere (0, radius); } - dSphere (dSpace &space, dReal radius) - { _id = dCreateSphere (space.id(), radius); } - dSphere (dSpaceID space, dReal radius) - { _id = dCreateSphere (space, radius); } - - void create (dSpaceID space, dReal radius) { - if (_id) dGeomDestroy (_id); - _id = dCreateSphere (space, radius); - } - - void setRadius (dReal radius) - { dGeomSphereSetRadius (_id, radius); } - dReal getRadius() const - { return dGeomSphereGetRadius (_id); } -}; - - -class dBox : public dGeom { - // intentionally undefined, don't use these - dBox (dBox &); - void operator= (dBox &); - -public: - dBox () { } - dBox (dReal lx, dReal ly, dReal lz) - { _id = dCreateBox (0,lx,ly,lz); } - dBox (dSpace &space, dReal lx, dReal ly, dReal lz) - { _id = dCreateBox (space,lx,ly,lz); } - dBox (dSpaceID space, dReal lx, dReal ly, dReal lz) - { _id = dCreateBox (space,lx,ly,lz); } - - void create (dSpaceID space, dReal lx, dReal ly, dReal lz) { - if (_id) dGeomDestroy (_id); - _id = dCreateBox (space,lx,ly,lz); - } - - void setLengths (dReal lx, dReal ly, dReal lz) - { dGeomBoxSetLengths (_id, lx, ly, lz); } - void getLengths (dVector3 result) const - { dGeomBoxGetLengths (_id,result); } -}; - - -class dPlane : public dGeom { - // intentionally undefined, don't use these - dPlane (dPlane &); - void operator= (dPlane &); - -public: - dPlane() { } - dPlane (dReal a, dReal b, dReal c, dReal d) - { _id = dCreatePlane (0,a,b,c,d); } - dPlane (dSpace &space, dReal a, dReal b, dReal c, dReal d) - { _id = dCreatePlane (space.id(),a,b,c,d); } - dPlane (dSpaceID space, dReal a, dReal b, dReal c, dReal d) - { _id = dCreatePlane (space,a,b,c,d); } - - void create (dSpaceID space, dReal a, dReal b, dReal c, dReal d) { - if (_id) dGeomDestroy (_id); - _id = dCreatePlane (space,a,b,c,d); - } - - void setParams (dReal a, dReal b, dReal c, dReal d) - { dGeomPlaneSetParams (_id, a, b, c, d); } - void getParams (dVector4 result) const - { dGeomPlaneGetParams (_id,result); } -}; - - -class dCapsule : public dGeom { - // intentionally undefined, don't use these - dCapsule (dCapsule &); - void operator= (dCapsule &); - -public: - dCapsule() { } - dCapsule (dReal radius, dReal length) - { _id = dCreateCapsule (0,radius,length); } - dCapsule (dSpace &space, dReal radius, dReal length) - { _id = dCreateCapsule (space.id(),radius,length); } - dCapsule (dSpaceID space, dReal radius, dReal length) - { _id = dCreateCapsule (space,radius,length); } - - void create (dSpaceID space, dReal radius, dReal length) { - if (_id) dGeomDestroy (_id); - _id = dCreateCapsule (space,radius,length); - } - - void setParams (dReal radius, dReal length) - { dGeomCapsuleSetParams (_id, radius, length); } - void getParams (dReal *radius, dReal *length) const - { dGeomCapsuleGetParams (_id,radius,length); } -}; - - -class dCylinder : public dGeom { - // intentionally undefined, don't use these - dCylinder (dCylinder &); - void operator= (dCylinder &); - -public: - dCylinder() { } - dCylinder (dReal radius, dReal length) - { _id = dCreateCylinder (0,radius,length); } - dCylinder (dSpace &space, dReal radius, dReal length) - { _id = dCreateCylinder (space.id(),radius,length); } - dCylinder (dSpaceID space, dReal radius, dReal length) - { _id = dCreateCylinder (space,radius,length); } - - void create (dSpaceID space, dReal radius, dReal length) { - if (_id) dGeomDestroy (_id); - _id = dCreateCylinder (space,radius,length); - } - - void setParams (dReal radius, dReal length) - { dGeomCylinderSetParams (_id, radius, length); } - void getParams (dReal *radius, dReal *length) const - { dGeomCylinderGetParams (_id,radius,length); } -}; - - -class dRay : public dGeom { - // intentionally undefined, don't use these - dRay (dRay &); - void operator= (dRay &); - -public: - dRay() { } - dRay (dReal length) - { _id = dCreateRay (0,length); } - dRay (dSpace &space, dReal length) - { _id = dCreateRay (space.id(),length); } - dRay (dSpaceID space, dReal length) - { _id = dCreateRay (space,length); } - - void create (dSpaceID space, dReal length) { - if (_id) dGeomDestroy (_id); - _id = dCreateRay (space,length); - } - - void setLength (dReal length) - { dGeomRaySetLength (_id, length); } - dReal getLength() - { return dGeomRayGetLength (_id); } - - void set (dReal px, dReal py, dReal pz, dReal dx, dReal dy, dReal dz) - { dGeomRaySet (_id, px, py, pz, dx, dy, dz); } - void get (dVector3 start, dVector3 dir) - { dGeomRayGet (_id, start, dir); } - - void setParams (int firstContact, int backfaceCull) - { dGeomRaySetParams (_id, firstContact, backfaceCull); } - void getParams (int *firstContact, int *backfaceCull) - { dGeomRayGetParams (_id, firstContact, backfaceCull); } - void setClosestHit (int closestHit) - { dGeomRaySetClosestHit (_id, closestHit); } - int getClosestHit() - { return dGeomRayGetClosestHit (_id); } -}; - - -class dGeomTransform : public dGeom { - // intentionally undefined, don't use these - dGeomTransform (dGeomTransform &); - void operator= (dGeomTransform &); - -public: - dGeomTransform() { } - dGeomTransform (dSpace &space) - { _id = dCreateGeomTransform (space.id()); } - dGeomTransform (dSpaceID space) - { _id = dCreateGeomTransform (space); } - - void create (dSpaceID space=0) { - if (_id) dGeomDestroy (_id); - _id = dCreateGeomTransform (space); - } - - void setGeom (dGeomID geom) - { dGeomTransformSetGeom (_id, geom); } - dGeomID getGeom() const - { return dGeomTransformGetGeom (_id); } - - void setCleanup (int mode) - { dGeomTransformSetCleanup (_id,mode); } - int getCleanup () - { return dGeomTransformGetCleanup (_id); } - - void setInfo (int mode) - { dGeomTransformSetInfo (_id,mode); } - int getInfo() - { return dGeomTransformGetInfo (_id); } -}; - -//} - -#endif -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/odeinit.h b/misc/builddeps/dp.linux32/include/ode/odeinit.h deleted file mode 100644 index bb430c8f..00000000 --- a/misc/builddeps/dp.linux32/include/ode/odeinit.h +++ /dev/null @@ -1,236 +0,0 @@ -/************************************************************************* -* * -* Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * -* All rights reserved. Email: russ@q12.org Web: www.q12.org * -* * -* This library is free software; you can redistribute it and/or * -* modify it under the terms of EITHER: * -* (1) The GNU Lesser General Public License as published by the Free * -* Software Foundation; either version 2.1 of the License, or (at * -* your option) any later version. The text of the GNU Lesser * -* General Public License is included with this library in the * -* file LICENSE.TXT. * -* (2) The BSD-style license that is included with this library in * -* the file LICENSE-BSD.TXT. * -* * -* 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 files * -* LICENSE.TXT and LICENSE-BSD.TXT for more details. * -* * -*************************************************************************/ - -/* Library initialization/finalization functions. */ - -#ifndef _ODE_ODEINIT_H_ -#define _ODE_ODEINIT_H_ - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - -/* ************************************************************************ */ -/* Library initialization */ - -/** - * @defgroup init Library Initialization - * - * Library initialization functions prepare ODE internal data structures for use - * and release allocated resources after ODE is not needed any more. - */ - - -/** - * @brief Library initialization flags. - * - * These flags define ODE library initialization options. - * - * @c dInitFlagManualThreadCleanup indicates that resources allocated in TLS for threads - * using ODE are to be cleared by library client with explicit call to @c dCleanupODEAllDataForThread. - * If this flag is not specified the automatic resource tracking algorithm is used. - * - * With automatic resource tracking, On Windows, memory allocated for a thread may - * remain not freed for some time after the thread exits. The resources may be - * released when one of other threads calls @c dAllocateODEDataForThread. Ultimately, - * the resources are released when library is closed with @c dCloseODE. On other - * operating systems resources are always released by the thread itself on its exit - * or on library closure with @c dCloseODE. - * - * With manual thread data cleanup mode every collision space object must be - * explicitly switched to manual cleanup mode with @c dSpaceSetManualCleanup - * after creation. See description of the function for more details. - * - * If @c dInitFlagManualThreadCleanup was not specified during initialization, - * calls to @c dCleanupODEAllDataForThread are not allowed. - * - * @see dInitODE2 - * @see dAllocateODEDataForThread - * @see dSpaceSetManualCleanup - * @see dCloseODE - * @ingroup init - */ -enum dInitODEFlags { - dInitFlagManualThreadCleanup = 0x00000001 //@< Thread local data is to be cleared explicitly on @c dCleanupODEAllDataForThread function call -}; - -/** - * @brief Initializes ODE library. - * - * @c dInitODE is obsolete. @c dInitODE2 is to be used for library initialization. - * - * A call to @c dInitODE is equal to the following initialization sequence - * @code - * dInitODE2(0); - * dAllocateODEDataForThread(dAllocateMaskAll); - * @endcode - * - * @see dInitODE2 - * @see dAllocateODEDataForThread - * @ingroup init - */ -ODE_API void dInitODE(void); - -/** - * @brief Initializes ODE library. - * @param uiInitFlags Initialization options bitmask - * @return A nonzero if initialization succeeded and zero otherwise. - * - * This function must be called to initialize ODE library before first use. If - * initialization succeeds the function may not be called again until library is - * closed with a call to @c dCloseODE. - * - * The @a uiInitFlags parameter specifies initialization options to be used. These - * can be combination of zero or more @c dInitODEFlags flags. - * - * @note - * If @c dInitFlagManualThreadCleanup flag is used for initialization, - * @c dSpaceSetManualCleanup must be called to set manual cleanup mode for every - * space object right after creation. Failure to do so may lead to resource leaks. - * - * @see dInitODEFlags - * @see dCloseODE - * @see dSpaceSetManualCleanup - * @ingroup init - */ -ODE_API int dInitODE2(unsigned int uiInitFlags/*=0*/); - - -/** - * @brief ODE data allocation flags. - * - * These flags are used to indicate which data is to be pre-allocated in call to - * @c dAllocateODEDataForThread. - * - * @c dAllocateFlagBasicData tells to allocate the basic data set required for - * normal library operation. This flag is equal to zero and is always implicitly - * included. - * - * @c dAllocateFlagCollisionData tells that collision detection data is to be allocated. - * Collision detection functions may not be called if the data has not be allocated - * in advance. If collision detection is not going to be used, it is not necessary - * to specify this flag. - * - * @c dAllocateMaskAll is a mask that can be used for for allocating all possible - * data in cases when it is not known what exactly features of ODE will be used. - * The mask may not be used in combination with other flags. It is guaranteed to - * include all the current and future legal allocation flags. However, mature - * applications should use explicit flags they need rather than allocating everything. - * - * @see dAllocateODEDataForThread - * @ingroup init - */ -enum dAllocateODEDataFlags { - dAllocateFlagBasicData = 0, //@< Allocate basic data required for library to operate - - dAllocateFlagCollisionData = 0x00000001, //@< Allocate data for collision detection - - dAllocateMaskAll = ~0U //@< Allocate all the possible data that is currently defined or will be defined in the future. -}; - -/** - * @brief Allocate thread local data to allow the thread calling ODE. - * @param uiAllocateFlags Allocation options bitmask. - * @return A nonzero if allocation succeeded and zero otherwise. - * - * The function is required to be called for every thread that is going to use - * ODE. This function allocates the data that is required for accessing ODE from - * current thread along with optional data required for particular ODE subsystems. - * - * @a uiAllocateFlags parameter can contain zero or more flags from @c dAllocateODEDataFlags - * enumerated type. Multiple calls with different allocation flags are allowed. - * The flags that are already allocated are ignored in subsequent calls. If zero - * is passed as the parameter, it means to only allocate the set of most important - * data the library can not operate without. - * - * If the function returns failure status it means that none of the requested - * data has been allocated. The client may retry allocation attempt with the same - * flags when more system resources are available. - * - * @see dAllocateODEDataFlags - * @see dCleanupODEAllDataForThread - * @ingroup init - */ -ODE_API int dAllocateODEDataForThread(unsigned int uiAllocateFlags); - -/** - * @brief Free thread local data that was allocated for current thread. - * - * If library was initialized with @c dInitFlagManualThreadCleanup flag the function - * is required to be called on exit of every thread that was calling @c dAllocateODEDataForThread. - * Failure to call @c dCleanupODEAllDataForThread may result in some resources remaining - * not freed until program exit. The function may also be called when ODE is still - * being used to release resources allocated for all the current subsystems and - * possibly proceed with data pre-allocation for other subsystems. - * - * The function can safely be called several times in a row. The function can be - * called without prior invocation of @c dAllocateODEDataForThread. The function - * may not be called before ODE is initialized with @c dInitODE2 or after library - * has been closed with @c dCloseODE. A call to @c dCloseODE implicitly releases - * all the thread local resources that might be allocated for all the threads that - * were using ODE. - * - * If library was initialized without @c dInitFlagManualThreadCleanup flag - * @c dCleanupODEAllDataForThread must not be called. - * - * @see dAllocateODEDataForThread - * @see dInitODE2 - * @see dCloseODE - * @ingroup init - */ -ODE_API void dCleanupODEAllDataForThread(); - - -/** - * @brief Close ODE after it is not needed any more. - * - * The function is required to be called when program does not need ODE features any more. - * The call to @c dCloseODE releases all the resources allocated for library - * including all the thread local data that might be allocated for all the threads - * that were using ODE. - * - * @c dCloseODE is a paired function for @c dInitODE2 and must only be called - * after successful library initialization. - * - * @note Important! - * Make sure that all the threads that were using ODE have already terminated - * before calling @c dCloseODE. In particular it is not allowed to call - * @c dCleanupODEAllDataForThread after @c dCloseODE. - * - * @see dInitODE2 - * @see dCleanupODEAllDataForThread - * @ingroup init - */ -ODE_API void dCloseODE(void); - - - -#ifdef __cplusplus -} // extern "C" -#endif - - -#endif // _ODE_ODEINIT_H_ diff --git a/misc/builddeps/dp.linux32/include/ode/odemath.h b/misc/builddeps/dp.linux32/include/ode/odemath.h deleted file mode 100644 index 2e689dbf..00000000 --- a/misc/builddeps/dp.linux32/include/ode/odemath.h +++ /dev/null @@ -1,473 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_ODEMATH_H_ -#define _ODE_ODEMATH_H_ - -#include - -/* - * macro to access elements i,j in an NxM matrix A, independent of the - * matrix storage convention. - */ -#define dACCESS33(A,i,j) ((A)[(i)*4+(j)]) - -/* - * Macro to test for valid floating point values - */ -#define dVALIDVEC3(v) (!(dIsNan(v[0]) || dIsNan(v[1]) || dIsNan(v[2]))) -#define dVALIDVEC4(v) (!(dIsNan(v[0]) || dIsNan(v[1]) || dIsNan(v[2]) || dIsNan(v[3]))) -#define dVALIDMAT3(m) (!(dIsNan(m[0]) || dIsNan(m[1]) || dIsNan(m[2]) || dIsNan(m[3]) || dIsNan(m[4]) || dIsNan(m[5]) || dIsNan(m[6]) || dIsNan(m[7]) || dIsNan(m[8]) || dIsNan(m[9]) || dIsNan(m[10]) || dIsNan(m[11]))) -#define dVALIDMAT4(m) (!(dIsNan(m[0]) || dIsNan(m[1]) || dIsNan(m[2]) || dIsNan(m[3]) || dIsNan(m[4]) || dIsNan(m[5]) || dIsNan(m[6]) || dIsNan(m[7]) || dIsNan(m[8]) || dIsNan(m[9]) || dIsNan(m[10]) || dIsNan(m[11]) || dIsNan(m[12]) || dIsNan(m[13]) || dIsNan(m[14]) || dIsNan(m[15]) )) - - - -// Some vector math -PURE_INLINE void dAddVectors3(dReal *res, const dReal *a, const dReal *b) -{ - dReal res_0, res_1, res_2; - res_0 = a[0] + b[0]; - res_1 = a[1] + b[1]; - res_2 = a[2] + b[2]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dSubtractVectors3(dReal *res, const dReal *a, const dReal *b) -{ - dReal res_0, res_1, res_2; - res_0 = a[0] - b[0]; - res_1 = a[1] - b[1]; - res_2 = a[2] - b[2]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dAddScaledVectors3(dReal *res, const dReal *a, const dReal *b, dReal a_scale, dReal b_scale) -{ - dReal res_0, res_1, res_2; - res_0 = a_scale * a[0] + b_scale * b[0]; - res_1 = a_scale * a[1] + b_scale * b[1]; - res_2 = a_scale * a[2] + b_scale * b[2]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dScaleVector3(dReal *res, dReal nScale) -{ - res[0] *= nScale ; - res[1] *= nScale ; - res[2] *= nScale ; -} - -PURE_INLINE void dNegateVector3(dReal *res) -{ - res[0] = -res[0]; - res[1] = -res[1]; - res[2] = -res[2]; -} - -PURE_INLINE void dCopyVector3(dReal *res, const dReal *a) -{ - dReal res_0, res_1, res_2; - res_0 = a[0]; - res_1 = a[1]; - res_2 = a[2]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dCopyScaledVector3(dReal *res, const dReal *a, dReal nScale) -{ - dReal res_0, res_1, res_2; - res_0 = a[0] * nScale; - res_1 = a[1] * nScale; - res_2 = a[2] * nScale; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dCopyNegatedVector3(dReal *res, const dReal *a) -{ - dReal res_0, res_1, res_2; - res_0 = -a[0]; - res_1 = -a[1]; - res_2 = -a[2]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dCopyVector4(dReal *res, const dReal *a) -{ - dReal res_0, res_1, res_2, res_3; - res_0 = a[0]; - res_1 = a[1]; - res_2 = a[2]; - res_3 = a[3]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; res[3] = res_3; -} - -PURE_INLINE void dCopyMatrix4x4(dReal *res, const dReal *a) -{ - dCopyVector4(res + 0, a + 0); - dCopyVector4(res + 4, a + 4); - dCopyVector4(res + 8, a + 8); -} - -PURE_INLINE void dCopyMatrix4x3(dReal *res, const dReal *a) -{ - dCopyVector3(res + 0, a + 0); - dCopyVector3(res + 4, a + 4); - dCopyVector3(res + 8, a + 8); -} - -PURE_INLINE void dGetMatrixColumn3(dReal *res, const dReal *a, unsigned n) -{ - dReal res_0, res_1, res_2; - res_0 = a[n + 0]; - res_1 = a[n + 4]; - res_2 = a[n + 8]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE dReal dCalcVectorLength3(const dReal *a) -{ - return dSqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); -} - -PURE_INLINE dReal dCalcVectorLengthSquare3(const dReal *a) -{ - return (a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); -} - -PURE_INLINE dReal dCalcPointDepth3(const dReal *test_p, const dReal *plane_p, const dReal *plane_n) -{ - return (plane_p[0] - test_p[0]) * plane_n[0] + (plane_p[1] - test_p[1]) * plane_n[1] + (plane_p[2] - test_p[2]) * plane_n[2]; -} - - -/* -* 3-way dot product. _dCalcVectorDot3 means that elements of `a' and `b' are spaced -* step_a and step_b indexes apart respectively. dCalcVectorDot3() means dDot311. -*/ - -PURE_INLINE dReal _dCalcVectorDot3(const dReal *a, const dReal *b, unsigned step_a, unsigned step_b) -{ - return a[0] * b[0] + a[step_a] * b[step_b] + a[2 * step_a] * b[2 * step_b]; -} - - -PURE_INLINE dReal dCalcVectorDot3 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,1,1); } -PURE_INLINE dReal dCalcVectorDot3_13 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,1,3); } -PURE_INLINE dReal dCalcVectorDot3_31 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,3,1); } -PURE_INLINE dReal dCalcVectorDot3_33 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,3,3); } -PURE_INLINE dReal dCalcVectorDot3_14 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,1,4); } -PURE_INLINE dReal dCalcVectorDot3_41 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,4,1); } -PURE_INLINE dReal dCalcVectorDot3_44 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,4,4); } - - -/* - * cross product, set res = a x b. _dCalcVectorCross3 means that elements of `res', `a' - * and `b' are spaced step_res, step_a and step_b indexes apart respectively. - * dCalcVectorCross3() means dCross3111. - */ - -PURE_INLINE void _dCalcVectorCross3(dReal *res, const dReal *a, const dReal *b, unsigned step_res, unsigned step_a, unsigned step_b) -{ - dReal res_0, res_1, res_2; - res_0 = a[ step_a]*b[2*step_b] - a[2*step_a]*b[ step_b]; - res_1 = a[2*step_a]*b[ 0] - a[ 0]*b[2*step_b]; - res_2 = a[ 0]*b[ step_b] - a[ step_a]*b[ 0]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[ 0] = res_0; - res[ step_res] = res_1; - res[2*step_res] = res_2; -} - -PURE_INLINE void dCalcVectorCross3 (dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 1, 1, 1); } -PURE_INLINE void dCalcVectorCross3_114(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 1, 1, 4); } -PURE_INLINE void dCalcVectorCross3_141(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 1, 4, 1); } -PURE_INLINE void dCalcVectorCross3_144(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 1, 4, 4); } -PURE_INLINE void dCalcVectorCross3_411(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 4, 1, 1); } -PURE_INLINE void dCalcVectorCross3_414(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 4, 1, 4); } -PURE_INLINE void dCalcVectorCross3_441(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 4, 4, 1); } -PURE_INLINE void dCalcVectorCross3_444(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 4, 4, 4); } - -PURE_INLINE void dAddVectorCross3(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dCalcVectorCross3(tmp, a, b); - dAddVectors3(res, res, tmp); -} - -PURE_INLINE void dSubtractVectorCross3(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dCalcVectorCross3(tmp, a, b); - dSubtractVectors3(res, res, tmp); -} - - -/* - * set a 3x3 submatrix of A to a matrix such that submatrix(A)*b = a x b. - * A is stored by rows, and has `skip' elements per row. the matrix is - * assumed to be already zero, so this does not write zero elements! - * if (plus,minus) is (+,-) then a positive version will be written. - * if (plus,minus) is (-,+) then a negative version will be written. - */ - -PURE_INLINE void dSetCrossMatrixPlus(dReal *res, const dReal *a, unsigned skip) -{ - const dReal a_0 = a[0], a_1 = a[1], a_2 = a[2]; - res[1] = -a_2; - res[2] = +a_1; - res[skip+0] = +a_2; - res[skip+2] = -a_0; - res[2*skip+0] = -a_1; - res[2*skip+1] = +a_0; -} - -PURE_INLINE void dSetCrossMatrixMinus(dReal *res, const dReal *a, unsigned skip) -{ - const dReal a_0 = a[0], a_1 = a[1], a_2 = a[2]; - res[1] = +a_2; - res[2] = -a_1; - res[skip+0] = -a_2; - res[skip+2] = +a_0; - res[2*skip+0] = +a_1; - res[2*skip+1] = -a_0; -} - - -/* - * compute the distance between two 3D-vectors - */ - -PURE_INLINE dReal dCalcPointsDistance3(const dReal *a, const dReal *b) -{ - dReal res; - dReal tmp[3]; - dSubtractVectors3(tmp, a, b); - res = dCalcVectorLength3(tmp); - return res; -} - -/* - * special case matrix multiplication, with operator selection - */ - -PURE_INLINE void dMultiplyHelper0_331(dReal *res, const dReal *a, const dReal *b) -{ - dReal res_0, res_1, res_2; - res_0 = dCalcVectorDot3(a, b); - res_1 = dCalcVectorDot3(a + 4, b); - res_2 = dCalcVectorDot3(a + 8, b); - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dMultiplyHelper1_331(dReal *res, const dReal *a, const dReal *b) -{ - dReal res_0, res_1, res_2; - res_0 = dCalcVectorDot3_41(a, b); - res_1 = dCalcVectorDot3_41(a + 1, b); - res_2 = dCalcVectorDot3_41(a + 2, b); - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dMultiplyHelper0_133(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper1_331(res, b, a); -} - -PURE_INLINE void dMultiplyHelper1_133(dReal *res, const dReal *a, const dReal *b) -{ - dReal res_0, res_1, res_2; - res_0 = dCalcVectorDot3_44(a, b); - res_1 = dCalcVectorDot3_44(a + 1, b); - res_2 = dCalcVectorDot3_44(a + 2, b); - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -/* -Note: NEVER call any of these functions/macros with the same variable for A and C, -it is not equivalent to A*=B. -*/ - -PURE_INLINE void dMultiply0_331(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper0_331(res, a, b); -} - -PURE_INLINE void dMultiply1_331(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper1_331(res, a, b); -} - -PURE_INLINE void dMultiply0_133(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper0_133(res, a, b); -} - -PURE_INLINE void dMultiply0_333(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper0_133(res + 0, a + 0, b); - dMultiplyHelper0_133(res + 4, a + 4, b); - dMultiplyHelper0_133(res + 8, a + 8, b); -} - -PURE_INLINE void dMultiply1_333(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper1_133(res + 0, b, a + 0); - dMultiplyHelper1_133(res + 4, b, a + 1); - dMultiplyHelper1_133(res + 8, b, a + 2); -} - -PURE_INLINE void dMultiply2_333(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper0_331(res + 0, b, a + 0); - dMultiplyHelper0_331(res + 4, b, a + 4); - dMultiplyHelper0_331(res + 8, b, a + 8); -} - -PURE_INLINE void dMultiplyAdd0_331(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dMultiplyHelper0_331(tmp, a, b); - dAddVectors3(res, res, tmp); -} - -PURE_INLINE void dMultiplyAdd1_331(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dMultiplyHelper1_331(tmp, a, b); - dAddVectors3(res, res, tmp); -} - -PURE_INLINE void dMultiplyAdd0_133(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dMultiplyHelper0_133(tmp, a, b); - dAddVectors3(res, res, tmp); -} - -PURE_INLINE void dMultiplyAdd0_333(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dMultiplyHelper0_133(tmp, a + 0, b); - dAddVectors3(res+ 0, res + 0, tmp); - dMultiplyHelper0_133(tmp, a + 4, b); - dAddVectors3(res + 4, res + 4, tmp); - dMultiplyHelper0_133(tmp, a + 8, b); - dAddVectors3(res + 8, res + 8, tmp); -} - -PURE_INLINE void dMultiplyAdd1_333(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dMultiplyHelper1_133(tmp, b, a + 0); - dAddVectors3(res + 0, res + 0, tmp); - dMultiplyHelper1_133(tmp, b, a + 1); - dAddVectors3(res + 4, res + 4, tmp); - dMultiplyHelper1_133(tmp, b, a + 2); - dAddVectors3(res + 8, res + 8, tmp); -} - -PURE_INLINE void dMultiplyAdd2_333(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dMultiplyHelper0_331(tmp, b, a + 0); - dAddVectors3(res + 0, res + 0, tmp); - dMultiplyHelper0_331(tmp, b, a + 4); - dAddVectors3(res + 4, res + 4, tmp); - dMultiplyHelper0_331(tmp, b, a + 8); - dAddVectors3(res + 8, res + 8, tmp); -} - - -// Include legacy macros here -#include - - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * normalize 3x1 and 4x1 vectors (i.e. scale them to unit length) - */ - -// For DLL export -ODE_API int dSafeNormalize3 (dVector3 a); -ODE_API int dSafeNormalize4 (dVector4 a); -ODE_API void dNormalize3 (dVector3 a); // Potentially asserts on zero vec -ODE_API void dNormalize4 (dVector4 a); // Potentially asserts on zero vec - -#if defined(__ODE__) - -int _dSafeNormalize3 (dVector3 a); -int _dSafeNormalize4 (dVector4 a); - -PURE_INLINE void _dNormalize3(dVector3 a) -{ - int bNormalizationResult = _dSafeNormalize3(a); - dIVERIFY(bNormalizationResult); -} - -PURE_INLINE void _dNormalize4(dVector4 a) -{ - int bNormalizationResult = _dSafeNormalize4(a); - dIVERIFY(bNormalizationResult); -} - -// For internal use -#define dSafeNormalize3(a) _dSafeNormalize3(a) -#define dSafeNormalize4(a) _dSafeNormalize4(a) -#define dNormalize3(a) _dNormalize3(a) -#define dNormalize4(a) _dNormalize4(a) - -#endif // defined(__ODE__) - -/* - * given a unit length "normal" vector n, generate vectors p and q vectors - * that are an orthonormal basis for the plane space perpendicular to n. - * i.e. this makes p,q such that n,p,q are all perpendicular to each other. - * q will equal n x p. if n is not unit length then p will be unit length but - * q wont be. - */ - -ODE_API void dPlaneSpace (const dVector3 n, dVector3 p, dVector3 q); -/* Makes sure the matrix is a proper rotation */ -ODE_API void dOrthogonalizeR(dMatrix3 m); - - - -#ifdef __cplusplus -} -#endif - - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/odemath_legacy.h b/misc/builddeps/dp.linux32/include/ode/odemath_legacy.h deleted file mode 100644 index b7426380..00000000 --- a/misc/builddeps/dp.linux32/include/ode/odemath_legacy.h +++ /dev/null @@ -1,181 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_ODEMATH_LEGACY_H_ -#define _ODE_ODEMATH_LEGACY_H_ - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -* These macros are not used any more inside of ODE -* They are kept for backward compatibility with external code that -* might still be using them. -*/ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -/* -* General purpose vector operations with other vectors or constants. -*/ - -#define dOP(a,op,b,c) do { \ - (a)[0] = ((b)[0]) op ((c)[0]); \ - (a)[1] = ((b)[1]) op ((c)[1]); \ - (a)[2] = ((b)[2]) op ((c)[2]); \ -} while (0) -#define dOPC(a,op,b,c) do { \ - (a)[0] = ((b)[0]) op (c); \ - (a)[1] = ((b)[1]) op (c); \ - (a)[2] = ((b)[2]) op (c); \ -} while (0) -#define dOPE(a,op,b) do {\ - (a)[0] op ((b)[0]); \ - (a)[1] op ((b)[1]); \ - (a)[2] op ((b)[2]); \ -} while (0) -#define dOPEC(a,op,c) do { \ - (a)[0] op (c); \ - (a)[1] op (c); \ - (a)[2] op (c); \ -} while (0) - -/// Define an equation with operators -/// For example this function can be used to replace -///
-/// for (int i=0; i<3; ++i)
-///   a[i] += b[i] + c[i];
-/// 
-#define dOPE2(a,op1,b,op2,c) do { \ - (a)[0] op1 ((b)[0]) op2 ((c)[0]); \ - (a)[1] op1 ((b)[1]) op2 ((c)[1]); \ - (a)[2] op1 ((b)[2]) op2 ((c)[2]); \ -} while (0) - - -#define dLENGTHSQUARED(a) dCalcVectorLengthSquare3(a) -#define dLENGTH(a) dCalcVectorLength3(a) -#define dDISTANCE(a, b) dCalcPointsDistance3(a, b) - - -#define dDOT(a, b) dCalcVectorDot3(a, b) -#define dDOT13(a, b) dCalcVectorDot3_13(a, b) -#define dDOT31(a, b) dCalcVectorDot3_31(a, b) -#define dDOT33(a, b) dCalcVectorDot3_33(a, b) -#define dDOT14(a, b) dCalcVectorDot3_14(a, b) -#define dDOT41(a, b) dCalcVectorDot3_41(a, b) -#define dDOT44(a, b) dCalcVectorDot3_44(a, b) - - -/* -* cross product, set a = b x c. dCROSSpqr means that elements of `a', `b' -* and `c' are spaced p, q and r indexes apart respectively. -* dCROSS() means dCROSS111. `op' is normally `=', but you can set it to -* +=, -= etc to get other effects. -*/ - -#define dCROSS(a,op,b,c) \ - do { \ - (a)[0] op ((b)[1]*(c)[2] - (b)[2]*(c)[1]); \ - (a)[1] op ((b)[2]*(c)[0] - (b)[0]*(c)[2]); \ - (a)[2] op ((b)[0]*(c)[1] - (b)[1]*(c)[0]); \ - } while(0) -#define dCROSSpqr(a,op,b,c,p,q,r) \ - do { \ - (a)[ 0] op ((b)[ q]*(c)[2*r] - (b)[2*q]*(c)[ r]); \ - (a)[ p] op ((b)[2*q]*(c)[ 0] - (b)[ 0]*(c)[2*r]); \ - (a)[2*p] op ((b)[ 0]*(c)[ r] - (b)[ q]*(c)[ 0]); \ - } while(0) -#define dCROSS114(a,op,b,c) dCROSSpqr(a,op,b,c,1,1,4) -#define dCROSS141(a,op,b,c) dCROSSpqr(a,op,b,c,1,4,1) -#define dCROSS144(a,op,b,c) dCROSSpqr(a,op,b,c,1,4,4) -#define dCROSS411(a,op,b,c) dCROSSpqr(a,op,b,c,4,1,1) -#define dCROSS414(a,op,b,c) dCROSSpqr(a,op,b,c,4,1,4) -#define dCROSS441(a,op,b,c) dCROSSpqr(a,op,b,c,4,4,1) -#define dCROSS444(a,op,b,c) dCROSSpqr(a,op,b,c,4,4,4) - - -/* -* set a 3x3 submatrix of A to a matrix such that submatrix(A)*b = a x b. -* A is stored by rows, and has `skip' elements per row. the matrix is -* assumed to be already zero, so this does not write zero elements! -* if (plus,minus) is (+,-) then a positive version will be written. -* if (plus,minus) is (-,+) then a negative version will be written. -*/ - -#define dCROSSMAT(A,a,skip,plus,minus) \ - do { \ - (A)[1] = minus (a)[2]; \ - (A)[2] = plus (a)[1]; \ - (A)[(skip)+0] = plus (a)[2]; \ - (A)[(skip)+2] = minus (a)[0]; \ - (A)[2*(skip)+0] = minus (a)[1]; \ - (A)[2*(skip)+1] = plus (a)[0]; \ - } while(0) - - - - -/* -Note: NEVER call any of these functions/macros with the same variable for A and C, -it is not equivalent to A*=B. -*/ - -#define dMULTIPLY0_331(A, B, C) dMultiply0_331(A, B, C) -#define dMULTIPLY1_331(A, B, C) dMultiply1_331(A, B, C) -#define dMULTIPLY0_133(A, B, C) dMultiply0_133(A, B, C) -#define dMULTIPLY0_333(A, B, C) dMultiply0_333(A, B, C) -#define dMULTIPLY1_333(A, B, C) dMultiply1_333(A, B, C) -#define dMULTIPLY2_333(A, B, C) dMultiply2_333(A, B, C) - -#define dMULTIPLYADD0_331(A, B, C) dMultiplyAdd0_331(A, B, C) -#define dMULTIPLYADD1_331(A, B, C) dMultiplyAdd1_331(A, B, C) -#define dMULTIPLYADD0_133(A, B, C) dMultiplyAdd0_133(A, B, C) -#define dMULTIPLYADD0_333(A, B, C) dMultiplyAdd0_333(A, B, C) -#define dMULTIPLYADD1_333(A, B, C) dMultiplyAdd1_333(A, B, C) -#define dMULTIPLYADD2_333(A, B, C) dMultiplyAdd2_333(A, B, C) - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -* These macros are not used any more inside of ODE -* They are kept for backward compatibility with external code that -* might still be using them. -*/ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - - -#endif // #ifndef _ODE_ODEMATH_LEGACY_H_ diff --git a/misc/builddeps/dp.linux32/include/ode/rotation.h b/misc/builddeps/dp.linux32/include/ode/rotation.h deleted file mode 100644 index a72be27f..00000000 --- a/misc/builddeps/dp.linux32/include/ode/rotation.h +++ /dev/null @@ -1,70 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_ROTATION_H_ -#define _ODE_ROTATION_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -ODE_API void dRSetIdentity (dMatrix3 R); - -ODE_API void dRFromAxisAndAngle (dMatrix3 R, dReal ax, dReal ay, dReal az, - dReal angle); - -ODE_API void dRFromEulerAngles (dMatrix3 R, dReal phi, dReal theta, dReal psi); - -ODE_API void dRFrom2Axes (dMatrix3 R, dReal ax, dReal ay, dReal az, - dReal bx, dReal by, dReal bz); - -ODE_API void dRFromZAxis (dMatrix3 R, dReal ax, dReal ay, dReal az); - -ODE_API void dQSetIdentity (dQuaternion q); - -ODE_API void dQFromAxisAndAngle (dQuaternion q, dReal ax, dReal ay, dReal az, - dReal angle); - -/* Quaternion multiplication, analogous to the matrix multiplication routines. */ -/* qa = rotate by qc, then qb */ -ODE_API void dQMultiply0 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc); -/* qa = rotate by qc, then by inverse of qb */ -ODE_API void dQMultiply1 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc); -/* qa = rotate by inverse of qc, then by qb */ -ODE_API void dQMultiply2 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc); -/* qa = rotate by inverse of qc, then by inverse of qb */ -ODE_API void dQMultiply3 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc); - -ODE_API void dRfromQ (dMatrix3 R, const dQuaternion q); -ODE_API void dQfromR (dQuaternion q, const dMatrix3 R); -ODE_API void dDQfromW (dReal dq[4], const dVector3 w, const dQuaternion q); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/include/ode/timer.h b/misc/builddeps/dp.linux32/include/ode/timer.h deleted file mode 100644 index fe1483f7..00000000 --- a/misc/builddeps/dp.linux32/include/ode/timer.h +++ /dev/null @@ -1,76 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_TIMER_H_ -#define _ODE_TIMER_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/* stop watch objects */ - -typedef struct dStopwatch { - double time; /* total clock count */ - unsigned long cc[2]; /* clock count since last `start' */ -} dStopwatch; - -ODE_API void dStopwatchReset (dStopwatch *); -ODE_API void dStopwatchStart (dStopwatch *); -ODE_API void dStopwatchStop (dStopwatch *); -ODE_API double dStopwatchTime (dStopwatch *); /* returns total time in secs */ - - -/* code timers */ - -ODE_API void dTimerStart (const char *description); /* pass a static string here */ -ODE_API void dTimerNow (const char *description); /* pass a static string here */ -ODE_API void dTimerEnd(void); - -/* print out a timer report. if `average' is nonzero, print out the average - * time for each slot (this is only meaningful if the same start-now-end - * calls are being made repeatedly. - */ -ODE_API void dTimerReport (FILE *fout, int average); - - -/* resolution */ - -/* returns the timer ticks per second implied by the timing hardware or API. - * the actual timer resolution may not be this great. - */ -ODE_API double dTimerTicksPerSecond(void); - -/* returns an estimate of the actual timer resolution, in seconds. this may - * be greater than 1/ticks_per_second. - */ -ODE_API double dTimerResolution(void); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux32/lib/libd0_blind_id.a b/misc/builddeps/dp.linux32/lib/libd0_blind_id.a deleted file mode 100644 index 89452058..00000000 Binary files a/misc/builddeps/dp.linux32/lib/libd0_blind_id.a and /dev/null differ diff --git a/misc/builddeps/dp.linux32/lib/libd0_blind_id.la b/misc/builddeps/dp.linux32/lib/libd0_blind_id.la deleted file mode 100755 index b631320f..00000000 --- a/misc/builddeps/dp.linux32/lib/libd0_blind_id.la +++ /dev/null @@ -1,41 +0,0 @@ -# libd0_blind_id.la - a libtool library file -# Generated by ltmain.sh (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libd0_blind_id.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs=' -L/tmp/d0_blind_id.deps/lib/ /tmp/gg/lib/libgmp.la' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libd0_blind_id. -current=0 -age=0 -revision=0 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/lib' diff --git a/misc/builddeps/dp.linux32/lib/libd0_blind_id.so b/misc/builddeps/dp.linux32/lib/libd0_blind_id.so deleted file mode 120000 index 6adf4aa9..00000000 --- a/misc/builddeps/dp.linux32/lib/libd0_blind_id.so +++ /dev/null @@ -1 +0,0 @@ -libd0_blind_id.so.0.0.0 \ No newline at end of file diff --git a/misc/builddeps/dp.linux32/lib/libd0_blind_id.so.0 b/misc/builddeps/dp.linux32/lib/libd0_blind_id.so.0 deleted file mode 120000 index 6adf4aa9..00000000 --- a/misc/builddeps/dp.linux32/lib/libd0_blind_id.so.0 +++ /dev/null @@ -1 +0,0 @@ -libd0_blind_id.so.0.0.0 \ No newline at end of file diff --git a/misc/builddeps/dp.linux32/lib/libd0_blind_id.so.0.0.0 b/misc/builddeps/dp.linux32/lib/libd0_blind_id.so.0.0.0 deleted file mode 100755 index d17b4e57..00000000 Binary files a/misc/builddeps/dp.linux32/lib/libd0_blind_id.so.0.0.0 and /dev/null differ diff --git a/misc/builddeps/dp.linux32/lib/libd0_rijndael.a b/misc/builddeps/dp.linux32/lib/libd0_rijndael.a deleted file mode 100644 index 58897695..00000000 Binary files a/misc/builddeps/dp.linux32/lib/libd0_rijndael.a and /dev/null differ diff --git a/misc/builddeps/dp.linux32/lib/libd0_rijndael.la b/misc/builddeps/dp.linux32/lib/libd0_rijndael.la deleted file mode 100755 index 49c9909f..00000000 --- a/misc/builddeps/dp.linux32/lib/libd0_rijndael.la +++ /dev/null @@ -1,41 +0,0 @@ -# libd0_rijndael.la - a libtool library file -# Generated by ltmain.sh (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libd0_rijndael.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs=' -L/tmp/d0_blind_id.deps/lib/ /tmp/gg/lib/libgmp.la' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libd0_rijndael. -current=0 -age=0 -revision=0 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/lib' diff --git a/misc/builddeps/dp.linux32/lib/libd0_rijndael.so b/misc/builddeps/dp.linux32/lib/libd0_rijndael.so deleted file mode 120000 index 01dce017..00000000 --- a/misc/builddeps/dp.linux32/lib/libd0_rijndael.so +++ /dev/null @@ -1 +0,0 @@ -libd0_rijndael.so.0.0.0 \ No newline at end of file diff --git a/misc/builddeps/dp.linux32/lib/libd0_rijndael.so.0 b/misc/builddeps/dp.linux32/lib/libd0_rijndael.so.0 deleted file mode 120000 index 01dce017..00000000 --- a/misc/builddeps/dp.linux32/lib/libd0_rijndael.so.0 +++ /dev/null @@ -1 +0,0 @@ -libd0_rijndael.so.0.0.0 \ No newline at end of file diff --git a/misc/builddeps/dp.linux32/lib/libd0_rijndael.so.0.0.0 b/misc/builddeps/dp.linux32/lib/libd0_rijndael.so.0.0.0 deleted file mode 100755 index b98c986b..00000000 Binary files a/misc/builddeps/dp.linux32/lib/libd0_rijndael.so.0.0.0 and /dev/null differ diff --git a/misc/builddeps/dp.linux32/lib/libgmp.a b/misc/builddeps/dp.linux32/lib/libgmp.a deleted file mode 100644 index e61da303..00000000 Binary files a/misc/builddeps/dp.linux32/lib/libgmp.a and /dev/null differ diff --git a/misc/builddeps/dp.linux32/lib/libgmp.la b/misc/builddeps/dp.linux32/lib/libgmp.la deleted file mode 100755 index b6124777..00000000 --- a/misc/builddeps/dp.linux32/lib/libgmp.la +++ /dev/null @@ -1,41 +0,0 @@ -# libgmp.la - a libtool library file -# Generated by ltmain.sh (GNU libtool) 2.2.6b -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libgmp.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs='' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libgmp. -current=10 -age=0 -revision=1 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/tmp/gg/lib' diff --git a/misc/builddeps/dp.linux32/lib/libjpeg.a b/misc/builddeps/dp.linux32/lib/libjpeg.a deleted file mode 100644 index 991dbce1..00000000 Binary files a/misc/builddeps/dp.linux32/lib/libjpeg.a and /dev/null differ diff --git a/misc/builddeps/dp.linux32/lib/libjpeg.la b/misc/builddeps/dp.linux32/lib/libjpeg.la deleted file mode 100755 index ac8ef61f..00000000 --- a/misc/builddeps/dp.linux32/lib/libjpeg.la +++ /dev/null @@ -1,41 +0,0 @@ -# libjpeg.la - a libtool library file -# Generated by ltmain.sh (GNU libtool) 2.2.6b -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libjpeg.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs='' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libjpeg. -current=8 -age=0 -revision=2 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/tmp/j/lib' diff --git a/misc/builddeps/dp.linux32/lib/libode.a b/misc/builddeps/dp.linux32/lib/libode.a deleted file mode 100644 index 71abaddf..00000000 Binary files a/misc/builddeps/dp.linux32/lib/libode.a and /dev/null differ diff --git a/misc/builddeps/dp.linux32/lib/libode.la b/misc/builddeps/dp.linux32/lib/libode.la deleted file mode 100755 index 7cabb97b..00000000 --- a/misc/builddeps/dp.linux32/lib/libode.la +++ /dev/null @@ -1,41 +0,0 @@ -# libode.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libode.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs=' -L/tmp/ode-0.12.deps/lib/ -lpthread' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libode. -current=3 -age=0 -revision=0 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/lib' diff --git a/misc/builddeps/dp.linux32/lib/pkgconfig/d0_blind_id.pc b/misc/builddeps/dp.linux32/lib/pkgconfig/d0_blind_id.pc deleted file mode 100644 index 8c9bb32b..00000000 --- a/misc/builddeps/dp.linux32/lib/pkgconfig/d0_blind_id.pc +++ /dev/null @@ -1,11 +0,0 @@ -prefix=/usr/local -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: Blind-ID -Description: Library for user identification using RSA blind signatures -Requires: -Version: 0.5 -Libs: -L${libdir} -ld0_blind_id -Cflags: -I${includedir}/d0_blind_id diff --git a/misc/builddeps/dp.linux32/lib/pkgconfig/d0_rijndael.pc b/misc/builddeps/dp.linux32/lib/pkgconfig/d0_rijndael.pc deleted file mode 100644 index 1040d658..00000000 --- a/misc/builddeps/dp.linux32/lib/pkgconfig/d0_rijndael.pc +++ /dev/null @@ -1,11 +0,0 @@ -prefix=/usr/local -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: Rijndael -Description: Library for Rijndael encryption -Requires: -Version: 0.5 -Libs: -L${libdir} -ld0_rijndael -Cflags: -I${includedir}/d0_blind_id diff --git a/misc/builddeps/dp.linux32/lib/pkgconfig/ode.pc b/misc/builddeps/dp.linux32/lib/pkgconfig/ode.pc deleted file mode 100644 index 7be9daa0..00000000 --- a/misc/builddeps/dp.linux32/lib/pkgconfig/ode.pc +++ /dev/null @@ -1,11 +0,0 @@ -prefix=/usr/local -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: ode -Description: Open Dynamics Engine -Version: 0.12 -Libs: -L${libdir} -lode -Libs.private: -lstdc++ -lm -Cflags: -I${includedir} -DdDOUBLE diff --git a/misc/builddeps/dp.linux32/share/info/gmp.info b/misc/builddeps/dp.linux32/share/info/gmp.info deleted file mode 100644 index d65ab795..00000000 --- a/misc/builddeps/dp.linux32/share/info/gmp.info +++ /dev/null @@ -1,178 +0,0 @@ -This is ../../gmp/doc/gmp.info, produced by makeinfo version 4.8 from -../../gmp/doc/gmp.texi. - - This manual describes how to install and use the GNU multiple -precision arithmetic library, version 5.0.1. - - Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free -Software Foundation, Inc. - - Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version -1.3 or any later version published by the Free Software Foundation; -with no Invariant Sections, with the Front-Cover Texts being "A GNU -Manual", and with the Back-Cover Texts being "You have freedom to copy -and modify this GNU Manual, like GNU software". A copy of the license -is included in *Note GNU Free Documentation License::. - -INFO-DIR-SECTION GNU libraries -START-INFO-DIR-ENTRY -* gmp: (gmp). GNU Multiple Precision Arithmetic Library. -END-INFO-DIR-ENTRY - - -Indirect: -gmp.info-1: 981 -gmp.info-2: 300864 - -Tag Table: -(Indirect) -Node: Top981 -Node: Copying3211 -Node: Introduction to GMP5062 -Node: Installing GMP7773 -Node: Build Options8505 -Node: ABI and ISA24573 -Node: Notes for Package Builds34251 -Node: Notes for Particular Systems37338 -Node: Known Build Problems43895 -Node: Performance optimization47429 -Node: GMP Basics48563 -Node: Headers and Libraries49211 -Node: Nomenclature and Types50635 -Node: Function Classes52632 -Node: Variable Conventions54325 -Node: Parameter Conventions55934 -Node: Memory Management57990 -Node: Reentrancy59118 -Node: Useful Macros and Constants60991 -Node: Compatibility with older versions61989 -Node: Demonstration Programs62950 -Node: Efficiency64815 -Node: Debugging72439 -Node: Profiling78997 -Node: Autoconf82988 -Node: Emacs84767 -Node: Reporting Bugs85373 -Node: Integer Functions87916 -Node: Initializing Integers88692 -Node: Assigning Integers90839 -Node: Simultaneous Integer Init & Assign92426 -Node: Converting Integers94051 -Node: Integer Arithmetic96973 -Node: Integer Division98559 -Node: Integer Exponentiation104869 -Node: Integer Roots106309 -Node: Number Theoretic Functions107983 -Node: Integer Comparisons114126 -Node: Integer Logic and Bit Fiddling115504 -Node: I/O of Integers118051 -Node: Integer Random Numbers120935 -Node: Integer Import and Export123546 -Node: Miscellaneous Integer Functions127556 -Node: Integer Special Functions129416 -Node: Rational Number Functions132503 -Node: Initializing Rationals133696 -Node: Rational Conversions136157 -Node: Rational Arithmetic137888 -Node: Comparing Rationals139192 -Node: Applying Integer Functions140559 -Node: I/O of Rationals142042 -Node: Floating-point Functions143902 -Node: Initializing Floats146787 -Node: Assigning Floats150874 -Node: Simultaneous Float Init & Assign153441 -Node: Converting Floats154969 -Node: Float Arithmetic158217 -Node: Float Comparison160230 -Node: I/O of Floats161811 -Node: Miscellaneous Float Functions164409 -Node: Low-level Functions166303 -Node: Random Number Functions190437 -Node: Random State Initialization191505 -Node: Random State Seeding194363 -Node: Random State Miscellaneous195752 -Node: Formatted Output196393 -Node: Formatted Output Strings196638 -Node: Formatted Output Functions201852 -Node: C++ Formatted Output205927 -Node: Formatted Input208609 -Node: Formatted Input Strings208845 -Node: Formatted Input Functions213497 -Node: C++ Formatted Input216466 -Node: C++ Class Interface218369 -Node: C++ Interface General219370 -Node: C++ Interface Integers222440 -Node: C++ Interface Rationals225871 -Node: C++ Interface Floats229548 -Node: C++ Interface Random Numbers234830 -Node: C++ Interface Limitations237236 -Node: BSD Compatible Functions240056 -Node: Custom Allocation244767 -Node: Language Bindings249085 -Node: Algorithms253038 -Node: Multiplication Algorithms253738 -Node: Basecase Multiplication254710 -Node: Karatsuba Multiplication256618 -Node: Toom 3-Way Multiplication260243 -Node: Toom 4-Way Multiplication266657 -Node: FFT Multiplication268029 -Node: Other Multiplication273365 -Node: Unbalanced Multiplication275839 -Node: Division Algorithms276627 -Node: Single Limb Division277006 -Node: Basecase Division279897 -Node: Divide and Conquer Division281100 -Node: Block-Wise Barrett Division283169 -Node: Exact Division283821 -Node: Exact Remainder286986 -Node: Small Quotient Division289213 -Node: Greatest Common Divisor Algorithms290811 -Node: Binary GCD291108 -Node: Lehmer's Algorithm293957 -Node: Subquadratic GCD296177 -Node: Extended GCD298636 -Node: Jacobi Symbol299948 -Node: Powering Algorithms300864 -Node: Normal Powering Algorithm301127 -Node: Modular Powering Algorithm301655 -Node: Root Extraction Algorithms302435 -Node: Square Root Algorithm302750 -Node: Nth Root Algorithm304891 -Node: Perfect Square Algorithm305676 -Node: Perfect Power Algorithm307762 -Node: Radix Conversion Algorithms308383 -Node: Binary to Radix308759 -Node: Radix to Binary312688 -Node: Other Algorithms314776 -Node: Prime Testing Algorithm315128 -Node: Factorial Algorithm316312 -Node: Binomial Coefficients Algorithm317715 -Node: Fibonacci Numbers Algorithm318609 -Node: Lucas Numbers Algorithm321083 -Node: Random Number Algorithms321804 -Node: Assembly Coding323925 -Node: Assembly Code Organisation324885 -Node: Assembly Basics325852 -Node: Assembly Carry Propagation327002 -Node: Assembly Cache Handling328833 -Node: Assembly Functional Units330994 -Node: Assembly Floating Point332607 -Node: Assembly SIMD Instructions336385 -Node: Assembly Software Pipelining337367 -Node: Assembly Loop Unrolling338429 -Node: Assembly Writing Guide340644 -Node: Internals343409 -Node: Integer Internals343921 -Node: Rational Internals346177 -Node: Float Internals347415 -Node: Raw Output Internals354829 -Node: C++ Interface Internals356023 -Node: Contributors359309 -Node: References364267 -Node: GNU Free Documentation License369925 -Node: Concept Index395094 -Node: Function Index441276 - -End Tag Table diff --git a/misc/builddeps/dp.linux32/share/info/gmp.info-1 b/misc/builddeps/dp.linux32/share/info/gmp.info-1 deleted file mode 100644 index d1360599..00000000 --- a/misc/builddeps/dp.linux32/share/info/gmp.info-1 +++ /dev/null @@ -1,7084 +0,0 @@ -This is ../../gmp/doc/gmp.info, produced by makeinfo version 4.8 from -../../gmp/doc/gmp.texi. - - This manual describes how to install and use the GNU multiple -precision arithmetic library, version 5.0.1. - - Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free -Software Foundation, Inc. - - Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version -1.3 or any later version published by the Free Software Foundation; -with no Invariant Sections, with the Front-Cover Texts being "A GNU -Manual", and with the Back-Cover Texts being "You have freedom to copy -and modify this GNU Manual, like GNU software". A copy of the license -is included in *Note GNU Free Documentation License::. - -INFO-DIR-SECTION GNU libraries -START-INFO-DIR-ENTRY -* gmp: (gmp). GNU Multiple Precision Arithmetic Library. -END-INFO-DIR-ENTRY - - -File: gmp.info, Node: Top, Next: Copying, Prev: (dir), Up: (dir) - -GNU MP -****** - - This manual describes how to install and use the GNU multiple -precision arithmetic library, version 5.0.1. - - Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free -Software Foundation, Inc. - - Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version -1.3 or any later version published by the Free Software Foundation; -with no Invariant Sections, with the Front-Cover Texts being "A GNU -Manual", and with the Back-Cover Texts being "You have freedom to copy -and modify this GNU Manual, like GNU software". A copy of the license -is included in *Note GNU Free Documentation License::. - - -* Menu: - -* Copying:: GMP Copying Conditions (LGPL). -* Introduction to GMP:: Brief introduction to GNU MP. -* Installing GMP:: How to configure and compile the GMP library. -* GMP Basics:: What every GMP user should know. -* Reporting Bugs:: How to usefully report bugs. -* Integer Functions:: Functions for arithmetic on signed integers. -* Rational Number Functions:: Functions for arithmetic on rational numbers. -* Floating-point Functions:: Functions for arithmetic on floats. -* Low-level Functions:: Fast functions for natural numbers. -* Random Number Functions:: Functions for generating random numbers. -* Formatted Output:: `printf' style output. -* Formatted Input:: `scanf' style input. -* C++ Class Interface:: Class wrappers around GMP types. -* BSD Compatible Functions:: All functions found in BSD MP. -* Custom Allocation:: How to customize the internal allocation. -* Language Bindings:: Using GMP from other languages. -* Algorithms:: What happens behind the scenes. -* Internals:: How values are represented behind the scenes. - -* Contributors:: Who brings you this library? -* References:: Some useful papers and books to read. -* GNU Free Documentation License:: -* Concept Index:: -* Function Index:: - - -File: gmp.info, Node: Copying, Next: Introduction to GMP, Prev: Top, Up: Top - -GNU MP Copying Conditions -************************* - -This library is "free"; this means that everyone is free to use it and -free to redistribute it on a free basis. The library is not in the -public domain; it is copyrighted and there are restrictions on its -distribution, but these restrictions are designed to permit everything -that a good cooperating citizen would want to do. What is not allowed -is to try to prevent others from further sharing any version of this -library that they might get from you. - - Specifically, we want to make sure that you have the right to give -away copies of the library, that you receive source code or else can -get it if you want it, that you can change this library or use pieces -of it in new free programs, and that you know you can do these things. - - To make sure that everyone has such rights, we have to forbid you to -deprive anyone else of these rights. For example, if you distribute -copies of the GNU MP library, you must give the recipients all the -rights that you have. You must make sure that they, too, receive or -can get the source code. And you must tell them their rights. - - Also, for our own protection, we must make certain that everyone -finds out that there is no warranty for the GNU MP library. If it is -modified by someone else and passed on, we want their recipients to -know that what they have is not what we distributed, so that any -problems introduced by others will not reflect on our reputation. - - The precise conditions of the license for the GNU MP library are -found in the Lesser General Public License version 3 that accompanies -the source code, see `COPYING.LIB'. Certain demonstration programs are -provided under the terms of the plain General Public License version 3, -see `COPYING'. - - -File: gmp.info, Node: Introduction to GMP, Next: Installing GMP, Prev: Copying, Up: Top - -1 Introduction to GNU MP -************************ - -GNU MP is a portable library written in C for arbitrary precision -arithmetic on integers, rational numbers, and floating-point numbers. -It aims to provide the fastest possible arithmetic for all applications -that need higher precision than is directly supported by the basic C -types. - - Many applications use just a few hundred bits of precision; but some -applications may need thousands or even millions of bits. GMP is -designed to give good performance for both, by choosing algorithms -based on the sizes of the operands, and by carefully keeping the -overhead at a minimum. - - The speed of GMP is achieved by using fullwords as the basic -arithmetic type, by using sophisticated algorithms, by including -carefully optimized assembly code for the most common inner loops for -many different CPUs, and by a general emphasis on speed (as opposed to -simplicity or elegance). - - There is assembly code for these CPUs: ARM, DEC Alpha 21064, 21164, -and 21264, AMD 29000, AMD K6, K6-2, Athlon, and Athlon64, Hitachi -SuperH and SH-2, HPPA 1.0, 1.1 and 2.0, Intel Pentium, Pentium -Pro/II/III, Pentium 4, generic x86, Intel IA-64, i960, Motorola -MC68000, MC68020, MC88100, and MC88110, Motorola/IBM PowerPC 32 and 64, -National NS32000, IBM POWER, MIPS R3000, R4000, SPARCv7, SuperSPARC, -generic SPARCv8, UltraSPARC, DEC VAX, and Zilog Z8000. Some -optimizations also for Cray vector systems, Clipper, IBM ROMP (RT), and -Pyramid AP/XP. - -For up-to-date information on GMP, please see the GMP web pages at - - `http://gmplib.org/' - -The latest version of the library is available at - - `ftp://ftp.gnu.org/gnu/gmp/' - - Many sites around the world mirror `ftp.gnu.org', please use a mirror -near you, see `http://www.gnu.org/order/ftp.html' for a full list. - - There are three public mailing lists of interest. One for release -announcements, one for general questions and discussions about usage of -the GMP library and one for bug reports. For more information, see - - `http://gmplib.org/mailman/listinfo/'. - - The proper place for bug reports is . See -*Note Reporting Bugs:: for information about reporting bugs. - - -1.1 How to use this Manual -========================== - -Everyone should read *Note GMP Basics::. If you need to install the -library yourself, then read *Note Installing GMP::. If you have a -system with multiple ABIs, then read *Note ABI and ISA::, for the -compiler options that must be used on applications. - - The rest of the manual can be used for later reference, although it -is probably a good idea to glance through it. - - -File: gmp.info, Node: Installing GMP, Next: GMP Basics, Prev: Introduction to GMP, Up: Top - -2 Installing GMP -**************** - -GMP has an autoconf/automake/libtool based configuration system. On a -Unix-like system a basic build can be done with - - ./configure - make - -Some self-tests can be run with - - make check - -And you can install (under `/usr/local' by default) with - - make install - - If you experience problems, please report them to -. See *Note Reporting Bugs::, for information on -what to include in useful bug reports. - -* Menu: - -* Build Options:: -* ABI and ISA:: -* Notes for Package Builds:: -* Notes for Particular Systems:: -* Known Build Problems:: -* Performance optimization:: - - -File: gmp.info, Node: Build Options, Next: ABI and ISA, Prev: Installing GMP, Up: Installing GMP - -2.1 Build Options -================= - -All the usual autoconf configure options are available, run `./configure ---help' for a summary. The file `INSTALL.autoconf' has some generic -installation information too. - -Tools - `configure' requires various Unix-like tools. See *Note Notes for - Particular Systems::, for some options on non-Unix systems. - - It might be possible to build without the help of `configure', - certainly all the code is there, but unfortunately you'll be on - your own. - -Build Directory - To compile in a separate build directory, `cd' to that directory, - and prefix the configure command with the path to the GMP source - directory. For example - - cd /my/build/dir - /my/sources/gmp-5.0.1/configure - - Not all `make' programs have the necessary features (`VPATH') to - support this. In particular, SunOS and Slowaris `make' have bugs - that make them unable to build in a separate directory. Use GNU - `make' instead. - -`--prefix' and `--exec-prefix' - The `--prefix' option can be used in the normal way to direct GMP - to install under a particular tree. The default is `/usr/local'. - - `--exec-prefix' can be used to direct architecture-dependent files - like `libgmp.a' to a different location. This can be used to share - architecture-independent parts like the documentation, but - separate the dependent parts. Note however that `gmp.h' and - `mp.h' are architecture-dependent since they encode certain - aspects of `libgmp', so it will be necessary to ensure both - `$prefix/include' and `$exec_prefix/include' are available to the - compiler. - -`--disable-shared', `--disable-static' - By default both shared and static libraries are built (where - possible), but one or other can be disabled. Shared libraries - result in smaller executables and permit code sharing between - separate running processes, but on some CPUs are slightly slower, - having a small cost on each function call. - -Native Compilation, `--build=CPU-VENDOR-OS' - For normal native compilation, the system can be specified with - `--build'. By default `./configure' uses the output from running - `./config.guess'. On some systems `./config.guess' can determine - the exact CPU type, on others it will be necessary to give it - explicitly. For example, - - ./configure --build=ultrasparc-sun-solaris2.7 - - In all cases the `OS' part is important, since it controls how - libtool generates shared libraries. Running `./config.guess' is - the simplest way to see what it should be, if you don't know - already. - -Cross Compilation, `--host=CPU-VENDOR-OS' - When cross-compiling, the system used for compiling is given by - `--build' and the system where the library will run is given by - `--host'. For example when using a FreeBSD Athlon system to build - GNU/Linux m68k binaries, - - ./configure --build=athlon-pc-freebsd3.5 --host=m68k-mac-linux-gnu - - Compiler tools are sought first with the host system type as a - prefix. For example `m68k-mac-linux-gnu-ranlib' is tried, then - plain `ranlib'. This makes it possible for a set of - cross-compiling tools to co-exist with native tools. The prefix - is the argument to `--host', and this can be an alias, such as - `m68k-linux'. But note that tools don't have to be setup this - way, it's enough to just have a `PATH' with a suitable - cross-compiling `cc' etc. - - Compiling for a different CPU in the same family as the build - system is a form of cross-compilation, though very possibly this - would merely be special options on a native compiler. In any case - `./configure' avoids depending on being able to run code on the - build system, which is important when creating binaries for a - newer CPU since they very possibly won't run on the build system. - - In all cases the compiler must be able to produce an executable - (of whatever format) from a standard C `main'. Although only - object files will go to make up `libgmp', `./configure' uses - linking tests for various purposes, such as determining what - functions are available on the host system. - - Currently a warning is given unless an explicit `--build' is used - when cross-compiling, because it may not be possible to correctly - guess the build system type if the `PATH' has only a - cross-compiling `cc'. - - Note that the `--target' option is not appropriate for GMP. It's - for use when building compiler tools, with `--host' being where - they will run, and `--target' what they'll produce code for. - Ordinary programs or libraries like GMP are only interested in the - `--host' part, being where they'll run. (Some past versions of - GMP used `--target' incorrectly.) - -CPU types - In general, if you want a library that runs as fast as possible, - you should configure GMP for the exact CPU type your system uses. - However, this may mean the binaries won't run on older members of - the family, and might run slower on other members, older or newer. - The best idea is always to build GMP for the exact machine type - you intend to run it on. - - The following CPUs have specific support. See `configure.in' for - details of what code and compiler options they select. - - * Alpha: alpha, alphaev5, alphaev56, alphapca56, alphapca57, - alphaev6, alphaev67, alphaev68 alphaev7 - - * Cray: c90, j90, t90, sv1 - - * HPPA: hppa1.0, hppa1.1, hppa2.0, hppa2.0n, hppa2.0w, hppa64 - - * IA-64: ia64, itanium, itanium2 - - * MIPS: mips, mips3, mips64 - - * Motorola: m68k, m68000, m68010, m68020, m68030, m68040, - m68060, m68302, m68360, m88k, m88110 - - * POWER: power, power1, power2, power2sc - - * PowerPC: powerpc, powerpc64, powerpc401, powerpc403, - powerpc405, powerpc505, powerpc601, powerpc602, powerpc603, - powerpc603e, powerpc604, powerpc604e, powerpc620, powerpc630, - powerpc740, powerpc7400, powerpc7450, powerpc750, powerpc801, - powerpc821, powerpc823, powerpc860, powerpc970 - - * SPARC: sparc, sparcv8, microsparc, supersparc, sparcv9, - ultrasparc, ultrasparc2, ultrasparc2i, ultrasparc3, sparc64 - - * x86 family: i386, i486, i586, pentium, pentiummmx, pentiumpro, - pentium2, pentium3, pentium4, k6, k62, k63, athlon, amd64, - viac3, viac32 - - * Other: a29k, arm, clipper, i960, ns32k, pyramid, sh, sh2, vax, - z8k - - CPUs not listed will use generic C code. - -Generic C Build - If some of the assembly code causes problems, or if otherwise - desired, the generic C code can be selected with CPU `none'. For - example, - - ./configure --host=none-unknown-freebsd3.5 - - Note that this will run quite slowly, but it should be portable - and should at least make it possible to get something running if - all else fails. - -Fat binary, `--enable-fat' - Using `--enable-fat' selects a "fat binary" build on x86, where - optimized low level subroutines are chosen at runtime according to - the CPU detected. This means more code, but gives good - performance on all x86 chips. (This option might become available - for more architectures in the future.) - -`ABI' - On some systems GMP supports multiple ABIs (application binary - interfaces), meaning data type sizes and calling conventions. By - default GMP chooses the best ABI available, but a particular ABI - can be selected. For example - - ./configure --host=mips64-sgi-irix6 ABI=n32 - - See *Note ABI and ISA::, for the available choices on relevant - CPUs, and what applications need to do. - -`CC', `CFLAGS' - By default the C compiler used is chosen from among some likely - candidates, with `gcc' normally preferred if it's present. The - usual `CC=whatever' can be passed to `./configure' to choose - something different. - - For various systems, default compiler flags are set based on the - CPU and compiler. The usual `CFLAGS="-whatever"' can be passed to - `./configure' to use something different or to set good flags for - systems GMP doesn't otherwise know. - - The `CC' and `CFLAGS' used are printed during `./configure', and - can be found in each generated `Makefile'. This is the easiest way - to check the defaults when considering changing or adding - something. - - Note that when `CC' and `CFLAGS' are specified on a system - supporting multiple ABIs it's important to give an explicit - `ABI=whatever', since GMP can't determine the ABI just from the - flags and won't be able to select the correct assembly code. - - If just `CC' is selected then normal default `CFLAGS' for that - compiler will be used (if GMP recognises it). For example - `CC=gcc' can be used to force the use of GCC, with default flags - (and default ABI). - -`CPPFLAGS' - Any flags like `-D' defines or `-I' includes required by the - preprocessor should be set in `CPPFLAGS' rather than `CFLAGS'. - Compiling is done with both `CPPFLAGS' and `CFLAGS', but - preprocessing uses just `CPPFLAGS'. This distinction is because - most preprocessors won't accept all the flags the compiler does. - Preprocessing is done separately in some configure tests, and in - the `ansi2knr' support for K&R compilers. - -`CC_FOR_BUILD' - Some build-time programs are compiled and run to generate - host-specific data tables. `CC_FOR_BUILD' is the compiler used - for this. It doesn't need to be in any particular ABI or mode, it - merely needs to generate executables that can run. The default is - to try the selected `CC' and some likely candidates such as `cc' - and `gcc', looking for something that works. - - No flags are used with `CC_FOR_BUILD' because a simple invocation - like `cc foo.c' should be enough. If some particular options are - required they can be included as for instance `CC_FOR_BUILD="cc - -whatever"'. - -C++ Support, `--enable-cxx' - C++ support in GMP can be enabled with `--enable-cxx', in which - case a C++ compiler will be required. As a convenience - `--enable-cxx=detect' can be used to enable C++ support only if a - compiler can be found. The C++ support consists of a library - `libgmpxx.la' and header file `gmpxx.h' (*note Headers and - Libraries::). - - A separate `libgmpxx.la' has been adopted rather than having C++ - objects within `libgmp.la' in order to ensure dynamic linked C - programs aren't bloated by a dependency on the C++ standard - library, and to avoid any chance that the C++ compiler could be - required when linking plain C programs. - - `libgmpxx.la' will use certain internals from `libgmp.la' and can - only be expected to work with `libgmp.la' from the same GMP - version. Future changes to the relevant internals will be - accompanied by renaming, so a mismatch will cause unresolved - symbols rather than perhaps mysterious misbehaviour. - - In general `libgmpxx.la' will be usable only with the C++ compiler - that built it, since name mangling and runtime support are usually - incompatible between different compilers. - -`CXX', `CXXFLAGS' - When C++ support is enabled, the C++ compiler and its flags can be - set with variables `CXX' and `CXXFLAGS' in the usual way. The - default for `CXX' is the first compiler that works from a list of - likely candidates, with `g++' normally preferred when available. - The default for `CXXFLAGS' is to try `CFLAGS', `CFLAGS' without - `-g', then for `g++' either `-g -O2' or `-O2', or for other - compilers `-g' or nothing. Trying `CFLAGS' this way is convenient - when using `gcc' and `g++' together, since the flags for `gcc' will - usually suit `g++'. - - It's important that the C and C++ compilers match, meaning their - startup and runtime support routines are compatible and that they - generate code in the same ABI (if there's a choice of ABIs on the - system). `./configure' isn't currently able to check these things - very well itself, so for that reason `--disable-cxx' is the - default, to avoid a build failure due to a compiler mismatch. - Perhaps this will change in the future. - - Incidentally, it's normally not good enough to set `CXX' to the - same as `CC'. Although `gcc' for instance recognises `foo.cc' as - C++ code, only `g++' will invoke the linker the right way when - building an executable or shared library from C++ object files. - -Temporary Memory, `--enable-alloca=' - GMP allocates temporary workspace using one of the following three - methods, which can be selected with for instance - `--enable-alloca=malloc-reentrant'. - - * `alloca' - C library or compiler builtin. - - * `malloc-reentrant' - the heap, in a re-entrant fashion. - - * `malloc-notreentrant' - the heap, with global variables. - - For convenience, the following choices are also available. - `--disable-alloca' is the same as `no'. - - * `yes' - a synonym for `alloca'. - - * `no' - a synonym for `malloc-reentrant'. - - * `reentrant' - `alloca' if available, otherwise - `malloc-reentrant'. This is the default. - - * `notreentrant' - `alloca' if available, otherwise - `malloc-notreentrant'. - - `alloca' is reentrant and fast, and is recommended. It actually - allocates just small blocks on the stack; larger ones use - malloc-reentrant. - - `malloc-reentrant' is, as the name suggests, reentrant and thread - safe, but `malloc-notreentrant' is faster and should be used if - reentrancy is not required. - - The two malloc methods in fact use the memory allocation functions - selected by `mp_set_memory_functions', these being `malloc' and - friends by default. *Note Custom Allocation::. - - An additional choice `--enable-alloca=debug' is available, to help - when debugging memory related problems (*note Debugging::). - -FFT Multiplication, `--disable-fft' - By default multiplications are done using Karatsuba, 3-way Toom, - and Fermat FFT. The FFT is only used on large to very large - operands and can be disabled to save code size if desired. - -Berkeley MP, `--enable-mpbsd' - The Berkeley MP compatibility library (`libmp') and header file - (`mp.h') are built and installed only if `--enable-mpbsd' is used. - *Note BSD Compatible Functions::. - -Assertion Checking, `--enable-assert' - This option enables some consistency checking within the library. - This can be of use while debugging, *note Debugging::. - -Execution Profiling, `--enable-profiling=prof/gprof/instrument' - Enable profiling support, in one of various styles, *note - Profiling::. - -`MPN_PATH' - Various assembly versions of each mpn subroutines are provided. - For a given CPU, a search is made though a path to choose a - version of each. For example `sparcv8' has - - MPN_PATH="sparc32/v8 sparc32 generic" - - which means look first for v8 code, then plain sparc32 (which is - v7), and finally fall back on generic C. Knowledgeable users with - special requirements can specify a different path. Normally this - is completely unnecessary. - -Documentation - The source for the document you're now reading is `doc/gmp.texi', - in Texinfo format, see *Note Texinfo: (texinfo)Top. - - Info format `doc/gmp.info' is included in the distribution. The - usual automake targets are available to make PostScript, DVI, PDF - and HTML (these will require various TeX and Texinfo tools). - - DocBook and XML can be generated by the Texinfo `makeinfo' program - too, see *Note Options for `makeinfo': (texinfo)makeinfo options. - - Some supplementary notes can also be found in the `doc' - subdirectory. - - - -File: gmp.info, Node: ABI and ISA, Next: Notes for Package Builds, Prev: Build Options, Up: Installing GMP - -2.2 ABI and ISA -=============== - -ABI (Application Binary Interface) refers to the calling conventions -between functions, meaning what registers are used and what sizes the -various C data types are. ISA (Instruction Set Architecture) refers to -the instructions and registers a CPU has available. - - Some 64-bit ISA CPUs have both a 64-bit ABI and a 32-bit ABI -defined, the latter for compatibility with older CPUs in the family. -GMP supports some CPUs like this in both ABIs. In fact within GMP -`ABI' means a combination of chip ABI, plus how GMP chooses to use it. -For example in some 32-bit ABIs, GMP may support a limb as either a -32-bit `long' or a 64-bit `long long'. - - By default GMP chooses the best ABI available for a given system, -and this generally gives significantly greater speed. But an ABI can -be chosen explicitly to make GMP compatible with other libraries, or -particular application requirements. For example, - - ./configure ABI=32 - - In all cases it's vital that all object code used in a given program -is compiled for the same ABI. - - Usually a limb is implemented as a `long'. When a `long long' limb -is used this is encoded in the generated `gmp.h'. This is convenient -for applications, but it does mean that `gmp.h' will vary, and can't be -just copied around. `gmp.h' remains compiler independent though, since -all compilers for a particular ABI will be expected to use the same -limb type. - - Currently no attempt is made to follow whatever conventions a system -has for installing library or header files built for a particular ABI. -This will probably only matter when installing multiple builds of GMP, -and it might be as simple as configuring with a special `libdir', or it -might require more than that. Note that builds for different ABIs need -to done separately, with a fresh `./configure' and `make' each. - - -AMD64 (`x86_64') - On AMD64 systems supporting both 32-bit and 64-bit modes for - applications, the following ABI choices are available. - - `ABI=64' - The 64-bit ABI uses 64-bit limbs and pointers and makes full - use of the chip architecture. This is the default. - Applications will usually not need special compiler flags, - but for reference the option is - - gcc -m64 - - `ABI=32' - The 32-bit ABI is the usual i386 conventions. This will be - slower, and is not recommended except for inter-operating - with other code not yet 64-bit capable. Applications must be - compiled with - - gcc -m32 - - (In GCC 2.95 and earlier there's no `-m32' option, it's the - only mode.) - - -HPPA 2.0 (`hppa2.0*', `hppa64') - - `ABI=2.0w' - The 2.0w ABI uses 64-bit limbs and pointers and is available - on HP-UX 11 or up. Applications must be compiled with - - gcc [built for 2.0w] - cc +DD64 - - `ABI=2.0n' - The 2.0n ABI means the 32-bit HPPA 1.0 ABI and all its normal - calling conventions, but with 64-bit instructions permitted - within functions. GMP uses a 64-bit `long long' for a limb. - This ABI is available on hppa64 GNU/Linux and on HP-UX 10 or - higher. Applications must be compiled with - - gcc [built for 2.0n] - cc +DA2.0 +e - - Note that current versions of GCC (eg. 3.2) don't generate - 64-bit instructions for `long long' operations and so may be - slower than for 2.0w. (The GMP assembly code is the same - though.) - - `ABI=1.0' - HPPA 2.0 CPUs can run all HPPA 1.0 and 1.1 code in the 32-bit - HPPA 1.0 ABI. No special compiler options are needed for - applications. - - All three ABIs are available for CPU types `hppa2.0w', `hppa2.0' - and `hppa64', but for CPU type `hppa2.0n' only 2.0n or 1.0 are - considered. - - Note that GCC on HP-UX has no options to choose between 2.0n and - 2.0w modes, unlike HP `cc'. Instead it must be built for one or - the other ABI. GMP will detect how it was built, and skip to the - corresponding `ABI'. - - -IA-64 under HP-UX (`ia64*-*-hpux*', `itanium*-*-hpux*') - HP-UX supports two ABIs for IA-64. GMP performance is the same in - both. - - `ABI=32' - In the 32-bit ABI, pointers, `int's and `long's are 32 bits - and GMP uses a 64 bit `long long' for a limb. Applications - can be compiled without any special flags since this ABI is - the default in both HP C and GCC, but for reference the flags - are - - gcc -milp32 - cc +DD32 - - `ABI=64' - In the 64-bit ABI, `long's and pointers are 64 bits and GMP - uses a `long' for a limb. Applications must be compiled with - - gcc -mlp64 - cc +DD64 - - On other IA-64 systems, GNU/Linux for instance, `ABI=64' is the - only choice. - - -MIPS under IRIX 6 (`mips*-*-irix[6789]') - IRIX 6 always has a 64-bit MIPS 3 or better CPU, and supports ABIs - o32, n32, and 64. n32 or 64 are recommended, and GMP performance - will be the same in each. The default is n32. - - `ABI=o32' - The o32 ABI is 32-bit pointers and integers, and no 64-bit - operations. GMP will be slower than in n32 or 64, this - option only exists to support old compilers, eg. GCC 2.7.2. - Applications can be compiled with no special flags on an old - compiler, or on a newer compiler with - - gcc -mabi=32 - cc -32 - - `ABI=n32' - The n32 ABI is 32-bit pointers and integers, but with a - 64-bit limb using a `long long'. Applications must be - compiled with - - gcc -mabi=n32 - cc -n32 - - `ABI=64' - The 64-bit ABI is 64-bit pointers and integers. Applications - must be compiled with - - gcc -mabi=64 - cc -64 - - Note that MIPS GNU/Linux, as of kernel version 2.2, doesn't have - the necessary support for n32 or 64 and so only gets a 32-bit limb - and the MIPS 2 code. - - -PowerPC 64 (`powerpc64', `powerpc620', `powerpc630', `powerpc970', `power4', `power5') - - `ABI=aix64' - The AIX 64 ABI uses 64-bit limbs and pointers and is the - default on PowerPC 64 `*-*-aix*' systems. Applications must - be compiled with - - gcc -maix64 - xlc -q64 - - `ABI=mode64' - The `mode64' ABI uses 64-bit limbs and pointers, and is the - default on 64-bit GNU/Linux, BSD, and Mac OS X/Darwin - systems. Applications must be compiled with - - gcc -m64 - - `ABI=mode32' - The `mode32' ABI uses a 64-bit `long long' limb but with the - chip still in 32-bit mode and using 32-bit calling - conventions. This is the default on for systems where the - true 64-bit ABIs are unavailable. No special compiler - options are needed for applications. - - `ABI=32' - This is the basic 32-bit PowerPC ABI, with a 32-bit limb. No - special compiler options are needed for applications. - - GMP speed is greatest in `aix64' and `mode32'. In `ABI=32' only - the 32-bit ISA is used and this doesn't make full use of a 64-bit - chip. On a suitable system we could perhaps use more of the ISA, - but there are no plans to do so. - - -Sparc V9 (`sparc64', `sparcv9', `ultrasparc*') - - `ABI=64' - The 64-bit V9 ABI is available on the various BSD sparc64 - ports, recent versions of Sparc64 GNU/Linux, and Solaris 2.7 - and up (when the kernel is in 64-bit mode). GCC 3.2 or - higher, or Sun `cc' is required. On GNU/Linux, depending on - the default `gcc' mode, applications must be compiled with - - gcc -m64 - - On Solaris applications must be compiled with - - gcc -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9 - cc -xarch=v9 - - On the BSD sparc64 systems no special options are required, - since 64-bits is the only ABI available. - - `ABI=32' - For the basic 32-bit ABI, GMP still uses as much of the V9 - ISA as it can. In the Sun documentation this combination is - known as "v8plus". On GNU/Linux, depending on the default - `gcc' mode, applications may need to be compiled with - - gcc -m32 - - On Solaris, no special compiler options are required for - applications, though using something like the following is - recommended. (`gcc' 2.8 and earlier only support `-mv8' - though.) - - gcc -mv8plus - cc -xarch=v8plus - - GMP speed is greatest in `ABI=64', so it's the default where - available. The speed is partly because there are extra registers - available and partly because 64-bits is considered the more - important case and has therefore had better code written for it. - - Don't be confused by the names of the `-m' and `-x' compiler - options, they're called `arch' but effectively control both ABI - and ISA. - - On Solaris 2.6 and earlier, only `ABI=32' is available since the - kernel doesn't save all registers. - - On Solaris 2.7 with the kernel in 32-bit mode, a normal native - build will reject `ABI=64' because the resulting executables won't - run. `ABI=64' can still be built if desired by making it look - like a cross-compile, for example - - ./configure --build=none --host=sparcv9-sun-solaris2.7 ABI=64 - - -File: gmp.info, Node: Notes for Package Builds, Next: Notes for Particular Systems, Prev: ABI and ISA, Up: Installing GMP - -2.3 Notes for Package Builds -============================ - -GMP should present no great difficulties for packaging in a binary -distribution. - - Libtool is used to build the library and `-version-info' is set -appropriately, having started from `3:0:0' in GMP 3.0 (*note Library -interface versions: (libtool)Versioning.). - - The GMP 4 series will be upwardly binary compatible in each release -and will be upwardly binary compatible with all of the GMP 3 series. -Additional function interfaces may be added in each release, so on -systems where libtool versioning is not fully checked by the loader an -auxiliary mechanism may be needed to express that a dynamic linked -application depends on a new enough GMP. - - An auxiliary mechanism may also be needed to express that -`libgmpxx.la' (from `--enable-cxx', *note Build Options::) requires -`libgmp.la' from the same GMP version, since this is not done by the -libtool versioning, nor otherwise. A mismatch will result in -unresolved symbols from the linker, or perhaps the loader. - - When building a package for a CPU family, care should be taken to use -`--host' (or `--build') to choose the least common denominator among -the CPUs which might use the package. For example this might mean plain -`sparc' (meaning V7) for SPARCs. - - For x86s, `--enable-fat' sets things up for a fat binary build, -making a runtime selection of optimized low level routines. This is a -good choice for packaging to run on a range of x86 chips. - - Users who care about speed will want GMP built for their exact CPU -type, to make best use of the available optimizations. Providing a way -to suitably rebuild a package may be useful. This could be as simple -as making it possible for a user to omit `--build' (and `--host') so -`./config.guess' will detect the CPU. But a way to manually specify a -`--build' will be wanted for systems where `./config.guess' is inexact. - - On systems with multiple ABIs, a packaged build will need to decide -which among the choices is to be provided, see *Note ABI and ISA::. A -given run of `./configure' etc will only build one ABI. If a second -ABI is also required then a second run of `./configure' etc must be -made, starting from a clean directory tree (`make distclean'). - - As noted under "ABI and ISA", currently no attempt is made to follow -system conventions for install locations that vary with ABI, such as -`/usr/lib/sparcv9' for `ABI=64' as opposed to `/usr/lib' for `ABI=32'. -A package build can override `libdir' and other standard variables as -necessary. - - Note that `gmp.h' is a generated file, and will be architecture and -ABI dependent. When attempting to install two ABIs simultaneously it -will be important that an application compile gets the correct `gmp.h' -for its desired ABI. If compiler include paths don't vary with ABI -options then it might be necessary to create a `/usr/include/gmp.h' -which tests preprocessor symbols and chooses the correct actual `gmp.h'. - - -File: gmp.info, Node: Notes for Particular Systems, Next: Known Build Problems, Prev: Notes for Package Builds, Up: Installing GMP - -2.4 Notes for Particular Systems -================================ - -AIX 3 and 4 - On systems `*-*-aix[34]*' shared libraries are disabled by - default, since some versions of the native `ar' fail on the - convenience libraries used. A shared build can be attempted with - - ./configure --enable-shared --disable-static - - Note that the `--disable-static' is necessary because in a shared - build libtool makes `libgmp.a' a symlink to `libgmp.so', - apparently for the benefit of old versions of `ld' which only - recognise `.a', but unfortunately this is done even if a fully - functional `ld' is available. - -ARM - On systems `arm*-*-*', versions of GCC up to and including 2.95.3 - have a bug in unsigned division, giving wrong results for some - operands. GMP `./configure' will demand GCC 2.95.4 or later. - -Compaq C++ - Compaq C++ on OSF 5.1 has two flavours of `iostream', a standard - one and an old pre-standard one (see `man iostream_intro'). GMP - can only use the standard one, which unfortunately is not the - default but must be selected by defining `__USE_STD_IOSTREAM'. - Configure with for instance - - ./configure --enable-cxx CPPFLAGS=-D__USE_STD_IOSTREAM - -Floating Point Mode - On some systems, the hardware floating point has a control mode - which can set all operations to be done in a particular precision, - for instance single, double or extended on x86 systems (x87 - floating point). The GMP functions involving a `double' cannot be - expected to operate to their full precision when the hardware is - in single precision mode. Of course this affects all code, - including application code, not just GMP. - -MS-DOS and MS Windows - On an MS-DOS system DJGPP can be used to build GMP, and on an MS - Windows system Cygwin, DJGPP and MINGW can be used. All three are - excellent ports of GCC and the various GNU tools. - - `http://www.cygwin.com/' - `http://www.delorie.com/djgpp/' - `http://www.mingw.org/' - - Microsoft also publishes an Interix "Services for Unix" which can - be used to build GMP on Windows (with a normal `./configure'), but - it's not free software. - -MS Windows DLLs - On systems `*-*-cygwin*', `*-*-mingw*' and `*-*-pw32*' by default - GMP builds only a static library, but a DLL can be built instead - using - - ./configure --disable-static --enable-shared - - Static and DLL libraries can't both be built, since certain export - directives in `gmp.h' must be different. - - A MINGW DLL build of GMP can be used with Microsoft C. Libtool - doesn't install a `.lib' format import library, but it can be - created with MS `lib' as follows, and copied to the install - directory. Similarly for `libmp' and `libgmpxx'. - - cd .libs - lib /def:libgmp-3.dll.def /out:libgmp-3.lib - - MINGW uses the C runtime library `msvcrt.dll' for I/O, so - applications wanting to use the GMP I/O routines must be compiled - with `cl /MD' to do the same. If one of the other C runtime - library choices provided by MS C is desired then the suggestion is - to use the GMP string functions and confine I/O to the application. - -Motorola 68k CPU Types - `m68k' is taken to mean 68000. `m68020' or higher will give a - performance boost on applicable CPUs. `m68360' can be used for - CPU32 series chips. `m68302' can be used for "Dragonball" series - chips, though this is merely a synonym for `m68000'. - -OpenBSD 2.6 - `m4' in this release of OpenBSD has a bug in `eval' that makes it - unsuitable for `.asm' file processing. `./configure' will detect - the problem and either abort or choose another m4 in the `PATH'. - The bug is fixed in OpenBSD 2.7, so either upgrade or use GNU m4. - -Power CPU Types - In GMP, CPU types `power*' and `powerpc*' will each use - instructions not available on the other, so it's important to - choose the right one for the CPU that will be used. Currently GMP - has no assembly code support for using just the common instruction - subset. To get executables that run on both, the current - suggestion is to use the generic C code (CPU `none'), possibly - with appropriate compiler options (like `-mcpu=common' for `gcc'). - CPU `rs6000' (which is not a CPU but a family of workstations) is - accepted by `config.sub', but is currently equivalent to `none'. - -Sparc CPU Types - `sparcv8' or `supersparc' on relevant systems will give a - significant performance increase over the V7 code selected by plain - `sparc'. - -Sparc App Regs - The GMP assembly code for both 32-bit and 64-bit Sparc clobbers the - "application registers" `g2', `g3' and `g4', the same way that the - GCC default `-mapp-regs' does (*note SPARC Options: (gcc)SPARC - Options.). - - This makes that code unsuitable for use with the special V9 - `-mcmodel=embmedany' (which uses `g4' as a data segment pointer), - and for applications wanting to use those registers for special - purposes. In these cases the only suggestion currently is to - build GMP with CPU `none' to avoid the assembly code. - -SunOS 4 - `/usr/bin/m4' lacks various features needed to process `.asm' - files, and instead `./configure' will automatically use - `/usr/5bin/m4', which we believe is always available (if not then - use GNU m4). - -x86 CPU Types - `i586', `pentium' or `pentiummmx' code is good for its intended P5 - Pentium chips, but quite slow when run on Intel P6 class chips - (PPro, P-II, P-III). `i386' is a better choice when making - binaries that must run on both. - -x86 MMX and SSE2 Code - If the CPU selected has MMX code but the assembler doesn't support - it, a warning is given and non-MMX code is used instead. This - will be an inferior build, since the MMX code that's present is - there because it's faster than the corresponding plain integer - code. The same applies to SSE2. - - Old versions of `gas' don't support MMX instructions, in particular - version 1.92.3 that comes with FreeBSD 2.2.8 or the more recent - OpenBSD 3.1 doesn't. - - Solaris 2.6 and 2.7 `as' generate incorrect object code for - register to register `movq' instructions, and so can't be used for - MMX code. Install a recent `gas' if MMX code is wanted on these - systems. - - -File: gmp.info, Node: Known Build Problems, Next: Performance optimization, Prev: Notes for Particular Systems, Up: Installing GMP - -2.5 Known Build Problems -======================== - -You might find more up-to-date information at `http://gmplib.org/'. - -Compiler link options - The version of libtool currently in use rather aggressively strips - compiler options when linking a shared library. This will - hopefully be relaxed in the future, but for now if this is a - problem the suggestion is to create a little script to hide them, - and for instance configure with - - ./configure CC=gcc-with-my-options - -DJGPP (`*-*-msdosdjgpp*') - The DJGPP port of `bash' 2.03 is unable to run the `configure' - script, it exits silently, having died writing a preamble to - `config.log'. Use `bash' 2.04 or higher. - - `make all' was found to run out of memory during the final - `libgmp.la' link on one system tested, despite having 64Mb - available. Running `make libgmp.la' directly helped, perhaps - recursing into the various subdirectories uses up memory. - -GNU binutils `strip' prior to 2.12 - `strip' from GNU binutils 2.11 and earlier should not be used on - the static libraries `libgmp.a' and `libmp.a' since it will - discard all but the last of multiple archive members with the same - name, like the three versions of `init.o' in `libgmp.a'. Binutils - 2.12 or higher can be used successfully. - - The shared libraries `libgmp.so' and `libmp.so' are not affected by - this and any version of `strip' can be used on them. - -`make' syntax error - On certain versions of SCO OpenServer 5 and IRIX 6.5 the native - `make' is unable to handle the long dependencies list for - `libgmp.la'. The symptom is a "syntax error" on the following - line of the top-level `Makefile'. - - libgmp.la: $(libgmp_la_OBJECTS) $(libgmp_la_DEPENDENCIES) - - Either use GNU Make, or as a workaround remove - `$(libgmp_la_DEPENDENCIES)' from that line (which will make the - initial build work, but if any recompiling is done `libgmp.la' - might not be rebuilt). - -MacOS X (`*-*-darwin*') - Libtool currently only knows how to create shared libraries on - MacOS X using the native `cc' (which is a modified GCC), not a - plain GCC. A static-only build should work though - (`--disable-shared'). - -NeXT prior to 3.3 - The system compiler on old versions of NeXT was a massacred and - old GCC, even if it called itself `cc'. This compiler cannot be - used to build GMP, you need to get a real GCC, and install that. - (NeXT may have fixed this in release 3.3 of their system.) - -POWER and PowerPC - Bugs in GCC 2.7.2 (and 2.6.3) mean it can't be used to compile GMP - on POWER or PowerPC. If you want to use GCC for these machines, - get GCC 2.7.2.1 (or later). - -Sequent Symmetry - Use the GNU assembler instead of the system assembler, since the - latter has serious bugs. - -Solaris 2.6 - The system `sed' prints an error "Output line too long" when - libtool builds `libgmp.la'. This doesn't seem to cause any - obvious ill effects, but GNU `sed' is recommended, to avoid any - doubt. - -Sparc Solaris 2.7 with gcc 2.95.2 in `ABI=32' - A shared library build of GMP seems to fail in this combination, - it builds but then fails the tests, apparently due to some - incorrect data relocations within `gmp_randinit_lc_2exp_size'. - The exact cause is unknown, `--disable-shared' is recommended. - - -File: gmp.info, Node: Performance optimization, Prev: Known Build Problems, Up: Installing GMP - -2.6 Performance optimization -============================ - -For optimal performance, build GMP for the exact CPU type of the target -computer, see *Note Build Options::. - - Unlike what is the case for most other programs, the compiler -typically doesn't matter much, since GMP uses assembly language for the -most critical operation. - - In particular for long-running GMP applications, and applications -demanding extremely large numbers, building and running the `tuneup' -program in the `tune' subdirectory, can be important. For example, - - cd tune - make tuneup - ./tuneup - - will generate better contents for the `gmp-mparam.h' parameter file. - - To use the results, put the output in the file file indicated in the -`Parameters for ...' header. Then recompile from scratch. - - The `tuneup' program takes one useful parameter, `-f NNN', which -instructs the program how long to check FFT multiply parameters. If -you're going to use GMP for extremely large numbers, you may want to -run `tuneup' with a large NNN value. - - -File: gmp.info, Node: GMP Basics, Next: Reporting Bugs, Prev: Installing GMP, Up: Top - -3 GMP Basics -************ - -*Using functions, macros, data types, etc. not documented in this -manual is strongly discouraged. If you do so your application is -guaranteed to be incompatible with future versions of GMP.* - -* Menu: - -* Headers and Libraries:: -* Nomenclature and Types:: -* Function Classes:: -* Variable Conventions:: -* Parameter Conventions:: -* Memory Management:: -* Reentrancy:: -* Useful Macros and Constants:: -* Compatibility with older versions:: -* Demonstration Programs:: -* Efficiency:: -* Debugging:: -* Profiling:: -* Autoconf:: -* Emacs:: - - -File: gmp.info, Node: Headers and Libraries, Next: Nomenclature and Types, Prev: GMP Basics, Up: GMP Basics - -3.1 Headers and Libraries -========================= - -All declarations needed to use GMP are collected in the include file -`gmp.h'. It is designed to work with both C and C++ compilers. - - #include - - Note however that prototypes for GMP functions with `FILE *' -parameters are only provided if `' is included too. - - #include - #include - - Likewise `' (or `') is required for prototypes -with `va_list' parameters, such as `gmp_vprintf'. And `' -for prototypes with `struct obstack' parameters, such as -`gmp_obstack_printf', when available. - - All programs using GMP must link against the `libgmp' library. On a -typical Unix-like system this can be done with `-lgmp', for example - - gcc myprogram.c -lgmp - - GMP C++ functions are in a separate `libgmpxx' library. This is -built and installed if C++ support has been enabled (*note Build -Options::). For example, - - g++ mycxxprog.cc -lgmpxx -lgmp - - GMP is built using Libtool and an application can use that to link -if desired, *note GNU Libtool: (libtool)Top. - - If GMP has been installed to a non-standard location then it may be -necessary to use `-I' and `-L' compiler options to point to the right -directories, and some sort of run-time path for a shared library. - - -File: gmp.info, Node: Nomenclature and Types, Next: Function Classes, Prev: Headers and Libraries, Up: GMP Basics - -3.2 Nomenclature and Types -========================== - -In this manual, "integer" usually means a multiple precision integer, as -defined by the GMP library. The C data type for such integers is -`mpz_t'. Here are some examples of how to declare such integers: - - mpz_t sum; - - struct foo { mpz_t x, y; }; - - mpz_t vec[20]; - - "Rational number" means a multiple precision fraction. The C data -type for these fractions is `mpq_t'. For example: - - mpq_t quotient; - - "Floating point number" or "Float" for short, is an arbitrary -precision mantissa with a limited precision exponent. The C data type -for such objects is `mpf_t'. For example: - - mpf_t fp; - - The floating point functions accept and return exponents in the C -type `mp_exp_t'. Currently this is usually a `long', but on some -systems it's an `int' for efficiency. - - A "limb" means the part of a multi-precision number that fits in a -single machine word. (We chose this word because a limb of the human -body is analogous to a digit, only larger, and containing several -digits.) Normally a limb is 32 or 64 bits. The C data type for a limb -is `mp_limb_t'. - - Counts of limbs of a multi-precision number represented in the C type -`mp_size_t'. Currently this is normally a `long', but on some systems -it's an `int' for efficiency, and on some systems it will be `long -long' in the future. - - Counts of bits of a multi-precision number are represented in the C -type `mp_bitcnt_t'. Currently this is always an `unsigned long', but on -some systems it will be an `unsigned long long' in the future . - - "Random state" means an algorithm selection and current state data. -The C data type for such objects is `gmp_randstate_t'. For example: - - gmp_randstate_t rstate; - - Also, in general `mp_bitcnt_t' is used for bit counts and ranges, and -`size_t' is used for byte or character counts. - - -File: gmp.info, Node: Function Classes, Next: Variable Conventions, Prev: Nomenclature and Types, Up: GMP Basics - -3.3 Function Classes -==================== - -There are six classes of functions in the GMP library: - - 1. Functions for signed integer arithmetic, with names beginning with - `mpz_'. The associated type is `mpz_t'. There are about 150 - functions in this class. (*note Integer Functions::) - - 2. Functions for rational number arithmetic, with names beginning with - `mpq_'. The associated type is `mpq_t'. There are about 40 - functions in this class, but the integer functions can be used for - arithmetic on the numerator and denominator separately. (*note - Rational Number Functions::) - - 3. Functions for floating-point arithmetic, with names beginning with - `mpf_'. The associated type is `mpf_t'. There are about 60 - functions is this class. (*note Floating-point Functions::) - - 4. Functions compatible with Berkeley MP, such as `itom', `madd', and - `mult'. The associated type is `MINT'. (*note BSD Compatible - Functions::) - - 5. Fast low-level functions that operate on natural numbers. These - are used by the functions in the preceding groups, and you can - also call them directly from very time-critical user programs. - These functions' names begin with `mpn_'. The associated type is - array of `mp_limb_t'. There are about 30 (hard-to-use) functions - in this class. (*note Low-level Functions::) - - 6. Miscellaneous functions. Functions for setting up custom - allocation and functions for generating random numbers. (*note - Custom Allocation::, and *note Random Number Functions::) - - -File: gmp.info, Node: Variable Conventions, Next: Parameter Conventions, Prev: Function Classes, Up: GMP Basics - -3.4 Variable Conventions -======================== - -GMP functions generally have output arguments before input arguments. -This notation is by analogy with the assignment operator. The BSD MP -compatibility functions are exceptions, having the output arguments -last. - - GMP lets you use the same variable for both input and output in one -call. For example, the main function for integer multiplication, -`mpz_mul', can be used to square `x' and put the result back in `x' with - - mpz_mul (x, x, x); - - Before you can assign to a GMP variable, you need to initialize it -by calling one of the special initialization functions. When you're -done with a variable, you need to clear it out, using one of the -functions for that purpose. Which function to use depends on the type -of variable. See the chapters on integer functions, rational number -functions, and floating-point functions for details. - - A variable should only be initialized once, or at least cleared -between each initialization. After a variable has been initialized, it -may be assigned to any number of times. - - For efficiency reasons, avoid excessive initializing and clearing. -In general, initialize near the start of a function and clear near the -end. For example, - - void - foo (void) - { - mpz_t n; - int i; - mpz_init (n); - for (i = 1; i < 100; i++) - { - mpz_mul (n, ...); - mpz_fdiv_q (n, ...); - ... - } - mpz_clear (n); - } - - -File: gmp.info, Node: Parameter Conventions, Next: Memory Management, Prev: Variable Conventions, Up: GMP Basics - -3.5 Parameter Conventions -========================= - -When a GMP variable is used as a function parameter, it's effectively a -call-by-reference, meaning if the function stores a value there it will -change the original in the caller. Parameters which are input-only can -be designated `const' to provoke a compiler error or warning on -attempting to modify them. - - When a function is going to return a GMP result, it should designate -a parameter that it sets, like the library functions do. More than one -value can be returned by having more than one output parameter, again -like the library functions. A `return' of an `mpz_t' etc doesn't -return the object, only a pointer, and this is almost certainly not -what's wanted. - - Here's an example accepting an `mpz_t' parameter, doing a -calculation, and storing the result to the indicated parameter. - - void - foo (mpz_t result, const mpz_t param, unsigned long n) - { - unsigned long i; - mpz_mul_ui (result, param, n); - for (i = 1; i < n; i++) - mpz_add_ui (result, result, i*7); - } - - int - main (void) - { - mpz_t r, n; - mpz_init (r); - mpz_init_set_str (n, "123456", 0); - foo (r, n, 20L); - gmp_printf ("%Zd\n", r); - return 0; - } - - `foo' works even if the mainline passes the same variable for -`param' and `result', just like the library functions. But sometimes -it's tricky to make that work, and an application might not want to -bother supporting that sort of thing. - - For interest, the GMP types `mpz_t' etc are implemented as -one-element arrays of certain structures. This is why declaring a -variable creates an object with the fields GMP needs, but then using it -as a parameter passes a pointer to the object. Note that the actual -fields in each `mpz_t' etc are for internal use only and should not be -accessed directly by code that expects to be compatible with future GMP -releases. - - -File: gmp.info, Node: Memory Management, Next: Reentrancy, Prev: Parameter Conventions, Up: GMP Basics - -3.6 Memory Management -===================== - -The GMP types like `mpz_t' are small, containing only a couple of sizes, -and pointers to allocated data. Once a variable is initialized, GMP -takes care of all space allocation. Additional space is allocated -whenever a variable doesn't have enough. - - `mpz_t' and `mpq_t' variables never reduce their allocated space. -Normally this is the best policy, since it avoids frequent reallocation. -Applications that need to return memory to the heap at some particular -point can use `mpz_realloc2', or clear variables no longer needed. - - `mpf_t' variables, in the current implementation, use a fixed amount -of space, determined by the chosen precision and allocated at -initialization, so their size doesn't change. - - All memory is allocated using `malloc' and friends by default, but -this can be changed, see *Note Custom Allocation::. Temporary memory -on the stack is also used (via `alloca'), but this can be changed at -build-time if desired, see *Note Build Options::. - - -File: gmp.info, Node: Reentrancy, Next: Useful Macros and Constants, Prev: Memory Management, Up: GMP Basics - -3.7 Reentrancy -============== - -GMP is reentrant and thread-safe, with some exceptions: - - * If configured with `--enable-alloca=malloc-notreentrant' (or with - `--enable-alloca=notreentrant' when `alloca' is not available), - then naturally GMP is not reentrant. - - * `mpf_set_default_prec' and `mpf_init' use a global variable for the - selected precision. `mpf_init2' can be used instead, and in the - C++ interface an explicit precision to the `mpf_class' constructor. - - * `mpz_random' and the other old random number functions use a global - random state and are hence not reentrant. The newer random number - functions that accept a `gmp_randstate_t' parameter can be used - instead. - - * `gmp_randinit' (obsolete) returns an error indication through a - global variable, which is not thread safe. Applications are - advised to use `gmp_randinit_default' or `gmp_randinit_lc_2exp' - instead. - - * `mp_set_memory_functions' uses global variables to store the - selected memory allocation functions. - - * If the memory allocation functions set by a call to - `mp_set_memory_functions' (or `malloc' and friends by default) are - not reentrant, then GMP will not be reentrant either. - - * If the standard I/O functions such as `fwrite' are not reentrant - then the GMP I/O functions using them will not be reentrant either. - - * It's safe for two threads to read from the same GMP variable - simultaneously, but it's not safe for one to read while the - another might be writing, nor for two threads to write - simultaneously. It's not safe for two threads to generate a - random number from the same `gmp_randstate_t' simultaneously, - since this involves an update of that variable. - - -File: gmp.info, Node: Useful Macros and Constants, Next: Compatibility with older versions, Prev: Reentrancy, Up: GMP Basics - -3.8 Useful Macros and Constants -=============================== - - -- Global Constant: const int mp_bits_per_limb - The number of bits per limb. - - -- Macro: __GNU_MP_VERSION - -- Macro: __GNU_MP_VERSION_MINOR - -- Macro: __GNU_MP_VERSION_PATCHLEVEL - The major and minor GMP version, and patch level, respectively, as - integers. For GMP i.j, these numbers will be i, j, and 0, - respectively. For GMP i.j.k, these numbers will be i, j, and k, - respectively. - - -- Global Constant: const char * const gmp_version - The GMP version number, as a null-terminated string, in the form - "i.j.k". This release is "5.0.1". Note that the format "i.j" was - used when k was zero was used before version 4.3.0. - - -- Macro: __GMP_CC - -- Macro: __GMP_CFLAGS - The compiler and compiler flags, respectively, used when compiling - GMP, as strings. - - -File: gmp.info, Node: Compatibility with older versions, Next: Demonstration Programs, Prev: Useful Macros and Constants, Up: GMP Basics - -3.9 Compatibility with older versions -===================================== - -This version of GMP is upwardly binary compatible with all 4.x and 3.x -versions, and upwardly compatible at the source level with all 2.x -versions, with the following exceptions. - - * `mpn_gcd' had its source arguments swapped as of GMP 3.0, for - consistency with other `mpn' functions. - - * `mpf_get_prec' counted precision slightly differently in GMP 3.0 - and 3.0.1, but in 3.1 reverted to the 2.x style. - - There are a number of compatibility issues between GMP 1 and GMP 2 -that of course also apply when porting applications from GMP 1 to GMP -4. Please see the GMP 2 manual for details. - - The Berkeley MP compatibility library (*note BSD Compatible -Functions::) is source and binary compatible with the standard `libmp'. - - -File: gmp.info, Node: Demonstration Programs, Next: Efficiency, Prev: Compatibility with older versions, Up: GMP Basics - -3.10 Demonstration programs -=========================== - -The `demos' subdirectory has some sample programs using GMP. These -aren't built or installed, but there's a `Makefile' with rules for them. -For instance, - - make pexpr - ./pexpr 68^975+10 - -The following programs are provided - - * `pexpr' is an expression evaluator, the program used on the GMP - web page. - - * The `calc' subdirectory has a similar but simpler evaluator using - `lex' and `yacc'. - - * The `expr' subdirectory is yet another expression evaluator, a - library designed for ease of use within a C program. See - `demos/expr/README' for more information. - - * `factorize' is a Pollard-Rho factorization program. - - * `isprime' is a command-line interface to the `mpz_probab_prime_p' - function. - - * `primes' counts or lists primes in an interval, using a sieve. - - * `qcn' is an example use of `mpz_kronecker_ui' to estimate quadratic - class numbers. - - * The `perl' subdirectory is a comprehensive perl interface to GMP. - See `demos/perl/INSTALL' for more information. Documentation is - in POD format in `demos/perl/GMP.pm'. - - As an aside, consideration has been given at various times to some -sort of expression evaluation within the main GMP library. Going -beyond something minimal quickly leads to matters like user-defined -functions, looping, fixnums for control variables, etc, which are -considered outside the scope of GMP (much closer to language -interpreters or compilers, *Note Language Bindings::.) Something -simple for program input convenience may yet be a possibility, a -combination of the `expr' demo and the `pexpr' tree back-end perhaps. -But for now the above evaluators are offered as illustrations. - - -File: gmp.info, Node: Efficiency, Next: Debugging, Prev: Demonstration Programs, Up: GMP Basics - -3.11 Efficiency -=============== - -Small Operands - On small operands, the time for function call overheads and memory - allocation can be significant in comparison to actual calculation. - This is unavoidable in a general purpose variable precision - library, although GMP attempts to be as efficient as it can on - both large and small operands. - -Static Linking - On some CPUs, in particular the x86s, the static `libgmp.a' should - be used for maximum speed, since the PIC code in the shared - `libgmp.so' will have a small overhead on each function call and - global data address. For many programs this will be - insignificant, but for long calculations there's a gain to be had. - -Initializing and Clearing - Avoid excessive initializing and clearing of variables, since this - can be quite time consuming, especially in comparison to otherwise - fast operations like addition. - - A language interpreter might want to keep a free list or stack of - initialized variables ready for use. It should be possible to - integrate something like that with a garbage collector too. - -Reallocations - An `mpz_t' or `mpq_t' variable used to hold successively increasing - values will have its memory repeatedly `realloc'ed, which could be - quite slow or could fragment memory, depending on the C library. - If an application can estimate the final size then `mpz_init2' or - `mpz_realloc2' can be called to allocate the necessary space from - the beginning (*note Initializing Integers::). - - It doesn't matter if a size set with `mpz_init2' or `mpz_realloc2' - is too small, since all functions will do a further reallocation - if necessary. Badly overestimating memory required will waste - space though. - -`2exp' Functions - It's up to an application to call functions like `mpz_mul_2exp' - when appropriate. General purpose functions like `mpz_mul' make - no attempt to identify powers of two or other special forms, - because such inputs will usually be very rare and testing every - time would be wasteful. - -`ui' and `si' Functions - The `ui' functions and the small number of `si' functions exist for - convenience and should be used where applicable. But if for - example an `mpz_t' contains a value that fits in an `unsigned - long' there's no need extract it and call a `ui' function, just - use the regular `mpz' function. - -In-Place Operations - `mpz_abs', `mpq_abs', `mpf_abs', `mpz_neg', `mpq_neg' and - `mpf_neg' are fast when used for in-place operations like - `mpz_abs(x,x)', since in the current implementation only a single - field of `x' needs changing. On suitable compilers (GCC for - instance) this is inlined too. - - `mpz_add_ui', `mpz_sub_ui', `mpf_add_ui' and `mpf_sub_ui' benefit - from an in-place operation like `mpz_add_ui(x,x,y)', since usually - only one or two limbs of `x' will need to be changed. The same - applies to the full precision `mpz_add' etc if `y' is small. If - `y' is big then cache locality may be helped, but that's all. - - `mpz_mul' is currently the opposite, a separate destination is - slightly better. A call like `mpz_mul(x,x,y)' will, unless `y' is - only one limb, make a temporary copy of `x' before forming the - result. Normally that copying will only be a tiny fraction of the - time for the multiply, so this is not a particularly important - consideration. - - `mpz_set', `mpq_set', `mpq_set_num', `mpf_set', etc, make no - attempt to recognise a copy of something to itself, so a call like - `mpz_set(x,x)' will be wasteful. Naturally that would never be - written deliberately, but if it might arise from two pointers to - the same object then a test to avoid it might be desirable. - - if (x != y) - mpz_set (x, y); - - Note that it's never worth introducing extra `mpz_set' calls just - to get in-place operations. If a result should go to a particular - variable then just direct it there and let GMP take care of data - movement. - -Divisibility Testing (Small Integers) - `mpz_divisible_ui_p' and `mpz_congruent_ui_p' are the best - functions for testing whether an `mpz_t' is divisible by an - individual small integer. They use an algorithm which is faster - than `mpz_tdiv_ui', but which gives no useful information about - the actual remainder, only whether it's zero (or a particular - value). - - However when testing divisibility by several small integers, it's - best to take a remainder modulo their product, to save - multi-precision operations. For instance to test whether a number - is divisible by any of 23, 29 or 31 take a remainder modulo - 23*29*31 = 20677 and then test that. - - The division functions like `mpz_tdiv_q_ui' which give a quotient - as well as a remainder are generally a little slower than the - remainder-only functions like `mpz_tdiv_ui'. If the quotient is - only rarely wanted then it's probably best to just take a - remainder and then go back and calculate the quotient if and when - it's wanted (`mpz_divexact_ui' can be used if the remainder is - zero). - -Rational Arithmetic - The `mpq' functions operate on `mpq_t' values with no common - factors in the numerator and denominator. Common factors are - checked-for and cast out as necessary. In general, cancelling - factors every time is the best approach since it minimizes the - sizes for subsequent operations. - - However, applications that know something about the factorization - of the values they're working with might be able to avoid some of - the GCDs used for canonicalization, or swap them for divisions. - For example when multiplying by a prime it's enough to check for - factors of it in the denominator instead of doing a full GCD. Or - when forming a big product it might be known that very little - cancellation will be possible, and so canonicalization can be left - to the end. - - The `mpq_numref' and `mpq_denref' macros give access to the - numerator and denominator to do things outside the scope of the - supplied `mpq' functions. *Note Applying Integer Functions::. - - The canonical form for rationals allows mixed-type `mpq_t' and - integer additions or subtractions to be done directly with - multiples of the denominator. This will be somewhat faster than - `mpq_add'. For example, - - /* mpq increment */ - mpz_add (mpq_numref(q), mpq_numref(q), mpq_denref(q)); - - /* mpq += unsigned long */ - mpz_addmul_ui (mpq_numref(q), mpq_denref(q), 123UL); - - /* mpq -= mpz */ - mpz_submul (mpq_numref(q), mpq_denref(q), z); - -Number Sequences - Functions like `mpz_fac_ui', `mpz_fib_ui' and `mpz_bin_uiui' are - designed for calculating isolated values. If a range of values is - wanted it's probably best to call to get a starting point and - iterate from there. - -Text Input/Output - Hexadecimal or octal are suggested for input or output in text - form. Power-of-2 bases like these can be converted much more - efficiently than other bases, like decimal. For big numbers - there's usually nothing of particular interest to be seen in the - digits, so the base doesn't matter much. - - Maybe we can hope octal will one day become the normal base for - everyday use, as proposed by King Charles XII of Sweden and later - reformers. - - -File: gmp.info, Node: Debugging, Next: Profiling, Prev: Efficiency, Up: GMP Basics - -3.12 Debugging -============== - -Stack Overflow - Depending on the system, a segmentation violation or bus error - might be the only indication of stack overflow. See - `--enable-alloca' choices in *Note Build Options::, for how to - address this. - - In new enough versions of GCC, `-fstack-check' may be able to - ensure an overflow is recognised by the system before too much - damage is done, or `-fstack-limit-symbol' or - `-fstack-limit-register' may be able to add checking if the system - itself doesn't do any (*note Options for Code Generation: - (gcc)Code Gen Options.). These options must be added to the - `CFLAGS' used in the GMP build (*note Build Options::), adding - them just to an application will have no effect. Note also - they're a slowdown, adding overhead to each function call and each - stack allocation. - -Heap Problems - The most likely cause of application problems with GMP is heap - corruption. Failing to `init' GMP variables will have - unpredictable effects, and corruption arising elsewhere in a - program may well affect GMP. Initializing GMP variables more than - once or failing to clear them will cause memory leaks. - - In all such cases a `malloc' debugger is recommended. On a GNU or - BSD system the standard C library `malloc' has some diagnostic - facilities, see *Note Allocation Debugging: (libc)Allocation - Debugging, or `man 3 malloc'. Other possibilities, in no - particular order, include - - `http://www.inf.ethz.ch/personal/biere/projects/ccmalloc/' - `http://dmalloc.com/' - `http://www.perens.com/FreeSoftware/' (electric fence) - `http://packages.debian.org/stable/devel/fda' - `http://www.gnupdate.org/components/leakbug/' - `http://people.redhat.com/~otaylor/memprof/' - `http://www.cbmamiga.demon.co.uk/mpatrol/' - - The GMP default allocation routines in `memory.c' also have a - simple sentinel scheme which can be enabled with `#define DEBUG' - in that file. This is mainly designed for detecting buffer - overruns during GMP development, but might find other uses. - -Stack Backtraces - On some systems the compiler options GMP uses by default can - interfere with debugging. In particular on x86 and 68k systems - `-fomit-frame-pointer' is used and this generally inhibits stack - backtracing. Recompiling without such options may help while - debugging, though the usual caveats about it potentially moving a - memory problem or hiding a compiler bug will apply. - -GDB, the GNU Debugger - A sample `.gdbinit' is included in the distribution, showing how - to call some undocumented dump functions to print GMP variables - from within GDB. Note that these functions shouldn't be used in - final application code since they're undocumented and may be - subject to incompatible changes in future versions of GMP. - -Source File Paths - GMP has multiple source files with the same name, in different - directories. For example `mpz', `mpq' and `mpf' each have an - `init.c'. If the debugger can't already determine the right one - it may help to build with absolute paths on each C file. One way - to do that is to use a separate object directory with an absolute - path to the source directory. - - cd /my/build/dir - /my/source/dir/gmp-5.0.1/configure - - This works via `VPATH', and might require GNU `make'. Alternately - it might be possible to change the `.c.lo' rules appropriately. - -Assertion Checking - The build option `--enable-assert' is available to add some - consistency checks to the library (see *Note Build Options::). - These are likely to be of limited value to most applications. - Assertion failures are just as likely to indicate memory - corruption as a library or compiler bug. - - Applications using the low-level `mpn' functions, however, will - benefit from `--enable-assert' since it adds checks on the - parameters of most such functions, many of which have subtle - restrictions on their usage. Note however that only the generic C - code has checks, not the assembly code, so CPU `none' should be - used for maximum checking. - -Temporary Memory Checking - The build option `--enable-alloca=debug' arranges that each block - of temporary memory in GMP is allocated with a separate call to - `malloc' (or the allocation function set with - `mp_set_memory_functions'). - - This can help a malloc debugger detect accesses outside the - intended bounds, or detect memory not released. In a normal - build, on the other hand, temporary memory is allocated in blocks - which GMP divides up for its own use, or may be allocated with a - compiler builtin `alloca' which will go nowhere near any malloc - debugger hooks. - -Maximum Debuggability - To summarize the above, a GMP build for maximum debuggability - would be - - ./configure --disable-shared --enable-assert \ - --enable-alloca=debug --host=none CFLAGS=-g - - For C++, add `--enable-cxx CXXFLAGS=-g'. - -Checker - The GCC checker (`http://savannah.nongnu.org/projects/checker/') - can be used with GMP. It contains a stub library which means GMP - applications compiled with checker can use a normal GMP build. - - A build of GMP with checking within GMP itself can be made. This - will run very very slowly. On GNU/Linux for example, - - ./configure --host=none-pc-linux-gnu CC=checkergcc - - `--host=none' must be used, since the GMP assembly code doesn't - support the checking scheme. The GMP C++ features cannot be used, - since current versions of checker (0.9.9.1) don't yet support the - standard C++ library. - -Valgrind - The valgrind program (`http://valgrind.org/') is a memory checker - for x86s. It translates and emulates machine instructions to do - strong checks for uninitialized data (at the level of individual - bits), memory accesses through bad pointers, and memory leaks. - - Recent versions of Valgrind are getting support for MMX and - SSE/SSE2 instructions, for past versions GMP will need to be - configured not to use those, ie. for an x86 without them (for - instance plain `i486'). - -Other Problems - Any suspected bug in GMP itself should be isolated to make sure - it's not an application problem, see *Note Reporting Bugs::. - - -File: gmp.info, Node: Profiling, Next: Autoconf, Prev: Debugging, Up: GMP Basics - -3.13 Profiling -============== - -Running a program under a profiler is a good way to find where it's -spending most time and where improvements can be best sought. The -profiling choices for a GMP build are as follows. - -`--disable-profiling' - The default is to add nothing special for profiling. - - It should be possible to just compile the mainline of a program - with `-p' and use `prof' to get a profile consisting of - timer-based sampling of the program counter. Most of the GMP - assembly code has the necessary symbol information. - - This approach has the advantage of minimizing interference with - normal program operation, but on most systems the resolution of - the sampling is quite low (10 milliseconds for instance), - requiring long runs to get accurate information. - -`--enable-profiling=prof' - Build with support for the system `prof', which means `-p' added - to the `CFLAGS'. - - This provides call counting in addition to program counter - sampling, which allows the most frequently called routines to be - identified, and an average time spent in each routine to be - determined. - - The x86 assembly code has support for this option, but on other - processors the assembly routines will be as if compiled without - `-p' and therefore won't appear in the call counts. - - On some systems, such as GNU/Linux, `-p' in fact means `-pg' and in - this case `--enable-profiling=gprof' described below should be used - instead. - -`--enable-profiling=gprof' - Build with support for `gprof', which means `-pg' added to the - `CFLAGS'. - - This provides call graph construction in addition to call counting - and program counter sampling, which makes it possible to count - calls coming from different locations. For example the number of - calls to `mpn_mul' from `mpz_mul' versus the number from - `mpf_mul'. The program counter sampling is still flat though, so - only a total time in `mpn_mul' would be accumulated, not a - separate amount for each call site. - - The x86 assembly code has support for this option, but on other - processors the assembly routines will be as if compiled without - `-pg' and therefore not be included in the call counts. - - On x86 and m68k systems `-pg' and `-fomit-frame-pointer' are - incompatible, so the latter is omitted from the default flags in - that case, which might result in poorer code generation. - - Incidentally, it should be possible to use the `gprof' program - with a plain `--enable-profiling=prof' build. But in that case - only the `gprof -p' flat profile and call counts can be expected - to be valid, not the `gprof -q' call graph. - -`--enable-profiling=instrument' - Build with the GCC option `-finstrument-functions' added to the - `CFLAGS' (*note Options for Code Generation: (gcc)Code Gen - Options.). - - This inserts special instrumenting calls at the start and end of - each function, allowing exact timing and full call graph - construction. - - This instrumenting is not normally a standard system feature and - will require support from an external library, such as - - `http://sourceforge.net/projects/fnccheck/' - - This should be included in `LIBS' during the GMP configure so that - test programs will link. For example, - - ./configure --enable-profiling=instrument LIBS=-lfc - - On a GNU system the C library provides dummy instrumenting - functions, so programs compiled with this option will link. In - this case it's only necessary to ensure the correct library is - added when linking an application. - - The x86 assembly code supports this option, but on other - processors the assembly routines will be as if compiled without - `-finstrument-functions' meaning time spent in them will - effectively be attributed to their caller. - - -File: gmp.info, Node: Autoconf, Next: Emacs, Prev: Profiling, Up: GMP Basics - -3.14 Autoconf -============= - -Autoconf based applications can easily check whether GMP is installed. -The only thing to be noted is that GMP library symbols from version 3 -onwards have prefixes like `__gmpz'. The following therefore would be -a simple test, - - AC_CHECK_LIB(gmp, __gmpz_init) - - This just uses the default `AC_CHECK_LIB' actions for found or not -found, but an application that must have GMP would want to generate an -error if not found. For example, - - AC_CHECK_LIB(gmp, __gmpz_init, , - [AC_MSG_ERROR([GNU MP not found, see http://gmplib.org/])]) - - If functions added in some particular version of GMP are required, -then one of those can be used when checking. For example `mpz_mul_si' -was added in GMP 3.1, - - AC_CHECK_LIB(gmp, __gmpz_mul_si, , - [AC_MSG_ERROR( - [GNU MP not found, or not 3.1 or up, see http://gmplib.org/])]) - - An alternative would be to test the version number in `gmp.h' using -say `AC_EGREP_CPP'. That would make it possible to test the exact -version, if some particular sub-minor release is known to be necessary. - - In general it's recommended that applications should simply demand a -new enough GMP rather than trying to provide supplements for features -not available in past versions. - - Occasionally an application will need or want to know the size of a -type at configuration or preprocessing time, not just with `sizeof' in -the code. This can be done in the normal way with `mp_limb_t' etc, but -GMP 4.0 or up is best for this, since prior versions needed certain -`-D' defines on systems using a `long long' limb. The following would -suit Autoconf 2.50 or up, - - AC_CHECK_SIZEOF(mp_limb_t, , [#include ]) - - -File: gmp.info, Node: Emacs, Prev: Autoconf, Up: GMP Basics - -3.15 Emacs -========== - - (`info-lookup-symbol') is a good way to find documentation on -C functions while editing (*note Info Documentation Lookup: (emacs)Info -Lookup.). - - The GMP manual can be included in such lookups by putting the -following in your `.emacs', - - (eval-after-load "info-look" - '(let ((mode-value (assoc 'c-mode (assoc 'symbol info-lookup-alist)))) - (setcar (nthcdr 3 mode-value) - (cons '("(gmp)Function Index" nil "^ -.* " "\\>") - (nth 3 mode-value))))) - - -File: gmp.info, Node: Reporting Bugs, Next: Integer Functions, Prev: GMP Basics, Up: Top - -4 Reporting Bugs -**************** - -If you think you have found a bug in the GMP library, please -investigate it and report it. We have made this library available to -you, and it is not too much to ask you to report the bugs you find. - - Before you report a bug, check it's not already addressed in *Note -Known Build Problems::, or perhaps *Note Notes for Particular -Systems::. You may also want to check `http://gmplib.org/' for patches -for this release. - - Please include the following in any report, - - * The GMP version number, and if pre-packaged or patched then say so. - - * A test program that makes it possible for us to reproduce the bug. - Include instructions on how to run the program. - - * A description of what is wrong. If the results are incorrect, in - what way. If you get a crash, say so. - - * If you get a crash, include a stack backtrace from the debugger if - it's informative (`where' in `gdb', or `$C' in `adb'). - - * Please do not send core dumps, executables or `strace's. - - * The configuration options you used when building GMP, if any. - - * The name of the compiler and its version. For `gcc', get the - version with `gcc -v', otherwise perhaps `what `which cc`', or - similar. - - * The output from running `uname -a'. - - * The output from running `./config.guess', and from running - `./configfsf.guess' (might be the same). - - * If the bug is related to `configure', then the compressed contents - of `config.log'. - - * If the bug is related to an `asm' file not assembling, then the - contents of `config.m4' and the offending line or lines from the - temporary `mpn/tmp-.s'. - - Please make an effort to produce a self-contained report, with -something definite that can be tested or debugged. Vague queries or -piecemeal messages are difficult to act on and don't help the -development effort. - - It is not uncommon that an observed problem is actually due to a bug -in the compiler; the GMP code tends to explore interesting corners in -compilers. - - If your bug report is good, we will do our best to help you get a -corrected version of the library; if the bug report is poor, we won't -do anything about it (except maybe ask you to send a better report). - - Send your report to: . - - If you think something in this manual is unclear, or downright -incorrect, or if the language needs to be improved, please send a note -to the same address. - - -File: gmp.info, Node: Integer Functions, Next: Rational Number Functions, Prev: Reporting Bugs, Up: Top - -5 Integer Functions -******************* - -This chapter describes the GMP functions for performing integer -arithmetic. These functions start with the prefix `mpz_'. - - GMP integers are stored in objects of type `mpz_t'. - -* Menu: - -* Initializing Integers:: -* Assigning Integers:: -* Simultaneous Integer Init & Assign:: -* Converting Integers:: -* Integer Arithmetic:: -* Integer Division:: -* Integer Exponentiation:: -* Integer Roots:: -* Number Theoretic Functions:: -* Integer Comparisons:: -* Integer Logic and Bit Fiddling:: -* I/O of Integers:: -* Integer Random Numbers:: -* Integer Import and Export:: -* Miscellaneous Integer Functions:: -* Integer Special Functions:: - - -File: gmp.info, Node: Initializing Integers, Next: Assigning Integers, Prev: Integer Functions, Up: Integer Functions - -5.1 Initialization Functions -============================ - -The functions for integer arithmetic assume that all integer objects are -initialized. You do that by calling the function `mpz_init'. For -example, - - { - mpz_t integ; - mpz_init (integ); - ... - mpz_add (integ, ...); - ... - mpz_sub (integ, ...); - - /* Unless the program is about to exit, do ... */ - mpz_clear (integ); - } - - As you can see, you can store new values any number of times, once an -object is initialized. - - -- Function: void mpz_init (mpz_t X) - Initialize X, and set its value to 0. - - -- Function: void mpz_inits (mpz_t X, ...) - Initialize a NULL-terminated list of `mpz_t' variables, and set - their values to 0. - - -- Function: void mpz_init2 (mpz_t X, mp_bitcnt_t N) - Initialize X, with space for N-bit numbers, and set its value to 0. - Calling this function instead of `mpz_init' or `mpz_inits' is never - necessary; reallocation is handled automatically by GMP when - needed. - - N is only the initial space, X will grow automatically in the - normal way, if necessary, for subsequent values stored. - `mpz_init2' makes it possible to avoid such reallocations if a - maximum size is known in advance. - - -- Function: void mpz_clear (mpz_t X) - Free the space occupied by X. Call this function for all `mpz_t' - variables when you are done with them. - - -- Function: void mpz_clears (mpz_t X, ...) - Free the space occupied by a NULL-terminated list of `mpz_t' - variables. - - -- Function: void mpz_realloc2 (mpz_t X, mp_bitcnt_t N) - Change the space allocated for X to N bits. The value in X is - preserved if it fits, or is set to 0 if not. - - Calling this function is never necessary; reallocation is handled - automatically by GMP when needed. But this function can be used - to increase the space for a variable in order to avoid repeated - automatic reallocations, or to decrease it to give memory back to - the heap. - - -File: gmp.info, Node: Assigning Integers, Next: Simultaneous Integer Init & Assign, Prev: Initializing Integers, Up: Integer Functions - -5.2 Assignment Functions -======================== - -These functions assign new values to already initialized integers -(*note Initializing Integers::). - - -- Function: void mpz_set (mpz_t ROP, mpz_t OP) - -- Function: void mpz_set_ui (mpz_t ROP, unsigned long int OP) - -- Function: void mpz_set_si (mpz_t ROP, signed long int OP) - -- Function: void mpz_set_d (mpz_t ROP, double OP) - -- Function: void mpz_set_q (mpz_t ROP, mpq_t OP) - -- Function: void mpz_set_f (mpz_t ROP, mpf_t OP) - Set the value of ROP from OP. - - `mpz_set_d', `mpz_set_q' and `mpz_set_f' truncate OP to make it an - integer. - - -- Function: int mpz_set_str (mpz_t ROP, char *STR, int BASE) - Set the value of ROP from STR, a null-terminated C string in base - BASE. White space is allowed in the string, and is simply ignored. - - The BASE may vary from 2 to 62, or if BASE is 0, then the leading - characters are used: `0x' and `0X' for hexadecimal, `0b' and `0B' - for binary, `0' for octal, or decimal otherwise. - - For bases up to 36, case is ignored; upper-case and lower-case - letters have the same value. For bases 37 to 62, upper-case - letter represent the usual 10..35 while lower-case letter - represent 36..61. - - This function returns 0 if the entire string is a valid number in - base BASE. Otherwise it returns -1. - - -- Function: void mpz_swap (mpz_t ROP1, mpz_t ROP2) - Swap the values ROP1 and ROP2 efficiently. - - -File: gmp.info, Node: Simultaneous Integer Init & Assign, Next: Converting Integers, Prev: Assigning Integers, Up: Integer Functions - -5.3 Combined Initialization and Assignment Functions -==================================================== - -For convenience, GMP provides a parallel series of initialize-and-set -functions which initialize the output and then store the value there. -These functions' names have the form `mpz_init_set...' - - Here is an example of using one: - - { - mpz_t pie; - mpz_init_set_str (pie, "3141592653589793238462643383279502884", 10); - ... - mpz_sub (pie, ...); - ... - mpz_clear (pie); - } - -Once the integer has been initialized by any of the `mpz_init_set...' -functions, it can be used as the source or destination operand for the -ordinary integer functions. Don't use an initialize-and-set function -on a variable already initialized! - - -- Function: void mpz_init_set (mpz_t ROP, mpz_t OP) - -- Function: void mpz_init_set_ui (mpz_t ROP, unsigned long int OP) - -- Function: void mpz_init_set_si (mpz_t ROP, signed long int OP) - -- Function: void mpz_init_set_d (mpz_t ROP, double OP) - Initialize ROP with limb space and set the initial numeric value - from OP. - - -- Function: int mpz_init_set_str (mpz_t ROP, char *STR, int BASE) - Initialize ROP and set its value like `mpz_set_str' (see its - documentation above for details). - - If the string is a correct base BASE number, the function returns - 0; if an error occurs it returns -1. ROP is initialized even if - an error occurs. (I.e., you have to call `mpz_clear' for it.) - - -File: gmp.info, Node: Converting Integers, Next: Integer Arithmetic, Prev: Simultaneous Integer Init & Assign, Up: Integer Functions - -5.4 Conversion Functions -======================== - -This section describes functions for converting GMP integers to -standard C types. Functions for converting _to_ GMP integers are -described in *Note Assigning Integers:: and *Note I/O of Integers::. - - -- Function: unsigned long int mpz_get_ui (mpz_t OP) - Return the value of OP as an `unsigned long'. - - If OP is too big to fit an `unsigned long' then just the least - significant bits that do fit are returned. The sign of OP is - ignored, only the absolute value is used. - - -- Function: signed long int mpz_get_si (mpz_t OP) - If OP fits into a `signed long int' return the value of OP. - Otherwise return the least significant part of OP, with the same - sign as OP. - - If OP is too big to fit in a `signed long int', the returned - result is probably not very useful. To find out if the value will - fit, use the function `mpz_fits_slong_p'. - - -- Function: double mpz_get_d (mpz_t OP) - Convert OP to a `double', truncating if necessary (ie. rounding - towards zero). - - If the exponent from the conversion is too big, the result is - system dependent. An infinity is returned where available. A - hardware overflow trap may or may not occur. - - -- Function: double mpz_get_d_2exp (signed long int *EXP, mpz_t OP) - Convert OP to a `double', truncating if necessary (ie. rounding - towards zero), and returning the exponent separately. - - The return value is in the range 0.5<=abs(D)<1 and the exponent is - stored to `*EXP'. D * 2^EXP is the (truncated) OP value. If OP - is zero, the return is 0.0 and 0 is stored to `*EXP'. - - This is similar to the standard C `frexp' function (*note - Normalization Functions: (libc)Normalization Functions.). - - -- Function: char * mpz_get_str (char *STR, int BASE, mpz_t OP) - Convert OP to a string of digits in base BASE. The base argument - may vary from 2 to 62 or from -2 to -36. - - For BASE in the range 2..36, digits and lower-case letters are - used; for -2..-36, digits and upper-case letters are used; for - 37..62, digits, upper-case letters, and lower-case letters (in - that significance order) are used. - - If STR is `NULL', the result string is allocated using the current - allocation function (*note Custom Allocation::). The block will be - `strlen(str)+1' bytes, that being exactly enough for the string and - null-terminator. - - If STR is not `NULL', it should point to a block of storage large - enough for the result, that being `mpz_sizeinbase (OP, BASE) + 2'. - The two extra bytes are for a possible minus sign, and the - null-terminator. - - A pointer to the result string is returned, being either the - allocated block, or the given STR. - - -File: gmp.info, Node: Integer Arithmetic, Next: Integer Division, Prev: Converting Integers, Up: Integer Functions - -5.5 Arithmetic Functions -======================== - - -- Function: void mpz_add (mpz_t ROP, mpz_t OP1, mpz_t OP2) - -- Function: void mpz_add_ui (mpz_t ROP, mpz_t OP1, unsigned long int - OP2) - Set ROP to OP1 + OP2. - - -- Function: void mpz_sub (mpz_t ROP, mpz_t OP1, mpz_t OP2) - -- Function: void mpz_sub_ui (mpz_t ROP, mpz_t OP1, unsigned long int - OP2) - -- Function: void mpz_ui_sub (mpz_t ROP, unsigned long int OP1, mpz_t - OP2) - Set ROP to OP1 - OP2. - - -- Function: void mpz_mul (mpz_t ROP, mpz_t OP1, mpz_t OP2) - -- Function: void mpz_mul_si (mpz_t ROP, mpz_t OP1, long int OP2) - -- Function: void mpz_mul_ui (mpz_t ROP, mpz_t OP1, unsigned long int - OP2) - Set ROP to OP1 times OP2. - - -- Function: void mpz_addmul (mpz_t ROP, mpz_t OP1, mpz_t OP2) - -- Function: void mpz_addmul_ui (mpz_t ROP, mpz_t OP1, unsigned long - int OP2) - Set ROP to ROP + OP1 times OP2. - - -- Function: void mpz_submul (mpz_t ROP, mpz_t OP1, mpz_t OP2) - -- Function: void mpz_submul_ui (mpz_t ROP, mpz_t OP1, unsigned long - int OP2) - Set ROP to ROP - OP1 times OP2. - - -- Function: void mpz_mul_2exp (mpz_t ROP, mpz_t OP1, mp_bitcnt_t OP2) - Set ROP to OP1 times 2 raised to OP2. This operation can also be - defined as a left shift by OP2 bits. - - -- Function: void mpz_neg (mpz_t ROP, mpz_t OP) - Set ROP to -OP. - - -- Function: void mpz_abs (mpz_t ROP, mpz_t OP) - Set ROP to the absolute value of OP. - - -File: gmp.info, Node: Integer Division, Next: Integer Exponentiation, Prev: Integer Arithmetic, Up: Integer Functions - -5.6 Division Functions -====================== - -Division is undefined if the divisor is zero. Passing a zero divisor -to the division or modulo functions (including the modular powering -functions `mpz_powm' and `mpz_powm_ui'), will cause an intentional -division by zero. This lets a program handle arithmetic exceptions in -these functions the same way as for normal C `int' arithmetic. - - -- Function: void mpz_cdiv_q (mpz_t Q, mpz_t N, mpz_t D) - -- Function: void mpz_cdiv_r (mpz_t R, mpz_t N, mpz_t D) - -- Function: void mpz_cdiv_qr (mpz_t Q, mpz_t R, mpz_t N, mpz_t D) - -- Function: unsigned long int mpz_cdiv_q_ui (mpz_t Q, mpz_t N, - unsigned long int D) - -- Function: unsigned long int mpz_cdiv_r_ui (mpz_t R, mpz_t N, - unsigned long int D) - -- Function: unsigned long int mpz_cdiv_qr_ui (mpz_t Q, mpz_t R, - mpz_t N, unsigned long int D) - -- Function: unsigned long int mpz_cdiv_ui (mpz_t N, - unsigned long int D) - -- Function: void mpz_cdiv_q_2exp (mpz_t Q, mpz_t N, mp_bitcnt_t B) - -- Function: void mpz_cdiv_r_2exp (mpz_t R, mpz_t N, mp_bitcnt_t B) - - -- Function: void mpz_fdiv_q (mpz_t Q, mpz_t N, mpz_t D) - -- Function: void mpz_fdiv_r (mpz_t R, mpz_t N, mpz_t D) - -- Function: void mpz_fdiv_qr (mpz_t Q, mpz_t R, mpz_t N, mpz_t D) - -- Function: unsigned long int mpz_fdiv_q_ui (mpz_t Q, mpz_t N, - unsigned long int D) - -- Function: unsigned long int mpz_fdiv_r_ui (mpz_t R, mpz_t N, - unsigned long int D) - -- Function: unsigned long int mpz_fdiv_qr_ui (mpz_t Q, mpz_t R, - mpz_t N, unsigned long int D) - -- Function: unsigned long int mpz_fdiv_ui (mpz_t N, - unsigned long int D) - -- Function: void mpz_fdiv_q_2exp (mpz_t Q, mpz_t N, mp_bitcnt_t B) - -- Function: void mpz_fdiv_r_2exp (mpz_t R, mpz_t N, mp_bitcnt_t B) - - -- Function: void mpz_tdiv_q (mpz_t Q, mpz_t N, mpz_t D) - -- Function: void mpz_tdiv_r (mpz_t R, mpz_t N, mpz_t D) - -- Function: void mpz_tdiv_qr (mpz_t Q, mpz_t R, mpz_t N, mpz_t D) - -- Function: unsigned long int mpz_tdiv_q_ui (mpz_t Q, mpz_t N, - unsigned long int D) - -- Function: unsigned long int mpz_tdiv_r_ui (mpz_t R, mpz_t N, - unsigned long int D) - -- Function: unsigned long int mpz_tdiv_qr_ui (mpz_t Q, mpz_t R, - mpz_t N, unsigned long int D) - -- Function: unsigned long int mpz_tdiv_ui (mpz_t N, - unsigned long int D) - -- Function: void mpz_tdiv_q_2exp (mpz_t Q, mpz_t N, mp_bitcnt_t B) - -- Function: void mpz_tdiv_r_2exp (mpz_t R, mpz_t N, mp_bitcnt_t B) - - Divide N by D, forming a quotient Q and/or remainder R. For the - `2exp' functions, D=2^B. The rounding is in three styles, each - suiting different applications. - - * `cdiv' rounds Q up towards +infinity, and R will have the - opposite sign to D. The `c' stands for "ceil". - - * `fdiv' rounds Q down towards -infinity, and R will have the - same sign as D. The `f' stands for "floor". - - * `tdiv' rounds Q towards zero, and R will have the same sign - as N. The `t' stands for "truncate". - - In all cases Q and R will satisfy N=Q*D+R, and R will satisfy - 0<=abs(R) 0 and that MOD is odd. - - This function is designed to take the same time and have the same - cache access patterns for any two same-size arguments, assuming - that function arguments are placed at the same position and that - the machine state is identical upon function entry. This function - is intended for cryptographic purposes, where resilience to - side-channel attacks is desired. - - -- Function: void mpz_pow_ui (mpz_t ROP, mpz_t BASE, unsigned long int - EXP) - -- Function: void mpz_ui_pow_ui (mpz_t ROP, unsigned long int BASE, - unsigned long int EXP) - Set ROP to BASE raised to EXP. The case 0^0 yields 1. - - -File: gmp.info, Node: Integer Roots, Next: Number Theoretic Functions, Prev: Integer Exponentiation, Up: Integer Functions - -5.8 Root Extraction Functions -============================= - - -- Function: int mpz_root (mpz_t ROP, mpz_t OP, unsigned long int N) - Set ROP to the truncated integer part of the Nth root of OP. - Return non-zero if the computation was exact, i.e., if OP is ROP - to the Nth power. - - -- Function: void mpz_rootrem (mpz_t ROOT, mpz_t REM, mpz_t U, - unsigned long int N) - Set ROOT to the truncated integer part of the Nth root of U. Set - REM to the remainder, U-ROOT**N. - - -- Function: void mpz_sqrt (mpz_t ROP, mpz_t OP) - Set ROP to the truncated integer part of the square root of OP. - - -- Function: void mpz_sqrtrem (mpz_t ROP1, mpz_t ROP2, mpz_t OP) - Set ROP1 to the truncated integer part of the square root of OP, - like `mpz_sqrt'. Set ROP2 to the remainder OP-ROP1*ROP1, which - will be zero if OP is a perfect square. - - If ROP1 and ROP2 are the same variable, the results are undefined. - - -- Function: int mpz_perfect_power_p (mpz_t OP) - Return non-zero if OP is a perfect power, i.e., if there exist - integers A and B, with B>1, such that OP equals A raised to the - power B. - - Under this definition both 0 and 1 are considered to be perfect - powers. Negative values of OP are accepted, but of course can - only be odd perfect powers. - - -- Function: int mpz_perfect_square_p (mpz_t OP) - Return non-zero if OP is a perfect square, i.e., if the square - root of OP is an integer. Under this definition both 0 and 1 are - considered to be perfect squares. - - -File: gmp.info, Node: Number Theoretic Functions, Next: Integer Comparisons, Prev: Integer Roots, Up: Integer Functions - -5.9 Number Theoretic Functions -============================== - - -- Function: int mpz_probab_prime_p (mpz_t N, int REPS) - Determine whether N is prime. Return 2 if N is definitely prime, - return 1 if N is probably prime (without being certain), or return - 0 if N is definitely composite. - - This function does some trial divisions, then some Miller-Rabin - probabilistic primality tests. REPS controls how many such tests - are done, 5 to 10 is a reasonable number, more will reduce the - chances of a composite being returned as "probably prime". - - Miller-Rabin and similar tests can be more properly called - compositeness tests. Numbers which fail are known to be composite - but those which pass might be prime or might be composite. Only a - few composites pass, hence those which pass are considered - probably prime. - - -- Function: void mpz_nextprime (mpz_t ROP, mpz_t OP) - Set ROP to the next prime greater than OP. - - This function uses a probabilistic algorithm to identify primes. - For practical purposes it's adequate, the chance of a composite - passing will be extremely small. - - -- Function: void mpz_gcd (mpz_t ROP, mpz_t OP1, mpz_t OP2) - Set ROP to the greatest common divisor of OP1 and OP2. The result - is always positive even if one or both input operands are negative. - - -- Function: unsigned long int mpz_gcd_ui (mpz_t ROP, mpz_t OP1, - unsigned long int OP2) - Compute the greatest common divisor of OP1 and OP2. If ROP is not - `NULL', store the result there. - - If the result is small enough to fit in an `unsigned long int', it - is returned. If the result does not fit, 0 is returned, and the - result is equal to the argument OP1. Note that the result will - always fit if OP2 is non-zero. - - -- Function: void mpz_gcdext (mpz_t G, mpz_t S, mpz_t T, mpz_t A, - mpz_t B) - Set G to the greatest common divisor of A and B, and in addition - set S and T to coefficients satisfying A*S + B*T = G. The value - in G is always positive, even if one or both of A and B are - negative. The values in S and T are chosen such that abs(S) <= - abs(B) and abs(T) <= abs(A). - - If T is `NULL' then that value is not computed. - - -- Function: void mpz_lcm (mpz_t ROP, mpz_t OP1, mpz_t OP2) - -- Function: void mpz_lcm_ui (mpz_t ROP, mpz_t OP1, unsigned long OP2) - Set ROP to the least common multiple of OP1 and OP2. ROP is - always positive, irrespective of the signs of OP1 and OP2. ROP - will be zero if either OP1 or OP2 is zero. - - -- Function: int mpz_invert (mpz_t ROP, mpz_t OP1, mpz_t OP2) - Compute the inverse of OP1 modulo OP2 and put the result in ROP. - If the inverse exists, the return value is non-zero and ROP will - satisfy 0 <= ROP < OP2. If an inverse doesn't exist the return - value is zero and ROP is undefined. - - -- Function: int mpz_jacobi (mpz_t A, mpz_t B) - Calculate the Jacobi symbol (A/B). This is defined only for B odd. - - -- Function: int mpz_legendre (mpz_t A, mpz_t P) - Calculate the Legendre symbol (A/P). This is defined only for P - an odd positive prime, and for such P it's identical to the Jacobi - symbol. - - -- Function: int mpz_kronecker (mpz_t A, mpz_t B) - -- Function: int mpz_kronecker_si (mpz_t A, long B) - -- Function: int mpz_kronecker_ui (mpz_t A, unsigned long B) - -- Function: int mpz_si_kronecker (long A, mpz_t B) - -- Function: int mpz_ui_kronecker (unsigned long A, mpz_t B) - Calculate the Jacobi symbol (A/B) with the Kronecker extension - (a/2)=(2/a) when a odd, or (a/2)=0 when a even. - - When B is odd the Jacobi symbol and Kronecker symbol are - identical, so `mpz_kronecker_ui' etc can be used for mixed - precision Jacobi symbols too. - - For more information see Henri Cohen section 1.4.2 (*note - References::), or any number theory textbook. See also the - example program `demos/qcn.c' which uses `mpz_kronecker_ui'. - - -- Function: mp_bitcnt_t mpz_remove (mpz_t ROP, mpz_t OP, mpz_t F) - Remove all occurrences of the factor F from OP and store the - result in ROP. The return value is how many such occurrences were - removed. - - -- Function: void mpz_fac_ui (mpz_t ROP, unsigned long int OP) - Set ROP to OP!, the factorial of OP. - - -- Function: void mpz_bin_ui (mpz_t ROP, mpz_t N, unsigned long int K) - -- Function: void mpz_bin_uiui (mpz_t ROP, unsigned long int N, - unsigned long int K) - Compute the binomial coefficient N over K and store the result in - ROP. Negative values of N are supported by `mpz_bin_ui', using - the identity bin(-n,k) = (-1)^k * bin(n+k-1,k), see Knuth volume 1 - section 1.2.6 part G. - - -- Function: void mpz_fib_ui (mpz_t FN, unsigned long int N) - -- Function: void mpz_fib2_ui (mpz_t FN, mpz_t FNSUB1, unsigned long - int N) - `mpz_fib_ui' sets FN to to F[n], the N'th Fibonacci number. - `mpz_fib2_ui' sets FN to F[n], and FNSUB1 to F[n-1]. - - These functions are designed for calculating isolated Fibonacci - numbers. When a sequence of values is wanted it's best to start - with `mpz_fib2_ui' and iterate the defining F[n+1]=F[n]+F[n-1] or - similar. - - -- Function: void mpz_lucnum_ui (mpz_t LN, unsigned long int N) - -- Function: void mpz_lucnum2_ui (mpz_t LN, mpz_t LNSUB1, unsigned - long int N) - `mpz_lucnum_ui' sets LN to to L[n], the N'th Lucas number. - `mpz_lucnum2_ui' sets LN to L[n], and LNSUB1 to L[n-1]. - - These functions are designed for calculating isolated Lucas - numbers. When a sequence of values is wanted it's best to start - with `mpz_lucnum2_ui' and iterate the defining L[n+1]=L[n]+L[n-1] - or similar. - - The Fibonacci numbers and Lucas numbers are related sequences, so - it's never necessary to call both `mpz_fib2_ui' and - `mpz_lucnum2_ui'. The formulas for going from Fibonacci to Lucas - can be found in *Note Lucas Numbers Algorithm::, the reverse is - straightforward too. - - -File: gmp.info, Node: Integer Comparisons, Next: Integer Logic and Bit Fiddling, Prev: Number Theoretic Functions, Up: Integer Functions - -5.10 Comparison Functions -========================= - - -- Function: int mpz_cmp (mpz_t OP1, mpz_t OP2) - -- Function: int mpz_cmp_d (mpz_t OP1, double OP2) - -- Macro: int mpz_cmp_si (mpz_t OP1, signed long int OP2) - -- Macro: int mpz_cmp_ui (mpz_t OP1, unsigned long int OP2) - Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero - if OP1 = OP2, or a negative value if OP1 < OP2. - - `mpz_cmp_ui' and `mpz_cmp_si' are macros and will evaluate their - arguments more than once. `mpz_cmp_d' can be called with an - infinity, but results are undefined for a NaN. - - -- Function: int mpz_cmpabs (mpz_t OP1, mpz_t OP2) - -- Function: int mpz_cmpabs_d (mpz_t OP1, double OP2) - -- Function: int mpz_cmpabs_ui (mpz_t OP1, unsigned long int OP2) - Compare the absolute values of OP1 and OP2. Return a positive - value if abs(OP1) > abs(OP2), zero if abs(OP1) = abs(OP2), or a - negative value if abs(OP1) < abs(OP2). - - `mpz_cmpabs_d' can be called with an infinity, but results are - undefined for a NaN. - - -- Macro: int mpz_sgn (mpz_t OP) - Return +1 if OP > 0, 0 if OP = 0, and -1 if OP < 0. - - This function is actually implemented as a macro. It evaluates - its argument multiple times. - - -File: gmp.info, Node: Integer Logic and Bit Fiddling, Next: I/O of Integers, Prev: Integer Comparisons, Up: Integer Functions - -5.11 Logical and Bit Manipulation Functions -=========================================== - -These functions behave as if twos complement arithmetic were used -(although sign-magnitude is the actual implementation). The least -significant bit is number 0. - - -- Function: void mpz_and (mpz_t ROP, mpz_t OP1, mpz_t OP2) - Set ROP to OP1 bitwise-and OP2. - - -- Function: void mpz_ior (mpz_t ROP, mpz_t OP1, mpz_t OP2) - Set ROP to OP1 bitwise inclusive-or OP2. - - -- Function: void mpz_xor (mpz_t ROP, mpz_t OP1, mpz_t OP2) - Set ROP to OP1 bitwise exclusive-or OP2. - - -- Function: void mpz_com (mpz_t ROP, mpz_t OP) - Set ROP to the one's complement of OP. - - -- Function: mp_bitcnt_t mpz_popcount (mpz_t OP) - If OP>=0, return the population count of OP, which is the number - of 1 bits in the binary representation. If OP<0, the number of 1s - is infinite, and the return value is the largest possible - `mp_bitcnt_t'. - - -- Function: mp_bitcnt_t mpz_hamdist (mpz_t OP1, mpz_t OP2) - If OP1 and OP2 are both >=0 or both <0, return the hamming - distance between the two operands, which is the number of bit - positions where OP1 and OP2 have different bit values. If one - operand is >=0 and the other <0 then the number of bits different - is infinite, and the return value is the largest possible - `mp_bitcnt_t'. - - -- Function: mp_bitcnt_t mpz_scan0 (mpz_t OP, mp_bitcnt_t STARTING_BIT) - -- Function: mp_bitcnt_t mpz_scan1 (mpz_t OP, mp_bitcnt_t STARTING_BIT) - Scan OP, starting from bit STARTING_BIT, towards more significant - bits, until the first 0 or 1 bit (respectively) is found. Return - the index of the found bit. - - If the bit at STARTING_BIT is already what's sought, then - STARTING_BIT is returned. - - If there's no bit found, then the largest possible `mp_bitcnt_t' is - returned. This will happen in `mpz_scan0' past the end of a - negative number, or `mpz_scan1' past the end of a nonnegative - number. - - -- Function: void mpz_setbit (mpz_t ROP, mp_bitcnt_t BIT_INDEX) - Set bit BIT_INDEX in ROP. - - -- Function: void mpz_clrbit (mpz_t ROP, mp_bitcnt_t BIT_INDEX) - Clear bit BIT_INDEX in ROP. - - -- Function: void mpz_combit (mpz_t ROP, mp_bitcnt_t BIT_INDEX) - Complement bit BIT_INDEX in ROP. - - -- Function: int mpz_tstbit (mpz_t OP, mp_bitcnt_t BIT_INDEX) - Test bit BIT_INDEX in OP and return 0 or 1 accordingly. - - -File: gmp.info, Node: I/O of Integers, Next: Integer Random Numbers, Prev: Integer Logic and Bit Fiddling, Up: Integer Functions - -5.12 Input and Output Functions -=============================== - -Functions that perform input from a stdio stream, and functions that -output to a stdio stream. Passing a `NULL' pointer for a STREAM -argument to any of these functions will make them read from `stdin' and -write to `stdout', respectively. - - When using any of these functions, it is a good idea to include -`stdio.h' before `gmp.h', since that will allow `gmp.h' to define -prototypes for these functions. - - -- Function: size_t mpz_out_str (FILE *STREAM, int BASE, mpz_t OP) - Output OP on stdio stream STREAM, as a string of digits in base - BASE. The base argument may vary from 2 to 62 or from -2 to -36. - - For BASE in the range 2..36, digits and lower-case letters are - used; for -2..-36, digits and upper-case letters are used; for - 37..62, digits, upper-case letters, and lower-case letters (in - that significance order) are used. - - Return the number of bytes written, or if an error occurred, - return 0. - - -- Function: size_t mpz_inp_str (mpz_t ROP, FILE *STREAM, int BASE) - Input a possibly white-space preceded string in base BASE from - stdio stream STREAM, and put the read integer in ROP. - - The BASE may vary from 2 to 62, or if BASE is 0, then the leading - characters are used: `0x' and `0X' for hexadecimal, `0b' and `0B' - for binary, `0' for octal, or decimal otherwise. - - For bases up to 36, case is ignored; upper-case and lower-case - letters have the same value. For bases 37 to 62, upper-case - letter represent the usual 10..35 while lower-case letter - represent 36..61. - - Return the number of bytes read, or if an error occurred, return 0. - - -- Function: size_t mpz_out_raw (FILE *STREAM, mpz_t OP) - Output OP on stdio stream STREAM, in raw binary format. The - integer is written in a portable format, with 4 bytes of size - information, and that many bytes of limbs. Both the size and the - limbs are written in decreasing significance order (i.e., in - big-endian). - - The output can be read with `mpz_inp_raw'. - - Return the number of bytes written, or if an error occurred, - return 0. - - The output of this can not be read by `mpz_inp_raw' from GMP 1, - because of changes necessary for compatibility between 32-bit and - 64-bit machines. - - -- Function: size_t mpz_inp_raw (mpz_t ROP, FILE *STREAM) - Input from stdio stream STREAM in the format written by - `mpz_out_raw', and put the result in ROP. Return the number of - bytes read, or if an error occurred, return 0. - - This routine can read the output from `mpz_out_raw' also from GMP - 1, in spite of changes necessary for compatibility between 32-bit - and 64-bit machines. - - -File: gmp.info, Node: Integer Random Numbers, Next: Integer Import and Export, Prev: I/O of Integers, Up: Integer Functions - -5.13 Random Number Functions -============================ - -The random number functions of GMP come in two groups; older function -that rely on a global state, and newer functions that accept a state -parameter that is read and modified. Please see the *Note Random -Number Functions:: for more information on how to use and not to use -random number functions. - - -- Function: void mpz_urandomb (mpz_t ROP, gmp_randstate_t STATE, - mp_bitcnt_t N) - Generate a uniformly distributed random integer in the range 0 to - 2^N-1, inclusive. - - The variable STATE must be initialized by calling one of the - `gmp_randinit' functions (*Note Random State Initialization::) - before invoking this function. - - -- Function: void mpz_urandomm (mpz_t ROP, gmp_randstate_t STATE, - mpz_t N) - Generate a uniform random integer in the range 0 to N-1, inclusive. - - The variable STATE must be initialized by calling one of the - `gmp_randinit' functions (*Note Random State Initialization::) - before invoking this function. - - -- Function: void mpz_rrandomb (mpz_t ROP, gmp_randstate_t STATE, - mp_bitcnt_t N) - Generate a random integer with long strings of zeros and ones in - the binary representation. Useful for testing functions and - algorithms, since this kind of random numbers have proven to be - more likely to trigger corner-case bugs. The random number will - be in the range 0 to 2^N-1, inclusive. - - The variable STATE must be initialized by calling one of the - `gmp_randinit' functions (*Note Random State Initialization::) - before invoking this function. - - -- Function: void mpz_random (mpz_t ROP, mp_size_t MAX_SIZE) - Generate a random integer of at most MAX_SIZE limbs. The generated - random number doesn't satisfy any particular requirements of - randomness. Negative random numbers are generated when MAX_SIZE - is negative. - - This function is obsolete. Use `mpz_urandomb' or `mpz_urandomm' - instead. - - -- Function: void mpz_random2 (mpz_t ROP, mp_size_t MAX_SIZE) - Generate a random integer of at most MAX_SIZE limbs, with long - strings of zeros and ones in the binary representation. Useful - for testing functions and algorithms, since this kind of random - numbers have proven to be more likely to trigger corner-case bugs. - Negative random numbers are generated when MAX_SIZE is negative. - - This function is obsolete. Use `mpz_rrandomb' instead. - - -File: gmp.info, Node: Integer Import and Export, Next: Miscellaneous Integer Functions, Prev: Integer Random Numbers, Up: Integer Functions - -5.14 Integer Import and Export -============================== - -`mpz_t' variables can be converted to and from arbitrary words of binary -data with the following functions. - - -- Function: void mpz_import (mpz_t ROP, size_t COUNT, int ORDER, - size_t SIZE, int ENDIAN, size_t NAILS, const void *OP) - Set ROP from an array of word data at OP. - - The parameters specify the format of the data. COUNT many words - are read, each SIZE bytes. ORDER can be 1 for most significant - word first or -1 for least significant first. Within each word - ENDIAN can be 1 for most significant byte first, -1 for least - significant first, or 0 for the native endianness of the host CPU. - The most significant NAILS bits of each word are skipped, this - can be 0 to use the full words. - - There is no sign taken from the data, ROP will simply be a positive - integer. An application can handle any sign itself, and apply it - for instance with `mpz_neg'. - - There are no data alignment restrictions on OP, any address is - allowed. - - Here's an example converting an array of `unsigned long' data, most - significant element first, and host byte order within each value. - - unsigned long a[20]; - /* Initialize Z and A */ - mpz_import (z, 20, 1, sizeof(a[0]), 0, 0, a); - - This example assumes the full `sizeof' bytes are used for data in - the given type, which is usually true, and certainly true for - `unsigned long' everywhere we know of. However on Cray vector - systems it may be noted that `short' and `int' are always stored - in 8 bytes (and with `sizeof' indicating that) but use only 32 or - 46 bits. The NAILS feature can account for this, by passing for - instance `8*sizeof(int)-INT_BIT'. - - -- Function: void * mpz_export (void *ROP, size_t *COUNTP, int ORDER, - size_t SIZE, int ENDIAN, size_t NAILS, mpz_t OP) - Fill ROP with word data from OP. - - The parameters specify the format of the data produced. Each word - will be SIZE bytes and ORDER can be 1 for most significant word - first or -1 for least significant first. Within each word ENDIAN - can be 1 for most significant byte first, -1 for least significant - first, or 0 for the native endianness of the host CPU. The most - significant NAILS bits of each word are unused and set to zero, - this can be 0 to produce full words. - - The number of words produced is written to `*COUNTP', or COUNTP - can be `NULL' to discard the count. ROP must have enough space - for the data, or if ROP is `NULL' then a result array of the - necessary size is allocated using the current GMP allocation - function (*note Custom Allocation::). In either case the return - value is the destination used, either ROP or the allocated block. - - If OP is non-zero then the most significant word produced will be - non-zero. If OP is zero then the count returned will be zero and - nothing written to ROP. If ROP is `NULL' in this case, no block - is allocated, just `NULL' is returned. - - The sign of OP is ignored, just the absolute value is exported. An - application can use `mpz_sgn' to get the sign and handle it as - desired. (*note Integer Comparisons::) - - There are no data alignment restrictions on ROP, any address is - allowed. - - When an application is allocating space itself the required size - can be determined with a calculation like the following. Since - `mpz_sizeinbase' always returns at least 1, `count' here will be - at least one, which avoids any portability problems with - `malloc(0)', though if `z' is zero no space at all is actually - needed (or written). - - numb = 8*size - nail; - count = (mpz_sizeinbase (z, 2) + numb-1) / numb; - p = malloc (count * size); - - -File: gmp.info, Node: Miscellaneous Integer Functions, Next: Integer Special Functions, Prev: Integer Import and Export, Up: Integer Functions - -5.15 Miscellaneous Functions -============================ - - -- Function: int mpz_fits_ulong_p (mpz_t OP) - -- Function: int mpz_fits_slong_p (mpz_t OP) - -- Function: int mpz_fits_uint_p (mpz_t OP) - -- Function: int mpz_fits_sint_p (mpz_t OP) - -- Function: int mpz_fits_ushort_p (mpz_t OP) - -- Function: int mpz_fits_sshort_p (mpz_t OP) - Return non-zero iff the value of OP fits in an `unsigned long int', - `signed long int', `unsigned int', `signed int', `unsigned short - int', or `signed short int', respectively. Otherwise, return zero. - - -- Macro: int mpz_odd_p (mpz_t OP) - -- Macro: int mpz_even_p (mpz_t OP) - Determine whether OP is odd or even, respectively. Return - non-zero if yes, zero if no. These macros evaluate their argument - more than once. - - -- Function: size_t mpz_sizeinbase (mpz_t OP, int BASE) - Return the size of OP measured in number of digits in the given - BASE. BASE can vary from 2 to 62. The sign of OP is ignored, - just the absolute value is used. The result will be either exact - or 1 too big. If BASE is a power of 2, the result is always - exact. If OP is zero the return value is always 1. - - This function can be used to determine the space required when - converting OP to a string. The right amount of allocation is - normally two more than the value returned by `mpz_sizeinbase', one - extra for a minus sign and one for the null-terminator. - - It will be noted that `mpz_sizeinbase(OP,2)' can be used to locate - the most significant 1 bit in OP, counting from 1. (Unlike the - bitwise functions which start from 0, *Note Logical and Bit - Manipulation Functions: Integer Logic and Bit Fiddling.) - - -File: gmp.info, Node: Integer Special Functions, Prev: Miscellaneous Integer Functions, Up: Integer Functions - -5.16 Special Functions -====================== - -The functions in this section are for various special purposes. Most -applications will not need them. - - -- Function: void mpz_array_init (mpz_t INTEGER_ARRAY, mp_size_t - ARRAY_SIZE, mp_size_t FIXED_NUM_BITS) - This is a special type of initialization. *Fixed* space of - FIXED_NUM_BITS is allocated to each of the ARRAY_SIZE integers in - INTEGER_ARRAY. There is no way to free the storage allocated by - this function. Don't call `mpz_clear'! - - The INTEGER_ARRAY parameter is the first `mpz_t' in the array. For - example, - - mpz_t arr[20000]; - mpz_array_init (arr[0], 20000, 512); - - This function is only intended for programs that create a large - number of integers and need to reduce memory usage by avoiding the - overheads of allocating and reallocating lots of small blocks. In - normal programs this function is not recommended. - - The space allocated to each integer by this function will not be - automatically increased, unlike the normal `mpz_init', so an - application must ensure it is sufficient for any value stored. - The following space requirements apply to various routines, - - * `mpz_abs', `mpz_neg', `mpz_set', `mpz_set_si' and - `mpz_set_ui' need room for the value they store. - - * `mpz_add', `mpz_add_ui', `mpz_sub' and `mpz_sub_ui' need room - for the larger of the two operands, plus an extra - `mp_bits_per_limb'. - - * `mpz_mul', `mpz_mul_ui' and `mpz_mul_ui' need room for the sum - of the number of bits in their operands, but each rounded up - to a multiple of `mp_bits_per_limb'. - - * `mpz_swap' can be used between two array variables, but not - between an array and a normal variable. - - For other functions, or if in doubt, the suggestion is to - calculate in a regular `mpz_init' variable and copy the result to - an array variable with `mpz_set'. - - -- Function: void * _mpz_realloc (mpz_t INTEGER, mp_size_t NEW_ALLOC) - Change the space for INTEGER to NEW_ALLOC limbs. The value in - INTEGER is preserved if it fits, or is set to 0 if not. The return - value is not useful to applications and should be ignored. - - `mpz_realloc2' is the preferred way to accomplish allocation - changes like this. `mpz_realloc2' and `_mpz_realloc' are the same - except that `_mpz_realloc' takes its size in limbs. - - -- Function: mp_limb_t mpz_getlimbn (mpz_t OP, mp_size_t N) - Return limb number N from OP. The sign of OP is ignored, just the - absolute value is used. The least significant limb is number 0. - - `mpz_size' can be used to find how many limbs make up OP. - `mpz_getlimbn' returns zero if N is outside the range 0 to - `mpz_size(OP)-1'. - - -- Function: size_t mpz_size (mpz_t OP) - Return the size of OP measured in number of limbs. If OP is zero, - the returned value will be zero. - - -File: gmp.info, Node: Rational Number Functions, Next: Floating-point Functions, Prev: Integer Functions, Up: Top - -6 Rational Number Functions -*************************** - -This chapter describes the GMP functions for performing arithmetic on -rational numbers. These functions start with the prefix `mpq_'. - - Rational numbers are stored in objects of type `mpq_t'. - - All rational arithmetic functions assume operands have a canonical -form, and canonicalize their result. The canonical from means that the -denominator and the numerator have no common factors, and that the -denominator is positive. Zero has the unique representation 0/1. - - Pure assignment functions do not canonicalize the assigned variable. -It is the responsibility of the user to canonicalize the assigned -variable before any arithmetic operations are performed on that -variable. - - -- Function: void mpq_canonicalize (mpq_t OP) - Remove any factors that are common to the numerator and - denominator of OP, and make the denominator positive. - -* Menu: - -* Initializing Rationals:: -* Rational Conversions:: -* Rational Arithmetic:: -* Comparing Rationals:: -* Applying Integer Functions:: -* I/O of Rationals:: - - -File: gmp.info, Node: Initializing Rationals, Next: Rational Conversions, Prev: Rational Number Functions, Up: Rational Number Functions - -6.1 Initialization and Assignment Functions -=========================================== - - -- Function: void mpq_init (mpq_t X) - Initialize X and set it to 0/1. Each variable should normally - only be initialized once, or at least cleared out (using the - function `mpq_clear') between each initialization. - - -- Function: void mpq_inits (mpq_t X, ...) - Initialize a NULL-terminated list of `mpq_t' variables, and set - their values to 0/1. - - -- Function: void mpq_clear (mpq_t X) - Free the space occupied by X. Make sure to call this function for - all `mpq_t' variables when you are done with them. - - -- Function: void mpq_clears (mpq_t X, ...) - Free the space occupied by a NULL-terminated list of `mpq_t' - variables. - - -- Function: void mpq_set (mpq_t ROP, mpq_t OP) - -- Function: void mpq_set_z (mpq_t ROP, mpz_t OP) - Assign ROP from OP. - - -- Function: void mpq_set_ui (mpq_t ROP, unsigned long int OP1, - unsigned long int OP2) - -- Function: void mpq_set_si (mpq_t ROP, signed long int OP1, unsigned - long int OP2) - Set the value of ROP to OP1/OP2. Note that if OP1 and OP2 have - common factors, ROP has to be passed to `mpq_canonicalize' before - any operations are performed on ROP. - - -- Function: int mpq_set_str (mpq_t ROP, char *STR, int BASE) - Set ROP from a null-terminated string STR in the given BASE. - - The string can be an integer like "41" or a fraction like - "41/152". The fraction must be in canonical form (*note Rational - Number Functions::), or if not then `mpq_canonicalize' must be - called. - - The numerator and optional denominator are parsed the same as in - `mpz_set_str' (*note Assigning Integers::). White space is - allowed in the string, and is simply ignored. The BASE can vary - from 2 to 62, or if BASE is 0 then the leading characters are - used: `0x' or `0X' for hex, `0b' or `0B' for binary, `0' for - octal, or decimal otherwise. Note that this is done separately - for the numerator and denominator, so for instance `0xEF/100' is - 239/100, whereas `0xEF/0x100' is 239/256. - - The return value is 0 if the entire string is a valid number, or - -1 if not. - - -- Function: void mpq_swap (mpq_t ROP1, mpq_t ROP2) - Swap the values ROP1 and ROP2 efficiently. - - -File: gmp.info, Node: Rational Conversions, Next: Rational Arithmetic, Prev: Initializing Rationals, Up: Rational Number Functions - -6.2 Conversion Functions -======================== - - -- Function: double mpq_get_d (mpq_t OP) - Convert OP to a `double', truncating if necessary (ie. rounding - towards zero). - - If the exponent from the conversion is too big or too small to fit - a `double' then the result is system dependent. For too big an - infinity is returned when available. For too small 0.0 is - normally returned. Hardware overflow, underflow and denorm traps - may or may not occur. - - -- Function: void mpq_set_d (mpq_t ROP, double OP) - -- Function: void mpq_set_f (mpq_t ROP, mpf_t OP) - Set ROP to the value of OP. There is no rounding, this conversion - is exact. - - -- Function: char * mpq_get_str (char *STR, int BASE, mpq_t OP) - Convert OP to a string of digits in base BASE. The base may vary - from 2 to 36. The string will be of the form `num/den', or if the - denominator is 1 then just `num'. - - If STR is `NULL', the result string is allocated using the current - allocation function (*note Custom Allocation::). The block will be - `strlen(str)+1' bytes, that being exactly enough for the string and - null-terminator. - - If STR is not `NULL', it should point to a block of storage large - enough for the result, that being - - mpz_sizeinbase (mpq_numref(OP), BASE) - + mpz_sizeinbase (mpq_denref(OP), BASE) + 3 - - The three extra bytes are for a possible minus sign, possible - slash, and the null-terminator. - - A pointer to the result string is returned, being either the - allocated block, or the given STR. - - -File: gmp.info, Node: Rational Arithmetic, Next: Comparing Rationals, Prev: Rational Conversions, Up: Rational Number Functions - -6.3 Arithmetic Functions -======================== - - -- Function: void mpq_add (mpq_t SUM, mpq_t ADDEND1, mpq_t ADDEND2) - Set SUM to ADDEND1 + ADDEND2. - - -- Function: void mpq_sub (mpq_t DIFFERENCE, mpq_t MINUEND, mpq_t - SUBTRAHEND) - Set DIFFERENCE to MINUEND - SUBTRAHEND. - - -- Function: void mpq_mul (mpq_t PRODUCT, mpq_t MULTIPLIER, mpq_t - MULTIPLICAND) - Set PRODUCT to MULTIPLIER times MULTIPLICAND. - - -- Function: void mpq_mul_2exp (mpq_t ROP, mpq_t OP1, mp_bitcnt_t OP2) - Set ROP to OP1 times 2 raised to OP2. - - -- Function: void mpq_div (mpq_t QUOTIENT, mpq_t DIVIDEND, mpq_t - DIVISOR) - Set QUOTIENT to DIVIDEND/DIVISOR. - - -- Function: void mpq_div_2exp (mpq_t ROP, mpq_t OP1, mp_bitcnt_t OP2) - Set ROP to OP1 divided by 2 raised to OP2. - - -- Function: void mpq_neg (mpq_t NEGATED_OPERAND, mpq_t OPERAND) - Set NEGATED_OPERAND to -OPERAND. - - -- Function: void mpq_abs (mpq_t ROP, mpq_t OP) - Set ROP to the absolute value of OP. - - -- Function: void mpq_inv (mpq_t INVERTED_NUMBER, mpq_t NUMBER) - Set INVERTED_NUMBER to 1/NUMBER. If the new denominator is zero, - this routine will divide by zero. - - -File: gmp.info, Node: Comparing Rationals, Next: Applying Integer Functions, Prev: Rational Arithmetic, Up: Rational Number Functions - -6.4 Comparison Functions -======================== - - -- Function: int mpq_cmp (mpq_t OP1, mpq_t OP2) - Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero - if OP1 = OP2, and a negative value if OP1 < OP2. - - To determine if two rationals are equal, `mpq_equal' is faster than - `mpq_cmp'. - - -- Macro: int mpq_cmp_ui (mpq_t OP1, unsigned long int NUM2, unsigned - long int DEN2) - -- Macro: int mpq_cmp_si (mpq_t OP1, long int NUM2, unsigned long int - DEN2) - Compare OP1 and NUM2/DEN2. Return a positive value if OP1 > - NUM2/DEN2, zero if OP1 = NUM2/DEN2, and a negative value if OP1 < - NUM2/DEN2. - - NUM2 and DEN2 are allowed to have common factors. - - These functions are implemented as a macros and evaluate their - arguments multiple times. - - -- Macro: int mpq_sgn (mpq_t OP) - Return +1 if OP > 0, 0 if OP = 0, and -1 if OP < 0. - - This function is actually implemented as a macro. It evaluates its - arguments multiple times. - - -- Function: int mpq_equal (mpq_t OP1, mpq_t OP2) - Return non-zero if OP1 and OP2 are equal, zero if they are - non-equal. Although `mpq_cmp' can be used for the same purpose, - this function is much faster. - - -File: gmp.info, Node: Applying Integer Functions, Next: I/O of Rationals, Prev: Comparing Rationals, Up: Rational Number Functions - -6.5 Applying Integer Functions to Rationals -=========================================== - -The set of `mpq' functions is quite small. In particular, there are few -functions for either input or output. The following functions give -direct access to the numerator and denominator of an `mpq_t'. - - Note that if an assignment to the numerator and/or denominator could -take an `mpq_t' out of the canonical form described at the start of -this chapter (*note Rational Number Functions::) then -`mpq_canonicalize' must be called before any other `mpq' functions are -applied to that `mpq_t'. - - -- Macro: mpz_t mpq_numref (mpq_t OP) - -- Macro: mpz_t mpq_denref (mpq_t OP) - Return a reference to the numerator and denominator of OP, - respectively. The `mpz' functions can be used on the result of - these macros. - - -- Function: void mpq_get_num (mpz_t NUMERATOR, mpq_t RATIONAL) - -- Function: void mpq_get_den (mpz_t DENOMINATOR, mpq_t RATIONAL) - -- Function: void mpq_set_num (mpq_t RATIONAL, mpz_t NUMERATOR) - -- Function: void mpq_set_den (mpq_t RATIONAL, mpz_t DENOMINATOR) - Get or set the numerator or denominator of a rational. These - functions are equivalent to calling `mpz_set' with an appropriate - `mpq_numref' or `mpq_denref'. Direct use of `mpq_numref' or - `mpq_denref' is recommended instead of these functions. - - -File: gmp.info, Node: I/O of Rationals, Prev: Applying Integer Functions, Up: Rational Number Functions - -6.6 Input and Output Functions -============================== - -When using any of these functions, it's a good idea to include `stdio.h' -before `gmp.h', since that will allow `gmp.h' to define prototypes for -these functions. - - Passing a `NULL' pointer for a STREAM argument to any of these -functions will make them read from `stdin' and write to `stdout', -respectively. - - -- Function: size_t mpq_out_str (FILE *STREAM, int BASE, mpq_t OP) - Output OP on stdio stream STREAM, as a string of digits in base - BASE. The base may vary from 2 to 36. Output is in the form - `num/den' or if the denominator is 1 then just `num'. - - Return the number of bytes written, or if an error occurred, - return 0. - - -- Function: size_t mpq_inp_str (mpq_t ROP, FILE *STREAM, int BASE) - Read a string of digits from STREAM and convert them to a rational - in ROP. Any initial white-space characters are read and - discarded. Return the number of characters read (including white - space), or 0 if a rational could not be read. - - The input can be a fraction like `17/63' or just an integer like - `123'. Reading stops at the first character not in this form, and - white space is not permitted within the string. If the input - might not be in canonical form, then `mpq_canonicalize' must be - called (*note Rational Number Functions::). - - The BASE can be between 2 and 36, or can be 0 in which case the - leading characters of the string determine the base, `0x' or `0X' - for hexadecimal, `0' for octal, or decimal otherwise. The leading - characters are examined separately for the numerator and - denominator of a fraction, so for instance `0x10/11' is 16/11, - whereas `0x10/0x11' is 16/17. - - -File: gmp.info, Node: Floating-point Functions, Next: Low-level Functions, Prev: Rational Number Functions, Up: Top - -7 Floating-point Functions -************************** - -GMP floating point numbers are stored in objects of type `mpf_t' and -functions operating on them have an `mpf_' prefix. - - The mantissa of each float has a user-selectable precision, limited -only by available memory. Each variable has its own precision, and -that can be increased or decreased at any time. - - The exponent of each float is a fixed precision, one machine word on -most systems. In the current implementation the exponent is a count of -limbs, so for example on a 32-bit system this means a range of roughly -2^-68719476768 to 2^68719476736, or on a 64-bit system this will be -greater. Note however `mpf_get_str' can only return an exponent which -fits an `mp_exp_t' and currently `mpf_set_str' doesn't accept exponents -bigger than a `long'. - - Each variable keeps a size for the mantissa data actually in use. -This means that if a float is exactly represented in only a few bits -then only those bits will be used in a calculation, even if the -selected precision is high. - - All calculations are performed to the precision of the destination -variable. Each function is defined to calculate with "infinite -precision" followed by a truncation to the destination precision, but -of course the work done is only what's needed to determine a result -under that definition. - - The precision selected for a variable is a minimum value, GMP may -increase it a little to facilitate efficient calculation. Currently -this means rounding up to a whole limb, and then sometimes having a -further partial limb, depending on the high limb of the mantissa. But -applications shouldn't be concerned by such details. - - The mantissa in stored in binary, as might be imagined from the fact -precisions are expressed in bits. One consequence of this is that -decimal fractions like 0.1 cannot be represented exactly. The same is -true of plain IEEE `double' floats. This makes both highly unsuitable -for calculations involving money or other values that should be exact -decimal fractions. (Suitably scaled integers, or perhaps rationals, -are better choices.) - - `mpf' functions and variables have no special notion of infinity or -not-a-number, and applications must take care not to overflow the -exponent or results will be unpredictable. This might change in a -future release. - - Note that the `mpf' functions are _not_ intended as a smooth -extension to IEEE P754 arithmetic. In particular results obtained on -one computer often differ from the results on a computer with a -different word size. - -* Menu: - -* Initializing Floats:: -* Assigning Floats:: -* Simultaneous Float Init & Assign:: -* Converting Floats:: -* Float Arithmetic:: -* Float Comparison:: -* I/O of Floats:: -* Miscellaneous Float Functions:: - - -File: gmp.info, Node: Initializing Floats, Next: Assigning Floats, Prev: Floating-point Functions, Up: Floating-point Functions - -7.1 Initialization Functions -============================ - - -- Function: void mpf_set_default_prec (mp_bitcnt_t PREC) - Set the default precision to be *at least* PREC bits. All - subsequent calls to `mpf_init' will use this precision, but - previously initialized variables are unaffected. - - -- Function: mp_bitcnt_t mpf_get_default_prec (void) - Return the default precision actually used. - - An `mpf_t' object must be initialized before storing the first value -in it. The functions `mpf_init' and `mpf_init2' are used for that -purpose. - - -- Function: void mpf_init (mpf_t X) - Initialize X to 0. Normally, a variable should be initialized - once only or at least be cleared, using `mpf_clear', between - initializations. The precision of X is undefined unless a default - precision has already been established by a call to - `mpf_set_default_prec'. - - -- Function: void mpf_init2 (mpf_t X, mp_bitcnt_t PREC) - Initialize X to 0 and set its precision to be *at least* PREC - bits. Normally, a variable should be initialized once only or at - least be cleared, using `mpf_clear', between initializations. - - -- Function: void mpf_inits (mpf_t X, ...) - Initialize a NULL-terminated list of `mpf_t' variables, and set - their values to 0. The precision of the initialized variables is - undefined unless a default precision has already been established - by a call to `mpf_set_default_prec'. - - -- Function: void mpf_clear (mpf_t X) - Free the space occupied by X. Make sure to call this function for - all `mpf_t' variables when you are done with them. - - -- Function: void mpf_clears (mpf_t X, ...) - Free the space occupied by a NULL-terminated list of `mpf_t' - variables. - - Here is an example on how to initialize floating-point variables: - { - mpf_t x, y; - mpf_init (x); /* use default precision */ - mpf_init2 (y, 256); /* precision _at least_ 256 bits */ - ... - /* Unless the program is about to exit, do ... */ - mpf_clear (x); - mpf_clear (y); - } - - The following three functions are useful for changing the precision -during a calculation. A typical use would be for adjusting the -precision gradually in iterative algorithms like Newton-Raphson, making -the computation precision closely match the actual accurate part of the -numbers. - - -- Function: mp_bitcnt_t mpf_get_prec (mpf_t OP) - Return the current precision of OP, in bits. - - -- Function: void mpf_set_prec (mpf_t ROP, mp_bitcnt_t PREC) - Set the precision of ROP to be *at least* PREC bits. The value in - ROP will be truncated to the new precision. - - This function requires a call to `realloc', and so should not be - used in a tight loop. - - -- Function: void mpf_set_prec_raw (mpf_t ROP, mp_bitcnt_t PREC) - Set the precision of ROP to be *at least* PREC bits, without - changing the memory allocated. - - PREC must be no more than the allocated precision for ROP, that - being the precision when ROP was initialized, or in the most recent - `mpf_set_prec'. - - The value in ROP is unchanged, and in particular if it had a higher - precision than PREC it will retain that higher precision. New - values written to ROP will use the new PREC. - - Before calling `mpf_clear' or the full `mpf_set_prec', another - `mpf_set_prec_raw' call must be made to restore ROP to its original - allocated precision. Failing to do so will have unpredictable - results. - - `mpf_get_prec' can be used before `mpf_set_prec_raw' to get the - original allocated precision. After `mpf_set_prec_raw' it - reflects the PREC value set. - - `mpf_set_prec_raw' is an efficient way to use an `mpf_t' variable - at different precisions during a calculation, perhaps to gradually - increase precision in an iteration, or just to use various - different precisions for different purposes during a calculation. - - -File: gmp.info, Node: Assigning Floats, Next: Simultaneous Float Init & Assign, Prev: Initializing Floats, Up: Floating-point Functions - -7.2 Assignment Functions -======================== - -These functions assign new values to already initialized floats (*note -Initializing Floats::). - - -- Function: void mpf_set (mpf_t ROP, mpf_t OP) - -- Function: void mpf_set_ui (mpf_t ROP, unsigned long int OP) - -- Function: void mpf_set_si (mpf_t ROP, signed long int OP) - -- Function: void mpf_set_d (mpf_t ROP, double OP) - -- Function: void mpf_set_z (mpf_t ROP, mpz_t OP) - -- Function: void mpf_set_q (mpf_t ROP, mpq_t OP) - Set the value of ROP from OP. - - -- Function: int mpf_set_str (mpf_t ROP, char *STR, int BASE) - Set the value of ROP from the string in STR. The string is of the - form `M@N' or, if the base is 10 or less, alternatively `MeN'. - `M' is the mantissa and `N' is the exponent. The mantissa is - always in the specified base. The exponent is either in the - specified base or, if BASE is negative, in decimal. The decimal - point expected is taken from the current locale, on systems - providing `localeconv'. - - The argument BASE may be in the ranges 2 to 62, or -62 to -2. - Negative values are used to specify that the exponent is in - decimal. - - For bases up to 36, case is ignored; upper-case and lower-case - letters have the same value; for bases 37 to 62, upper-case letter - represent the usual 10..35 while lower-case letter represent - 36..61. - - Unlike the corresponding `mpz' function, the base will not be - determined from the leading characters of the string if BASE is 0. - This is so that numbers like `0.23' are not interpreted as octal. - - White space is allowed in the string, and is simply ignored. - [This is not really true; white-space is ignored in the beginning - of the string and within the mantissa, but not in other places, - such as after a minus sign or in the exponent. We are considering - changing the definition of this function, making it fail when - there is any white-space in the input, since that makes a lot of - sense. Please tell us your opinion about this change. Do you - really want it to accept "3 14" as meaning 314 as it does now?] - - This function returns 0 if the entire string is a valid number in - base BASE. Otherwise it returns -1. - - -- Function: void mpf_swap (mpf_t ROP1, mpf_t ROP2) - Swap ROP1 and ROP2 efficiently. Both the values and the - precisions of the two variables are swapped. - - -File: gmp.info, Node: Simultaneous Float Init & Assign, Next: Converting Floats, Prev: Assigning Floats, Up: Floating-point Functions - -7.3 Combined Initialization and Assignment Functions -==================================================== - -For convenience, GMP provides a parallel series of initialize-and-set -functions which initialize the output and then store the value there. -These functions' names have the form `mpf_init_set...' - - Once the float has been initialized by any of the `mpf_init_set...' -functions, it can be used as the source or destination operand for the -ordinary float functions. Don't use an initialize-and-set function on -a variable already initialized! - - -- Function: void mpf_init_set (mpf_t ROP, mpf_t OP) - -- Function: void mpf_init_set_ui (mpf_t ROP, unsigned long int OP) - -- Function: void mpf_init_set_si (mpf_t ROP, signed long int OP) - -- Function: void mpf_init_set_d (mpf_t ROP, double OP) - Initialize ROP and set its value from OP. - - The precision of ROP will be taken from the active default - precision, as set by `mpf_set_default_prec'. - - -- Function: int mpf_init_set_str (mpf_t ROP, char *STR, int BASE) - Initialize ROP and set its value from the string in STR. See - `mpf_set_str' above for details on the assignment operation. - - Note that ROP is initialized even if an error occurs. (I.e., you - have to call `mpf_clear' for it.) - - The precision of ROP will be taken from the active default - precision, as set by `mpf_set_default_prec'. - - -File: gmp.info, Node: Converting Floats, Next: Float Arithmetic, Prev: Simultaneous Float Init & Assign, Up: Floating-point Functions - -7.4 Conversion Functions -======================== - - -- Function: double mpf_get_d (mpf_t OP) - Convert OP to a `double', truncating if necessary (ie. rounding - towards zero). - - If the exponent in OP is too big or too small to fit a `double' - then the result is system dependent. For too big an infinity is - returned when available. For too small 0.0 is normally returned. - Hardware overflow, underflow and denorm traps may or may not occur. - - -- Function: double mpf_get_d_2exp (signed long int *EXP, mpf_t OP) - Convert OP to a `double', truncating if necessary (ie. rounding - towards zero), and with an exponent returned separately. - - The return value is in the range 0.5<=abs(D)<1 and the exponent is - stored to `*EXP'. D * 2^EXP is the (truncated) OP value. If OP - is zero, the return is 0.0 and 0 is stored to `*EXP'. - - This is similar to the standard C `frexp' function (*note - Normalization Functions: (libc)Normalization Functions.). - - -- Function: long mpf_get_si (mpf_t OP) - -- Function: unsigned long mpf_get_ui (mpf_t OP) - Convert OP to a `long' or `unsigned long', truncating any fraction - part. If OP is too big for the return type, the result is - undefined. - - See also `mpf_fits_slong_p' and `mpf_fits_ulong_p' (*note - Miscellaneous Float Functions::). - - -- Function: char * mpf_get_str (char *STR, mp_exp_t *EXPPTR, int - BASE, size_t N_DIGITS, mpf_t OP) - Convert OP to a string of digits in base BASE. The base argument - may vary from 2 to 62 or from -2 to -36. Up to N_DIGITS digits - will be generated. Trailing zeros are not returned. No more - digits than can be accurately represented by OP are ever - generated. If N_DIGITS is 0 then that accurate maximum number of - digits are generated. - - For BASE in the range 2..36, digits and lower-case letters are - used; for -2..-36, digits and upper-case letters are used; for - 37..62, digits, upper-case letters, and lower-case letters (in - that significance order) are used. - - If STR is `NULL', the result string is allocated using the current - allocation function (*note Custom Allocation::). The block will be - `strlen(str)+1' bytes, that being exactly enough for the string and - null-terminator. - - If STR is not `NULL', it should point to a block of N_DIGITS + 2 - bytes, that being enough for the mantissa, a possible minus sign, - and a null-terminator. When N_DIGITS is 0 to get all significant - digits, an application won't be able to know the space required, - and STR should be `NULL' in that case. - - The generated string is a fraction, with an implicit radix point - immediately to the left of the first digit. The applicable - exponent is written through the EXPPTR pointer. For example, the - number 3.1416 would be returned as string "31416" and exponent 1. - - When OP is zero, an empty string is produced and the exponent - returned is 0. - - A pointer to the result string is returned, being either the - allocated block or the given STR. - - -File: gmp.info, Node: Float Arithmetic, Next: Float Comparison, Prev: Converting Floats, Up: Floating-point Functions - -7.5 Arithmetic Functions -======================== - - -- Function: void mpf_add (mpf_t ROP, mpf_t OP1, mpf_t OP2) - -- Function: void mpf_add_ui (mpf_t ROP, mpf_t OP1, unsigned long int - OP2) - Set ROP to OP1 + OP2. - - -- Function: void mpf_sub (mpf_t ROP, mpf_t OP1, mpf_t OP2) - -- Function: void mpf_ui_sub (mpf_t ROP, unsigned long int OP1, mpf_t - OP2) - -- Function: void mpf_sub_ui (mpf_t ROP, mpf_t OP1, unsigned long int - OP2) - Set ROP to OP1 - OP2. - - -- Function: void mpf_mul (mpf_t ROP, mpf_t OP1, mpf_t OP2) - -- Function: void mpf_mul_ui (mpf_t ROP, mpf_t OP1, unsigned long int - OP2) - Set ROP to OP1 times OP2. - - Division is undefined if the divisor is zero, and passing a zero -divisor to the divide functions will make these functions intentionally -divide by zero. This lets the user handle arithmetic exceptions in -these functions in the same manner as other arithmetic exceptions. - - -- Function: void mpf_div (mpf_t ROP, mpf_t OP1, mpf_t OP2) - -- Function: void mpf_ui_div (mpf_t ROP, unsigned long int OP1, mpf_t - OP2) - -- Function: void mpf_div_ui (mpf_t ROP, mpf_t OP1, unsigned long int - OP2) - Set ROP to OP1/OP2. - - -- Function: void mpf_sqrt (mpf_t ROP, mpf_t OP) - -- Function: void mpf_sqrt_ui (mpf_t ROP, unsigned long int OP) - Set ROP to the square root of OP. - - -- Function: void mpf_pow_ui (mpf_t ROP, mpf_t OP1, unsigned long int - OP2) - Set ROP to OP1 raised to the power OP2. - - -- Function: void mpf_neg (mpf_t ROP, mpf_t OP) - Set ROP to -OP. - - -- Function: void mpf_abs (mpf_t ROP, mpf_t OP) - Set ROP to the absolute value of OP. - - -- Function: void mpf_mul_2exp (mpf_t ROP, mpf_t OP1, mp_bitcnt_t OP2) - Set ROP to OP1 times 2 raised to OP2. - - -- Function: void mpf_div_2exp (mpf_t ROP, mpf_t OP1, mp_bitcnt_t OP2) - Set ROP to OP1 divided by 2 raised to OP2. - - -File: gmp.info, Node: Float Comparison, Next: I/O of Floats, Prev: Float Arithmetic, Up: Floating-point Functions - -7.6 Comparison Functions -======================== - - -- Function: int mpf_cmp (mpf_t OP1, mpf_t OP2) - -- Function: int mpf_cmp_d (mpf_t OP1, double OP2) - -- Function: int mpf_cmp_ui (mpf_t OP1, unsigned long int OP2) - -- Function: int mpf_cmp_si (mpf_t OP1, signed long int OP2) - Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero - if OP1 = OP2, and a negative value if OP1 < OP2. - - `mpf_cmp_d' can be called with an infinity, but results are - undefined for a NaN. - - -- Function: int mpf_eq (mpf_t OP1, mpf_t OP2, mp_bitcnt_t op3) - Return non-zero if the first OP3 bits of OP1 and OP2 are equal, - zero otherwise. I.e., test if OP1 and OP2 are approximately equal. - - Caution 1: All version of GMP up to version 4.2.4 compared just - whole limbs, meaning sometimes more than OP3 bits, sometimes fewer. - - Caution 2: This function will consider XXX11...111 and XX100...000 - different, even if ... is replaced by a semi-infinite number of - bits. Such numbers are really just one ulp off, and should be - considered equal. - - -- Function: void mpf_reldiff (mpf_t ROP, mpf_t OP1, mpf_t OP2) - Compute the relative difference between OP1 and OP2 and store the - result in ROP. This is abs(OP1-OP2)/OP1. - - -- Macro: int mpf_sgn (mpf_t OP) - Return +1 if OP > 0, 0 if OP = 0, and -1 if OP < 0. - - This function is actually implemented as a macro. It evaluates - its arguments multiple times. - - -File: gmp.info, Node: I/O of Floats, Next: Miscellaneous Float Functions, Prev: Float Comparison, Up: Floating-point Functions - -7.7 Input and Output Functions -============================== - -Functions that perform input from a stdio stream, and functions that -output to a stdio stream. Passing a `NULL' pointer for a STREAM -argument to any of these functions will make them read from `stdin' and -write to `stdout', respectively. - - When using any of these functions, it is a good idea to include -`stdio.h' before `gmp.h', since that will allow `gmp.h' to define -prototypes for these functions. - - -- Function: size_t mpf_out_str (FILE *STREAM, int BASE, size_t - N_DIGITS, mpf_t OP) - Print OP to STREAM, as a string of digits. Return the number of - bytes written, or if an error occurred, return 0. - - The mantissa is prefixed with an `0.' and is in the given BASE, - which may vary from 2 to 62 or from -2 to -36. An exponent is - then printed, separated by an `e', or if the base is greater than - 10 then by an `@'. The exponent is always in decimal. The - decimal point follows the current locale, on systems providing - `localeconv'. - - For BASE in the range 2..36, digits and lower-case letters are - used; for -2..-36, digits and upper-case letters are used; for - 37..62, digits, upper-case letters, and lower-case letters (in - that significance order) are used. - - Up to N_DIGITS will be printed from the mantissa, except that no - more digits than are accurately representable by OP will be - printed. N_DIGITS can be 0 to select that accurate maximum. - - -- Function: size_t mpf_inp_str (mpf_t ROP, FILE *STREAM, int BASE) - Read a string in base BASE from STREAM, and put the read float in - ROP. The string is of the form `M@N' or, if the base is 10 or - less, alternatively `MeN'. `M' is the mantissa and `N' is the - exponent. The mantissa is always in the specified base. The - exponent is either in the specified base or, if BASE is negative, - in decimal. The decimal point expected is taken from the current - locale, on systems providing `localeconv'. - - The argument BASE may be in the ranges 2 to 36, or -36 to -2. - Negative values are used to specify that the exponent is in - decimal. - - Unlike the corresponding `mpz' function, the base will not be - determined from the leading characters of the string if BASE is 0. - This is so that numbers like `0.23' are not interpreted as octal. - - Return the number of bytes read, or if an error occurred, return 0. - - -File: gmp.info, Node: Miscellaneous Float Functions, Prev: I/O of Floats, Up: Floating-point Functions - -7.8 Miscellaneous Functions -=========================== - - -- Function: void mpf_ceil (mpf_t ROP, mpf_t OP) - -- Function: void mpf_floor (mpf_t ROP, mpf_t OP) - -- Function: void mpf_trunc (mpf_t ROP, mpf_t OP) - Set ROP to OP rounded to an integer. `mpf_ceil' rounds to the - next higher integer, `mpf_floor' to the next lower, and `mpf_trunc' - to the integer towards zero. - - -- Function: int mpf_integer_p (mpf_t OP) - Return non-zero if OP is an integer. - - -- Function: int mpf_fits_ulong_p (mpf_t OP) - -- Function: int mpf_fits_slong_p (mpf_t OP) - -- Function: int mpf_fits_uint_p (mpf_t OP) - -- Function: int mpf_fits_sint_p (mpf_t OP) - -- Function: int mpf_fits_ushort_p (mpf_t OP) - -- Function: int mpf_fits_sshort_p (mpf_t OP) - Return non-zero if OP would fit in the respective C data type, when - truncated to an integer. - - -- Function: void mpf_urandomb (mpf_t ROP, gmp_randstate_t STATE, - mp_bitcnt_t NBITS) - Generate a uniformly distributed random float in ROP, such that 0 - <= ROP < 1, with NBITS significant bits in the mantissa. - - The variable STATE must be initialized by calling one of the - `gmp_randinit' functions (*Note Random State Initialization::) - before invoking this function. - - -- Function: void mpf_random2 (mpf_t ROP, mp_size_t MAX_SIZE, mp_exp_t - EXP) - Generate a random float of at most MAX_SIZE limbs, with long - strings of zeros and ones in the binary representation. The - exponent of the number is in the interval -EXP to EXP (in limbs). - This function is useful for testing functions and algorithms, - since these kind of random numbers have proven to be more likely - to trigger corner-case bugs. Negative random numbers are - generated when MAX_SIZE is negative. - - -File: gmp.info, Node: Low-level Functions, Next: Random Number Functions, Prev: Floating-point Functions, Up: Top - -8 Low-level Functions -********************* - -This chapter describes low-level GMP functions, used to implement the -high-level GMP functions, but also intended for time-critical user code. - - These functions start with the prefix `mpn_'. - - The `mpn' functions are designed to be as fast as possible, *not* to -provide a coherent calling interface. The different functions have -somewhat similar interfaces, but there are variations that make them -hard to use. These functions do as little as possible apart from the -real multiple precision computation, so that no time is spent on things -that not all callers need. - - A source operand is specified by a pointer to the least significant -limb and a limb count. A destination operand is specified by just a -pointer. It is the responsibility of the caller to ensure that the -destination has enough space for storing the result. - - With this way of specifying operands, it is possible to perform -computations on subranges of an argument, and store the result into a -subrange of a destination. - - A common requirement for all functions is that each source area -needs at least one limb. No size argument may be zero. Unless -otherwise stated, in-place operations are allowed where source and -destination are the same, but not where they only partly overlap. - - The `mpn' functions are the base for the implementation of the -`mpz_', `mpf_', and `mpq_' functions. - - This example adds the number beginning at S1P and the number -beginning at S2P and writes the sum at DESTP. All areas have N limbs. - - cy = mpn_add_n (destp, s1p, s2p, n) - - It should be noted that the `mpn' functions make no attempt to -identify high or low zero limbs on their operands, or other special -forms. On random data such cases will be unlikely and it'd be wasteful -for every function to check every time. An application knowing -something about its data can take steps to trim or perhaps split its -calculations. - - -In the notation used below, a source operand is identified by the -pointer to the least significant limb, and the limb count in braces. -For example, {S1P, S1N}. - - -- Function: mp_limb_t mpn_add_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Add {S1P, N} and {S2P, N}, and write the N least significant limbs - of the result to RP. Return carry, either 0 or 1. - - This is the lowest-level function for addition. It is the - preferred function for addition, since it is written in assembly - for most CPUs. For addition of a variable to itself (i.e., S1P - equals S2P) use `mpn_lshift' with a count of 1 for optimal speed. - - -- Function: mp_limb_t mpn_add_1 (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t N, mp_limb_t S2LIMB) - Add {S1P, N} and S2LIMB, and write the N least significant limbs - of the result to RP. Return carry, either 0 or 1. - - -- Function: mp_limb_t mpn_add (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t S1N, const mp_limb_t *S2P, mp_size_t S2N) - Add {S1P, S1N} and {S2P, S2N}, and write the S1N least significant - limbs of the result to RP. Return carry, either 0 or 1. - - This function requires that S1N is greater than or equal to S2N. - - -- Function: mp_limb_t mpn_sub_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Subtract {S2P, N} from {S1P, N}, and write the N least significant - limbs of the result to RP. Return borrow, either 0 or 1. - - This is the lowest-level function for subtraction. It is the - preferred function for subtraction, since it is written in - assembly for most CPUs. - - -- Function: mp_limb_t mpn_sub_1 (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t N, mp_limb_t S2LIMB) - Subtract S2LIMB from {S1P, N}, and write the N least significant - limbs of the result to RP. Return borrow, either 0 or 1. - - -- Function: mp_limb_t mpn_sub (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t S1N, const mp_limb_t *S2P, mp_size_t S2N) - Subtract {S2P, S2N} from {S1P, S1N}, and write the S1N least - significant limbs of the result to RP. Return borrow, either 0 or - 1. - - This function requires that S1N is greater than or equal to S2N. - - -- Function: void mpn_neg (mp_limb_t *RP, const mp_limb_t *SP, - mp_size_t N) - Perform the negation of {SP, N}, and write the result to {RP, N}. - Return carry-out. - - -- Function: void mpn_mul_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Multiply {S1P, N} and {S2P, N}, and write the 2*N-limb result to - RP. - - The destination has to have space for 2*N limbs, even if the - product's most significant limb is zero. No overlap is permitted - between the destination and either source. - - If the two input operands are the same, use `mpn_sqr'. - - -- Function: mp_limb_t mpn_mul (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t S1N, const mp_limb_t *S2P, mp_size_t S2N) - Multiply {S1P, S1N} and {S2P, S2N}, and write the (S1N+S2N)-limb - result to RP. Return the most significant limb of the result. - - The destination has to have space for S1N + S2N limbs, even if the - product's most significant limb is zero. No overlap is permitted - between the destination and either source. - - This function requires that S1N is greater than or equal to S2N. - - -- Function: void mpn_sqr (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t N) - Compute the square of {S1P, N} and write the 2*N-limb result to RP. - - The destination has to have space for 2*N limbs, even if the - result's most significant limb is zero. No overlap is permitted - between the destination and the source. - - -- Function: mp_limb_t mpn_mul_1 (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t N, mp_limb_t S2LIMB) - Multiply {S1P, N} by S2LIMB, and write the N least significant - limbs of the product to RP. Return the most significant limb of - the product. {S1P, N} and {RP, N} are allowed to overlap provided - RP <= S1P. - - This is a low-level function that is a building block for general - multiplication as well as other operations in GMP. It is written - in assembly for most CPUs. - - Don't call this function if S2LIMB is a power of 2; use - `mpn_lshift' with a count equal to the logarithm of S2LIMB - instead, for optimal speed. - - -- Function: mp_limb_t mpn_addmul_1 (mp_limb_t *RP, const mp_limb_t - *S1P, mp_size_t N, mp_limb_t S2LIMB) - Multiply {S1P, N} and S2LIMB, and add the N least significant - limbs of the product to {RP, N} and write the result to RP. - Return the most significant limb of the product, plus carry-out - from the addition. - - This is a low-level function that is a building block for general - multiplication as well as other operations in GMP. It is written - in assembly for most CPUs. - - -- Function: mp_limb_t mpn_submul_1 (mp_limb_t *RP, const mp_limb_t - *S1P, mp_size_t N, mp_limb_t S2LIMB) - Multiply {S1P, N} and S2LIMB, and subtract the N least significant - limbs of the product from {RP, N} and write the result to RP. - Return the most significant limb of the product, plus borrow-out - from the subtraction. - - This is a low-level function that is a building block for general - multiplication and division as well as other operations in GMP. - It is written in assembly for most CPUs. - - -- Function: void mpn_tdiv_qr (mp_limb_t *QP, mp_limb_t *RP, mp_size_t - QXN, const mp_limb_t *NP, mp_size_t NN, const mp_limb_t *DP, - mp_size_t DN) - Divide {NP, NN} by {DP, DN} and put the quotient at {QP, NN-DN+1} - and the remainder at {RP, DN}. The quotient is rounded towards 0. - - No overlap is permitted between arguments, except that NP might - equal RP. The dividend size NN must be greater than or equal to - divisor size DN. The most significant limb of the divisor must be - non-zero. The QXN operand must be zero. - - -- Function: mp_limb_t mpn_divrem (mp_limb_t *R1P, mp_size_t QXN, - mp_limb_t *RS2P, mp_size_t RS2N, const mp_limb_t *S3P, - mp_size_t S3N) - [This function is obsolete. Please call `mpn_tdiv_qr' instead for - best performance.] - - Divide {RS2P, RS2N} by {S3P, S3N}, and write the quotient at R1P, - with the exception of the most significant limb, which is - returned. The remainder replaces the dividend at RS2P; it will be - S3N limbs long (i.e., as many limbs as the divisor). - - In addition to an integer quotient, QXN fraction limbs are - developed, and stored after the integral limbs. For most usages, - QXN will be zero. - - It is required that RS2N is greater than or equal to S3N. It is - required that the most significant bit of the divisor is set. - - If the quotient is not needed, pass RS2P + S3N as R1P. Aside from - that special case, no overlap between arguments is permitted. - - Return the most significant limb of the quotient, either 0 or 1. - - The area at R1P needs to be RS2N - S3N + QXN limbs large. - - -- Function: mp_limb_t mpn_divrem_1 (mp_limb_t *R1P, mp_size_t QXN, - mp_limb_t *S2P, mp_size_t S2N, mp_limb_t S3LIMB) - -- Macro: mp_limb_t mpn_divmod_1 (mp_limb_t *R1P, mp_limb_t *S2P, - mp_size_t S2N, mp_limb_t S3LIMB) - Divide {S2P, S2N} by S3LIMB, and write the quotient at R1P. - Return the remainder. - - The integer quotient is written to {R1P+QXN, S2N} and in addition - QXN fraction limbs are developed and written to {R1P, QXN}. - Either or both S2N and QXN can be zero. For most usages, QXN will - be zero. - - `mpn_divmod_1' exists for upward source compatibility and is - simply a macro calling `mpn_divrem_1' with a QXN of 0. - - The areas at R1P and S2P have to be identical or completely - separate, not partially overlapping. - - -- Function: mp_limb_t mpn_divmod (mp_limb_t *R1P, mp_limb_t *RS2P, - mp_size_t RS2N, const mp_limb_t *S3P, mp_size_t S3N) - [This function is obsolete. Please call `mpn_tdiv_qr' instead for - best performance.] - - -- Macro: mp_limb_t mpn_divexact_by3 (mp_limb_t *RP, mp_limb_t *SP, - mp_size_t N) - -- Function: mp_limb_t mpn_divexact_by3c (mp_limb_t *RP, mp_limb_t - *SP, mp_size_t N, mp_limb_t CARRY) - Divide {SP, N} by 3, expecting it to divide exactly, and writing - the result to {RP, N}. If 3 divides exactly, the return value is - zero and the result is the quotient. If not, the return value is - non-zero and the result won't be anything useful. - - `mpn_divexact_by3c' takes an initial carry parameter, which can be - the return value from a previous call, so a large calculation can - be done piece by piece from low to high. `mpn_divexact_by3' is - simply a macro calling `mpn_divexact_by3c' with a 0 carry - parameter. - - These routines use a multiply-by-inverse and will be faster than - `mpn_divrem_1' on CPUs with fast multiplication but slow division. - - The source a, result q, size n, initial carry i, and return value - c satisfy c*b^n + a-i = 3*q, where b=2^GMP_NUMB_BITS. The return - c is always 0, 1 or 2, and the initial carry i must also be 0, 1 - or 2 (these are both borrows really). When c=0 clearly q=(a-i)/3. - When c!=0, the remainder (a-i) mod 3 is given by 3-c, because b - == 1 mod 3 (when `mp_bits_per_limb' is even, which is always so - currently). - - -- Function: mp_limb_t mpn_mod_1 (mp_limb_t *S1P, mp_size_t S1N, - mp_limb_t S2LIMB) - Divide {S1P, S1N} by S2LIMB, and return the remainder. S1N can be - zero. - - -- Function: mp_limb_t mpn_lshift (mp_limb_t *RP, const mp_limb_t *SP, - mp_size_t N, unsigned int COUNT) - Shift {SP, N} left by COUNT bits, and write the result to {RP, N}. - The bits shifted out at the left are returned in the least - significant COUNT bits of the return value (the rest of the return - value is zero). - - COUNT must be in the range 1 to mp_bits_per_limb-1. The regions - {SP, N} and {RP, N} may overlap, provided RP >= SP. - - This function is written in assembly for most CPUs. - - -- Function: mp_limb_t mpn_rshift (mp_limb_t *RP, const mp_limb_t *SP, - mp_size_t N, unsigned int COUNT) - Shift {SP, N} right by COUNT bits, and write the result to {RP, - N}. The bits shifted out at the right are returned in the most - significant COUNT bits of the return value (the rest of the return - value is zero). - - COUNT must be in the range 1 to mp_bits_per_limb-1. The regions - {SP, N} and {RP, N} may overlap, provided RP <= SP. - - This function is written in assembly for most CPUs. - - -- Function: int mpn_cmp (const mp_limb_t *S1P, const mp_limb_t *S2P, - mp_size_t N) - Compare {S1P, N} and {S2P, N} and return a positive value if S1 > - S2, 0 if they are equal, or a negative value if S1 < S2. - - -- Function: mp_size_t mpn_gcd (mp_limb_t *RP, mp_limb_t *XP, - mp_size_t XN, mp_limb_t *YP, mp_size_t YN) - Set {RP, RETVAL} to the greatest common divisor of {XP, XN} and - {YP, YN}. The result can be up to YN limbs, the return value is - the actual number produced. Both source operands are destroyed. - - {XP, XN} must have at least as many bits as {YP, YN}. {YP, YN} - must be odd. Both operands must have non-zero most significant - limbs. No overlap is permitted between {XP, XN} and {YP, YN}. - - -- Function: mp_limb_t mpn_gcd_1 (const mp_limb_t *XP, mp_size_t XN, - mp_limb_t YLIMB) - Return the greatest common divisor of {XP, XN} and YLIMB. Both - operands must be non-zero. - - -- Function: mp_size_t mpn_gcdext (mp_limb_t *GP, mp_limb_t *SP, - mp_size_t *SN, mp_limb_t *XP, mp_size_t XN, mp_limb_t *YP, - mp_size_t YN) - Let U be defined by {XP, XN} and let V be defined by {YP, YN}. - - Compute the greatest common divisor G of U and V. Compute a - cofactor S such that G = US + VT. The second cofactor T is not - computed but can easily be obtained from (G - U*S) / V (the - division will be exact). It is required that U >= V > 0. - - S satisfies S = 1 or abs(S) < V / (2 G). S = 0 if and only if V - divides U (i.e., G = V). - - Store G at GP and let the return value define its limb count. - Store S at SP and let |*SN| define its limb count. S can be - negative; when this happens *SN will be negative. The areas at GP - and SP should each have room for XN+1 limbs. - - The areas {XP, XN+1} and {YP, YN+1} are destroyed (i.e. the input - operands plus an extra limb past the end of each). - - Compatibility note: GMP 4.3.0 and 4.3.1 defined S less strictly. - Earlier as well as later GMP releases define S as described here. - - -- Function: mp_size_t mpn_sqrtrem (mp_limb_t *R1P, mp_limb_t *R2P, - const mp_limb_t *SP, mp_size_t N) - Compute the square root of {SP, N} and put the result at {R1P, - ceil(N/2)} and the remainder at {R2P, RETVAL}. R2P needs space - for N limbs, but the return value indicates how many are produced. - - The most significant limb of {SP, N} must be non-zero. The areas - {R1P, ceil(N/2)} and {SP, N} must be completely separate. The - areas {R2P, N} and {SP, N} must be either identical or completely - separate. - - If the remainder is not wanted then R2P can be `NULL', and in this - case the return value is zero or non-zero according to whether the - remainder would have been zero or non-zero. - - A return value of zero indicates a perfect square. See also - `mpz_perfect_square_p'. - - -- Function: mp_size_t mpn_get_str (unsigned char *STR, int BASE, - mp_limb_t *S1P, mp_size_t S1N) - Convert {S1P, S1N} to a raw unsigned char array at STR in base - BASE, and return the number of characters produced. There may be - leading zeros in the string. The string is not in ASCII; to - convert it to printable format, add the ASCII codes for `0' or - `A', depending on the base and range. BASE can vary from 2 to 256. - - The most significant limb of the input {S1P, S1N} must be - non-zero. The input {S1P, S1N} is clobbered, except when BASE is - a power of 2, in which case it's unchanged. - - The area at STR has to have space for the largest possible number - represented by a S1N long limb array, plus one extra character. - - -- Function: mp_size_t mpn_set_str (mp_limb_t *RP, const unsigned char - *STR, size_t STRSIZE, int BASE) - Convert bytes {STR,STRSIZE} in the given BASE to limbs at RP. - - STR[0] is the most significant byte and STR[STRSIZE-1] is the - least significant. Each byte should be a value in the range 0 to - BASE-1, not an ASCII character. BASE can vary from 2 to 256. - - The return value is the number of limbs written to RP. If the most - significant input byte is non-zero then the high limb at RP will be - non-zero, and only that exact number of limbs will be required - there. - - If the most significant input byte is zero then there may be high - zero limbs written to RP and included in the return value. - - STRSIZE must be at least 1, and no overlap is permitted between - {STR,STRSIZE} and the result at RP. - - -- Function: mp_bitcnt_t mpn_scan0 (const mp_limb_t *S1P, mp_bitcnt_t - BIT) - Scan S1P from bit position BIT for the next clear bit. - - It is required that there be a clear bit within the area at S1P at - or beyond bit position BIT, so that the function has something to - return. - - -- Function: mp_bitcnt_t mpn_scan1 (const mp_limb_t *S1P, mp_bitcnt_t - BIT) - Scan S1P from bit position BIT for the next set bit. - - It is required that there be a set bit within the area at S1P at or - beyond bit position BIT, so that the function has something to - return. - - -- Function: void mpn_random (mp_limb_t *R1P, mp_size_t R1N) - -- Function: void mpn_random2 (mp_limb_t *R1P, mp_size_t R1N) - Generate a random number of length R1N and store it at R1P. The - most significant limb is always non-zero. `mpn_random' generates - uniformly distributed limb data, `mpn_random2' generates long - strings of zeros and ones in the binary representation. - - `mpn_random2' is intended for testing the correctness of the `mpn' - routines. - - -- Function: mp_bitcnt_t mpn_popcount (const mp_limb_t *S1P, mp_size_t - N) - Count the number of set bits in {S1P, N}. - - -- Function: mp_bitcnt_t mpn_hamdist (const mp_limb_t *S1P, const - mp_limb_t *S2P, mp_size_t N) - Compute the hamming distance between {S1P, N} and {S2P, N}, which - is the number of bit positions where the two operands have - different bit values. - - -- Function: int mpn_perfect_square_p (const mp_limb_t *S1P, mp_size_t - N) - Return non-zero iff {S1P, N} is a perfect square. - - -- Function: void mpn_and_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical and of {S1P, N} and {S2P, N}, and - write the result to {RP, N}. - - -- Function: void mpn_ior_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical inclusive or of {S1P, N} and {S2P, N}, - and write the result to {RP, N}. - - -- Function: void mpn_xor_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical exclusive or of {S1P, N} and {S2P, N}, - and write the result to {RP, N}. - - -- Function: void mpn_andn_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical and of {S1P, N} and the bitwise - complement of {S2P, N}, and write the result to {RP, N}. - - -- Function: void mpn_iorn_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical inclusive or of {S1P, N} and the - bitwise complement of {S2P, N}, and write the result to {RP, N}. - - -- Function: void mpn_nand_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical and of {S1P, N} and {S2P, N}, and - write the bitwise complement of the result to {RP, N}. - - -- Function: void mpn_nior_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical inclusive or of {S1P, N} and {S2P, N}, - and write the bitwise complement of the result to {RP, N}. - - -- Function: void mpn_xnor_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical exclusive or of {S1P, N} and {S2P, N}, - and write the bitwise complement of the result to {RP, N}. - - -- Function: void mpn_com (mp_limb_t *RP, const mp_limb_t *SP, - mp_size_t N) - Perform the bitwise complement of {SP, N}, and write the result to - {RP, N}. - - -- Function: void mpn_copyi (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t N) - Copy from {S1P, N} to {RP, N}, increasingly. - - -- Function: void mpn_copyd (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t N) - Copy from {S1P, N} to {RP, N}, decreasingly. - - -- Function: void mpn_zero (mp_limb_t *RP, mp_size_t N) - Zero {RP, N}. - - -8.1 Nails -========= - -*Everything in this section is highly experimental and may disappear or -be subject to incompatible changes in a future version of GMP.* - - Nails are an experimental feature whereby a few bits are left unused -at the top of each `mp_limb_t'. This can significantly improve carry -handling on some processors. - - All the `mpn' functions accepting limb data will expect the nail -bits to be zero on entry, and will return data with the nails similarly -all zero. This applies both to limb vectors and to single limb -arguments. - - Nails can be enabled by configuring with `--enable-nails'. By -default the number of bits will be chosen according to what suits the -host processor, but a particular number can be selected with -`--enable-nails=N'. - - At the mpn level, a nail build is neither source nor binary -compatible with a non-nail build, strictly speaking. But programs -acting on limbs only through the mpn functions are likely to work -equally well with either build, and judicious use of the definitions -below should make any program compatible with either build, at the -source level. - - For the higher level routines, meaning `mpz' etc, a nail build -should be fully source and binary compatible with a non-nail build. - - -- Macro: GMP_NAIL_BITS - -- Macro: GMP_NUMB_BITS - -- Macro: GMP_LIMB_BITS - `GMP_NAIL_BITS' is the number of nail bits, or 0 when nails are - not in use. `GMP_NUMB_BITS' is the number of data bits in a limb. - `GMP_LIMB_BITS' is the total number of bits in an `mp_limb_t'. In - all cases - - GMP_LIMB_BITS == GMP_NAIL_BITS + GMP_NUMB_BITS - - -- Macro: GMP_NAIL_MASK - -- Macro: GMP_NUMB_MASK - Bit masks for the nail and number parts of a limb. - `GMP_NAIL_MASK' is 0 when nails are not in use. - - `GMP_NAIL_MASK' is not often needed, since the nail part can be - obtained with `x >> GMP_NUMB_BITS', and that means one less large - constant, which can help various RISC chips. - - -- Macro: GMP_NUMB_MAX - The maximum value that can be stored in the number part of a limb. - This is the same as `GMP_NUMB_MASK', but can be used for clarity - when doing comparisons rather than bit-wise operations. - - The term "nails" comes from finger or toe nails, which are at the -ends of a limb (arm or leg). "numb" is short for number, but is also -how the developers felt after trying for a long time to come up with -sensible names for these things. - - In the future (the distant future most likely) a non-zero nail might -be permitted, giving non-unique representations for numbers in a limb -vector. This would help vector processors since carries would only -ever need to propagate one or two limbs. - - -File: gmp.info, Node: Random Number Functions, Next: Formatted Output, Prev: Low-level Functions, Up: Top - -9 Random Number Functions -************************* - -Sequences of pseudo-random numbers in GMP are generated using a -variable of type `gmp_randstate_t', which holds an algorithm selection -and a current state. Such a variable must be initialized by a call to -one of the `gmp_randinit' functions, and can be seeded with one of the -`gmp_randseed' functions. - - The functions actually generating random numbers are described in -*Note Integer Random Numbers::, and *Note Miscellaneous Float -Functions::. - - The older style random number functions don't accept a -`gmp_randstate_t' parameter but instead share a global variable of that -type. They use a default algorithm and are currently not seeded -(though perhaps that will change in the future). The new functions -accepting a `gmp_randstate_t' are recommended for applications that -care about randomness. - -* Menu: - -* Random State Initialization:: -* Random State Seeding:: -* Random State Miscellaneous:: - - -File: gmp.info, Node: Random State Initialization, Next: Random State Seeding, Prev: Random Number Functions, Up: Random Number Functions - -9.1 Random State Initialization -=============================== - - -- Function: void gmp_randinit_default (gmp_randstate_t STATE) - Initialize STATE with a default algorithm. This will be a - compromise between speed and randomness, and is recommended for - applications with no special requirements. Currently this is - `gmp_randinit_mt'. - - -- Function: void gmp_randinit_mt (gmp_randstate_t STATE) - Initialize STATE for a Mersenne Twister algorithm. This algorithm - is fast and has good randomness properties. - - -- Function: void gmp_randinit_lc_2exp (gmp_randstate_t STATE, mpz_t - A, unsigned long C, mp_bitcnt_t M2EXP) - Initialize STATE with a linear congruential algorithm X = (A*X + - C) mod 2^M2EXP. - - The low bits of X in this algorithm are not very random. The least - significant bit will have a period no more than 2, and the second - bit no more than 4, etc. For this reason only the high half of - each X is actually used. - - When a random number of more than M2EXP/2 bits is to be generated, - multiple iterations of the recurrence are used and the results - concatenated. - - -- Function: int gmp_randinit_lc_2exp_size (gmp_randstate_t STATE, - mp_bitcnt_t SIZE) - Initialize STATE for a linear congruential algorithm as per - `gmp_randinit_lc_2exp'. A, C and M2EXP are selected from a table, - chosen so that SIZE bits (or more) of each X will be used, ie. - M2EXP/2 >= SIZE. - - If successful the return value is non-zero. If SIZE is bigger - than the table data provides then the return value is zero. The - maximum SIZE currently supported is 128. - - -- Function: void gmp_randinit_set (gmp_randstate_t ROP, - gmp_randstate_t OP) - Initialize ROP with a copy of the algorithm and state from OP. - - -- Function: void gmp_randinit (gmp_randstate_t STATE, - gmp_randalg_t ALG, ...) - *This function is obsolete.* - - Initialize STATE with an algorithm selected by ALG. The only - choice is `GMP_RAND_ALG_LC', which is `gmp_randinit_lc_2exp_size' - described above. A third parameter of type `unsigned long' is - required, this is the SIZE for that function. - `GMP_RAND_ALG_DEFAULT' or 0 are the same as `GMP_RAND_ALG_LC'. - - `gmp_randinit' sets bits in the global variable `gmp_errno' to - indicate an error. `GMP_ERROR_UNSUPPORTED_ARGUMENT' if ALG is - unsupported, or `GMP_ERROR_INVALID_ARGUMENT' if the SIZE parameter - is too big. It may be noted this error reporting is not thread - safe (a good reason to use `gmp_randinit_lc_2exp_size' instead). - - -- Function: void gmp_randclear (gmp_randstate_t STATE) - Free all memory occupied by STATE. - - -File: gmp.info, Node: Random State Seeding, Next: Random State Miscellaneous, Prev: Random State Initialization, Up: Random Number Functions - -9.2 Random State Seeding -======================== - - -- Function: void gmp_randseed (gmp_randstate_t STATE, mpz_t SEED) - -- Function: void gmp_randseed_ui (gmp_randstate_t STATE, - unsigned long int SEED) - Set an initial seed value into STATE. - - The size of a seed determines how many different sequences of - random numbers that it's possible to generate. The "quality" of - the seed is the randomness of a given seed compared to the - previous seed used, and this affects the randomness of separate - number sequences. The method for choosing a seed is critical if - the generated numbers are to be used for important applications, - such as generating cryptographic keys. - - Traditionally the system time has been used to seed, but care - needs to be taken with this. If an application seeds often and - the resolution of the system clock is low, then the same sequence - of numbers might be repeated. Also, the system time is quite easy - to guess, so if unpredictability is required then it should - definitely not be the only source for the seed value. On some - systems there's a special device `/dev/random' which provides - random data better suited for use as a seed. - - -File: gmp.info, Node: Random State Miscellaneous, Prev: Random State Seeding, Up: Random Number Functions - -9.3 Random State Miscellaneous -============================== - - -- Function: unsigned long gmp_urandomb_ui (gmp_randstate_t STATE, - unsigned long N) - Return a uniformly distributed random number of N bits, ie. in the - range 0 to 2^N-1 inclusive. N must be less than or equal to the - number of bits in an `unsigned long'. - - -- Function: unsigned long gmp_urandomm_ui (gmp_randstate_t STATE, - unsigned long N) - Return a uniformly distributed random number in the range 0 to - N-1, inclusive. - - -File: gmp.info, Node: Formatted Output, Next: Formatted Input, Prev: Random Number Functions, Up: Top - -10 Formatted Output -******************* - -* Menu: - -* Formatted Output Strings:: -* Formatted Output Functions:: -* C++ Formatted Output:: - - -File: gmp.info, Node: Formatted Output Strings, Next: Formatted Output Functions, Prev: Formatted Output, Up: Formatted Output - -10.1 Format Strings -=================== - -`gmp_printf' and friends accept format strings similar to the standard C -`printf' (*note Formatted Output: (libc)Formatted Output.). A format -specification is of the form - - % [flags] [width] [.[precision]] [type] conv - - GMP adds types `Z', `Q' and `F' for `mpz_t', `mpq_t' and `mpf_t' -respectively, `M' for `mp_limb_t', and `N' for an `mp_limb_t' array. -`Z', `Q', `M' and `N' behave like integers. `Q' will print a `/' and a -denominator, if needed. `F' behaves like a float. For example, - - mpz_t z; - gmp_printf ("%s is an mpz %Zd\n", "here", z); - - mpq_t q; - gmp_printf ("a hex rational: %#40Qx\n", q); - - mpf_t f; - int n; - gmp_printf ("fixed point mpf %.*Ff with %d digits\n", n, f, n); - - mp_limb_t l; - gmp_printf ("limb %Mu\n", l); - - const mp_limb_t *ptr; - mp_size_t size; - gmp_printf ("limb array %Nx\n", ptr, size); - - For `N' the limbs are expected least significant first, as per the -`mpn' functions (*note Low-level Functions::). A negative size can be -given to print the value as a negative. - - All the standard C `printf' types behave the same as the C library -`printf', and can be freely intermixed with the GMP extensions. In the -current implementation the standard parts of the format string are -simply handed to `printf' and only the GMP extensions handled directly. - - The flags accepted are as follows. GLIBC style ' is only for the -standard C types (not the GMP types), and only if the C library -supports it. - - 0 pad with zeros (rather than spaces) - # show the base with `0x', `0X' or `0' - + always show a sign - (space) show a space or a `-' sign - ' group digits, GLIBC style (not GMP types) - - The optional width and precision can be given as a number within the -format string, or as a `*' to take an extra parameter of type `int', the -same as the standard `printf'. - - The standard types accepted are as follows. `h' and `l' are -portable, the rest will depend on the compiler (or include files) for -the type and the C library for the output. - - h short - hh char - j intmax_t or uintmax_t - l long or wchar_t - ll long long - L long double - q quad_t or u_quad_t - t ptrdiff_t - z size_t - -The GMP types are - - F mpf_t, float conversions - Q mpq_t, integer conversions - M mp_limb_t, integer conversions - N mp_limb_t array, integer conversions - Z mpz_t, integer conversions - - The conversions accepted are as follows. `a' and `A' are always -supported for `mpf_t' but depend on the C library for standard C float -types. `m' and `p' depend on the C library. - - a A hex floats, C99 style - c character - d decimal integer - e E scientific format float - f fixed point float - i same as d - g G fixed or scientific float - m `strerror' string, GLIBC style - n store characters written so far - o octal integer - p pointer - s string - u unsigned integer - x X hex integer - - `o', `x' and `X' are unsigned for the standard C types, but for -types `Z', `Q' and `N' they are signed. `u' is not meaningful for `Z', -`Q' and `N'. - - `M' is a proxy for the C library `l' or `L', according to the size -of `mp_limb_t'. Unsigned conversions will be usual, but a signed -conversion can be used and will interpret the value as a twos complement -negative. - - `n' can be used with any type, even the GMP types. - - Other types or conversions that might be accepted by the C library -`printf' cannot be used through `gmp_printf', this includes for -instance extensions registered with GLIBC `register_printf_function'. -Also currently there's no support for POSIX `$' style numbered arguments -(perhaps this will be added in the future). - - The precision field has it's usual meaning for integer `Z' and float -`F' types, but is currently undefined for `Q' and should not be used -with that. - - `mpf_t' conversions only ever generate as many digits as can be -accurately represented by the operand, the same as `mpf_get_str' does. -Zeros will be used if necessary to pad to the requested precision. This -happens even for an `f' conversion of an `mpf_t' which is an integer, -for instance 2^1024 in an `mpf_t' of 128 bits precision will only -produce about 40 digits, then pad with zeros to the decimal point. An -empty precision field like `%.Fe' or `%.Ff' can be used to specifically -request just the significant digits. - - The decimal point character (or string) is taken from the current -locale settings on systems which provide `localeconv' (*note Locales -and Internationalization: (libc)Locales.). The C library will normally -do the same for standard float output. - - The format string is only interpreted as plain `char's, multibyte -characters are not recognised. Perhaps this will change in the future. - - -File: gmp.info, Node: Formatted Output Functions, Next: C++ Formatted Output, Prev: Formatted Output Strings, Up: Formatted Output - -10.2 Functions -============== - -Each of the following functions is similar to the corresponding C -library function. The basic `printf' forms take a variable argument -list. The `vprintf' forms take an argument pointer, see *Note Variadic -Functions: (libc)Variadic Functions, or `man 3 va_start'. - - It should be emphasised that if a format string is invalid, or the -arguments don't match what the format specifies, then the behaviour of -any of these functions will be unpredictable. GCC format string -checking is not available, since it doesn't recognise the GMP -extensions. - - The file based functions `gmp_printf' and `gmp_fprintf' will return --1 to indicate a write error. Output is not "atomic", so partial -output may be produced if a write error occurs. All the functions can -return -1 if the C library `printf' variant in use returns -1, but this -shouldn't normally occur. - - -- Function: int gmp_printf (const char *FMT, ...) - -- Function: int gmp_vprintf (const char *FMT, va_list AP) - Print to the standard output `stdout'. Return the number of - characters written, or -1 if an error occurred. - - -- Function: int gmp_fprintf (FILE *FP, const char *FMT, ...) - -- Function: int gmp_vfprintf (FILE *FP, const char *FMT, va_list AP) - Print to the stream FP. Return the number of characters written, - or -1 if an error occurred. - - -- Function: int gmp_sprintf (char *BUF, const char *FMT, ...) - -- Function: int gmp_vsprintf (char *BUF, const char *FMT, va_list AP) - Form a null-terminated string in BUF. Return the number of - characters written, excluding the terminating null. - - No overlap is permitted between the space at BUF and the string - FMT. - - These functions are not recommended, since there's no protection - against exceeding the space available at BUF. - - -- Function: int gmp_snprintf (char *BUF, size_t SIZE, const char - *FMT, ...) - -- Function: int gmp_vsnprintf (char *BUF, size_t SIZE, const char - *FMT, va_list AP) - Form a null-terminated string in BUF. No more than SIZE bytes - will be written. To get the full output, SIZE must be enough for - the string and null-terminator. - - The return value is the total number of characters which ought to - have been produced, excluding the terminating null. If RETVAL >= - SIZE then the actual output has been truncated to the first SIZE-1 - characters, and a null appended. - - No overlap is permitted between the region {BUF,SIZE} and the FMT - string. - - Notice the return value is in ISO C99 `snprintf' style. This is - so even if the C library `vsnprintf' is the older GLIBC 2.0.x - style. - - -- Function: int gmp_asprintf (char **PP, const char *FMT, ...) - -- Function: int gmp_vasprintf (char **PP, const char *FMT, va_list AP) - Form a null-terminated string in a block of memory obtained from - the current memory allocation function (*note Custom - Allocation::). The block will be the size of the string and - null-terminator. The address of the block in stored to *PP. The - return value is the number of characters produced, excluding the - null-terminator. - - Unlike the C library `asprintf', `gmp_asprintf' doesn't return -1 - if there's no more memory available, it lets the current allocation - function handle that. - - -- Function: int gmp_obstack_printf (struct obstack *OB, const char - *FMT, ...) - -- Function: int gmp_obstack_vprintf (struct obstack *OB, const char - *FMT, va_list AP) - Append to the current object in OB. The return value is the - number of characters written. A null-terminator is not written. - - FMT cannot be within the current object in OB, since that object - might move as it grows. - - These functions are available only when the C library provides the - obstack feature, which probably means only on GNU systems, see - *Note Obstacks: (libc)Obstacks. - - -File: gmp.info, Node: C++ Formatted Output, Prev: Formatted Output Functions, Up: Formatted Output - -10.3 C++ Formatted Output -========================= - -The following functions are provided in `libgmpxx' (*note Headers and -Libraries::), which is built if C++ support is enabled (*note Build -Options::). Prototypes are available from `'. - - -- Function: ostream& operator<< (ostream& STREAM, mpz_t OP) - Print OP to STREAM, using its `ios' formatting settings. - `ios::width' is reset to 0 after output, the same as the standard - `ostream operator<<' routines do. - - In hex or octal, OP is printed as a signed number, the same as for - decimal. This is unlike the standard `operator<<' routines on - `int' etc, which instead give twos complement. - - -- Function: ostream& operator<< (ostream& STREAM, mpq_t OP) - Print OP to STREAM, using its `ios' formatting settings. - `ios::width' is reset to 0 after output, the same as the standard - `ostream operator<<' routines do. - - Output will be a fraction like `5/9', or if the denominator is 1 - then just a plain integer like `123'. - - In hex or octal, OP is printed as a signed value, the same as for - decimal. If `ios::showbase' is set then a base indicator is shown - on both the numerator and denominator (if the denominator is - required). - - -- Function: ostream& operator<< (ostream& STREAM, mpf_t OP) - Print OP to STREAM, using its `ios' formatting settings. - `ios::width' is reset to 0 after output, the same as the standard - `ostream operator<<' routines do. - - The decimal point follows the standard library float `operator<<', - which on recent systems means the `std::locale' imbued on STREAM. - - Hex and octal are supported, unlike the standard `operator<<' on - `double'. The mantissa will be in hex or octal, the exponent will - be in decimal. For hex the exponent delimiter is an `@'. This is - as per `mpf_out_str'. - - `ios::showbase' is supported, and will put a base on the mantissa, - for example hex `0x1.8' or `0x0.8', or octal `01.4' or `00.4'. - This last form is slightly strange, but at least differentiates - itself from decimal. - - These operators mean that GMP types can be printed in the usual C++ -way, for example, - - mpz_t z; - int n; - ... - cout << "iteration " << n << " value " << z << "\n"; - - But note that `ostream' output (and `istream' input, *note C++ -Formatted Input::) is the only overloading available for the GMP types -and that for instance using `+' with an `mpz_t' will have unpredictable -results. For classes with overloading, see *Note C++ Class Interface::. - - -File: gmp.info, Node: Formatted Input, Next: C++ Class Interface, Prev: Formatted Output, Up: Top - -11 Formatted Input -****************** - -* Menu: - -* Formatted Input Strings:: -* Formatted Input Functions:: -* C++ Formatted Input:: - - -File: gmp.info, Node: Formatted Input Strings, Next: Formatted Input Functions, Prev: Formatted Input, Up: Formatted Input - -11.1 Formatted Input Strings -============================ - -`gmp_scanf' and friends accept format strings similar to the standard C -`scanf' (*note Formatted Input: (libc)Formatted Input.). A format -specification is of the form - - % [flags] [width] [type] conv - - GMP adds types `Z', `Q' and `F' for `mpz_t', `mpq_t' and `mpf_t' -respectively. `Z' and `Q' behave like integers. `Q' will read a `/' -and a denominator, if present. `F' behaves like a float. - - GMP variables don't require an `&' when passed to `gmp_scanf', since -they're already "call-by-reference". For example, - - /* to read say "a(5) = 1234" */ - int n; - mpz_t z; - gmp_scanf ("a(%d) = %Zd\n", &n, z); - - mpq_t q1, q2; - gmp_sscanf ("0377 + 0x10/0x11", "%Qi + %Qi", q1, q2); - - /* to read say "topleft (1.55,-2.66)" */ - mpf_t x, y; - char buf[32]; - gmp_scanf ("%31s (%Ff,%Ff)", buf, x, y); - - All the standard C `scanf' types behave the same as in the C library -`scanf', and can be freely intermixed with the GMP extensions. In the -current implementation the standard parts of the format string are -simply handed to `scanf' and only the GMP extensions handled directly. - - The flags accepted are as follows. `a' and `'' will depend on -support from the C library, and `'' cannot be used with GMP types. - - * read but don't store - a allocate a buffer (string conversions) - ' grouped digits, GLIBC style (not GMP - types) - - The standard types accepted are as follows. `h' and `l' are -portable, the rest will depend on the compiler (or include files) for -the type and the C library for the input. - - h short - hh char - j intmax_t or uintmax_t - l long int, double or wchar_t - ll long long - L long double - q quad_t or u_quad_t - t ptrdiff_t - z size_t - -The GMP types are - - F mpf_t, float conversions - Q mpq_t, integer conversions - Z mpz_t, integer conversions - - The conversions accepted are as follows. `p' and `[' will depend on -support from the C library, the rest are standard. - - c character or characters - d decimal integer - e E f g G float - i integer with base indicator - n characters read so far - o octal integer - p pointer - s string of non-whitespace characters - u decimal integer - x X hex integer - [ string of characters in a set - - `e', `E', `f', `g' and `G' are identical, they all read either fixed -point or scientific format, and either upper or lower case `e' for the -exponent in scientific format. - - C99 style hex float format (`printf %a', *note Formatted Output -Strings::) is always accepted for `mpf_t', but for the standard float -types it will depend on the C library. - - `x' and `X' are identical, both accept both upper and lower case -hexadecimal. - - `o', `u', `x' and `X' all read positive or negative values. For the -standard C types these are described as "unsigned" conversions, but -that merely affects certain overflow handling, negatives are still -allowed (per `strtoul', *note Parsing of Integers: (libc)Parsing of -Integers.). For GMP types there are no overflows, so `d' and `u' are -identical. - - `Q' type reads the numerator and (optional) denominator as given. -If the value might not be in canonical form then `mpq_canonicalize' -must be called before using it in any calculations (*note Rational -Number Functions::). - - `Qi' will read a base specification separately for the numerator and -denominator. For example `0x10/11' would be 16/11, whereas `0x10/0x11' -would be 16/17. - - `n' can be used with any of the types above, even the GMP types. -`*' to suppress assignment is allowed, though in that case it would do -nothing at all. - - Other conversions or types that might be accepted by the C library -`scanf' cannot be used through `gmp_scanf'. - - Whitespace is read and discarded before a field, except for `c' and -`[' conversions. - - For float conversions, the decimal point character (or string) -expected is taken from the current locale settings on systems which -provide `localeconv' (*note Locales and Internationalization: -(libc)Locales.). The C library will normally do the same for standard -float input. - - The format string is only interpreted as plain `char's, multibyte -characters are not recognised. Perhaps this will change in the future. - - -File: gmp.info, Node: Formatted Input Functions, Next: C++ Formatted Input, Prev: Formatted Input Strings, Up: Formatted Input - -11.2 Formatted Input Functions -============================== - -Each of the following functions is similar to the corresponding C -library function. The plain `scanf' forms take a variable argument -list. The `vscanf' forms take an argument pointer, see *Note Variadic -Functions: (libc)Variadic Functions, or `man 3 va_start'. - - It should be emphasised that if a format string is invalid, or the -arguments don't match what the format specifies, then the behaviour of -any of these functions will be unpredictable. GCC format string -checking is not available, since it doesn't recognise the GMP -extensions. - - No overlap is permitted between the FMT string and any of the results -produced. - - -- Function: int gmp_scanf (const char *FMT, ...) - -- Function: int gmp_vscanf (const char *FMT, va_list AP) - Read from the standard input `stdin'. - - -- Function: int gmp_fscanf (FILE *FP, const char *FMT, ...) - -- Function: int gmp_vfscanf (FILE *FP, const char *FMT, va_list AP) - Read from the stream FP. - - -- Function: int gmp_sscanf (const char *S, const char *FMT, ...) - -- Function: int gmp_vsscanf (const char *S, const char *FMT, va_list - AP) - Read from a null-terminated string S. - - The return value from each of these functions is the same as the -standard C99 `scanf', namely the number of fields successfully parsed -and stored. `%n' fields and fields read but suppressed by `*' don't -count towards the return value. - - If end of input (or a file error) is reached before a character for -a field or a literal, and if no previous non-suppressed fields have -matched, then the return value is `EOF' instead of 0. A whitespace -character in the format string is only an optional match and doesn't -induce an `EOF' in this fashion. Leading whitespace read and discarded -for a field don't count as characters for that field. - - For the GMP types, input parsing follows C99 rules, namely one -character of lookahead is used and characters are read while they -continue to meet the format requirements. If this doesn't provide a -complete number then the function terminates, with that field not -stored nor counted towards the return value. For instance with `mpf_t' -an input `1.23e-XYZ' would be read up to the `X' and that character -pushed back since it's not a digit. The string `1.23e-' would then be -considered invalid since an `e' must be followed by at least one digit. - - For the standard C types, in the current implementation GMP calls -the C library `scanf' functions, which might have looser rules about -what constitutes a valid input. - - Note that `gmp_sscanf' is the same as `gmp_fscanf' and only does one -character of lookahead when parsing. Although clearly it could look at -its entire input, it is deliberately made identical to `gmp_fscanf', -the same way C99 `sscanf' is the same as `fscanf'. - - -File: gmp.info, Node: C++ Formatted Input, Prev: Formatted Input Functions, Up: Formatted Input - -11.3 C++ Formatted Input -======================== - -The following functions are provided in `libgmpxx' (*note Headers and -Libraries::), which is built only if C++ support is enabled (*note -Build Options::). Prototypes are available from `'. - - -- Function: istream& operator>> (istream& STREAM, mpz_t ROP) - Read ROP from STREAM, using its `ios' formatting settings. - - -- Function: istream& operator>> (istream& STREAM, mpq_t ROP) - An integer like `123' will be read, or a fraction like `5/9'. No - whitespace is allowed around the `/'. If the fraction is not in - canonical form then `mpq_canonicalize' must be called (*note - Rational Number Functions::) before operating on it. - - As per integer input, an `0' or `0x' base indicator is read when - none of `ios::dec', `ios::oct' or `ios::hex' are set. This is - done separately for numerator and denominator, so that for instance - `0x10/11' is 16/11 and `0x10/0x11' is 16/17. - - -- Function: istream& operator>> (istream& STREAM, mpf_t ROP) - Read ROP from STREAM, using its `ios' formatting settings. - - Hex or octal floats are not supported, but might be in the future, - or perhaps it's best to accept only what the standard float - `operator>>' does. - - Note that digit grouping specified by the `istream' locale is -currently not accepted. Perhaps this will change in the future. - - - These operators mean that GMP types can be read in the usual C++ -way, for example, - - mpz_t z; - ... - cin >> z; - - But note that `istream' input (and `ostream' output, *note C++ -Formatted Output::) is the only overloading available for the GMP types -and that for instance using `+' with an `mpz_t' will have unpredictable -results. For classes with overloading, see *Note C++ Class Interface::. - - -File: gmp.info, Node: C++ Class Interface, Next: BSD Compatible Functions, Prev: Formatted Input, Up: Top - -12 C++ Class Interface -********************** - -This chapter describes the C++ class based interface to GMP. - - All GMP C language types and functions can be used in C++ programs, -since `gmp.h' has `extern "C"' qualifiers, but the class interface -offers overloaded functions and operators which may be more convenient. - - Due to the implementation of this interface, a reasonably recent C++ -compiler is required, one supporting namespaces, partial specialization -of templates and member templates. For GCC this means version 2.91 or -later. - - *Everything described in this chapter is to be considered preliminary -and might be subject to incompatible changes if some unforeseen -difficulty reveals itself.* - -* Menu: - -* C++ Interface General:: -* C++ Interface Integers:: -* C++ Interface Rationals:: -* C++ Interface Floats:: -* C++ Interface Random Numbers:: -* C++ Interface Limitations:: - - -File: gmp.info, Node: C++ Interface General, Next: C++ Interface Integers, Prev: C++ Class Interface, Up: C++ Class Interface - -12.1 C++ Interface General -========================== - -All the C++ classes and functions are available with - - #include - - Programs should be linked with the `libgmpxx' and `libgmp' -libraries. For example, - - g++ mycxxprog.cc -lgmpxx -lgmp - -The classes defined are - - -- Class: mpz_class - -- Class: mpq_class - -- Class: mpf_class - - The standard operators and various standard functions are overloaded -to allow arithmetic with these classes. For example, - - int - main (void) - { - mpz_class a, b, c; - - a = 1234; - b = "-5678"; - c = a+b; - cout << "sum is " << c << "\n"; - cout << "absolute value is " << abs(c) << "\n"; - - return 0; - } - - An important feature of the implementation is that an expression like -`a=b+c' results in a single call to the corresponding `mpz_add', -without using a temporary for the `b+c' part. Expressions which by -their nature imply intermediate values, like `a=b*c+d*e', still use -temporaries though. - - The classes can be freely intermixed in expressions, as can the -classes and the standard types `long', `unsigned long' and `double'. -Smaller types like `int' or `float' can also be intermixed, since C++ -will promote them. - - Note that `bool' is not accepted directly, but must be explicitly -cast to an `int' first. This is because C++ will automatically convert -any pointer to a `bool', so if GMP accepted `bool' it would make all -sorts of invalid class and pointer combinations compile but almost -certainly not do anything sensible. - - Conversions back from the classes to standard C++ types aren't done -automatically, instead member functions like `get_si' are provided (see -the following sections for details). - - Also there are no automatic conversions from the classes to the -corresponding GMP C types, instead a reference to the underlying C -object can be obtained with the following functions, - - -- Function: mpz_t mpz_class::get_mpz_t () - -- Function: mpq_t mpq_class::get_mpq_t () - -- Function: mpf_t mpf_class::get_mpf_t () - - These can be used to call a C function which doesn't have a C++ class -interface. For example to set `a' to the GCD of `b' and `c', - - mpz_class a, b, c; - ... - mpz_gcd (a.get_mpz_t(), b.get_mpz_t(), c.get_mpz_t()); - - In the other direction, a class can be initialized from the -corresponding GMP C type, or assigned to if an explicit constructor is -used. In both cases this makes a copy of the value, it doesn't create -any sort of association. For example, - - mpz_t z; - // ... init and calculate z ... - mpz_class x(z); - mpz_class y; - y = mpz_class (z); - - There are no namespace setups in `gmpxx.h', all types and functions -are simply put into the global namespace. This is what `gmp.h' has -done in the past, and continues to do for compatibility. The extras -provided by `gmpxx.h' follow GMP naming conventions and are unlikely to -clash with anything. - - -File: gmp.info, Node: C++ Interface Integers, Next: C++ Interface Rationals, Prev: C++ Interface General, Up: C++ Class Interface - -12.2 C++ Interface Integers -=========================== - - -- Function: void mpz_class::mpz_class (type N) - Construct an `mpz_class'. All the standard C++ types may be used, - except `long long' and `long double', and all the GMP C++ classes - can be used. Any necessary conversion follows the corresponding C - function, for example `double' follows `mpz_set_d' (*note - Assigning Integers::). - - -- Function: void mpz_class::mpz_class (mpz_t Z) - Construct an `mpz_class' from an `mpz_t'. The value in Z is - copied into the new `mpz_class', there won't be any permanent - association between it and Z. - - -- Function: void mpz_class::mpz_class (const char *S) - -- Function: void mpz_class::mpz_class (const char *S, int BASE = 0) - -- Function: void mpz_class::mpz_class (const string& S) - -- Function: void mpz_class::mpz_class (const string& S, int BASE = 0) - Construct an `mpz_class' converted from a string using - `mpz_set_str' (*note Assigning Integers::). - - If the string is not a valid integer, an `std::invalid_argument' - exception is thrown. The same applies to `operator='. - - -- Function: mpz_class operator/ (mpz_class A, mpz_class D) - -- Function: mpz_class operator% (mpz_class A, mpz_class D) - Divisions involving `mpz_class' round towards zero, as per the - `mpz_tdiv_q' and `mpz_tdiv_r' functions (*note Integer Division::). - This is the same as the C99 `/' and `%' operators. - - The `mpz_fdiv...' or `mpz_cdiv...' functions can always be called - directly if desired. For example, - - mpz_class q, a, d; - ... - mpz_fdiv_q (q.get_mpz_t(), a.get_mpz_t(), d.get_mpz_t()); - - -- Function: mpz_class abs (mpz_class OP1) - -- Function: int cmp (mpz_class OP1, type OP2) - -- Function: int cmp (type OP1, mpz_class OP2) - -- Function: bool mpz_class::fits_sint_p (void) - -- Function: bool mpz_class::fits_slong_p (void) - -- Function: bool mpz_class::fits_sshort_p (void) - -- Function: bool mpz_class::fits_uint_p (void) - -- Function: bool mpz_class::fits_ulong_p (void) - -- Function: bool mpz_class::fits_ushort_p (void) - -- Function: double mpz_class::get_d (void) - -- Function: long mpz_class::get_si (void) - -- Function: string mpz_class::get_str (int BASE = 10) - -- Function: unsigned long mpz_class::get_ui (void) - -- Function: int mpz_class::set_str (const char *STR, int BASE) - -- Function: int mpz_class::set_str (const string& STR, int BASE) - -- Function: int sgn (mpz_class OP) - -- Function: mpz_class sqrt (mpz_class OP) - These functions provide a C++ class interface to the corresponding - GMP C routines. - - `cmp' can be used with any of the classes or the standard C++ - types, except `long long' and `long double'. - - - Overloaded operators for combinations of `mpz_class' and `double' -are provided for completeness, but it should be noted that if the given -`double' is not an integer then the way any rounding is done is -currently unspecified. The rounding might take place at the start, in -the middle, or at the end of the operation, and it might change in the -future. - - Conversions between `mpz_class' and `double', however, are defined -to follow the corresponding C functions `mpz_get_d' and `mpz_set_d'. -And comparisons are always made exactly, as per `mpz_cmp_d'. - - -File: gmp.info, Node: C++ Interface Rationals, Next: C++ Interface Floats, Prev: C++ Interface Integers, Up: C++ Class Interface - -12.3 C++ Interface Rationals -============================ - -In all the following constructors, if a fraction is given then it -should be in canonical form, or if not then `mpq_class::canonicalize' -called. - - -- Function: void mpq_class::mpq_class (type OP) - -- Function: void mpq_class::mpq_class (integer NUM, integer DEN) - Construct an `mpq_class'. The initial value can be a single value - of any type, or a pair of integers (`mpz_class' or standard C++ - integer types) representing a fraction, except that `long long' - and `long double' are not supported. For example, - - mpq_class q (99); - mpq_class q (1.75); - mpq_class q (1, 3); - - -- Function: void mpq_class::mpq_class (mpq_t Q) - Construct an `mpq_class' from an `mpq_t'. The value in Q is - copied into the new `mpq_class', there won't be any permanent - association between it and Q. - - -- Function: void mpq_class::mpq_class (const char *S) - -- Function: void mpq_class::mpq_class (const char *S, int BASE = 0) - -- Function: void mpq_class::mpq_class (const string& S) - -- Function: void mpq_class::mpq_class (const string& S, int BASE = 0) - Construct an `mpq_class' converted from a string using - `mpq_set_str' (*note Initializing Rationals::). - - If the string is not a valid rational, an `std::invalid_argument' - exception is thrown. The same applies to `operator='. - - -- Function: void mpq_class::canonicalize () - Put an `mpq_class' into canonical form, as per *Note Rational - Number Functions::. All arithmetic operators require their - operands in canonical form, and will return results in canonical - form. - - -- Function: mpq_class abs (mpq_class OP) - -- Function: int cmp (mpq_class OP1, type OP2) - -- Function: int cmp (type OP1, mpq_class OP2) - -- Function: double mpq_class::get_d (void) - -- Function: string mpq_class::get_str (int BASE = 10) - -- Function: int mpq_class::set_str (const char *STR, int BASE) - -- Function: int mpq_class::set_str (const string& STR, int BASE) - -- Function: int sgn (mpq_class OP) - These functions provide a C++ class interface to the corresponding - GMP C routines. - - `cmp' can be used with any of the classes or the standard C++ - types, except `long long' and `long double'. - - -- Function: mpz_class& mpq_class::get_num () - -- Function: mpz_class& mpq_class::get_den () - Get a reference to an `mpz_class' which is the numerator or - denominator of an `mpq_class'. This can be used both for read and - write access. If the object returned is modified, it modifies the - original `mpq_class'. - - If direct manipulation might produce a non-canonical value, then - `mpq_class::canonicalize' must be called before further operations. - - -- Function: mpz_t mpq_class::get_num_mpz_t () - -- Function: mpz_t mpq_class::get_den_mpz_t () - Get a reference to the underlying `mpz_t' numerator or denominator - of an `mpq_class'. This can be passed to C functions expecting an - `mpz_t'. Any modifications made to the `mpz_t' will modify the - original `mpq_class'. - - If direct manipulation might produce a non-canonical value, then - `mpq_class::canonicalize' must be called before further operations. - - -- Function: istream& operator>> (istream& STREAM, mpq_class& ROP); - Read ROP from STREAM, using its `ios' formatting settings, the - same as `mpq_t operator>>' (*note C++ Formatted Input::). - - If the ROP read might not be in canonical form then - `mpq_class::canonicalize' must be called. - - -File: gmp.info, Node: C++ Interface Floats, Next: C++ Interface Random Numbers, Prev: C++ Interface Rationals, Up: C++ Class Interface - -12.4 C++ Interface Floats -========================= - -When an expression requires the use of temporary intermediate -`mpf_class' values, like `f=g*h+x*y', those temporaries will have the -same precision as the destination `f'. Explicit constructors can be -used if this doesn't suit. - - -- Function: mpf_class::mpf_class (type OP) - -- Function: mpf_class::mpf_class (type OP, unsigned long PREC) - Construct an `mpf_class'. Any standard C++ type can be used, - except `long long' and `long double', and any of the GMP C++ - classes can be used. - - If PREC is given, the initial precision is that value, in bits. If - PREC is not given, then the initial precision is determined by the - type of OP given. An `mpz_class', `mpq_class', or C++ builtin - type will give the default `mpf' precision (*note Initializing - Floats::). An `mpf_class' or expression will give the precision - of that value. The precision of a binary expression is the higher - of the two operands. - - mpf_class f(1.5); // default precision - mpf_class f(1.5, 500); // 500 bits (at least) - mpf_class f(x); // precision of x - mpf_class f(abs(x)); // precision of x - mpf_class f(-g, 1000); // 1000 bits (at least) - mpf_class f(x+y); // greater of precisions of x and y - - -- Function: void mpf_class::mpf_class (const char *S) - -- Function: void mpf_class::mpf_class (const char *S, unsigned long - PREC, int BASE = 0) - -- Function: void mpf_class::mpf_class (const string& S) - -- Function: void mpf_class::mpf_class (const string& S, unsigned long - PREC, int BASE = 0) - Construct an `mpf_class' converted from a string using - `mpf_set_str' (*note Assigning Floats::). If PREC is given, the - initial precision is that value, in bits. If not, the default - `mpf' precision (*note Initializing Floats::) is used. - - If the string is not a valid float, an `std::invalid_argument' - exception is thrown. The same applies to `operator='. - - -- Function: mpf_class& mpf_class::operator= (type OP) - Convert and store the given OP value to an `mpf_class' object. The - same types are accepted as for the constructors above. - - Note that `operator=' only stores a new value, it doesn't copy or - change the precision of the destination, instead the value is - truncated if necessary. This is the same as `mpf_set' etc. Note - in particular this means for `mpf_class' a copy constructor is not - the same as a default constructor plus assignment. - - mpf_class x (y); // x created with precision of y - - mpf_class x; // x created with default precision - x = y; // value truncated to that precision - - Applications using templated code may need to be careful about the - assumptions the code makes in this area, when working with - `mpf_class' values of various different or non-default precisions. - For instance implementations of the standard `complex' template - have been seen in both styles above, though of course `complex' is - normally only actually specified for use with the builtin float - types. - - -- Function: mpf_class abs (mpf_class OP) - -- Function: mpf_class ceil (mpf_class OP) - -- Function: int cmp (mpf_class OP1, type OP2) - -- Function: int cmp (type OP1, mpf_class OP2) - -- Function: bool mpf_class::fits_sint_p (void) - -- Function: bool mpf_class::fits_slong_p (void) - -- Function: bool mpf_class::fits_sshort_p (void) - -- Function: bool mpf_class::fits_uint_p (void) - -- Function: bool mpf_class::fits_ulong_p (void) - -- Function: bool mpf_class::fits_ushort_p (void) - -- Function: mpf_class floor (mpf_class OP) - -- Function: mpf_class hypot (mpf_class OP1, mpf_class OP2) - -- Function: double mpf_class::get_d (void) - -- Function: long mpf_class::get_si (void) - -- Function: string mpf_class::get_str (mp_exp_t& EXP, int BASE = 10, - size_t DIGITS = 0) - -- Function: unsigned long mpf_class::get_ui (void) - -- Function: int mpf_class::set_str (const char *STR, int BASE) - -- Function: int mpf_class::set_str (const string& STR, int BASE) - -- Function: int sgn (mpf_class OP) - -- Function: mpf_class sqrt (mpf_class OP) - -- Function: mpf_class trunc (mpf_class OP) - These functions provide a C++ class interface to the corresponding - GMP C routines. - - `cmp' can be used with any of the classes or the standard C++ - types, except `long long' and `long double'. - - The accuracy provided by `hypot' is not currently guaranteed. - - -- Function: mp_bitcnt_t mpf_class::get_prec () - -- Function: void mpf_class::set_prec (mp_bitcnt_t PREC) - -- Function: void mpf_class::set_prec_raw (mp_bitcnt_t PREC) - Get or set the current precision of an `mpf_class'. - - The restrictions described for `mpf_set_prec_raw' (*note - Initializing Floats::) apply to `mpf_class::set_prec_raw'. Note - in particular that the `mpf_class' must be restored to it's - allocated precision before being destroyed. This must be done by - application code, there's no automatic mechanism for it. - - -File: gmp.info, Node: C++ Interface Random Numbers, Next: C++ Interface Limitations, Prev: C++ Interface Floats, Up: C++ Class Interface - -12.5 C++ Interface Random Numbers -================================= - - -- Class: gmp_randclass - The C++ class interface to the GMP random number functions uses - `gmp_randclass' to hold an algorithm selection and current state, - as per `gmp_randstate_t'. - - -- Function: gmp_randclass::gmp_randclass (void (*RANDINIT) - (gmp_randstate_t, ...), ...) - Construct a `gmp_randclass', using a call to the given RANDINIT - function (*note Random State Initialization::). The arguments - expected are the same as RANDINIT, but with `mpz_class' instead of - `mpz_t'. For example, - - gmp_randclass r1 (gmp_randinit_default); - gmp_randclass r2 (gmp_randinit_lc_2exp_size, 32); - gmp_randclass r3 (gmp_randinit_lc_2exp, a, c, m2exp); - gmp_randclass r4 (gmp_randinit_mt); - - `gmp_randinit_lc_2exp_size' will fail if the size requested is too - big, an `std::length_error' exception is thrown in that case. - - -- Function: gmp_randclass::gmp_randclass (gmp_randalg_t ALG, ...) - Construct a `gmp_randclass' using the same parameters as - `gmp_randinit' (*note Random State Initialization::). This - function is obsolete and the above RANDINIT style should be - preferred. - - -- Function: void gmp_randclass::seed (unsigned long int S) - -- Function: void gmp_randclass::seed (mpz_class S) - Seed a random number generator. See *note Random Number - Functions::, for how to choose a good seed. - - -- Function: mpz_class gmp_randclass::get_z_bits (unsigned long BITS) - -- Function: mpz_class gmp_randclass::get_z_bits (mpz_class BITS) - Generate a random integer with a specified number of bits. - - -- Function: mpz_class gmp_randclass::get_z_range (mpz_class N) - Generate a random integer in the range 0 to N-1 inclusive. - - -- Function: mpf_class gmp_randclass::get_f () - -- Function: mpf_class gmp_randclass::get_f (unsigned long PREC) - Generate a random float F in the range 0 <= F < 1. F will be to - PREC bits precision, or if PREC is not given then to the precision - of the destination. For example, - - gmp_randclass r; - ... - mpf_class f (0, 512); // 512 bits precision - f = r.get_f(); // random number, 512 bits - - -File: gmp.info, Node: C++ Interface Limitations, Prev: C++ Interface Random Numbers, Up: C++ Class Interface - -12.6 C++ Interface Limitations -============================== - -`mpq_class' and Templated Reading - A generic piece of template code probably won't know that - `mpq_class' requires a `canonicalize' call if inputs read with - `operator>>' might be non-canonical. This can lead to incorrect - results. - - `operator>>' behaves as it does for reasons of efficiency. A - canonicalize can be quite time consuming on large operands, and is - best avoided if it's not necessary. - - But this potential difficulty reduces the usefulness of - `mpq_class'. Perhaps a mechanism to tell `operator>>' what to do - will be adopted in the future, maybe a preprocessor define, a - global flag, or an `ios' flag pressed into service. Or maybe, at - the risk of inconsistency, the `mpq_class' `operator>>' could - canonicalize and leave `mpq_t' `operator>>' not doing so, for use - on those occasions when that's acceptable. Send feedback or - alternate ideas to . - -Subclassing - Subclassing the GMP C++ classes works, but is not currently - recommended. - - Expressions involving subclasses resolve correctly (or seem to), - but in normal C++ fashion the subclass doesn't inherit - constructors and assignments. There's many of those in the GMP - classes, and a good way to reestablish them in a subclass is not - yet provided. - -Templated Expressions - A subtle difficulty exists when using expressions together with - application-defined template functions. Consider the following, - with `T' intended to be some numeric type, - - template - T fun (const T &, const T &); - - When used with, say, plain `mpz_class' variables, it works fine: - `T' is resolved as `mpz_class'. - - mpz_class f(1), g(2); - fun (f, g); // Good - - But when one of the arguments is an expression, it doesn't work. - - mpz_class f(1), g(2), h(3); - fun (f, g+h); // Bad - - This is because `g+h' ends up being a certain expression template - type internal to `gmpxx.h', which the C++ template resolution - rules are unable to automatically convert to `mpz_class'. The - workaround is simply to add an explicit cast. - - mpz_class f(1), g(2), h(3); - fun (f, mpz_class(g+h)); // Good - - Similarly, within `fun' it may be necessary to cast an expression - to type `T' when calling a templated `fun2'. - - template - void fun (T f, T g) - { - fun2 (f, f+g); // Bad - } - - template - void fun (T f, T g) - { - fun2 (f, T(f+g)); // Good - } - - -File: gmp.info, Node: BSD Compatible Functions, Next: Custom Allocation, Prev: C++ Class Interface, Up: Top - -13 Berkeley MP Compatible Functions -*********************************** - -These functions are intended to be fully compatible with the Berkeley MP -library which is available on many BSD derived U*ix systems. The -`--enable-mpbsd' option must be used when building GNU MP to make these -available (*note Installing GMP::). - - The original Berkeley MP library has a usage restriction: you cannot -use the same variable as both source and destination in a single -function call. The compatible functions in GNU MP do not share this -restriction--inputs and outputs may overlap. - - It is not recommended that new programs are written using these -functions. Apart from the incomplete set of functions, the interface -for initializing `MINT' objects is more error prone, and the `pow' -function collides with `pow' in `libm.a'. - - Include the header `mp.h' to get the definition of the necessary -types and functions. If you are on a BSD derived system, make sure to -include GNU `mp.h' if you are going to link the GNU `libmp.a' to your -program. This means that you probably need to give the `-I' -option to the compiler, where `' is the directory where you have -GNU `mp.h'. - - -- Function: MINT * itom (signed short int INITIAL_VALUE) - Allocate an integer consisting of a `MINT' object and dynamic limb - space. Initialize the integer to INITIAL_VALUE. Return a pointer - to the `MINT' object. - - -- Function: MINT * xtom (char *INITIAL_VALUE) - Allocate an integer consisting of a `MINT' object and dynamic limb - space. Initialize the integer from INITIAL_VALUE, a hexadecimal, - null-terminated C string. Return a pointer to the `MINT' object. - - -- Function: void move (MINT *SRC, MINT *DEST) - Set DEST to SRC by copying. Both variables must be previously - initialized. - - -- Function: void madd (MINT *SRC_1, MINT *SRC_2, MINT *DESTINATION) - Add SRC_1 and SRC_2 and put the sum in DESTINATION. - - -- Function: void msub (MINT *SRC_1, MINT *SRC_2, MINT *DESTINATION) - Subtract SRC_2 from SRC_1 and put the difference in DESTINATION. - - -- Function: void mult (MINT *SRC_1, MINT *SRC_2, MINT *DESTINATION) - Multiply SRC_1 and SRC_2 and put the product in DESTINATION. - - -- Function: void mdiv (MINT *DIVIDEND, MINT *DIVISOR, MINT *QUOTIENT, - MINT *REMAINDER) - -- Function: void sdiv (MINT *DIVIDEND, signed short int DIVISOR, MINT - *QUOTIENT, signed short int *REMAINDER) - Set QUOTIENT to DIVIDEND/DIVISOR, and REMAINDER to DIVIDEND mod - DIVISOR. The quotient is rounded towards zero; the remainder has - the same sign as the dividend unless it is zero. - - Some implementations of these functions work differently--or not - at all--for negative arguments. - - -- Function: void msqrt (MINT *OP, MINT *ROOT, MINT *REMAINDER) - Set ROOT to the truncated integer part of the square root of OP, - like `mpz_sqrt'. Set REMAINDER to OP-ROOT*ROOT, i.e. zero if OP - is a perfect square. - - If ROOT and REMAINDER are the same variable, the results are - undefined. - - -- Function: void pow (MINT *BASE, MINT *EXP, MINT *MOD, MINT *DEST) - Set DEST to (BASE raised to EXP) modulo MOD. - - Note that the name `pow' clashes with `pow' from the standard C - math library (*note Exponentiation and Logarithms: (libc)Exponents - and Logarithms.). An application will only be able to use one or - the other. - - -- Function: void rpow (MINT *BASE, signed short int EXP, MINT *DEST) - Set DEST to BASE raised to EXP. - - -- Function: void gcd (MINT *OP1, MINT *OP2, MINT *RES) - Set RES to the greatest common divisor of OP1 and OP2. - - -- Function: int mcmp (MINT *OP1, MINT *OP2) - Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero - if OP1 = OP2, and a negative value if OP1 < OP2. - - -- Function: void min (MINT *DEST) - Input a decimal string from `stdin', and put the read integer in - DEST. SPC and TAB are allowed in the number string, and are - ignored. - - -- Function: void mout (MINT *SRC) - Output SRC to `stdout', as a decimal string. Also output a - newline. - - -- Function: char * mtox (MINT *OP) - Convert OP to a hexadecimal string, and return a pointer to the - string. The returned string is allocated using the default memory - allocation function, `malloc' by default. It will be - `strlen(str)+1' bytes, that being exactly enough for the string - and null-terminator. - - -- Function: void mfree (MINT *OP) - De-allocate, the space used by OP. *This function should only be - passed a value returned by `itom' or `xtom'.* - - -File: gmp.info, Node: Custom Allocation, Next: Language Bindings, Prev: BSD Compatible Functions, Up: Top - -14 Custom Allocation -******************** - -By default GMP uses `malloc', `realloc' and `free' for memory -allocation, and if they fail GMP prints a message to the standard error -output and terminates the program. - - Alternate functions can be specified, to allocate memory in a -different way or to have a different error action on running out of -memory. - - This feature is available in the Berkeley compatibility library -(*note BSD Compatible Functions::) as well as the main GMP library. - - -- Function: void mp_set_memory_functions ( - void *(*ALLOC_FUNC_PTR) (size_t), - void *(*REALLOC_FUNC_PTR) (void *, size_t, size_t), - void (*FREE_FUNC_PTR) (void *, size_t)) - Replace the current allocation functions from the arguments. If - an argument is `NULL', the corresponding default function is used. - - These functions will be used for all memory allocation done by - GMP, apart from temporary space from `alloca' if that function is - available and GMP is configured to use it (*note Build Options::). - - *Be sure to call `mp_set_memory_functions' only when there are no - active GMP objects allocated using the previous memory functions! - Usually that means calling it before any other GMP function.* - - The functions supplied should fit the following declarations: - - -- Function: void * allocate_function (size_t ALLOC_SIZE) - Return a pointer to newly allocated space with at least ALLOC_SIZE - bytes. - - -- Function: void * reallocate_function (void *PTR, size_t OLD_SIZE, - size_t NEW_SIZE) - Resize a previously allocated block PTR of OLD_SIZE bytes to be - NEW_SIZE bytes. - - The block may be moved if necessary or if desired, and in that - case the smaller of OLD_SIZE and NEW_SIZE bytes must be copied to - the new location. The return value is a pointer to the resized - block, that being the new location if moved or just PTR if not. - - PTR is never `NULL', it's always a previously allocated block. - NEW_SIZE may be bigger or smaller than OLD_SIZE. - - -- Function: void free_function (void *PTR, size_t SIZE) - De-allocate the space pointed to by PTR. - - PTR is never `NULL', it's always a previously allocated block of - SIZE bytes. - - A "byte" here means the unit used by the `sizeof' operator. - - The OLD_SIZE parameters to REALLOCATE_FUNCTION and FREE_FUNCTION are -passed for convenience, but of course can be ignored if not needed. -The default functions using `malloc' and friends for instance don't use -them. - - No error return is allowed from any of these functions, if they -return then they must have performed the specified operation. In -particular note that ALLOCATE_FUNCTION or REALLOCATE_FUNCTION mustn't -return `NULL'. - - Getting a different fatal error action is a good use for custom -allocation functions, for example giving a graphical dialog rather than -the default print to `stderr'. How much is possible when genuinely out -of memory is another question though. - - There's currently no defined way for the allocation functions to -recover from an error such as out of memory, they must terminate -program execution. A `longjmp' or throwing a C++ exception will have -undefined results. This may change in the future. - - GMP may use allocated blocks to hold pointers to other allocated -blocks. This will limit the assumptions a conservative garbage -collection scheme can make. - - Since the default GMP allocation uses `malloc' and friends, those -functions will be linked in even if the first thing a program does is an -`mp_set_memory_functions'. It's necessary to change the GMP sources if -this is a problem. - - - -- Function: void mp_get_memory_functions ( - void *(**ALLOC_FUNC_PTR) (size_t), - void *(**REALLOC_FUNC_PTR) (void *, size_t, size_t), - void (**FREE_FUNC_PTR) (void *, size_t)) - Get the current allocation functions, storing function pointers to - the locations given by the arguments. If an argument is `NULL', - that function pointer is not stored. - - For example, to get just the current free function, - - void (*freefunc) (void *, size_t); - - mp_get_memory_functions (NULL, NULL, &freefunc); - - -File: gmp.info, Node: Language Bindings, Next: Algorithms, Prev: Custom Allocation, Up: Top - -15 Language Bindings -******************** - -The following packages and projects offer access to GMP from languages -other than C, though perhaps with varying levels of functionality and -efficiency. - - -C++ - * GMP C++ class interface, *note C++ Class Interface:: - Straightforward interface, expression templates to eliminate - temporaries. - - * ALP `http://www-sop.inria.fr/saga/logiciels/ALP/' - Linear algebra and polynomials using templates. - - * Arithmos `http://www.win.ua.ac.be/~cant/arithmos/' - Rationals with infinities and square roots. - - * CLN `http://www.ginac.de/CLN/' - High level classes for arithmetic. - - * LiDIA `http://www.cdc.informatik.tu-darmstadt.de/TI/LiDIA/' - A C++ library for computational number theory. - - * Linbox `http://www.linalg.org/' - Sparse vectors and matrices. - - * NTL `http://www.shoup.net/ntl/' - A C++ number theory library. - -Fortran - * Omni F77 `http://phase.hpcc.jp/Omni/home.html' - Arbitrary precision floats. - -Haskell - * Glasgow Haskell Compiler `http://www.haskell.org/ghc/' - -Java - * Kaffe `http://www.kaffe.org/' - - * Kissme `http://kissme.sourceforge.net/' - -Lisp - * GNU Common Lisp `http://www.gnu.org/software/gcl/gcl.html' - - * Librep `http://librep.sourceforge.net/' - - * XEmacs (21.5.18 beta and up) `http://www.xemacs.org' - Optional big integers, rationals and floats using GMP. - -M4 - * GNU m4 betas `http://www.seindal.dk/rene/gnu/' - Optionally provides an arbitrary precision `mpeval'. - -ML - * MLton compiler `http://mlton.org/' - -Objective Caml - * MLGMP `http://www.di.ens.fr/~monniaux/programmes.html.en' - - * Numerix `http://pauillac.inria.fr/~quercia/' - Optionally using GMP. - -Oz - * Mozart `http://www.mozart-oz.org/' - -Pascal - * GNU Pascal Compiler `http://www.gnu-pascal.de/' - GMP unit. - - * Numerix `http://pauillac.inria.fr/~quercia/' - For Free Pascal, optionally using GMP. - -Perl - * GMP module, see `demos/perl' in the GMP sources (*note - Demonstration Programs::). - - * Math::GMP `http://www.cpan.org/' - Compatible with Math::BigInt, but not as many functions as - the GMP module above. - - * Math::BigInt::GMP `http://www.cpan.org/' - Plug Math::GMP into normal Math::BigInt operations. - -Pike - * mpz module in the standard distribution, - `http://pike.ida.liu.se/' - -Prolog - * SWI Prolog `http://www.swi-prolog.org/' - Arbitrary precision floats. - -Python - * mpz module in the standard distribution, - `http://www.python.org/' - - * GMPY `http://gmpy.sourceforge.net/' - -Scheme - * GNU Guile (upcoming 1.8) - `http://www.gnu.org/software/guile/guile.html' - - * RScheme `http://www.rscheme.org/' - - * STklos `http://www.stklos.org/' - -Smalltalk - * GNU Smalltalk - `http://www.smalltalk.org/versions/GNUSmalltalk.html' - -Other - * Axiom `http://savannah.nongnu.org/projects/axiom' - Computer algebra using GCL. - - * DrGenius `http://drgenius.seul.org/' - Geometry system and mathematical programming language. - - * GiNaC `http://www.ginac.de/' - C++ computer algebra using CLN. - - * GOO `http://www.googoogaga.org/' - Dynamic object oriented language. - - * Maxima `http://www.ma.utexas.edu/users/wfs/maxima.html' - Macsyma computer algebra using GCL. - - * Q `http://q-lang.sourceforge.net/' - Equational programming system. - - * Regina `http://regina.sourceforge.net/' - Topological calculator. - - * Yacas `http://www.xs4all.nl/~apinkus/yacas.html' - Yet another computer algebra system. - - - -File: gmp.info, Node: Algorithms, Next: Internals, Prev: Language Bindings, Up: Top - -16 Algorithms -************* - -This chapter is an introduction to some of the algorithms used for -various GMP operations. The code is likely to be hard to understand -without knowing something about the algorithms. - - Some GMP internals are mentioned, but applications that expect to be -compatible with future GMP releases should take care to use only the -documented functions. - -* Menu: - -* Multiplication Algorithms:: -* Division Algorithms:: -* Greatest Common Divisor Algorithms:: -* Powering Algorithms:: -* Root Extraction Algorithms:: -* Radix Conversion Algorithms:: -* Other Algorithms:: -* Assembly Coding:: - - -File: gmp.info, Node: Multiplication Algorithms, Next: Division Algorithms, Prev: Algorithms, Up: Algorithms - -16.1 Multiplication -=================== - -NxN limb multiplications and squares are done using one of five -algorithms, as the size N increases. - - Algorithm Threshold - Basecase (none) - Karatsuba `MUL_TOOM22_THRESHOLD' - Toom-3 `MUL_TOOM33_THRESHOLD' - Toom-4 `MUL_TOOM44_THRESHOLD' - FFT `MUL_FFT_THRESHOLD' - - Similarly for squaring, with the `SQR' thresholds. - - NxM multiplications of operands with different sizes above -`MUL_TOOM22_THRESHOLD' are currently done by special Toom-inspired -algorithms or directly with FFT, depending on operand size (*note -Unbalanced Multiplication::). - -* Menu: - -* Basecase Multiplication:: -* Karatsuba Multiplication:: -* Toom 3-Way Multiplication:: -* Toom 4-Way Multiplication:: -* FFT Multiplication:: -* Other Multiplication:: -* Unbalanced Multiplication:: - - -File: gmp.info, Node: Basecase Multiplication, Next: Karatsuba Multiplication, Prev: Multiplication Algorithms, Up: Multiplication Algorithms - -16.1.1 Basecase Multiplication ------------------------------- - -Basecase NxM multiplication is a straightforward rectangular set of -cross-products, the same as long multiplication done by hand and for -that reason sometimes known as the schoolbook or grammar school method. -This is an O(N*M) algorithm. See Knuth section 4.3.1 algorithm M -(*note References::), and the `mpn/generic/mul_basecase.c' code. - - Assembly implementations of `mpn_mul_basecase' are essentially the -same as the generic C code, but have all the usual assembly tricks and -obscurities introduced for speed. - - A square can be done in roughly half the time of a multiply, by -using the fact that the cross products above and below the diagonal are -the same. A triangle of products below the diagonal is formed, doubled -(left shift by one bit), and then the products on the diagonal added. -This can be seen in `mpn/generic/sqr_basecase.c'. Again the assembly -implementations take essentially the same approach. - - u0 u1 u2 u3 u4 - +---+---+---+---+---+ - u0 | d | | | | | - +---+---+---+---+---+ - u1 | | d | | | | - +---+---+---+---+---+ - u2 | | | d | | | - +---+---+---+---+---+ - u3 | | | | d | | - +---+---+---+---+---+ - u4 | | | | | d | - +---+---+---+---+---+ - - In practice squaring isn't a full 2x faster than multiplying, it's -usually around 1.5x. Less than 1.5x probably indicates -`mpn_sqr_basecase' wants improving on that CPU. - - On some CPUs `mpn_mul_basecase' can be faster than the generic C -`mpn_sqr_basecase' on some small sizes. `SQR_BASECASE_THRESHOLD' is -the size at which to use `mpn_sqr_basecase', this will be zero if that -routine should be used always. - - -File: gmp.info, Node: Karatsuba Multiplication, Next: Toom 3-Way Multiplication, Prev: Basecase Multiplication, Up: Multiplication Algorithms - -16.1.2 Karatsuba Multiplication -------------------------------- - -The Karatsuba multiplication algorithm is described in Knuth section -4.3.3 part A, and various other textbooks. A brief description is -given here. - - The inputs x and y are treated as each split into two parts of equal -length (or the most significant part one limb shorter if N is odd). - - high low - +----------+----------+ - | x1 | x0 | - +----------+----------+ - - +----------+----------+ - | y1 | y0 | - +----------+----------+ - - Let b be the power of 2 where the split occurs, ie. if x0 is k limbs -(y0 the same) then b=2^(k*mp_bits_per_limb). With that x=x1*b+x0 and -y=y1*b+y0, and the following holds, - - x*y = (b^2+b)*x1*y1 - b*(x1-x0)*(y1-y0) + (b+1)*x0*y0 - - This formula means doing only three multiplies of (N/2)x(N/2) limbs, -whereas a basecase multiply of NxN limbs is equivalent to four -multiplies of (N/2)x(N/2). The factors (b^2+b) etc represent the -positions where the three products must be added. - - high low - +--------+--------+ +--------+--------+ - | x1*y1 | | x0*y0 | - +--------+--------+ +--------+--------+ - +--------+--------+ - add | x1*y1 | - +--------+--------+ - +--------+--------+ - add | x0*y0 | - +--------+--------+ - +--------+--------+ - sub | (x1-x0)*(y1-y0) | - +--------+--------+ - - The term (x1-x0)*(y1-y0) is best calculated as an absolute value, -and the sign used to choose to add or subtract. Notice the sum -high(x0*y0)+low(x1*y1) occurs twice, so it's possible to do 5*k limb -additions, rather than 6*k, but in GMP extra function call overheads -outweigh the saving. - - Squaring is similar to multiplying, but with x=y the formula reduces -to an equivalent with three squares, - - x^2 = (b^2+b)*x1^2 - b*(x1-x0)^2 + (b+1)*x0^2 - - The final result is accumulated from those three squares the same -way as for the three multiplies above. The middle term (x1-x0)^2 is now -always positive. - - A similar formula for both multiplying and squaring can be -constructed with a middle term (x1+x0)*(y1+y0). But those sums can -exceed k limbs, leading to more carry handling and additions than the -form above. - - Karatsuba multiplication is asymptotically an O(N^1.585) algorithm, -the exponent being log(3)/log(2), representing 3 multiplies each 1/2 -the size of the inputs. This is a big improvement over the basecase -multiply at O(N^2) and the advantage soon overcomes the extra additions -Karatsuba performs. `MUL_TOOM22_THRESHOLD' can be as little as 10 -limbs. The `SQR' threshold is usually about twice the `MUL'. - - The basecase algorithm will take a time of the form M(N) = a*N^2 + -b*N + c and the Karatsuba algorithm K(N) = 3*M(N/2) + d*N + e, which -expands to K(N) = 3/4*a*N^2 + 3/2*b*N + 3*c + d*N + e. The factor 3/4 -for a means per-crossproduct speedups in the basecase code will -increase the threshold since they benefit M(N) more than K(N). And -conversely the 3/2 for b means linear style speedups of b will increase -the threshold since they benefit K(N) more than M(N). The latter can -be seen for instance when adding an optimized `mpn_sqr_diagonal' to -`mpn_sqr_basecase'. Of course all speedups reduce total time, and in -that sense the algorithm thresholds are merely of academic interest. - - -File: gmp.info, Node: Toom 3-Way Multiplication, Next: Toom 4-Way Multiplication, Prev: Karatsuba Multiplication, Up: Multiplication Algorithms - -16.1.3 Toom 3-Way Multiplication --------------------------------- - -The Karatsuba formula is the simplest case of a general approach to -splitting inputs that leads to both Toom and FFT algorithms. A -description of Toom can be found in Knuth section 4.3.3, with an -example 3-way calculation after Theorem A. The 3-way form used in GMP -is described here. - - The operands are each considered split into 3 pieces of equal length -(or the most significant part 1 or 2 limbs shorter than the other two). - - high low - +----------+----------+----------+ - | x2 | x1 | x0 | - +----------+----------+----------+ - - +----------+----------+----------+ - | y2 | y1 | y0 | - +----------+----------+----------+ - -These parts are treated as the coefficients of two polynomials - - X(t) = x2*t^2 + x1*t + x0 - Y(t) = y2*t^2 + y1*t + y0 - - Let b equal the power of 2 which is the size of the x0, x1, y0 and -y1 pieces, ie. if they're k limbs each then b=2^(k*mp_bits_per_limb). -With this x=X(b) and y=Y(b). - - Let a polynomial W(t)=X(t)*Y(t) and suppose its coefficients are - - W(t) = w4*t^4 + w3*t^3 + w2*t^2 + w1*t + w0 - - The w[i] are going to be determined, and when they are they'll give -the final result using w=W(b), since x*y=X(b)*Y(b)=W(b). The -coefficients will be roughly b^2 each, and the final W(b) will be an -addition like, - - high low - +-------+-------+ - | w4 | - +-------+-------+ - +--------+-------+ - | w3 | - +--------+-------+ - +--------+-------+ - | w2 | - +--------+-------+ - +--------+-------+ - | w1 | - +--------+-------+ - +-------+-------+ - | w0 | - +-------+-------+ - - The w[i] coefficients could be formed by a simple set of cross -products, like w4=x2*y2, w3=x2*y1+x1*y2, w2=x2*y0+x1*y1+x0*y2 etc, but -this would need all nine x[i]*y[j] for i,j=0,1,2, and would be -equivalent merely to a basecase multiply. Instead the following -approach is used. - - X(t) and Y(t) are evaluated and multiplied at 5 points, giving -values of W(t) at those points. In GMP the following points are used, - - Point Value - t=0 x0 * y0, which gives w0 immediately - t=1 (x2+x1+x0) * (y2+y1+y0) - t=-1 (x2-x1+x0) * (y2-y1+y0) - t=2 (4*x2+2*x1+x0) * (4*y2+2*y1+y0) - t=inf x2 * y2, which gives w4 immediately - - At t=-1 the values can be negative and that's handled using the -absolute values and tracking the sign separately. At t=inf the value -is actually X(t)*Y(t)/t^4 in the limit as t approaches infinity, but -it's much easier to think of as simply x2*y2 giving w4 immediately -(much like x0*y0 at t=0 gives w0 immediately). - - Each of the points substituted into W(t)=w4*t^4+...+w0 gives a -linear combination of the w[i] coefficients, and the value of those -combinations has just been calculated. - - W(0) = w0 - W(1) = w4 + w3 + w2 + w1 + w0 - W(-1) = w4 - w3 + w2 - w1 + w0 - W(2) = 16*w4 + 8*w3 + 4*w2 + 2*w1 + w0 - W(inf) = w4 - - This is a set of five equations in five unknowns, and some -elementary linear algebra quickly isolates each w[i]. This involves -adding or subtracting one W(t) value from another, and a couple of -divisions by powers of 2 and one division by 3, the latter using the -special `mpn_divexact_by3' (*note Exact Division::). - - The conversion of W(t) values to the coefficients is interpolation. -A polynomial of degree 4 like W(t) is uniquely determined by values -known at 5 different points. The points are arbitrary and can be -chosen to make the linear equations come out with a convenient set of -steps for quickly isolating the w[i]. - - Squaring follows the same procedure as multiplication, but there's -only one X(t) and it's evaluated at the 5 points, and those values -squared to give values of W(t). The interpolation is then identical, -and in fact the same `toom3_interpolate' subroutine is used for both -squaring and multiplying. - - Toom-3 is asymptotically O(N^1.465), the exponent being -log(5)/log(3), representing 5 recursive multiplies of 1/3 the original -size each. This is an improvement over Karatsuba at O(N^1.585), though -Toom does more work in the evaluation and interpolation and so it only -realizes its advantage above a certain size. - - Near the crossover between Toom-3 and Karatsuba there's generally a -range of sizes where the difference between the two is small. -`MUL_TOOM33_THRESHOLD' is a somewhat arbitrary point in that range and -successive runs of the tune program can give different values due to -small variations in measuring. A graph of time versus size for the two -shows the effect, see `tune/README'. - - At the fairly small sizes where the Toom-3 thresholds occur it's -worth remembering that the asymptotic behaviour for Karatsuba and -Toom-3 can't be expected to make accurate predictions, due of course to -the big influence of all sorts of overheads, and the fact that only a -few recursions of each are being performed. Even at large sizes -there's a good chance machine dependent effects like cache architecture -will mean actual performance deviates from what might be predicted. - - The formula given for the Karatsuba algorithm (*note Karatsuba -Multiplication::) has an equivalent for Toom-3 involving only five -multiplies, but this would be complicated and unenlightening. - - An alternate view of Toom-3 can be found in Zuras (*note -References::), using a vector to represent the x and y splits and a -matrix multiplication for the evaluation and interpolation stages. The -matrix inverses are not meant to be actually used, and they have -elements with values much greater than in fact arise in the -interpolation steps. The diagram shown for the 3-way is attractive, -but again doesn't have to be implemented that way and for example with -a bit of rearrangement just one division by 6 can be done. - - -File: gmp.info, Node: Toom 4-Way Multiplication, Next: FFT Multiplication, Prev: Toom 3-Way Multiplication, Up: Multiplication Algorithms - -16.1.4 Toom 4-Way Multiplication --------------------------------- - -Karatsuba and Toom-3 split the operands into 2 and 3 coefficients, -respectively. Toom-4 analogously splits the operands into 4 -coefficients. Using the notation from the section on Toom-3 -multiplication, we form two polynomials: - - X(t) = x3*t^3 + x2*t^2 + x1*t + x0 - Y(t) = y3*t^3 + y2*t^2 + y1*t + y0 - - X(t) and Y(t) are evaluated and multiplied at 7 points, giving -values of W(t) at those points. In GMP the following points are used, - - Point Value - t=0 x0 * y0, which gives w0 immediately - t=1/2 (x3+2*x2+4*x1+8*x0) * (y3+2*y2+4*y1+8*y0) - t=-1/2 (-x3+2*x2-4*x1+8*x0) * (-y3+2*y2-4*y1+8*y0) - t=1 (x3+x2+x1+x0) * (y3+y2+y1+y0) - t=-1 (-x3+x2-x1+x0) * (-y3+y2-y1+y0) - t=2 (8*x3+4*x2+2*x1+x0) * (8*y3+4*y2+2*y1+y0) - t=inf x3 * y3, which gives w6 immediately - - The number of additions and subtractions for Toom-4 is much larger -than for Toom-3. But several subexpressions occur multiple times, for -example x2+x0, occurs for both t=1 and t=-1. - - Toom-4 is asymptotically O(N^1.404), the exponent being -log(7)/log(4), representing 7 recursive multiplies of 1/4 the original -size each. - - -File: gmp.info, Node: FFT Multiplication, Next: Other Multiplication, Prev: Toom 4-Way Multiplication, Up: Multiplication Algorithms - -16.1.5 FFT Multiplication -------------------------- - -At large to very large sizes a Fermat style FFT multiplication is used, -following Scho"nhage and Strassen (*note References::). Descriptions -of FFTs in various forms can be found in many textbooks, for instance -Knuth section 4.3.3 part C or Lipson chapter IX. A brief description -of the form used in GMP is given here. - - The multiplication done is x*y mod 2^N+1, for a given N. A full -product x*y is obtained by choosing N>=bits(x)+bits(y) and padding x -and y with high zero limbs. The modular product is the native form for -the algorithm, so padding to get a full product is unavoidable. - - The algorithm follows a split, evaluate, pointwise multiply, -interpolate and combine similar to that described above for Karatsuba -and Toom-3. A k parameter controls the split, with an FFT-k splitting -into 2^k pieces of M=N/2^k bits each. N must be a multiple of -(2^k)*mp_bits_per_limb so the split falls on limb boundaries, avoiding -bit shifts in the split and combine stages. - - The evaluations, pointwise multiplications, and interpolation, are -all done modulo 2^N'+1 where N' is 2M+k+3 rounded up to a multiple of -2^k and of `mp_bits_per_limb'. The results of interpolation will be -the following negacyclic convolution of the input pieces, and the -choice of N' ensures these sums aren't truncated. - - --- - \ b - w[n] = / (-1) * x[i] * y[j] - --- - i+j==b*2^k+n - b=0,1 - - The points used for the evaluation are g^i for i=0 to 2^k-1 where -g=2^(2N'/2^k). g is a 2^k'th root of unity mod 2^N'+1, which produces -necessary cancellations at the interpolation stage, and it's also a -power of 2 so the fast Fourier transforms used for the evaluation and -interpolation do only shifts, adds and negations. - - The pointwise multiplications are done modulo 2^N'+1 and either -recurse into a further FFT or use a plain multiplication (Toom-3, -Karatsuba or basecase), whichever is optimal at the size N'. The -interpolation is an inverse fast Fourier transform. The resulting set -of sums of x[i]*y[j] are added at appropriate offsets to give the final -result. - - Squaring is the same, but x is the only input so it's one transform -at the evaluate stage and the pointwise multiplies are squares. The -interpolation is the same. - - For a mod 2^N+1 product, an FFT-k is an O(N^(k/(k-1))) algorithm, -the exponent representing 2^k recursed modular multiplies each -1/2^(k-1) the size of the original. Each successive k is an asymptotic -improvement, but overheads mean each is only faster at bigger and -bigger sizes. In the code, `MUL_FFT_TABLE' and `SQR_FFT_TABLE' are the -thresholds where each k is used. Each new k effectively swaps some -multiplying for some shifts, adds and overheads. - - A mod 2^N+1 product can be formed with a normal NxN->2N bit multiply -plus a subtraction, so an FFT and Toom-3 etc can be compared directly. -A k=4 FFT at O(N^1.333) can be expected to be the first faster than -Toom-3 at O(N^1.465). In practice this is what's found, with -`MUL_FFT_MODF_THRESHOLD' and `SQR_FFT_MODF_THRESHOLD' being between 300 -and 1000 limbs, depending on the CPU. So far it's been found that only -very large FFTs recurse into pointwise multiplies above these sizes. - - When an FFT is to give a full product, the change of N to 2N doesn't -alter the theoretical complexity for a given k, but for the purposes of -considering where an FFT might be first used it can be assumed that the -FFT is recursing into a normal multiply and that on that basis it's -doing 2^k recursed multiplies each 1/2^(k-2) the size of the inputs, -making it O(N^(k/(k-2))). This would mean k=7 at O(N^1.4) would be the -first FFT faster than Toom-3. In practice `MUL_FFT_THRESHOLD' and -`SQR_FFT_THRESHOLD' have been found to be in the k=8 range, somewhere -between 3000 and 10000 limbs. - - The way N is split into 2^k pieces and then 2M+k+3 is rounded up to -a multiple of 2^k and `mp_bits_per_limb' means that when -2^k>=mp_bits_per_limb the effective N is a multiple of 2^(2k-1) bits. -The +k+3 means some values of N just under such a multiple will be -rounded to the next. The complexity calculations above assume that a -favourable size is used, meaning one which isn't padded through -rounding, and it's also assumed that the extra +k+3 bits are negligible -at typical FFT sizes. - - The practical effect of the 2^(2k-1) constraint is to introduce a -step-effect into measured speeds. For example k=8 will round N up to a -multiple of 32768 bits, so for a 32-bit limb there'll be 512 limb -groups of sizes for which `mpn_mul_n' runs at the same speed. Or for -k=9 groups of 2048 limbs, k=10 groups of 8192 limbs, etc. In practice -it's been found each k is used at quite small multiples of its size -constraint and so the step effect is quite noticeable in a time versus -size graph. - - The threshold determinations currently measure at the mid-points of -size steps, but this is sub-optimal since at the start of a new step it -can happen that it's better to go back to the previous k for a while. -Something more sophisticated for `MUL_FFT_TABLE' and `SQR_FFT_TABLE' -will be needed. - - -File: gmp.info, Node: Other Multiplication, Next: Unbalanced Multiplication, Prev: FFT Multiplication, Up: Multiplication Algorithms - -16.1.6 Other Multiplication ---------------------------- - -The Toom algorithms described above (*note Toom 3-Way Multiplication::, -*note Toom 4-Way Multiplication::) generalizes to split into an -arbitrary number of pieces, as per Knuth section 4.3.3 algorithm C. -This is not currently used. The notes here are merely for interest. - - In general a split into r+1 pieces is made, and evaluations and -pointwise multiplications done at 2*r+1 points. A 4-way split does 7 -pointwise multiplies, 5-way does 9, etc. Asymptotically an (r+1)-way -algorithm is O(N^(log(2*r+1)/log(r+1))). Only the pointwise -multiplications count towards big-O complexity, but the time spent in -the evaluate and interpolate stages grows with r and has a significant -practical impact, with the asymptotic advantage of each r realized only -at bigger and bigger sizes. The overheads grow as O(N*r), whereas in -an r=2^k FFT they grow only as O(N*log(r)). - - Knuth algorithm C evaluates at points 0,1,2,...,2*r, but exercise 4 -uses -r,...,0,...,r and the latter saves some small multiplies in the -evaluate stage (or rather trades them for additions), and has a further -saving of nearly half the interpolate steps. The idea is to separate -odd and even final coefficients and then perform algorithm C steps C7 -and C8 on them separately. The divisors at step C7 become j^2 and the -multipliers at C8 become 2*t*j-j^2. - - Splitting odd and even parts through positive and negative points -can be thought of as using -1 as a square root of unity. If a 4th root -of unity was available then a further split and speedup would be -possible, but no such root exists for plain integers. Going to complex -integers with i=sqrt(-1) doesn't help, essentially because in Cartesian -form it takes three real multiplies to do a complex multiply. The -existence of 2^k'th roots of unity in a suitable ring or field lets the -fast Fourier transform keep splitting and get to O(N*log(r)). - - Floating point FFTs use complex numbers approximating Nth roots of -unity. Some processors have special support for such FFTs. But these -are not used in GMP since it's very difficult to guarantee an exact -result (to some number of bits). An occasional difference of 1 in the -last bit might not matter to a typical signal processing algorithm, but -is of course of vital importance to GMP. - - -File: gmp.info, Node: Unbalanced Multiplication, Prev: Other Multiplication, Up: Multiplication Algorithms - -16.1.7 Unbalanced Multiplication --------------------------------- - -Multiplication of operands with different sizes, both below -`MUL_TOOM22_THRESHOLD' are done with plain schoolbook multiplication -(*note Basecase Multiplication::). - - For really large operands, we invoke FFT directly. - - For operands between these sizes, we use Toom inspired algorithms -suggested by Alberto Zanoni and Marco Bodrato. The idea is to split -the operands into polynomials of different degree. GMP currently -splits the smaller operand onto 2 coefficients, i.e., a polynomial of -degree 1, but the larger operand can be split into 2, 3, or 4 -coefficients, i.e., a polynomial of degree 1 to 3. - - -File: gmp.info, Node: Division Algorithms, Next: Greatest Common Divisor Algorithms, Prev: Multiplication Algorithms, Up: Algorithms - -16.2 Division Algorithms -======================== - -* Menu: - -* Single Limb Division:: -* Basecase Division:: -* Divide and Conquer Division:: -* Block-Wise Barrett Division:: -* Exact Division:: -* Exact Remainder:: -* Small Quotient Division:: - - -File: gmp.info, Node: Single Limb Division, Next: Basecase Division, Prev: Division Algorithms, Up: Division Algorithms - -16.2.1 Single Limb Division ---------------------------- - -Nx1 division is implemented using repeated 2x1 divisions from high to -low, either with a hardware divide instruction or a multiplication by -inverse, whichever is best on a given CPU. - - The multiply by inverse follows "Improved division by invariant -integers" by Mo"ller and Granlund (*note References::) and is -implemented as `udiv_qrnnd_preinv' in `gmp-impl.h'. The idea is to -have a fixed-point approximation to 1/d (see `invert_limb') and then -multiply by the high limb (plus one bit) of the dividend to get a -quotient q. With d normalized (high bit set), q is no more than 1 too -small. Subtracting q*d from the dividend gives a remainder, and -reveals whether q or q-1 is correct. - - The result is a division done with two multiplications and four or -five arithmetic operations. On CPUs with low latency multipliers this -can be much faster than a hardware divide, though the cost of -calculating the inverse at the start may mean it's only better on -inputs bigger than say 4 or 5 limbs. - - When a divisor must be normalized, either for the generic C -`__udiv_qrnnd_c' or the multiply by inverse, the division performed is -actually a*2^k by d*2^k where a is the dividend and k is the power -necessary to have the high bit of d*2^k set. The bit shifts for the -dividend are usually accomplished "on the fly" meaning by extracting -the appropriate bits at each step. Done this way the quotient limbs -come out aligned ready to store. When only the remainder is wanted, an -alternative is to take the dividend limbs unshifted and calculate r = a -mod d*2^k followed by an extra final step r*2^k mod d*2^k. This can -help on CPUs with poor bit shifts or few registers. - - The multiply by inverse can be done two limbs at a time. The -calculation is basically the same, but the inverse is two limbs and the -divisor treated as if padded with a low zero limb. This means more -work, since the inverse will need a 2x2 multiply, but the four 1x1s to -do that are independent and can therefore be done partly or wholly in -parallel. Likewise for a 2x1 calculating q*d. The net effect is to -process two limbs with roughly the same two multiplies worth of latency -that one limb at a time gives. This extends to 3 or 4 limbs at a time, -though the extra work to apply the inverse will almost certainly soon -reach the limits of multiplier throughput. - - A similar approach in reverse can be taken to process just half a -limb at a time if the divisor is only a half limb. In this case the -1x1 multiply for the inverse effectively becomes two (1/2)x1 for each -limb, which can be a saving on CPUs with a fast half limb multiply, or -in fact if the only multiply is a half limb, and especially if it's not -pipelined. - - -File: gmp.info, Node: Basecase Division, Next: Divide and Conquer Division, Prev: Single Limb Division, Up: Division Algorithms - -16.2.2 Basecase Division ------------------------- - -Basecase NxM division is like long division done by hand, but in base -2^mp_bits_per_limb. See Knuth section 4.3.1 algorithm D, and -`mpn/generic/sb_divrem_mn.c'. - - Briefly stated, while the dividend remains larger than the divisor, -a high quotient limb is formed and the Nx1 product q*d subtracted at -the top end of the dividend. With a normalized divisor (most -significant bit set), each quotient limb can be formed with a 2x1 -division and a 1x1 multiplication plus some subtractions. The 2x1 -division is by the high limb of the divisor and is done either with a -hardware divide or a multiply by inverse (the same as in *Note Single -Limb Division::) whichever is faster. Such a quotient is sometimes one -too big, requiring an addback of the divisor, but that happens rarely. - - With Q=N-M being the number of quotient limbs, this is an O(Q*M) -algorithm and will run at a speed similar to a basecase QxM -multiplication, differing in fact only in the extra multiply and divide -for each of the Q quotient limbs. - - -File: gmp.info, Node: Divide and Conquer Division, Next: Block-Wise Barrett Division, Prev: Basecase Division, Up: Division Algorithms - -16.2.3 Divide and Conquer Division ----------------------------------- - -For divisors larger than `DC_DIV_QR_THRESHOLD', division is done by -dividing. Or to be precise by a recursive divide and conquer algorithm -based on work by Moenck and Borodin, Jebelean, and Burnikel and Ziegler -(*note References::). - - The algorithm consists essentially of recognising that a 2NxN -division can be done with the basecase division algorithm (*note -Basecase Division::), but using N/2 limbs as a base, not just a single -limb. This way the multiplications that arise are (N/2)x(N/2) and can -take advantage of Karatsuba and higher multiplication algorithms (*note -Multiplication Algorithms::). The two "digits" of the quotient are -formed by recursive Nx(N/2) divisions. - - If the (N/2)x(N/2) multiplies are done with a basecase multiplication -then the work is about the same as a basecase division, but with more -function call overheads and with some subtractions separated from the -multiplies. These overheads mean that it's only when N/2 is above -`MUL_TOOM22_THRESHOLD' that divide and conquer is of use. - - `DC_DIV_QR_THRESHOLD' is based on the divisor size N, so it will be -somewhere above twice `MUL_TOOM22_THRESHOLD', but how much above -depends on the CPU. An optimized `mpn_mul_basecase' can lower -`DC_DIV_QR_THRESHOLD' a little by offering a ready-made advantage over -repeated `mpn_submul_1' calls. - - Divide and conquer is asymptotically O(M(N)*log(N)) where M(N) is -the time for an NxN multiplication done with FFTs. The actual time is -a sum over multiplications of the recursed sizes, as can be seen near -the end of section 2.2 of Burnikel and Ziegler. For example, within -the Toom-3 range, divide and conquer is 2.63*M(N). With higher -algorithms the M(N) term improves and the multiplier tends to log(N). -In practice, at moderate to large sizes, a 2NxN division is about 2 to -4 times slower than an NxN multiplication. - - -File: gmp.info, Node: Block-Wise Barrett Division, Next: Exact Division, Prev: Divide and Conquer Division, Up: Division Algorithms - -16.2.4 Block-Wise Barrett Division ----------------------------------- - -For the largest divisions, a block-wise Barrett division algorithm is -used. Here, the divisor is inverted to a precision determined by the -relative size of the dividend and divisor. Blocks of quotient limbs -are then generated by multiplying blocks from the dividend by the -inverse. - - Our block-wise algorithm computes a smaller inverse than in the -plain Barrett algorithm. For a 2n/n division, the inverse will be just -ceil(n/2) limbs. - - -File: gmp.info, Node: Exact Division, Next: Exact Remainder, Prev: Block-Wise Barrett Division, Up: Division Algorithms - -16.2.5 Exact Division ---------------------- - -A so-called exact division is when the dividend is known to be an exact -multiple of the divisor. Jebelean's exact division algorithm uses this -knowledge to make some significant optimizations (*note References::). - - The idea can be illustrated in decimal for example with 368154 -divided by 543. Because the low digit of the dividend is 4, the low -digit of the quotient must be 8. This is arrived at from 4*7 mod 10, -using the fact 7 is the modular inverse of 3 (the low digit of the -divisor), since 3*7 == 1 mod 10. So 8*543=4344 can be subtracted from -the dividend leaving 363810. Notice the low digit has become zero. - - The procedure is repeated at the second digit, with the next -quotient digit 7 (7 == 1*7 mod 10), subtracting 7*543=3801, leaving -325800. And finally at the third digit with quotient digit 6 (8*7 mod -10), subtracting 6*543=3258 leaving 0. So the quotient is 678. - - Notice however that the multiplies and subtractions don't need to -extend past the low three digits of the dividend, since that's enough -to determine the three quotient digits. For the last quotient digit no -subtraction is needed at all. On a 2NxN division like this one, only -about half the work of a normal basecase division is necessary. - - For an NxM exact division producing Q=N-M quotient limbs, the saving -over a normal basecase division is in two parts. Firstly, each of the -Q quotient limbs needs only one multiply, not a 2x1 divide and -multiply. Secondly, the crossproducts are reduced when Q>M to -Q*M-M*(M+1)/2, or when Q<=M to Q*(Q-1)/2. Notice the savings are -complementary. If Q is big then many divisions are saved, or if Q is -small then the crossproducts reduce to a small number. - - The modular inverse used is calculated efficiently by `binvert_limb' -in `gmp-impl.h'. This does four multiplies for a 32-bit limb, or six -for a 64-bit limb. `tune/modlinv.c' has some alternate implementations -that might suit processors better at bit twiddling than multiplying. - - The sub-quadratic exact division described by Jebelean in "Exact -Division with Karatsuba Complexity" is not currently implemented. It -uses a rearrangement similar to the divide and conquer for normal -division (*note Divide and Conquer Division::), but operating from low -to high. A further possibility not currently implemented is -"Bidirectional Exact Integer Division" by Krandick and Jebelean which -forms quotient limbs from both the high and low ends of the dividend, -and can halve once more the number of crossproducts needed in a 2NxN -division. - - A special case exact division by 3 exists in `mpn_divexact_by3', -supporting Toom-3 multiplication and `mpq' canonicalizations. It forms -quotient digits with a multiply by the modular inverse of 3 (which is -`0xAA..AAB') and uses two comparisons to determine a borrow for the next -limb. The multiplications don't need to be on the dependent chain, as -long as the effect of the borrows is applied, which can help chips with -pipelined multipliers. - - -File: gmp.info, Node: Exact Remainder, Next: Small Quotient Division, Prev: Exact Division, Up: Division Algorithms - -16.2.6 Exact Remainder ----------------------- - -If the exact division algorithm is done with a full subtraction at each -stage and the dividend isn't a multiple of the divisor, then low zero -limbs are produced but with a remainder in the high limbs. For -dividend a, divisor d, quotient q, and b = 2^mp_bits_per_limb, this -remainder r is of the form - - a = q*d + r*b^n - - n represents the number of zero limbs produced by the subtractions, -that being the number of limbs produced for q. r will be in the range -0<=rb*r+u2 condition appropriately relaxed. - - -File: gmp.info, Node: Greatest Common Divisor Algorithms, Next: Powering Algorithms, Prev: Division Algorithms, Up: Algorithms - -16.3 Greatest Common Divisor -============================ - -* Menu: - -* Binary GCD:: -* Lehmer's Algorithm:: -* Subquadratic GCD:: -* Extended GCD:: -* Jacobi Symbol:: - - -File: gmp.info, Node: Binary GCD, Next: Lehmer's Algorithm, Prev: Greatest Common Divisor Algorithms, Up: Greatest Common Divisor Algorithms - -16.3.1 Binary GCD ------------------ - -At small sizes GMP uses an O(N^2) binary style GCD. This is described -in many textbooks, for example Knuth section 4.5.2 algorithm B. It -simply consists of successively reducing odd operands a and b using - - a,b = abs(a-b),min(a,b) - strip factors of 2 from a - - The Euclidean GCD algorithm, as per Knuth algorithms E and A, -repeatedly computes the quotient q = floor(a/b) and replaces a,b by v, -u - q v. The binary algorithm has so far been found to be faster than -the Euclidean algorithm everywhere. One reason the binary method does -well is that the implied quotient at each step is usually small, so -often only one or two subtractions are needed to get the same effect as -a division. Quotients 1, 2 and 3 for example occur 67.7% of the time, -see Knuth section 4.5.3 Theorem E. - - When the implied quotient is large, meaning b is much smaller than -a, then a division is worthwhile. This is the basis for the initial a -mod b reductions in `mpn_gcd' and `mpn_gcd_1' (the latter for both Nx1 -and 1x1 cases). But after that initial reduction, big quotients occur -too rarely to make it worth checking for them. - - - The final 1x1 GCD in `mpn_gcd_1' is done in the generic C code as -described above. For two N-bit operands, the algorithm takes about -0.68 iterations per bit. For optimum performance some attention needs -to be paid to the way the factors of 2 are stripped from a. - - Firstly it may be noted that in twos complement the number of low -zero bits on a-b is the same as b-a, so counting or testing can begin on -a-b without waiting for abs(a-b) to be determined. - - A loop stripping low zero bits tends not to branch predict well, -since the condition is data dependent. But on average there's only a -few low zeros, so an option is to strip one or two bits arithmetically -then loop for more (as done for AMD K6). Or use a lookup table to get -a count for several bits then loop for more (as done for AMD K7). An -alternative approach is to keep just one of a or b odd and iterate - - a,b = abs(a-b), min(a,b) - a = a/2 if even - b = b/2 if even - - This requires about 1.25 iterations per bit, but stripping of a -single bit at each step avoids any branching. Repeating the bit strip -reduces to about 0.9 iterations per bit, which may be a worthwhile -tradeoff. - - Generally with the above approaches a speed of perhaps 6 cycles per -bit can be achieved, which is still not terribly fast with for instance -a 64-bit GCD taking nearly 400 cycles. It's this sort of time which -means it's not usually advantageous to combine a set of divisibility -tests into a GCD. - - Currently, the binary algorithm is used for GCD only when N < 3. - - -File: gmp.info, Node: Lehmer's Algorithm, Next: Subquadratic GCD, Prev: Binary GCD, Up: Greatest Common Divisor Algorithms - -16.3.2 Lehmer's algorithm -------------------------- - -Lehmer's improvement of the Euclidean algorithms is based on the -observation that the initial part of the quotient sequence depends only -on the most significant parts of the inputs. The variant of Lehmer's -algorithm used in GMP splits off the most significant two limbs, as -suggested, e.g., in "A Double-Digit Lehmer-Euclid Algorithm" by -Jebelean (*note References::). The quotients of two double-limb inputs -are collected as a 2 by 2 matrix with single-limb elements. This is -done by the function `mpn_hgcd2'. The resulting matrix is applied to -the inputs using `mpn_mul_1' and `mpn_submul_1'. Each iteration usually -reduces the inputs by almost one limb. In the rare case of a large -quotient, no progress can be made by examining just the most -significant two limbs, and the quotient is computing using plain -division. - - The resulting algorithm is asymptotically O(N^2), just as the -Euclidean algorithm and the binary algorithm. The quadratic part of the -work are the calls to `mpn_mul_1' and `mpn_submul_1'. For small sizes, -the linear work is also significant. There are roughly N calls to the -`mpn_hgcd2' function. This function uses a couple of important -optimizations: - - * It uses the same relaxed notion of correctness as `mpn_hgcd' (see - next section). This means that when called with the most - significant two limbs of two large numbers, the returned matrix - does not always correspond exactly to the initial quotient - sequence for the two large numbers; the final quotient may - sometimes be one off. - - * It takes advantage of the fact the quotients are usually small. - The division operator is not used, since the corresponding - assembler instruction is very slow on most architectures. (This - code could probably be improved further, it uses many branches - that are unfriendly to prediction). - - * It switches from double-limb calculations to single-limb - calculations half-way through, when the input numbers have been - reduced in size from two limbs to one and a half. - - - -File: gmp.info, Node: Subquadratic GCD, Next: Extended GCD, Prev: Lehmer's Algorithm, Up: Greatest Common Divisor Algorithms - -16.3.3 Subquadratic GCD ------------------------ - -For inputs larger than `GCD_DC_THRESHOLD', GCD is computed via the HGCD -(Half GCD) function, as a generalization to Lehmer's algorithm. - - Let the inputs a,b be of size N limbs each. Put S = floor(N/2) + 1. -Then HGCD(a,b) returns a transformation matrix T with non-negative -elements, and reduced numbers (c;d) = T^-1 (a;b). The reduced numbers -c,d must be larger than S limbs, while their difference abs(c-d) must -fit in S limbs. The matrix elements will also be of size roughly N/2. - - The HGCD base case uses Lehmer's algorithm, but with the above stop -condition that returns reduced numbers and the corresponding -transformation matrix half-way through. For inputs larger than -`HGCD_THRESHOLD', HGCD is computed recursively, using the divide and -conquer algorithm in "On Scho"nhage's algorithm and subquadratic -integer GCD computation" by Mo"ller (*note References::). The recursive -algorithm consists of these main steps. - - * Call HGCD recursively, on the most significant N/2 limbs. Apply the - resulting matrix T_1 to the full numbers, reducing them to a size - just above 3N/2. - - * Perform a small number of division or subtraction steps to reduce - the numbers to size below 3N/2. This is essential mainly for the - unlikely case of large quotients. - - * Call HGCD recursively, on the most significant N/2 limbs of the - reduced numbers. Apply the resulting matrix T_2 to the full - numbers, reducing them to a size just above N/2. - - * Compute T = T_1 T_2. - - * Perform a small number of division and subtraction steps to - satisfy the requirements, and return. - - GCD is then implemented as a loop around HGCD, similarly to Lehmer's -algorithm. Where Lehmer repeatedly chops off the top two limbs, calls -`mpn_hgcd2', and applies the resulting matrix to the full numbers, the -subquadratic GCD chops off the most significant third of the limbs (the -proportion is a tuning parameter, and 1/3 seems to be more efficient -than, e.g, 1/2), calls `mpn_hgcd', and applies the resulting matrix. -Once the input numbers are reduced to size below `GCD_DC_THRESHOLD', -Lehmer's algorithm is used for the rest of the work. - - The asymptotic running time of both HGCD and GCD is O(M(N)*log(N)), -where M(N) is the time for multiplying two N-limb numbers. - - -File: gmp.info, Node: Extended GCD, Next: Jacobi Symbol, Prev: Subquadratic GCD, Up: Greatest Common Divisor Algorithms - -16.3.4 Extended GCD -------------------- - -The extended GCD function, or GCDEXT, calculates gcd(a,b) and also -cofactors x and y satisfying a*x+b*y=gcd(a,b). All the algorithms used -for plain GCD are extended to handle this case. The binary algorithm is -used only for single-limb GCDEXT. Lehmer's algorithm is used for sizes -up to `GCDEXT_DC_THRESHOLD'. Above this threshold, GCDEXT is -implemented as a loop around HGCD, but with more book-keeping to keep -track of the cofactors. This gives the same asymptotic running time as -for GCD and HGCD, O(M(N)*log(N)) - - One difference to plain GCD is that while the inputs a and b are -reduced as the algorithm proceeds, the cofactors x and y grow in size. -This makes the tuning of the chopping-point more difficult. The current -code chops off the most significant half of the inputs for the call to -HGCD in the first iteration, and the most significant two thirds for -the remaining calls. This strategy could surely be improved. Also the -stop condition for the loop, where Lehmer's algorithm is invoked once -the inputs are reduced below `GCDEXT_DC_THRESHOLD', could maybe be -improved by taking into account the current size of the cofactors. - - -File: gmp.info, Node: Jacobi Symbol, Prev: Extended GCD, Up: Greatest Common Divisor Algorithms - -16.3.5 Jacobi Symbol --------------------- - -`mpz_jacobi' and `mpz_kronecker' are currently implemented with a -simple binary algorithm similar to that described for the GCDs (*note -Binary GCD::). They're not very fast when both inputs are large. -Lehmer's multi-step improvement or a binary based multi-step algorithm -is likely to be better. - - When one operand fits a single limb, and that includes -`mpz_kronecker_ui' and friends, an initial reduction is done with -either `mpn_mod_1' or `mpn_modexact_1_odd', followed by the binary -algorithm on a single limb. The binary algorithm is well suited to a -single limb, and the whole calculation in this case is quite efficient. - - In all the routines sign changes for the result are accumulated -using some bit twiddling, avoiding table lookups or conditional jumps. - diff --git a/misc/builddeps/dp.linux32/share/info/gmp.info-2 b/misc/builddeps/dp.linux32/share/info/gmp.info-2 deleted file mode 100644 index 45846232..00000000 --- a/misc/builddeps/dp.linux32/share/info/gmp.info-2 +++ /dev/null @@ -1,3489 +0,0 @@ -This is ../../gmp/doc/gmp.info, produced by makeinfo version 4.8 from -../../gmp/doc/gmp.texi. - - This manual describes how to install and use the GNU multiple -precision arithmetic library, version 5.0.1. - - Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free -Software Foundation, Inc. - - Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version -1.3 or any later version published by the Free Software Foundation; -with no Invariant Sections, with the Front-Cover Texts being "A GNU -Manual", and with the Back-Cover Texts being "You have freedom to copy -and modify this GNU Manual, like GNU software". A copy of the license -is included in *Note GNU Free Documentation License::. - -INFO-DIR-SECTION GNU libraries -START-INFO-DIR-ENTRY -* gmp: (gmp). GNU Multiple Precision Arithmetic Library. -END-INFO-DIR-ENTRY - - -File: gmp.info, Node: Powering Algorithms, Next: Root Extraction Algorithms, Prev: Greatest Common Divisor Algorithms, Up: Algorithms - -16.4 Powering Algorithms -======================== - -* Menu: - -* Normal Powering Algorithm:: -* Modular Powering Algorithm:: - - -File: gmp.info, Node: Normal Powering Algorithm, Next: Modular Powering Algorithm, Prev: Powering Algorithms, Up: Powering Algorithms - -16.4.1 Normal Powering ----------------------- - -Normal `mpz' or `mpf' powering uses a simple binary algorithm, -successively squaring and then multiplying by the base when a 1 bit is -seen in the exponent, as per Knuth section 4.6.3. The "left to right" -variant described there is used rather than algorithm A, since it's -just as easy and can be done with somewhat less temporary memory. - - -File: gmp.info, Node: Modular Powering Algorithm, Prev: Normal Powering Algorithm, Up: Powering Algorithms - -16.4.2 Modular Powering ------------------------ - -Modular powering is implemented using a 2^k-ary sliding window -algorithm, as per "Handbook of Applied Cryptography" algorithm 14.85 -(*note References::). k is chosen according to the size of the -exponent. Larger exponents use larger values of k, the choice being -made to minimize the average number of multiplications that must -supplement the squaring. - - The modular multiplies and squares use either a simple division or -the REDC method by Montgomery (*note References::). REDC is a little -faster, essentially saving N single limb divisions in a fashion similar -to an exact remainder (*note Exact Remainder::). - - -File: gmp.info, Node: Root Extraction Algorithms, Next: Radix Conversion Algorithms, Prev: Powering Algorithms, Up: Algorithms - -16.5 Root Extraction Algorithms -=============================== - -* Menu: - -* Square Root Algorithm:: -* Nth Root Algorithm:: -* Perfect Square Algorithm:: -* Perfect Power Algorithm:: - - -File: gmp.info, Node: Square Root Algorithm, Next: Nth Root Algorithm, Prev: Root Extraction Algorithms, Up: Root Extraction Algorithms - -16.5.1 Square Root ------------------- - -Square roots are taken using the "Karatsuba Square Root" algorithm by -Paul Zimmermann (*note References::). - - An input n is split into four parts of k bits each, so with b=2^k we -have n = a3*b^3 + a2*b^2 + a1*b + a0. Part a3 must be "normalized" so -that either the high or second highest bit is set. In GMP, k is kept -on a limb boundary and the input is left shifted (by an even number of -bits) to normalize. - - The square root of the high two parts is taken, by recursive -application of the algorithm (bottoming out in a one-limb Newton's -method), - - s1,r1 = sqrtrem (a3*b + a2) - - This is an approximation to the desired root and is extended by a -division to give s,r, - - q,u = divrem (r1*b + a1, 2*s1) - s = s1*b + q - r = u*b + a0 - q^2 - - The normalization requirement on a3 means at this point s is either -correct or 1 too big. r is negative in the latter case, so - - if r < 0 then - r = r + 2*s - 1 - s = s - 1 - - The algorithm is expressed in a divide and conquer form, but as -noted in the paper it can also be viewed as a discrete variant of -Newton's method, or as a variation on the schoolboy method (no longer -taught) for square roots two digits at a time. - - If the remainder r is not required then usually only a few high limbs -of r and u need to be calculated to determine whether an adjustment to -s is required. This optimization is not currently implemented. - - In the Karatsuba multiplication range this algorithm is -O(1.5*M(N/2)), where M(n) is the time to multiply two numbers of n -limbs. In the FFT multiplication range this grows to a bound of -O(6*M(N/2)). In practice a factor of about 1.5 to 1.8 is found in the -Karatsuba and Toom-3 ranges, growing to 2 or 3 in the FFT range. - - The algorithm does all its calculations in integers and the resulting -`mpn_sqrtrem' is used for both `mpz_sqrt' and `mpf_sqrt'. The extended -precision given by `mpf_sqrt_ui' is obtained by padding with zero limbs. - - -File: gmp.info, Node: Nth Root Algorithm, Next: Perfect Square Algorithm, Prev: Square Root Algorithm, Up: Root Extraction Algorithms - -16.5.2 Nth Root ---------------- - -Integer Nth roots are taken using Newton's method with the following -iteration, where A is the input and n is the root to be taken. - - 1 A - a[i+1] = - * ( --------- + (n-1)*a[i] ) - n a[i]^(n-1) - - The initial approximation a[1] is generated bitwise by successively -powering a trial root with or without new 1 bits, aiming to be just -above the true root. The iteration converges quadratically when -started from a good approximation. When n is large more initial bits -are needed to get good convergence. The current implementation is not -particularly well optimized. - - -File: gmp.info, Node: Perfect Square Algorithm, Next: Perfect Power Algorithm, Prev: Nth Root Algorithm, Up: Root Extraction Algorithms - -16.5.3 Perfect Square ---------------------- - -A significant fraction of non-squares can be quickly identified by -checking whether the input is a quadratic residue modulo small integers. - - `mpz_perfect_square_p' first tests the input mod 256, which means -just examining the low byte. Only 44 different values occur for -squares mod 256, so 82.8% of inputs can be immediately identified as -non-squares. - - On a 32-bit system similar tests are done mod 9, 5, 7, 13 and 17, -for a total 99.25% of inputs identified as non-squares. On a 64-bit -system 97 is tested too, for a total 99.62%. - - These moduli are chosen because they're factors of 2^24-1 (or 2^48-1 -for 64-bits), and such a remainder can be quickly taken just using -additions (see `mpn_mod_34lsub1'). - - When nails are in use moduli are instead selected by the `gen-psqr.c' -program and applied with an `mpn_mod_1'. The same 2^24-1 or 2^48-1 -could be done with nails using some extra bit shifts, but this is not -currently implemented. - - In any case each modulus is applied to the `mpn_mod_34lsub1' or -`mpn_mod_1' remainder and a table lookup identifies non-squares. By -using a "modexact" style calculation, and suitably permuted tables, -just one multiply each is required, see the code for details. Moduli -are also combined to save operations, so long as the lookup tables -don't become too big. `gen-psqr.c' does all the pre-calculations. - - A square root must still be taken for any value that passes these -tests, to verify it's really a square and not one of the small fraction -of non-squares that get through (ie. a pseudo-square to all the tested -bases). - - Clearly more residue tests could be done, `mpz_perfect_square_p' only -uses a compact and efficient set. Big inputs would probably benefit -from more residue testing, small inputs might be better off with less. -The assumed distribution of squares versus non-squares in the input -would affect such considerations. - - -File: gmp.info, Node: Perfect Power Algorithm, Prev: Perfect Square Algorithm, Up: Root Extraction Algorithms - -16.5.4 Perfect Power --------------------- - -Detecting perfect powers is required by some factorization algorithms. -Currently `mpz_perfect_power_p' is implemented using repeated Nth root -extractions, though naturally only prime roots need to be considered. -(*Note Nth Root Algorithm::.) - - If a prime divisor p with multiplicity e can be found, then only -roots which are divisors of e need to be considered, much reducing the -work necessary. To this end divisibility by a set of small primes is -checked. - - -File: gmp.info, Node: Radix Conversion Algorithms, Next: Other Algorithms, Prev: Root Extraction Algorithms, Up: Algorithms - -16.6 Radix Conversion -===================== - -Radix conversions are less important than other algorithms. A program -dominated by conversions should probably use a different data -representation. - -* Menu: - -* Binary to Radix:: -* Radix to Binary:: - - -File: gmp.info, Node: Binary to Radix, Next: Radix to Binary, Prev: Radix Conversion Algorithms, Up: Radix Conversion Algorithms - -16.6.1 Binary to Radix ----------------------- - -Conversions from binary to a power-of-2 radix use a simple and fast -O(N) bit extraction algorithm. - - Conversions from binary to other radices use one of two algorithms. -Sizes below `GET_STR_PRECOMPUTE_THRESHOLD' use a basic O(N^2) method. -Repeated divisions by b^n are made, where b is the radix and n is the -biggest power that fits in a limb. But instead of simply using the -remainder r from such divisions, an extra divide step is done to give a -fractional limb representing r/b^n. The digits of r can then be -extracted using multiplications by b rather than divisions. Special -case code is provided for decimal, allowing multiplications by 10 to -optimize to shifts and adds. - - Above `GET_STR_PRECOMPUTE_THRESHOLD' a sub-quadratic algorithm is -used. For an input t, powers b^(n*2^i) of the radix are calculated, -until a power between t and sqrt(t) is reached. t is then divided by -that largest power, giving a quotient which is the digits above that -power, and a remainder which is those below. These two parts are in -turn divided by the second highest power, and so on recursively. When -a piece has been divided down to less than `GET_STR_DC_THRESHOLD' -limbs, the basecase algorithm described above is used. - - The advantage of this algorithm is that big divisions can make use -of the sub-quadratic divide and conquer division (*note Divide and -Conquer Division::), and big divisions tend to have less overheads than -lots of separate single limb divisions anyway. But in any case the -cost of calculating the powers b^(n*2^i) must first be overcome. - - `GET_STR_PRECOMPUTE_THRESHOLD' and `GET_STR_DC_THRESHOLD' represent -the same basic thing, the point where it becomes worth doing a big -division to cut the input in half. `GET_STR_PRECOMPUTE_THRESHOLD' -includes the cost of calculating the radix power required, whereas -`GET_STR_DC_THRESHOLD' assumes that's already available, which is the -case when recursing. - - Since the base case produces digits from least to most significant -but they want to be stored from most to least, it's necessary to -calculate in advance how many digits there will be, or at least be sure -not to underestimate that. For GMP the number of input bits is -multiplied by `chars_per_bit_exactly' from `mp_bases', rounding up. -The result is either correct or one too big. - - Examining some of the high bits of the input could increase the -chance of getting the exact number of digits, but an exact result every -time would not be practical, since in general the difference between -numbers 100... and 99... is only in the last few bits and the work to -identify 99... might well be almost as much as a full conversion. - - `mpf_get_str' doesn't currently use the algorithm described here, it -multiplies or divides by a power of b to move the radix point to the -just above the highest non-zero digit (or at worst one above that -location), then multiplies by b^n to bring out digits. This is O(N^2) -and is certainly not optimal. - - The r/b^n scheme described above for using multiplications to bring -out digits might be useful for more than a single limb. Some brief -experiments with it on the base case when recursing didn't give a -noticeable improvement, but perhaps that was only due to the -implementation. Something similar would work for the sub-quadratic -divisions too, though there would be the cost of calculating a bigger -radix power. - - Another possible improvement for the sub-quadratic part would be to -arrange for radix powers that balanced the sizes of quotient and -remainder produced, ie. the highest power would be an b^(n*k) -approximately equal to sqrt(t), not restricted to a 2^i factor. That -ought to smooth out a graph of times against sizes, but may or may not -be a net speedup. - - -File: gmp.info, Node: Radix to Binary, Prev: Binary to Radix, Up: Radix Conversion Algorithms - -16.6.2 Radix to Binary ----------------------- - -*This section needs to be rewritten, it currently describes the -algorithms used before GMP 4.3.* - - Conversions from a power-of-2 radix into binary use a simple and fast -O(N) bitwise concatenation algorithm. - - Conversions from other radices use one of two algorithms. Sizes -below `SET_STR_PRECOMPUTE_THRESHOLD' use a basic O(N^2) method. Groups -of n digits are converted to limbs, where n is the biggest power of the -base b which will fit in a limb, then those groups are accumulated into -the result by multiplying by b^n and adding. This saves -multi-precision operations, as per Knuth section 4.4 part E (*note -References::). Some special case code is provided for decimal, giving -the compiler a chance to optimize multiplications by 10. - - Above `SET_STR_PRECOMPUTE_THRESHOLD' a sub-quadratic algorithm is -used. First groups of n digits are converted into limbs. Then adjacent -limbs are combined into limb pairs with x*b^n+y, where x and y are the -limbs. Adjacent limb pairs are combined into quads similarly with -x*b^(2n)+y. This continues until a single block remains, that being -the result. - - The advantage of this method is that the multiplications for each x -are big blocks, allowing Karatsuba and higher algorithms to be used. -But the cost of calculating the powers b^(n*2^i) must be overcome. -`SET_STR_PRECOMPUTE_THRESHOLD' usually ends up quite big, around 5000 -digits, and on some processors much bigger still. - - `SET_STR_PRECOMPUTE_THRESHOLD' is based on the input digits (and -tuned for decimal), though it might be better based on a limb count, so -as to be independent of the base. But that sort of count isn't used by -the base case and so would need some sort of initial calculation or -estimate. - - The main reason `SET_STR_PRECOMPUTE_THRESHOLD' is so much bigger -than the corresponding `GET_STR_PRECOMPUTE_THRESHOLD' is that -`mpn_mul_1' is much faster than `mpn_divrem_1' (often by a factor of 5, -or more). - - -File: gmp.info, Node: Other Algorithms, Next: Assembly Coding, Prev: Radix Conversion Algorithms, Up: Algorithms - -16.7 Other Algorithms -===================== - -* Menu: - -* Prime Testing Algorithm:: -* Factorial Algorithm:: -* Binomial Coefficients Algorithm:: -* Fibonacci Numbers Algorithm:: -* Lucas Numbers Algorithm:: -* Random Number Algorithms:: - - -File: gmp.info, Node: Prime Testing Algorithm, Next: Factorial Algorithm, Prev: Other Algorithms, Up: Other Algorithms - -16.7.1 Prime Testing --------------------- - -The primality testing in `mpz_probab_prime_p' (*note Number Theoretic -Functions::) first does some trial division by small factors and then -uses the Miller-Rabin probabilistic primality testing algorithm, as -described in Knuth section 4.5.4 algorithm P (*note References::). - - For an odd input n, and with n = q*2^k+1 where q is odd, this -algorithm selects a random base x and tests whether x^q mod n is 1 or --1, or an x^(q*2^j) mod n is 1, for 1<=j<=k. If so then n is probably -prime, if not then n is definitely composite. - - Any prime n will pass the test, but some composites do too. Such -composites are known as strong pseudoprimes to base x. No n is a -strong pseudoprime to more than 1/4 of all bases (see Knuth exercise -22), hence with x chosen at random there's no more than a 1/4 chance a -"probable prime" will in fact be composite. - - In fact strong pseudoprimes are quite rare, making the test much more -powerful than this analysis would suggest, but 1/4 is all that's proven -for an arbitrary n. - - -File: gmp.info, Node: Factorial Algorithm, Next: Binomial Coefficients Algorithm, Prev: Prime Testing Algorithm, Up: Other Algorithms - -16.7.2 Factorial ----------------- - -Factorials are calculated by a combination of removal of twos, -powering, and binary splitting. The procedure can be best illustrated -with an example, - - 23! = 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23 - -has factors of two removed, - - 23! = 2^19.1.1.3.1.5.3.7.1.9.5.11.3.13.7.15.1.17.9.19.5.21.11.23 - -and the resulting terms collected up according to their multiplicity, - - 23! = 2^19.(3.5)^3.(7.9.11)^2.(13.15.17.19.21.23) - - Each sequence such as 13.15.17.19.21.23 is evaluated by splitting -into every second term, as for instance (13.17.21).(15.19.23), and the -same recursively on each half. This is implemented iteratively using -some bit twiddling. - - Such splitting is more efficient than repeated Nx1 multiplies since -it forms big multiplies, allowing Karatsuba and higher algorithms to be -used. And even below the Karatsuba threshold a big block of work can -be more efficient for the basecase algorithm. - - Splitting into subsequences of every second term keeps the resulting -products more nearly equal in size than would the simpler approach of -say taking the first half and second half of the sequence. Nearly -equal products are more efficient for the current multiply -implementation. - - -File: gmp.info, Node: Binomial Coefficients Algorithm, Next: Fibonacci Numbers Algorithm, Prev: Factorial Algorithm, Up: Other Algorithms - -16.7.3 Binomial Coefficients ----------------------------- - -Binomial coefficients C(n,k) are calculated by first arranging k <= n/2 -using C(n,k) = C(n,n-k) if necessary, and then evaluating the following -product simply from i=2 to i=k. - - k (n-k+i) - C(n,k) = (n-k+1) * prod ------- - i=2 i - - It's easy to show that each denominator i will divide the product so -far, so the exact division algorithm is used (*note Exact Division::). - - The numerators n-k+i and denominators i are first accumulated into -as many fit a limb, to save multi-precision operations, though for -`mpz_bin_ui' this applies only to the divisors, since n is an `mpz_t' -and n-k+i in general won't fit in a limb at all. - - -File: gmp.info, Node: Fibonacci Numbers Algorithm, Next: Lucas Numbers Algorithm, Prev: Binomial Coefficients Algorithm, Up: Other Algorithms - -16.7.4 Fibonacci Numbers ------------------------- - -The Fibonacci functions `mpz_fib_ui' and `mpz_fib2_ui' are designed for -calculating isolated F[n] or F[n],F[n-1] values efficiently. - - For small n, a table of single limb values in `__gmp_fib_table' is -used. On a 32-bit limb this goes up to F[47], or on a 64-bit limb up -to F[93]. For convenience the table starts at F[-1]. - - Beyond the table, values are generated with a binary powering -algorithm, calculating a pair F[n] and F[n-1] working from high to low -across the bits of n. The formulas used are - - F[2k+1] = 4*F[k]^2 - F[k-1]^2 + 2*(-1)^k - F[2k-1] = F[k]^2 + F[k-1]^2 - - F[2k] = F[2k+1] - F[2k-1] - - At each step, k is the high b bits of n. If the next bit of n is 0 -then F[2k],F[2k-1] is used, or if it's a 1 then F[2k+1],F[2k] is used, -and the process repeated until all bits of n are incorporated. Notice -these formulas require just two squares per bit of n. - - It'd be possible to handle the first few n above the single limb -table with simple additions, using the defining Fibonacci recurrence -F[k+1]=F[k]+F[k-1], but this is not done since it usually turns out to -be faster for only about 10 or 20 values of n, and including a block of -code for just those doesn't seem worthwhile. If they really mattered -it'd be better to extend the data table. - - Using a table avoids lots of calculations on small numbers, and -makes small n go fast. A bigger table would make more small n go fast, -it's just a question of balancing size against desired speed. For GMP -the code is kept compact, with the emphasis primarily on a good -powering algorithm. - - `mpz_fib2_ui' returns both F[n] and F[n-1], but `mpz_fib_ui' is only -interested in F[n]. In this case the last step of the algorithm can -become one multiply instead of two squares. One of the following two -formulas is used, according as n is odd or even. - - F[2k] = F[k]*(F[k]+2F[k-1]) - - F[2k+1] = (2F[k]+F[k-1])*(2F[k]-F[k-1]) + 2*(-1)^k - - F[2k+1] here is the same as above, just rearranged to be a multiply. -For interest, the 2*(-1)^k term both here and above can be applied -just to the low limb of the calculation, without a carry or borrow into -further limbs, which saves some code size. See comments with -`mpz_fib_ui' and the internal `mpn_fib2_ui' for how this is done. - - -File: gmp.info, Node: Lucas Numbers Algorithm, Next: Random Number Algorithms, Prev: Fibonacci Numbers Algorithm, Up: Other Algorithms - -16.7.5 Lucas Numbers --------------------- - -`mpz_lucnum2_ui' derives a pair of Lucas numbers from a pair of -Fibonacci numbers with the following simple formulas. - - L[k] = F[k] + 2*F[k-1] - L[k-1] = 2*F[k] - F[k-1] - - `mpz_lucnum_ui' is only interested in L[n], and some work can be -saved. Trailing zero bits on n can be handled with a single square -each. - - L[2k] = L[k]^2 - 2*(-1)^k - - And the lowest 1 bit can be handled with one multiply of a pair of -Fibonacci numbers, similar to what `mpz_fib_ui' does. - - L[2k+1] = 5*F[k-1]*(2*F[k]+F[k-1]) - 4*(-1)^k - - -File: gmp.info, Node: Random Number Algorithms, Prev: Lucas Numbers Algorithm, Up: Other Algorithms - -16.7.6 Random Numbers ---------------------- - -For the `urandomb' functions, random numbers are generated simply by -concatenating bits produced by the generator. As long as the generator -has good randomness properties this will produce well-distributed N bit -numbers. - - For the `urandomm' functions, random numbers in a range 0<=R48 bit pieces is convenient. With -some care though six 21x32->53 bit products can be used, if one of the -lower two 21-bit pieces also uses the sign bit. - - For the `mpn_mul_1' family of functions on a 64-bit machine, the -invariant single limb is split at the start, into 3 or 4 pieces. -Inside the loop, the bignum operand is split into 32-bit pieces. Fast -conversion of these unsigned 32-bit pieces to floating point is highly -machine-dependent. In some cases, reading the data into the integer -unit, zero-extending to 64-bits, then transferring to the floating -point unit back via memory is the only option. - - Converting partial products back to 64-bit limbs is usually best -done as a signed conversion. Since all values are smaller than 2^53, -signed and unsigned are the same, but most processors lack unsigned -conversions. - - - - Here is a diagram showing 16x32 bit products for an `mpn_mul_1' or -`mpn_addmul_1' with a 64-bit limb. The single limb operand V is split -into four 16-bit parts. The multi-limb operand U is split in the loop -into two 32-bit parts. - - +---+---+---+---+ - |v48|v32|v16|v00| V operand - +---+---+---+---+ - - +-------+---+---+ - x | u32 | u00 | U operand (one limb) - +---------------+ - - --------------------------------- - - +-----------+ - | u00 x v00 | p00 48-bit products - +-----------+ - +-----------+ - | u00 x v16 | p16 - +-----------+ - +-----------+ - | u00 x v32 | p32 - +-----------+ - +-----------+ - | u00 x v48 | p48 - +-----------+ - +-----------+ - | u32 x v00 | r32 - +-----------+ - +-----------+ - | u32 x v16 | r48 - +-----------+ - +-----------+ - | u32 x v32 | r64 - +-----------+ - +-----------+ - | u32 x v48 | r80 - +-----------+ - - p32 and r32 can be summed using floating-point addition, and -likewise p48 and r48. p00 and p16 can be summed with r64 and r80 from -the previous iteration. - - For each loop then, four 49-bit quantities are transferred to the -integer unit, aligned as follows, - - |-----64bits----|-----64bits----| - +------------+ - | p00 + r64' | i00 - +------------+ - +------------+ - | p16 + r80' | i16 - +------------+ - +------------+ - | p32 + r32 | i32 - +------------+ - +------------+ - | p48 + r48 | i48 - +------------+ - - The challenge then is to sum these efficiently and add in a carry -limb, generating a low 64-bit result limb and a high 33-bit carry limb -(i48 extends 33 bits into the high half). - - -File: gmp.info, Node: Assembly SIMD Instructions, Next: Assembly Software Pipelining, Prev: Assembly Floating Point, Up: Assembly Coding - -16.8.7 SIMD Instructions ------------------------- - -The single-instruction multiple-data support in current microprocessors -is aimed at signal processing algorithms where each data point can be -treated more or less independently. There's generally not much support -for propagating the sort of carries that arise in GMP. - - SIMD multiplications of say four 16x16 bit multiplies only do as much -work as one 32x32 from GMP's point of view, and need some shifts and -adds besides. But of course if say the SIMD form is fully pipelined -and uses less instruction decoding then it may still be worthwhile. - - On the x86 chips, MMX has so far found a use in `mpn_rshift' and -`mpn_lshift', and is used in a special case for 16-bit multipliers in -the P55 `mpn_mul_1'. SSE2 is used for Pentium 4 `mpn_mul_1', -`mpn_addmul_1', and `mpn_submul_1'. - - -File: gmp.info, Node: Assembly Software Pipelining, Next: Assembly Loop Unrolling, Prev: Assembly SIMD Instructions, Up: Assembly Coding - -16.8.8 Software Pipelining --------------------------- - -Software pipelining consists of scheduling instructions around the -branch point in a loop. For example a loop might issue a load not for -use in the present iteration but the next, thereby allowing extra -cycles for the data to arrive from memory. - - Naturally this is wanted only when doing things like loads or -multiplies that take several cycles to complete, and only where a CPU -has multiple functional units so that other work can be done in the -meantime. - - A pipeline with several stages will have a data value in progress at -each stage and each loop iteration moves them along one stage. This is -like juggling. - - If the latency of some instruction is greater than the loop time -then it will be necessary to unroll, so one register has a result ready -to use while another (or multiple others) are still in progress. -(*note Assembly Loop Unrolling::). - - -File: gmp.info, Node: Assembly Loop Unrolling, Next: Assembly Writing Guide, Prev: Assembly Software Pipelining, Up: Assembly Coding - -16.8.9 Loop Unrolling ---------------------- - -Loop unrolling consists of replicating code so that several limbs are -processed in each loop. At a minimum this reduces loop overheads by a -corresponding factor, but it can also allow better register usage, for -example alternately using one register combination and then another. -Judicious use of `m4' macros can help avoid lots of duplication in the -source code. - - Any amount of unrolling can be handled with a loop counter that's -decremented by N each time, stopping when the remaining count is less -than the further N the loop will process. Or by subtracting N at the -start, the termination condition becomes when the counter C is less -than 0 (and the count of remaining limbs is C+N). - - Alternately for a power of 2 unroll the loop count and remainder can -be established with a shift and mask. This is convenient if also -making a computed jump into the middle of a large loop. - - The limbs not a multiple of the unrolling can be handled in various -ways, for example - - * A simple loop at the end (or the start) to process the excess. - Care will be wanted that it isn't too much slower than the - unrolled part. - - * A set of binary tests, for example after an 8-limb unrolling, test - for 4 more limbs to process, then a further 2 more or not, and - finally 1 more or not. This will probably take more code space - than a simple loop. - - * A `switch' statement, providing separate code for each possible - excess, for example an 8-limb unrolling would have separate code - for 0 remaining, 1 remaining, etc, up to 7 remaining. This might - take a lot of code, but may be the best way to optimize all cases - in combination with a deep pipelined loop. - - * A computed jump into the middle of the loop, thus making the first - iteration handle the excess. This should make times smoothly - increase with size, which is attractive, but setups for the jump - and adjustments for pointers can be tricky and could become quite - difficult in combination with deep pipelining. - - -File: gmp.info, Node: Assembly Writing Guide, Prev: Assembly Loop Unrolling, Up: Assembly Coding - -16.8.10 Writing Guide ---------------------- - -This is a guide to writing software pipelined loops for processing limb -vectors in assembly. - - First determine the algorithm and which instructions are needed. -Code it without unrolling or scheduling, to make sure it works. On a -3-operand CPU try to write each new value to a new register, this will -greatly simplify later steps. - - Then note for each instruction the functional unit and/or issue port -requirements. If an instruction can use either of two units, like U0 -or U1 then make a category "U0/U1". Count the total using each unit -(or combined unit), and count all instructions. - - Figure out from those counts the best possible loop time. The goal -will be to find a perfect schedule where instruction latencies are -completely hidden. The total instruction count might be the limiting -factor, or perhaps a particular functional unit. It might be possible -to tweak the instructions to help the limiting factor. - - Suppose the loop time is N, then make N issue buckets, with the -final loop branch at the end of the last. Now fill the buckets with -dummy instructions using the functional units desired. Run this to -make sure the intended speed is reached. - - Now replace the dummy instructions with the real instructions from -the slow but correct loop you started with. The first will typically -be a load instruction. Then the instruction using that value is placed -in a bucket an appropriate distance down. Run the loop again, to check -it still runs at target speed. - - Keep placing instructions, frequently measuring the loop. After a -few you will need to wrap around from the last bucket back to the top -of the loop. If you used the new-register for new-value strategy above -then there will be no register conflicts. If not then take care not to -clobber something already in use. Changing registers at this time is -very error prone. - - The loop will overlap two or more of the original loop iterations, -and the computation of one vector element result will be started in one -iteration of the new loop, and completed one or several iterations -later. - - The final step is to create feed-in and wind-down code for the loop. -A good way to do this is to make a copy (or copies) of the loop at the -start and delete those instructions which don't have valid antecedents, -and at the end replicate and delete those whose results are unwanted -(including any further loads). - - The loop will have a minimum number of limbs loaded and processed, -so the feed-in code must test if the request size is smaller and skip -either to a suitable part of the wind-down or to special code for small -sizes. - - -File: gmp.info, Node: Internals, Next: Contributors, Prev: Algorithms, Up: Top - -17 Internals -************ - -*This chapter is provided only for informational purposes and the -various internals described here may change in future GMP releases. -Applications expecting to be compatible with future releases should use -only the documented interfaces described in previous chapters.* - -* Menu: - -* Integer Internals:: -* Rational Internals:: -* Float Internals:: -* Raw Output Internals:: -* C++ Interface Internals:: - - -File: gmp.info, Node: Integer Internals, Next: Rational Internals, Prev: Internals, Up: Internals - -17.1 Integer Internals -====================== - -`mpz_t' variables represent integers using sign and magnitude, in space -dynamically allocated and reallocated. The fields are as follows. - -`_mp_size' - The number of limbs, or the negative of that when representing a - negative integer. Zero is represented by `_mp_size' set to zero, - in which case the `_mp_d' data is unused. - -`_mp_d' - A pointer to an array of limbs which is the magnitude. These are - stored "little endian" as per the `mpn' functions, so `_mp_d[0]' - is the least significant limb and `_mp_d[ABS(_mp_size)-1]' is the - most significant. Whenever `_mp_size' is non-zero, the most - significant limb is non-zero. - - Currently there's always at least one limb allocated, so for - instance `mpz_set_ui' never needs to reallocate, and `mpz_get_ui' - can fetch `_mp_d[0]' unconditionally (though its value is then - only wanted if `_mp_size' is non-zero). - -`_mp_alloc' - `_mp_alloc' is the number of limbs currently allocated at `_mp_d', - and naturally `_mp_alloc >= ABS(_mp_size)'. When an `mpz' routine - is about to (or might be about to) increase `_mp_size', it checks - `_mp_alloc' to see whether there's enough space, and reallocates - if not. `MPZ_REALLOC' is generally used for this. - - The various bitwise logical functions like `mpz_and' behave as if -negative values were twos complement. But sign and magnitude is always -used internally, and necessary adjustments are made during the -calculations. Sometimes this isn't pretty, but sign and magnitude are -best for other routines. - - Some internal temporary variables are setup with `MPZ_TMP_INIT' and -these have `_mp_d' space obtained from `TMP_ALLOC' rather than the -memory allocation functions. Care is taken to ensure that these are -big enough that no reallocation is necessary (since it would have -unpredictable consequences). - - `_mp_size' and `_mp_alloc' are `int', although `mp_size_t' is -usually a `long'. This is done to make the fields just 32 bits on some -64 bits systems, thereby saving a few bytes of data space but still -providing plenty of range. - - -File: gmp.info, Node: Rational Internals, Next: Float Internals, Prev: Integer Internals, Up: Internals - -17.2 Rational Internals -======================= - -`mpq_t' variables represent rationals using an `mpz_t' numerator and -denominator (*note Integer Internals::). - - The canonical form adopted is denominator positive (and non-zero), -no common factors between numerator and denominator, and zero uniquely -represented as 0/1. - - It's believed that casting out common factors at each stage of a -calculation is best in general. A GCD is an O(N^2) operation so it's -better to do a few small ones immediately than to delay and have to do -a big one later. Knowing the numerator and denominator have no common -factors can be used for example in `mpq_mul' to make only two cross -GCDs necessary, not four. - - This general approach to common factors is badly sub-optimal in the -presence of simple factorizations or little prospect for cancellation, -but GMP has no way to know when this will occur. As per *Note -Efficiency::, that's left to applications. The `mpq_t' framework might -still suit, with `mpq_numref' and `mpq_denref' for direct access to the -numerator and denominator, or of course `mpz_t' variables can be used -directly. - - -File: gmp.info, Node: Float Internals, Next: Raw Output Internals, Prev: Rational Internals, Up: Internals - -17.3 Float Internals -==================== - -Efficient calculation is the primary aim of GMP floats and the use of -whole limbs and simple rounding facilitates this. - - `mpf_t' floats have a variable precision mantissa and a single -machine word signed exponent. The mantissa is represented using sign -and magnitude. - - most least - significant significant - limb limb - - _mp_d - |---- _mp_exp ---> | - _____ _____ _____ _____ _____ - |_____|_____|_____|_____|_____| - . <------------ radix point - - <-------- _mp_size ---------> - -The fields are as follows. - -`_mp_size' - The number of limbs currently in use, or the negative of that when - representing a negative value. Zero is represented by `_mp_size' - and `_mp_exp' both set to zero, and in that case the `_mp_d' data - is unused. (In the future `_mp_exp' might be undefined when - representing zero.) - -`_mp_prec' - The precision of the mantissa, in limbs. In any calculation the - aim is to produce `_mp_prec' limbs of result (the most significant - being non-zero). - -`_mp_d' - A pointer to the array of limbs which is the absolute value of the - mantissa. These are stored "little endian" as per the `mpn' - functions, so `_mp_d[0]' is the least significant limb and - `_mp_d[ABS(_mp_size)-1]' the most significant. - - The most significant limb is always non-zero, but there are no - other restrictions on its value, in particular the highest 1 bit - can be anywhere within the limb. - - `_mp_prec+1' limbs are allocated to `_mp_d', the extra limb being - for convenience (see below). There are no reallocations during a - calculation, only in a change of precision with `mpf_set_prec'. - -`_mp_exp' - The exponent, in limbs, determining the location of the implied - radix point. Zero means the radix point is just above the most - significant limb. Positive values mean a radix point offset - towards the lower limbs and hence a value >= 1, as for example in - the diagram above. Negative exponents mean a radix point further - above the highest limb. - - Naturally the exponent can be any value, it doesn't have to fall - within the limbs as the diagram shows, it can be a long way above - or a long way below. Limbs other than those included in the - `{_mp_d,_mp_size}' data are treated as zero. - - The `_mp_size' and `_mp_prec' fields are `int', although the -`mp_size_t' type is usually a `long'. The `_mp_exp' field is usually -`long'. This is done to make some fields just 32 bits on some 64 bits -systems, thereby saving a few bytes of data space but still providing -plenty of precision and a very large range. - - -The following various points should be noted. - -Low Zeros - The least significant limbs `_mp_d[0]' etc can be zero, though - such low zeros can always be ignored. Routines likely to produce - low zeros check and avoid them to save time in subsequent - calculations, but for most routines they're quite unlikely and - aren't checked. - -Mantissa Size Range - The `_mp_size' count of limbs in use can be less than `_mp_prec' if - the value can be represented in less. This means low precision - values or small integers stored in a high precision `mpf_t' can - still be operated on efficiently. - - `_mp_size' can also be greater than `_mp_prec'. Firstly a value is - allowed to use all of the `_mp_prec+1' limbs available at `_mp_d', - and secondly when `mpf_set_prec_raw' lowers `_mp_prec' it leaves - `_mp_size' unchanged and so the size can be arbitrarily bigger than - `_mp_prec'. - -Rounding - All rounding is done on limb boundaries. Calculating `_mp_prec' - limbs with the high non-zero will ensure the application requested - minimum precision is obtained. - - The use of simple "trunc" rounding towards zero is efficient, - since there's no need to examine extra limbs and increment or - decrement. - -Bit Shifts - Since the exponent is in limbs, there are no bit shifts in basic - operations like `mpf_add' and `mpf_mul'. When differing exponents - are encountered all that's needed is to adjust pointers to line up - the relevant limbs. - - Of course `mpf_mul_2exp' and `mpf_div_2exp' will require bit - shifts, but the choice is between an exponent in limbs which - requires shifts there, or one in bits which requires them almost - everywhere else. - -Use of `_mp_prec+1' Limbs - The extra limb on `_mp_d' (`_mp_prec+1' rather than just - `_mp_prec') helps when an `mpf' routine might get a carry from its - operation. `mpf_add' for instance will do an `mpn_add' of - `_mp_prec' limbs. If there's no carry then that's the result, but - if there is a carry then it's stored in the extra limb of space and - `_mp_size' becomes `_mp_prec+1'. - - Whenever `_mp_prec+1' limbs are held in a variable, the low limb - is not needed for the intended precision, only the `_mp_prec' high - limbs. But zeroing it out or moving the rest down is unnecessary. - Subsequent routines reading the value will simply take the high - limbs they need, and this will be `_mp_prec' if their target has - that same precision. This is no more than a pointer adjustment, - and must be checked anyway since the destination precision can be - different from the sources. - - Copy functions like `mpf_set' will retain a full `_mp_prec+1' limbs - if available. This ensures that a variable which has `_mp_size' - equal to `_mp_prec+1' will get its full exact value copied. - Strictly speaking this is unnecessary since only `_mp_prec' limbs - are needed for the application's requested precision, but it's - considered that an `mpf_set' from one variable into another of the - same precision ought to produce an exact copy. - -Application Precisions - `__GMPF_BITS_TO_PREC' converts an application requested precision - to an `_mp_prec'. The value in bits is rounded up to a whole limb - then an extra limb is added since the most significant limb of - `_mp_d' is only non-zero and therefore might contain only one bit. - - `__GMPF_PREC_TO_BITS' does the reverse conversion, and removes the - extra limb from `_mp_prec' before converting to bits. The net - effect of reading back with `mpf_get_prec' is simply the precision - rounded up to a multiple of `mp_bits_per_limb'. - - Note that the extra limb added here for the high only being - non-zero is in addition to the extra limb allocated to `_mp_d'. - For example with a 32-bit limb, an application request for 250 - bits will be rounded up to 8 limbs, then an extra added for the - high being only non-zero, giving an `_mp_prec' of 9. `_mp_d' then - gets 10 limbs allocated. Reading back with `mpf_get_prec' will - take `_mp_prec' subtract 1 limb and multiply by 32, giving 256 - bits. - - Strictly speaking, the fact the high limb has at least one bit - means that a float with, say, 3 limbs of 32-bits each will be - holding at least 65 bits, but for the purposes of `mpf_t' it's - considered simply to be 64 bits, a nice multiple of the limb size. - - -File: gmp.info, Node: Raw Output Internals, Next: C++ Interface Internals, Prev: Float Internals, Up: Internals - -17.4 Raw Output Internals -========================= - -`mpz_out_raw' uses the following format. - - +------+------------------------+ - | size | data bytes | - +------+------------------------+ - - The size is 4 bytes written most significant byte first, being the -number of subsequent data bytes, or the twos complement negative of -that when a negative integer is represented. The data bytes are the -absolute value of the integer, written most significant byte first. - - The most significant data byte is always non-zero, so the output is -the same on all systems, irrespective of limb size. - - In GMP 1, leading zero bytes were written to pad the data bytes to a -multiple of the limb size. `mpz_inp_raw' will still accept this, for -compatibility. - - The use of "big endian" for both the size and data fields is -deliberate, it makes the data easy to read in a hex dump of a file. -Unfortunately it also means that the limb data must be reversed when -reading or writing, so neither a big endian nor little endian system -can just read and write `_mp_d'. - - -File: gmp.info, Node: C++ Interface Internals, Prev: Raw Output Internals, Up: Internals - -17.5 C++ Interface Internals -============================ - -A system of expression templates is used to ensure something like -`a=b+c' turns into a simple call to `mpz_add' etc. For `mpf_class' the -scheme also ensures the precision of the final destination is used for -any temporaries within a statement like `f=w*x+y*z'. These are -important features which a naive implementation cannot provide. - - A simplified description of the scheme follows. The true scheme is -complicated by the fact that expressions have different return types. -For detailed information, refer to the source code. - - To perform an operation, say, addition, we first define a "function -object" evaluating it, - - struct __gmp_binary_plus - { - static void eval(mpf_t f, mpf_t g, mpf_t h) { mpf_add(f, g, h); } - }; - -And an "additive expression" object, - - __gmp_expr<__gmp_binary_expr > - operator+(const mpf_class &f, const mpf_class &g) - { - return __gmp_expr - <__gmp_binary_expr >(f, g); - } - - The seemingly redundant `__gmp_expr<__gmp_binary_expr<...>>' is used -to encapsulate any possible kind of expression into a single template -type. In fact even `mpf_class' etc are `typedef' specializations of -`__gmp_expr'. - - Next we define assignment of `__gmp_expr' to `mpf_class'. - - template - mpf_class & mpf_class::operator=(const __gmp_expr &expr) - { - expr.eval(this->get_mpf_t(), this->precision()); - return *this; - } - - template - void __gmp_expr<__gmp_binary_expr >::eval - (mpf_t f, mp_bitcnt_t precision) - { - Op::eval(f, expr.val1.get_mpf_t(), expr.val2.get_mpf_t()); - } - - where `expr.val1' and `expr.val2' are references to the expression's -operands (here `expr' is the `__gmp_binary_expr' stored within the -`__gmp_expr'). - - This way, the expression is actually evaluated only at the time of -assignment, when the required precision (that of `f') is known. -Furthermore the target `mpf_t' is now available, thus we can call -`mpf_add' directly with `f' as the output argument. - - Compound expressions are handled by defining operators taking -subexpressions as their arguments, like this: - - template - __gmp_expr - <__gmp_binary_expr<__gmp_expr, __gmp_expr, __gmp_binary_plus> > - operator+(const __gmp_expr &expr1, const __gmp_expr &expr2) - { - return __gmp_expr - <__gmp_binary_expr<__gmp_expr, __gmp_expr, __gmp_binary_plus> > - (expr1, expr2); - } - - And the corresponding specializations of `__gmp_expr::eval': - - template - void __gmp_expr - <__gmp_binary_expr<__gmp_expr, __gmp_expr, Op> >::eval - (mpf_t f, mp_bitcnt_t precision) - { - // declare two temporaries - mpf_class temp1(expr.val1, precision), temp2(expr.val2, precision); - Op::eval(f, temp1.get_mpf_t(), temp2.get_mpf_t()); - } - - The expression is thus recursively evaluated to any level of -complexity and all subexpressions are evaluated to the precision of `f'. - - -File: gmp.info, Node: Contributors, Next: References, Prev: Internals, Up: Top - -Appendix A Contributors -*********************** - -Torbjo"rn Granlund wrote the original GMP library and is still the main -developer. Code not explicitly attributed to others, was contributed by -Torbjo"rn. Several other individuals and organizations have contributed -GMP. Here is a list in chronological order on first contribution: - - Gunnar Sjo"din and Hans Riesel helped with mathematical problems in -early versions of the library. - - Richard Stallman helped with the interface design and revised the -first version of this manual. - - Brian Beuning and Doug Lea helped with testing of early versions of -the library and made creative suggestions. - - John Amanatides of York University in Canada contributed the function -`mpz_probab_prime_p'. - - Paul Zimmermann wrote the REDC-based mpz_powm code, the -Scho"nhage-Strassen FFT multiply code, and the Karatsuba square root -code. He also improved the Toom3 code for GMP 4.2. Paul sparked the -development of GMP 2, with his comparisons between bignum packages. -The ECMNET project Paul is organizing was a driving force behind many -of the optimizations in GMP 3. Paul also wrote the new GMP 4.3 nth -root code (with Torbjo"rn). - - Ken Weber (Kent State University, Universidade Federal do Rio Grande -do Sul) contributed now defunct versions of `mpz_gcd', `mpz_divexact', -`mpn_gcd', and `mpn_bdivmod', partially supported by CNPq (Brazil) -grant 301314194-2. - - Per Bothner of Cygnus Support helped to set up GMP to use Cygnus' -configure. He has also made valuable suggestions and tested numerous -intermediary releases. - - Joachim Hollman was involved in the design of the `mpf' interface, -and in the `mpz' design revisions for version 2. - - Bennet Yee contributed the initial versions of `mpz_jacobi' and -`mpz_legendre'. - - Andreas Schwab contributed the files `mpn/m68k/lshift.S' and -`mpn/m68k/rshift.S' (now in `.asm' form). - - Robert Harley of Inria, France and David Seal of ARM, England, -suggested clever improvements for population count. Robert also wrote -highly optimized Karatsuba and 3-way Toom multiplication functions for -GMP 3, and contributed the ARM assembly code. - - Torsten Ekedahl of the Mathematical department of Stockholm -University provided significant inspiration during several phases of -the GMP development. His mathematical expertise helped improve several -algorithms. - - Linus Nordberg wrote the new configure system based on autoconf and -implemented the new random functions. - - Kevin Ryde worked on a large number of things: optimized x86 code, -m4 asm macros, parameter tuning, speed measuring, the configure system, -function inlining, divisibility tests, bit scanning, Jacobi symbols, -Fibonacci and Lucas number functions, printf and scanf functions, perl -interface, demo expression parser, the algorithms chapter in the -manual, `gmpasm-mode.el', and various miscellaneous improvements -elsewhere. - - Kent Boortz made the Mac OS 9 port. - - Steve Root helped write the optimized alpha 21264 assembly code. - - Gerardo Ballabio wrote the `gmpxx.h' C++ class interface and the C++ -`istream' input routines. - - Jason Moxham rewrote `mpz_fac_ui'. - - Pedro Gimeno implemented the Mersenne Twister and made other random -number improvements. - - Niels Mo"ller wrote the sub-quadratic GCD and extended GCD code, the -quadratic Hensel division code, and (with Torbjo"rn) the new divide and -conquer division code for GMP 4.3. Niels also helped implement the new -Toom multiply code for GMP 4.3 and implemented helper functions to -simplify Toom evaluations for GMP 5.0. He wrote the original version -of mpn_mulmod_bnm1. - - Alberto Zanoni and Marco Bodrato suggested the unbalanced multiply -strategy, and found the optimal strategies for evaluation and -interpolation in Toom multiplication. - - Marco Bodrato helped implement the new Toom multiply code for GMP -4.3 and implemented most of the new Toom multiply and squaring code for -5.0. He is the main author of the current mpn_mulmod_bnm1 and -mpn_mullo_n. Marco also wrote the functions mpn_invert and -mpn_invertappr. - - David Harvey suggested the internal function `mpn_bdiv_dbm1', -implementing division relevant to Toom multiplication. He also worked -on fast assembly sequences, in particular on a fast AMD64 -`mpn_mul_basecase'. - - Martin Boij wrote `mpn_perfect_power_p'. - - (This list is chronological, not ordered after significance. If you -have contributed to GMP but are not listed above, please tell - about the omission!) - - The development of floating point functions of GNU MP 2, were -supported in part by the ESPRIT-BRA (Basic Research Activities) 6846 -project POSSO (POlynomial System SOlving). - - The development of GMP 2, 3, and 4 was supported in part by the IDA -Center for Computing Sciences. - - Thanks go to Hans Thorsen for donating an SGI system for the GMP -test system environment. - - -File: gmp.info, Node: References, Next: GNU Free Documentation License, Prev: Contributors, Up: Top - -Appendix B References -********************* - -B.1 Books -========= - - * Jonathan M. Borwein and Peter B. Borwein, "Pi and the AGM: A Study - in Analytic Number Theory and Computational Complexity", Wiley, - 1998. - - * Richard Crandall and Carl Pomerance, "Prime Numbers: A - Computational Perspective", 2nd edition, Springer-Verlag, 2005. - `http://math.dartmouth.edu/~carlp/' - - * Henri Cohen, "A Course in Computational Algebraic Number Theory", - Graduate Texts in Mathematics number 138, Springer-Verlag, 1993. - `http://www.math.u-bordeaux.fr/~cohen/' - - * Donald E. Knuth, "The Art of Computer Programming", volume 2, - "Seminumerical Algorithms", 3rd edition, Addison-Wesley, 1998. - `http://www-cs-faculty.stanford.edu/~knuth/taocp.html' - - * John D. Lipson, "Elements of Algebra and Algebraic Computing", The - Benjamin Cummings Publishing Company Inc, 1981. - - * Alfred J. Menezes, Paul C. van Oorschot and Scott A. Vanstone, - "Handbook of Applied Cryptography", - `http://www.cacr.math.uwaterloo.ca/hac/' - - * Richard M. Stallman and the GCC Developer Community, "Using the - GNU Compiler Collection", Free Software Foundation, 2008, - available online `http://gcc.gnu.org/onlinedocs/', and in the GCC - package `ftp://ftp.gnu.org/gnu/gcc/' - -B.2 Papers -========== - - * Yves Bertot, Nicolas Magaud and Paul Zimmermann, "A Proof of GMP - Square Root", Journal of Automated Reasoning, volume 29, 2002, pp. - 225-252. Also available online as INRIA Research Report 4475, - June 2001, `http://www.inria.fr/rrrt/rr-4475.html' - - * Christoph Burnikel and Joachim Ziegler, "Fast Recursive Division", - Max-Planck-Institut fuer Informatik Research Report MPI-I-98-1-022, - `http://data.mpi-sb.mpg.de/internet/reports.nsf/NumberView/1998-1-022' - - * Torbjo"rn Granlund and Peter L. Montgomery, "Division by Invariant - Integers using Multiplication", in Proceedings of the SIGPLAN - PLDI'94 Conference, June 1994. Also available - `ftp://ftp.cwi.nl/pub/pmontgom/divcnst.psa4.gz' (and .psl.gz). - - * Niels Mo"ller and Torbjo"rn Granlund, "Improved division by - invariant integers", to appear. - - * Torbjo"rn Granlund and Niels Mo"ller, "Division of integers large - and small", to appear. - - * Tudor Jebelean, "An algorithm for exact division", Journal of - Symbolic Computation, volume 15, 1993, pp. 169-180. Research - report version available - `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1992/92-35.ps.gz' - - * Tudor Jebelean, "Exact Division with Karatsuba Complexity - - Extended Abstract", RISC-Linz technical report 96-31, - `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1996/96-31.ps.gz' - - * Tudor Jebelean, "Practical Integer Division with Karatsuba - Complexity", ISSAC 97, pp. 339-341. Technical report available - `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1996/96-29.ps.gz' - - * Tudor Jebelean, "A Generalization of the Binary GCD Algorithm", - ISSAC 93, pp. 111-116. Technical report version available - `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1993/93-01.ps.gz' - - * Tudor Jebelean, "A Double-Digit Lehmer-Euclid Algorithm for - Finding the GCD of Long Integers", Journal of Symbolic - Computation, volume 19, 1995, pp. 145-157. Technical report - version also available - `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1992/92-69.ps.gz' - - * Werner Krandick and Tudor Jebelean, "Bidirectional Exact Integer - Division", Journal of Symbolic Computation, volume 21, 1996, pp. - 441-455. Early technical report version also available - `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1994/94-50.ps.gz' - - * Makoto Matsumoto and Takuji Nishimura, "Mersenne Twister: A - 623-dimensionally equidistributed uniform pseudorandom number - generator", ACM Transactions on Modelling and Computer Simulation, - volume 8, January 1998, pp. 3-30. Available online - `http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/ARTICLES/mt.ps.gz' - (or .pdf) - - * R. Moenck and A. Borodin, "Fast Modular Transforms via Division", - Proceedings of the 13th Annual IEEE Symposium on Switching and - Automata Theory, October 1972, pp. 90-96. Reprinted as "Fast - Modular Transforms", Journal of Computer and System Sciences, - volume 8, number 3, June 1974, pp. 366-386. - - * Niels Mo"ller, "On Scho"nhage's algorithm and subquadratic integer - GCD computation", in Mathematics of Computation, volume 77, - January 2008, pp. 589-607. - - * Peter L. Montgomery, "Modular Multiplication Without Trial - Division", in Mathematics of Computation, volume 44, number 170, - April 1985. - - * Arnold Scho"nhage and Volker Strassen, "Schnelle Multiplikation - grosser Zahlen", Computing 7, 1971, pp. 281-292. - - * Kenneth Weber, "The accelerated integer GCD algorithm", ACM - Transactions on Mathematical Software, volume 21, number 1, March - 1995, pp. 111-122. - - * Paul Zimmermann, "Karatsuba Square Root", INRIA Research Report - 3805, November 1999, `http://www.inria.fr/rrrt/rr-3805.html' - - * Paul Zimmermann, "A Proof of GMP Fast Division and Square Root - Implementations", - `http://www.loria.fr/~zimmerma/papers/proof-div-sqrt.ps.gz' - - * Dan Zuras, "On Squaring and Multiplying Large Integers", ARITH-11: - IEEE Symposium on Computer Arithmetic, 1993, pp. 260 to 271. - Reprinted as "More on Multiplying and Squaring Large Integers", - IEEE Transactions on Computers, volume 43, number 8, August 1994, - pp. 899-908. - - -File: gmp.info, Node: GNU Free Documentation License, Next: Concept Index, Prev: References, Up: Top - -Appendix C GNU Free Documentation License -***************************************** - - Version 1.3, 3 November 2008 - - Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. - `http://fsf.org/' - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - 0. PREAMBLE - - The purpose of this License is to make a manual, textbook, or other - functional and useful document "free" in the sense of freedom: to - assure everyone the effective freedom to copy and redistribute it, - with or without modifying it, either commercially or - noncommercially. Secondarily, this License preserves for the - author and publisher a way to get credit for their work, while not - being considered responsible for modifications made by others. - - This License is a kind of "copyleft", which means that derivative - works of the document must themselves be free in the same sense. - It complements the GNU General Public License, which is a copyleft - license designed for free software. - - We have designed this License in order to use it for manuals for - free software, because free software needs free documentation: a - free program should come with manuals providing the same freedoms - that the software does. But this License is not limited to - software manuals; it can be used for any textual work, regardless - of subject matter or whether it is published as a printed book. - We recommend this License principally for works whose purpose is - instruction or reference. - - 1. APPLICABILITY AND DEFINITIONS - - This License applies to any manual or other work, in any medium, - that contains a notice placed by the copyright holder saying it - can be distributed under the terms of this License. Such a notice - grants a world-wide, royalty-free license, unlimited in duration, - to use that work under the conditions stated herein. The - "Document", below, refers to any such manual or work. Any member - of the public is a licensee, and is addressed as "you". You - accept the license if you copy, modify or distribute the work in a - way requiring permission under copyright law. - - A "Modified Version" of the Document means any work containing the - Document or a portion of it, either copied verbatim, or with - modifications and/or translated into another language. - - A "Secondary Section" is a named appendix or a front-matter section - of the Document that deals exclusively with the relationship of the - publishers or authors of the Document to the Document's overall - subject (or to related matters) and contains nothing that could - fall directly within that overall subject. (Thus, if the Document - is in part a textbook of mathematics, a Secondary Section may not - explain any mathematics.) The relationship could be a matter of - historical connection with the subject or with related matters, or - of legal, commercial, philosophical, ethical or political position - regarding them. - - The "Invariant Sections" are certain Secondary Sections whose - titles are designated, as being those of Invariant Sections, in - the notice that says that the Document is released under this - License. If a section does not fit the above definition of - Secondary then it is not allowed to be designated as Invariant. - The Document may contain zero Invariant Sections. If the Document - does not identify any Invariant Sections then there are none. - - The "Cover Texts" are certain short passages of text that are - listed, as Front-Cover Texts or Back-Cover Texts, in the notice - that says that the Document is released under this License. A - Front-Cover Text may be at most 5 words, and a Back-Cover Text may - be at most 25 words. - - A "Transparent" copy of the Document means a machine-readable copy, - represented in a format whose specification is available to the - general public, that is suitable for revising the document - straightforwardly with generic text editors or (for images - composed of pixels) generic paint programs or (for drawings) some - widely available drawing editor, and that is suitable for input to - text formatters or for automatic translation to a variety of - formats suitable for input to text formatters. A copy made in an - otherwise Transparent file format whose markup, or absence of - markup, has been arranged to thwart or discourage subsequent - modification by readers is not Transparent. An image format is - not Transparent if used for any substantial amount of text. A - copy that is not "Transparent" is called "Opaque". - - Examples of suitable formats for Transparent copies include plain - ASCII without markup, Texinfo input format, LaTeX input format, - SGML or XML using a publicly available DTD, and - standard-conforming simple HTML, PostScript or PDF designed for - human modification. Examples of transparent image formats include - PNG, XCF and JPG. Opaque formats include proprietary formats that - can be read and edited only by proprietary word processors, SGML or - XML for which the DTD and/or processing tools are not generally - available, and the machine-generated HTML, PostScript or PDF - produced by some word processors for output purposes only. - - The "Title Page" means, for a printed book, the title page itself, - plus such following pages as are needed to hold, legibly, the - material this License requires to appear in the title page. For - works in formats which do not have any title page as such, "Title - Page" means the text near the most prominent appearance of the - work's title, preceding the beginning of the body of the text. - - The "publisher" means any person or entity that distributes copies - of the Document to the public. - - A section "Entitled XYZ" means a named subunit of the Document - whose title either is precisely XYZ or contains XYZ in parentheses - following text that translates XYZ in another language. (Here XYZ - stands for a specific section name mentioned below, such as - "Acknowledgements", "Dedications", "Endorsements", or "History".) - To "Preserve the Title" of such a section when you modify the - Document means that it remains a section "Entitled XYZ" according - to this definition. - - The Document may include Warranty Disclaimers next to the notice - which states that this License applies to the Document. These - Warranty Disclaimers are considered to be included by reference in - this License, but only as regards disclaiming warranties: any other - implication that these Warranty Disclaimers may have is void and - has no effect on the meaning of this License. - - 2. VERBATIM COPYING - - You may copy and distribute the Document in any medium, either - commercially or noncommercially, provided that this License, the - copyright notices, and the license notice saying this License - applies to the Document are reproduced in all copies, and that you - add no other conditions whatsoever to those of this License. You - may not use technical measures to obstruct or control the reading - or further copying of the copies you make or distribute. However, - you may accept compensation in exchange for copies. If you - distribute a large enough number of copies you must also follow - the conditions in section 3. - - You may also lend copies, under the same conditions stated above, - and you may publicly display copies. - - 3. COPYING IN QUANTITY - - If you publish printed copies (or copies in media that commonly - have printed covers) of the Document, numbering more than 100, and - the Document's license notice requires Cover Texts, you must - enclose the copies in covers that carry, clearly and legibly, all - these Cover Texts: Front-Cover Texts on the front cover, and - Back-Cover Texts on the back cover. Both covers must also clearly - and legibly identify you as the publisher of these copies. The - front cover must present the full title with all words of the - title equally prominent and visible. You may add other material - on the covers in addition. Copying with changes limited to the - covers, as long as they preserve the title of the Document and - satisfy these conditions, can be treated as verbatim copying in - other respects. - - If the required texts for either cover are too voluminous to fit - legibly, you should put the first ones listed (as many as fit - reasonably) on the actual cover, and continue the rest onto - adjacent pages. - - If you publish or distribute Opaque copies of the Document - numbering more than 100, you must either include a - machine-readable Transparent copy along with each Opaque copy, or - state in or with each Opaque copy a computer-network location from - which the general network-using public has access to download - using public-standard network protocols a complete Transparent - copy of the Document, free of added material. If you use the - latter option, you must take reasonably prudent steps, when you - begin distribution of Opaque copies in quantity, to ensure that - this Transparent copy will remain thus accessible at the stated - location until at least one year after the last time you - distribute an Opaque copy (directly or through your agents or - retailers) of that edition to the public. - - It is requested, but not required, that you contact the authors of - the Document well before redistributing any large number of - copies, to give them a chance to provide you with an updated - version of the Document. - - 4. MODIFICATIONS - - You may copy and distribute a Modified Version of the Document - under the conditions of sections 2 and 3 above, provided that you - release the Modified Version under precisely this License, with - the Modified Version filling the role of the Document, thus - licensing distribution and modification of the Modified Version to - whoever possesses a copy of it. In addition, you must do these - things in the Modified Version: - - A. Use in the Title Page (and on the covers, if any) a title - distinct from that of the Document, and from those of - previous versions (which should, if there were any, be listed - in the History section of the Document). You may use the - same title as a previous version if the original publisher of - that version gives permission. - - B. List on the Title Page, as authors, one or more persons or - entities responsible for authorship of the modifications in - the Modified Version, together with at least five of the - principal authors of the Document (all of its principal - authors, if it has fewer than five), unless they release you - from this requirement. - - C. State on the Title page the name of the publisher of the - Modified Version, as the publisher. - - D. Preserve all the copyright notices of the Document. - - E. Add an appropriate copyright notice for your modifications - adjacent to the other copyright notices. - - F. Include, immediately after the copyright notices, a license - notice giving the public permission to use the Modified - Version under the terms of this License, in the form shown in - the Addendum below. - - G. Preserve in that license notice the full lists of Invariant - Sections and required Cover Texts given in the Document's - license notice. - - H. Include an unaltered copy of this License. - - I. Preserve the section Entitled "History", Preserve its Title, - and add to it an item stating at least the title, year, new - authors, and publisher of the Modified Version as given on - the Title Page. If there is no section Entitled "History" in - the Document, create one stating the title, year, authors, - and publisher of the Document as given on its Title Page, - then add an item describing the Modified Version as stated in - the previous sentence. - - J. Preserve the network location, if any, given in the Document - for public access to a Transparent copy of the Document, and - likewise the network locations given in the Document for - previous versions it was based on. These may be placed in - the "History" section. You may omit a network location for a - work that was published at least four years before the - Document itself, or if the original publisher of the version - it refers to gives permission. - - K. For any section Entitled "Acknowledgements" or "Dedications", - Preserve the Title of the section, and preserve in the - section all the substance and tone of each of the contributor - acknowledgements and/or dedications given therein. - - L. Preserve all the Invariant Sections of the Document, - unaltered in their text and in their titles. Section numbers - or the equivalent are not considered part of the section - titles. - - M. Delete any section Entitled "Endorsements". Such a section - may not be included in the Modified Version. - - N. Do not retitle any existing section to be Entitled - "Endorsements" or to conflict in title with any Invariant - Section. - - O. Preserve any Warranty Disclaimers. - - If the Modified Version includes new front-matter sections or - appendices that qualify as Secondary Sections and contain no - material copied from the Document, you may at your option - designate some or all of these sections as invariant. To do this, - add their titles to the list of Invariant Sections in the Modified - Version's license notice. These titles must be distinct from any - other section titles. - - You may add a section Entitled "Endorsements", provided it contains - nothing but endorsements of your Modified Version by various - parties--for example, statements of peer review or that the text - has been approved by an organization as the authoritative - definition of a standard. - - You may add a passage of up to five words as a Front-Cover Text, - and a passage of up to 25 words as a Back-Cover Text, to the end - of the list of Cover Texts in the Modified Version. Only one - passage of Front-Cover Text and one of Back-Cover Text may be - added by (or through arrangements made by) any one entity. If the - Document already includes a cover text for the same cover, - previously added by you or by arrangement made by the same entity - you are acting on behalf of, you may not add another; but you may - replace the old one, on explicit permission from the previous - publisher that added the old one. - - The author(s) and publisher(s) of the Document do not by this - License give permission to use their names for publicity for or to - assert or imply endorsement of any Modified Version. - - 5. COMBINING DOCUMENTS - - You may combine the Document with other documents released under - this License, under the terms defined in section 4 above for - modified versions, provided that you include in the combination - all of the Invariant Sections of all of the original documents, - unmodified, and list them all as Invariant Sections of your - combined work in its license notice, and that you preserve all - their Warranty Disclaimers. - - The combined work need only contain one copy of this License, and - multiple identical Invariant Sections may be replaced with a single - copy. If there are multiple Invariant Sections with the same name - but different contents, make the title of each such section unique - by adding at the end of it, in parentheses, the name of the - original author or publisher of that section if known, or else a - unique number. Make the same adjustment to the section titles in - the list of Invariant Sections in the license notice of the - combined work. - - In the combination, you must combine any sections Entitled - "History" in the various original documents, forming one section - Entitled "History"; likewise combine any sections Entitled - "Acknowledgements", and any sections Entitled "Dedications". You - must delete all sections Entitled "Endorsements." - - 6. COLLECTIONS OF DOCUMENTS - - You may make a collection consisting of the Document and other - documents released under this License, and replace the individual - copies of this License in the various documents with a single copy - that is included in the collection, provided that you follow the - rules of this License for verbatim copying of each of the - documents in all other respects. - - You may extract a single document from such a collection, and - distribute it individually under this License, provided you insert - a copy of this License into the extracted document, and follow - this License in all other respects regarding verbatim copying of - that document. - - 7. AGGREGATION WITH INDEPENDENT WORKS - - A compilation of the Document or its derivatives with other - separate and independent documents or works, in or on a volume of - a storage or distribution medium, is called an "aggregate" if the - copyright resulting from the compilation is not used to limit the - legal rights of the compilation's users beyond what the individual - works permit. When the Document is included in an aggregate, this - License does not apply to the other works in the aggregate which - are not themselves derivative works of the Document. - - If the Cover Text requirement of section 3 is applicable to these - copies of the Document, then if the Document is less than one half - of the entire aggregate, the Document's Cover Texts may be placed - on covers that bracket the Document within the aggregate, or the - electronic equivalent of covers if the Document is in electronic - form. Otherwise they must appear on printed covers that bracket - the whole aggregate. - - 8. TRANSLATION - - Translation is considered a kind of modification, so you may - distribute translations of the Document under the terms of section - 4. Replacing Invariant Sections with translations requires special - permission from their copyright holders, but you may include - translations of some or all Invariant Sections in addition to the - original versions of these Invariant Sections. You may include a - translation of this License, and all the license notices in the - Document, and any Warranty Disclaimers, provided that you also - include the original English version of this License and the - original versions of those notices and disclaimers. In case of a - disagreement between the translation and the original version of - this License or a notice or disclaimer, the original version will - prevail. - - If a section in the Document is Entitled "Acknowledgements", - "Dedications", or "History", the requirement (section 4) to - Preserve its Title (section 1) will typically require changing the - actual title. - - 9. TERMINATION - - You may not copy, modify, sublicense, or distribute the Document - except as expressly provided under this License. Any attempt - otherwise to copy, modify, sublicense, or distribute it is void, - and will automatically terminate your rights under this License. - - However, if you cease all violation of this License, then your - license from a particular copyright holder is reinstated (a) - provisionally, unless and until the copyright holder explicitly - and finally terminates your license, and (b) permanently, if the - copyright holder fails to notify you of the violation by some - reasonable means prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is - reinstated permanently if the copyright holder notifies you of the - violation by some reasonable means, this is the first time you have - received notice of violation of this License (for any work) from - that copyright holder, and you cure the violation prior to 30 days - after your receipt of the notice. - - Termination of your rights under this section does not terminate - the licenses of parties who have received copies or rights from - you under this License. If your rights have been terminated and - not permanently reinstated, receipt of a copy of some or all of - the same material does not give you any rights to use it. - - 10. FUTURE REVISIONS OF THIS LICENSE - - The Free Software Foundation may publish new, revised versions of - the GNU Free Documentation License from time to time. Such new - versions will be similar in spirit to the present version, but may - differ in detail to address new problems or concerns. See - `http://www.gnu.org/copyleft/'. - - Each version of the License is given a distinguishing version - number. If the Document specifies that a particular numbered - version of this License "or any later version" applies to it, you - have the option of following the terms and conditions either of - that specified version or of any later version that has been - published (not as a draft) by the Free Software Foundation. If - the Document does not specify a version number of this License, - you may choose any version ever published (not as a draft) by the - Free Software Foundation. If the Document specifies that a proxy - can decide which future versions of this License can be used, that - proxy's public statement of acceptance of a version permanently - authorizes you to choose that version for the Document. - - 11. RELICENSING - - "Massive Multiauthor Collaboration Site" (or "MMC Site") means any - World Wide Web server that publishes copyrightable works and also - provides prominent facilities for anybody to edit those works. A - public wiki that anybody can edit is an example of such a server. - A "Massive Multiauthor Collaboration" (or "MMC") contained in the - site means any set of copyrightable works thus published on the MMC - site. - - "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 - license published by Creative Commons Corporation, a not-for-profit - corporation with a principal place of business in San Francisco, - California, as well as future copyleft versions of that license - published by that same organization. - - "Incorporate" means to publish or republish a Document, in whole or - in part, as part of another Document. - - An MMC is "eligible for relicensing" if it is licensed under this - License, and if all works that were first published under this - License somewhere other than this MMC, and subsequently - incorporated in whole or in part into the MMC, (1) had no cover - texts or invariant sections, and (2) were thus incorporated prior - to November 1, 2008. - - The operator of an MMC Site may republish an MMC contained in the - site under CC-BY-SA on the same site at any time before August 1, - 2009, provided the MMC is eligible for relicensing. - - -ADDENDUM: How to use this License for your documents -==================================================== - -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and license -notices just after the title page: - - Copyright (C) YEAR YOUR NAME. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.3 - or any later version published by the Free Software Foundation; - with no Invariant Sections, no Front-Cover Texts, and no Back-Cover - Texts. A copy of the license is included in the section entitled ``GNU - Free Documentation License''. - - If you have Invariant Sections, Front-Cover Texts and Back-Cover -Texts, replace the "with...Texts." line with this: - - with the Invariant Sections being LIST THEIR TITLES, with - the Front-Cover Texts being LIST, and with the Back-Cover Texts - being LIST. - - If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. - - If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, to -permit their use in free software. - - -File: gmp.info, Node: Concept Index, Next: Function Index, Prev: GNU Free Documentation License, Up: Top - -Concept Index -************* - -[index] -* Menu: - -* #include: Headers and Libraries. - (line 6) -* --build: Build Options. (line 52) -* --disable-fft: Build Options. (line 317) -* --disable-shared: Build Options. (line 45) -* --disable-static: Build Options. (line 45) -* --enable-alloca: Build Options. (line 278) -* --enable-assert: Build Options. (line 327) -* --enable-cxx: Build Options. (line 230) -* --enable-fat: Build Options. (line 164) -* --enable-mpbsd: Build Options. (line 322) -* --enable-profiling <1>: Profiling. (line 6) -* --enable-profiling: Build Options. (line 331) -* --exec-prefix: Build Options. (line 32) -* --host: Build Options. (line 66) -* --prefix: Build Options. (line 32) -* -finstrument-functions: Profiling. (line 66) -* 2exp functions: Efficiency. (line 43) -* 68000: Notes for Particular Systems. - (line 80) -* 80x86: Notes for Particular Systems. - (line 126) -* ABI <1>: Build Options. (line 171) -* ABI: ABI and ISA. (line 6) -* About this manual: Introduction to GMP. (line 58) -* AC_CHECK_LIB: Autoconf. (line 11) -* AIX <1>: ABI and ISA. (line 184) -* AIX <2>: Notes for Particular Systems. - (line 7) -* AIX: ABI and ISA. (line 169) -* Algorithms: Algorithms. (line 6) -* alloca: Build Options. (line 278) -* Allocation of memory: Custom Allocation. (line 6) -* AMD64: ABI and ISA. (line 44) -* Anonymous FTP of latest version: Introduction to GMP. (line 38) -* Application Binary Interface: ABI and ISA. (line 6) -* Arithmetic functions <1>: Float Arithmetic. (line 6) -* Arithmetic functions <2>: Integer Arithmetic. (line 6) -* Arithmetic functions: Rational Arithmetic. (line 6) -* ARM: Notes for Particular Systems. - (line 20) -* Assembly cache handling: Assembly Cache Handling. - (line 6) -* Assembly carry propagation: Assembly Carry Propagation. - (line 6) -* Assembly code organisation: Assembly Code Organisation. - (line 6) -* Assembly coding: Assembly Coding. (line 6) -* Assembly floating Point: Assembly Floating Point. - (line 6) -* Assembly loop unrolling: Assembly Loop Unrolling. - (line 6) -* Assembly SIMD: Assembly SIMD Instructions. - (line 6) -* Assembly software pipelining: Assembly Software Pipelining. - (line 6) -* Assembly writing guide: Assembly Writing Guide. - (line 6) -* Assertion checking <1>: Debugging. (line 79) -* Assertion checking: Build Options. (line 327) -* Assignment functions <1>: Assigning Floats. (line 6) -* Assignment functions <2>: Initializing Rationals. - (line 6) -* Assignment functions <3>: Simultaneous Integer Init & Assign. - (line 6) -* Assignment functions <4>: Simultaneous Float Init & Assign. - (line 6) -* Assignment functions: Assigning Integers. (line 6) -* Autoconf: Autoconf. (line 6) -* Basics: GMP Basics. (line 6) -* Berkeley MP compatible functions <1>: Build Options. (line 322) -* Berkeley MP compatible functions: BSD Compatible Functions. - (line 6) -* Binomial coefficient algorithm: Binomial Coefficients Algorithm. - (line 6) -* Binomial coefficient functions: Number Theoretic Functions. - (line 100) -* Binutils strip: Known Build Problems. - (line 28) -* Bit manipulation functions: Integer Logic and Bit Fiddling. - (line 6) -* Bit scanning functions: Integer Logic and Bit Fiddling. - (line 38) -* Bit shift left: Integer Arithmetic. (line 35) -* Bit shift right: Integer Division. (line 53) -* Bits per limb: Useful Macros and Constants. - (line 7) -* BSD MP compatible functions <1>: Build Options. (line 322) -* BSD MP compatible functions: BSD Compatible Functions. - (line 6) -* Bug reporting: Reporting Bugs. (line 6) -* Build directory: Build Options. (line 19) -* Build notes for binary packaging: Notes for Package Builds. - (line 6) -* Build notes for particular systems: Notes for Particular Systems. - (line 6) -* Build options: Build Options. (line 6) -* Build problems known: Known Build Problems. - (line 6) -* Build system: Build Options. (line 52) -* Building GMP: Installing GMP. (line 6) -* Bus error: Debugging. (line 7) -* C compiler: Build Options. (line 182) -* C++ compiler: Build Options. (line 254) -* C++ interface: C++ Class Interface. (line 6) -* C++ interface internals: C++ Interface Internals. - (line 6) -* C++ istream input: C++ Formatted Input. (line 6) -* C++ ostream output: C++ Formatted Output. - (line 6) -* C++ support: Build Options. (line 230) -* CC: Build Options. (line 182) -* CC_FOR_BUILD: Build Options. (line 217) -* CFLAGS: Build Options. (line 182) -* Checker: Debugging. (line 115) -* checkergcc: Debugging. (line 122) -* Code organisation: Assembly Code Organisation. - (line 6) -* Compaq C++: Notes for Particular Systems. - (line 25) -* Comparison functions <1>: Integer Comparisons. (line 6) -* Comparison functions <2>: Comparing Rationals. (line 6) -* Comparison functions: Float Comparison. (line 6) -* Compatibility with older versions: Compatibility with older versions. - (line 6) -* Conditions for copying GNU MP: Copying. (line 6) -* Configuring GMP: Installing GMP. (line 6) -* Congruence algorithm: Exact Remainder. (line 29) -* Congruence functions: Integer Division. (line 124) -* Constants: Useful Macros and Constants. - (line 6) -* Contributors: Contributors. (line 6) -* Conventions for parameters: Parameter Conventions. - (line 6) -* Conventions for variables: Variable Conventions. - (line 6) -* Conversion functions <1>: Converting Integers. (line 6) -* Conversion functions <2>: Converting Floats. (line 6) -* Conversion functions: Rational Conversions. - (line 6) -* Copying conditions: Copying. (line 6) -* CPPFLAGS: Build Options. (line 208) -* CPU types <1>: Introduction to GMP. (line 24) -* CPU types: Build Options. (line 108) -* Cross compiling: Build Options. (line 66) -* Custom allocation: Custom Allocation. (line 6) -* CXX: Build Options. (line 254) -* CXXFLAGS: Build Options. (line 254) -* Cygwin: Notes for Particular Systems. - (line 43) -* Darwin: Known Build Problems. - (line 51) -* Debugging: Debugging. (line 6) -* Demonstration programs: Demonstration Programs. - (line 6) -* Digits in an integer: Miscellaneous Integer Functions. - (line 23) -* Divisibility algorithm: Exact Remainder. (line 29) -* Divisibility functions: Integer Division. (line 124) -* Divisibility testing: Efficiency. (line 91) -* Division algorithms: Division Algorithms. (line 6) -* Division functions <1>: Rational Arithmetic. (line 22) -* Division functions <2>: Integer Division. (line 6) -* Division functions: Float Arithmetic. (line 33) -* DJGPP <1>: Notes for Particular Systems. - (line 43) -* DJGPP: Known Build Problems. - (line 18) -* DLLs: Notes for Particular Systems. - (line 56) -* DocBook: Build Options. (line 354) -* Documentation formats: Build Options. (line 347) -* Documentation license: GNU Free Documentation License. - (line 6) -* DVI: Build Options. (line 350) -* Efficiency: Efficiency. (line 6) -* Emacs: Emacs. (line 6) -* Exact division functions: Integer Division. (line 102) -* Exact remainder: Exact Remainder. (line 6) -* Example programs: Demonstration Programs. - (line 6) -* Exec prefix: Build Options. (line 32) -* Execution profiling <1>: Profiling. (line 6) -* Execution profiling: Build Options. (line 331) -* Exponentiation functions <1>: Integer Exponentiation. - (line 6) -* Exponentiation functions: Float Arithmetic. (line 41) -* Export: Integer Import and Export. - (line 45) -* Expression parsing demo: Demonstration Programs. - (line 18) -* Extended GCD: Number Theoretic Functions. - (line 45) -* Factor removal functions: Number Theoretic Functions. - (line 90) -* Factorial algorithm: Factorial Algorithm. (line 6) -* Factorial functions: Number Theoretic Functions. - (line 95) -* Factorization demo: Demonstration Programs. - (line 25) -* Fast Fourier Transform: FFT Multiplication. (line 6) -* Fat binary: Build Options. (line 164) -* FFT multiplication <1>: FFT Multiplication. (line 6) -* FFT multiplication: Build Options. (line 317) -* Fibonacci number algorithm: Fibonacci Numbers Algorithm. - (line 6) -* Fibonacci sequence functions: Number Theoretic Functions. - (line 108) -* Float arithmetic functions: Float Arithmetic. (line 6) -* Float assignment functions <1>: Simultaneous Float Init & Assign. - (line 6) -* Float assignment functions: Assigning Floats. (line 6) -* Float comparison functions: Float Comparison. (line 6) -* Float conversion functions: Converting Floats. (line 6) -* Float functions: Floating-point Functions. - (line 6) -* Float initialization functions <1>: Simultaneous Float Init & Assign. - (line 6) -* Float initialization functions: Initializing Floats. (line 6) -* Float input and output functions: I/O of Floats. (line 6) -* Float internals: Float Internals. (line 6) -* Float miscellaneous functions: Miscellaneous Float Functions. - (line 6) -* Float random number functions: Miscellaneous Float Functions. - (line 27) -* Float rounding functions: Miscellaneous Float Functions. - (line 9) -* Float sign tests: Float Comparison. (line 33) -* Floating point mode: Notes for Particular Systems. - (line 34) -* Floating-point functions: Floating-point Functions. - (line 6) -* Floating-point number: Nomenclature and Types. - (line 21) -* fnccheck: Profiling. (line 77) -* Formatted input: Formatted Input. (line 6) -* Formatted output: Formatted Output. (line 6) -* Free Documentation License: GNU Free Documentation License. - (line 6) -* frexp <1>: Converting Floats. (line 23) -* frexp: Converting Integers. (line 42) -* FTP of latest version: Introduction to GMP. (line 38) -* Function classes: Function Classes. (line 6) -* FunctionCheck: Profiling. (line 77) -* GCC Checker: Debugging. (line 115) -* GCD algorithms: Greatest Common Divisor Algorithms. - (line 6) -* GCD extended: Number Theoretic Functions. - (line 45) -* GCD functions: Number Theoretic Functions. - (line 30) -* GDB: Debugging. (line 58) -* Generic C: Build Options. (line 153) -* GMP Perl module: Demonstration Programs. - (line 35) -* GMP version number: Useful Macros and Constants. - (line 12) -* gmp.h: Headers and Libraries. - (line 6) -* gmpxx.h: C++ Interface General. - (line 8) -* GNU Debugger: Debugging. (line 58) -* GNU Free Documentation License: GNU Free Documentation License. - (line 6) -* GNU strip: Known Build Problems. - (line 28) -* gprof: Profiling. (line 41) -* Greatest common divisor algorithms: Greatest Common Divisor Algorithms. - (line 6) -* Greatest common divisor functions: Number Theoretic Functions. - (line 30) -* Hardware floating point mode: Notes for Particular Systems. - (line 34) -* Headers: Headers and Libraries. - (line 6) -* Heap problems: Debugging. (line 24) -* Home page: Introduction to GMP. (line 34) -* Host system: Build Options. (line 66) -* HP-UX: ABI and ISA. (line 107) -* HPPA: ABI and ISA. (line 68) -* I/O functions <1>: I/O of Integers. (line 6) -* I/O functions <2>: I/O of Rationals. (line 6) -* I/O functions: I/O of Floats. (line 6) -* i386: Notes for Particular Systems. - (line 126) -* IA-64: ABI and ISA. (line 107) -* Import: Integer Import and Export. - (line 11) -* In-place operations: Efficiency. (line 57) -* Include files: Headers and Libraries. - (line 6) -* info-lookup-symbol: Emacs. (line 6) -* Initialization functions <1>: Initializing Integers. - (line 6) -* Initialization functions <2>: Initializing Rationals. - (line 6) -* Initialization functions <3>: Random State Initialization. - (line 6) -* Initialization functions <4>: Simultaneous Float Init & Assign. - (line 6) -* Initialization functions <5>: Simultaneous Integer Init & Assign. - (line 6) -* Initialization functions: Initializing Floats. (line 6) -* Initializing and clearing: Efficiency. (line 21) -* Input functions <1>: I/O of Integers. (line 6) -* Input functions <2>: I/O of Rationals. (line 6) -* Input functions <3>: I/O of Floats. (line 6) -* Input functions: Formatted Input Functions. - (line 6) -* Install prefix: Build Options. (line 32) -* Installing GMP: Installing GMP. (line 6) -* Instruction Set Architecture: ABI and ISA. (line 6) -* instrument-functions: Profiling. (line 66) -* Integer: Nomenclature and Types. - (line 6) -* Integer arithmetic functions: Integer Arithmetic. (line 6) -* Integer assignment functions <1>: Simultaneous Integer Init & Assign. - (line 6) -* Integer assignment functions: Assigning Integers. (line 6) -* Integer bit manipulation functions: Integer Logic and Bit Fiddling. - (line 6) -* Integer comparison functions: Integer Comparisons. (line 6) -* Integer conversion functions: Converting Integers. (line 6) -* Integer division functions: Integer Division. (line 6) -* Integer exponentiation functions: Integer Exponentiation. - (line 6) -* Integer export: Integer Import and Export. - (line 45) -* Integer functions: Integer Functions. (line 6) -* Integer import: Integer Import and Export. - (line 11) -* Integer initialization functions <1>: Simultaneous Integer Init & Assign. - (line 6) -* Integer initialization functions: Initializing Integers. - (line 6) -* Integer input and output functions: I/O of Integers. (line 6) -* Integer internals: Integer Internals. (line 6) -* Integer logical functions: Integer Logic and Bit Fiddling. - (line 6) -* Integer miscellaneous functions: Miscellaneous Integer Functions. - (line 6) -* Integer random number functions: Integer Random Numbers. - (line 6) -* Integer root functions: Integer Roots. (line 6) -* Integer sign tests: Integer Comparisons. (line 28) -* Integer special functions: Integer Special Functions. - (line 6) -* Interix: Notes for Particular Systems. - (line 51) -* Internals: Internals. (line 6) -* Introduction: Introduction to GMP. (line 6) -* Inverse modulo functions: Number Theoretic Functions. - (line 60) -* IRIX <1>: Known Build Problems. - (line 38) -* IRIX: ABI and ISA. (line 132) -* ISA: ABI and ISA. (line 6) -* istream input: C++ Formatted Input. (line 6) -* Jacobi symbol algorithm: Jacobi Symbol. (line 6) -* Jacobi symbol functions: Number Theoretic Functions. - (line 66) -* Karatsuba multiplication: Karatsuba Multiplication. - (line 6) -* Karatsuba square root algorithm: Square Root Algorithm. - (line 6) -* Kronecker symbol functions: Number Theoretic Functions. - (line 78) -* Language bindings: Language Bindings. (line 6) -* Latest version of GMP: Introduction to GMP. (line 38) -* LCM functions: Number Theoretic Functions. - (line 55) -* Least common multiple functions: Number Theoretic Functions. - (line 55) -* Legendre symbol functions: Number Theoretic Functions. - (line 69) -* libgmp: Headers and Libraries. - (line 22) -* libgmpxx: Headers and Libraries. - (line 27) -* Libraries: Headers and Libraries. - (line 22) -* Libtool: Headers and Libraries. - (line 33) -* Libtool versioning: Notes for Package Builds. - (line 9) -* License conditions: Copying. (line 6) -* Limb: Nomenclature and Types. - (line 31) -* Limb size: Useful Macros and Constants. - (line 7) -* Linear congruential algorithm: Random Number Algorithms. - (line 25) -* Linear congruential random numbers: Random State Initialization. - (line 32) -* Linking: Headers and Libraries. - (line 22) -* Logical functions: Integer Logic and Bit Fiddling. - (line 6) -* Low-level functions: Low-level Functions. (line 6) -* Lucas number algorithm: Lucas Numbers Algorithm. - (line 6) -* Lucas number functions: Number Theoretic Functions. - (line 119) -* MacOS X: Known Build Problems. - (line 51) -* Mailing lists: Introduction to GMP. (line 45) -* Malloc debugger: Debugging. (line 30) -* Malloc problems: Debugging. (line 24) -* Memory allocation: Custom Allocation. (line 6) -* Memory management: Memory Management. (line 6) -* Mersenne twister algorithm: Random Number Algorithms. - (line 17) -* Mersenne twister random numbers: Random State Initialization. - (line 13) -* MINGW: Notes for Particular Systems. - (line 43) -* MIPS: ABI and ISA. (line 132) -* Miscellaneous float functions: Miscellaneous Float Functions. - (line 6) -* Miscellaneous integer functions: Miscellaneous Integer Functions. - (line 6) -* MMX: Notes for Particular Systems. - (line 132) -* Modular inverse functions: Number Theoretic Functions. - (line 60) -* Most significant bit: Miscellaneous Integer Functions. - (line 34) -* mp.h: BSD Compatible Functions. - (line 21) -* MPN_PATH: Build Options. (line 335) -* MS Windows: Notes for Particular Systems. - (line 56) -* MS-DOS: Notes for Particular Systems. - (line 43) -* Multi-threading: Reentrancy. (line 6) -* Multiplication algorithms: Multiplication Algorithms. - (line 6) -* Nails: Low-level Functions. (line 478) -* Native compilation: Build Options. (line 52) -* NeXT: Known Build Problems. - (line 57) -* Next prime function: Number Theoretic Functions. - (line 23) -* Nomenclature: Nomenclature and Types. - (line 6) -* Non-Unix systems: Build Options. (line 11) -* Nth root algorithm: Nth Root Algorithm. (line 6) -* Number sequences: Efficiency. (line 147) -* Number theoretic functions: Number Theoretic Functions. - (line 6) -* Numerator and denominator: Applying Integer Functions. - (line 6) -* obstack output: Formatted Output Functions. - (line 81) -* OpenBSD: Notes for Particular Systems. - (line 86) -* Optimizing performance: Performance optimization. - (line 6) -* ostream output: C++ Formatted Output. - (line 6) -* Other languages: Language Bindings. (line 6) -* Output functions <1>: I/O of Floats. (line 6) -* Output functions <2>: I/O of Rationals. (line 6) -* Output functions <3>: Formatted Output Functions. - (line 6) -* Output functions: I/O of Integers. (line 6) -* Packaged builds: Notes for Package Builds. - (line 6) -* Parameter conventions: Parameter Conventions. - (line 6) -* Parsing expressions demo: Demonstration Programs. - (line 21) -* Particular systems: Notes for Particular Systems. - (line 6) -* Past GMP versions: Compatibility with older versions. - (line 6) -* PDF: Build Options. (line 350) -* Perfect power algorithm: Perfect Power Algorithm. - (line 6) -* Perfect power functions: Integer Roots. (line 27) -* Perfect square algorithm: Perfect Square Algorithm. - (line 6) -* Perfect square functions: Integer Roots. (line 36) -* perl: Demonstration Programs. - (line 35) -* Perl module: Demonstration Programs. - (line 35) -* Postscript: Build Options. (line 350) -* Power/PowerPC <1>: Known Build Problems. - (line 63) -* Power/PowerPC: Notes for Particular Systems. - (line 92) -* Powering algorithms: Powering Algorithms. (line 6) -* Powering functions <1>: Float Arithmetic. (line 41) -* Powering functions: Integer Exponentiation. - (line 6) -* PowerPC: ABI and ISA. (line 167) -* Precision of floats: Floating-point Functions. - (line 6) -* Precision of hardware floating point: Notes for Particular Systems. - (line 34) -* Prefix: Build Options. (line 32) -* Prime testing algorithms: Prime Testing Algorithm. - (line 6) -* Prime testing functions: Number Theoretic Functions. - (line 7) -* printf formatted output: Formatted Output. (line 6) -* Probable prime testing functions: Number Theoretic Functions. - (line 7) -* prof: Profiling. (line 24) -* Profiling: Profiling. (line 6) -* Radix conversion algorithms: Radix Conversion Algorithms. - (line 6) -* Random number algorithms: Random Number Algorithms. - (line 6) -* Random number functions <1>: Integer Random Numbers. - (line 6) -* Random number functions <2>: Miscellaneous Float Functions. - (line 27) -* Random number functions: Random Number Functions. - (line 6) -* Random number seeding: Random State Seeding. - (line 6) -* Random number state: Random State Initialization. - (line 6) -* Random state: Nomenclature and Types. - (line 46) -* Rational arithmetic: Efficiency. (line 113) -* Rational arithmetic functions: Rational Arithmetic. (line 6) -* Rational assignment functions: Initializing Rationals. - (line 6) -* Rational comparison functions: Comparing Rationals. (line 6) -* Rational conversion functions: Rational Conversions. - (line 6) -* Rational initialization functions: Initializing Rationals. - (line 6) -* Rational input and output functions: I/O of Rationals. (line 6) -* Rational internals: Rational Internals. (line 6) -* Rational number: Nomenclature and Types. - (line 16) -* Rational number functions: Rational Number Functions. - (line 6) -* Rational numerator and denominator: Applying Integer Functions. - (line 6) -* Rational sign tests: Comparing Rationals. (line 27) -* Raw output internals: Raw Output Internals. - (line 6) -* Reallocations: Efficiency. (line 30) -* Reentrancy: Reentrancy. (line 6) -* References: References. (line 6) -* Remove factor functions: Number Theoretic Functions. - (line 90) -* Reporting bugs: Reporting Bugs. (line 6) -* Root extraction algorithm: Nth Root Algorithm. (line 6) -* Root extraction algorithms: Root Extraction Algorithms. - (line 6) -* Root extraction functions <1>: Float Arithmetic. (line 37) -* Root extraction functions: Integer Roots. (line 6) -* Root testing functions: Integer Roots. (line 36) -* Rounding functions: Miscellaneous Float Functions. - (line 9) -* Sample programs: Demonstration Programs. - (line 6) -* Scan bit functions: Integer Logic and Bit Fiddling. - (line 38) -* scanf formatted input: Formatted Input. (line 6) -* SCO: Known Build Problems. - (line 38) -* Seeding random numbers: Random State Seeding. - (line 6) -* Segmentation violation: Debugging. (line 7) -* Sequent Symmetry: Known Build Problems. - (line 68) -* Services for Unix: Notes for Particular Systems. - (line 51) -* Shared library versioning: Notes for Package Builds. - (line 9) -* Sign tests <1>: Float Comparison. (line 33) -* Sign tests <2>: Integer Comparisons. (line 28) -* Sign tests: Comparing Rationals. (line 27) -* Size in digits: Miscellaneous Integer Functions. - (line 23) -* Small operands: Efficiency. (line 7) -* Solaris <1>: ABI and ISA. (line 201) -* Solaris: Known Build Problems. - (line 78) -* Sparc: Notes for Particular Systems. - (line 108) -* Sparc V9: ABI and ISA. (line 201) -* Special integer functions: Integer Special Functions. - (line 6) -* Square root algorithm: Square Root Algorithm. - (line 6) -* SSE2: Notes for Particular Systems. - (line 132) -* Stack backtrace: Debugging. (line 50) -* Stack overflow <1>: Debugging. (line 7) -* Stack overflow: Build Options. (line 278) -* Static linking: Efficiency. (line 14) -* stdarg.h: Headers and Libraries. - (line 17) -* stdio.h: Headers and Libraries. - (line 11) -* Stripped libraries: Known Build Problems. - (line 28) -* Sun: ABI and ISA. (line 201) -* SunOS: Notes for Particular Systems. - (line 120) -* Systems: Notes for Particular Systems. - (line 6) -* Temporary memory: Build Options. (line 278) -* Texinfo: Build Options. (line 347) -* Text input/output: Efficiency. (line 153) -* Thread safety: Reentrancy. (line 6) -* Toom multiplication <1>: Other Multiplication. - (line 6) -* Toom multiplication <2>: Toom 4-Way Multiplication. - (line 6) -* Toom multiplication: Toom 3-Way Multiplication. - (line 6) -* Types: Nomenclature and Types. - (line 6) -* ui and si functions: Efficiency. (line 50) -* Unbalanced multiplication: Unbalanced Multiplication. - (line 6) -* Upward compatibility: Compatibility with older versions. - (line 6) -* Useful macros and constants: Useful Macros and Constants. - (line 6) -* User-defined precision: Floating-point Functions. - (line 6) -* Valgrind: Debugging. (line 130) -* Variable conventions: Variable Conventions. - (line 6) -* Version number: Useful Macros and Constants. - (line 12) -* Web page: Introduction to GMP. (line 34) -* Windows: Notes for Particular Systems. - (line 56) -* x86: Notes for Particular Systems. - (line 126) -* x87: Notes for Particular Systems. - (line 34) -* XML: Build Options. (line 354) - - -File: gmp.info, Node: Function Index, Prev: Concept Index, Up: Top - -Function and Type Index -*********************** - -[index] -* Menu: - -* __GMP_CC: Useful Macros and Constants. - (line 23) -* __GMP_CFLAGS: Useful Macros and Constants. - (line 24) -* __GNU_MP_VERSION: Useful Macros and Constants. - (line 10) -* __GNU_MP_VERSION_MINOR: Useful Macros and Constants. - (line 11) -* __GNU_MP_VERSION_PATCHLEVEL: Useful Macros and Constants. - (line 12) -* _mpz_realloc: Integer Special Functions. - (line 51) -* abs <1>: C++ Interface Rationals. - (line 43) -* abs <2>: C++ Interface Integers. - (line 42) -* abs: C++ Interface Floats. - (line 70) -* ceil: C++ Interface Floats. - (line 71) -* cmp <1>: C++ Interface Floats. - (line 72) -* cmp <2>: C++ Interface Rationals. - (line 44) -* cmp <3>: C++ Interface Integers. - (line 44) -* cmp: C++ Interface Rationals. - (line 45) -* floor: C++ Interface Floats. - (line 80) -* gcd: BSD Compatible Functions. - (line 82) -* gmp_asprintf: Formatted Output Functions. - (line 65) -* gmp_errno: Random State Initialization. - (line 55) -* GMP_ERROR_INVALID_ARGUMENT: Random State Initialization. - (line 55) -* GMP_ERROR_UNSUPPORTED_ARGUMENT: Random State Initialization. - (line 55) -* gmp_fprintf: Formatted Output Functions. - (line 29) -* gmp_fscanf: Formatted Input Functions. - (line 25) -* GMP_LIMB_BITS: Low-level Functions. (line 508) -* GMP_NAIL_BITS: Low-level Functions. (line 506) -* GMP_NAIL_MASK: Low-level Functions. (line 516) -* GMP_NUMB_BITS: Low-level Functions. (line 507) -* GMP_NUMB_MASK: Low-level Functions. (line 517) -* GMP_NUMB_MAX: Low-level Functions. (line 525) -* gmp_obstack_printf: Formatted Output Functions. - (line 79) -* gmp_obstack_vprintf: Formatted Output Functions. - (line 81) -* gmp_printf: Formatted Output Functions. - (line 24) -* GMP_RAND_ALG_DEFAULT: Random State Initialization. - (line 49) -* GMP_RAND_ALG_LC: Random State Initialization. - (line 49) -* gmp_randclass: C++ Interface Random Numbers. - (line 7) -* gmp_randclass::get_f: C++ Interface Random Numbers. - (line 45) -* gmp_randclass::get_z_bits: C++ Interface Random Numbers. - (line 39) -* gmp_randclass::get_z_range: C++ Interface Random Numbers. - (line 42) -* gmp_randclass::gmp_randclass: C++ Interface Random Numbers. - (line 13) -* gmp_randclass::seed: C++ Interface Random Numbers. - (line 33) -* gmp_randclear: Random State Initialization. - (line 62) -* gmp_randinit: Random State Initialization. - (line 47) -* gmp_randinit_default: Random State Initialization. - (line 7) -* gmp_randinit_lc_2exp: Random State Initialization. - (line 18) -* gmp_randinit_lc_2exp_size: Random State Initialization. - (line 32) -* gmp_randinit_mt: Random State Initialization. - (line 13) -* gmp_randinit_set: Random State Initialization. - (line 43) -* gmp_randseed: Random State Seeding. - (line 7) -* gmp_randseed_ui: Random State Seeding. - (line 9) -* gmp_randstate_t: Nomenclature and Types. - (line 46) -* gmp_scanf: Formatted Input Functions. - (line 21) -* gmp_snprintf: Formatted Output Functions. - (line 46) -* gmp_sprintf: Formatted Output Functions. - (line 34) -* gmp_sscanf: Formatted Input Functions. - (line 29) -* gmp_urandomb_ui: Random State Miscellaneous. - (line 8) -* gmp_urandomm_ui: Random State Miscellaneous. - (line 14) -* gmp_vasprintf: Formatted Output Functions. - (line 66) -* gmp_version: Useful Macros and Constants. - (line 18) -* gmp_vfprintf: Formatted Output Functions. - (line 30) -* gmp_vfscanf: Formatted Input Functions. - (line 26) -* gmp_vprintf: Formatted Output Functions. - (line 25) -* gmp_vscanf: Formatted Input Functions. - (line 22) -* gmp_vsnprintf: Formatted Output Functions. - (line 48) -* gmp_vsprintf: Formatted Output Functions. - (line 35) -* gmp_vsscanf: Formatted Input Functions. - (line 31) -* hypot: C++ Interface Floats. - (line 81) -* itom: BSD Compatible Functions. - (line 29) -* madd: BSD Compatible Functions. - (line 43) -* mcmp: BSD Compatible Functions. - (line 85) -* mdiv: BSD Compatible Functions. - (line 53) -* mfree: BSD Compatible Functions. - (line 105) -* min: BSD Compatible Functions. - (line 89) -* MINT: BSD Compatible Functions. - (line 21) -* mout: BSD Compatible Functions. - (line 94) -* move: BSD Compatible Functions. - (line 39) -* mp_bitcnt_t: Nomenclature and Types. - (line 42) -* mp_bits_per_limb: Useful Macros and Constants. - (line 7) -* mp_exp_t: Nomenclature and Types. - (line 27) -* mp_get_memory_functions: Custom Allocation. (line 93) -* mp_limb_t: Nomenclature and Types. - (line 31) -* mp_set_memory_functions: Custom Allocation. (line 21) -* mp_size_t: Nomenclature and Types. - (line 37) -* mpf_abs: Float Arithmetic. (line 47) -* mpf_add: Float Arithmetic. (line 7) -* mpf_add_ui: Float Arithmetic. (line 9) -* mpf_ceil: Miscellaneous Float Functions. - (line 7) -* mpf_class: C++ Interface General. - (line 20) -* mpf_class::fits_sint_p: C++ Interface Floats. - (line 74) -* mpf_class::fits_slong_p: C++ Interface Floats. - (line 75) -* mpf_class::fits_sshort_p: C++ Interface Floats. - (line 76) -* mpf_class::fits_uint_p: C++ Interface Floats. - (line 77) -* mpf_class::fits_ulong_p: C++ Interface Floats. - (line 78) -* mpf_class::fits_ushort_p: C++ Interface Floats. - (line 79) -* mpf_class::get_d: C++ Interface Floats. - (line 82) -* mpf_class::get_mpf_t: C++ Interface General. - (line 66) -* mpf_class::get_prec: C++ Interface Floats. - (line 100) -* mpf_class::get_si: C++ Interface Floats. - (line 83) -* mpf_class::get_str: C++ Interface Floats. - (line 85) -* mpf_class::get_ui: C++ Interface Floats. - (line 86) -* mpf_class::mpf_class: C++ Interface Floats. - (line 38) -* mpf_class::operator=: C++ Interface Floats. - (line 47) -* mpf_class::set_prec: C++ Interface Floats. - (line 101) -* mpf_class::set_prec_raw: C++ Interface Floats. - (line 102) -* mpf_class::set_str: C++ Interface Floats. - (line 88) -* mpf_clear: Initializing Floats. (line 37) -* mpf_clears: Initializing Floats. (line 41) -* mpf_cmp: Float Comparison. (line 7) -* mpf_cmp_d: Float Comparison. (line 8) -* mpf_cmp_si: Float Comparison. (line 10) -* mpf_cmp_ui: Float Comparison. (line 9) -* mpf_div: Float Arithmetic. (line 29) -* mpf_div_2exp: Float Arithmetic. (line 53) -* mpf_div_ui: Float Arithmetic. (line 33) -* mpf_eq: Float Comparison. (line 17) -* mpf_fits_sint_p: Miscellaneous Float Functions. - (line 20) -* mpf_fits_slong_p: Miscellaneous Float Functions. - (line 18) -* mpf_fits_sshort_p: Miscellaneous Float Functions. - (line 22) -* mpf_fits_uint_p: Miscellaneous Float Functions. - (line 19) -* mpf_fits_ulong_p: Miscellaneous Float Functions. - (line 17) -* mpf_fits_ushort_p: Miscellaneous Float Functions. - (line 21) -* mpf_floor: Miscellaneous Float Functions. - (line 8) -* mpf_get_d: Converting Floats. (line 7) -* mpf_get_d_2exp: Converting Floats. (line 16) -* mpf_get_default_prec: Initializing Floats. (line 12) -* mpf_get_prec: Initializing Floats. (line 62) -* mpf_get_si: Converting Floats. (line 27) -* mpf_get_str: Converting Floats. (line 37) -* mpf_get_ui: Converting Floats. (line 28) -* mpf_init: Initializing Floats. (line 19) -* mpf_init2: Initializing Floats. (line 26) -* mpf_init_set: Simultaneous Float Init & Assign. - (line 16) -* mpf_init_set_d: Simultaneous Float Init & Assign. - (line 19) -* mpf_init_set_si: Simultaneous Float Init & Assign. - (line 18) -* mpf_init_set_str: Simultaneous Float Init & Assign. - (line 25) -* mpf_init_set_ui: Simultaneous Float Init & Assign. - (line 17) -* mpf_inits: Initializing Floats. (line 31) -* mpf_inp_str: I/O of Floats. (line 37) -* mpf_integer_p: Miscellaneous Float Functions. - (line 14) -* mpf_mul: Float Arithmetic. (line 19) -* mpf_mul_2exp: Float Arithmetic. (line 50) -* mpf_mul_ui: Float Arithmetic. (line 21) -* mpf_neg: Float Arithmetic. (line 44) -* mpf_out_str: I/O of Floats. (line 17) -* mpf_pow_ui: Float Arithmetic. (line 41) -* mpf_random2: Miscellaneous Float Functions. - (line 36) -* mpf_reldiff: Float Comparison. (line 29) -* mpf_set: Assigning Floats. (line 10) -* mpf_set_d: Assigning Floats. (line 13) -* mpf_set_default_prec: Initializing Floats. (line 7) -* mpf_set_prec: Initializing Floats. (line 65) -* mpf_set_prec_raw: Initializing Floats. (line 72) -* mpf_set_q: Assigning Floats. (line 15) -* mpf_set_si: Assigning Floats. (line 12) -* mpf_set_str: Assigning Floats. (line 18) -* mpf_set_ui: Assigning Floats. (line 11) -* mpf_set_z: Assigning Floats. (line 14) -* mpf_sgn: Float Comparison. (line 33) -* mpf_sqrt: Float Arithmetic. (line 36) -* mpf_sqrt_ui: Float Arithmetic. (line 37) -* mpf_sub: Float Arithmetic. (line 12) -* mpf_sub_ui: Float Arithmetic. (line 16) -* mpf_swap: Assigning Floats. (line 52) -* mpf_t: Nomenclature and Types. - (line 21) -* mpf_trunc: Miscellaneous Float Functions. - (line 9) -* mpf_ui_div: Float Arithmetic. (line 31) -* mpf_ui_sub: Float Arithmetic. (line 14) -* mpf_urandomb: Miscellaneous Float Functions. - (line 27) -* mpn_add: Low-level Functions. (line 69) -* mpn_add_1: Low-level Functions. (line 64) -* mpn_add_n: Low-level Functions. (line 54) -* mpn_addmul_1: Low-level Functions. (line 148) -* mpn_and_n: Low-level Functions. (line 420) -* mpn_andn_n: Low-level Functions. (line 435) -* mpn_cmp: Low-level Functions. (line 284) -* mpn_com: Low-level Functions. (line 460) -* mpn_copyd: Low-level Functions. (line 469) -* mpn_copyi: Low-level Functions. (line 465) -* mpn_divexact_by3: Low-level Functions. (line 229) -* mpn_divexact_by3c: Low-level Functions. (line 231) -* mpn_divmod: Low-level Functions. (line 224) -* mpn_divmod_1: Low-level Functions. (line 208) -* mpn_divrem: Low-level Functions. (line 182) -* mpn_divrem_1: Low-level Functions. (line 206) -* mpn_gcd: Low-level Functions. (line 289) -* mpn_gcd_1: Low-level Functions. (line 299) -* mpn_gcdext: Low-level Functions. (line 305) -* mpn_get_str: Low-level Functions. (line 346) -* mpn_hamdist: Low-level Functions. (line 410) -* mpn_ior_n: Low-level Functions. (line 425) -* mpn_iorn_n: Low-level Functions. (line 440) -* mpn_lshift: Low-level Functions. (line 260) -* mpn_mod_1: Low-level Functions. (line 255) -* mpn_mul: Low-level Functions. (line 114) -* mpn_mul_1: Low-level Functions. (line 133) -* mpn_mul_n: Low-level Functions. (line 103) -* mpn_nand_n: Low-level Functions. (line 445) -* mpn_neg: Low-level Functions. (line 98) -* mpn_nior_n: Low-level Functions. (line 450) -* mpn_perfect_square_p: Low-level Functions. (line 416) -* mpn_popcount: Low-level Functions. (line 406) -* mpn_random: Low-level Functions. (line 395) -* mpn_random2: Low-level Functions. (line 396) -* mpn_rshift: Low-level Functions. (line 272) -* mpn_scan0: Low-level Functions. (line 380) -* mpn_scan1: Low-level Functions. (line 388) -* mpn_set_str: Low-level Functions. (line 361) -* mpn_sqr: Low-level Functions. (line 125) -* mpn_sqrtrem: Low-level Functions. (line 328) -* mpn_sub: Low-level Functions. (line 90) -* mpn_sub_1: Low-level Functions. (line 85) -* mpn_sub_n: Low-level Functions. (line 76) -* mpn_submul_1: Low-level Functions. (line 159) -* mpn_tdiv_qr: Low-level Functions. (line 171) -* mpn_xnor_n: Low-level Functions. (line 455) -* mpn_xor_n: Low-level Functions. (line 430) -* mpn_zero: Low-level Functions. (line 472) -* mpq_abs: Rational Arithmetic. (line 31) -* mpq_add: Rational Arithmetic. (line 7) -* mpq_canonicalize: Rational Number Functions. - (line 22) -* mpq_class: C++ Interface General. - (line 19) -* mpq_class::canonicalize: C++ Interface Rationals. - (line 37) -* mpq_class::get_d: C++ Interface Rationals. - (line 46) -* mpq_class::get_den: C++ Interface Rationals. - (line 58) -* mpq_class::get_den_mpz_t: C++ Interface Rationals. - (line 68) -* mpq_class::get_mpq_t: C++ Interface General. - (line 65) -* mpq_class::get_num: C++ Interface Rationals. - (line 57) -* mpq_class::get_num_mpz_t: C++ Interface Rationals. - (line 67) -* mpq_class::get_str: C++ Interface Rationals. - (line 47) -* mpq_class::mpq_class: C++ Interface Rationals. - (line 22) -* mpq_class::set_str: C++ Interface Rationals. - (line 49) -* mpq_clear: Initializing Rationals. - (line 16) -* mpq_clears: Initializing Rationals. - (line 20) -* mpq_cmp: Comparing Rationals. (line 7) -* mpq_cmp_si: Comparing Rationals. (line 17) -* mpq_cmp_ui: Comparing Rationals. (line 15) -* mpq_denref: Applying Integer Functions. - (line 18) -* mpq_div: Rational Arithmetic. (line 22) -* mpq_div_2exp: Rational Arithmetic. (line 25) -* mpq_equal: Comparing Rationals. (line 33) -* mpq_get_d: Rational Conversions. - (line 7) -* mpq_get_den: Applying Integer Functions. - (line 24) -* mpq_get_num: Applying Integer Functions. - (line 23) -* mpq_get_str: Rational Conversions. - (line 22) -* mpq_init: Initializing Rationals. - (line 7) -* mpq_inits: Initializing Rationals. - (line 12) -* mpq_inp_str: I/O of Rationals. (line 23) -* mpq_inv: Rational Arithmetic. (line 34) -* mpq_mul: Rational Arithmetic. (line 15) -* mpq_mul_2exp: Rational Arithmetic. (line 18) -* mpq_neg: Rational Arithmetic. (line 28) -* mpq_numref: Applying Integer Functions. - (line 17) -* mpq_out_str: I/O of Rationals. (line 15) -* mpq_set: Initializing Rationals. - (line 24) -* mpq_set_d: Rational Conversions. - (line 17) -* mpq_set_den: Applying Integer Functions. - (line 26) -* mpq_set_f: Rational Conversions. - (line 18) -* mpq_set_num: Applying Integer Functions. - (line 25) -* mpq_set_si: Initializing Rationals. - (line 31) -* mpq_set_str: Initializing Rationals. - (line 36) -* mpq_set_ui: Initializing Rationals. - (line 29) -* mpq_set_z: Initializing Rationals. - (line 25) -* mpq_sgn: Comparing Rationals. (line 27) -* mpq_sub: Rational Arithmetic. (line 11) -* mpq_swap: Initializing Rationals. - (line 56) -* mpq_t: Nomenclature and Types. - (line 16) -* mpz_abs: Integer Arithmetic. (line 42) -* mpz_add: Integer Arithmetic. (line 7) -* mpz_add_ui: Integer Arithmetic. (line 9) -* mpz_addmul: Integer Arithmetic. (line 25) -* mpz_addmul_ui: Integer Arithmetic. (line 27) -* mpz_and: Integer Logic and Bit Fiddling. - (line 11) -* mpz_array_init: Integer Special Functions. - (line 11) -* mpz_bin_ui: Number Theoretic Functions. - (line 98) -* mpz_bin_uiui: Number Theoretic Functions. - (line 100) -* mpz_cdiv_q: Integer Division. (line 13) -* mpz_cdiv_q_2exp: Integer Division. (line 24) -* mpz_cdiv_q_ui: Integer Division. (line 17) -* mpz_cdiv_qr: Integer Division. (line 15) -* mpz_cdiv_qr_ui: Integer Division. (line 21) -* mpz_cdiv_r: Integer Division. (line 14) -* mpz_cdiv_r_2exp: Integer Division. (line 25) -* mpz_cdiv_r_ui: Integer Division. (line 19) -* mpz_cdiv_ui: Integer Division. (line 23) -* mpz_class: C++ Interface General. - (line 18) -* mpz_class::fits_sint_p: C++ Interface Integers. - (line 45) -* mpz_class::fits_slong_p: C++ Interface Integers. - (line 46) -* mpz_class::fits_sshort_p: C++ Interface Integers. - (line 47) -* mpz_class::fits_uint_p: C++ Interface Integers. - (line 48) -* mpz_class::fits_ulong_p: C++ Interface Integers. - (line 49) -* mpz_class::fits_ushort_p: C++ Interface Integers. - (line 50) -* mpz_class::get_d: C++ Interface Integers. - (line 51) -* mpz_class::get_mpz_t: C++ Interface General. - (line 64) -* mpz_class::get_si: C++ Interface Integers. - (line 52) -* mpz_class::get_str: C++ Interface Integers. - (line 53) -* mpz_class::get_ui: C++ Interface Integers. - (line 54) -* mpz_class::mpz_class: C++ Interface Integers. - (line 7) -* mpz_class::set_str: C++ Interface Integers. - (line 56) -* mpz_clear: Initializing Integers. - (line 44) -* mpz_clears: Initializing Integers. - (line 48) -* mpz_clrbit: Integer Logic and Bit Fiddling. - (line 54) -* mpz_cmp: Integer Comparisons. (line 7) -* mpz_cmp_d: Integer Comparisons. (line 8) -* mpz_cmp_si: Integer Comparisons. (line 9) -* mpz_cmp_ui: Integer Comparisons. (line 10) -* mpz_cmpabs: Integer Comparisons. (line 18) -* mpz_cmpabs_d: Integer Comparisons. (line 19) -* mpz_cmpabs_ui: Integer Comparisons. (line 20) -* mpz_com: Integer Logic and Bit Fiddling. - (line 20) -* mpz_combit: Integer Logic and Bit Fiddling. - (line 57) -* mpz_congruent_2exp_p: Integer Division. (line 124) -* mpz_congruent_p: Integer Division. (line 121) -* mpz_congruent_ui_p: Integer Division. (line 123) -* mpz_divexact: Integer Division. (line 101) -* mpz_divexact_ui: Integer Division. (line 102) -* mpz_divisible_2exp_p: Integer Division. (line 112) -* mpz_divisible_p: Integer Division. (line 110) -* mpz_divisible_ui_p: Integer Division. (line 111) -* mpz_even_p: Miscellaneous Integer Functions. - (line 18) -* mpz_export: Integer Import and Export. - (line 45) -* mpz_fac_ui: Number Theoretic Functions. - (line 95) -* mpz_fdiv_q: Integer Division. (line 27) -* mpz_fdiv_q_2exp: Integer Division. (line 38) -* mpz_fdiv_q_ui: Integer Division. (line 31) -* mpz_fdiv_qr: Integer Division. (line 29) -* mpz_fdiv_qr_ui: Integer Division. (line 35) -* mpz_fdiv_r: Integer Division. (line 28) -* mpz_fdiv_r_2exp: Integer Division. (line 39) -* mpz_fdiv_r_ui: Integer Division. (line 33) -* mpz_fdiv_ui: Integer Division. (line 37) -* mpz_fib2_ui: Number Theoretic Functions. - (line 108) -* mpz_fib_ui: Number Theoretic Functions. - (line 106) -* mpz_fits_sint_p: Miscellaneous Integer Functions. - (line 10) -* mpz_fits_slong_p: Miscellaneous Integer Functions. - (line 8) -* mpz_fits_sshort_p: Miscellaneous Integer Functions. - (line 12) -* mpz_fits_uint_p: Miscellaneous Integer Functions. - (line 9) -* mpz_fits_ulong_p: Miscellaneous Integer Functions. - (line 7) -* mpz_fits_ushort_p: Miscellaneous Integer Functions. - (line 11) -* mpz_gcd: Number Theoretic Functions. - (line 30) -* mpz_gcd_ui: Number Theoretic Functions. - (line 35) -* mpz_gcdext: Number Theoretic Functions. - (line 45) -* mpz_get_d: Converting Integers. (line 27) -* mpz_get_d_2exp: Converting Integers. (line 35) -* mpz_get_si: Converting Integers. (line 18) -* mpz_get_str: Converting Integers. (line 46) -* mpz_get_ui: Converting Integers. (line 11) -* mpz_getlimbn: Integer Special Functions. - (line 60) -* mpz_hamdist: Integer Logic and Bit Fiddling. - (line 29) -* mpz_import: Integer Import and Export. - (line 11) -* mpz_init: Initializing Integers. - (line 26) -* mpz_init2: Initializing Integers. - (line 33) -* mpz_init_set: Simultaneous Integer Init & Assign. - (line 27) -* mpz_init_set_d: Simultaneous Integer Init & Assign. - (line 30) -* mpz_init_set_si: Simultaneous Integer Init & Assign. - (line 29) -* mpz_init_set_str: Simultaneous Integer Init & Assign. - (line 34) -* mpz_init_set_ui: Simultaneous Integer Init & Assign. - (line 28) -* mpz_inits: Initializing Integers. - (line 29) -* mpz_inp_raw: I/O of Integers. (line 59) -* mpz_inp_str: I/O of Integers. (line 28) -* mpz_invert: Number Theoretic Functions. - (line 60) -* mpz_ior: Integer Logic and Bit Fiddling. - (line 14) -* mpz_jacobi: Number Theoretic Functions. - (line 66) -* mpz_kronecker: Number Theoretic Functions. - (line 74) -* mpz_kronecker_si: Number Theoretic Functions. - (line 75) -* mpz_kronecker_ui: Number Theoretic Functions. - (line 76) -* mpz_lcm: Number Theoretic Functions. - (line 54) -* mpz_lcm_ui: Number Theoretic Functions. - (line 55) -* mpz_legendre: Number Theoretic Functions. - (line 69) -* mpz_lucnum2_ui: Number Theoretic Functions. - (line 119) -* mpz_lucnum_ui: Number Theoretic Functions. - (line 117) -* mpz_mod: Integer Division. (line 91) -* mpz_mod_ui: Integer Division. (line 93) -* mpz_mul: Integer Arithmetic. (line 19) -* mpz_mul_2exp: Integer Arithmetic. (line 35) -* mpz_mul_si: Integer Arithmetic. (line 20) -* mpz_mul_ui: Integer Arithmetic. (line 22) -* mpz_neg: Integer Arithmetic. (line 39) -* mpz_nextprime: Number Theoretic Functions. - (line 23) -* mpz_odd_p: Miscellaneous Integer Functions. - (line 17) -* mpz_out_raw: I/O of Integers. (line 43) -* mpz_out_str: I/O of Integers. (line 16) -* mpz_perfect_power_p: Integer Roots. (line 27) -* mpz_perfect_square_p: Integer Roots. (line 36) -* mpz_popcount: Integer Logic and Bit Fiddling. - (line 23) -* mpz_pow_ui: Integer Exponentiation. - (line 31) -* mpz_powm: Integer Exponentiation. - (line 8) -* mpz_powm_sec: Integer Exponentiation. - (line 18) -* mpz_powm_ui: Integer Exponentiation. - (line 10) -* mpz_probab_prime_p: Number Theoretic Functions. - (line 7) -* mpz_random: Integer Random Numbers. - (line 42) -* mpz_random2: Integer Random Numbers. - (line 51) -* mpz_realloc2: Initializing Integers. - (line 52) -* mpz_remove: Number Theoretic Functions. - (line 90) -* mpz_root: Integer Roots. (line 7) -* mpz_rootrem: Integer Roots. (line 13) -* mpz_rrandomb: Integer Random Numbers. - (line 31) -* mpz_scan0: Integer Logic and Bit Fiddling. - (line 37) -* mpz_scan1: Integer Logic and Bit Fiddling. - (line 38) -* mpz_set: Assigning Integers. (line 10) -* mpz_set_d: Assigning Integers. (line 13) -* mpz_set_f: Assigning Integers. (line 15) -* mpz_set_q: Assigning Integers. (line 14) -* mpz_set_si: Assigning Integers. (line 12) -* mpz_set_str: Assigning Integers. (line 21) -* mpz_set_ui: Assigning Integers. (line 11) -* mpz_setbit: Integer Logic and Bit Fiddling. - (line 51) -* mpz_sgn: Integer Comparisons. (line 28) -* mpz_si_kronecker: Number Theoretic Functions. - (line 77) -* mpz_size: Integer Special Functions. - (line 68) -* mpz_sizeinbase: Miscellaneous Integer Functions. - (line 23) -* mpz_sqrt: Integer Roots. (line 17) -* mpz_sqrtrem: Integer Roots. (line 20) -* mpz_sub: Integer Arithmetic. (line 12) -* mpz_sub_ui: Integer Arithmetic. (line 14) -* mpz_submul: Integer Arithmetic. (line 30) -* mpz_submul_ui: Integer Arithmetic. (line 32) -* mpz_swap: Assigning Integers. (line 37) -* mpz_t: Nomenclature and Types. - (line 6) -* mpz_tdiv_q: Integer Division. (line 41) -* mpz_tdiv_q_2exp: Integer Division. (line 52) -* mpz_tdiv_q_ui: Integer Division. (line 45) -* mpz_tdiv_qr: Integer Division. (line 43) -* mpz_tdiv_qr_ui: Integer Division. (line 49) -* mpz_tdiv_r: Integer Division. (line 42) -* mpz_tdiv_r_2exp: Integer Division. (line 53) -* mpz_tdiv_r_ui: Integer Division. (line 47) -* mpz_tdiv_ui: Integer Division. (line 51) -* mpz_tstbit: Integer Logic and Bit Fiddling. - (line 60) -* mpz_ui_kronecker: Number Theoretic Functions. - (line 78) -* mpz_ui_pow_ui: Integer Exponentiation. - (line 33) -* mpz_ui_sub: Integer Arithmetic. (line 16) -* mpz_urandomb: Integer Random Numbers. - (line 14) -* mpz_urandomm: Integer Random Numbers. - (line 23) -* mpz_xor: Integer Logic and Bit Fiddling. - (line 17) -* msqrt: BSD Compatible Functions. - (line 63) -* msub: BSD Compatible Functions. - (line 46) -* mtox: BSD Compatible Functions. - (line 98) -* mult: BSD Compatible Functions. - (line 49) -* operator%: C++ Interface Integers. - (line 30) -* operator/: C++ Interface Integers. - (line 29) -* operator<<: C++ Formatted Output. - (line 20) -* operator>> <1>: C++ Formatted Input. (line 11) -* operator>>: C++ Interface Rationals. - (line 77) -* pow: BSD Compatible Functions. - (line 71) -* rpow: BSD Compatible Functions. - (line 79) -* sdiv: BSD Compatible Functions. - (line 55) -* sgn <1>: C++ Interface Rationals. - (line 50) -* sgn <2>: C++ Interface Integers. - (line 57) -* sgn: C++ Interface Floats. - (line 89) -* sqrt <1>: C++ Interface Integers. - (line 58) -* sqrt: C++ Interface Floats. - (line 90) -* trunc: C++ Interface Floats. - (line 91) -* xtom: BSD Compatible Functions. - (line 34) - - diff --git a/misc/builddeps/dp.linux32/share/man/man1/cjpeg.1 b/misc/builddeps/dp.linux32/share/man/man1/cjpeg.1 deleted file mode 100644 index 01bfa259..00000000 --- a/misc/builddeps/dp.linux32/share/man/man1/cjpeg.1 +++ /dev/null @@ -1,325 +0,0 @@ -.TH CJPEG 1 "30 December 2009" -.SH NAME -cjpeg \- compress an image file to a JPEG file -.SH SYNOPSIS -.B cjpeg -[ -.I options -] -[ -.I filename -] -.LP -.SH DESCRIPTION -.LP -.B cjpeg -compresses the named image file, or the standard input if no file is -named, and produces a JPEG/JFIF file on the standard output. -The currently supported input file formats are: PPM (PBMPLUS color -format), PGM (PBMPLUS gray-scale format), BMP, Targa, and RLE (Utah Raster -Toolkit format). (RLE is supported only if the URT library is available.) -.SH OPTIONS -All switch names may be abbreviated; for example, -.B \-grayscale -may be written -.B \-gray -or -.BR \-gr . -Most of the "basic" switches can be abbreviated to as little as one letter. -Upper and lower case are equivalent (thus -.B \-BMP -is the same as -.BR \-bmp ). -British spellings are also accepted (e.g., -.BR \-greyscale ), -though for brevity these are not mentioned below. -.PP -The basic switches are: -.TP -.BI \-quality " N[,...]" -Scale quantization tables to adjust image quality. Quality is 0 (worst) to -100 (best); default is 75. (See below for more info.) -.TP -.B \-grayscale -Create monochrome JPEG file from color input. Be sure to use this switch when -compressing a grayscale BMP file, because -.B cjpeg -isn't bright enough to notice whether a BMP file uses only shades of gray. -By saying -.BR \-grayscale , -you'll get a smaller JPEG file that takes less time to process. -.TP -.B \-optimize -Perform optimization of entropy encoding parameters. Without this, default -encoding parameters are used. -.B \-optimize -usually makes the JPEG file a little smaller, but -.B cjpeg -runs somewhat slower and needs much more memory. Image quality and speed of -decompression are unaffected by -.BR \-optimize . -.TP -.B \-progressive -Create progressive JPEG file (see below). -.TP -.BI \-scale " M/N" -Scale the output image by a factor M/N. Currently supported scale factors are -8/N with all N from 1 to 16. -.TP -.B \-targa -Input file is Targa format. Targa files that contain an "identification" -field will not be automatically recognized by -.BR cjpeg ; -for such files you must specify -.B \-targa -to make -.B cjpeg -treat the input as Targa format. -For most Targa files, you won't need this switch. -.PP -The -.B \-quality -switch lets you trade off compressed file size against quality of the -reconstructed image: the higher the quality setting, the larger the JPEG file, -and the closer the output image will be to the original input. Normally you -want to use the lowest quality setting (smallest file) that decompresses into -something visually indistinguishable from the original image. For this -purpose the quality setting should be between 50 and 95; the default of 75 is -often about right. If you see defects at -.B \-quality -75, then go up 5 or 10 counts at a time until you are happy with the output -image. (The optimal setting will vary from one image to another.) -.PP -.B \-quality -100 will generate a quantization table of all 1's, minimizing loss in the -quantization step (but there is still information loss in subsampling, as well -as roundoff error). This setting is mainly of interest for experimental -purposes. Quality values above about 95 are -.B not -recommended for normal use; the compressed file size goes up dramatically for -hardly any gain in output image quality. -.PP -In the other direction, quality values below 50 will produce very small files -of low image quality. Settings around 5 to 10 might be useful in preparing an -index of a large image library, for example. Try -.B \-quality -2 (or so) for some amusing Cubist effects. (Note: quality -values below about 25 generate 2-byte quantization tables, which are -considered optional in the JPEG standard. -.B cjpeg -emits a warning message when you give such a quality value, because some -other JPEG programs may be unable to decode the resulting file. Use -.B \-baseline -if you need to ensure compatibility at low quality values.) -.PP -The -.B \-quality -option has been extended in IJG version 7 for support of separate quality -settings for luminance and chrominance (or in general, for every provided -quantization table slot). This feature is useful for high-quality -applications which cannot accept the damage of color data by coarse -subsampling settings. You can now easily reduce the color data amount more -smoothly with finer control without separate subsampling. The resulting file -is fully compliant with standard JPEG decoders. -Note that the -.B \-quality -ratings refer to the quantization table slots, and that the last value is -replicated if there are more q-table slots than parameters. The default -q-table slots are 0 for luminance and 1 for chrominance with default tables as -given in the JPEG standard. This is compatible with the old behaviour in case -that only one parameter is given, which is then used for both luminance and -chrominance (slots 0 and 1). More or custom quantization tables can be set -with -.B \-qtables -and assigned to components with -.B \-qslots -parameter (see the "wizard" switches below). -.B Caution: -You must explicitly add -.BI \-sample " 1x1" -for efficient separate color -quality selection, since the default value used by library is 2x2! -.PP -The -.B \-progressive -switch creates a "progressive JPEG" file. In this type of JPEG file, the data -is stored in multiple scans of increasing quality. If the file is being -transmitted over a slow communications link, the decoder can use the first -scan to display a low-quality image very quickly, and can then improve the -display with each subsequent scan. The final image is exactly equivalent to a -standard JPEG file of the same quality setting, and the total file size is -about the same --- often a little smaller. -.PP -Switches for advanced users: -.TP -.B \-dct int -Use integer DCT method (default). -.TP -.B \-dct fast -Use fast integer DCT (less accurate). -.TP -.B \-dct float -Use floating-point DCT method. -The float method is very slightly more accurate than the int method, but is -much slower unless your machine has very fast floating-point hardware. Also -note that results of the floating-point method may vary slightly across -machines, while the integer methods should give the same results everywhere. -The fast integer method is much less accurate than the other two. -.TP -.B \-nosmooth -Don't use high-quality downsampling. -.TP -.BI \-restart " N" -Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is -attached to the number. -.B \-restart 0 -(the default) means no restart markers. -.TP -.BI \-smooth " N" -Smooth the input image to eliminate dithering noise. N, ranging from 1 to -100, indicates the strength of smoothing. 0 (the default) means no smoothing. -.TP -.BI \-maxmemory " N" -Set limit for amount of memory to use in processing large images. Value is -in thousands of bytes, or millions of bytes if "M" is attached to the -number. For example, -.B \-max 4m -selects 4000000 bytes. If more space is needed, temporary files will be used. -.TP -.BI \-outfile " name" -Send output image to the named file, not to standard output. -.TP -.B \-verbose -Enable debug printout. More -.BR \-v 's -give more output. Also, version information is printed at startup. -.TP -.B \-debug -Same as -.BR \-verbose . -.PP -The -.B \-restart -option inserts extra markers that allow a JPEG decoder to resynchronize after -a transmission error. Without restart markers, any damage to a compressed -file will usually ruin the image from the point of the error to the end of the -image; with restart markers, the damage is usually confined to the portion of -the image up to the next restart marker. Of course, the restart markers -occupy extra space. We recommend -.B \-restart 1 -for images that will be transmitted across unreliable networks such as Usenet. -.PP -The -.B \-smooth -option filters the input to eliminate fine-scale noise. This is often useful -when converting dithered images to JPEG: a moderate smoothing factor of 10 to -50 gets rid of dithering patterns in the input file, resulting in a smaller -JPEG file and a better-looking image. Too large a smoothing factor will -visibly blur the image, however. -.PP -Switches for wizards: -.TP -.B \-arithmetic -Use arithmetic coding. -.B Caution: -arithmetic coded JPEG is not yet widely implemented, so many decoders will be -unable to view an arithmetic coded JPEG file at all. -.TP -.B \-baseline -Force baseline-compatible quantization tables to be generated. This clamps -quantization values to 8 bits even at low quality settings. (This switch is -poorly named, since it does not ensure that the output is actually baseline -JPEG. For example, you can use -.B \-baseline -and -.B \-progressive -together.) -.TP -.BI \-qtables " file" -Use the quantization tables given in the specified text file. -.TP -.BI \-qslots " N[,...]" -Select which quantization table to use for each color component. -.TP -.BI \-sample " HxV[,...]" -Set JPEG sampling factors for each color component. -.TP -.BI \-scans " file" -Use the scan script given in the specified text file. -.PP -The "wizard" switches are intended for experimentation with JPEG. If you -don't know what you are doing, \fBdon't use them\fR. These switches are -documented further in the file wizard.txt. -.SH EXAMPLES -.LP -This example compresses the PPM file foo.ppm with a quality factor of -60 and saves the output as foo.jpg: -.IP -.B cjpeg \-quality -.I 60 foo.ppm -.B > -.I foo.jpg -.SH HINTS -Color GIF files are not the ideal input for JPEG; JPEG is really intended for -compressing full-color (24-bit) images. In particular, don't try to convert -cartoons, line drawings, and other images that have only a few distinct -colors. GIF works great on these, JPEG does not. If you want to convert a -GIF to JPEG, you should experiment with -.BR cjpeg 's -.B \-quality -and -.B \-smooth -options to get a satisfactory conversion. -.B \-smooth 10 -or so is often helpful. -.PP -Avoid running an image through a series of JPEG compression/decompression -cycles. Image quality loss will accumulate; after ten or so cycles the image -may be noticeably worse than it was after one cycle. It's best to use a -lossless format while manipulating an image, then convert to JPEG format when -you are ready to file the image away. -.PP -The -.B \-optimize -option to -.B cjpeg -is worth using when you are making a "final" version for posting or archiving. -It's also a win when you are using low quality settings to make very small -JPEG files; the percentage improvement is often a lot more than it is on -larger files. (At present, -.B \-optimize -mode is always selected when generating progressive JPEG files.) -.SH ENVIRONMENT -.TP -.B JPEGMEM -If this environment variable is set, its value is the default memory limit. -The value is specified as described for the -.B \-maxmemory -switch. -.B JPEGMEM -overrides the default value specified when the program was compiled, and -itself is overridden by an explicit -.BR \-maxmemory . -.SH SEE ALSO -.BR djpeg (1), -.BR jpegtran (1), -.BR rdjpgcom (1), -.BR wrjpgcom (1) -.br -.BR ppm (5), -.BR pgm (5) -.br -Wallace, Gregory K. "The JPEG Still Picture Compression Standard", -Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. -.SH AUTHOR -Independent JPEG Group -.SH BUGS -GIF input files are no longer supported, to avoid the Unisys LZW patent. -(Conversion of GIF files to JPEG is usually a bad idea anyway.) -.PP -Not all variants of BMP and Targa file formats are supported. -.PP -The -.B \-targa -switch is not a bug, it's a feature. (It would be a bug if the Targa format -designers had not been clueless.) diff --git a/misc/builddeps/dp.linux32/share/man/man1/djpeg.1 b/misc/builddeps/dp.linux32/share/man/man1/djpeg.1 deleted file mode 100644 index f3722d15..00000000 --- a/misc/builddeps/dp.linux32/share/man/man1/djpeg.1 +++ /dev/null @@ -1,252 +0,0 @@ -.TH DJPEG 1 "3 October 2009" -.SH NAME -djpeg \- decompress a JPEG file to an image file -.SH SYNOPSIS -.B djpeg -[ -.I options -] -[ -.I filename -] -.LP -.SH DESCRIPTION -.LP -.B djpeg -decompresses the named JPEG file, or the standard input if no file is named, -and produces an image file on the standard output. PBMPLUS (PPM/PGM), BMP, -GIF, Targa, or RLE (Utah Raster Toolkit) output format can be selected. -(RLE is supported only if the URT library is available.) -.SH OPTIONS -All switch names may be abbreviated; for example, -.B \-grayscale -may be written -.B \-gray -or -.BR \-gr . -Most of the "basic" switches can be abbreviated to as little as one letter. -Upper and lower case are equivalent (thus -.B \-BMP -is the same as -.BR \-bmp ). -British spellings are also accepted (e.g., -.BR \-greyscale ), -though for brevity these are not mentioned below. -.PP -The basic switches are: -.TP -.BI \-colors " N" -Reduce image to at most N colors. This reduces the number of colors used in -the output image, so that it can be displayed on a colormapped display or -stored in a colormapped file format. For example, if you have an 8-bit -display, you'd need to reduce to 256 or fewer colors. -.TP -.BI \-quantize " N" -Same as -.BR \-colors . -.B \-colors -is the recommended name, -.B \-quantize -is provided only for backwards compatibility. -.TP -.B \-fast -Select recommended processing options for fast, low quality output. (The -default options are chosen for highest quality output.) Currently, this is -equivalent to \fB\-dct fast \-nosmooth \-onepass \-dither ordered\fR. -.TP -.B \-grayscale -Force gray-scale output even if JPEG file is color. Useful for viewing on -monochrome displays; also, -.B djpeg -runs noticeably faster in this mode. -.TP -.BI \-scale " M/N" -Scale the output image by a factor M/N. Currently supported scale factors are -M/N with all M from 1 to 16, where N is the source DCT size, which is 8 for -baseline JPEG. If the /N part is omitted, then M specifies the DCT scaled -size to be applied on the given input. For baseline JPEG this is equivalent -to M/8 scaling, since the source DCT size for baseline JPEG is 8. -Scaling is handy if the image is larger than your screen; also, -.B djpeg -runs much faster when scaling down the output. -.TP -.B \-bmp -Select BMP output format (Windows flavor). 8-bit colormapped format is -emitted if -.B \-colors -or -.B \-grayscale -is specified, or if the JPEG file is gray-scale; otherwise, 24-bit full-color -format is emitted. -.TP -.B \-gif -Select GIF output format. Since GIF does not support more than 256 colors, -.B \-colors 256 -is assumed (unless you specify a smaller number of colors). -.TP -.B \-os2 -Select BMP output format (OS/2 1.x flavor). 8-bit colormapped format is -emitted if -.B \-colors -or -.B \-grayscale -is specified, or if the JPEG file is gray-scale; otherwise, 24-bit full-color -format is emitted. -.TP -.B \-pnm -Select PBMPLUS (PPM/PGM) output format (this is the default format). -PGM is emitted if the JPEG file is gray-scale or if -.B \-grayscale -is specified; otherwise PPM is emitted. -.TP -.B \-rle -Select RLE output format. (Requires URT library.) -.TP -.B \-targa -Select Targa output format. Gray-scale format is emitted if the JPEG file is -gray-scale or if -.B \-grayscale -is specified; otherwise, colormapped format is emitted if -.B \-colors -is specified; otherwise, 24-bit full-color format is emitted. -.PP -Switches for advanced users: -.TP -.B \-dct int -Use integer DCT method (default). -.TP -.B \-dct fast -Use fast integer DCT (less accurate). -.TP -.B \-dct float -Use floating-point DCT method. -The float method is very slightly more accurate than the int method, but is -much slower unless your machine has very fast floating-point hardware. Also -note that results of the floating-point method may vary slightly across -machines, while the integer methods should give the same results everywhere. -The fast integer method is much less accurate than the other two. -.TP -.B \-dither fs -Use Floyd-Steinberg dithering in color quantization. -.TP -.B \-dither ordered -Use ordered dithering in color quantization. -.TP -.B \-dither none -Do not use dithering in color quantization. -By default, Floyd-Steinberg dithering is applied when quantizing colors; this -is slow but usually produces the best results. Ordered dither is a compromise -between speed and quality; no dithering is fast but usually looks awful. Note -that these switches have no effect unless color quantization is being done. -Ordered dither is only available in -.B \-onepass -mode. -.TP -.BI \-map " file" -Quantize to the colors used in the specified image file. This is useful for -producing multiple files with identical color maps, or for forcing a -predefined set of colors to be used. The -.I file -must be a GIF or PPM file. This option overrides -.B \-colors -and -.BR \-onepass . -.TP -.B \-nosmooth -Don't use high-quality upsampling. -.TP -.B \-onepass -Use one-pass instead of two-pass color quantization. The one-pass method is -faster and needs less memory, but it produces a lower-quality image. -.B \-onepass -is ignored unless you also say -.B \-colors -.IR N . -Also, the one-pass method is always used for gray-scale output (the two-pass -method is no improvement then). -.TP -.BI \-maxmemory " N" -Set limit for amount of memory to use in processing large images. Value is -in thousands of bytes, or millions of bytes if "M" is attached to the -number. For example, -.B \-max 4m -selects 4000000 bytes. If more space is needed, temporary files will be used. -.TP -.BI \-outfile " name" -Send output image to the named file, not to standard output. -.TP -.B \-verbose -Enable debug printout. More -.BR \-v 's -give more output. Also, version information is printed at startup. -.TP -.B \-debug -Same as -.BR \-verbose . -.SH EXAMPLES -.LP -This example decompresses the JPEG file foo.jpg, quantizes it to -256 colors, and saves the output in 8-bit BMP format in foo.bmp: -.IP -.B djpeg \-colors 256 \-bmp -.I foo.jpg -.B > -.I foo.bmp -.SH HINTS -To get a quick preview of an image, use the -.B \-grayscale -and/or -.B \-scale -switches. -.B \-grayscale \-scale 1/8 -is the fastest case. -.PP -Several options are available that trade off image quality to gain speed. -.B \-fast -turns on the recommended settings. -.PP -.B \-dct fast -and/or -.B \-nosmooth -gain speed at a small sacrifice in quality. -When producing a color-quantized image, -.B \-onepass \-dither ordered -is fast but much lower quality than the default behavior. -.B \-dither none -may give acceptable results in two-pass mode, but is seldom tolerable in -one-pass mode. -.PP -If you are fortunate enough to have very fast floating point hardware, -\fB\-dct float\fR may be even faster than \fB\-dct fast\fR. But on most -machines \fB\-dct float\fR is slower than \fB\-dct int\fR; in this case it is -not worth using, because its theoretical accuracy advantage is too small to be -significant in practice. -.SH ENVIRONMENT -.TP -.B JPEGMEM -If this environment variable is set, its value is the default memory limit. -The value is specified as described for the -.B \-maxmemory -switch. -.B JPEGMEM -overrides the default value specified when the program was compiled, and -itself is overridden by an explicit -.BR \-maxmemory . -.SH SEE ALSO -.BR cjpeg (1), -.BR jpegtran (1), -.BR rdjpgcom (1), -.BR wrjpgcom (1) -.br -.BR ppm (5), -.BR pgm (5) -.br -Wallace, Gregory K. "The JPEG Still Picture Compression Standard", -Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. -.SH AUTHOR -Independent JPEG Group -.SH BUGS -To avoid the Unisys LZW patent, -.B djpeg -produces uncompressed GIF files. These are larger than they should be, but -are readable by standard GIF decoders. diff --git a/misc/builddeps/dp.linux32/share/man/man1/jpegtran.1 b/misc/builddeps/dp.linux32/share/man/man1/jpegtran.1 deleted file mode 100644 index 0ad1bbc8..00000000 --- a/misc/builddeps/dp.linux32/share/man/man1/jpegtran.1 +++ /dev/null @@ -1,285 +0,0 @@ -.TH JPEGTRAN 1 "28 December 2009" -.SH NAME -jpegtran \- lossless transformation of JPEG files -.SH SYNOPSIS -.B jpegtran -[ -.I options -] -[ -.I filename -] -.LP -.SH DESCRIPTION -.LP -.B jpegtran -performs various useful transformations of JPEG files. -It can translate the coded representation from one variant of JPEG to another, -for example from baseline JPEG to progressive JPEG or vice versa. It can also -perform some rearrangements of the image data, for example turning an image -from landscape to portrait format by rotation. -.PP -.B jpegtran -works by rearranging the compressed data (DCT coefficients), without -ever fully decoding the image. Therefore, its transformations are lossless: -there is no image degradation at all, which would not be true if you used -.B djpeg -followed by -.B cjpeg -to accomplish the same conversion. But by the same token, -.B jpegtran -cannot perform lossy operations such as changing the image quality. -.PP -.B jpegtran -reads the named JPEG/JFIF file, or the standard input if no file is -named, and produces a JPEG/JFIF file on the standard output. -.SH OPTIONS -All switch names may be abbreviated; for example, -.B \-optimize -may be written -.B \-opt -or -.BR \-o . -Upper and lower case are equivalent. -British spellings are also accepted (e.g., -.BR \-optimise ), -though for brevity these are not mentioned below. -.PP -To specify the coded JPEG representation used in the output file, -.B jpegtran -accepts a subset of the switches recognized by -.BR cjpeg : -.TP -.B \-optimize -Perform optimization of entropy encoding parameters. -.TP -.B \-progressive -Create progressive JPEG file. -.TP -.BI \-restart " N" -Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is -attached to the number. -.TP -.B \-arithmetic -Use arithmetic coding. -.TP -.BI \-scans " file" -Use the scan script given in the specified text file. -.PP -See -.BR cjpeg (1) -for more details about these switches. -If you specify none of these switches, you get a plain baseline-JPEG output -file. The quality setting and so forth are determined by the input file. -.PP -The image can be losslessly transformed by giving one of these switches: -.TP -.B \-flip horizontal -Mirror image horizontally (left-right). -.TP -.B \-flip vertical -Mirror image vertically (top-bottom). -.TP -.B \-rotate 90 -Rotate image 90 degrees clockwise. -.TP -.B \-rotate 180 -Rotate image 180 degrees. -.TP -.B \-rotate 270 -Rotate image 270 degrees clockwise (or 90 ccw). -.TP -.B \-transpose -Transpose image (across UL-to-LR axis). -.TP -.B \-transverse -Transverse transpose (across UR-to-LL axis). -.IP -The transpose transformation has no restrictions regarding image dimensions. -The other transformations operate rather oddly if the image dimensions are not -a multiple of the iMCU size (usually 8 or 16 pixels), because they can only -transform complete blocks of DCT coefficient data in the desired way. -.IP -.BR jpegtran 's -default behavior when transforming an odd-size image is designed -to preserve exact reversibility and mathematical consistency of the -transformation set. As stated, transpose is able to flip the entire image -area. Horizontal mirroring leaves any partial iMCU column at the right edge -untouched, but is able to flip all rows of the image. Similarly, vertical -mirroring leaves any partial iMCU row at the bottom edge untouched, but is -able to flip all columns. The other transforms can be built up as sequences -of transpose and flip operations; for consistency, their actions on edge -pixels are defined to be the same as the end result of the corresponding -transpose-and-flip sequence. -.IP -For practical use, you may prefer to discard any untransformable edge pixels -rather than having a strange-looking strip along the right and/or bottom edges -of a transformed image. To do this, add the -.B \-trim -switch: -.TP -.B \-trim -Drop non-transformable edge blocks. -.IP -Obviously, a transformation with -.B \-trim -is not reversible, so strictly speaking -.B jpegtran -with this switch is not lossless. Also, the expected mathematical -equivalences between the transformations no longer hold. For example, -.B \-rot 270 -trim -trims only the bottom edge, but -.B \-rot 90 -trim -followed by -.B \-rot 180 -trim -trims both edges. -.IP -If you are only interested in perfect transformation, add the -.B \-perfect -switch: -.TP -.B \-perfect -Fails with an error if the transformation is not perfect. -.IP -For example you may want to do -.IP -.B (jpegtran \-rot 90 -perfect -.I foo.jpg -.B || djpeg -.I foo.jpg -.B | pnmflip \-r90 | cjpeg) -.IP -to do a perfect rotation if available or an approximated one if not. -.PP -We also offer a lossless-crop option, which discards data outside a given -image region but losslessly preserves what is inside. Like the rotate and -flip transforms, lossless crop is restricted by the current JPEG format: the -upper left corner of the selected region must fall on an iMCU boundary. If -this does not hold for the given crop parameters, we silently move the upper -left corner up and/or left to make it so, simultaneously increasing the region -dimensions to keep the lower right crop corner unchanged. (Thus, the output -image covers at least the requested region, but may cover more.) - -The image can be losslessly cropped by giving the switch: -.TP -.B \-crop WxH+X+Y -Crop to a rectangular subarea of width W, height H starting at point X,Y. -.PP -Other not-strictly-lossless transformation switches are: -.TP -.B \-grayscale -Force grayscale output. -.IP -This option discards the chrominance channels if the input image is YCbCr -(ie, a standard color JPEG), resulting in a grayscale JPEG file. The -luminance channel is preserved exactly, so this is a better method of reducing -to grayscale than decompression, conversion, and recompression. This switch -is particularly handy for fixing a monochrome picture that was mistakenly -encoded as a color JPEG. (In such a case, the space savings from getting rid -of the near-empty chroma channels won't be large; but the decoding time for -a grayscale JPEG is substantially less than that for a color JPEG.) -.TP -.BI \-scale " M/N" -Scale the output image by a factor M/N. -.IP -Currently supported scale factors are M/N with all M from 1 to 16, where N is -the source DCT size, which is 8 for baseline JPEG. If the /N part is omitted, -then M specifies the DCT scaled size to be applied on the given input. For -baseline JPEG this is equivalent to M/8 scaling, since the source DCT size -for baseline JPEG is 8. -.B Caution: -An implementation of the JPEG SmartScale extension is required for this -feature. SmartScale enabled JPEG is not yet widely implemented, so many -decoders will be unable to view a SmartScale extended JPEG file at all. -.PP -.B jpegtran -also recognizes these switches that control what to do with "extra" markers, -such as comment blocks: -.TP -.B \-copy none -Copy no extra markers from source file. This setting suppresses all -comments and other excess baggage present in the source file. -.TP -.B \-copy comments -Copy only comment markers. This setting copies comments from the source file, -but discards any other inessential (for image display) data. -.TP -.B \-copy all -Copy all extra markers. This setting preserves miscellaneous markers -found in the source file, such as JFIF thumbnails, Exif data, and Photoshop -settings. In some files these extra markers can be sizable. -.IP -The default behavior is -.BR "\-copy comments" . -(Note: in IJG releases v6 and v6a, -.B jpegtran -always did the equivalent of -.BR "\-copy none" .) -.PP -Additional switches recognized by jpegtran are: -.TP -.BI \-maxmemory " N" -Set limit for amount of memory to use in processing large images. Value is -in thousands of bytes, or millions of bytes if "M" is attached to the -number. For example, -.B \-max 4m -selects 4000000 bytes. If more space is needed, temporary files will be used. -.TP -.BI \-outfile " name" -Send output image to the named file, not to standard output. -.TP -.B \-verbose -Enable debug printout. More -.BR \-v 's -give more output. Also, version information is printed at startup. -.TP -.B \-debug -Same as -.BR \-verbose . -.SH EXAMPLES -.LP -This example converts a baseline JPEG file to progressive form: -.IP -.B jpegtran \-progressive -.I foo.jpg -.B > -.I fooprog.jpg -.PP -This example rotates an image 90 degrees clockwise, discarding any -unrotatable edge pixels: -.IP -.B jpegtran \-rot 90 -trim -.I foo.jpg -.B > -.I foo90.jpg -.SH ENVIRONMENT -.TP -.B JPEGMEM -If this environment variable is set, its value is the default memory limit. -The value is specified as described for the -.B \-maxmemory -switch. -.B JPEGMEM -overrides the default value specified when the program was compiled, and -itself is overridden by an explicit -.BR \-maxmemory . -.SH SEE ALSO -.BR cjpeg (1), -.BR djpeg (1), -.BR rdjpgcom (1), -.BR wrjpgcom (1) -.br -Wallace, Gregory K. "The JPEG Still Picture Compression Standard", -Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. -.SH AUTHOR -Independent JPEG Group -.SH BUGS -The transform options can't transform odd-size images perfectly. Use -.B \-trim -or -.B \-perfect -if you don't like the results. -.PP -The entire image is read into memory and then written out again, even in -cases where this isn't really necessary. Expect swapping on large images, -especially when using the more complex transform options. diff --git a/misc/builddeps/dp.linux32/share/man/man1/rdjpgcom.1 b/misc/builddeps/dp.linux32/share/man/man1/rdjpgcom.1 deleted file mode 100644 index 97611df8..00000000 --- a/misc/builddeps/dp.linux32/share/man/man1/rdjpgcom.1 +++ /dev/null @@ -1,63 +0,0 @@ -.TH RDJPGCOM 1 "02 April 2009" -.SH NAME -rdjpgcom \- display text comments from a JPEG file -.SH SYNOPSIS -.B rdjpgcom -[ -.B \-raw -] -[ -.B \-verbose -] -[ -.I filename -] -.LP -.SH DESCRIPTION -.LP -.B rdjpgcom -reads the named JPEG/JFIF file, or the standard input if no file is named, -and prints any text comments found in the file on the standard output. -.PP -The JPEG standard allows "comment" (COM) blocks to occur within a JPEG file. -Although the standard doesn't actually define what COM blocks are for, they -are widely used to hold user-supplied text strings. This lets you add -annotations, titles, index terms, etc to your JPEG files, and later retrieve -them as text. COM blocks do not interfere with the image stored in the JPEG -file. The maximum size of a COM block is 64K, but you can have as many of -them as you like in one JPEG file. -.SH OPTIONS -.TP -.B \-raw -Normally -.B rdjpgcom -escapes non-printable characters in comments, for security reasons. -This option avoids that. -.PP -.B \-verbose -Causes -.B rdjpgcom -to also display the JPEG image dimensions. -.PP -Switch names may be abbreviated, and are not case sensitive. -.SH HINTS -.B rdjpgcom -does not depend on the IJG JPEG library. Its source code is intended as an -illustration of the minimum amount of code required to parse a JPEG file -header correctly. -.PP -In -.B \-verbose -mode, -.B rdjpgcom -will also attempt to print the contents of any "APP12" markers as text. -Some digital cameras produce APP12 markers containing useful textual -information. If you like, you can modify the source code to print -other APPn marker types as well. -.SH SEE ALSO -.BR cjpeg (1), -.BR djpeg (1), -.BR jpegtran (1), -.BR wrjpgcom (1) -.SH AUTHOR -Independent JPEG Group diff --git a/misc/builddeps/dp.linux32/share/man/man1/wrjpgcom.1 b/misc/builddeps/dp.linux32/share/man/man1/wrjpgcom.1 deleted file mode 100644 index d419a999..00000000 --- a/misc/builddeps/dp.linux32/share/man/man1/wrjpgcom.1 +++ /dev/null @@ -1,103 +0,0 @@ -.TH WRJPGCOM 1 "15 June 1995" -.SH NAME -wrjpgcom \- insert text comments into a JPEG file -.SH SYNOPSIS -.B wrjpgcom -[ -.B \-replace -] -[ -.BI \-comment " text" -] -[ -.BI \-cfile " name" -] -[ -.I filename -] -.LP -.SH DESCRIPTION -.LP -.B wrjpgcom -reads the named JPEG/JFIF file, or the standard input if no file is named, -and generates a new JPEG/JFIF file on standard output. A comment block is -added to the file. -.PP -The JPEG standard allows "comment" (COM) blocks to occur within a JPEG file. -Although the standard doesn't actually define what COM blocks are for, they -are widely used to hold user-supplied text strings. This lets you add -annotations, titles, index terms, etc to your JPEG files, and later retrieve -them as text. COM blocks do not interfere with the image stored in the JPEG -file. The maximum size of a COM block is 64K, but you can have as many of -them as you like in one JPEG file. -.PP -.B wrjpgcom -adds a COM block, containing text you provide, to a JPEG file. -Ordinarily, the COM block is added after any existing COM blocks; but you -can delete the old COM blocks if you wish. -.SH OPTIONS -Switch names may be abbreviated, and are not case sensitive. -.TP -.B \-replace -Delete any existing COM blocks from the file. -.TP -.BI \-comment " text" -Supply text for new COM block on command line. -.TP -.BI \-cfile " name" -Read text for new COM block from named file. -.PP -If you have only one line of comment text to add, you can provide it on the -command line with -.BR \-comment . -The comment text must be surrounded with quotes so that it is treated as a -single argument. Longer comments can be read from a text file. -.PP -If you give neither -.B \-comment -nor -.BR \-cfile , -then -.B wrjpgcom -will read the comment text from standard input. (In this case an input image -file name MUST be supplied, so that the source JPEG file comes from somewhere -else.) You can enter multiple lines, up to 64KB worth. Type an end-of-file -indicator (usually control-D) to terminate the comment text entry. -.PP -.B wrjpgcom -will not add a COM block if the provided comment string is empty. Therefore -\fB\-replace \-comment ""\fR can be used to delete all COM blocks from a file. -.SH EXAMPLES -.LP -Add a short comment to in.jpg, producing out.jpg: -.IP -.B wrjpgcom \-c -\fI"View of my back yard" in.jpg -.B > -.I out.jpg -.PP -Attach a long comment previously stored in comment.txt: -.IP -.B wrjpgcom -.I in.jpg -.B < -.I comment.txt -.B > -.I out.jpg -.PP -or equivalently -.IP -.B wrjpgcom -.B -cfile -.I comment.txt -.B < -.I in.jpg -.B > -.I out.jpg -.SH SEE ALSO -.BR cjpeg (1), -.BR djpeg (1), -.BR jpegtran (1), -.BR rdjpgcom (1) -.SH AUTHOR -Independent JPEG Group diff --git a/misc/builddeps/dp.linux64/bin/blind_id b/misc/builddeps/dp.linux64/bin/blind_id deleted file mode 100755 index 775836cd..00000000 Binary files a/misc/builddeps/dp.linux64/bin/blind_id and /dev/null differ diff --git a/misc/builddeps/dp.linux64/bin/cjpeg b/misc/builddeps/dp.linux64/bin/cjpeg deleted file mode 100755 index 66b7f58f..00000000 Binary files a/misc/builddeps/dp.linux64/bin/cjpeg and /dev/null differ diff --git a/misc/builddeps/dp.linux64/bin/djpeg b/misc/builddeps/dp.linux64/bin/djpeg deleted file mode 100755 index 561ec38f..00000000 Binary files a/misc/builddeps/dp.linux64/bin/djpeg and /dev/null differ diff --git a/misc/builddeps/dp.linux64/bin/jpegtran b/misc/builddeps/dp.linux64/bin/jpegtran deleted file mode 100755 index ccdabd2a..00000000 Binary files a/misc/builddeps/dp.linux64/bin/jpegtran and /dev/null differ diff --git a/misc/builddeps/dp.linux64/bin/ode-config b/misc/builddeps/dp.linux64/bin/ode-config deleted file mode 100755 index dddc75da..00000000 --- a/misc/builddeps/dp.linux64/bin/ode-config +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/sh - -prefix=/usr/local -exec_prefix=${prefix} -exec_prefix_set=no - -usage="\ -Usage: ode-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]" - -if test $# -eq 0; then - echo "${usage}" 1>&2 - exit 1 -fi - -while test $# -gt 0; do - case "$1" in - -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - case $1 in - --prefix=*) - prefix=$optarg - if test $exec_prefix_set = no ; then - exec_prefix=$optarg - fi - ;; - --prefix) - echo $prefix - ;; - --exec-prefix=*) - exec_prefix=$optarg - exec_prefix_set=yes - ;; - --exec-prefix) - echo $exec_prefix - ;; - --version) - echo 0.12 - ;; - --cflags) - echo -I${prefix}/include -DdDOUBLE - ;; - --libs) - echo -L${exec_prefix}/lib -lode - ;; - *) - echo "${usage}" 1>&2 - exit 1 - ;; - esac - shift -done diff --git a/misc/builddeps/dp.linux64/bin/rdjpgcom b/misc/builddeps/dp.linux64/bin/rdjpgcom deleted file mode 100755 index eab09a27..00000000 Binary files a/misc/builddeps/dp.linux64/bin/rdjpgcom and /dev/null differ diff --git a/misc/builddeps/dp.linux64/bin/wrjpgcom b/misc/builddeps/dp.linux64/bin/wrjpgcom deleted file mode 100755 index 7485c62a..00000000 Binary files a/misc/builddeps/dp.linux64/bin/wrjpgcom and /dev/null differ diff --git a/misc/builddeps/dp.linux64/include/d0_blind_id/d0.h b/misc/builddeps/dp.linux64/include/d0_blind_id/d0.h deleted file mode 100644 index 4c8708e3..00000000 --- a/misc/builddeps/dp.linux64/include/d0_blind_id/d0.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * FILE: d0.h - * AUTHOR: Rudolf Polzer - divVerent@xonotic.org - * - * Copyright (c) 2010, Rudolf Polzer - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $Format:commit %H$ - * $Id: 6c55afeb50f24bd316079ae46582e65f8020b19b $ - */ - -#ifndef __D0_H__ -#define __D0_H__ - -#include // size_t - -#define D0_EXPORT __attribute__((__visibility__("default"))) -#define D0_USED __attribute__((used)) -#define D0_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -#define D0_BOOL int - -typedef void *(d0_malloc_t)(size_t len); -typedef void (d0_free_t)(void *p); -typedef void *(d0_createmutex_t)(void); -typedef void (d0_destroymutex_t)(void *); -typedef int (d0_lockmutex_t)(void *); // zero on success -typedef int (d0_unlockmutex_t)(void *); // zero on success - -extern d0_malloc_t *d0_malloc; -extern d0_free_t *d0_free; -extern d0_createmutex_t *d0_createmutex; -extern d0_destroymutex_t *d0_destroymutex; -extern d0_lockmutex_t *d0_lockmutex; -extern d0_unlockmutex_t *d0_unlockmutex; - -void d0_setmallocfuncs(d0_malloc_t *m, d0_free_t *f); -void d0_setmutexfuncs(d0_createmutex_t *c, d0_destroymutex_t *d, d0_lockmutex_t *l, d0_unlockmutex_t *u); -void d0_initfuncs(void); // initializes them, this needs to be only called internally once - -extern const char *d0_bsd_license_notice; - -#endif diff --git a/misc/builddeps/dp.linux64/include/d0_blind_id/d0_blind_id.h b/misc/builddeps/dp.linux64/include/d0_blind_id/d0_blind_id.h deleted file mode 100644 index f546b679..00000000 --- a/misc/builddeps/dp.linux64/include/d0_blind_id/d0_blind_id.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * FILE: d0_blind_id.h - * AUTHOR: Rudolf Polzer - divVerent@xonotic.org - * - * Copyright (c) 2010, Rudolf Polzer - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $Format:commit %H$ - * $Id: bf838f43093aceadcd2d20071684f1e7148a4332 $ - */ - -#ifndef __D0_BLIND_ID_H__ -#define __D0_BLIND_ID_H__ - -#include "d0.h" - -typedef struct d0_blind_id_s d0_blind_id_t; -typedef D0_BOOL (*d0_fastreject_function) (const d0_blind_id_t *ctx, void *pass); - -D0_EXPORT D0_WARN_UNUSED_RESULT d0_blind_id_t *d0_blind_id_new(void); -D0_EXPORT void d0_blind_id_free(d0_blind_id_t *a); -D0_EXPORT void d0_blind_id_clear(d0_blind_id_t *ctx); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_copy(d0_blind_id_t *ctx, const d0_blind_id_t *src); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_generate_private_key(d0_blind_id_t *ctx, int k); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_generate_private_key_fastreject(d0_blind_id_t *ctx, int k, d0_fastreject_function reject, void *pass); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_read_private_key(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_read_public_key(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_write_private_key(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_write_public_key(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_fingerprint64_public_key(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_generate_private_id_modulus(d0_blind_id_t *ctx); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_read_private_id_modulus(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_write_private_id_modulus(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_generate_private_id_start(d0_blind_id_t *ctx); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_generate_private_id_request(d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_answer_private_id_request(const d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_finish_private_id_request(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_read_private_id_request_camouflage(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_write_private_id_request_camouflage(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_read_private_id(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_read_public_id(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_write_private_id(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_write_public_id(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_authenticate_with_private_id_start(d0_blind_id_t *ctx, D0_BOOL is_first, D0_BOOL send_modulus, const char *message, size_t msglen, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_authenticate_with_private_id_challenge(d0_blind_id_t *ctx, D0_BOOL is_first, D0_BOOL recv_modulus, const char *inbuf, size_t inbuflen, char *outbuf, size_t *outbuflen, D0_BOOL *status); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_authenticate_with_private_id_response(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_authenticate_with_private_id_verify(d0_blind_id_t *ctx, const char *inbuf, size_t inbuflen, char *msg, size_t *msglen, D0_BOOL *status); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_authenticate_with_private_id_generate_missing_signature(d0_blind_id_t *ctx); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_sign_with_private_id_sign(d0_blind_id_t *ctx, D0_BOOL is_first, D0_BOOL send_modulus, const char *message, size_t msglen, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_sign_with_private_id_sign_detached(d0_blind_id_t *ctx, D0_BOOL is_first, D0_BOOL send_modulus, const char *message, size_t msglen, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_sign_with_private_id_verify(d0_blind_id_t *ctx, D0_BOOL is_first, D0_BOOL recv_modulus, const char *inbuf, size_t inbuflen, char *msg, size_t *msglen, D0_BOOL *status); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_sign_with_private_id_verify_detached(d0_blind_id_t *ctx, D0_BOOL is_first, D0_BOOL recv_modulus, const char *inbuf, size_t inbuflen, const char *msg, size_t msglen, D0_BOOL *status); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_fingerprint64_public_id(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_verify_public_id(const d0_blind_id_t *ctx, D0_BOOL *status); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_verify_private_id(const d0_blind_id_t *ctx); -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_sessionkey_public_id(const d0_blind_id_t *ctx, char *outbuf, size_t *outbuflen); // can only be done after successful key exchange, this performs a modpow; key length is limited by SHA_DIGESTSIZE for now; also ONLY valid after successful d0_blind_id_authenticate_with_private_id_verify/d0_blind_id_fingerprint64_public_id - -D0_EXPORT D0_WARN_UNUSED_RESULT D0_BOOL d0_blind_id_INITIALIZE(void); -D0_EXPORT void d0_blind_id_SHUTDOWN(void); - -D0_EXPORT void d0_blind_id_util_sha256(char *out, const char *in, size_t n); - -// for exporting -D0_EXPORT void d0_blind_id_setmallocfuncs(d0_malloc_t *m, d0_free_t *f); -D0_EXPORT void d0_blind_id_setmutexfuncs(d0_createmutex_t *c, d0_destroymutex_t *d, d0_lockmutex_t *l, d0_unlockmutex_t *u); - -#endif diff --git a/misc/builddeps/dp.linux64/include/d0_blind_id/d0_rijndael.h b/misc/builddeps/dp.linux64/include/d0_blind_id/d0_rijndael.h deleted file mode 100644 index e1c8f71b..00000000 --- a/misc/builddeps/dp.linux64/include/d0_blind_id/d0_rijndael.h +++ /dev/null @@ -1,21 +0,0 @@ -// from http://www.efgh.com/software/rijndael.htm (public domain) - -#ifndef H__RIJNDAEL -#define H__RIJNDAEL - -#include "d0.h" - -D0_EXPORT int d0_rijndael_setup_encrypt(unsigned long *rk, const unsigned char *key, - int keybits); -D0_EXPORT int d0_rijndael_setup_decrypt(unsigned long *rk, const unsigned char *key, - int keybits); -D0_EXPORT void d0_rijndael_encrypt(const unsigned long *rk, int nrounds, - const unsigned char plaintext[16], unsigned char ciphertext[16]); -D0_EXPORT void d0_rijndael_decrypt(const unsigned long *rk, int nrounds, - const unsigned char ciphertext[16], unsigned char plaintext[16]); - -#define D0_RIJNDAEL_KEYLENGTH(keybits) ((keybits)/8) -#define D0_RIJNDAEL_RKLENGTH(keybits) ((keybits)/8+28) -#define D0_RIJNDAEL_NROUNDS(keybits) ((keybits)/32+6) - -#endif diff --git a/misc/builddeps/dp.linux64/include/gmp.h b/misc/builddeps/dp.linux64/include/gmp.h deleted file mode 100644 index e8cc9b39..00000000 --- a/misc/builddeps/dp.linux64/include/gmp.h +++ /dev/null @@ -1,2280 +0,0 @@ -/* Definitions for GNU multiple precision functions. -*- mode: c -*- - -Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, -2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP Library is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 3 of the License, or (at your -option) any later version. - -The GNU MP 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 Lesser General Public -License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ - -#ifndef __GMP_H__ - -#if defined (__cplusplus) -#include /* for std::istream, std::ostream, std::string */ -#include -#endif - - -/* Instantiated by configure. */ -#if ! defined (__GMP_WITHIN_CONFIGURE) -#define __GMP_HAVE_HOST_CPU_FAMILY_power 0 -#define __GMP_HAVE_HOST_CPU_FAMILY_powerpc 0 -#define GMP_LIMB_BITS 64 -#define GMP_NAIL_BITS 0 -#endif -#define GMP_NUMB_BITS (GMP_LIMB_BITS - GMP_NAIL_BITS) -#define GMP_NUMB_MASK ((~ __GMP_CAST (mp_limb_t, 0)) >> GMP_NAIL_BITS) -#define GMP_NUMB_MAX GMP_NUMB_MASK -#define GMP_NAIL_MASK (~ GMP_NUMB_MASK) - - -/* The following (everything under ifndef __GNU_MP__) must be identical in - gmp.h and mp.h to allow both to be included in an application or during - the library build. */ -#ifndef __GNU_MP__ -#define __GNU_MP__ 5 - -#define __need_size_t /* tell gcc stddef.h we only want size_t */ -#if defined (__cplusplus) -#include /* for size_t */ -#else -#include /* for size_t */ -#endif -#undef __need_size_t - -/* Instantiated by configure. */ -#if ! defined (__GMP_WITHIN_CONFIGURE) -/* #undef _LONG_LONG_LIMB */ -#define __GMP_LIBGMP_DLL 0 -#endif - - -/* __STDC__ - some ANSI compilers define this only to 0, hence the use of - "defined" and not "__STDC__-0". In particular Sun workshop C 5.0 - sets __STDC__ to 0, but requires "##" for token pasting. - - _AIX - gnu ansidecl.h asserts that all known AIX compilers are ANSI but - don't always define __STDC__. - - __DECC - current versions of DEC C (5.9 for instance) for alpha are ANSI, - but don't define __STDC__ in their default mode. Don't know if old - versions might have been K&R, but let's not worry about that unless - someone is still using one. - - _mips - gnu ansidecl.h says the RISC/OS MIPS compiler is ANSI in SVR4 - mode, but doesn't define __STDC__. - - _MSC_VER - Microsoft C is ANSI, but __STDC__ is undefined unless the /Za - option is given (in which case it's 1). - - _WIN32 - tested for by gnu ansidecl.h, no doubt on the assumption that - all w32 compilers are ansi. - - Note: This same set of tests is used by gen-psqr.c and - demos/expr/expr-impl.h, so if anything needs adding, then be sure to - update those too. */ - -#if defined (__STDC__) \ - || defined (__cplusplus) \ - || defined (_AIX) \ - || defined (__DECC) \ - || (defined (__mips) && defined (_SYSTYPE_SVR4)) \ - || defined (_MSC_VER) \ - || defined (_WIN32) -#define __GMP_HAVE_CONST 1 -#define __GMP_HAVE_PROTOTYPES 1 -#define __GMP_HAVE_TOKEN_PASTE 1 -#else -#define __GMP_HAVE_CONST 0 -#define __GMP_HAVE_PROTOTYPES 0 -#define __GMP_HAVE_TOKEN_PASTE 0 -#endif - - -#if __GMP_HAVE_CONST -#define __gmp_const const -#define __gmp_signed signed -#else -#define __gmp_const -#define __gmp_signed -#endif - - -/* __GMP_DECLSPEC supports Windows DLL versions of libgmp, and is empty in - all other circumstances. - - When compiling objects for libgmp, __GMP_DECLSPEC is an export directive, - or when compiling for an application it's an import directive. The two - cases are differentiated by __GMP_WITHIN_GMP defined by the GMP Makefiles - (and not defined from an application). - - __GMP_DECLSPEC_XX is similarly used for libgmpxx. __GMP_WITHIN_GMPXX - indicates when building libgmpxx, and in that case libgmpxx functions are - exports, but libgmp functions which might get called are imports. - - libmp.la uses __GMP_DECLSPEC, just as if it were libgmp.la. libgmp and - libmp don't call each other, so there's no conflict or confusion. - - Libtool DLL_EXPORT define is not used. - - There's no attempt to support GMP built both static and DLL. Doing so - would mean applications would have to tell us which of the two is going - to be used when linking, and that seems very tedious and error prone if - using GMP by hand, and equally tedious from a package since autoconf and - automake don't give much help. - - __GMP_DECLSPEC is required on all documented global functions and - variables, the various internals in gmp-impl.h etc can be left unadorned. - But internals used by the test programs or speed measuring programs - should have __GMP_DECLSPEC, and certainly constants or variables must - have it or the wrong address will be resolved. - - In gcc __declspec can go at either the start or end of a prototype. - - In Microsoft C __declspec must go at the start, or after the type like - void __declspec(...) *foo()". There's no __dllexport or anything to - guard against someone foolish #defining dllexport. _export used to be - available, but no longer. - - In Borland C _export still exists, but needs to go after the type, like - "void _export foo();". Would have to change the __GMP_DECLSPEC syntax to - make use of that. Probably more trouble than it's worth. */ - -#if defined (__GNUC__) -#define __GMP_DECLSPEC_EXPORT __declspec(__dllexport__) -#define __GMP_DECLSPEC_IMPORT __declspec(__dllimport__) -#endif -#if defined (_MSC_VER) || defined (__BORLANDC__) -#define __GMP_DECLSPEC_EXPORT __declspec(dllexport) -#define __GMP_DECLSPEC_IMPORT __declspec(dllimport) -#endif -#ifdef __WATCOMC__ -#define __GMP_DECLSPEC_EXPORT __export -#define __GMP_DECLSPEC_IMPORT __import -#endif -#ifdef __IBMC__ -#define __GMP_DECLSPEC_EXPORT _Export -#define __GMP_DECLSPEC_IMPORT _Import -#endif - -#if __GMP_LIBGMP_DLL -#if __GMP_WITHIN_GMP -/* compiling to go into a DLL libgmp */ -#define __GMP_DECLSPEC __GMP_DECLSPEC_EXPORT -#else -/* compiling to go into an application which will link to a DLL libgmp */ -#define __GMP_DECLSPEC __GMP_DECLSPEC_IMPORT -#endif -#else -/* all other cases */ -#define __GMP_DECLSPEC -#endif - - -#ifdef __GMP_SHORT_LIMB -typedef unsigned int mp_limb_t; -typedef int mp_limb_signed_t; -#else -#ifdef _LONG_LONG_LIMB -typedef unsigned long long int mp_limb_t; -typedef long long int mp_limb_signed_t; -#else -typedef unsigned long int mp_limb_t; -typedef long int mp_limb_signed_t; -#endif -#endif -typedef unsigned long int mp_bitcnt_t; - -/* For reference, note that the name __mpz_struct gets into C++ mangled - function names, which means although the "__" suggests an internal, we - must leave this name for binary compatibility. */ -typedef struct -{ - int _mp_alloc; /* Number of *limbs* allocated and pointed - to by the _mp_d field. */ - int _mp_size; /* abs(_mp_size) is the number of limbs the - last field points to. If _mp_size is - negative this is a negative number. */ - mp_limb_t *_mp_d; /* Pointer to the limbs. */ -} __mpz_struct; - -#endif /* __GNU_MP__ */ - - -typedef __mpz_struct MP_INT; /* gmp 1 source compatibility */ -typedef __mpz_struct mpz_t[1]; - -typedef mp_limb_t * mp_ptr; -typedef __gmp_const mp_limb_t * mp_srcptr; -#if defined (_CRAY) && ! defined (_CRAYMPP) -/* plain `int' is much faster (48 bits) */ -#define __GMP_MP_SIZE_T_INT 1 -typedef int mp_size_t; -typedef int mp_exp_t; -#else -#define __GMP_MP_SIZE_T_INT 0 -typedef long int mp_size_t; -typedef long int mp_exp_t; -#endif - -typedef struct -{ - __mpz_struct _mp_num; - __mpz_struct _mp_den; -} __mpq_struct; - -typedef __mpq_struct MP_RAT; /* gmp 1 source compatibility */ -typedef __mpq_struct mpq_t[1]; - -typedef struct -{ - int _mp_prec; /* Max precision, in number of `mp_limb_t's. - Set by mpf_init and modified by - mpf_set_prec. The area pointed to by the - _mp_d field contains `prec' + 1 limbs. */ - int _mp_size; /* abs(_mp_size) is the number of limbs the - last field points to. If _mp_size is - negative this is a negative number. */ - mp_exp_t _mp_exp; /* Exponent, in the base of `mp_limb_t'. */ - mp_limb_t *_mp_d; /* Pointer to the limbs. */ -} __mpf_struct; - -/* typedef __mpf_struct MP_FLOAT; */ -typedef __mpf_struct mpf_t[1]; - -/* Available random number generation algorithms. */ -typedef enum -{ - GMP_RAND_ALG_DEFAULT = 0, - GMP_RAND_ALG_LC = GMP_RAND_ALG_DEFAULT /* Linear congruential. */ -} gmp_randalg_t; - -/* Random state struct. */ -typedef struct -{ - mpz_t _mp_seed; /* _mp_d member points to state of the generator. */ - gmp_randalg_t _mp_alg; /* Currently unused. */ - union { - void *_mp_lc; /* Pointer to function pointers structure. */ - } _mp_algdata; -} __gmp_randstate_struct; -typedef __gmp_randstate_struct gmp_randstate_t[1]; - -/* Types for function declarations in gmp files. */ -/* ??? Should not pollute user name space with these ??? */ -typedef __gmp_const __mpz_struct *mpz_srcptr; -typedef __mpz_struct *mpz_ptr; -typedef __gmp_const __mpf_struct *mpf_srcptr; -typedef __mpf_struct *mpf_ptr; -typedef __gmp_const __mpq_struct *mpq_srcptr; -typedef __mpq_struct *mpq_ptr; - - -/* This is not wanted in mp.h, so put it outside the __GNU_MP__ common - section. */ -#if __GMP_LIBGMP_DLL -#if __GMP_WITHIN_GMPXX -/* compiling to go into a DLL libgmpxx */ -#define __GMP_DECLSPEC_XX __GMP_DECLSPEC_EXPORT -#else -/* compiling to go into a application which will link to a DLL libgmpxx */ -#define __GMP_DECLSPEC_XX __GMP_DECLSPEC_IMPORT -#endif -#else -/* all other cases */ -#define __GMP_DECLSPEC_XX -#endif - - -#if __GMP_HAVE_PROTOTYPES -#define __GMP_PROTO(x) x -#else -#define __GMP_PROTO(x) () -#endif - -#ifndef __MPN -#if __GMP_HAVE_TOKEN_PASTE -#define __MPN(x) __gmpn_##x -#else -#define __MPN(x) __gmpn_/**/x -#endif -#endif - -/* For reference, "defined(EOF)" cannot be used here. In g++ 2.95.4, - defines EOF but not FILE. */ -#if defined (FILE) \ - || defined (H_STDIO) \ - || defined (_H_STDIO) /* AIX */ \ - || defined (_STDIO_H) /* glibc, Sun, SCO */ \ - || defined (_STDIO_H_) /* BSD, OSF */ \ - || defined (__STDIO_H) /* Borland */ \ - || defined (__STDIO_H__) /* IRIX */ \ - || defined (_STDIO_INCLUDED) /* HPUX */ \ - || defined (__dj_include_stdio_h_) /* DJGPP */ \ - || defined (_FILE_DEFINED) /* Microsoft */ \ - || defined (__STDIO__) /* Apple MPW MrC */ \ - || defined (_MSL_STDIO_H) /* Metrowerks */ \ - || defined (_STDIO_H_INCLUDED) /* QNX4 */ \ - || defined (_ISO_STDIO_ISO_H) /* Sun C++ */ -#define _GMP_H_HAVE_FILE 1 -#endif - -/* In ISO C, if a prototype involving "struct obstack *" is given without - that structure defined, then the struct is scoped down to just the - prototype, causing a conflict if it's subsequently defined for real. So - only give prototypes if we've got obstack.h. */ -#if defined (_OBSTACK_H) /* glibc */ -#define _GMP_H_HAVE_OBSTACK 1 -#endif - -/* The prototypes for gmp_vprintf etc are provided only if va_list is - available, via an application having included or . - Usually va_list is a typedef so can't be tested directly, but C99 - specifies that va_start is a macro (and it was normally a macro on past - systems too), so look for that. - - will define some sort of va_list for vprintf and vfprintf, but - let's not bother trying to use that since it's not standard and since - application uses for gmp_vprintf etc will almost certainly require the - whole or anyway. */ - -#ifdef va_start -#define _GMP_H_HAVE_VA_LIST 1 -#endif - -/* Test for gcc >= maj.min, as per __GNUC_PREREQ in glibc */ -#if defined (__GNUC__) && defined (__GNUC_MINOR__) -#define __GMP_GNUC_PREREQ(maj, min) \ - ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) -#else -#define __GMP_GNUC_PREREQ(maj, min) 0 -#endif - -/* "pure" is in gcc 2.96 and up, see "(gcc)Function Attributes". Basically - it means a function does nothing but examine its arguments and memory - (global or via arguments) to generate a return value, but changes nothing - and has no side-effects. __GMP_NO_ATTRIBUTE_CONST_PURE lets - tune/common.c etc turn this off when trying to write timing loops. */ -#if __GMP_GNUC_PREREQ (2,96) && ! defined (__GMP_NO_ATTRIBUTE_CONST_PURE) -#define __GMP_ATTRIBUTE_PURE __attribute__ ((__pure__)) -#else -#define __GMP_ATTRIBUTE_PURE -#endif - - -/* __GMP_CAST allows us to use static_cast in C++, so our macros are clean - to "g++ -Wold-style-cast". - - Casts in "extern inline" code within an extern "C" block don't induce - these warnings, so __GMP_CAST only needs to be used on documented - macros. */ - -#ifdef __cplusplus -#define __GMP_CAST(type, expr) (static_cast (expr)) -#else -#define __GMP_CAST(type, expr) ((type) (expr)) -#endif - - -/* An empty "throw ()" means the function doesn't throw any C++ exceptions, - this can save some stack frame info in applications. - - Currently it's given only on functions which never divide-by-zero etc, - don't allocate memory, and are expected to never need to allocate memory. - This leaves open the possibility of a C++ throw from a future GMP - exceptions scheme. - - mpz_set_ui etc are omitted to leave open the lazy allocation scheme - described in doc/tasks.html. mpz_get_d etc are omitted to leave open - exceptions for float overflows. - - Note that __GMP_NOTHROW must be given on any inlines the same as on their - prototypes (for g++ at least, where they're used together). Note also - that g++ 3.0 demands that __GMP_NOTHROW is before other attributes like - __GMP_ATTRIBUTE_PURE. */ - -#if defined (__cplusplus) -#define __GMP_NOTHROW throw () -#else -#define __GMP_NOTHROW -#endif - - -/* PORTME: What other compilers have a useful "extern inline"? "static - inline" would be an acceptable substitute if the compiler (or linker) - discards unused statics. */ - - /* gcc has __inline__ in all modes, including strict ansi. Give a prototype - for an inline too, so as to correctly specify "dllimport" on windows, in - case the function is called rather than inlined. - GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 - inline semantics, unless -fgnu89-inline is used. */ -#ifdef __GNUC__ -#if (defined __GNUC_STDC_INLINE__) || (__GNUC__ == 4 && __GNUC_MINOR__ == 2) -#define __GMP_EXTERN_INLINE extern __inline__ __attribute__ ((__gnu_inline__)) -#else -#define __GMP_EXTERN_INLINE extern __inline__ -#endif -#define __GMP_INLINE_PROTOTYPES 1 -#endif - -/* DEC C (eg. version 5.9) supports "static __inline foo()", even in -std1 - strict ANSI mode. Inlining is done even when not optimizing (ie. -O0 - mode, which is the default), but an unnecessary local copy of foo is - emitted unless -O is used. "extern __inline" is accepted, but the - "extern" appears to be ignored, ie. it becomes a plain global function - but which is inlined within its file. Don't know if all old versions of - DEC C supported __inline, but as a start let's do the right thing for - current versions. */ -#ifdef __DECC -#define __GMP_EXTERN_INLINE static __inline -#endif - -/* SCO OpenUNIX 8 cc supports "static inline foo()" but not in -Xc strict - ANSI mode (__STDC__ is 1 in that mode). Inlining only actually takes - place under -O. Without -O "foo" seems to be emitted whether it's used - or not, which is wasteful. "extern inline foo()" isn't useful, the - "extern" is apparently ignored, so foo is inlined if possible but also - emitted as a global, which causes multiple definition errors when - building a shared libgmp. */ -#ifdef __SCO_VERSION__ -#if __SCO_VERSION__ > 400000000 && __STDC__ != 1 \ - && ! defined (__GMP_EXTERN_INLINE) -#define __GMP_EXTERN_INLINE static inline -#endif -#endif - -/* Microsoft's C compiler accepts __inline */ -#ifdef _MSC_VER -#define __GMP_EXTERN_INLINE __inline -#endif - -/* Recent enough Sun C compilers want "inline" */ -#if defined (__SUNPRO_C) && __SUNPRO_C >= 0x560 \ - && ! defined (__GMP_EXTERN_INLINE) -#define __GMP_EXTERN_INLINE inline -#endif - -/* Somewhat older Sun C compilers want "static inline" */ -#if defined (__SUNPRO_C) && __SUNPRO_C >= 0x540 \ - && ! defined (__GMP_EXTERN_INLINE) -#define __GMP_EXTERN_INLINE static inline -#endif - - -/* C++ always has "inline" and since it's a normal feature the linker should - discard duplicate non-inlined copies, or if it doesn't then that's a - problem for everyone, not just GMP. */ -#if defined (__cplusplus) && ! defined (__GMP_EXTERN_INLINE) -#define __GMP_EXTERN_INLINE inline -#endif - -/* Don't do any inlining within a configure run, since if the compiler ends - up emitting copies of the code into the object file it can end up - demanding the various support routines (like mpn_popcount) for linking, - making the "alloca" test and perhaps others fail. And on hppa ia64 a - pre-release gcc 3.2 was seen not respecting the "extern" in "extern - __inline__", triggering this problem too. */ -#if defined (__GMP_WITHIN_CONFIGURE) && ! __GMP_WITHIN_CONFIGURE_INLINE -#undef __GMP_EXTERN_INLINE -#endif - -/* By default, don't give a prototype when there's going to be an inline - version. Note in particular that Cray C++ objects to the combination of - prototype and inline. */ -#ifdef __GMP_EXTERN_INLINE -#ifndef __GMP_INLINE_PROTOTYPES -#define __GMP_INLINE_PROTOTYPES 0 -#endif -#else -#define __GMP_INLINE_PROTOTYPES 1 -#endif - - -#define __GMP_ABS(x) ((x) >= 0 ? (x) : -(x)) -#define __GMP_MAX(h,i) ((h) > (i) ? (h) : (i)) - -/* __GMP_USHRT_MAX is not "~ (unsigned short) 0" because short is promoted - to int by "~". */ -#define __GMP_UINT_MAX (~ (unsigned) 0) -#define __GMP_ULONG_MAX (~ (unsigned long) 0) -#define __GMP_USHRT_MAX ((unsigned short) ~0) - - -/* __builtin_expect is in gcc 3.0, and not in 2.95. */ -#if __GMP_GNUC_PREREQ (3,0) -#define __GMP_LIKELY(cond) __builtin_expect ((cond) != 0, 1) -#define __GMP_UNLIKELY(cond) __builtin_expect ((cond) != 0, 0) -#else -#define __GMP_LIKELY(cond) (cond) -#define __GMP_UNLIKELY(cond) (cond) -#endif - -#ifdef _CRAY -#define __GMP_CRAY_Pragma(str) _Pragma (str) -#else -#define __GMP_CRAY_Pragma(str) -#endif - - -/* Allow direct user access to numerator and denominator of a mpq_t object. */ -#define mpq_numref(Q) (&((Q)->_mp_num)) -#define mpq_denref(Q) (&((Q)->_mp_den)) - - -#if defined (__cplusplus) -extern "C" { -using std::FILE; -#endif - -#define mp_set_memory_functions __gmp_set_memory_functions -__GMP_DECLSPEC void mp_set_memory_functions __GMP_PROTO ((void *(*) (size_t), - void *(*) (void *, size_t, size_t), - void (*) (void *, size_t))) __GMP_NOTHROW; - -#define mp_get_memory_functions __gmp_get_memory_functions -__GMP_DECLSPEC void mp_get_memory_functions __GMP_PROTO ((void *(**) (size_t), - void *(**) (void *, size_t, size_t), - void (**) (void *, size_t))) __GMP_NOTHROW; - -#define mp_bits_per_limb __gmp_bits_per_limb -__GMP_DECLSPEC extern __gmp_const int mp_bits_per_limb; - -#define gmp_errno __gmp_errno -__GMP_DECLSPEC extern int gmp_errno; - -#define gmp_version __gmp_version -__GMP_DECLSPEC extern __gmp_const char * __gmp_const gmp_version; - - -/**************** Random number routines. ****************/ - -/* obsolete */ -#define gmp_randinit __gmp_randinit -__GMP_DECLSPEC void gmp_randinit __GMP_PROTO ((gmp_randstate_t, gmp_randalg_t, ...)); - -#define gmp_randinit_default __gmp_randinit_default -__GMP_DECLSPEC void gmp_randinit_default __GMP_PROTO ((gmp_randstate_t)); - -#define gmp_randinit_lc_2exp __gmp_randinit_lc_2exp -__GMP_DECLSPEC void gmp_randinit_lc_2exp __GMP_PROTO ((gmp_randstate_t, - mpz_srcptr, unsigned long int, - mp_bitcnt_t)); - -#define gmp_randinit_lc_2exp_size __gmp_randinit_lc_2exp_size -__GMP_DECLSPEC int gmp_randinit_lc_2exp_size __GMP_PROTO ((gmp_randstate_t, mp_bitcnt_t)); - -#define gmp_randinit_mt __gmp_randinit_mt -__GMP_DECLSPEC void gmp_randinit_mt __GMP_PROTO ((gmp_randstate_t)); - -#define gmp_randinit_set __gmp_randinit_set -__GMP_DECLSPEC void gmp_randinit_set __GMP_PROTO ((gmp_randstate_t, __gmp_const __gmp_randstate_struct *)); - -#define gmp_randseed __gmp_randseed -__GMP_DECLSPEC void gmp_randseed __GMP_PROTO ((gmp_randstate_t, mpz_srcptr)); - -#define gmp_randseed_ui __gmp_randseed_ui -__GMP_DECLSPEC void gmp_randseed_ui __GMP_PROTO ((gmp_randstate_t, unsigned long int)); - -#define gmp_randclear __gmp_randclear -__GMP_DECLSPEC void gmp_randclear __GMP_PROTO ((gmp_randstate_t)); - -#define gmp_urandomb_ui __gmp_urandomb_ui -__GMP_DECLSPEC unsigned long gmp_urandomb_ui __GMP_PROTO ((gmp_randstate_t, unsigned long)); - -#define gmp_urandomm_ui __gmp_urandomm_ui -__GMP_DECLSPEC unsigned long gmp_urandomm_ui __GMP_PROTO ((gmp_randstate_t, unsigned long)); - - -/**************** Formatted output routines. ****************/ - -#define gmp_asprintf __gmp_asprintf -__GMP_DECLSPEC int gmp_asprintf __GMP_PROTO ((char **, __gmp_const char *, ...)); - -#define gmp_fprintf __gmp_fprintf -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC int gmp_fprintf __GMP_PROTO ((FILE *, __gmp_const char *, ...)); -#endif - -#define gmp_obstack_printf __gmp_obstack_printf -#if defined (_GMP_H_HAVE_OBSTACK) -__GMP_DECLSPEC int gmp_obstack_printf __GMP_PROTO ((struct obstack *, __gmp_const char *, ...)); -#endif - -#define gmp_obstack_vprintf __gmp_obstack_vprintf -#if defined (_GMP_H_HAVE_OBSTACK) && defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_obstack_vprintf __GMP_PROTO ((struct obstack *, __gmp_const char *, va_list)); -#endif - -#define gmp_printf __gmp_printf -__GMP_DECLSPEC int gmp_printf __GMP_PROTO ((__gmp_const char *, ...)); - -#define gmp_snprintf __gmp_snprintf -__GMP_DECLSPEC int gmp_snprintf __GMP_PROTO ((char *, size_t, __gmp_const char *, ...)); - -#define gmp_sprintf __gmp_sprintf -__GMP_DECLSPEC int gmp_sprintf __GMP_PROTO ((char *, __gmp_const char *, ...)); - -#define gmp_vasprintf __gmp_vasprintf -#if defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vasprintf __GMP_PROTO ((char **, __gmp_const char *, va_list)); -#endif - -#define gmp_vfprintf __gmp_vfprintf -#if defined (_GMP_H_HAVE_FILE) && defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vfprintf __GMP_PROTO ((FILE *, __gmp_const char *, va_list)); -#endif - -#define gmp_vprintf __gmp_vprintf -#if defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vprintf __GMP_PROTO ((__gmp_const char *, va_list)); -#endif - -#define gmp_vsnprintf __gmp_vsnprintf -#if defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vsnprintf __GMP_PROTO ((char *, size_t, __gmp_const char *, va_list)); -#endif - -#define gmp_vsprintf __gmp_vsprintf -#if defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vsprintf __GMP_PROTO ((char *, __gmp_const char *, va_list)); -#endif - - -/**************** Formatted input routines. ****************/ - -#define gmp_fscanf __gmp_fscanf -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC int gmp_fscanf __GMP_PROTO ((FILE *, __gmp_const char *, ...)); -#endif - -#define gmp_scanf __gmp_scanf -__GMP_DECLSPEC int gmp_scanf __GMP_PROTO ((__gmp_const char *, ...)); - -#define gmp_sscanf __gmp_sscanf -__GMP_DECLSPEC int gmp_sscanf __GMP_PROTO ((__gmp_const char *, __gmp_const char *, ...)); - -#define gmp_vfscanf __gmp_vfscanf -#if defined (_GMP_H_HAVE_FILE) && defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vfscanf __GMP_PROTO ((FILE *, __gmp_const char *, va_list)); -#endif - -#define gmp_vscanf __gmp_vscanf -#if defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vscanf __GMP_PROTO ((__gmp_const char *, va_list)); -#endif - -#define gmp_vsscanf __gmp_vsscanf -#if defined (_GMP_H_HAVE_VA_LIST) -__GMP_DECLSPEC int gmp_vsscanf __GMP_PROTO ((__gmp_const char *, __gmp_const char *, va_list)); -#endif - - -/**************** Integer (i.e. Z) routines. ****************/ - -#define _mpz_realloc __gmpz_realloc -#define mpz_realloc __gmpz_realloc -__GMP_DECLSPEC void *_mpz_realloc __GMP_PROTO ((mpz_ptr, mp_size_t)); - -#define mpz_abs __gmpz_abs -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_abs) -__GMP_DECLSPEC void mpz_abs __GMP_PROTO ((mpz_ptr, mpz_srcptr)); -#endif - -#define mpz_add __gmpz_add -__GMP_DECLSPEC void mpz_add __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_add_ui __gmpz_add_ui -__GMP_DECLSPEC void mpz_add_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_addmul __gmpz_addmul -__GMP_DECLSPEC void mpz_addmul __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_addmul_ui __gmpz_addmul_ui -__GMP_DECLSPEC void mpz_addmul_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_and __gmpz_and -__GMP_DECLSPEC void mpz_and __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_array_init __gmpz_array_init -__GMP_DECLSPEC void mpz_array_init __GMP_PROTO ((mpz_ptr, mp_size_t, mp_size_t)); - -#define mpz_bin_ui __gmpz_bin_ui -__GMP_DECLSPEC void mpz_bin_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_bin_uiui __gmpz_bin_uiui -__GMP_DECLSPEC void mpz_bin_uiui __GMP_PROTO ((mpz_ptr, unsigned long int, unsigned long int)); - -#define mpz_cdiv_q __gmpz_cdiv_q -__GMP_DECLSPEC void mpz_cdiv_q __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_cdiv_q_2exp __gmpz_cdiv_q_2exp -__GMP_DECLSPEC void mpz_cdiv_q_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long)); - -#define mpz_cdiv_q_ui __gmpz_cdiv_q_ui -__GMP_DECLSPEC unsigned long int mpz_cdiv_q_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_cdiv_qr __gmpz_cdiv_qr -__GMP_DECLSPEC void mpz_cdiv_qr __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_cdiv_qr_ui __gmpz_cdiv_qr_ui -__GMP_DECLSPEC unsigned long int mpz_cdiv_qr_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_cdiv_r __gmpz_cdiv_r -__GMP_DECLSPEC void mpz_cdiv_r __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_cdiv_r_2exp __gmpz_cdiv_r_2exp -__GMP_DECLSPEC void mpz_cdiv_r_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); - -#define mpz_cdiv_r_ui __gmpz_cdiv_r_ui -__GMP_DECLSPEC unsigned long int mpz_cdiv_r_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_cdiv_ui __gmpz_cdiv_ui -__GMP_DECLSPEC unsigned long int mpz_cdiv_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE; - -#define mpz_clear __gmpz_clear -__GMP_DECLSPEC void mpz_clear __GMP_PROTO ((mpz_ptr)); - -#define mpz_clears __gmpz_clears -__GMP_DECLSPEC void mpz_clears __GMP_PROTO ((mpz_ptr, ...)); - -#define mpz_clrbit __gmpz_clrbit -__GMP_DECLSPEC void mpz_clrbit __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); - -#define mpz_cmp __gmpz_cmp -__GMP_DECLSPEC int mpz_cmp __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_cmp_d __gmpz_cmp_d -__GMP_DECLSPEC int mpz_cmp_d __GMP_PROTO ((mpz_srcptr, double)) __GMP_ATTRIBUTE_PURE; - -#define _mpz_cmp_si __gmpz_cmp_si -__GMP_DECLSPEC int _mpz_cmp_si __GMP_PROTO ((mpz_srcptr, signed long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define _mpz_cmp_ui __gmpz_cmp_ui -__GMP_DECLSPEC int _mpz_cmp_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_cmpabs __gmpz_cmpabs -__GMP_DECLSPEC int mpz_cmpabs __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_cmpabs_d __gmpz_cmpabs_d -__GMP_DECLSPEC int mpz_cmpabs_d __GMP_PROTO ((mpz_srcptr, double)) __GMP_ATTRIBUTE_PURE; - -#define mpz_cmpabs_ui __gmpz_cmpabs_ui -__GMP_DECLSPEC int mpz_cmpabs_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_com __gmpz_com -__GMP_DECLSPEC void mpz_com __GMP_PROTO ((mpz_ptr, mpz_srcptr)); - -#define mpz_combit __gmpz_combit -__GMP_DECLSPEC void mpz_combit __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); - -#define mpz_congruent_p __gmpz_congruent_p -__GMP_DECLSPEC int mpz_congruent_p __GMP_PROTO ((mpz_srcptr, mpz_srcptr, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_congruent_2exp_p __gmpz_congruent_2exp_p -__GMP_DECLSPEC int mpz_congruent_2exp_p __GMP_PROTO ((mpz_srcptr, mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_congruent_ui_p __gmpz_congruent_ui_p -__GMP_DECLSPEC int mpz_congruent_ui_p __GMP_PROTO ((mpz_srcptr, unsigned long, unsigned long)) __GMP_ATTRIBUTE_PURE; - -#define mpz_divexact __gmpz_divexact -__GMP_DECLSPEC void mpz_divexact __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_divexact_ui __gmpz_divexact_ui -__GMP_DECLSPEC void mpz_divexact_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long)); - -#define mpz_divisible_p __gmpz_divisible_p -__GMP_DECLSPEC int mpz_divisible_p __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_divisible_ui_p __gmpz_divisible_ui_p -__GMP_DECLSPEC int mpz_divisible_ui_p __GMP_PROTO ((mpz_srcptr, unsigned long)) __GMP_ATTRIBUTE_PURE; - -#define mpz_divisible_2exp_p __gmpz_divisible_2exp_p -__GMP_DECLSPEC int mpz_divisible_2exp_p __GMP_PROTO ((mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_dump __gmpz_dump -__GMP_DECLSPEC void mpz_dump __GMP_PROTO ((mpz_srcptr)); - -#define mpz_export __gmpz_export -__GMP_DECLSPEC void *mpz_export __GMP_PROTO ((void *, size_t *, int, size_t, int, size_t, mpz_srcptr)); - -#define mpz_fac_ui __gmpz_fac_ui -__GMP_DECLSPEC void mpz_fac_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); - -#define mpz_fdiv_q __gmpz_fdiv_q -__GMP_DECLSPEC void mpz_fdiv_q __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_fdiv_q_2exp __gmpz_fdiv_q_2exp -__GMP_DECLSPEC void mpz_fdiv_q_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); - -#define mpz_fdiv_q_ui __gmpz_fdiv_q_ui -__GMP_DECLSPEC unsigned long int mpz_fdiv_q_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_fdiv_qr __gmpz_fdiv_qr -__GMP_DECLSPEC void mpz_fdiv_qr __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_fdiv_qr_ui __gmpz_fdiv_qr_ui -__GMP_DECLSPEC unsigned long int mpz_fdiv_qr_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_fdiv_r __gmpz_fdiv_r -__GMP_DECLSPEC void mpz_fdiv_r __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_fdiv_r_2exp __gmpz_fdiv_r_2exp -__GMP_DECLSPEC void mpz_fdiv_r_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); - -#define mpz_fdiv_r_ui __gmpz_fdiv_r_ui -__GMP_DECLSPEC unsigned long int mpz_fdiv_r_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_fdiv_ui __gmpz_fdiv_ui -__GMP_DECLSPEC unsigned long int mpz_fdiv_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE; - -#define mpz_fib_ui __gmpz_fib_ui -__GMP_DECLSPEC void mpz_fib_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); - -#define mpz_fib2_ui __gmpz_fib2_ui -__GMP_DECLSPEC void mpz_fib2_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, unsigned long int)); - -#define mpz_fits_sint_p __gmpz_fits_sint_p -__GMP_DECLSPEC int mpz_fits_sint_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_fits_slong_p __gmpz_fits_slong_p -__GMP_DECLSPEC int mpz_fits_slong_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_fits_sshort_p __gmpz_fits_sshort_p -__GMP_DECLSPEC int mpz_fits_sshort_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_fits_uint_p __gmpz_fits_uint_p -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_uint_p) -__GMP_DECLSPEC int mpz_fits_uint_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_fits_ulong_p __gmpz_fits_ulong_p -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_ulong_p) -__GMP_DECLSPEC int mpz_fits_ulong_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_fits_ushort_p __gmpz_fits_ushort_p -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_ushort_p) -__GMP_DECLSPEC int mpz_fits_ushort_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_gcd __gmpz_gcd -__GMP_DECLSPEC void mpz_gcd __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_gcd_ui __gmpz_gcd_ui -__GMP_DECLSPEC unsigned long int mpz_gcd_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_gcdext __gmpz_gcdext -__GMP_DECLSPEC void mpz_gcdext __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_get_d __gmpz_get_d -__GMP_DECLSPEC double mpz_get_d __GMP_PROTO ((mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_get_d_2exp __gmpz_get_d_2exp -__GMP_DECLSPEC double mpz_get_d_2exp __GMP_PROTO ((signed long int *, mpz_srcptr)); - -#define mpz_get_si __gmpz_get_si -__GMP_DECLSPEC /* signed */ long int mpz_get_si __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_get_str __gmpz_get_str -__GMP_DECLSPEC char *mpz_get_str __GMP_PROTO ((char *, int, mpz_srcptr)); - -#define mpz_get_ui __gmpz_get_ui -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_get_ui) -__GMP_DECLSPEC unsigned long int mpz_get_ui __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_getlimbn __gmpz_getlimbn -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_getlimbn) -__GMP_DECLSPEC mp_limb_t mpz_getlimbn __GMP_PROTO ((mpz_srcptr, mp_size_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_hamdist __gmpz_hamdist -__GMP_DECLSPEC mp_bitcnt_t mpz_hamdist __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_import __gmpz_import -__GMP_DECLSPEC void mpz_import __GMP_PROTO ((mpz_ptr, size_t, int, size_t, int, size_t, __gmp_const void *)); - -#define mpz_init __gmpz_init -__GMP_DECLSPEC void mpz_init __GMP_PROTO ((mpz_ptr)); - -#define mpz_init2 __gmpz_init2 -__GMP_DECLSPEC void mpz_init2 __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); - -#define mpz_inits __gmpz_inits -__GMP_DECLSPEC void mpz_inits __GMP_PROTO ((mpz_ptr, ...)); - -#define mpz_init_set __gmpz_init_set -__GMP_DECLSPEC void mpz_init_set __GMP_PROTO ((mpz_ptr, mpz_srcptr)); - -#define mpz_init_set_d __gmpz_init_set_d -__GMP_DECLSPEC void mpz_init_set_d __GMP_PROTO ((mpz_ptr, double)); - -#define mpz_init_set_si __gmpz_init_set_si -__GMP_DECLSPEC void mpz_init_set_si __GMP_PROTO ((mpz_ptr, signed long int)); - -#define mpz_init_set_str __gmpz_init_set_str -__GMP_DECLSPEC int mpz_init_set_str __GMP_PROTO ((mpz_ptr, __gmp_const char *, int)); - -#define mpz_init_set_ui __gmpz_init_set_ui -__GMP_DECLSPEC void mpz_init_set_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); - -#define mpz_inp_raw __gmpz_inp_raw -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpz_inp_raw __GMP_PROTO ((mpz_ptr, FILE *)); -#endif - -#define mpz_inp_str __gmpz_inp_str -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpz_inp_str __GMP_PROTO ((mpz_ptr, FILE *, int)); -#endif - -#define mpz_invert __gmpz_invert -__GMP_DECLSPEC int mpz_invert __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_ior __gmpz_ior -__GMP_DECLSPEC void mpz_ior __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_jacobi __gmpz_jacobi -__GMP_DECLSPEC int mpz_jacobi __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_kronecker mpz_jacobi /* alias */ - -#define mpz_kronecker_si __gmpz_kronecker_si -__GMP_DECLSPEC int mpz_kronecker_si __GMP_PROTO ((mpz_srcptr, long)) __GMP_ATTRIBUTE_PURE; - -#define mpz_kronecker_ui __gmpz_kronecker_ui -__GMP_DECLSPEC int mpz_kronecker_ui __GMP_PROTO ((mpz_srcptr, unsigned long)) __GMP_ATTRIBUTE_PURE; - -#define mpz_si_kronecker __gmpz_si_kronecker -__GMP_DECLSPEC int mpz_si_kronecker __GMP_PROTO ((long, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_ui_kronecker __gmpz_ui_kronecker -__GMP_DECLSPEC int mpz_ui_kronecker __GMP_PROTO ((unsigned long, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_lcm __gmpz_lcm -__GMP_DECLSPEC void mpz_lcm __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_lcm_ui __gmpz_lcm_ui -__GMP_DECLSPEC void mpz_lcm_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long)); - -#define mpz_legendre mpz_jacobi /* alias */ - -#define mpz_lucnum_ui __gmpz_lucnum_ui -__GMP_DECLSPEC void mpz_lucnum_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); - -#define mpz_lucnum2_ui __gmpz_lucnum2_ui -__GMP_DECLSPEC void mpz_lucnum2_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, unsigned long int)); - -#define mpz_millerrabin __gmpz_millerrabin -__GMP_DECLSPEC int mpz_millerrabin __GMP_PROTO ((mpz_srcptr, int)) __GMP_ATTRIBUTE_PURE; - -#define mpz_mod __gmpz_mod -__GMP_DECLSPEC void mpz_mod __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_mod_ui mpz_fdiv_r_ui /* same as fdiv_r because divisor unsigned */ - -#define mpz_mul __gmpz_mul -__GMP_DECLSPEC void mpz_mul __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_mul_2exp __gmpz_mul_2exp -__GMP_DECLSPEC void mpz_mul_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); - -#define mpz_mul_si __gmpz_mul_si -__GMP_DECLSPEC void mpz_mul_si __GMP_PROTO ((mpz_ptr, mpz_srcptr, long int)); - -#define mpz_mul_ui __gmpz_mul_ui -__GMP_DECLSPEC void mpz_mul_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_neg __gmpz_neg -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_neg) -__GMP_DECLSPEC void mpz_neg __GMP_PROTO ((mpz_ptr, mpz_srcptr)); -#endif - -#define mpz_nextprime __gmpz_nextprime -__GMP_DECLSPEC void mpz_nextprime __GMP_PROTO ((mpz_ptr, mpz_srcptr)); - -#define mpz_out_raw __gmpz_out_raw -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpz_out_raw __GMP_PROTO ((FILE *, mpz_srcptr)); -#endif - -#define mpz_out_str __gmpz_out_str -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpz_out_str __GMP_PROTO ((FILE *, int, mpz_srcptr)); -#endif - -#define mpz_perfect_power_p __gmpz_perfect_power_p -__GMP_DECLSPEC int mpz_perfect_power_p __GMP_PROTO ((mpz_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpz_perfect_square_p __gmpz_perfect_square_p -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_perfect_square_p) -__GMP_DECLSPEC int mpz_perfect_square_p __GMP_PROTO ((mpz_srcptr)) __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_popcount __gmpz_popcount -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_popcount) -__GMP_DECLSPEC mp_bitcnt_t mpz_popcount __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_pow_ui __gmpz_pow_ui -__GMP_DECLSPEC void mpz_pow_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_powm __gmpz_powm -__GMP_DECLSPEC void mpz_powm __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_powm_sec __gmpz_powm_sec -__GMP_DECLSPEC void mpz_powm_sec __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_powm_ui __gmpz_powm_ui -__GMP_DECLSPEC void mpz_powm_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr)); - -#define mpz_probab_prime_p __gmpz_probab_prime_p -__GMP_DECLSPEC int mpz_probab_prime_p __GMP_PROTO ((mpz_srcptr, int)) __GMP_ATTRIBUTE_PURE; - -#define mpz_random __gmpz_random -__GMP_DECLSPEC void mpz_random __GMP_PROTO ((mpz_ptr, mp_size_t)); - -#define mpz_random2 __gmpz_random2 -__GMP_DECLSPEC void mpz_random2 __GMP_PROTO ((mpz_ptr, mp_size_t)); - -#define mpz_realloc2 __gmpz_realloc2 -__GMP_DECLSPEC void mpz_realloc2 __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); - -#define mpz_remove __gmpz_remove -__GMP_DECLSPEC unsigned long int mpz_remove __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_root __gmpz_root -__GMP_DECLSPEC int mpz_root __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_rootrem __gmpz_rootrem -__GMP_DECLSPEC void mpz_rootrem __GMP_PROTO ((mpz_ptr,mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_rrandomb __gmpz_rrandomb -__GMP_DECLSPEC void mpz_rrandomb __GMP_PROTO ((mpz_ptr, gmp_randstate_t, mp_bitcnt_t)); - -#define mpz_scan0 __gmpz_scan0 -__GMP_DECLSPEC mp_bitcnt_t mpz_scan0 __GMP_PROTO ((mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_scan1 __gmpz_scan1 -__GMP_DECLSPEC mp_bitcnt_t mpz_scan1 __GMP_PROTO ((mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_set __gmpz_set -__GMP_DECLSPEC void mpz_set __GMP_PROTO ((mpz_ptr, mpz_srcptr)); - -#define mpz_set_d __gmpz_set_d -__GMP_DECLSPEC void mpz_set_d __GMP_PROTO ((mpz_ptr, double)); - -#define mpz_set_f __gmpz_set_f -__GMP_DECLSPEC void mpz_set_f __GMP_PROTO ((mpz_ptr, mpf_srcptr)); - -#define mpz_set_q __gmpz_set_q -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_set_q) -__GMP_DECLSPEC void mpz_set_q __GMP_PROTO ((mpz_ptr, mpq_srcptr)); -#endif - -#define mpz_set_si __gmpz_set_si -__GMP_DECLSPEC void mpz_set_si __GMP_PROTO ((mpz_ptr, signed long int)); - -#define mpz_set_str __gmpz_set_str -__GMP_DECLSPEC int mpz_set_str __GMP_PROTO ((mpz_ptr, __gmp_const char *, int)); - -#define mpz_set_ui __gmpz_set_ui -__GMP_DECLSPEC void mpz_set_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); - -#define mpz_setbit __gmpz_setbit -__GMP_DECLSPEC void mpz_setbit __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); - -#define mpz_size __gmpz_size -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_size) -__GMP_DECLSPEC size_t mpz_size __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpz_sizeinbase __gmpz_sizeinbase -__GMP_DECLSPEC size_t mpz_sizeinbase __GMP_PROTO ((mpz_srcptr, int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_sqrt __gmpz_sqrt -__GMP_DECLSPEC void mpz_sqrt __GMP_PROTO ((mpz_ptr, mpz_srcptr)); - -#define mpz_sqrtrem __gmpz_sqrtrem -__GMP_DECLSPEC void mpz_sqrtrem __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr)); - -#define mpz_sub __gmpz_sub -__GMP_DECLSPEC void mpz_sub __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_sub_ui __gmpz_sub_ui -__GMP_DECLSPEC void mpz_sub_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_ui_sub __gmpz_ui_sub -__GMP_DECLSPEC void mpz_ui_sub __GMP_PROTO ((mpz_ptr, unsigned long int, mpz_srcptr)); - -#define mpz_submul __gmpz_submul -__GMP_DECLSPEC void mpz_submul __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_submul_ui __gmpz_submul_ui -__GMP_DECLSPEC void mpz_submul_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_swap __gmpz_swap -__GMP_DECLSPEC void mpz_swap __GMP_PROTO ((mpz_ptr, mpz_ptr)) __GMP_NOTHROW; - -#define mpz_tdiv_ui __gmpz_tdiv_ui -__GMP_DECLSPEC unsigned long int mpz_tdiv_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE; - -#define mpz_tdiv_q __gmpz_tdiv_q -__GMP_DECLSPEC void mpz_tdiv_q __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_tdiv_q_2exp __gmpz_tdiv_q_2exp -__GMP_DECLSPEC void mpz_tdiv_q_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); - -#define mpz_tdiv_q_ui __gmpz_tdiv_q_ui -__GMP_DECLSPEC unsigned long int mpz_tdiv_q_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_tdiv_qr __gmpz_tdiv_qr -__GMP_DECLSPEC void mpz_tdiv_qr __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_tdiv_qr_ui __gmpz_tdiv_qr_ui -__GMP_DECLSPEC unsigned long int mpz_tdiv_qr_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_tdiv_r __gmpz_tdiv_r -__GMP_DECLSPEC void mpz_tdiv_r __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - -#define mpz_tdiv_r_2exp __gmpz_tdiv_r_2exp -__GMP_DECLSPEC void mpz_tdiv_r_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); - -#define mpz_tdiv_r_ui __gmpz_tdiv_r_ui -__GMP_DECLSPEC unsigned long int mpz_tdiv_r_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); - -#define mpz_tstbit __gmpz_tstbit -__GMP_DECLSPEC int mpz_tstbit __GMP_PROTO ((mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpz_ui_pow_ui __gmpz_ui_pow_ui -__GMP_DECLSPEC void mpz_ui_pow_ui __GMP_PROTO ((mpz_ptr, unsigned long int, unsigned long int)); - -#define mpz_urandomb __gmpz_urandomb -__GMP_DECLSPEC void mpz_urandomb __GMP_PROTO ((mpz_ptr, gmp_randstate_t, mp_bitcnt_t)); - -#define mpz_urandomm __gmpz_urandomm -__GMP_DECLSPEC void mpz_urandomm __GMP_PROTO ((mpz_ptr, gmp_randstate_t, mpz_srcptr)); - -#define mpz_xor __gmpz_xor -#define mpz_eor __gmpz_xor -__GMP_DECLSPEC void mpz_xor __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); - - -/**************** Rational (i.e. Q) routines. ****************/ - -#define mpq_abs __gmpq_abs -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpq_abs) -__GMP_DECLSPEC void mpq_abs __GMP_PROTO ((mpq_ptr, mpq_srcptr)); -#endif - -#define mpq_add __gmpq_add -__GMP_DECLSPEC void mpq_add __GMP_PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); - -#define mpq_canonicalize __gmpq_canonicalize -__GMP_DECLSPEC void mpq_canonicalize __GMP_PROTO ((mpq_ptr)); - -#define mpq_clear __gmpq_clear -__GMP_DECLSPEC void mpq_clear __GMP_PROTO ((mpq_ptr)); - -#define mpq_clears __gmpq_clears -__GMP_DECLSPEC void mpq_clears __GMP_PROTO ((mpq_ptr, ...)); - -#define mpq_cmp __gmpq_cmp -__GMP_DECLSPEC int mpq_cmp __GMP_PROTO ((mpq_srcptr, mpq_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define _mpq_cmp_si __gmpq_cmp_si -__GMP_DECLSPEC int _mpq_cmp_si __GMP_PROTO ((mpq_srcptr, long, unsigned long)) __GMP_ATTRIBUTE_PURE; - -#define _mpq_cmp_ui __gmpq_cmp_ui -__GMP_DECLSPEC int _mpq_cmp_ui __GMP_PROTO ((mpq_srcptr, unsigned long int, unsigned long int)) __GMP_ATTRIBUTE_PURE; - -#define mpq_div __gmpq_div -__GMP_DECLSPEC void mpq_div __GMP_PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); - -#define mpq_div_2exp __gmpq_div_2exp -__GMP_DECLSPEC void mpq_div_2exp __GMP_PROTO ((mpq_ptr, mpq_srcptr, mp_bitcnt_t)); - -#define mpq_equal __gmpq_equal -__GMP_DECLSPEC int mpq_equal __GMP_PROTO ((mpq_srcptr, mpq_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpq_get_num __gmpq_get_num -__GMP_DECLSPEC void mpq_get_num __GMP_PROTO ((mpz_ptr, mpq_srcptr)); - -#define mpq_get_den __gmpq_get_den -__GMP_DECLSPEC void mpq_get_den __GMP_PROTO ((mpz_ptr, mpq_srcptr)); - -#define mpq_get_d __gmpq_get_d -__GMP_DECLSPEC double mpq_get_d __GMP_PROTO ((mpq_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpq_get_str __gmpq_get_str -__GMP_DECLSPEC char *mpq_get_str __GMP_PROTO ((char *, int, mpq_srcptr)); - -#define mpq_init __gmpq_init -__GMP_DECLSPEC void mpq_init __GMP_PROTO ((mpq_ptr)); - -#define mpq_inits __gmpq_inits -__GMP_DECLSPEC void mpq_inits __GMP_PROTO ((mpq_ptr, ...)); - -#define mpq_inp_str __gmpq_inp_str -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpq_inp_str __GMP_PROTO ((mpq_ptr, FILE *, int)); -#endif - -#define mpq_inv __gmpq_inv -__GMP_DECLSPEC void mpq_inv __GMP_PROTO ((mpq_ptr, mpq_srcptr)); - -#define mpq_mul __gmpq_mul -__GMP_DECLSPEC void mpq_mul __GMP_PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); - -#define mpq_mul_2exp __gmpq_mul_2exp -__GMP_DECLSPEC void mpq_mul_2exp __GMP_PROTO ((mpq_ptr, mpq_srcptr, mp_bitcnt_t)); - -#define mpq_neg __gmpq_neg -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpq_neg) -__GMP_DECLSPEC void mpq_neg __GMP_PROTO ((mpq_ptr, mpq_srcptr)); -#endif - -#define mpq_out_str __gmpq_out_str -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpq_out_str __GMP_PROTO ((FILE *, int, mpq_srcptr)); -#endif - -#define mpq_set __gmpq_set -__GMP_DECLSPEC void mpq_set __GMP_PROTO ((mpq_ptr, mpq_srcptr)); - -#define mpq_set_d __gmpq_set_d -__GMP_DECLSPEC void mpq_set_d __GMP_PROTO ((mpq_ptr, double)); - -#define mpq_set_den __gmpq_set_den -__GMP_DECLSPEC void mpq_set_den __GMP_PROTO ((mpq_ptr, mpz_srcptr)); - -#define mpq_set_f __gmpq_set_f -__GMP_DECLSPEC void mpq_set_f __GMP_PROTO ((mpq_ptr, mpf_srcptr)); - -#define mpq_set_num __gmpq_set_num -__GMP_DECLSPEC void mpq_set_num __GMP_PROTO ((mpq_ptr, mpz_srcptr)); - -#define mpq_set_si __gmpq_set_si -__GMP_DECLSPEC void mpq_set_si __GMP_PROTO ((mpq_ptr, signed long int, unsigned long int)); - -#define mpq_set_str __gmpq_set_str -__GMP_DECLSPEC int mpq_set_str __GMP_PROTO ((mpq_ptr, __gmp_const char *, int)); - -#define mpq_set_ui __gmpq_set_ui -__GMP_DECLSPEC void mpq_set_ui __GMP_PROTO ((mpq_ptr, unsigned long int, unsigned long int)); - -#define mpq_set_z __gmpq_set_z -__GMP_DECLSPEC void mpq_set_z __GMP_PROTO ((mpq_ptr, mpz_srcptr)); - -#define mpq_sub __gmpq_sub -__GMP_DECLSPEC void mpq_sub __GMP_PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); - -#define mpq_swap __gmpq_swap -__GMP_DECLSPEC void mpq_swap __GMP_PROTO ((mpq_ptr, mpq_ptr)) __GMP_NOTHROW; - - -/**************** Float (i.e. F) routines. ****************/ - -#define mpf_abs __gmpf_abs -__GMP_DECLSPEC void mpf_abs __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_add __gmpf_add -__GMP_DECLSPEC void mpf_add __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); - -#define mpf_add_ui __gmpf_add_ui -__GMP_DECLSPEC void mpf_add_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); -#define mpf_ceil __gmpf_ceil -__GMP_DECLSPEC void mpf_ceil __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_clear __gmpf_clear -__GMP_DECLSPEC void mpf_clear __GMP_PROTO ((mpf_ptr)); - -#define mpf_clears __gmpf_clears -__GMP_DECLSPEC void mpf_clears __GMP_PROTO ((mpf_ptr, ...)); - -#define mpf_cmp __gmpf_cmp -__GMP_DECLSPEC int mpf_cmp __GMP_PROTO ((mpf_srcptr, mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_cmp_d __gmpf_cmp_d -__GMP_DECLSPEC int mpf_cmp_d __GMP_PROTO ((mpf_srcptr, double)) __GMP_ATTRIBUTE_PURE; - -#define mpf_cmp_si __gmpf_cmp_si -__GMP_DECLSPEC int mpf_cmp_si __GMP_PROTO ((mpf_srcptr, signed long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_cmp_ui __gmpf_cmp_ui -__GMP_DECLSPEC int mpf_cmp_ui __GMP_PROTO ((mpf_srcptr, unsigned long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_div __gmpf_div -__GMP_DECLSPEC void mpf_div __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); - -#define mpf_div_2exp __gmpf_div_2exp -__GMP_DECLSPEC void mpf_div_2exp __GMP_PROTO ((mpf_ptr, mpf_srcptr, mp_bitcnt_t)); - -#define mpf_div_ui __gmpf_div_ui -__GMP_DECLSPEC void mpf_div_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); - -#define mpf_dump __gmpf_dump -__GMP_DECLSPEC void mpf_dump __GMP_PROTO ((mpf_srcptr)); - -#define mpf_eq __gmpf_eq -__GMP_DECLSPEC int mpf_eq __GMP_PROTO ((mpf_srcptr, mpf_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE; - -#define mpf_fits_sint_p __gmpf_fits_sint_p -__GMP_DECLSPEC int mpf_fits_sint_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_fits_slong_p __gmpf_fits_slong_p -__GMP_DECLSPEC int mpf_fits_slong_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_fits_sshort_p __gmpf_fits_sshort_p -__GMP_DECLSPEC int mpf_fits_sshort_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_fits_uint_p __gmpf_fits_uint_p -__GMP_DECLSPEC int mpf_fits_uint_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_fits_ulong_p __gmpf_fits_ulong_p -__GMP_DECLSPEC int mpf_fits_ulong_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_fits_ushort_p __gmpf_fits_ushort_p -__GMP_DECLSPEC int mpf_fits_ushort_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_floor __gmpf_floor -__GMP_DECLSPEC void mpf_floor __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_get_d __gmpf_get_d -__GMP_DECLSPEC double mpf_get_d __GMP_PROTO ((mpf_srcptr)) __GMP_ATTRIBUTE_PURE; - -#define mpf_get_d_2exp __gmpf_get_d_2exp -__GMP_DECLSPEC double mpf_get_d_2exp __GMP_PROTO ((signed long int *, mpf_srcptr)); - -#define mpf_get_default_prec __gmpf_get_default_prec -__GMP_DECLSPEC mp_bitcnt_t mpf_get_default_prec __GMP_PROTO ((void)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_get_prec __gmpf_get_prec -__GMP_DECLSPEC mp_bitcnt_t mpf_get_prec __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_get_si __gmpf_get_si -__GMP_DECLSPEC long mpf_get_si __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_get_str __gmpf_get_str -__GMP_DECLSPEC char *mpf_get_str __GMP_PROTO ((char *, mp_exp_t *, int, size_t, mpf_srcptr)); - -#define mpf_get_ui __gmpf_get_ui -__GMP_DECLSPEC unsigned long mpf_get_ui __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_init __gmpf_init -__GMP_DECLSPEC void mpf_init __GMP_PROTO ((mpf_ptr)); - -#define mpf_init2 __gmpf_init2 -__GMP_DECLSPEC void mpf_init2 __GMP_PROTO ((mpf_ptr, mp_bitcnt_t)); - -#define mpf_inits __gmpf_inits -__GMP_DECLSPEC void mpf_inits __GMP_PROTO ((mpf_ptr, ...)); - -#define mpf_init_set __gmpf_init_set -__GMP_DECLSPEC void mpf_init_set __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_init_set_d __gmpf_init_set_d -__GMP_DECLSPEC void mpf_init_set_d __GMP_PROTO ((mpf_ptr, double)); - -#define mpf_init_set_si __gmpf_init_set_si -__GMP_DECLSPEC void mpf_init_set_si __GMP_PROTO ((mpf_ptr, signed long int)); - -#define mpf_init_set_str __gmpf_init_set_str -__GMP_DECLSPEC int mpf_init_set_str __GMP_PROTO ((mpf_ptr, __gmp_const char *, int)); - -#define mpf_init_set_ui __gmpf_init_set_ui -__GMP_DECLSPEC void mpf_init_set_ui __GMP_PROTO ((mpf_ptr, unsigned long int)); - -#define mpf_inp_str __gmpf_inp_str -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpf_inp_str __GMP_PROTO ((mpf_ptr, FILE *, int)); -#endif - -#define mpf_integer_p __gmpf_integer_p -__GMP_DECLSPEC int mpf_integer_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_mul __gmpf_mul -__GMP_DECLSPEC void mpf_mul __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); - -#define mpf_mul_2exp __gmpf_mul_2exp -__GMP_DECLSPEC void mpf_mul_2exp __GMP_PROTO ((mpf_ptr, mpf_srcptr, mp_bitcnt_t)); - -#define mpf_mul_ui __gmpf_mul_ui -__GMP_DECLSPEC void mpf_mul_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); - -#define mpf_neg __gmpf_neg -__GMP_DECLSPEC void mpf_neg __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_out_str __gmpf_out_str -#ifdef _GMP_H_HAVE_FILE -__GMP_DECLSPEC size_t mpf_out_str __GMP_PROTO ((FILE *, int, size_t, mpf_srcptr)); -#endif - -#define mpf_pow_ui __gmpf_pow_ui -__GMP_DECLSPEC void mpf_pow_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); - -#define mpf_random2 __gmpf_random2 -__GMP_DECLSPEC void mpf_random2 __GMP_PROTO ((mpf_ptr, mp_size_t, mp_exp_t)); - -#define mpf_reldiff __gmpf_reldiff -__GMP_DECLSPEC void mpf_reldiff __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); - -#define mpf_set __gmpf_set -__GMP_DECLSPEC void mpf_set __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_set_d __gmpf_set_d -__GMP_DECLSPEC void mpf_set_d __GMP_PROTO ((mpf_ptr, double)); - -#define mpf_set_default_prec __gmpf_set_default_prec -__GMP_DECLSPEC void mpf_set_default_prec __GMP_PROTO ((mp_bitcnt_t)) __GMP_NOTHROW; - -#define mpf_set_prec __gmpf_set_prec -__GMP_DECLSPEC void mpf_set_prec __GMP_PROTO ((mpf_ptr, mp_bitcnt_t)); - -#define mpf_set_prec_raw __gmpf_set_prec_raw -__GMP_DECLSPEC void mpf_set_prec_raw __GMP_PROTO ((mpf_ptr, mp_bitcnt_t)) __GMP_NOTHROW; - -#define mpf_set_q __gmpf_set_q -__GMP_DECLSPEC void mpf_set_q __GMP_PROTO ((mpf_ptr, mpq_srcptr)); - -#define mpf_set_si __gmpf_set_si -__GMP_DECLSPEC void mpf_set_si __GMP_PROTO ((mpf_ptr, signed long int)); - -#define mpf_set_str __gmpf_set_str -__GMP_DECLSPEC int mpf_set_str __GMP_PROTO ((mpf_ptr, __gmp_const char *, int)); - -#define mpf_set_ui __gmpf_set_ui -__GMP_DECLSPEC void mpf_set_ui __GMP_PROTO ((mpf_ptr, unsigned long int)); - -#define mpf_set_z __gmpf_set_z -__GMP_DECLSPEC void mpf_set_z __GMP_PROTO ((mpf_ptr, mpz_srcptr)); - -#define mpf_size __gmpf_size -__GMP_DECLSPEC size_t mpf_size __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpf_sqrt __gmpf_sqrt -__GMP_DECLSPEC void mpf_sqrt __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_sqrt_ui __gmpf_sqrt_ui -__GMP_DECLSPEC void mpf_sqrt_ui __GMP_PROTO ((mpf_ptr, unsigned long int)); - -#define mpf_sub __gmpf_sub -__GMP_DECLSPEC void mpf_sub __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); - -#define mpf_sub_ui __gmpf_sub_ui -__GMP_DECLSPEC void mpf_sub_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); - -#define mpf_swap __gmpf_swap -__GMP_DECLSPEC void mpf_swap __GMP_PROTO ((mpf_ptr, mpf_ptr)) __GMP_NOTHROW; - -#define mpf_trunc __gmpf_trunc -__GMP_DECLSPEC void mpf_trunc __GMP_PROTO ((mpf_ptr, mpf_srcptr)); - -#define mpf_ui_div __gmpf_ui_div -__GMP_DECLSPEC void mpf_ui_div __GMP_PROTO ((mpf_ptr, unsigned long int, mpf_srcptr)); - -#define mpf_ui_sub __gmpf_ui_sub -__GMP_DECLSPEC void mpf_ui_sub __GMP_PROTO ((mpf_ptr, unsigned long int, mpf_srcptr)); - -#define mpf_urandomb __gmpf_urandomb -__GMP_DECLSPEC void mpf_urandomb __GMP_PROTO ((mpf_t, gmp_randstate_t, mp_bitcnt_t)); - - -/************ Low level positive-integer (i.e. N) routines. ************/ - -/* This is ugly, but we need to make user calls reach the prefixed function. */ - -#define mpn_add __MPN(add) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_add) -__GMP_DECLSPEC mp_limb_t mpn_add __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t)); -#endif - -#define mpn_add_1 __MPN(add_1) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_add_1) -__GMP_DECLSPEC mp_limb_t mpn_add_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)) __GMP_NOTHROW; -#endif - -#define mpn_add_n __MPN(add_n) -__GMP_DECLSPEC mp_limb_t mpn_add_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); - -#define mpn_addmul_1 __MPN(addmul_1) -__GMP_DECLSPEC mp_limb_t mpn_addmul_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_cmp __MPN(cmp) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_cmp) -__GMP_DECLSPEC int mpn_cmp __GMP_PROTO ((mp_srcptr, mp_srcptr, mp_size_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; -#endif - -#define mpn_divexact_by3(dst,src,size) \ - mpn_divexact_by3c (dst, src, size, __GMP_CAST (mp_limb_t, 0)) - -#define mpn_divexact_by3c __MPN(divexact_by3c) -__GMP_DECLSPEC mp_limb_t mpn_divexact_by3c __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_divmod_1(qp,np,nsize,dlimb) \ - mpn_divrem_1 (qp, __GMP_CAST (mp_size_t, 0), np, nsize, dlimb) - -#define mpn_divrem __MPN(divrem) -__GMP_DECLSPEC mp_limb_t mpn_divrem __GMP_PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t)); - -#define mpn_divrem_1 __MPN(divrem_1) -__GMP_DECLSPEC mp_limb_t mpn_divrem_1 __GMP_PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_divrem_2 __MPN(divrem_2) -__GMP_DECLSPEC mp_limb_t mpn_divrem_2 __GMP_PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr)); - -#define mpn_gcd __MPN(gcd) -__GMP_DECLSPEC mp_size_t mpn_gcd __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t)); - -#define mpn_gcd_1 __MPN(gcd_1) -__GMP_DECLSPEC mp_limb_t mpn_gcd_1 __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_gcdext_1 __MPN(gcdext_1) -__GMP_DECLSPEC mp_limb_t mpn_gcdext_1 __GMP_PROTO ((mp_limb_signed_t *, mp_limb_signed_t *, mp_limb_t, mp_limb_t)); - -#define mpn_gcdext __MPN(gcdext) -__GMP_DECLSPEC mp_size_t mpn_gcdext __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t *, mp_ptr, mp_size_t, mp_ptr, mp_size_t)); - -#define mpn_get_str __MPN(get_str) -__GMP_DECLSPEC size_t mpn_get_str __GMP_PROTO ((unsigned char *, int, mp_ptr, mp_size_t)); - -#define mpn_hamdist __MPN(hamdist) -__GMP_DECLSPEC mp_bitcnt_t mpn_hamdist __GMP_PROTO ((mp_srcptr, mp_srcptr, mp_size_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpn_lshift __MPN(lshift) -__GMP_DECLSPEC mp_limb_t mpn_lshift __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int)); - -#define mpn_mod_1 __MPN(mod_1) -__GMP_DECLSPEC mp_limb_t mpn_mod_1 __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_mul __MPN(mul) -__GMP_DECLSPEC mp_limb_t mpn_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)); - -#define mpn_mul_1 __MPN(mul_1) -__GMP_DECLSPEC mp_limb_t mpn_mul_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_mul_n __MPN(mul_n) -__GMP_DECLSPEC void mpn_mul_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); - -#define mpn_sqr __MPN(sqr) -__GMP_DECLSPEC void mpn_sqr __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); - -#define mpn_neg __MPN(neg) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_neg) -__GMP_DECLSPEC mp_limb_t mpn_neg __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -#endif - -#define mpn_com __MPN(com) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_com) -__GMP_DECLSPEC void mpn_com __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -#endif - -#define mpn_perfect_square_p __MPN(perfect_square_p) -__GMP_DECLSPEC int mpn_perfect_square_p __GMP_PROTO ((mp_srcptr, mp_size_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_perfect_power_p __MPN(perfect_power_p) -__GMP_DECLSPEC int mpn_perfect_power_p __GMP_PROTO ((mp_srcptr, mp_size_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_popcount __MPN(popcount) -__GMP_DECLSPEC mp_bitcnt_t mpn_popcount __GMP_PROTO ((mp_srcptr, mp_size_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; - -#define mpn_pow_1 __MPN(pow_1) -__GMP_DECLSPEC mp_size_t mpn_pow_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_ptr)); - -/* undocumented now, but retained here for upward compatibility */ -#define mpn_preinv_mod_1 __MPN(preinv_mod_1) -__GMP_DECLSPEC mp_limb_t mpn_preinv_mod_1 __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_random __MPN(random) -__GMP_DECLSPEC void mpn_random __GMP_PROTO ((mp_ptr, mp_size_t)); - -#define mpn_random2 __MPN(random2) -__GMP_DECLSPEC void mpn_random2 __GMP_PROTO ((mp_ptr, mp_size_t)); - -#define mpn_rshift __MPN(rshift) -__GMP_DECLSPEC mp_limb_t mpn_rshift __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int)); - -#define mpn_scan0 __MPN(scan0) -__GMP_DECLSPEC mp_bitcnt_t mpn_scan0 __GMP_PROTO ((mp_srcptr, mp_bitcnt_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_scan1 __MPN(scan1) -__GMP_DECLSPEC mp_bitcnt_t mpn_scan1 __GMP_PROTO ((mp_srcptr, mp_bitcnt_t)) __GMP_ATTRIBUTE_PURE; - -#define mpn_set_str __MPN(set_str) -__GMP_DECLSPEC mp_size_t mpn_set_str __GMP_PROTO ((mp_ptr, __gmp_const unsigned char *, size_t, int)); - -#define mpn_sqrtrem __MPN(sqrtrem) -__GMP_DECLSPEC mp_size_t mpn_sqrtrem __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t)); - -#define mpn_sub __MPN(sub) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_sub) -__GMP_DECLSPEC mp_limb_t mpn_sub __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t)); -#endif - -#define mpn_sub_1 __MPN(sub_1) -#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_sub_1) -__GMP_DECLSPEC mp_limb_t mpn_sub_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)) __GMP_NOTHROW; -#endif - -#define mpn_sub_n __MPN(sub_n) -__GMP_DECLSPEC mp_limb_t mpn_sub_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); - -#define mpn_submul_1 __MPN(submul_1) -__GMP_DECLSPEC mp_limb_t mpn_submul_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); - -#define mpn_tdiv_qr __MPN(tdiv_qr) -__GMP_DECLSPEC void mpn_tdiv_qr __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)); - -#define mpn_and_n __MPN(and_n) -__GMP_DECLSPEC void mpn_and_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_andn_n __MPN(andn_n) -__GMP_DECLSPEC void mpn_andn_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_nand_n __MPN(nand_n) -__GMP_DECLSPEC void mpn_nand_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_ior_n __MPN(ior_n) -__GMP_DECLSPEC void mpn_ior_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_iorn_n __MPN(iorn_n) -__GMP_DECLSPEC void mpn_iorn_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_nior_n __MPN(nior_n) -__GMP_DECLSPEC void mpn_nior_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_xor_n __MPN(xor_n) -__GMP_DECLSPEC void mpn_xor_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); -#define mpn_xnor_n __MPN(xnor_n) -__GMP_DECLSPEC void mpn_xnor_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); - -#define mpn_copyi __MPN(copyi) -__GMP_DECLSPEC void mpn_copyi __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -#define mpn_copyd __MPN(copyd) -__GMP_DECLSPEC void mpn_copyd __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); -#define mpn_zero __MPN(zero) -__GMP_DECLSPEC void mpn_zero __GMP_PROTO ((mp_ptr, mp_size_t)); - -/**************** mpz inlines ****************/ - -/* The following are provided as inlines where possible, but always exist as - library functions too, for binary compatibility. - - Within gmp itself this inlining generally isn't relied on, since it - doesn't get done for all compilers, whereas if something is worth - inlining then it's worth arranging always. - - There are two styles of inlining here. When the same bit of code is - wanted for the inline as for the library version, then __GMP_FORCE_foo - arranges for that code to be emitted and the __GMP_EXTERN_INLINE - directive suppressed, eg. mpz_fits_uint_p. When a different bit of code - is wanted for the inline than for the library version, then - __GMP_FORCE_foo arranges the inline to be suppressed, eg. mpz_abs. */ - -#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpz_abs) -__GMP_EXTERN_INLINE void -mpz_abs (mpz_ptr __gmp_w, mpz_srcptr __gmp_u) -{ - if (__gmp_w != __gmp_u) - mpz_set (__gmp_w, __gmp_u); - __gmp_w->_mp_size = __GMP_ABS (__gmp_w->_mp_size); -} -#endif - -#if GMP_NAIL_BITS == 0 -#define __GMPZ_FITS_UTYPE_P(z,maxval) \ - mp_size_t __gmp_n = z->_mp_size; \ - mp_ptr __gmp_p = z->_mp_d; \ - return (__gmp_n == 0 || (__gmp_n == 1 && __gmp_p[0] <= maxval)); -#else -#define __GMPZ_FITS_UTYPE_P(z,maxval) \ - mp_size_t __gmp_n = z->_mp_size; \ - mp_ptr __gmp_p = z->_mp_d; \ - return (__gmp_n == 0 || (__gmp_n == 1 && __gmp_p[0] <= maxval) \ - || (__gmp_n == 2 && __gmp_p[1] <= ((mp_limb_t) maxval >> GMP_NUMB_BITS))); -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_uint_p) -#if ! defined (__GMP_FORCE_mpz_fits_uint_p) -__GMP_EXTERN_INLINE -#endif -int -mpz_fits_uint_p (mpz_srcptr __gmp_z) __GMP_NOTHROW -{ - __GMPZ_FITS_UTYPE_P (__gmp_z, __GMP_UINT_MAX); -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_ulong_p) -#if ! defined (__GMP_FORCE_mpz_fits_ulong_p) -__GMP_EXTERN_INLINE -#endif -int -mpz_fits_ulong_p (mpz_srcptr __gmp_z) __GMP_NOTHROW -{ - __GMPZ_FITS_UTYPE_P (__gmp_z, __GMP_ULONG_MAX); -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_ushort_p) -#if ! defined (__GMP_FORCE_mpz_fits_ushort_p) -__GMP_EXTERN_INLINE -#endif -int -mpz_fits_ushort_p (mpz_srcptr __gmp_z) __GMP_NOTHROW -{ - __GMPZ_FITS_UTYPE_P (__gmp_z, __GMP_USHRT_MAX); -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_get_ui) -#if ! defined (__GMP_FORCE_mpz_get_ui) -__GMP_EXTERN_INLINE -#endif -unsigned long -mpz_get_ui (mpz_srcptr __gmp_z) __GMP_NOTHROW -{ - mp_ptr __gmp_p = __gmp_z->_mp_d; - mp_size_t __gmp_n = __gmp_z->_mp_size; - mp_limb_t __gmp_l = __gmp_p[0]; - /* This is a "#if" rather than a plain "if" so as to avoid gcc warnings - about "<< GMP_NUMB_BITS" exceeding the type size, and to avoid Borland - C++ 6.0 warnings about condition always true for something like - "__GMP_ULONG_MAX < GMP_NUMB_MASK". */ -#if GMP_NAIL_BITS == 0 || defined (_LONG_LONG_LIMB) - /* limb==long and no nails, or limb==longlong, one limb is enough */ - return (__gmp_n != 0 ? __gmp_l : 0); -#else - /* limb==long and nails, need two limbs when available */ - __gmp_n = __GMP_ABS (__gmp_n); - if (__gmp_n <= 1) - return (__gmp_n != 0 ? __gmp_l : 0); - else - return __gmp_l + (__gmp_p[1] << GMP_NUMB_BITS); -#endif -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_getlimbn) -#if ! defined (__GMP_FORCE_mpz_getlimbn) -__GMP_EXTERN_INLINE -#endif -mp_limb_t -mpz_getlimbn (mpz_srcptr __gmp_z, mp_size_t __gmp_n) __GMP_NOTHROW -{ - mp_limb_t __gmp_result = 0; - if (__GMP_LIKELY (__gmp_n >= 0 && __gmp_n < __GMP_ABS (__gmp_z->_mp_size))) - __gmp_result = __gmp_z->_mp_d[__gmp_n]; - return __gmp_result; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpz_neg) -__GMP_EXTERN_INLINE void -mpz_neg (mpz_ptr __gmp_w, mpz_srcptr __gmp_u) -{ - if (__gmp_w != __gmp_u) - mpz_set (__gmp_w, __gmp_u); - __gmp_w->_mp_size = - __gmp_w->_mp_size; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_perfect_square_p) -#if ! defined (__GMP_FORCE_mpz_perfect_square_p) -__GMP_EXTERN_INLINE -#endif -int -mpz_perfect_square_p (mpz_srcptr __gmp_a) -{ - mp_size_t __gmp_asize; - int __gmp_result; - - __gmp_asize = __gmp_a->_mp_size; - __gmp_result = (__gmp_asize >= 0); /* zero is a square, negatives are not */ - if (__GMP_LIKELY (__gmp_asize > 0)) - __gmp_result = mpn_perfect_square_p (__gmp_a->_mp_d, __gmp_asize); - return __gmp_result; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_popcount) -#if ! defined (__GMP_FORCE_mpz_popcount) -__GMP_EXTERN_INLINE -#endif -mp_bitcnt_t -mpz_popcount (mpz_srcptr __gmp_u) __GMP_NOTHROW -{ - mp_size_t __gmp_usize; - mp_bitcnt_t __gmp_result; - - __gmp_usize = __gmp_u->_mp_size; - __gmp_result = (__gmp_usize < 0 ? __GMP_ULONG_MAX : 0); - if (__GMP_LIKELY (__gmp_usize > 0)) - __gmp_result = mpn_popcount (__gmp_u->_mp_d, __gmp_usize); - return __gmp_result; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_set_q) -#if ! defined (__GMP_FORCE_mpz_set_q) -__GMP_EXTERN_INLINE -#endif -void -mpz_set_q (mpz_ptr __gmp_w, mpq_srcptr __gmp_u) -{ - mpz_tdiv_q (__gmp_w, mpq_numref (__gmp_u), mpq_denref (__gmp_u)); -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_size) -#if ! defined (__GMP_FORCE_mpz_size) -__GMP_EXTERN_INLINE -#endif -size_t -mpz_size (mpz_srcptr __gmp_z) __GMP_NOTHROW -{ - return __GMP_ABS (__gmp_z->_mp_size); -} -#endif - - -/**************** mpq inlines ****************/ - -#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpq_abs) -__GMP_EXTERN_INLINE void -mpq_abs (mpq_ptr __gmp_w, mpq_srcptr __gmp_u) -{ - if (__gmp_w != __gmp_u) - mpq_set (__gmp_w, __gmp_u); - __gmp_w->_mp_num._mp_size = __GMP_ABS (__gmp_w->_mp_num._mp_size); -} -#endif - -#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpq_neg) -__GMP_EXTERN_INLINE void -mpq_neg (mpq_ptr __gmp_w, mpq_srcptr __gmp_u) -{ - if (__gmp_w != __gmp_u) - mpq_set (__gmp_w, __gmp_u); - __gmp_w->_mp_num._mp_size = - __gmp_w->_mp_num._mp_size; -} -#endif - - -/**************** mpn inlines ****************/ - -/* The comments with __GMPN_ADD_1 below apply here too. - - The test for FUNCTION returning 0 should predict well. If it's assumed - {yp,ysize} will usually have a random number of bits then the high limb - won't be full and a carry out will occur a good deal less than 50% of the - time. - - ysize==0 isn't a documented feature, but is used internally in a few - places. - - Producing cout last stops it using up a register during the main part of - the calculation, though gcc (as of 3.0) on an "if (mpn_add (...))" - doesn't seem able to move the true and false legs of the conditional up - to the two places cout is generated. */ - -#define __GMPN_AORS(cout, wp, xp, xsize, yp, ysize, FUNCTION, TEST) \ - do { \ - mp_size_t __gmp_i; \ - mp_limb_t __gmp_x; \ - \ - /* ASSERT ((ysize) >= 0); */ \ - /* ASSERT ((xsize) >= (ysize)); */ \ - /* ASSERT (MPN_SAME_OR_SEPARATE2_P (wp, xsize, xp, xsize)); */ \ - /* ASSERT (MPN_SAME_OR_SEPARATE2_P (wp, xsize, yp, ysize)); */ \ - \ - __gmp_i = (ysize); \ - if (__gmp_i != 0) \ - { \ - if (FUNCTION (wp, xp, yp, __gmp_i)) \ - { \ - do \ - { \ - if (__gmp_i >= (xsize)) \ - { \ - (cout) = 1; \ - goto __gmp_done; \ - } \ - __gmp_x = (xp)[__gmp_i]; \ - } \ - while (TEST); \ - } \ - } \ - if ((wp) != (xp)) \ - __GMPN_COPY_REST (wp, xp, xsize, __gmp_i); \ - (cout) = 0; \ - __gmp_done: \ - ; \ - } while (0) - -#define __GMPN_ADD(cout, wp, xp, xsize, yp, ysize) \ - __GMPN_AORS (cout, wp, xp, xsize, yp, ysize, mpn_add_n, \ - (((wp)[__gmp_i++] = (__gmp_x + 1) & GMP_NUMB_MASK) == 0)) -#define __GMPN_SUB(cout, wp, xp, xsize, yp, ysize) \ - __GMPN_AORS (cout, wp, xp, xsize, yp, ysize, mpn_sub_n, \ - (((wp)[__gmp_i++] = (__gmp_x - 1) & GMP_NUMB_MASK), __gmp_x == 0)) - - -/* The use of __gmp_i indexing is designed to ensure a compile time src==dst - remains nice and clear to the compiler, so that __GMPN_COPY_REST can - disappear, and the load/add/store gets a chance to become a - read-modify-write on CISC CPUs. - - Alternatives: - - Using a pair of pointers instead of indexing would be possible, but gcc - isn't able to recognise compile-time src==dst in that case, even when the - pointers are incremented more or less together. Other compilers would - very likely have similar difficulty. - - gcc could use "if (__builtin_constant_p(src==dst) && src==dst)" or - similar to detect a compile-time src==dst. This works nicely on gcc - 2.95.x, it's not good on gcc 3.0 where __builtin_constant_p(p==p) seems - to be always false, for a pointer p. But the current code form seems - good enough for src==dst anyway. - - gcc on x86 as usual doesn't give particularly good flags handling for the - carry/borrow detection. It's tempting to want some multi instruction asm - blocks to help it, and this was tried, but in truth there's only a few - instructions to save and any gain is all too easily lost by register - juggling setting up for the asm. */ - -#if GMP_NAIL_BITS == 0 -#define __GMPN_AORS_1(cout, dst, src, n, v, OP, CB) \ - do { \ - mp_size_t __gmp_i; \ - mp_limb_t __gmp_x, __gmp_r; \ - \ - /* ASSERT ((n) >= 1); */ \ - /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, n)); */ \ - \ - __gmp_x = (src)[0]; \ - __gmp_r = __gmp_x OP (v); \ - (dst)[0] = __gmp_r; \ - if (CB (__gmp_r, __gmp_x, (v))) \ - { \ - (cout) = 1; \ - for (__gmp_i = 1; __gmp_i < (n);) \ - { \ - __gmp_x = (src)[__gmp_i]; \ - __gmp_r = __gmp_x OP 1; \ - (dst)[__gmp_i] = __gmp_r; \ - ++__gmp_i; \ - if (!CB (__gmp_r, __gmp_x, 1)) \ - { \ - if ((src) != (dst)) \ - __GMPN_COPY_REST (dst, src, n, __gmp_i); \ - (cout) = 0; \ - break; \ - } \ - } \ - } \ - else \ - { \ - if ((src) != (dst)) \ - __GMPN_COPY_REST (dst, src, n, 1); \ - (cout) = 0; \ - } \ - } while (0) -#endif - -#if GMP_NAIL_BITS >= 1 -#define __GMPN_AORS_1(cout, dst, src, n, v, OP, CB) \ - do { \ - mp_size_t __gmp_i; \ - mp_limb_t __gmp_x, __gmp_r; \ - \ - /* ASSERT ((n) >= 1); */ \ - /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, n)); */ \ - \ - __gmp_x = (src)[0]; \ - __gmp_r = __gmp_x OP (v); \ - (dst)[0] = __gmp_r & GMP_NUMB_MASK; \ - if (__gmp_r >> GMP_NUMB_BITS != 0) \ - { \ - (cout) = 1; \ - for (__gmp_i = 1; __gmp_i < (n);) \ - { \ - __gmp_x = (src)[__gmp_i]; \ - __gmp_r = __gmp_x OP 1; \ - (dst)[__gmp_i] = __gmp_r & GMP_NUMB_MASK; \ - ++__gmp_i; \ - if (__gmp_r >> GMP_NUMB_BITS == 0) \ - { \ - if ((src) != (dst)) \ - __GMPN_COPY_REST (dst, src, n, __gmp_i); \ - (cout) = 0; \ - break; \ - } \ - } \ - } \ - else \ - { \ - if ((src) != (dst)) \ - __GMPN_COPY_REST (dst, src, n, 1); \ - (cout) = 0; \ - } \ - } while (0) -#endif - -#define __GMPN_ADDCB(r,x,y) ((r) < (y)) -#define __GMPN_SUBCB(r,x,y) ((x) < (y)) - -#define __GMPN_ADD_1(cout, dst, src, n, v) \ - __GMPN_AORS_1(cout, dst, src, n, v, +, __GMPN_ADDCB) -#define __GMPN_SUB_1(cout, dst, src, n, v) \ - __GMPN_AORS_1(cout, dst, src, n, v, -, __GMPN_SUBCB) - - -/* Compare {xp,size} and {yp,size}, setting "result" to positive, zero or - negative. size==0 is allowed. On random data usually only one limb will - need to be examined to get a result, so it's worth having it inline. */ -#define __GMPN_CMP(result, xp, yp, size) \ - do { \ - mp_size_t __gmp_i; \ - mp_limb_t __gmp_x, __gmp_y; \ - \ - /* ASSERT ((size) >= 0); */ \ - \ - (result) = 0; \ - __gmp_i = (size); \ - while (--__gmp_i >= 0) \ - { \ - __gmp_x = (xp)[__gmp_i]; \ - __gmp_y = (yp)[__gmp_i]; \ - if (__gmp_x != __gmp_y) \ - { \ - /* Cannot use __gmp_x - __gmp_y, may overflow an "int" */ \ - (result) = (__gmp_x > __gmp_y ? 1 : -1); \ - break; \ - } \ - } \ - } while (0) - - -#if defined (__GMPN_COPY) && ! defined (__GMPN_COPY_REST) -#define __GMPN_COPY_REST(dst, src, size, start) \ - do { \ - /* ASSERT ((start) >= 0); */ \ - /* ASSERT ((start) <= (size)); */ \ - __GMPN_COPY ((dst)+(start), (src)+(start), (size)-(start)); \ - } while (0) -#endif - -/* Copy {src,size} to {dst,size}, starting at "start". This is designed to - keep the indexing dst[j] and src[j] nice and simple for __GMPN_ADD_1, - __GMPN_ADD, etc. */ -#if ! defined (__GMPN_COPY_REST) -#define __GMPN_COPY_REST(dst, src, size, start) \ - do { \ - mp_size_t __gmp_j; \ - /* ASSERT ((size) >= 0); */ \ - /* ASSERT ((start) >= 0); */ \ - /* ASSERT ((start) <= (size)); */ \ - /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, size)); */ \ - __GMP_CRAY_Pragma ("_CRI ivdep"); \ - for (__gmp_j = (start); __gmp_j < (size); __gmp_j++) \ - (dst)[__gmp_j] = (src)[__gmp_j]; \ - } while (0) -#endif - -/* Enhancement: Use some of the smarter code from gmp-impl.h. Maybe use - mpn_copyi if there's a native version, and if we don't mind demanding - binary compatibility for it (on targets which use it). */ - -#if ! defined (__GMPN_COPY) -#define __GMPN_COPY(dst, src, size) __GMPN_COPY_REST (dst, src, size, 0) -#endif - - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_add) -#if ! defined (__GMP_FORCE_mpn_add) -__GMP_EXTERN_INLINE -#endif -mp_limb_t -mpn_add (mp_ptr __gmp_wp, mp_srcptr __gmp_xp, mp_size_t __gmp_xsize, mp_srcptr __gmp_yp, mp_size_t __gmp_ysize) -{ - mp_limb_t __gmp_c; - __GMPN_ADD (__gmp_c, __gmp_wp, __gmp_xp, __gmp_xsize, __gmp_yp, __gmp_ysize); - return __gmp_c; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_add_1) -#if ! defined (__GMP_FORCE_mpn_add_1) -__GMP_EXTERN_INLINE -#endif -mp_limb_t -mpn_add_1 (mp_ptr __gmp_dst, mp_srcptr __gmp_src, mp_size_t __gmp_size, mp_limb_t __gmp_n) __GMP_NOTHROW -{ - mp_limb_t __gmp_c; - __GMPN_ADD_1 (__gmp_c, __gmp_dst, __gmp_src, __gmp_size, __gmp_n); - return __gmp_c; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_cmp) -#if ! defined (__GMP_FORCE_mpn_cmp) -__GMP_EXTERN_INLINE -#endif -int -mpn_cmp (mp_srcptr __gmp_xp, mp_srcptr __gmp_yp, mp_size_t __gmp_size) __GMP_NOTHROW -{ - int __gmp_result; - __GMPN_CMP (__gmp_result, __gmp_xp, __gmp_yp, __gmp_size); - return __gmp_result; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_sub) -#if ! defined (__GMP_FORCE_mpn_sub) -__GMP_EXTERN_INLINE -#endif -mp_limb_t -mpn_sub (mp_ptr __gmp_wp, mp_srcptr __gmp_xp, mp_size_t __gmp_xsize, mp_srcptr __gmp_yp, mp_size_t __gmp_ysize) -{ - mp_limb_t __gmp_c; - __GMPN_SUB (__gmp_c, __gmp_wp, __gmp_xp, __gmp_xsize, __gmp_yp, __gmp_ysize); - return __gmp_c; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_sub_1) -#if ! defined (__GMP_FORCE_mpn_sub_1) -__GMP_EXTERN_INLINE -#endif -mp_limb_t -mpn_sub_1 (mp_ptr __gmp_dst, mp_srcptr __gmp_src, mp_size_t __gmp_size, mp_limb_t __gmp_n) __GMP_NOTHROW -{ - mp_limb_t __gmp_c; - __GMPN_SUB_1 (__gmp_c, __gmp_dst, __gmp_src, __gmp_size, __gmp_n); - return __gmp_c; -} -#endif - -#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_neg) -#if ! defined (__GMP_FORCE_mpn_neg) -__GMP_EXTERN_INLINE -#endif -mp_limb_t -mpn_neg (mp_ptr __gmp_rp, mp_srcptr __gmp_up, mp_size_t __gmp_n) -{ - mp_limb_t __gmp_ul, __gmp_cy; - __gmp_cy = 0; - do { - __gmp_ul = *__gmp_up++; - *__gmp_rp++ = -__gmp_ul - __gmp_cy; - __gmp_cy |= __gmp_ul != 0; - } while (--__gmp_n != 0); - return __gmp_cy; -} -#endif - -#if defined (__cplusplus) -} -#endif - - -/* Allow faster testing for negative, zero, and positive. */ -#define mpz_sgn(Z) ((Z)->_mp_size < 0 ? -1 : (Z)->_mp_size > 0) -#define mpf_sgn(F) ((F)->_mp_size < 0 ? -1 : (F)->_mp_size > 0) -#define mpq_sgn(Q) ((Q)->_mp_num._mp_size < 0 ? -1 : (Q)->_mp_num._mp_size > 0) - -/* When using GCC, optimize certain common comparisons. */ -#if defined (__GNUC__) && __GNUC__ >= 2 -#define mpz_cmp_ui(Z,UI) \ - (__builtin_constant_p (UI) && (UI) == 0 \ - ? mpz_sgn (Z) : _mpz_cmp_ui (Z,UI)) -#define mpz_cmp_si(Z,SI) \ - (__builtin_constant_p (SI) && (SI) == 0 ? mpz_sgn (Z) \ - : __builtin_constant_p (SI) && (SI) > 0 \ - ? _mpz_cmp_ui (Z, __GMP_CAST (unsigned long int, SI)) \ - : _mpz_cmp_si (Z,SI)) -#define mpq_cmp_ui(Q,NUI,DUI) \ - (__builtin_constant_p (NUI) && (NUI) == 0 \ - ? mpq_sgn (Q) : _mpq_cmp_ui (Q,NUI,DUI)) -#define mpq_cmp_si(q,n,d) \ - (__builtin_constant_p ((n) >= 0) && (n) >= 0 \ - ? mpq_cmp_ui (q, __GMP_CAST (unsigned long, n), d) \ - : _mpq_cmp_si (q, n, d)) -#else -#define mpz_cmp_ui(Z,UI) _mpz_cmp_ui (Z,UI) -#define mpz_cmp_si(Z,UI) _mpz_cmp_si (Z,UI) -#define mpq_cmp_ui(Q,NUI,DUI) _mpq_cmp_ui (Q,NUI,DUI) -#define mpq_cmp_si(q,n,d) _mpq_cmp_si(q,n,d) -#endif - - -/* Using "&" rather than "&&" means these can come out branch-free. Every - mpz_t has at least one limb allocated, so fetching the low limb is always - allowed. */ -#define mpz_odd_p(z) (((z)->_mp_size != 0) & __GMP_CAST (int, (z)->_mp_d[0])) -#define mpz_even_p(z) (! mpz_odd_p (z)) - - -/**************** C++ routines ****************/ - -#ifdef __cplusplus -__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpz_srcptr); -__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpq_srcptr); -__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpf_srcptr); -__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpz_ptr); -__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpq_ptr); -__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpf_ptr); -#endif - - -/* Source-level compatibility with GMP 2 and earlier. */ -#define mpn_divmod(qp,np,nsize,dp,dsize) \ - mpn_divrem (qp, __GMP_CAST (mp_size_t, 0), np, nsize, dp, dsize) - -/* Source-level compatibility with GMP 1. */ -#define mpz_mdiv mpz_fdiv_q -#define mpz_mdivmod mpz_fdiv_qr -#define mpz_mmod mpz_fdiv_r -#define mpz_mdiv_ui mpz_fdiv_q_ui -#define mpz_mdivmod_ui(q,r,n,d) \ - (((r) == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d)) -#define mpz_mmod_ui(r,n,d) \ - (((r) == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d)) - -/* Useful synonyms, but not quite compatible with GMP 1. */ -#define mpz_div mpz_fdiv_q -#define mpz_divmod mpz_fdiv_qr -#define mpz_div_ui mpz_fdiv_q_ui -#define mpz_divmod_ui mpz_fdiv_qr_ui -#define mpz_div_2exp mpz_fdiv_q_2exp -#define mpz_mod_2exp mpz_fdiv_r_2exp - -enum -{ - GMP_ERROR_NONE = 0, - GMP_ERROR_UNSUPPORTED_ARGUMENT = 1, - GMP_ERROR_DIVISION_BY_ZERO = 2, - GMP_ERROR_SQRT_OF_NEGATIVE = 4, - GMP_ERROR_INVALID_ARGUMENT = 8 -}; - -/* Define CC and CFLAGS which were used to build this version of GMP */ -#define __GMP_CC "gcc -std=gnu99" -#define __GMP_CFLAGS "-O2 -pedantic -m64 -mtune=k8 -march=k8" - -/* Major version number is the value of __GNU_MP__ too, above and in mp.h. */ -#define __GNU_MP_VERSION 5 -#define __GNU_MP_VERSION_MINOR 0 -#define __GNU_MP_VERSION_PATCHLEVEL 1 -#define __GMP_MP_RELEASE (__GNU_MP_VERSION * 10000 + __GNU_MP_VERSION_MINOR * 100 + __GNU_MP_VERSION_PATCHLEVEL) - -#define __GMP_H__ -#endif /* __GMP_H__ */ diff --git a/misc/builddeps/dp.linux64/include/jconfig.h b/misc/builddeps/dp.linux64/include/jconfig.h deleted file mode 100644 index 966b1d51..00000000 --- a/misc/builddeps/dp.linux64/include/jconfig.h +++ /dev/null @@ -1,54 +0,0 @@ -/* jconfig.h. Generated from jconfig.cfg by configure. */ -/* jconfig.cfg --- source file edited by configure script */ -/* see jconfig.txt for explanations */ - -#define HAVE_PROTOTYPES 1 -#define HAVE_UNSIGNED_CHAR 1 -#define HAVE_UNSIGNED_SHORT 1 -/* #undef void */ -/* #undef const */ -/* #undef CHAR_IS_UNSIGNED */ -#define HAVE_STDDEF_H 1 -#define HAVE_STDLIB_H 1 -#define HAVE_LOCALE_H 1 -/* #undef NEED_BSD_STRINGS */ -/* #undef NEED_SYS_TYPES_H */ -/* #undef NEED_FAR_POINTERS */ -/* #undef NEED_SHORT_EXTERNAL_NAMES */ -/* Define this if you get warnings about undefined structures. */ -/* #undef INCOMPLETE_TYPES_BROKEN */ - -/* Define "boolean" as unsigned char, not int, on Windows systems. */ -#ifdef _WIN32 -#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ -typedef unsigned char boolean; -#endif -#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ -#endif - -#ifdef JPEG_INTERNALS - -/* #undef RIGHT_SHIFT_IS_UNSIGNED */ -#define INLINE __inline__ -/* These are for configuring the JPEG memory manager. */ -/* #undef DEFAULT_MAX_MEM */ -/* #undef NO_MKTEMP */ - -#endif /* JPEG_INTERNALS */ - -#ifdef JPEG_CJPEG_DJPEG - -#define BMP_SUPPORTED /* BMP image file format */ -#define GIF_SUPPORTED /* GIF image file format */ -#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ -/* #undef RLE_SUPPORTED */ -#define TARGA_SUPPORTED /* Targa image file format */ - -/* #undef TWO_FILE_COMMANDLINE */ -/* #undef NEED_SIGNAL_CATCHER */ -/* #undef DONT_USE_B_MODE */ - -/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ -/* #undef PROGRESS_REPORT */ - -#endif /* JPEG_CJPEG_DJPEG */ diff --git a/misc/builddeps/dp.linux64/include/jerror.h b/misc/builddeps/dp.linux64/include/jerror.h deleted file mode 100644 index 1cfb2b19..00000000 --- a/misc/builddeps/dp.linux64/include/jerror.h +++ /dev/null @@ -1,304 +0,0 @@ -/* - * jerror.h - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * Modified 1997-2009 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the error and message codes for the JPEG library. - * Edit this file to add new codes, or to translate the message strings to - * some other language. - * A set of error-reporting macros are defined too. Some applications using - * the JPEG library may wish to include this file to get the error codes - * and/or the macros. - */ - -/* - * To define the enum list of message codes, include this file without - * defining macro JMESSAGE. To create a message string table, include it - * again with a suitable JMESSAGE definition (see jerror.c for an example). - */ -#ifndef JMESSAGE -#ifndef JERROR_H -/* First time through, define the enum list */ -#define JMAKE_ENUM_LIST -#else -/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ -#define JMESSAGE(code,string) -#endif /* JERROR_H */ -#endif /* JMESSAGE */ - -#ifdef JMAKE_ENUM_LIST - -typedef enum { - -#define JMESSAGE(code,string) code , - -#endif /* JMAKE_ENUM_LIST */ - -JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ - -/* For maintenance convenience, list is alphabetical by message code name */ -JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") -JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") -JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") -JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") -JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request") -JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") -JMESSAGE(JERR_BAD_DCTSIZE, "DCT scaled block size %dx%d not supported") -JMESSAGE(JERR_BAD_DROP_SAMPLING, - "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c") -JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") -JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") -JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") -JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") -JMESSAGE(JERR_BAD_LIB_VERSION, - "Wrong JPEG library version: library is %d, caller expects %d") -JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") -JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") -JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") -JMESSAGE(JERR_BAD_PROGRESSION, - "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") -JMESSAGE(JERR_BAD_PROG_SCRIPT, - "Invalid progressive parameters at scan script entry %d") -JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") -JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") -JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") -JMESSAGE(JERR_BAD_STRUCT_SIZE, - "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") -JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") -JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") -JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") -JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") -JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") -JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") -JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") -JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") -JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") -JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") -JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") -JMESSAGE(JERR_EMS_READ, "Read from EMS failed") -JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") -JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") -JMESSAGE(JERR_FILE_READ, "Input file read error") -JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") -JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") -JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") -JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") -JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") -JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") -JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") -JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, - "Cannot transcode due to multiple use of quantization table %d") -JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") -JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") -JMESSAGE(JERR_NOTIMPL, "Not implemented yet") -JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") -JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined") -JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") -JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") -JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") -JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") -JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") -JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") -JMESSAGE(JERR_QUANT_COMPONENTS, - "Cannot quantize more than %d color components") -JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") -JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") -JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") -JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") -JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") -JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") -JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF") -JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") -JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") -JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") -JMESSAGE(JERR_TFILE_WRITE, - "Write failed on temporary file --- out of disk space?") -JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") -JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") -JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") -JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") -JMESSAGE(JERR_XMS_READ, "Read from XMS failed") -JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") -JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) -JMESSAGE(JMSG_VERSION, JVERSION) -JMESSAGE(JTRC_16BIT_TABLES, - "Caution: quantization tables are too coarse for baseline JPEG") -JMESSAGE(JTRC_ADOBE, - "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") -JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") -JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") -JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") -JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") -JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") -JMESSAGE(JTRC_DRI, "Define Restart Interval %u") -JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") -JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") -JMESSAGE(JTRC_EOI, "End Of Image") -JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") -JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") -JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, - "Warning: thumbnail image size does not match data length %u") -JMESSAGE(JTRC_JFIF_EXTENSION, - "JFIF extension marker: type 0x%02x, length %u") -JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") -JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") -JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") -JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") -JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") -JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") -JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") -JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") -JMESSAGE(JTRC_RST, "RST%d") -JMESSAGE(JTRC_SMOOTH_NOTIMPL, - "Smoothing not supported with nonstandard sampling ratios") -JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") -JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") -JMESSAGE(JTRC_SOI, "Start of Image") -JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") -JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") -JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") -JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") -JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") -JMESSAGE(JTRC_THUMB_JPEG, - "JFIF extension marker: JPEG-compressed thumbnail image, length %u") -JMESSAGE(JTRC_THUMB_PALETTE, - "JFIF extension marker: palette thumbnail image, length %u") -JMESSAGE(JTRC_THUMB_RGB, - "JFIF extension marker: RGB thumbnail image, length %u") -JMESSAGE(JTRC_UNKNOWN_IDS, - "Unrecognized component IDs %d %d %d, assuming YCbCr") -JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") -JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") -JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") -JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code") -JMESSAGE(JWRN_BOGUS_PROGRESSION, - "Inconsistent progression sequence for component %d coefficient %d") -JMESSAGE(JWRN_EXTRANEOUS_DATA, - "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") -JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") -JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") -JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") -JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") -JMESSAGE(JWRN_MUST_RESYNC, - "Corrupt JPEG data: found marker 0x%02x instead of RST%d") -JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") -JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") - -#ifdef JMAKE_ENUM_LIST - - JMSG_LASTMSGCODE -} J_MESSAGE_CODE; - -#undef JMAKE_ENUM_LIST -#endif /* JMAKE_ENUM_LIST */ - -/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ -#undef JMESSAGE - - -#ifndef JERROR_H -#define JERROR_H - -/* Macros to simplify using the error and trace message stuff */ -/* The first parameter is either type of cinfo pointer */ - -/* Fatal errors (print message and exit) */ -#define ERREXIT(cinfo,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT1(cinfo,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT2(cinfo,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT3(cinfo,code,p1,p2,p3) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (cinfo)->err->msg_parm.i[3] = (p4), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (cinfo)->err->msg_parm.i[3] = (p4), \ - (cinfo)->err->msg_parm.i[4] = (p5), \ - (cinfo)->err->msg_parm.i[5] = (p6), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXITS(cinfo,code,str) \ - ((cinfo)->err->msg_code = (code), \ - strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) - -#define MAKESTMT(stuff) do { stuff } while (0) - -/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ -#define WARNMS(cinfo,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) -#define WARNMS1(cinfo,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) -#define WARNMS2(cinfo,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) - -/* Informational/debugging messages */ -#define TRACEMS(cinfo,lvl,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS1(cinfo,lvl,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS2(cinfo,lvl,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - _mp[4] = (p5); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMSS(cinfo,lvl,code,str) \ - ((cinfo)->err->msg_code = (code), \ - strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) - -#endif /* JERROR_H */ diff --git a/misc/builddeps/dp.linux64/include/jmorecfg.h b/misc/builddeps/dp.linux64/include/jmorecfg.h deleted file mode 100644 index 928d052c..00000000 --- a/misc/builddeps/dp.linux64/include/jmorecfg.h +++ /dev/null @@ -1,371 +0,0 @@ -/* - * jmorecfg.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 1997-2009 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains additional configuration options that customize the - * JPEG software for special applications or support machine-dependent - * optimizations. Most users will not need to touch this file. - */ - - -/* - * Define BITS_IN_JSAMPLE as either - * 8 for 8-bit sample values (the usual setting) - * 12 for 12-bit sample values - * Only 8 and 12 are legal data precisions for lossy JPEG according to the - * JPEG standard, and the IJG code does not support anything else! - * We do not support run-time selection of data precision, sorry. - */ - -#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ - - -/* - * Maximum number of components (color channels) allowed in JPEG image. - * To meet the letter of the JPEG spec, set this to 255. However, darn - * few applications need more than 4 channels (maybe 5 for CMYK + alpha - * mask). We recommend 10 as a reasonable compromise; use 4 if you are - * really short on memory. (Each allowed component costs a hundred or so - * bytes of storage, whether actually used in an image or not.) - */ - -#define MAX_COMPONENTS 10 /* maximum number of image components */ - - -/* - * Basic data types. - * You may need to change these if you have a machine with unusual data - * type sizes; for example, "char" not 8 bits, "short" not 16 bits, - * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, - * but it had better be at least 16. - */ - -/* Representation of a single sample (pixel element value). - * We frequently allocate large arrays of these, so it's important to keep - * them small. But if you have memory to burn and access to char or short - * arrays is very slow on your hardware, you might want to change these. - */ - -#if BITS_IN_JSAMPLE == 8 -/* JSAMPLE should be the smallest type that will hold the values 0..255. - * You can use a signed char by having GETJSAMPLE mask it with 0xFF. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JSAMPLE; -#ifdef CHAR_IS_UNSIGNED -#define GETJSAMPLE(value) ((int) (value)) -#else -#define GETJSAMPLE(value) ((int) (value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - -#define MAXJSAMPLE 255 -#define CENTERJSAMPLE 128 - -#endif /* BITS_IN_JSAMPLE == 8 */ - - -#if BITS_IN_JSAMPLE == 12 -/* JSAMPLE should be the smallest type that will hold the values 0..4095. - * On nearly all machines "short" will do nicely. - */ - -typedef short JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#define MAXJSAMPLE 4095 -#define CENTERJSAMPLE 2048 - -#endif /* BITS_IN_JSAMPLE == 12 */ - - -/* Representation of a DCT frequency coefficient. - * This should be a signed value of at least 16 bits; "short" is usually OK. - * Again, we allocate large arrays of these, but you can change to int - * if you have memory to burn and "short" is really slow. - */ - -typedef short JCOEF; - - -/* Compressed datastreams are represented as arrays of JOCTET. - * These must be EXACTLY 8 bits wide, at least once they are written to - * external storage. Note that when using the stdio data source/destination - * managers, this is also the data type passed to fread/fwrite. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JOCTET; -#define GETJOCTET(value) (value) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JOCTET; -#ifdef CHAR_IS_UNSIGNED -#define GETJOCTET(value) (value) -#else -#define GETJOCTET(value) ((value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - - -/* These typedefs are used for various table entries and so forth. - * They must be at least as wide as specified; but making them too big - * won't cost a huge amount of memory, so we don't provide special - * extraction code like we did for JSAMPLE. (In other words, these - * typedefs live at a different point on the speed/space tradeoff curve.) - */ - -/* UINT8 must hold at least the values 0..255. */ - -#ifdef HAVE_UNSIGNED_CHAR -typedef unsigned char UINT8; -#else /* not HAVE_UNSIGNED_CHAR */ -#ifdef CHAR_IS_UNSIGNED -typedef char UINT8; -#else /* not CHAR_IS_UNSIGNED */ -typedef short UINT8; -#endif /* CHAR_IS_UNSIGNED */ -#endif /* HAVE_UNSIGNED_CHAR */ - -/* UINT16 must hold at least the values 0..65535. */ - -#ifdef HAVE_UNSIGNED_SHORT -typedef unsigned short UINT16; -#else /* not HAVE_UNSIGNED_SHORT */ -typedef unsigned int UINT16; -#endif /* HAVE_UNSIGNED_SHORT */ - -/* INT16 must hold at least the values -32768..32767. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ -typedef short INT16; -#endif - -/* INT32 must hold at least signed 32-bit values. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ -#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ -#ifndef _BASETSD_H /* MinGW is slightly different */ -#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ -typedef long INT32; -#endif -#endif -#endif -#endif - -/* Datatype used for image dimensions. The JPEG standard only supports - * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore - * "unsigned int" is sufficient on all machines. However, if you need to - * handle larger images and you don't mind deviating from the spec, you - * can change this datatype. - */ - -typedef unsigned int JDIMENSION; - -#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ - - -/* These macros are used in all function definitions and extern declarations. - * You could modify them if you need to change function linkage conventions; - * in particular, you'll need to do that to make the library a Windows DLL. - * Another application is to make all functions global for use with debuggers - * or code profilers that require it. - */ - -/* a function called through method pointers: */ -#define METHODDEF(type) static type -/* a function used only in its module: */ -#define LOCAL(type) static type -/* a function referenced thru EXTERNs: */ -#define GLOBAL(type) type -/* a reference to a GLOBAL function: */ -#define EXTERN(type) extern type - - -/* This macro is used to declare a "method", that is, a function pointer. - * We want to supply prototype parameters if the compiler can cope. - * Note that the arglist parameter must be parenthesized! - * Again, you can customize this if you need special linkage keywords. - */ - -#ifdef HAVE_PROTOTYPES -#define JMETHOD(type,methodname,arglist) type (*methodname) arglist -#else -#define JMETHOD(type,methodname,arglist) type (*methodname) () -#endif - - -/* Here is the pseudo-keyword for declaring pointers that must be "far" - * on 80x86 machines. Most of the specialized coding for 80x86 is handled - * by just saying "FAR *" where such a pointer is needed. In a few places - * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. - */ - -#ifndef FAR -#ifdef NEED_FAR_POINTERS -#define FAR far -#else -#define FAR -#endif -#endif - - -/* - * On a few systems, type boolean and/or its values FALSE, TRUE may appear - * in standard header files. Or you may have conflicts with application- - * specific header files that you want to include together with these files. - * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. - */ - -#ifndef HAVE_BOOLEAN -typedef int boolean; -#endif -#ifndef FALSE /* in case these macros already exist */ -#define FALSE 0 /* values of boolean */ -#endif -#ifndef TRUE -#define TRUE 1 -#endif - - -/* - * The remaining options affect code selection within the JPEG library, - * but they don't need to be visible to most applications using the library. - * To minimize application namespace pollution, the symbols won't be - * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. - */ - -#ifdef JPEG_INTERNALS -#define JPEG_INTERNAL_OPTIONS -#endif - -#ifdef JPEG_INTERNAL_OPTIONS - - -/* - * These defines indicate whether to include various optional functions. - * Undefining some of these symbols will produce a smaller but less capable - * library. Note that you can leave certain source files out of the - * compilation/linking process if you've #undef'd the corresponding symbols. - * (You may HAVE to do that if your compiler doesn't like null source files.) - */ - -/* Capability options common to encoder and decoder: */ - -#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ -#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ -#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ - -/* Encoder capability options: */ - -#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/ -#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ -/* Note: if you selected 12-bit data precision, it is dangerous to turn off - * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit - * precision, so jchuff.c normally uses entropy optimization to compute - * usable tables for higher precision. If you don't want to do optimization, - * you'll have to supply different default Huffman tables. - * The exact same statements apply for progressive JPEG: the default tables - * don't work for progressive mode. (This may get fixed, however.) - */ -#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ - -/* Decoder capability options: */ - -#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ -#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ -#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ -#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ -#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ -#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ -#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ - -/* more capability options later, no doubt */ - - -/* - * Ordering of RGB data in scanlines passed to or from the application. - * If your application wants to deal with data in the order B,G,R, just - * change these macros. You can also deal with formats such as R,G,B,X - * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing - * the offsets will also change the order in which colormap data is organized. - * RESTRICTIONS: - * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. - * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not - * useful if you are using JPEG color spaces other than YCbCr or grayscale. - * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE - * is not 3 (they don't understand about dummy color components!). So you - * can't use color quantization if you change that value. - */ - -#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ -#define RGB_GREEN 1 /* Offset of Green */ -#define RGB_BLUE 2 /* Offset of Blue */ -#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ - - -/* Definitions for speed-related optimizations. */ - - -/* If your compiler supports inline functions, define INLINE - * as the inline keyword; otherwise define it as empty. - */ - -#ifndef INLINE -#ifdef __GNUC__ /* for instance, GNU C knows about inline */ -#define INLINE __inline__ -#endif -#ifndef INLINE -#define INLINE /* default is to define it as empty */ -#endif -#endif - - -/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying - * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER - * as short on such a machine. MULTIPLIER must be at least 16 bits wide. - */ - -#ifndef MULTIPLIER -#define MULTIPLIER int /* type for fastest integer multiply */ -#endif - - -/* FAST_FLOAT should be either float or double, whichever is done faster - * by your compiler. (Note that this type is only used in the floating point - * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) - * Typically, float is faster in ANSI C compilers, while double is faster in - * pre-ANSI compilers (because they insist on converting to double anyway). - * The code below therefore chooses float if we have ANSI-style prototypes. - */ - -#ifndef FAST_FLOAT -#ifdef HAVE_PROTOTYPES -#define FAST_FLOAT float -#else -#define FAST_FLOAT double -#endif -#endif - -#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/misc/builddeps/dp.linux64/include/jpeglib.h b/misc/builddeps/dp.linux64/include/jpeglib.h deleted file mode 100644 index 5039d4bf..00000000 --- a/misc/builddeps/dp.linux64/include/jpeglib.h +++ /dev/null @@ -1,1158 +0,0 @@ -/* - * jpeglib.h - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * Modified 2002-2009 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the application interface for the JPEG library. - * Most applications using the library need only include this file, - * and perhaps jerror.h if they want to know the exact error codes. - */ - -#ifndef JPEGLIB_H -#define JPEGLIB_H - -/* - * First we include the configuration files that record how this - * installation of the JPEG library is set up. jconfig.h can be - * generated automatically for many systems. jmorecfg.h contains - * manual configuration options that most people need not worry about. - */ - -#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ -#include "jconfig.h" /* widely used configuration options */ -#endif -#include "jmorecfg.h" /* seldom changed options */ - - -#ifdef __cplusplus -#ifndef DONT_USE_EXTERN_C -extern "C" { -#endif -#endif - -/* Version ID for the JPEG library. - * Might be useful for tests like "#if JPEG_LIB_VERSION >= 80". - */ - -#define JPEG_LIB_VERSION 80 /* Version 8.0 */ - - -/* Various constants determining the sizes of things. - * All of these are specified by the JPEG standard, so don't change them - * if you want to be compatible. - */ - -#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ -#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ -#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ -#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ -#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ -#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ -#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ -/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; - * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. - * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU - * to handle it. We even let you do this from the jconfig.h file. However, - * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe - * sometimes emits noncompliant files doesn't mean you should too. - */ -#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ -#ifndef D_MAX_BLOCKS_IN_MCU -#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ -#endif - - -/* Data structures for images (arrays of samples and of DCT coefficients). - * On 80x86 machines, the image arrays are too big for near pointers, - * but the pointer arrays can fit in near memory. - */ - -typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ -typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ -typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ - -typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ -typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ -typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ -typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ - -typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ - - -/* Types for JPEG compression parameters and working tables. */ - - -/* DCT coefficient quantization tables. */ - -typedef struct { - /* This array gives the coefficient quantizers in natural array order - * (not the zigzag order in which they are stored in a JPEG DQT marker). - * CAUTION: IJG versions prior to v6a kept this array in zigzag order. - */ - UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JQUANT_TBL; - - -/* Huffman coding tables. */ - -typedef struct { - /* These two fields directly represent the contents of a JPEG DHT marker */ - UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ - /* length k bits; bits[0] is unused */ - UINT8 huffval[256]; /* The symbols, in order of incr code length */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JHUFF_TBL; - - -/* Basic info about one component (color channel). */ - -typedef struct { - /* These values are fixed over the whole image. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOF marker. */ - int component_id; /* identifier for this component (0..255) */ - int component_index; /* its index in SOF or cinfo->comp_info[] */ - int h_samp_factor; /* horizontal sampling factor (1..4) */ - int v_samp_factor; /* vertical sampling factor (1..4) */ - int quant_tbl_no; /* quantization table selector (0..3) */ - /* These values may vary between scans. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOS marker. */ - /* The decompressor output side may not use these variables. */ - int dc_tbl_no; /* DC entropy table selector (0..3) */ - int ac_tbl_no; /* AC entropy table selector (0..3) */ - - /* Remaining fields should be treated as private by applications. */ - - /* These values are computed during compression or decompression startup: */ - /* Component's size in DCT blocks. - * Any dummy blocks added to complete an MCU are not counted; therefore - * these values do not depend on whether a scan is interleaved or not. - */ - JDIMENSION width_in_blocks; - JDIMENSION height_in_blocks; - /* Size of a DCT block in samples, - * reflecting any scaling we choose to apply during the DCT step. - * Values from 1 to 16 are supported. - * Note that different components may receive different DCT scalings. - */ - int DCT_h_scaled_size; - int DCT_v_scaled_size; - /* The downsampled dimensions are the component's actual, unpadded number - * of samples at the main buffer (preprocessing/compression interface); - * DCT scaling is included, so - * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE) - * and similarly for height. - */ - JDIMENSION downsampled_width; /* actual width in samples */ - JDIMENSION downsampled_height; /* actual height in samples */ - /* This flag is used only for decompression. In cases where some of the - * components will be ignored (eg grayscale output from YCbCr image), - * we can skip most computations for the unused components. - */ - boolean component_needed; /* do we need the value of this component? */ - - /* These values are computed before starting a scan of the component. */ - /* The decompressor output side may not use these variables. */ - int MCU_width; /* number of blocks per MCU, horizontally */ - int MCU_height; /* number of blocks per MCU, vertically */ - int MCU_blocks; /* MCU_width * MCU_height */ - int MCU_sample_width; /* MCU width in samples: MCU_width * DCT_h_scaled_size */ - int last_col_width; /* # of non-dummy blocks across in last MCU */ - int last_row_height; /* # of non-dummy blocks down in last MCU */ - - /* Saved quantization table for component; NULL if none yet saved. - * See jdinput.c comments about the need for this information. - * This field is currently used only for decompression. - */ - JQUANT_TBL * quant_table; - - /* Private per-component storage for DCT or IDCT subsystem. */ - void * dct_table; -} jpeg_component_info; - - -/* The script for encoding a multiple-scan file is an array of these: */ - -typedef struct { - int comps_in_scan; /* number of components encoded in this scan */ - int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ - int Ss, Se; /* progressive JPEG spectral selection parms */ - int Ah, Al; /* progressive JPEG successive approx. parms */ -} jpeg_scan_info; - -/* The decompressor can save APPn and COM markers in a list of these: */ - -typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; - -struct jpeg_marker_struct { - jpeg_saved_marker_ptr next; /* next in list, or NULL */ - UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ - unsigned int original_length; /* # bytes of data in the file */ - unsigned int data_length; /* # bytes of data saved at data[] */ - JOCTET FAR * data; /* the data contained in the marker */ - /* the marker length word is not counted in data_length or original_length */ -}; - -/* Known color spaces. */ - -typedef enum { - JCS_UNKNOWN, /* error/unspecified */ - JCS_GRAYSCALE, /* monochrome */ - JCS_RGB, /* red/green/blue */ - JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ - JCS_CMYK, /* C/M/Y/K */ - JCS_YCCK /* Y/Cb/Cr/K */ -} J_COLOR_SPACE; - -/* DCT/IDCT algorithm options. */ - -typedef enum { - JDCT_ISLOW, /* slow but accurate integer algorithm */ - JDCT_IFAST, /* faster, less accurate integer method */ - JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ -} J_DCT_METHOD; - -#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ -#define JDCT_DEFAULT JDCT_ISLOW -#endif -#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ -#define JDCT_FASTEST JDCT_IFAST -#endif - -/* Dithering options for decompression. */ - -typedef enum { - JDITHER_NONE, /* no dithering */ - JDITHER_ORDERED, /* simple ordered dither */ - JDITHER_FS /* Floyd-Steinberg error diffusion dither */ -} J_DITHER_MODE; - - -/* Common fields between JPEG compression and decompression master structs. */ - -#define jpeg_common_fields \ - struct jpeg_error_mgr * err; /* Error handler module */\ - struct jpeg_memory_mgr * mem; /* Memory manager module */\ - struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ - void * client_data; /* Available for use by application */\ - boolean is_decompressor; /* So common code can tell which is which */\ - int global_state /* For checking call sequence validity */ - -/* Routines that are to be used by both halves of the library are declared - * to receive a pointer to this structure. There are no actual instances of - * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. - */ -struct jpeg_common_struct { - jpeg_common_fields; /* Fields common to both master struct types */ - /* Additional fields follow in an actual jpeg_compress_struct or - * jpeg_decompress_struct. All three structs must agree on these - * initial fields! (This would be a lot cleaner in C++.) - */ -}; - -typedef struct jpeg_common_struct * j_common_ptr; -typedef struct jpeg_compress_struct * j_compress_ptr; -typedef struct jpeg_decompress_struct * j_decompress_ptr; - - -/* Master record for a compression instance */ - -struct jpeg_compress_struct { - jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ - - /* Destination for compressed data */ - struct jpeg_destination_mgr * dest; - - /* Description of source image --- these fields must be filled in by - * outer application before starting compression. in_color_space must - * be correct before you can even call jpeg_set_defaults(). - */ - - JDIMENSION image_width; /* input image width */ - JDIMENSION image_height; /* input image height */ - int input_components; /* # of color components in input image */ - J_COLOR_SPACE in_color_space; /* colorspace of input image */ - - double input_gamma; /* image gamma of input image */ - - /* Compression parameters --- these fields must be set before calling - * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to - * initialize everything to reasonable defaults, then changing anything - * the application specifically wants to change. That way you won't get - * burnt when new parameters are added. Also note that there are several - * helper routines to simplify changing parameters. - */ - - unsigned int scale_num, scale_denom; /* fraction by which to scale image */ - - JDIMENSION jpeg_width; /* scaled JPEG image width */ - JDIMENSION jpeg_height; /* scaled JPEG image height */ - /* Dimensions of actual JPEG image that will be written to file, - * derived from input dimensions by scaling factors above. - * These fields are computed by jpeg_start_compress(). - * You can also use jpeg_calc_jpeg_dimensions() to determine these values - * in advance of calling jpeg_start_compress(). - */ - - int data_precision; /* bits of precision in image data */ - - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - int q_scale_factor[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined, - * and corresponding scale factors (percentage, initialized 100). - */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - int num_scans; /* # of entries in scan_info array */ - const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ - /* The default value of scan_info is NULL, which causes a single-scan - * sequential JPEG file to be emitted. To create a multi-scan file, - * set num_scans and scan_info to point to an array of scan definitions. - */ - - boolean raw_data_in; /* TRUE=caller supplies downsampled data */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - boolean do_fancy_downsampling; /* TRUE=apply fancy downsampling */ - int smoothing_factor; /* 1..100, or 0 for no input smoothing */ - J_DCT_METHOD dct_method; /* DCT algorithm selector */ - - /* The restart interval can be specified in absolute MCUs by setting - * restart_interval, or in MCU rows by setting restart_in_rows - * (in which case the correct restart_interval will be figured - * for each scan). - */ - unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ - int restart_in_rows; /* if > 0, MCU rows per restart interval */ - - /* Parameters controlling emission of special markers. */ - - boolean write_JFIF_header; /* should a JFIF marker be written? */ - UINT8 JFIF_major_version; /* What to write for the JFIF version number */ - UINT8 JFIF_minor_version; - /* These three values are not used by the JPEG code, merely copied */ - /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ - /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ - /* ratio is defined by X_density/Y_density even when density_unit=0. */ - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean write_Adobe_marker; /* should an Adobe marker be written? */ - - /* State variable: index of next scanline to be written to - * jpeg_write_scanlines(). Application may use this to control its - * processing loop, e.g., "while (next_scanline < image_height)". - */ - - JDIMENSION next_scanline; /* 0 .. image_height-1 */ - - /* Remaining fields are known throughout compressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during compression startup - */ - boolean progressive_mode; /* TRUE if scan script uses progressive mode */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ - int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ - /* The coefficient controller receives data in units of MCU rows as defined - * for fully interleaved scans (whether the JPEG file is interleaved or not). - * There are v_samp_factor * DCTSIZE sample rows of each component in an - * "iMCU" (interleaved MCU) row. - */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[C_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - int block_size; /* the basic DCT block size: 1..16 */ - const int * natural_order; /* natural-order position array */ - int lim_Se; /* min( Se, DCTSIZE2-1 ) */ - - /* - * Links to compression subobjects (methods and private variables of modules) - */ - struct jpeg_comp_master * master; - struct jpeg_c_main_controller * main; - struct jpeg_c_prep_controller * prep; - struct jpeg_c_coef_controller * coef; - struct jpeg_marker_writer * marker; - struct jpeg_color_converter * cconvert; - struct jpeg_downsampler * downsample; - struct jpeg_forward_dct * fdct; - struct jpeg_entropy_encoder * entropy; - jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ - int script_space_size; -}; - - -/* Master record for a decompression instance */ - -struct jpeg_decompress_struct { - jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ - - /* Source of compressed data */ - struct jpeg_source_mgr * src; - - /* Basic description of image --- filled in by jpeg_read_header(). */ - /* Application may inspect these values to decide how to process image. */ - - JDIMENSION image_width; /* nominal image width (from SOF marker) */ - JDIMENSION image_height; /* nominal image height */ - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - /* Decompression processing parameters --- these fields must be set before - * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes - * them to default values. - */ - - J_COLOR_SPACE out_color_space; /* colorspace for output */ - - unsigned int scale_num, scale_denom; /* fraction by which to scale image */ - - double output_gamma; /* image gamma wanted in output */ - - boolean buffered_image; /* TRUE=multiple output passes */ - boolean raw_data_out; /* TRUE=downsampled data wanted */ - - J_DCT_METHOD dct_method; /* IDCT algorithm selector */ - boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ - boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ - - boolean quantize_colors; /* TRUE=colormapped output wanted */ - /* the following are ignored if not quantize_colors: */ - J_DITHER_MODE dither_mode; /* type of color dithering to use */ - boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ - int desired_number_of_colors; /* max # colors to use in created colormap */ - /* these are significant only in buffered-image mode: */ - boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ - boolean enable_external_quant;/* enable future use of external colormap */ - boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ - - /* Description of actual output image that will be returned to application. - * These fields are computed by jpeg_start_decompress(). - * You can also use jpeg_calc_output_dimensions() to determine these values - * in advance of calling jpeg_start_decompress(). - */ - - JDIMENSION output_width; /* scaled image width */ - JDIMENSION output_height; /* scaled image height */ - int out_color_components; /* # of color components in out_color_space */ - int output_components; /* # of color components returned */ - /* output_components is 1 (a colormap index) when quantizing colors; - * otherwise it equals out_color_components. - */ - int rec_outbuf_height; /* min recommended height of scanline buffer */ - /* If the buffer passed to jpeg_read_scanlines() is less than this many rows - * high, space and time will be wasted due to unnecessary data copying. - * Usually rec_outbuf_height will be 1 or 2, at most 4. - */ - - /* When quantizing colors, the output colormap is described by these fields. - * The application can supply a colormap by setting colormap non-NULL before - * calling jpeg_start_decompress; otherwise a colormap is created during - * jpeg_start_decompress or jpeg_start_output. - * The map has out_color_components rows and actual_number_of_colors columns. - */ - int actual_number_of_colors; /* number of entries in use */ - JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ - - /* State variables: these variables indicate the progress of decompression. - * The application may examine these but must not modify them. - */ - - /* Row index of next scanline to be read from jpeg_read_scanlines(). - * Application may use this to control its processing loop, e.g., - * "while (output_scanline < output_height)". - */ - JDIMENSION output_scanline; /* 0 .. output_height-1 */ - - /* Current input scan number and number of iMCU rows completed in scan. - * These indicate the progress of the decompressor input side. - */ - int input_scan_number; /* Number of SOS markers seen so far */ - JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ - - /* The "output scan number" is the notional scan being displayed by the - * output side. The decompressor will not allow output scan/row number - * to get ahead of input scan/row, but it can fall arbitrarily far behind. - */ - int output_scan_number; /* Nominal scan number being displayed */ - JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ - - /* Current progression status. coef_bits[c][i] indicates the precision - * with which component c's DCT coefficient i (in zigzag order) is known. - * It is -1 when no data has yet been received, otherwise it is the point - * transform (shift) value for the most recent scan of the coefficient - * (thus, 0 at completion of the progression). - * This pointer is NULL when reading a non-progressive file. - */ - int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ - - /* Internal JPEG parameters --- the application usually need not look at - * these fields. Note that the decompressor output side may not use - * any parameters that can change between scans. - */ - - /* Quantization and Huffman tables are carried forward across input - * datastreams when processing abbreviated JPEG datastreams. - */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - /* These parameters are never carried across datastreams, since they - * are given in SOF/SOS markers or defined to be reset by SOI. - */ - - int data_precision; /* bits of precision in image data */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - boolean is_baseline; /* TRUE if Baseline SOF0 encountered */ - boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ - - /* These fields record data obtained from optional markers recognized by - * the JPEG library. - */ - boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ - /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ - UINT8 JFIF_major_version; /* JFIF version number */ - UINT8 JFIF_minor_version; - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ - UINT8 Adobe_transform; /* Color transform code from Adobe marker */ - - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - - /* Aside from the specific data retained from APPn markers known to the - * library, the uninterpreted contents of any or all APPn and COM markers - * can be saved in a list for examination by the application. - */ - jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ - - /* Remaining fields are known throughout decompressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during decompression startup - */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ - int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ - /* The coefficient controller's input and output progress is measured in - * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows - * in fully interleaved JPEG scans, but are used whether the scan is - * interleaved or not. We define an iMCU row as v_samp_factor DCT block - * rows of each component. Therefore, the IDCT output contains - * v_samp_factor*DCT_v_scaled_size sample rows of a component per iMCU row. - */ - - JSAMPLE * sample_range_limit; /* table for fast range-limiting */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - * Note that the decompressor output side must not use these fields. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[D_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - /* These fields are derived from Se of first SOS marker. - */ - int block_size; /* the basic DCT block size: 1..16 */ - const int * natural_order; /* natural-order position array for entropy decode */ - int lim_Se; /* min( Se, DCTSIZE2-1 ) for entropy decode */ - - /* This field is shared between entropy decoder and marker parser. - * It is either zero or the code of a JPEG marker that has been - * read from the data source, but has not yet been processed. - */ - int unread_marker; - - /* - * Links to decompression subobjects (methods, private variables of modules) - */ - struct jpeg_decomp_master * master; - struct jpeg_d_main_controller * main; - struct jpeg_d_coef_controller * coef; - struct jpeg_d_post_controller * post; - struct jpeg_input_controller * inputctl; - struct jpeg_marker_reader * marker; - struct jpeg_entropy_decoder * entropy; - struct jpeg_inverse_dct * idct; - struct jpeg_upsampler * upsample; - struct jpeg_color_deconverter * cconvert; - struct jpeg_color_quantizer * cquantize; -}; - - -/* "Object" declarations for JPEG modules that may be supplied or called - * directly by the surrounding application. - * As with all objects in the JPEG library, these structs only define the - * publicly visible methods and state variables of a module. Additional - * private fields may exist after the public ones. - */ - - -/* Error handler object */ - -struct jpeg_error_mgr { - /* Error exit handler: does not return to caller */ - JMETHOD(void, error_exit, (j_common_ptr cinfo)); - /* Conditionally emit a trace or warning message */ - JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); - /* Routine that actually outputs a trace or error message */ - JMETHOD(void, output_message, (j_common_ptr cinfo)); - /* Format a message string for the most recent JPEG error or message */ - JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); -#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ - /* Reset error state variables at start of a new image */ - JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); - - /* The message ID code and any parameters are saved here. - * A message can have one string parameter or up to 8 int parameters. - */ - int msg_code; -#define JMSG_STR_PARM_MAX 80 - union { - int i[8]; - char s[JMSG_STR_PARM_MAX]; - } msg_parm; - - /* Standard state variables for error facility */ - - int trace_level; /* max msg_level that will be displayed */ - - /* For recoverable corrupt-data errors, we emit a warning message, - * but keep going unless emit_message chooses to abort. emit_message - * should count warnings in num_warnings. The surrounding application - * can check for bad data by seeing if num_warnings is nonzero at the - * end of processing. - */ - long num_warnings; /* number of corrupt-data warnings */ - - /* These fields point to the table(s) of error message strings. - * An application can change the table pointer to switch to a different - * message list (typically, to change the language in which errors are - * reported). Some applications may wish to add additional error codes - * that will be handled by the JPEG library error mechanism; the second - * table pointer is used for this purpose. - * - * First table includes all errors generated by JPEG library itself. - * Error code 0 is reserved for a "no such error string" message. - */ - const char * const * jpeg_message_table; /* Library errors */ - int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ - /* Second table can be added by application (see cjpeg/djpeg for example). - * It contains strings numbered first_addon_message..last_addon_message. - */ - const char * const * addon_message_table; /* Non-library errors */ - int first_addon_message; /* code for first string in addon table */ - int last_addon_message; /* code for last string in addon table */ -}; - - -/* Progress monitor object */ - -struct jpeg_progress_mgr { - JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); - - long pass_counter; /* work units completed in this pass */ - long pass_limit; /* total number of work units in this pass */ - int completed_passes; /* passes completed so far */ - int total_passes; /* total number of passes expected */ -}; - - -/* Data destination object for compression */ - -struct jpeg_destination_mgr { - JOCTET * next_output_byte; /* => next byte to write in buffer */ - size_t free_in_buffer; /* # of byte spaces remaining in buffer */ - - JMETHOD(void, init_destination, (j_compress_ptr cinfo)); - JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); - JMETHOD(void, term_destination, (j_compress_ptr cinfo)); -}; - - -/* Data source object for decompression */ - -struct jpeg_source_mgr { - const JOCTET * next_input_byte; /* => next byte to read from buffer */ - size_t bytes_in_buffer; /* # of bytes remaining in buffer */ - - JMETHOD(void, init_source, (j_decompress_ptr cinfo)); - JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); - JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); - JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); - JMETHOD(void, term_source, (j_decompress_ptr cinfo)); -}; - - -/* Memory manager object. - * Allocates "small" objects (a few K total), "large" objects (tens of K), - * and "really big" objects (virtual arrays with backing store if needed). - * The memory manager does not allow individual objects to be freed; rather, - * each created object is assigned to a pool, and whole pools can be freed - * at once. This is faster and more convenient than remembering exactly what - * to free, especially where malloc()/free() are not too speedy. - * NB: alloc routines never return NULL. They exit to error_exit if not - * successful. - */ - -#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ -#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ -#define JPOOL_NUMPOOLS 2 - -typedef struct jvirt_sarray_control * jvirt_sarray_ptr; -typedef struct jvirt_barray_control * jvirt_barray_ptr; - - -struct jpeg_memory_mgr { - /* Method pointers */ - JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, - JDIMENSION samplesperrow, - JDIMENSION numrows)); - JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, - JDIMENSION blocksperrow, - JDIMENSION numrows)); - JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION samplesperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION blocksperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); - JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, - jvirt_sarray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, - jvirt_barray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); - JMETHOD(void, self_destruct, (j_common_ptr cinfo)); - - /* Limit on memory allocation for this JPEG object. (Note that this is - * merely advisory, not a guaranteed maximum; it only affects the space - * used for virtual-array buffers.) May be changed by outer application - * after creating the JPEG object. - */ - long max_memory_to_use; - - /* Maximum allocation request accepted by alloc_large. */ - long max_alloc_chunk; -}; - - -/* Routine signature for application-supplied marker processing methods. - * Need not pass marker code since it is stored in cinfo->unread_marker. - */ -typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); - - -/* Declarations for routines called by application. - * The JPP macro hides prototype parameters from compilers that can't cope. - * Note JPP requires double parentheses. - */ - -#ifdef HAVE_PROTOTYPES -#define JPP(arglist) arglist -#else -#define JPP(arglist) () -#endif - - -/* Short forms of external names for systems with brain-damaged linkers. - * We shorten external names to be unique in the first six letters, which - * is good enough for all known systems. - * (If your compiler itself needs names to be unique in less than 15 - * characters, you are out of luck. Get a better compiler.) - */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_std_error jStdError -#define jpeg_CreateCompress jCreaCompress -#define jpeg_CreateDecompress jCreaDecompress -#define jpeg_destroy_compress jDestCompress -#define jpeg_destroy_decompress jDestDecompress -#define jpeg_stdio_dest jStdDest -#define jpeg_stdio_src jStdSrc -#define jpeg_mem_dest jMemDest -#define jpeg_mem_src jMemSrc -#define jpeg_set_defaults jSetDefaults -#define jpeg_set_colorspace jSetColorspace -#define jpeg_default_colorspace jDefColorspace -#define jpeg_set_quality jSetQuality -#define jpeg_set_linear_quality jSetLQuality -#define jpeg_default_qtables jDefQTables -#define jpeg_add_quant_table jAddQuantTable -#define jpeg_quality_scaling jQualityScaling -#define jpeg_simple_progression jSimProgress -#define jpeg_suppress_tables jSuppressTables -#define jpeg_alloc_quant_table jAlcQTable -#define jpeg_alloc_huff_table jAlcHTable -#define jpeg_start_compress jStrtCompress -#define jpeg_write_scanlines jWrtScanlines -#define jpeg_finish_compress jFinCompress -#define jpeg_calc_jpeg_dimensions jCjpegDimensions -#define jpeg_write_raw_data jWrtRawData -#define jpeg_write_marker jWrtMarker -#define jpeg_write_m_header jWrtMHeader -#define jpeg_write_m_byte jWrtMByte -#define jpeg_write_tables jWrtTables -#define jpeg_read_header jReadHeader -#define jpeg_start_decompress jStrtDecompress -#define jpeg_read_scanlines jReadScanlines -#define jpeg_finish_decompress jFinDecompress -#define jpeg_read_raw_data jReadRawData -#define jpeg_has_multiple_scans jHasMultScn -#define jpeg_start_output jStrtOutput -#define jpeg_finish_output jFinOutput -#define jpeg_input_complete jInComplete -#define jpeg_new_colormap jNewCMap -#define jpeg_consume_input jConsumeInput -#define jpeg_core_output_dimensions jCoreDimensions -#define jpeg_calc_output_dimensions jCalcDimensions -#define jpeg_save_markers jSaveMarkers -#define jpeg_set_marker_processor jSetMarker -#define jpeg_read_coefficients jReadCoefs -#define jpeg_write_coefficients jWrtCoefs -#define jpeg_copy_critical_parameters jCopyCrit -#define jpeg_abort_compress jAbrtCompress -#define jpeg_abort_decompress jAbrtDecompress -#define jpeg_abort jAbort -#define jpeg_destroy jDestroy -#define jpeg_resync_to_restart jResyncRestart -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Default error-management setup */ -EXTERN(struct jpeg_error_mgr *) jpeg_std_error - JPP((struct jpeg_error_mgr * err)); - -/* Initialization of JPEG compression objects. - * jpeg_create_compress() and jpeg_create_decompress() are the exported - * names that applications should call. These expand to calls on - * jpeg_CreateCompress and jpeg_CreateDecompress with additional information - * passed for version mismatch checking. - * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. - */ -#define jpeg_create_compress(cinfo) \ - jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_compress_struct)) -#define jpeg_create_decompress(cinfo) \ - jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_decompress_struct)) -EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, - int version, size_t structsize)); -EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, - int version, size_t structsize)); -/* Destruction of JPEG compression objects */ -EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); - -/* Standard data source and destination managers: stdio streams. */ -/* Caller is responsible for opening the file before and closing after. */ -EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); -EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); - -/* Data source and destination managers: memory buffers. */ -EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, - unsigned char ** outbuffer, - unsigned long * outsize)); -EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo, - unsigned char * inbuffer, - unsigned long insize)); - -/* Default parameter setup for compression */ -EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); -/* Compression parameter setup aids */ -EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, - J_COLOR_SPACE colorspace)); -EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, - boolean force_baseline)); -EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, - int scale_factor, - boolean force_baseline)); -EXTERN(void) jpeg_default_qtables JPP((j_compress_ptr cinfo, - boolean force_baseline)); -EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, - const unsigned int *basic_table, - int scale_factor, - boolean force_baseline)); -EXTERN(int) jpeg_quality_scaling JPP((int quality)); -EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, - boolean suppress)); -EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); -EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); - -/* Main entry points for compression */ -EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, - boolean write_all_tables)); -EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION num_lines)); -EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); - -/* Precalculate JPEG dimensions for current compression parameters. */ -EXTERN(void) jpeg_calc_jpeg_dimensions JPP((j_compress_ptr cinfo)); - -/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION num_lines)); - -/* Write a special marker. See libjpeg.txt concerning safe usage. */ -EXTERN(void) jpeg_write_marker - JPP((j_compress_ptr cinfo, int marker, - const JOCTET * dataptr, unsigned int datalen)); -/* Same, but piecemeal. */ -EXTERN(void) jpeg_write_m_header - JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); -EXTERN(void) jpeg_write_m_byte - JPP((j_compress_ptr cinfo, int val)); - -/* Alternate compression function: just write an abbreviated table file */ -EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); - -/* Decompression startup: read start of JPEG datastream to see what's there */ -EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, - boolean require_image)); -/* Return value is one of: */ -#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ -#define JPEG_HEADER_OK 1 /* Found valid image datastream */ -#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ -/* If you pass require_image = TRUE (normal case), you need not check for - * a TABLES_ONLY return code; an abbreviated file will cause an error exit. - * JPEG_SUSPENDED is only possible if you use a data source module that can - * give a suspension return (the stdio source module doesn't). - */ - -/* Main entry points for decompression */ -EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); -EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION max_lines)); -EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); - -/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION max_lines)); - -/* Additional entry points for buffered-image mode. */ -EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, - int scan_number)); -EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); -EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); -/* Return value is one of: */ -/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ -#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ -#define JPEG_REACHED_EOI 2 /* Reached end of image */ -#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ -#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ - -/* Precalculate output dimensions for current decompression parameters. */ -EXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); - -/* Control saving of COM and APPn markers into marker_list. */ -EXTERN(void) jpeg_save_markers - JPP((j_decompress_ptr cinfo, int marker_code, - unsigned int length_limit)); - -/* Install a special processing method for COM or APPn markers. */ -EXTERN(void) jpeg_set_marker_processor - JPP((j_decompress_ptr cinfo, int marker_code, - jpeg_marker_parser_method routine)); - -/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ -EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, - jvirt_barray_ptr * coef_arrays)); -EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, - j_compress_ptr dstinfo)); - -/* If you choose to abort compression or decompression before completing - * jpeg_finish_(de)compress, then you need to clean up to release memory, - * temporary files, etc. You can just call jpeg_destroy_(de)compress - * if you're done with the JPEG object, but if you want to clean it up and - * reuse it, call this: - */ -EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); - -/* Generic versions of jpeg_abort and jpeg_destroy that work on either - * flavor of JPEG object. These may be more convenient in some places. - */ -EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); -EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); - -/* Default restart-marker-resync procedure for use by data source modules */ -EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, - int desired)); - - -/* These marker codes are exported since applications and data source modules - * are likely to want to use them. - */ - -#define JPEG_RST0 0xD0 /* RST0 marker code */ -#define JPEG_EOI 0xD9 /* EOI marker code */ -#define JPEG_APP0 0xE0 /* APP0 marker code */ -#define JPEG_COM 0xFE /* COM marker code */ - - -/* If we have a brain-damaged compiler that emits warnings (or worse, errors) - * for structure definitions that are never filled in, keep it quiet by - * supplying dummy definitions for the various substructures. - */ - -#ifdef INCOMPLETE_TYPES_BROKEN -#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ -struct jvirt_sarray_control { long dummy; }; -struct jvirt_barray_control { long dummy; }; -struct jpeg_comp_master { long dummy; }; -struct jpeg_c_main_controller { long dummy; }; -struct jpeg_c_prep_controller { long dummy; }; -struct jpeg_c_coef_controller { long dummy; }; -struct jpeg_marker_writer { long dummy; }; -struct jpeg_color_converter { long dummy; }; -struct jpeg_downsampler { long dummy; }; -struct jpeg_forward_dct { long dummy; }; -struct jpeg_entropy_encoder { long dummy; }; -struct jpeg_decomp_master { long dummy; }; -struct jpeg_d_main_controller { long dummy; }; -struct jpeg_d_coef_controller { long dummy; }; -struct jpeg_d_post_controller { long dummy; }; -struct jpeg_input_controller { long dummy; }; -struct jpeg_marker_reader { long dummy; }; -struct jpeg_entropy_decoder { long dummy; }; -struct jpeg_inverse_dct { long dummy; }; -struct jpeg_upsampler { long dummy; }; -struct jpeg_color_deconverter { long dummy; }; -struct jpeg_color_quantizer { long dummy; }; -#endif /* JPEG_INTERNALS */ -#endif /* INCOMPLETE_TYPES_BROKEN */ - - -/* - * The JPEG library modules define JPEG_INTERNALS before including this file. - * The internal structure declarations are read only when that is true. - * Applications using the library should not include jpegint.h, but may wish - * to include jerror.h. - */ - -#ifdef JPEG_INTERNALS -#include "jpegint.h" /* fetch private declarations */ -#include "jerror.h" /* fetch error codes too */ -#endif - -#ifdef __cplusplus -#ifndef DONT_USE_EXTERN_C -} -#endif -#endif - -#endif /* JPEGLIB_H */ diff --git a/misc/builddeps/dp.linux64/include/ode/collision.h b/misc/builddeps/dp.linux64/include/ode/collision.h deleted file mode 100644 index e89726cb..00000000 --- a/misc/builddeps/dp.linux64/include/ode/collision.h +++ /dev/null @@ -1,1523 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COLLISION_H_ -#define _ODE_COLLISION_H_ - -#include -#include -#include -// Include odeinit.h for backward compatibility as some of initialization APIs -// were initally declared in current header. -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup collide Collision Detection - * - * ODE has two main components: a dynamics simulation engine and a collision - * detection engine. The collision engine is given information about the - * shape of each body. At each time step it figures out which bodies touch - * each other and passes the resulting contact point information to the user. - * The user in turn creates contact joints between bodies. - * - * Using ODE's collision detection is optional - an alternative collision - * detection system can be used as long as it can supply the right kinds of - * contact information. - */ - - -/* ************************************************************************ */ -/* general functions */ - -/** - * @brief Destroy a geom, removing it from any space. - * - * Destroy a geom, removing it from any space it is in first. This one - * function destroys a geom of any type, but to create a geom you must call - * a creation function for that type. - * - * When a space is destroyed, if its cleanup mode is 1 (the default) then all - * the geoms in that space are automatically destroyed as well. - * - * @param geom the geom to be destroyed. - * @ingroup collide - */ -ODE_API void dGeomDestroy (dGeomID geom); - - -/** - * @brief Set the user-defined data pointer stored in the geom. - * - * @param geom the geom to hold the data - * @param data the data pointer to be stored - * @ingroup collide - */ -ODE_API void dGeomSetData (dGeomID geom, void* data); - - -/** - * @brief Get the user-defined data pointer stored in the geom. - * - * @param geom the geom containing the data - * @ingroup collide - */ -ODE_API void *dGeomGetData (dGeomID geom); - - -/** - * @brief Set the body associated with a placeable geom. - * - * Setting a body on a geom automatically combines the position vector and - * rotation matrix of the body and geom, so that setting the position or - * orientation of one will set the value for both objects. Setting a body - * ID of zero gives the geom its own position and rotation, independent - * from any body. If the geom was previously connected to a body then its - * new independent position/rotation is set to the current position/rotation - * of the body. - * - * Calling these functions on a non-placeable geom results in a runtime - * error in the debug build of ODE. - * - * @param geom the geom to connect - * @param body the body to attach to the geom - * @ingroup collide - */ -ODE_API void dGeomSetBody (dGeomID geom, dBodyID body); - - -/** - * @brief Get the body associated with a placeable geom. - * @param geom the geom to query. - * @sa dGeomSetBody - * @ingroup collide - */ -ODE_API dBodyID dGeomGetBody (dGeomID geom); - - -/** - * @brief Set the position vector of a placeable geom. - * - * If the geom is attached to a body, the body's position will also be changed. - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to set. - * @param x the new X coordinate. - * @param y the new Y coordinate. - * @param z the new Z coordinate. - * @sa dBodySetPosition - * @ingroup collide - */ -ODE_API void dGeomSetPosition (dGeomID geom, dReal x, dReal y, dReal z); - - -/** - * @brief Set the rotation matrix of a placeable geom. - * - * If the geom is attached to a body, the body's rotation will also be changed. - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to set. - * @param R the new rotation matrix. - * @sa dBodySetRotation - * @ingroup collide - */ -ODE_API void dGeomSetRotation (dGeomID geom, const dMatrix3 R); - - -/** - * @brief Set the rotation of a placeable geom. - * - * If the geom is attached to a body, the body's rotation will also be changed. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to set. - * @param Q the new rotation. - * @sa dBodySetQuaternion - * @ingroup collide - */ -ODE_API void dGeomSetQuaternion (dGeomID geom, const dQuaternion Q); - - -/** - * @brief Get the position vector of a placeable geom. - * - * If the geom is attached to a body, the body's position will be returned. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to query. - * @returns A pointer to the geom's position vector. - * @remarks The returned value is a pointer to the geom's internal - * data structure. It is valid until any changes are made - * to the geom. - * @sa dBodyGetPosition - * @ingroup collide - */ -ODE_API const dReal * dGeomGetPosition (dGeomID geom); - - -/** - * @brief Copy the position of a geom into a vector. - * @ingroup collide - * @param geom the geom to query - * @param pos a copy of the geom position - * @sa dGeomGetPosition - */ -ODE_API void dGeomCopyPosition (dGeomID geom, dVector3 pos); - - -/** - * @brief Get the rotation matrix of a placeable geom. - * - * If the geom is attached to a body, the body's rotation will be returned. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to query. - * @returns A pointer to the geom's rotation matrix. - * @remarks The returned value is a pointer to the geom's internal - * data structure. It is valid until any changes are made - * to the geom. - * @sa dBodyGetRotation - * @ingroup collide - */ -ODE_API const dReal * dGeomGetRotation (dGeomID geom); - - -/** - * @brief Get the rotation matrix of a placeable geom. - * - * If the geom is attached to a body, the body's rotation will be returned. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to query. - * @param R a copy of the geom rotation - * @sa dGeomGetRotation - * @ingroup collide - */ -ODE_API void dGeomCopyRotation(dGeomID geom, dMatrix3 R); - - -/** - * @brief Get the rotation quaternion of a placeable geom. - * - * If the geom is attached to a body, the body's quaternion will be returned. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to query. - * @param result a copy of the rotation quaternion. - * @sa dBodyGetQuaternion - * @ingroup collide - */ -ODE_API void dGeomGetQuaternion (dGeomID geom, dQuaternion result); - - -/** - * @brief Return the axis-aligned bounding box. - * - * Return in aabb an axis aligned bounding box that surrounds the given geom. - * The aabb array has elements (minx, maxx, miny, maxy, minz, maxz). If the - * geom is a space, a bounding box that surrounds all contained geoms is - * returned. - * - * This function may return a pre-computed cached bounding box, if it can - * determine that the geom has not moved since the last time the bounding - * box was computed. - * - * @param geom the geom to query - * @param aabb the returned bounding box - * @ingroup collide - */ -ODE_API void dGeomGetAABB (dGeomID geom, dReal aabb[6]); - - -/** - * @brief Determing if a geom is a space. - * @param geom the geom to query - * @returns Non-zero if the geom is a space, zero otherwise. - * @ingroup collide - */ -ODE_API int dGeomIsSpace (dGeomID geom); - - -/** - * @brief Query for the space containing a particular geom. - * @param geom the geom to query - * @returns The space that contains the geom, or NULL if the geom is - * not contained by a space. - * @ingroup collide - */ -ODE_API dSpaceID dGeomGetSpace (dGeomID); - - -/** - * @brief Given a geom, this returns its class. - * - * The ODE classes are: - * @li dSphereClass - * @li dBoxClass - * @li dCylinderClass - * @li dPlaneClass - * @li dRayClass - * @li dConvexClass - * @li dGeomTransformClass - * @li dTriMeshClass - * @li dSimpleSpaceClass - * @li dHashSpaceClass - * @li dQuadTreeSpaceClass - * @li dFirstUserClass - * @li dLastUserClass - * - * User-defined class will return their own number. - * - * @param geom the geom to query - * @returns The geom class ID. - * @ingroup collide - */ -ODE_API int dGeomGetClass (dGeomID geom); - - -/** - * @brief Set the "category" bitfield for the given geom. - * - * The category bitfield is used by spaces to govern which geoms will - * interact with each other. The bitfield is guaranteed to be at least - * 32 bits wide. The default category values for newly created geoms - * have all bits set. - * - * @param geom the geom to set - * @param bits the new bitfield value - * @ingroup collide - */ -ODE_API void dGeomSetCategoryBits (dGeomID geom, unsigned long bits); - - -/** - * @brief Set the "collide" bitfield for the given geom. - * - * The collide bitfield is used by spaces to govern which geoms will - * interact with each other. The bitfield is guaranteed to be at least - * 32 bits wide. The default category values for newly created geoms - * have all bits set. - * - * @param geom the geom to set - * @param bits the new bitfield value - * @ingroup collide - */ -ODE_API void dGeomSetCollideBits (dGeomID geom, unsigned long bits); - - -/** - * @brief Get the "category" bitfield for the given geom. - * - * @param geom the geom to set - * @param bits the new bitfield value - * @sa dGeomSetCategoryBits - * @ingroup collide - */ -ODE_API unsigned long dGeomGetCategoryBits (dGeomID); - - -/** - * @brief Get the "collide" bitfield for the given geom. - * - * @param geom the geom to set - * @param bits the new bitfield value - * @sa dGeomSetCollideBits - * @ingroup collide - */ -ODE_API unsigned long dGeomGetCollideBits (dGeomID); - - -/** - * @brief Enable a geom. - * - * Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2, - * although they can still be members of a space. New geoms are created in - * the enabled state. - * - * @param geom the geom to enable - * @sa dGeomDisable - * @sa dGeomIsEnabled - * @ingroup collide - */ -ODE_API void dGeomEnable (dGeomID geom); - - -/** - * @brief Disable a geom. - * - * Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2, - * although they can still be members of a space. New geoms are created in - * the enabled state. - * - * @param geom the geom to disable - * @sa dGeomDisable - * @sa dGeomIsEnabled - * @ingroup collide - */ -ODE_API void dGeomDisable (dGeomID geom); - - -/** - * @brief Check to see if a geom is enabled. - * - * Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2, - * although they can still be members of a space. New geoms are created in - * the enabled state. - * - * @param geom the geom to query - * @returns Non-zero if the geom is enabled, zero otherwise. - * @sa dGeomDisable - * @sa dGeomIsEnabled - * @ingroup collide - */ -ODE_API int dGeomIsEnabled (dGeomID geom); - - -enum -{ - dGeomCommonControlClass = 0, - dGeomColliderControlClass = 1 -}; - -enum -{ - dGeomCommonAnyControlCode = 0, - - dGeomColliderSetMergeSphereContactsControlCode = 1, - dGeomColliderGetMergeSphereContactsControlCode = 2 -}; - -enum -{ - dGeomColliderMergeContactsValue__Default = 0, // Used with Set... to restore default value - dGeomColliderMergeContactsValue_None = 1, - dGeomColliderMergeContactsValue_Normals = 2, - dGeomColliderMergeContactsValue_Full = 3 -}; - -/** - * @brief Execute low level control operation for geometry. - * - * The variable the dataSize points to must be initialized before the call. - * If the size does not match the one expected for the control class/code function - * changes it to the size expected and returns failure. This implies the function - * can be called with NULL data and zero size to test if control class/code is supported - * and obtain required data size for it. - * - * dGeomCommonAnyControlCode applies to any control class and returns success if - * at least one control code is available for the given class with given geom. - * - * Currently there are the folliwing control classes supported: - * @li dGeomColliderControlClass - * - * For dGeomColliderControlClass there are the following codes available: - * @li dGeomColliderSetMergeSphereContactsControlCode (arg of type int, dGeomColliderMergeContactsValue_*) - * @li dGeomColliderGetMergeSphereContactsControlCode (arg of type int, dGeomColliderMergeContactsValue_*) - * - * @param geom the geom to control - * @param controlClass the control class - * @param controlCode the control code for the class - * @param dataValue the control argument pointer - * @param dataSize the control argument size provided or expected - * @returns Boolean execution status - * @ingroup collide - */ -ODE_API int dGeomLowLevelControl (dGeomID geom, int controlClass, int controlCode, void *dataValue, int *dataSize); - - -/** - * @brief Get world position of a relative point on geom. - * - * Calling this function on a non-placeable geom results in the same point being - * returned. - * - * @ingroup collide - * @param result will contain the result. - */ -ODE_API void dGeomGetRelPointPos -( - dGeomID geom, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief takes a point in global coordinates and returns - * the point's position in geom-relative coordinates. - * - * Calling this function on a non-placeable geom results in the same point being - * returned. - * - * @remarks - * This is the inverse of dGeomGetRelPointPos() - * @ingroup collide - * @param result will contain the result. - */ -ODE_API void dGeomGetPosRelPoint -( - dGeomID geom, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Convert from geom-local to world coordinates. - * - * Calling this function on a non-placeable geom results in the same vector being - * returned. - * - * @ingroup collide - * @param result will contain the result. - */ -ODE_API void dGeomVectorToWorld -( - dGeomID geom, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Convert from world to geom-local coordinates. - * - * Calling this function on a non-placeable geom results in the same vector being - * returned. - * - * @ingroup collide - * @param result will contain the result. - */ -ODE_API void dGeomVectorFromWorld -( - dGeomID geom, dReal px, dReal py, dReal pz, - dVector3 result -); - - -/* ************************************************************************ */ -/* geom offset from body */ - -/** - * @brief Set the local offset position of a geom from its body. - * - * Sets the geom's positional offset in local coordinates. - * After this call, the geom will be at a new position determined from the - * body's position and the offset. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param x the new X coordinate. - * @param y the new Y coordinate. - * @param z the new Z coordinate. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetPosition (dGeomID geom, dReal x, dReal y, dReal z); - - -/** - * @brief Set the local offset rotation matrix of a geom from its body. - * - * Sets the geom's rotational offset in local coordinates. - * After this call, the geom will be at a new position determined from the - * body's position and the offset. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param R the new rotation matrix. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetRotation (dGeomID geom, const dMatrix3 R); - - -/** - * @brief Set the local offset rotation of a geom from its body. - * - * Sets the geom's rotational offset in local coordinates. - * After this call, the geom will be at a new position determined from the - * body's position and the offset. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param Q the new rotation. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetQuaternion (dGeomID geom, const dQuaternion Q); - - -/** - * @brief Set the offset position of a geom from its body. - * - * Sets the geom's positional offset to move it to the new world - * coordinates. - * After this call, the geom will be at the world position passed in, - * and the offset will be the difference from the current body position. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param x the new X coordinate. - * @param y the new Y coordinate. - * @param z the new Z coordinate. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetWorldPosition (dGeomID geom, dReal x, dReal y, dReal z); - - -/** - * @brief Set the offset rotation of a geom from its body. - * - * Sets the geom's rotational offset to orient it to the new world - * rotation matrix. - * After this call, the geom will be at the world orientation passed in, - * and the offset will be the difference from the current body orientation. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param R the new rotation matrix. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetWorldRotation (dGeomID geom, const dMatrix3 R); - - -/** - * @brief Set the offset rotation of a geom from its body. - * - * Sets the geom's rotational offset to orient it to the new world - * rotation matrix. - * After this call, the geom will be at the world orientation passed in, - * and the offset will be the difference from the current body orientation. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param Q the new rotation. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetWorldQuaternion (dGeomID geom, const dQuaternion); - - -/** - * @brief Clear any offset from the geom. - * - * If the geom has an offset, it is eliminated and the geom is - * repositioned at the body's position. If the geom has no offset, - * this function does nothing. - * This is more efficient than calling dGeomSetOffsetPosition(zero) - * and dGeomSetOffsetRotation(identiy), because this function actually - * eliminates the offset, rather than leaving it as the identity transform. - * - * @param geom the geom to have its offset destroyed. - * @ingroup collide - */ -ODE_API void dGeomClearOffset(dGeomID geom); - - -/** - * @brief Check to see whether the geom has an offset. - * - * This function will return non-zero if the offset has been created. - * Note that there is a difference between a geom with no offset, - * and a geom with an offset that is the identity transform. - * In the latter case, although the observed behaviour is identical, - * there is a unnecessary computation involved because the geom will - * be applying the transform whenever it needs to recalculate its world - * position. - * - * @param geom the geom to query. - * @returns Non-zero if the geom has an offset, zero otherwise. - * @ingroup collide - */ -ODE_API int dGeomIsOffset(dGeomID geom); - - -/** - * @brief Get the offset position vector of a geom. - * - * Returns the positional offset of the geom in local coordinates. - * If the geom has no offset, this function returns the zero vector. - * - * @param geom the geom to query. - * @returns A pointer to the geom's offset vector. - * @remarks The returned value is a pointer to the geom's internal - * data structure. It is valid until any changes are made - * to the geom. - * @ingroup collide - */ -ODE_API const dReal * dGeomGetOffsetPosition (dGeomID geom); - - -/** - * @brief Copy the offset position vector of a geom. - * - * Returns the positional offset of the geom in local coordinates. - * If the geom has no offset, this function returns the zero vector. - * - * @param geom the geom to query. - * @param pos returns the offset position - * @ingroup collide - */ -ODE_API void dGeomCopyOffsetPosition (dGeomID geom, dVector3 pos); - - -/** - * @brief Get the offset rotation matrix of a geom. - * - * Returns the rotational offset of the geom in local coordinates. - * If the geom has no offset, this function returns the identity - * matrix. - * - * @param geom the geom to query. - * @returns A pointer to the geom's offset rotation matrix. - * @remarks The returned value is a pointer to the geom's internal - * data structure. It is valid until any changes are made - * to the geom. - * @ingroup collide - */ -ODE_API const dReal * dGeomGetOffsetRotation (dGeomID geom); - - -/** - * @brief Copy the offset rotation matrix of a geom. - * - * Returns the rotational offset of the geom in local coordinates. - * If the geom has no offset, this function returns the identity - * matrix. - * - * @param geom the geom to query. - * @param R returns the rotation matrix. - * @ingroup collide - */ -ODE_API void dGeomCopyOffsetRotation (dGeomID geom, dMatrix3 R); - - -/** - * @brief Get the offset rotation quaternion of a geom. - * - * Returns the rotation offset of the geom as a quaternion. - * If the geom has no offset, the identity quaternion is returned. - * - * @param geom the geom to query. - * @param result a copy of the rotation quaternion. - * @ingroup collide - */ -ODE_API void dGeomGetOffsetQuaternion (dGeomID geom, dQuaternion result); - - -/* ************************************************************************ */ -/* collision detection */ - -/* - * Just generate any contacts (disables any contact refining). - */ -#define CONTACTS_UNIMPORTANT 0x80000000 - -/** - * - * @brief Given two geoms o1 and o2 that potentially intersect, - * generate contact information for them. - * - * Internally, this just calls the correct class-specific collision - * functions for o1 and o2. - * - * @param o1 The first geom to test. - * @param o2 The second geom to test. - * - * @param flags The flags specify how contacts should be generated if - * the geoms touch. The lower 16 bits of flags is an integer that - * specifies the maximum number of contact points to generate. You must - * ask for at least one contact. - * Additionally, following bits may be set: - * CONTACTS_UNIMPORTANT -- just generate any contacts (skip contact refining). - * All other bits in flags must be set to zero. In the future the other bits - * may be used to select from different contact generation strategies. - * - * @param contact Points to an array of dContactGeom structures. The array - * must be able to hold at least the maximum number of contacts. These - * dContactGeom structures may be embedded within larger structures in the - * array -- the skip parameter is the byte offset from one dContactGeom to - * the next in the array. If skip is sizeof(dContactGeom) then contact - * points to a normal (C-style) array. It is an error for skip to be smaller - * than sizeof(dContactGeom). - * - * @returns If the geoms intersect, this function returns the number of contact - * points generated (and updates the contact array), otherwise it returns 0 - * (and the contact array is not touched). - * - * @remarks If a space is passed as o1 or o2 then this function will collide - * all objects contained in o1 with all objects contained in o2, and return - * the resulting contact points. This method for colliding spaces with geoms - * (or spaces with spaces) provides no user control over the individual - * collisions. To get that control, use dSpaceCollide or dSpaceCollide2 instead. - * - * @remarks If o1 and o2 are the same geom then this function will do nothing - * and return 0. Technically speaking an object intersects with itself, but it - * is not useful to find contact points in this case. - * - * @remarks This function does not care if o1 and o2 are in the same space or not - * (or indeed if they are in any space at all). - * - * @ingroup collide - */ -ODE_API int dCollide (dGeomID o1, dGeomID o2, int flags, dContactGeom *contact, - int skip); - -/** - * @brief Determines which pairs of geoms in a space may potentially intersect, - * and calls the callback function for each candidate pair. - * - * @param space The space to test. - * - * @param data Passed from dSpaceCollide directly to the callback - * function. Its meaning is user defined. The o1 and o2 arguments are the - * geoms that may be near each other. - * - * @param callback A callback function is of type @ref dNearCallback. - * - * @remarks Other spaces that are contained within the colliding space are - * not treated specially, i.e. they are not recursed into. The callback - * function may be passed these contained spaces as one or both geom - * arguments. - * - * @remarks dSpaceCollide() is guaranteed to pass all intersecting geom - * pairs to the callback function, but may also pass close but - * non-intersecting pairs. The number of these calls depends on the - * internal algorithms used by the space. Thus you should not expect - * that dCollide will return contacts for every pair passed to the - * callback. - * - * @sa dSpaceCollide2 - * @ingroup collide - */ -ODE_API void dSpaceCollide (dSpaceID space, void *data, dNearCallback *callback); - - -/** - * @brief Determines which geoms from one space may potentially intersect with - * geoms from another space, and calls the callback function for each candidate - * pair. - * - * @param space1 The first space to test. - * - * @param space2 The second space to test. - * - * @param data Passed from dSpaceCollide directly to the callback - * function. Its meaning is user defined. The o1 and o2 arguments are the - * geoms that may be near each other. - * - * @param callback A callback function is of type @ref dNearCallback. - * - * @remarks This function can also test a single non-space geom against a - * space. This function is useful when there is a collision hierarchy, i.e. - * when there are spaces that contain other spaces. - * - * @remarks Other spaces that are contained within the colliding space are - * not treated specially, i.e. they are not recursed into. The callback - * function may be passed these contained spaces as one or both geom - * arguments. - * - * @remarks Sublevel value of space affects how the spaces are iterated. - * Both spaces are recursed only if their sublevels match. Otherwise, only - * the space with greater sublevel is recursed and the one with lesser sublevel - * is used as a geom itself. - * - * @remarks dSpaceCollide2() is guaranteed to pass all intersecting geom - * pairs to the callback function, but may also pass close but - * non-intersecting pairs. The number of these calls depends on the - * internal algorithms used by the space. Thus you should not expect - * that dCollide will return contacts for every pair passed to the - * callback. - * - * @sa dSpaceCollide - * @sa dSpaceSetSublevel - * @ingroup collide - */ -ODE_API void dSpaceCollide2 (dGeomID space1, dGeomID space2, void *data, dNearCallback *callback); - - -/* ************************************************************************ */ -/* standard classes */ - -/* the maximum number of user classes that are supported */ -enum { - dMaxUserClasses = 4 -}; - -/* class numbers - each geometry object needs a unique number */ -enum { - dSphereClass = 0, - dBoxClass, - dCapsuleClass, - dCylinderClass, - dPlaneClass, - dRayClass, - dConvexClass, - dGeomTransformClass, - dTriMeshClass, - dHeightfieldClass, - - dFirstSpaceClass, - dSimpleSpaceClass = dFirstSpaceClass, - dHashSpaceClass, - dSweepAndPruneSpaceClass, // SAP - dQuadTreeSpaceClass, - dLastSpaceClass = dQuadTreeSpaceClass, - - dFirstUserClass, - dLastUserClass = dFirstUserClass + dMaxUserClasses - 1, - dGeomNumClasses -}; - - -/** - * @defgroup collide_sphere Sphere Class - * @ingroup collide - */ - -/** - * @brief Create a sphere geom of the given radius, and return its ID. - * - * @param space a space to contain the new geom. May be null. - * @param radius the radius of the sphere. - * - * @returns A new sphere geom. - * - * @remarks The point of reference for a sphere is its center. - * - * @sa dGeomDestroy - * @sa dGeomSphereSetRadius - * @ingroup collide_sphere - */ -ODE_API dGeomID dCreateSphere (dSpaceID space, dReal radius); - - -/** - * @brief Set the radius of a sphere geom. - * - * @param sphere the sphere to set. - * @param radius the new radius. - * - * @sa dGeomSphereGetRadius - * @ingroup collide_sphere - */ -ODE_API void dGeomSphereSetRadius (dGeomID sphere, dReal radius); - - -/** - * @brief Retrieves the radius of a sphere geom. - * - * @param sphere the sphere to query. - * - * @sa dGeomSphereSetRadius - * @ingroup collide_sphere - */ -ODE_API dReal dGeomSphereGetRadius (dGeomID sphere); - - -/** - * @brief Calculate the depth of the a given point within a sphere. - * - * @param sphere the sphere to query. - * @param x the X coordinate of the point. - * @param y the Y coordinate of the point. - * @param z the Z coordinate of the point. - * - * @returns The depth of the point. Points inside the sphere will have a - * positive depth, points outside it will have a negative depth, and points - * on the surface will have a depth of zero. - * - * @ingroup collide_sphere - */ -ODE_API dReal dGeomSpherePointDepth (dGeomID sphere, dReal x, dReal y, dReal z); - - -//--> Convex Functions -ODE_API dGeomID dCreateConvex (dSpaceID space, - dReal *_planes, - unsigned int _planecount, - dReal *_points, - unsigned int _pointcount,unsigned int *_polygons); - -ODE_API void dGeomSetConvex (dGeomID g, - dReal *_planes, - unsigned int _count, - dReal *_points, - unsigned int _pointcount,unsigned int *_polygons); -//<-- Convex Functions - -/** - * @defgroup collide_box Box Class - * @ingroup collide - */ - -/** - * @brief Create a box geom with the provided side lengths. - * - * @param space a space to contain the new geom. May be null. - * @param lx the length of the box along the X axis - * @param ly the length of the box along the Y axis - * @param lz the length of the box along the Z axis - * - * @returns A new box geom. - * - * @remarks The point of reference for a box is its center. - * - * @sa dGeomDestroy - * @sa dGeomBoxSetLengths - * @ingroup collide_box - */ -ODE_API dGeomID dCreateBox (dSpaceID space, dReal lx, dReal ly, dReal lz); - - -/** - * @brief Set the side lengths of the given box. - * - * @param box the box to set - * @param lx the length of the box along the X axis - * @param ly the length of the box along the Y axis - * @param lz the length of the box along the Z axis - * - * @sa dGeomBoxGetLengths - * @ingroup collide_box - */ -ODE_API void dGeomBoxSetLengths (dGeomID box, dReal lx, dReal ly, dReal lz); - - -/** - * @brief Get the side lengths of a box. - * - * @param box the box to query - * @param result the returned side lengths - * - * @sa dGeomBoxSetLengths - * @ingroup collide_box - */ -ODE_API void dGeomBoxGetLengths (dGeomID box, dVector3 result); - - -/** - * @brief Return the depth of a point in a box. - * - * @param box the box to query - * @param x the X coordinate of the point to test. - * @param y the Y coordinate of the point to test. - * @param z the Z coordinate of the point to test. - * - * @returns The depth of the point. Points inside the box will have a - * positive depth, points outside it will have a negative depth, and points - * on the surface will have a depth of zero. - */ -ODE_API dReal dGeomBoxPointDepth (dGeomID box, dReal x, dReal y, dReal z); - - -ODE_API dGeomID dCreatePlane (dSpaceID space, dReal a, dReal b, dReal c, dReal d); -ODE_API void dGeomPlaneSetParams (dGeomID plane, dReal a, dReal b, dReal c, dReal d); -ODE_API void dGeomPlaneGetParams (dGeomID plane, dVector4 result); -ODE_API dReal dGeomPlanePointDepth (dGeomID plane, dReal x, dReal y, dReal z); - -ODE_API dGeomID dCreateCapsule (dSpaceID space, dReal radius, dReal length); -ODE_API void dGeomCapsuleSetParams (dGeomID ccylinder, dReal radius, dReal length); -ODE_API void dGeomCapsuleGetParams (dGeomID ccylinder, dReal *radius, dReal *length); -ODE_API dReal dGeomCapsulePointDepth (dGeomID ccylinder, dReal x, dReal y, dReal z); - -// For now we want to have a backwards compatible C-API, note: C++ API is not. -#define dCreateCCylinder dCreateCapsule -#define dGeomCCylinderSetParams dGeomCapsuleSetParams -#define dGeomCCylinderGetParams dGeomCapsuleGetParams -#define dGeomCCylinderPointDepth dGeomCapsulePointDepth -#define dCCylinderClass dCapsuleClass - -ODE_API dGeomID dCreateCylinder (dSpaceID space, dReal radius, dReal length); -ODE_API void dGeomCylinderSetParams (dGeomID cylinder, dReal radius, dReal length); -ODE_API void dGeomCylinderGetParams (dGeomID cylinder, dReal *radius, dReal *length); - -ODE_API dGeomID dCreateRay (dSpaceID space, dReal length); -ODE_API void dGeomRaySetLength (dGeomID ray, dReal length); -ODE_API dReal dGeomRayGetLength (dGeomID ray); -ODE_API void dGeomRaySet (dGeomID ray, dReal px, dReal py, dReal pz, - dReal dx, dReal dy, dReal dz); -ODE_API void dGeomRayGet (dGeomID ray, dVector3 start, dVector3 dir); - -/* - * Set/get ray flags that influence ray collision detection. - * These flags are currently only noticed by the trimesh collider, because - * they can make a major differences there. - */ -ODE_API void dGeomRaySetParams (dGeomID g, int FirstContact, int BackfaceCull); -ODE_API void dGeomRayGetParams (dGeomID g, int *FirstContact, int *BackfaceCull); -ODE_API void dGeomRaySetClosestHit (dGeomID g, int closestHit); -ODE_API int dGeomRayGetClosestHit (dGeomID g); - -#include "collision_trimesh.h" - -ODE_API dGeomID dCreateGeomTransform (dSpaceID space); -ODE_API void dGeomTransformSetGeom (dGeomID g, dGeomID obj); -ODE_API dGeomID dGeomTransformGetGeom (dGeomID g); -ODE_API void dGeomTransformSetCleanup (dGeomID g, int mode); -ODE_API int dGeomTransformGetCleanup (dGeomID g); -ODE_API void dGeomTransformSetInfo (dGeomID g, int mode); -ODE_API int dGeomTransformGetInfo (dGeomID g); - - -/* ************************************************************************ */ -/* heightfield functions */ - - -// Data storage for heightfield data. -struct dxHeightfieldData; -typedef struct dxHeightfieldData* dHeightfieldDataID; - - -/** - * @brief Callback prototype - * - * Used by the callback heightfield data type to sample a height for a - * given cell position. - * - * @param p_user_data User data specified when creating the dHeightfieldDataID - * @param x The index of a sample in the local x axis. It is a value - * in the range zero to ( nWidthSamples - 1 ). - * @param x The index of a sample in the local z axis. It is a value - * in the range zero to ( nDepthSamples - 1 ). - * - * @return The sample height which is then scaled and offset using the - * values specified when the heightfield data was created. - * - * @ingroup collide - */ -typedef dReal dHeightfieldGetHeight( void* p_user_data, int x, int z ); - - - -/** - * @brief Creates a heightfield geom. - * - * Uses the information in the given dHeightfieldDataID to construct - * a geom representing a heightfield in a collision space. - * - * @param space The space to add the geom to. - * @param data The dHeightfieldDataID created by dGeomHeightfieldDataCreate and - * setup by dGeomHeightfieldDataBuildCallback, dGeomHeightfieldDataBuildByte, - * dGeomHeightfieldDataBuildShort or dGeomHeightfieldDataBuildFloat. - * @param bPlaceable If non-zero this geom can be transformed in the world using the - * usual functions such as dGeomSetPosition and dGeomSetRotation. If the geom is - * not set as placeable, then it uses a fixed orientation where the global y axis - * represents the dynamic 'height' of the heightfield. - * - * @return A geom id to reference this geom in other calls. - * - * @ingroup collide - */ -ODE_API dGeomID dCreateHeightfield( dSpaceID space, - dHeightfieldDataID data, int bPlaceable ); - - -/** - * @brief Creates a new empty dHeightfieldDataID. - * - * Allocates a new dHeightfieldDataID and returns it. You must call - * dGeomHeightfieldDataDestroy to destroy it after the geom has been removed. - * The dHeightfieldDataID value is used when specifying a data format type. - * - * @return A dHeightfieldDataID for use with dGeomHeightfieldDataBuildCallback, - * dGeomHeightfieldDataBuildByte, dGeomHeightfieldDataBuildShort or - * dGeomHeightfieldDataBuildFloat. - * @ingroup collide - */ -ODE_API dHeightfieldDataID dGeomHeightfieldDataCreate(void); - - -/** - * @brief Destroys a dHeightfieldDataID. - * - * Deallocates a given dHeightfieldDataID and all managed resources. - * - * @param d A dHeightfieldDataID created by dGeomHeightfieldDataCreate - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataDestroy( dHeightfieldDataID d ); - - - -/** - * @brief Configures a dHeightfieldDataID to use a callback to - * retrieve height data. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is computed by - * the user and it should use the given callback when determining - * the height of a given element of it's shape. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildCallback( dHeightfieldDataID d, - void* pUserData, dHeightfieldGetHeight* pCallback, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Configures a dHeightfieldDataID to use height data in byte format. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is stored as a rectangular - * array of bytes (8 bit unsigned) representing the height at each sample point. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param pHeightData A pointer to the height data. - * @param bCopyHeightData When non-zero the height data is copied to an - * internal store. When zero the height data is accessed by reference and - * so must persist throughout the lifetime of the heightfield. - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildByte( dHeightfieldDataID d, - const unsigned char* pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Configures a dHeightfieldDataID to use height data in short format. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is stored as a rectangular - * array of shorts (16 bit signed) representing the height at each sample point. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param pHeightData A pointer to the height data. - * @param bCopyHeightData When non-zero the height data is copied to an - * internal store. When zero the height data is accessed by reference and - * so must persist throughout the lifetime of the heightfield. - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildShort( dHeightfieldDataID d, - const short* pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Configures a dHeightfieldDataID to use height data in - * single precision floating point format. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is stored as a rectangular - * array of single precision floats representing the height at each - * sample point. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param pHeightData A pointer to the height data. - * @param bCopyHeightData When non-zero the height data is copied to an - * internal store. When zero the height data is accessed by reference and - * so must persist throughout the lifetime of the heightfield. - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildSingle( dHeightfieldDataID d, - const float* pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Configures a dHeightfieldDataID to use height data in - * double precision floating point format. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is stored as a rectangular - * array of double precision floats representing the height at each - * sample point. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param pHeightData A pointer to the height data. - * @param bCopyHeightData When non-zero the height data is copied to an - * internal store. When zero the height data is accessed by reference and - * so must persist throughout the lifetime of the heightfield. - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildDouble( dHeightfieldDataID d, - const double* pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Manually set the minimum and maximum height bounds. - * - * This call allows you to set explicit min / max values after initial - * creation typically for callback heightfields which default to +/- infinity, - * or those whose data has changed. This must be set prior to binding with a - * geom, as the the AABB is not recomputed after it's first generation. - * - * @remarks The minimum and maximum values are used to compute the AABB - * for the heightfield which is used for early rejection of collisions. - * A close fit will yield a more efficient collision check. - * - * @param d A dHeightfieldDataID created by dGeomHeightfieldDataCreate - * @param min_height The new minimum height value. Scale, offset and thickness is then applied. - * @param max_height The new maximum height value. Scale and offset is then applied. - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataSetBounds( dHeightfieldDataID d, - dReal minHeight, dReal maxHeight ); - - -/** - * @brief Assigns a dHeightfieldDataID to a heightfield geom. - * - * Associates the given dHeightfieldDataID with a heightfield geom. - * This is done without affecting the GEOM_PLACEABLE flag. - * - * @param g A geom created by dCreateHeightfield - * @param d A dHeightfieldDataID created by dGeomHeightfieldDataCreate - * @ingroup collide - */ -ODE_API void dGeomHeightfieldSetHeightfieldData( dGeomID g, dHeightfieldDataID d ); - - -/** - * @brief Gets the dHeightfieldDataID bound to a heightfield geom. - * - * Returns the dHeightfieldDataID associated with a heightfield geom. - * - * @param g A geom created by dCreateHeightfield - * @return The dHeightfieldDataID which may be NULL if none was assigned. - * @ingroup collide - */ -ODE_API dHeightfieldDataID dGeomHeightfieldGetHeightfieldData( dGeomID g ); - - - -/* ************************************************************************ */ -/* utility functions */ - -ODE_API void dClosestLineSegmentPoints (const dVector3 a1, const dVector3 a2, - const dVector3 b1, const dVector3 b2, - dVector3 cp1, dVector3 cp2); - -ODE_API int dBoxTouchesBox (const dVector3 _p1, const dMatrix3 R1, - const dVector3 side1, const dVector3 _p2, - const dMatrix3 R2, const dVector3 side2); - -// The meaning of flags parameter is the same as in dCollide() -ODE_API int dBoxBox (const dVector3 p1, const dMatrix3 R1, - const dVector3 side1, const dVector3 p2, - const dMatrix3 R2, const dVector3 side2, - dVector3 normal, dReal *depth, int *return_code, - int flags, dContactGeom *contact, int skip); - -ODE_API void dInfiniteAABB (dGeomID geom, dReal aabb[6]); - - -/* ************************************************************************ */ -/* custom classes */ - -typedef void dGetAABBFn (dGeomID, dReal aabb[6]); -typedef int dColliderFn (dGeomID o1, dGeomID o2, - int flags, dContactGeom *contact, int skip); -typedef dColliderFn * dGetColliderFnFn (int num); -typedef void dGeomDtorFn (dGeomID o); -typedef int dAABBTestFn (dGeomID o1, dGeomID o2, dReal aabb[6]); - -typedef struct dGeomClass { - int bytes; - dGetColliderFnFn *collider; - dGetAABBFn *aabb; - dAABBTestFn *aabb_test; - dGeomDtorFn *dtor; -} dGeomClass; - -ODE_API int dCreateGeomClass (const dGeomClass *classptr); -ODE_API void * dGeomGetClassData (dGeomID); -ODE_API dGeomID dCreateGeom (int classnum); - -/** - * @brief Sets a custom collider function for two geom classes. - * - * @param i The first geom class handled by this collider - * @param j The second geom class handled by this collider - * @param fn The collider function to use to determine collisions. - * @ingroup collide - */ -ODE_API void dSetColliderOverride (int i, int j, dColliderFn *fn); - - -/* ************************************************************************ */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/collision_space.h b/misc/builddeps/dp.linux64/include/ode/collision_space.h deleted file mode 100644 index bf7ef9b4..00000000 --- a/misc/builddeps/dp.linux64/include/ode/collision_space.h +++ /dev/null @@ -1,182 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COLLISION_SPACE_H_ -#define _ODE_COLLISION_SPACE_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct dContactGeom; - -/** - * @brief User callback for geom-geom collision testing. - * - * @param data The user data object, as passed to dSpaceCollide. - * @param o1 The first geom being tested. - * @param o2 The second geom being test. - * - * @remarks The callback function can call dCollide on o1 and o2 to generate - * contact points between each pair. Then these contact points may be added - * to the simulation as contact joints. The user's callback function can of - * course chose not to call dCollide for any pair, e.g. if the user decides - * that those pairs should not interact. - * - * @ingroup collide - */ -typedef void dNearCallback (void *data, dGeomID o1, dGeomID o2); - - -ODE_API dSpaceID dSimpleSpaceCreate (dSpaceID space); -ODE_API dSpaceID dHashSpaceCreate (dSpaceID space); -ODE_API dSpaceID dQuadTreeSpaceCreate (dSpaceID space, const dVector3 Center, const dVector3 Extents, int Depth); - - -// SAP -// Order XZY or ZXY usually works best, if your Y is up. -#define dSAP_AXES_XYZ ((0)|(1<<2)|(2<<4)) -#define dSAP_AXES_XZY ((0)|(2<<2)|(1<<4)) -#define dSAP_AXES_YXZ ((1)|(0<<2)|(2<<4)) -#define dSAP_AXES_YZX ((1)|(2<<2)|(0<<4)) -#define dSAP_AXES_ZXY ((2)|(0<<2)|(1<<4)) -#define dSAP_AXES_ZYX ((2)|(1<<2)|(0<<4)) - -ODE_API dSpaceID dSweepAndPruneSpaceCreate( dSpaceID space, int axisorder ); - - - -ODE_API void dSpaceDestroy (dSpaceID); - -ODE_API void dHashSpaceSetLevels (dSpaceID space, int minlevel, int maxlevel); -ODE_API void dHashSpaceGetLevels (dSpaceID space, int *minlevel, int *maxlevel); - -ODE_API void dSpaceSetCleanup (dSpaceID space, int mode); -ODE_API int dSpaceGetCleanup (dSpaceID space); - -/** -* @brief Sets sublevel value for a space. -* -* Sublevel affects how the space is handled in dSpaceCollide2 when it is collided -* with another space. If sublevels of both spaces match, the function iterates -* geometries of both spaces and collides them with each other. If sublevel of one -* space is greater than the sublevel of another one, only the geometries of the -* space with greater sublevel are iterated, another space is passed into -* collision callback as a geometry itself. By default all the spaces are assigned -* zero sublevel. -* -* @note -* The space sublevel @e IS @e NOT automatically updated when one space is inserted -* into another or removed from one. It is a client's responsibility to update sublevel -* value if necessary. -* -* @param space the space to modify -* @param sublevel the sublevel value to be assigned -* @ingroup collide -* @see dSpaceGetSublevel -* @see dSpaceCollide2 -*/ -ODE_API void dSpaceSetSublevel (dSpaceID space, int sublevel); - -/** -* @brief Gets sublevel value of a space. -* -* Sublevel affects how the space is handled in dSpaceCollide2 when it is collided -* with another space. See @c dSpaceSetSublevel for more details. -* -* @param space the space to query -* @returns the sublevel value of the space -* @ingroup collide -* @see dSpaceSetSublevel -* @see dSpaceCollide2 -*/ -ODE_API int dSpaceGetSublevel (dSpaceID space); - - -/** -* @brief Sets manual cleanup flag for a space. -* -* Manual cleanup flag marks a space as eligible for manual thread data cleanup. -* This function should be called for every space object right after creation in -* case if ODE has been initialized with @c dInitFlagManualThreadCleanup flag. -* -* Failure to set manual cleanup flag for a space may lead to some resources -* remaining leaked until the program exit. -* -* @param space the space to modify -* @param mode 1 for manual cleanup mode and 0 for default cleanup mode -* @ingroup collide -* @see dSpaceGetManualCleanup -* @see dInitODE2 -*/ -ODE_API void dSpaceSetManualCleanup (dSpaceID space, int mode); - -/** -* @brief Get manual cleanup flag of a space. -* -* Manual cleanup flag marks a space space as eligible for manual thread data cleanup. -* See @c dSpaceSetManualCleanup for more details. -* -* @param space the space to query -* @returns 1 for manual cleanup mode and 0 for default cleanup mode of the space -* @ingroup collide -* @see dSpaceSetManualCleanup -* @see dInitODE2 -*/ -ODE_API int dSpaceGetManualCleanup (dSpaceID space); - -ODE_API void dSpaceAdd (dSpaceID, dGeomID); -ODE_API void dSpaceRemove (dSpaceID, dGeomID); -ODE_API int dSpaceQuery (dSpaceID, dGeomID); -ODE_API void dSpaceClean (dSpaceID); -ODE_API int dSpaceGetNumGeoms (dSpaceID); -ODE_API dGeomID dSpaceGetGeom (dSpaceID, int i); - -/** - * @brief Given a space, this returns its class. - * - * The ODE classes are: - * @li dSimpleSpaceClass - * @li dHashSpaceClass - * @li dSweepAndPruneSpaceClass - * @li dQuadTreeSpaceClass - * @li dFirstUserClass - * @li dLastUserClass - * - * The class id not defined by the user should be between - * dFirstSpaceClass and dLastSpaceClass. - * - * User-defined class will return their own number. - * - * @param space the space to query - * @returns The space class ID. - * @ingroup collide - */ -ODE_API int dSpaceGetClass(dSpaceID space); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/collision_trimesh.h b/misc/builddeps/dp.linux64/include/ode/collision_trimesh.h deleted file mode 100644 index f263a9ea..00000000 --- a/misc/builddeps/dp.linux64/include/ode/collision_trimesh.h +++ /dev/null @@ -1,216 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* - * TriMesh code by Erwin de Vries. - * - * Trimesh data. - * This is where the actual vertexdata (pointers), and BV tree is stored. - * Vertices should be single precision! - * This should be more sophisticated, so that the user can easyly implement - * another collision library, but this is a lot of work, and also costs some - * performance because some data has to be copied. - */ - -#ifndef _ODE_COLLISION_TRIMESH_H_ -#define _ODE_COLLISION_TRIMESH_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Data storage for triangle meshes. - */ -struct dxTriMeshData; -typedef struct dxTriMeshData* dTriMeshDataID; - -/* - * These dont make much sense now, but they will later when we add more - * features. - */ -ODE_API dTriMeshDataID dGeomTriMeshDataCreate(void); -ODE_API void dGeomTriMeshDataDestroy(dTriMeshDataID g); - - - -enum { TRIMESH_FACE_NORMALS }; -ODE_API void dGeomTriMeshDataSet(dTriMeshDataID g, int data_id, void* in_data); -ODE_API void* dGeomTriMeshDataGet(dTriMeshDataID g, int data_id); - - - -/** - * We need to set the last transform after each time step for - * accurate collision response. These functions get and set that transform. - * It is stored per geom instance, rather than per dTriMeshDataID. - */ -ODE_API void dGeomTriMeshSetLastTransform( dGeomID g, dMatrix4 last_trans ); -ODE_API dReal* dGeomTriMeshGetLastTransform( dGeomID g ); - -/* - * Build a TriMesh data object with single precision vertex data. - */ -ODE_API void dGeomTriMeshDataBuildSingle(dTriMeshDataID g, - const void* Vertices, int VertexStride, int VertexCount, - const void* Indices, int IndexCount, int TriStride); -/* same again with a normals array (used as trimesh-trimesh optimization) */ -ODE_API void dGeomTriMeshDataBuildSingle1(dTriMeshDataID g, - const void* Vertices, int VertexStride, int VertexCount, - const void* Indices, int IndexCount, int TriStride, - const void* Normals); -/* -* Build a TriMesh data object with double precision vertex data. -*/ -ODE_API void dGeomTriMeshDataBuildDouble(dTriMeshDataID g, - const void* Vertices, int VertexStride, int VertexCount, - const void* Indices, int IndexCount, int TriStride); -/* same again with a normals array (used as trimesh-trimesh optimization) */ -ODE_API void dGeomTriMeshDataBuildDouble1(dTriMeshDataID g, - const void* Vertices, int VertexStride, int VertexCount, - const void* Indices, int IndexCount, int TriStride, - const void* Normals); - -/* - * Simple build. Single/double precision based on dSINGLE/dDOUBLE! - */ -ODE_API void dGeomTriMeshDataBuildSimple(dTriMeshDataID g, - const dReal* Vertices, int VertexCount, - const dTriIndex* Indices, int IndexCount); -/* same again with a normals array (used as trimesh-trimesh optimization) */ -ODE_API void dGeomTriMeshDataBuildSimple1(dTriMeshDataID g, - const dReal* Vertices, int VertexCount, - const dTriIndex* Indices, int IndexCount, - const int* Normals); - -/* Preprocess the trimesh data to remove mark unnecessary edges and vertices */ -ODE_API void dGeomTriMeshDataPreprocess(dTriMeshDataID g); -/* Get and set the internal preprocessed trimesh data buffer, for loading and saving */ -ODE_API void dGeomTriMeshDataGetBuffer(dTriMeshDataID g, unsigned char** buf, int* bufLen); -ODE_API void dGeomTriMeshDataSetBuffer(dTriMeshDataID g, unsigned char* buf); - - -/* - * Per triangle callback. Allows the user to say if he wants a collision with - * a particular triangle. - */ -typedef int dTriCallback(dGeomID TriMesh, dGeomID RefObject, int TriangleIndex); -ODE_API void dGeomTriMeshSetCallback(dGeomID g, dTriCallback* Callback); -ODE_API dTriCallback* dGeomTriMeshGetCallback(dGeomID g); - -/* - * Per object callback. Allows the user to get the list of triangles in 1 - * shot. Maybe we should remove this one. - */ -typedef void dTriArrayCallback(dGeomID TriMesh, dGeomID RefObject, const int* TriIndices, int TriCount); -ODE_API void dGeomTriMeshSetArrayCallback(dGeomID g, dTriArrayCallback* ArrayCallback); -ODE_API dTriArrayCallback* dGeomTriMeshGetArrayCallback(dGeomID g); - -/* - * Ray callback. - * Allows the user to say if a ray collides with a triangle on barycentric - * coords. The user can for example sample a texture with alpha transparency - * to determine if a collision should occur. - */ -typedef int dTriRayCallback(dGeomID TriMesh, dGeomID Ray, int TriangleIndex, dReal u, dReal v); -ODE_API void dGeomTriMeshSetRayCallback(dGeomID g, dTriRayCallback* Callback); -ODE_API dTriRayCallback* dGeomTriMeshGetRayCallback(dGeomID g); - -/* - * Triangle merging callback. - * Allows the user to generate a fake triangle index for a new contact generated - * from merging of two other contacts. That index could later be used by the - * user to determine attributes of original triangles used as sources for a - * merged contact. - */ -typedef int dTriTriMergeCallback(dGeomID TriMesh, int FirstTriangleIndex, int SecondTriangleIndex); -ODE_API void dGeomTriMeshSetTriMergeCallback(dGeomID g, dTriTriMergeCallback* Callback); -ODE_API dTriTriMergeCallback* dGeomTriMeshGetTriMergeCallback(dGeomID g); - -/* - * Trimesh class - * Construction. Callbacks are optional. - */ -ODE_API dGeomID dCreateTriMesh(dSpaceID space, dTriMeshDataID Data, dTriCallback* Callback, dTriArrayCallback* ArrayCallback, dTriRayCallback* RayCallback); - -ODE_API void dGeomTriMeshSetData(dGeomID g, dTriMeshDataID Data); -ODE_API dTriMeshDataID dGeomTriMeshGetData(dGeomID g); - - -// enable/disable/check temporal coherence -ODE_API void dGeomTriMeshEnableTC(dGeomID g, int geomClass, int enable); -ODE_API int dGeomTriMeshIsTCEnabled(dGeomID g, int geomClass); - -/* - * Clears the internal temporal coherence caches. When a geom has its - * collision checked with a trimesh once, data is stored inside the trimesh. - * With large worlds with lots of seperate objects this list could get huge. - * We should be able to do this automagically. - */ -ODE_API void dGeomTriMeshClearTCCache(dGeomID g); - - -/* - * returns the TriMeshDataID - */ -ODE_API dTriMeshDataID dGeomTriMeshGetTriMeshDataID(dGeomID g); - -/* - * Gets a triangle. - */ -ODE_API void dGeomTriMeshGetTriangle(dGeomID g, int Index, dVector3* v0, dVector3* v1, dVector3* v2); - -/* - * Gets the point on the requested triangle and the given barycentric - * coordinates. - */ -ODE_API void dGeomTriMeshGetPoint(dGeomID g, int Index, dReal u, dReal v, dVector3 Out); - -/* - -This is how the strided data works: - -struct StridedVertex{ - dVector3 Vertex; - // Userdata -}; -int VertexStride = sizeof(StridedVertex); - -struct StridedTri{ - int Indices[3]; - // Userdata -}; -int TriStride = sizeof(StridedTri); - -*/ - - -ODE_API int dGeomTriMeshGetTriangleCount (dGeomID g); - -ODE_API void dGeomTriMeshDataUpdate(dTriMeshDataID g); - -#ifdef __cplusplus -} -#endif - -#endif /* _ODE_COLLISION_TRIMESH_H_ */ - diff --git a/misc/builddeps/dp.linux64/include/ode/common.h b/misc/builddeps/dp.linux64/include/ode/common.h deleted file mode 100644 index d7b2bba7..00000000 --- a/misc/builddeps/dp.linux64/include/ode/common.h +++ /dev/null @@ -1,420 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COMMON_H_ -#define _ODE_COMMON_H_ -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -#define PURE_INLINE static __inline - - -/* configuration stuff */ - -/* constants */ - -/* pi and 1/sqrt(2) are defined here if necessary because they don't get - * defined in on some platforms (like MS-Windows) - */ - -#ifndef M_PI -#define M_PI REAL(3.1415926535897932384626433832795029) -#endif -#ifndef M_SQRT1_2 -#define M_SQRT1_2 REAL(0.7071067811865475244008443621048490) -#endif - - -/* debugging: - * IASSERT is an internal assertion, i.e. a consistency check. if it fails - * we want to know where. - * UASSERT is a user assertion, i.e. if it fails a nice error message - * should be printed for the user. - * AASSERT is an arguments assertion, i.e. if it fails "bad argument(s)" - * is printed. - * DEBUGMSG just prints out a message - */ - -# if defined(__STDC__) && __STDC_VERSION__ >= 199901L -# define __FUNCTION__ __func__ -# endif -#ifndef dNODEBUG -# ifdef __GNUC__ -# define dIASSERT(a) { if (!(a)) { dDebug (d_ERR_IASSERT, \ - "assertion \"" #a "\" failed in %s() [%s:%u]",__FUNCTION__,__FILE__,__LINE__); } } -# define dUASSERT(a,msg) { if (!(a)) { dDebug (d_ERR_UASSERT, \ - msg " in %s()", __FUNCTION__); } } -# define dDEBUGMSG(msg) { dMessage (d_ERR_UASSERT, \ - msg " in %s() [%s:%u]", __FUNCTION__,__FILE__,__LINE__); } -# else // not __GNUC__ -# define dIASSERT(a) { if (!(a)) { dDebug (d_ERR_IASSERT, \ - "assertion \"" #a "\" failed in %s:%u",__FILE__,__LINE__); } } -# define dUASSERT(a,msg) { if (!(a)) { dDebug (d_ERR_UASSERT, \ - msg " (%s:%u)", __FILE__,__LINE__); } } -# define dDEBUGMSG(msg) { dMessage (d_ERR_UASSERT, \ - msg " (%s:%u)", __FILE__,__LINE__); } -# endif -# define dIVERIFY(a) dIASSERT(a) -#else -# define dIASSERT(a) ((void)0) -# define dUASSERT(a,msg) ((void)0) -# define dDEBUGMSG(msg) ((void)0) -# define dIVERIFY(a) ((void)(a)) -#endif - -# ifdef __GNUC__ -# define dICHECK(a) { if (!(a)) { dDebug (d_ERR_IASSERT, \ - "assertion \"" #a "\" failed in %s() [%s:%u]",__FUNCTION__,__FILE__,__LINE__); *(int *)0 = 0; } } -# else // not __GNUC__ -# define dICHECK(a) { if (!(a)) { dDebug (d_ERR_IASSERT, \ - "assertion \"" #a "\" failed in %s:%u",__FILE__,__LINE__); *(int *)0 = 0; } } -# endif - -// Argument assert is a special case of user assert -#define dAASSERT(a) dUASSERT(a,"Bad argument(s)") - -/* floating point data type, vector, matrix and quaternion types */ - -#if defined(dSINGLE) -typedef float dReal; -#ifdef dDOUBLE -#error You can only #define dSINGLE or dDOUBLE, not both. -#endif // dDOUBLE -#elif defined(dDOUBLE) -typedef double dReal; -#else -#error You must #define dSINGLE or dDOUBLE -#endif - -// Detect if we've got both trimesh engines enabled. -#if dTRIMESH_ENABLED -#if dTRIMESH_OPCODE && dTRIMESH_GIMPACT -#error You can only #define dTRIMESH_OPCODE or dTRIMESH_GIMPACT, not both. -#endif -#endif // dTRIMESH_ENABLED - -// Define a type for indices, either 16 or 32 bit, based on build option -// TODO: Currently GIMPACT only supports 32 bit indices. -#if dTRIMESH_16BIT_INDICES -#if dTRIMESH_GIMPACT -typedef uint32 dTriIndex; -#else // dTRIMESH_GIMPACT -typedef uint16 dTriIndex; -#endif // dTRIMESH_GIMPACT -#else // dTRIMESH_16BIT_INDICES -typedef uint32 dTriIndex; -#endif // dTRIMESH_16BIT_INDICES - -/* round an integer up to a multiple of 4, except that 0 and 1 are unmodified - * (used to compute matrix leading dimensions) - */ -#define dPAD(a) (((a) > 1) ? ((((a)-1)|3)+1) : (a)) - -/* these types are mainly just used in headers */ -typedef dReal dVector3[4]; -typedef dReal dVector4[4]; -typedef dReal dMatrix3[4*3]; -typedef dReal dMatrix4[4*4]; -typedef dReal dMatrix6[8*6]; -typedef dReal dQuaternion[4]; - - -/* precision dependent scalar math functions */ - -#if defined(dSINGLE) - -#define REAL(x) (x ## f) /* form a constant */ -#define dRecip(x) ((1.0f/(x))) /* reciprocal */ -#define dSqrt(x) (sqrtf(x)) /* square root */ -#define dRecipSqrt(x) ((1.0f/sqrtf(x))) /* reciprocal square root */ -#define dSin(x) (sinf(x)) /* sine */ -#define dCos(x) (cosf(x)) /* cosine */ -#define dFabs(x) (fabsf(x)) /* absolute value */ -#define dAtan2(y,x) (atan2f(y,x)) /* arc tangent with 2 args */ -#define dFMod(a,b) (fmodf(a,b)) /* modulo */ -#define dFloor(x) floorf(x) /* floor */ -#define dCeil(x) ceilf(x) /* floor */ -#define dCopySign(a,b) ((dReal)copysignf(a,b)) /* copy value sign */ -#define dNextAfter(x, y) nextafterf(x, y) /* next value after */ - -#if defined(_ODE__NEXTAFTERF_REQUIRED) -float _nextafterf(float x, float y); -#endif - -#ifdef HAVE___ISNANF -#define dIsNan(x) (__isnanf(x)) -#elif defined(HAVE__ISNANF) -#define dIsNan(x) (_isnanf(x)) -#elif defined(HAVE_ISNANF) -#define dIsNan(x) (isnanf(x)) -#else - /* - fall back to _isnan which is the VC way, - this may seem redundant since we already checked - for _isnan before, but if isnan is detected by - configure but is not found during compilation - we should always make sure we check for __isnanf, - _isnanf and isnanf in that order before falling - back to a default - */ -#define dIsNan(x) (_isnan(x)) -#endif - -#elif defined(dDOUBLE) - -#define REAL(x) (x) -#define dRecip(x) (1.0/(x)) -#define dSqrt(x) sqrt(x) -#define dRecipSqrt(x) (1.0/sqrt(x)) -#define dSin(x) sin(x) -#define dCos(x) cos(x) -#define dFabs(x) fabs(x) -#define dAtan2(y,x) atan2((y),(x)) -#define dFMod(a,b) (fmod((a),(b))) -#define dFloor(x) floor(x) -#define dCeil(x) ceil(x) -#define dCopySign(a,b) (copysign((a),(b))) -#define dNextAfter(x, y) nextafter(x, y) - -#undef _ODE__NEXTAFTERF_REQUIRED - -#ifdef HAVE___ISNAN -#define dIsNan(x) (__isnan(x)) -#elif defined(HAVE__ISNAN) -#define dIsNan(x) (_isnan(x)) -#elif defined(HAVE_ISNAN) -#define dIsNan(x) (isnan(x)) -#else -#define dIsNan(x) (_isnan(x)) -#endif - -#else -#error You must #define dSINGLE or dDOUBLE -#endif - -/* internal object types (all prefixed with `dx') */ - -struct dxWorld; /* dynamics world */ -struct dxSpace; /* collision space */ -struct dxBody; /* rigid body (dynamics object) */ -struct dxGeom; /* geometry (collision object) */ -struct dxJoint; -struct dxJointNode; -struct dxJointGroup; -struct dxWorldProcessThreadingManager; - -typedef struct dxWorld *dWorldID; -typedef struct dxSpace *dSpaceID; -typedef struct dxBody *dBodyID; -typedef struct dxGeom *dGeomID; -typedef struct dxJoint *dJointID; -typedef struct dxJointGroup *dJointGroupID; -typedef struct dxWorldProcessThreadingManager *dWorldStepThreadingManagerID; - -/* error numbers */ - -enum { - d_ERR_UNKNOWN = 0, /* unknown error */ - d_ERR_IASSERT, /* internal assertion failed */ - d_ERR_UASSERT, /* user assertion failed */ - d_ERR_LCP /* user assertion failed */ -}; - - -/* joint type numbers */ - -typedef enum { - dJointTypeNone = 0, /* or "unknown" */ - dJointTypeBall, - dJointTypeHinge, - dJointTypeSlider, - dJointTypeContact, - dJointTypeUniversal, - dJointTypeHinge2, - dJointTypeFixed, - dJointTypeNull, - dJointTypeAMotor, - dJointTypeLMotor, - dJointTypePlane2D, - dJointTypePR, - dJointTypePU, - dJointTypePiston -} dJointType; - - -/* an alternative way of setting joint parameters, using joint parameter - * structures and member constants. we don't actually do this yet. - */ - -/* -typedef struct dLimot { - int mode; - dReal lostop, histop; - dReal vel, fmax; - dReal fudge_factor; - dReal bounce, soft; - dReal suspension_erp, suspension_cfm; -} dLimot; - -enum { - dLimotLoStop = 0x0001, - dLimotHiStop = 0x0002, - dLimotVel = 0x0004, - dLimotFMax = 0x0008, - dLimotFudgeFactor = 0x0010, - dLimotBounce = 0x0020, - dLimotSoft = 0x0040 -}; -*/ - - -/* standard joint parameter names. why are these here? - because we don't want - * to include all the joint function definitions in joint.cpp. hmmmm. - * MSVC complains if we call D_ALL_PARAM_NAMES_X with a blank second argument, - * which is why we have the D_ALL_PARAM_NAMES macro as well. please copy and - * paste between these two. - */ - -#define D_ALL_PARAM_NAMES(start) \ - /* parameters for limits and motors */ \ - dParamLoStop = start, \ - dParamHiStop, \ - dParamVel, \ - dParamFMax, \ - dParamFudgeFactor, \ - dParamBounce, \ - dParamCFM, \ - dParamStopERP, \ - dParamStopCFM, \ - /* parameters for suspension */ \ - dParamSuspensionERP, \ - dParamSuspensionCFM, \ - dParamERP, \ - - ////////////////////////////////////////////////////////////////////////////// - /// \enum D_ALL_PARAM_NAMES_X - /// - /// \var dParamGroup This is the starting value of the different group - /// (i.e. dParamGroup1, dParamGroup2, dParamGroup3) - /// It also helps in the use of parameter - /// (dParamGroup2 | dParamFMax) == dParamFMax2 - ////////////////////////////////////////////////////////////////////////////// -#define D_ALL_PARAM_NAMES_X(start,x) \ - dParamGroup ## x = start, \ - /* parameters for limits and motors */ \ - dParamLoStop ## x = start, \ - dParamHiStop ## x, \ - dParamVel ## x, \ - dParamFMax ## x, \ - dParamFudgeFactor ## x, \ - dParamBounce ## x, \ - dParamCFM ## x, \ - dParamStopERP ## x, \ - dParamStopCFM ## x, \ - /* parameters for suspension */ \ - dParamSuspensionERP ## x, \ - dParamSuspensionCFM ## x, \ - dParamERP ## x, - -enum { - D_ALL_PARAM_NAMES(0) - dParamsInGroup, ///< Number of parameter in a group - D_ALL_PARAM_NAMES_X(0x000,1) - D_ALL_PARAM_NAMES_X(0x100,2) - D_ALL_PARAM_NAMES_X(0x200,3) - - /* add a multiple of this constant to the basic parameter numbers to get - * the parameters for the second, third etc axes. - */ - dParamGroup=0x100 -}; - - -/* angular motor mode numbers */ - -enum { - dAMotorUser = 0, - dAMotorEuler = 1 -}; - - -/* joint force feedback information */ - -typedef struct dJointFeedback { - dVector3 f1; /* force applied to body 1 */ - dVector3 t1; /* torque applied to body 1 */ - dVector3 f2; /* force applied to body 2 */ - dVector3 t2; /* torque applied to body 2 */ -} dJointFeedback; - - -/* private functions that must be implemented by the collision library: - * (1) indicate that a geom has moved, (2) get the next geom in a body list. - * these functions are called whenever the position of geoms connected to a - * body have changed, e.g. with dBodySetPosition(), dBodySetRotation(), or - * when the ODE step function updates the body state. - */ - -void dGeomMoved (dGeomID); -dGeomID dGeomGetBodyNext (dGeomID); - -/** - * dGetConfiguration returns the specific ODE build configuration as - * a string of tokens. The string can be parsed in a similar way to - * the OpenGL extension mechanism, the naming convention should be - * familiar too. The following extensions are reported: - * - * ODE - * ODE_single_precision - * ODE_double_precision - * ODE_EXT_no_debug - * ODE_EXT_trimesh - * ODE_EXT_opcode - * ODE_EXT_gimpact - * ODE_EXT_malloc_not_alloca - * ODE_EXT_gyroscopic - * ODE_OPC_16bit_indices - * ODE_OPC_new_collider -*/ -ODE_API const char* dGetConfiguration (void); - -/** - * Helper to check for a token in the ODE configuration string. - * Caution, this function is case sensitive. - * - * @param token A configuration token, see dGetConfiguration for details - * - * @return 1 if exact token is present, 0 if not present - */ -ODE_API int dCheckConfiguration( const char* token ); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/compatibility.h b/misc/builddeps/dp.linux64/include/ode/compatibility.h deleted file mode 100644 index b3709866..00000000 --- a/misc/builddeps/dp.linux64/include/ode/compatibility.h +++ /dev/null @@ -1,40 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COMPATIBILITY_H_ -#define _ODE_COMPATIBILITY_H_ - -/* - * ODE's backward compatibility system ensures that as ODE's API - * evolves, user code will not break. - */ - -/* - * These new rotation function names are more consistent with the - * rest of the API. - */ -#define dQtoR(q,R) dRfromQ((R),(q)) -#define dRtoQ(R,q) dQfromR((q),(R)) -#define dWtoDQ(w,q,dq) dDQfromW((dq),(w),(q)) - - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/contact.h b/misc/builddeps/dp.linux64/include/ode/contact.h deleted file mode 100644 index 8bb810f5..00000000 --- a/misc/builddeps/dp.linux64/include/ode/contact.h +++ /dev/null @@ -1,104 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_CONTACT_H_ -#define _ODE_CONTACT_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -enum { - dContactMu2 = 0x001, - dContactFDir1 = 0x002, - dContactBounce = 0x004, - dContactSoftERP = 0x008, - dContactSoftCFM = 0x010, - dContactMotion1 = 0x020, - dContactMotion2 = 0x040, - dContactMotionN = 0x080, - dContactSlip1 = 0x100, - dContactSlip2 = 0x200, - - dContactApprox0 = 0x0000, - dContactApprox1_1 = 0x1000, - dContactApprox1_2 = 0x2000, - dContactApprox1 = 0x3000 -}; - - -typedef struct dSurfaceParameters { - /* must always be defined */ - int mode; - dReal mu; - - /* only defined if the corresponding flag is set in mode */ - dReal mu2; - dReal bounce; - dReal bounce_vel; - dReal soft_erp; - dReal soft_cfm; - dReal motion1,motion2,motionN; - dReal slip1,slip2; -} dSurfaceParameters; - - -/** - * @brief Describe the contact point between two geoms. - * - * If two bodies touch, or if a body touches a static feature in its - * environment, the contact is represented by one or more "contact - * points", described by dContactGeom. - * - * The convention is that if body 1 is moved along the normal vector by - * a distance depth (or equivalently if body 2 is moved the same distance - * in the opposite direction) then the contact depth will be reduced to - * zero. This means that the normal vector points "in" to body 1. - * - * @ingroup collide - */ -typedef struct dContactGeom { - dVector3 pos; ///< contact position - dVector3 normal; ///< normal vector - dReal depth; ///< penetration depth - dGeomID g1,g2; ///< the colliding geoms - int side1,side2; ///< (to be documented) -} dContactGeom; - - -/* contact info used by contact joint */ - -typedef struct dContact { - dSurfaceParameters surface; - dContactGeom geom; - dVector3 fdir1; -} dContact; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/error.h b/misc/builddeps/dp.linux64/include/ode/error.h deleted file mode 100644 index 20b9ba45..00000000 --- a/misc/builddeps/dp.linux64/include/ode/error.h +++ /dev/null @@ -1,63 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* this comes from the `reuse' library. copy any changes back to the source */ - -#ifndef _ODE_ERROR_H_ -#define _ODE_ERROR_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* all user defined error functions have this type. error and debug functions - * should not return. - */ -typedef void dMessageFunction (int errnum, const char *msg, va_list ap); - -/* set a new error, debug or warning handler. if fn is 0, the default handlers - * are used. - */ -ODE_API void dSetErrorHandler (dMessageFunction *fn); -ODE_API void dSetDebugHandler (dMessageFunction *fn); -ODE_API void dSetMessageHandler (dMessageFunction *fn); - -/* return the current error, debug or warning handler. if the return value is - * 0, the default handlers are in place. - */ -ODE_API dMessageFunction *dGetErrorHandler(void); -ODE_API dMessageFunction *dGetDebugHandler(void); -ODE_API dMessageFunction *dGetMessageHandler(void); - -/* generate a fatal error, debug trap or a message. */ -ODE_API void dError (int num, const char *msg, ...); -ODE_API void dDebug (int num, const char *msg, ...); -ODE_API void dMessage (int num, const char *msg, ...); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/export-dif.h b/misc/builddeps/dp.linux64/include/ode/export-dif.h deleted file mode 100644 index f6578ac7..00000000 --- a/misc/builddeps/dp.linux64/include/ode/export-dif.h +++ /dev/null @@ -1,40 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_EXPORT_DIF_ -#define _ODE_EXPORT_DIF_ - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - -ODE_API void dWorldExportDIF (dWorldID w, FILE *file, const char *world_name); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/mass.h b/misc/builddeps/dp.linux64/include/ode/mass.h deleted file mode 100644 index d74500c9..00000000 --- a/misc/builddeps/dp.linux64/include/ode/mass.h +++ /dev/null @@ -1,144 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_MASS_H_ -#define _ODE_MASS_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct dMass; -typedef struct dMass dMass; - -/** - * Check if a mass structure has valid value. - * The function check if the mass and innertia matrix are positive definits - * - * @param m A mass structure to check - * - * @return 1 if both codition are met - */ -ODE_API int dMassCheck(const dMass *m); - -ODE_API void dMassSetZero (dMass *); - -ODE_API void dMassSetParameters (dMass *, dReal themass, - dReal cgx, dReal cgy, dReal cgz, - dReal I11, dReal I22, dReal I33, - dReal I12, dReal I13, dReal I23); - -ODE_API void dMassSetSphere (dMass *, dReal density, dReal radius); -ODE_API void dMassSetSphereTotal (dMass *, dReal total_mass, dReal radius); - -ODE_API void dMassSetCapsule (dMass *, dReal density, int direction, - dReal radius, dReal length); -ODE_API void dMassSetCapsuleTotal (dMass *, dReal total_mass, int direction, - dReal radius, dReal length); - -ODE_API void dMassSetCylinder (dMass *, dReal density, int direction, - dReal radius, dReal length); -ODE_API void dMassSetCylinderTotal (dMass *, dReal total_mass, int direction, - dReal radius, dReal length); - -ODE_API void dMassSetBox (dMass *, dReal density, - dReal lx, dReal ly, dReal lz); -ODE_API void dMassSetBoxTotal (dMass *, dReal total_mass, - dReal lx, dReal ly, dReal lz); - -ODE_API void dMassSetTrimesh (dMass *, dReal density, dGeomID g); - -ODE_API void dMassSetTrimeshTotal (dMass *m, dReal total_mass, dGeomID g); - -ODE_API void dMassAdjust (dMass *, dReal newmass); - -ODE_API void dMassTranslate (dMass *, dReal x, dReal y, dReal z); - -ODE_API void dMassRotate (dMass *, const dMatrix3 R); - -ODE_API void dMassAdd (dMass *a, const dMass *b); - - -// Backwards compatible API -ODE_API ODE_API_DEPRECATED void dMassSetCappedCylinder(dMass *a, dReal b, int c, dReal d, dReal e); -ODE_API ODE_API_DEPRECATED void dMassSetCappedCylinderTotal(dMass *a, dReal b, int c, dReal d, dReal e); - - -struct dMass { - dReal mass; - dVector3 c; - dMatrix3 I; - -#ifdef __cplusplus - dMass() - { dMassSetZero (this); } - void setZero() - { dMassSetZero (this); } - void setParameters (dReal themass, dReal cgx, dReal cgy, dReal cgz, - dReal I11, dReal I22, dReal I33, - dReal I12, dReal I13, dReal I23) - { dMassSetParameters (this,themass,cgx,cgy,cgz,I11,I22,I33,I12,I13,I23); } - - void setSphere (dReal density, dReal radius) - { dMassSetSphere (this,density,radius); } - void setSphereTotal (dReal total, dReal radius) - { dMassSetSphereTotal (this,total,radius); } - - void setCapsule (dReal density, int direction, dReal radius, dReal length) - { dMassSetCapsule (this,density,direction,radius,length); } - void setCapsuleTotal (dReal total, int direction, dReal radius, dReal length) - { dMassSetCapsule (this,total,direction,radius,length); } - - void setCylinder(dReal density, int direction, dReal radius, dReal length) - { dMassSetCylinder (this,density,direction,radius,length); } - void setCylinderTotal(dReal total, int direction, dReal radius, dReal length) - { dMassSetCylinderTotal (this,total,direction,radius,length); } - - void setBox (dReal density, dReal lx, dReal ly, dReal lz) - { dMassSetBox (this,density,lx,ly,lz); } - void setBoxTotal (dReal total, dReal lx, dReal ly, dReal lz) - { dMassSetBoxTotal (this,total,lx,ly,lz); } - - void setTrimesh(dReal density, dGeomID g) - { dMassSetTrimesh (this, density, g); } - void setTrimeshTotal(dReal total, dGeomID g) - { dMassSetTrimeshTotal (this, total, g); } - - void adjust (dReal newmass) - { dMassAdjust (this,newmass); } - void translate (dReal x, dReal y, dReal z) - { dMassTranslate (this,x,y,z); } - void rotate (const dMatrix3 R) - { dMassRotate (this,R); } - void add (const dMass *b) - { dMassAdd (this,b); } -#endif -}; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/matrix.h b/misc/builddeps/dp.linux64/include/ode/matrix.h deleted file mode 100644 index e177f44f..00000000 --- a/misc/builddeps/dp.linux64/include/ode/matrix.h +++ /dev/null @@ -1,280 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* optimized and unoptimized vector and matrix functions */ - -#ifndef _ODE_MATRIX_H_ -#define _ODE_MATRIX_H_ - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - -/* set a vector/matrix of size n to all zeros, or to a specific value. */ - -ODE_API void dSetZero (dReal *a, int n); -ODE_API void dSetValue (dReal *a, int n, dReal value); - - -/* get the dot product of two n*1 vectors. if n <= 0 then - * zero will be returned (in which case a and b need not be valid). - */ - -ODE_API dReal dDot (const dReal *a, const dReal *b, int n); - - -/* get the dot products of (a0,b), (a1,b), etc and return them in outsum. - * all vectors are n*1. if n <= 0 then zeroes will be returned (in which case - * the input vectors need not be valid). this function is somewhat faster - * than calling dDot() for all of the combinations separately. - */ - -/* NOT INCLUDED in the library for now. -void dMultidot2 (const dReal *a0, const dReal *a1, - const dReal *b, dReal *outsum, int n); -*/ - - -/* matrix multiplication. all matrices are stored in standard row format. - * the digit refers to the argument that is transposed: - * 0: A = B * C (sizes: A:p*r B:p*q C:q*r) - * 1: A = B' * C (sizes: A:p*r B:q*p C:q*r) - * 2: A = B * C' (sizes: A:p*r B:p*q C:r*q) - * case 1,2 are equivalent to saying that the operation is A=B*C but - * B or C are stored in standard column format. - */ - -ODE_API void dMultiply0 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); -ODE_API void dMultiply1 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); -ODE_API void dMultiply2 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); - - -/* do an in-place cholesky decomposition on the lower triangle of the n*n - * symmetric matrix A (which is stored by rows). the resulting lower triangle - * will be such that L*L'=A. return 1 on success and 0 on failure (on failure - * the matrix is not positive definite). - */ - -ODE_API int dFactorCholesky (dReal *A, int n); - - -/* solve for x: L*L'*x = b, and put the result back into x. - * L is size n*n, b is size n*1. only the lower triangle of L is considered. - */ - -ODE_API void dSolveCholesky (const dReal *L, dReal *b, int n); - - -/* compute the inverse of the n*n positive definite matrix A and put it in - * Ainv. this is not especially fast. this returns 1 on success (A was - * positive definite) or 0 on failure (not PD). - */ - -ODE_API int dInvertPDMatrix (const dReal *A, dReal *Ainv, int n); - - -/* check whether an n*n matrix A is positive definite, return 1/0 (yes/no). - * positive definite means that x'*A*x > 0 for any x. this performs a - * cholesky decomposition of A. if the decomposition fails then the matrix - * is not positive definite. A is stored by rows. A is not altered. - */ - -ODE_API int dIsPositiveDefinite (const dReal *A, int n); - - -/* factorize a matrix A into L*D*L', where L is lower triangular with ones on - * the diagonal, and D is diagonal. - * A is an n*n matrix stored by rows, with a leading dimension of n rounded - * up to 4. L is written into the strict lower triangle of A (the ones are not - * written) and the reciprocal of the diagonal elements of D are written into - * d. - */ -ODE_API void dFactorLDLT (dReal *A, dReal *d, int n, int nskip); - - -/* solve L*x=b, where L is n*n lower triangular with ones on the diagonal, - * and x,b are n*1. b is overwritten with x. - * the leading dimension of L is `nskip'. - */ -ODE_API void dSolveL1 (const dReal *L, dReal *b, int n, int nskip); - - -/* solve L'*x=b, where L is n*n lower triangular with ones on the diagonal, - * and x,b are n*1. b is overwritten with x. - * the leading dimension of L is `nskip'. - */ -ODE_API void dSolveL1T (const dReal *L, dReal *b, int n, int nskip); - - -/* in matlab syntax: a(1:n) = a(1:n) .* d(1:n) */ - -ODE_API void dVectorScale (dReal *a, const dReal *d, int n); - - -/* given `L', a n*n lower triangular matrix with ones on the diagonal, - * and `d', a n*1 vector of the reciprocal diagonal elements of an n*n matrix - * D, solve L*D*L'*x=b where x,b are n*1. x overwrites b. - * the leading dimension of L is `nskip'. - */ - -ODE_API void dSolveLDLT (const dReal *L, const dReal *d, dReal *b, int n, int nskip); - - -/* given an L*D*L' factorization of an n*n matrix A, return the updated - * factorization L2*D2*L2' of A plus the following "top left" matrix: - * - * [ b a' ] <-- b is a[0] - * [ a 0 ] <-- a is a[1..n-1] - * - * - L has size n*n, its leading dimension is nskip. L is lower triangular - * with ones on the diagonal. only the lower triangle of L is referenced. - * - d has size n. d contains the reciprocal diagonal elements of D. - * - a has size n. - * the result is written into L, except that the left column of L and d[0] - * are not actually modified. see ldltaddTL.m for further comments. - */ -ODE_API void dLDLTAddTL (dReal *L, dReal *d, const dReal *a, int n, int nskip); - - -/* given an L*D*L' factorization of a permuted matrix A, produce a new - * factorization for row and column `r' removed. - * - A has size n1*n1, its leading dimension in nskip. A is symmetric and - * positive definite. only the lower triangle of A is referenced. - * A itself may actually be an array of row pointers. - * - L has size n2*n2, its leading dimension in nskip. L is lower triangular - * with ones on the diagonal. only the lower triangle of L is referenced. - * - d has size n2. d contains the reciprocal diagonal elements of D. - * - p is a permutation vector. it contains n2 indexes into A. each index - * must be in the range 0..n1-1. - * - r is the row/column of L to remove. - * the new L will be written within the old L, i.e. will have the same leading - * dimension. the last row and column of L, and the last element of d, are - * undefined on exit. - * - * a fast O(n^2) algorithm is used. see ldltremove.m for further comments. - */ -ODE_API void dLDLTRemove (dReal **A, const int *p, dReal *L, dReal *d, - int n1, int n2, int r, int nskip); - - -/* given an n*n matrix A (with leading dimension nskip), remove the r'th row - * and column by moving elements. the new matrix will have the same leading - * dimension. the last row and column of A are untouched on exit. - */ -ODE_API void dRemoveRowCol (dReal *A, int n, int nskip, int r); - - -#if defined(__ODE__) - -void _dSetZero (dReal *a, size_t n); -void _dSetValue (dReal *a, size_t n, dReal value); -dReal _dDot (const dReal *a, const dReal *b, int n); -void _dMultiply0 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); -void _dMultiply1 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); -void _dMultiply2 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); -int _dFactorCholesky (dReal *A, int n, void *tmpbuf); -void _dSolveCholesky (const dReal *L, dReal *b, int n, void *tmpbuf); -int _dInvertPDMatrix (const dReal *A, dReal *Ainv, int n, void *tmpbuf); -int _dIsPositiveDefinite (const dReal *A, int n, void *tmpbuf); -void _dFactorLDLT (dReal *A, dReal *d, int n, int nskip); -void _dSolveL1 (const dReal *L, dReal *b, int n, int nskip); -void _dSolveL1T (const dReal *L, dReal *b, int n, int nskip); -void _dVectorScale (dReal *a, const dReal *d, int n); -void _dSolveLDLT (const dReal *L, const dReal *d, dReal *b, int n, int nskip); -void _dLDLTAddTL (dReal *L, dReal *d, const dReal *a, int n, int nskip, void *tmpbuf); -void _dLDLTRemove (dReal **A, const int *p, dReal *L, dReal *d, int n1, int n2, int r, int nskip, void *tmpbuf); -void _dRemoveRowCol (dReal *A, int n, int nskip, int r); - -PURE_INLINE size_t _dEstimateFactorCholeskyTmpbufSize(int n) -{ - return dPAD(n) * sizeof(dReal); -} - -PURE_INLINE size_t _dEstimateSolveCholeskyTmpbufSize(int n) -{ - return dPAD(n) * sizeof(dReal); -} - -PURE_INLINE size_t _dEstimateInvertPDMatrixTmpbufSize(int n) -{ - size_t FactorCholesky_size = _dEstimateFactorCholeskyTmpbufSize(n); - size_t SolveCholesky_size = _dEstimateSolveCholeskyTmpbufSize(n); - size_t MaxCholesky_size = FactorCholesky_size > SolveCholesky_size ? FactorCholesky_size : SolveCholesky_size; - return dPAD(n) * (n + 1) * sizeof(dReal) + MaxCholesky_size; -} - -PURE_INLINE size_t _dEstimateIsPositiveDefiniteTmpbufSize(int n) -{ - return dPAD(n) * n * sizeof(dReal) + _dEstimateFactorCholeskyTmpbufSize(n); -} - -PURE_INLINE size_t _dEstimateLDLTAddTLTmpbufSize(int nskip) -{ - return nskip * 2 * sizeof(dReal); -} - -PURE_INLINE size_t _dEstimateLDLTRemoveTmpbufSize(int n2, int nskip) -{ - return n2 * sizeof(dReal) + _dEstimateLDLTAddTLTmpbufSize(nskip); -} - -// For internal use -#define dSetZero(a, n) _dSetZero(a, n) -#define dSetValue(a, n, value) _dSetValue(a, n, value) -#define dDot(a, b, n) _dDot(a, b, n) -#define dMultiply0(A, B, C, p, q, r) _dMultiply0(A, B, C, p, q, r) -#define dMultiply1(A, B, C, p, q, r) _dMultiply1(A, B, C, p, q, r) -#define dMultiply2(A, B, C, p, q, r) _dMultiply2(A, B, C, p, q, r) -#define dFactorCholesky(A, n, tmpbuf) _dFactorCholesky(A, n, tmpbuf) -#define dSolveCholesky(L, b, n, tmpbuf) _dSolveCholesky(L, b, n, tmpbuf) -#define dInvertPDMatrix(A, Ainv, n, tmpbuf) _dInvertPDMatrix(A, Ainv, n, tmpbuf) -#define dIsPositiveDefinite(A, n, tmpbuf) _dIsPositiveDefinite(A, n, tmpbuf) -#define dFactorLDLT(A, d, n, nskip) _dFactorLDLT(A, d, n, nskip) -#define dSolveL1(L, b, n, nskip) _dSolveL1(L, b, n, nskip) -#define dSolveL1T(L, b, n, nskip) _dSolveL1T(L, b, n, nskip) -#define dVectorScale(a, d, n) _dVectorScale(a, d, n) -#define dSolveLDLT(L, d, b, n, nskip) _dSolveLDLT(L, d, b, n, nskip) -#define dLDLTAddTL(L, d, a, n, nskip, tmpbuf) _dLDLTAddTL(L, d, a, n, nskip, tmpbuf) -#define dLDLTRemove(A, p, L, d, n1, n2, r, nskip, tmpbuf) _dLDLTRemove(A, p, L, d, n1, n2, r, nskip, tmpbuf) -#define dRemoveRowCol(A, n, nskip, r) _dRemoveRowCol(A, n, nskip, r) - - -#define dEstimateFactorCholeskyTmpbufSize(n) _dEstimateFactorCholeskyTmpbufSize(n) -#define dEstimateSolveCholeskyTmpbufSize(n) _dEstimateSolveCholeskyTmpbufSize(n) -#define dEstimateInvertPDMatrixTmpbufSize(n) _dEstimateInvertPDMatrixTmpbufSize(n) -#define dEstimateIsPositiveDefiniteTmpbufSize(n) _dEstimateIsPositiveDefiniteTmpbufSize(n) -#define dEstimateLDLTAddTLTmpbufSize(nskip) _dEstimateLDLTAddTLTmpbufSize(nskip) -#define dEstimateLDLTRemoveTmpbufSize(n2, nskip) _dEstimateLDLTRemoveTmpbufSize(n2, nskip) - - -#endif // defined(__ODE__) - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/memory.h b/misc/builddeps/dp.linux64/include/ode/memory.h deleted file mode 100644 index 361061c1..00000000 --- a/misc/builddeps/dp.linux64/include/ode/memory.h +++ /dev/null @@ -1,59 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* this comes from the `reuse' library. copy any changes back to the source */ - -#ifndef _ODE_MEMORY_H_ -#define _ODE_MEMORY_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* function types to allocate and free memory */ -typedef void * dAllocFunction (size_t size); -typedef void * dReallocFunction (void *ptr, size_t oldsize, size_t newsize); -typedef void dFreeFunction (void *ptr, size_t size); - -/* set new memory management functions. if fn is 0, the default handlers are - * used. */ -ODE_API void dSetAllocHandler (dAllocFunction *fn); -ODE_API void dSetReallocHandler (dReallocFunction *fn); -ODE_API void dSetFreeHandler (dFreeFunction *fn); - -/* get current memory management functions */ -ODE_API dAllocFunction *dGetAllocHandler (void); -ODE_API dReallocFunction *dGetReallocHandler (void); -ODE_API dFreeFunction *dGetFreeHandler (void); - -/* allocate and free memory. */ -ODE_API void * dAlloc (size_t size); -ODE_API void * dRealloc (void *ptr, size_t oldsize, size_t newsize); -ODE_API void dFree (void *ptr, size_t size); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/misc.h b/misc/builddeps/dp.linux64/include/ode/misc.h deleted file mode 100644 index 0c55fc5b..00000000 --- a/misc/builddeps/dp.linux64/include/ode/misc.h +++ /dev/null @@ -1,85 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* miscellaneous math functions. these are mostly useful for testing */ - -#ifndef _ODE_MISC_H_ -#define _ODE_MISC_H_ - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - -/* return 1 if the random number generator is working. */ -ODE_API int dTestRand(void); - -/* return next 32 bit random number. this uses a not-very-random linear - * congruential method. - */ -ODE_API unsigned long dRand(void); - -/* get and set the current random number seed. */ -ODE_API unsigned long dRandGetSeed(void); -ODE_API void dRandSetSeed (unsigned long s); - -/* return a random integer between 0..n-1. the distribution will get worse - * as n approaches 2^32. - */ -ODE_API int dRandInt (int n); - -/* return a random real number between 0..1 */ -ODE_API dReal dRandReal(void); - -/* print out a matrix */ -#ifdef __cplusplus -ODE_API void dPrintMatrix (const dReal *A, int n, int m, char *fmt = "%10.4f ", - FILE *f=stdout); -#else -ODE_API void dPrintMatrix (const dReal *A, int n, int m, char *fmt, FILE *f); -#endif - -/* make a random vector with entries between +/- range. A has n elements. */ -ODE_API void dMakeRandomVector (dReal *A, int n, dReal range); - -/* make a random matrix with entries between +/- range. A has size n*m. */ -ODE_API void dMakeRandomMatrix (dReal *A, int n, int m, dReal range); - -/* clear the upper triangle of a square matrix */ -ODE_API void dClearUpperTriangle (dReal *A, int n); - -/* return the maximum element difference between the two n*m matrices */ -ODE_API dReal dMaxDifference (const dReal *A, const dReal *B, int n, int m); - -/* return the maximum element difference between the lower triangle of two - * n*n matrices */ -ODE_API dReal dMaxDifferenceLowerTriangle (const dReal *A, const dReal *B, int n); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/objects.h b/misc/builddeps/dp.linux64/include/ode/objects.h deleted file mode 100644 index 379de010..00000000 --- a/misc/builddeps/dp.linux64/include/ode/objects.h +++ /dev/null @@ -1,2975 +0,0 @@ - - -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_OBJECTS_H_ -#define _ODE_OBJECTS_H_ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup world World - * - * The world object is a container for rigid bodies and joints. Objects in - * different worlds can not interact, for example rigid bodies from two - * different worlds can not collide. - * - * All the objects in a world exist at the same point in time, thus one - * reason to use separate worlds is to simulate systems at different rates. - * Most applications will only need one world. - */ - - -/** - * @brief Create a new, empty world and return its ID number. - * @return an identifier - * @ingroup world - */ -ODE_API dWorldID dWorldCreate(void); - - -/** - * @brief Destroy a world and everything in it. - * - * This includes all bodies, and all joints that are not part of a joint - * group. Joints that are part of a joint group will be deactivated, and - * can be destroyed by calling, for example, dJointGroupEmpty(). - * @ingroup world - * @param world the identifier for the world the be destroyed. - */ -ODE_API void dWorldDestroy (dWorldID world); - - -/** - * @brief Set the world's global gravity vector. - * - * The units are m/s^2, so Earth's gravity vector would be (0,0,-9.81), - * assuming that +z is up. The default is no gravity, i.e. (0,0,0). - * - * @ingroup world - */ -ODE_API void dWorldSetGravity (dWorldID, dReal x, dReal y, dReal z); - - -/** - * @brief Get the gravity vector for a given world. - * @ingroup world - */ -ODE_API void dWorldGetGravity (dWorldID, dVector3 gravity); - - -/** - * @brief Set the global ERP value, that controls how much error - * correction is performed in each time step. - * @ingroup world - * @param dWorldID the identifier of the world. - * @param erp Typical values are in the range 0.1--0.8. The default is 0.2. - */ -ODE_API void dWorldSetERP (dWorldID, dReal erp); - -/** - * @brief Get the error reduction parameter. - * @ingroup world - * @return ERP value - */ -ODE_API dReal dWorldGetERP (dWorldID); - - -/** - * @brief Set the global CFM (constraint force mixing) value. - * @ingroup world - * @param cfm Typical values are in the range @m{10^{-9}} -- 1. - * The default is 10^-5 if single precision is being used, or 10^-10 - * if double precision is being used. - */ -ODE_API void dWorldSetCFM (dWorldID, dReal cfm); - -/** - * @brief Get the constraint force mixing value. - * @ingroup world - * @return CFM value - */ -ODE_API dReal dWorldGetCFM (dWorldID); - - -/** - * @brief Set the world to use shared working memory along with another world. - * - * The worlds allocate working memory internally for simulation stepping. This - * memory is cached among the calls to @c dWordStep and @c dWorldQuickStep. - * Similarly, several worlds can be set up to share this memory caches thus - * reducing overall memory usage by cost of making worlds inappropriate for - * simultaneous simulation in multiple threads. - * - * If null value is passed for @a from_world parameter the world is detached from - * sharing and returns to defaults for working memory, reservation policy and - * memory manager as if just created. This can also be used to enable use of shared - * memory for a world that has already had working memory allocated privately. - * Normally using shared memory after a world has its private working memory allocated - * is prohibited. - * - * Allocation policy used can only increase world's internal reserved memory size - * and never decreases it. @c dWorldCleanupWorkingMemory can be used to release - * working memory for a world in case if number of objects/joint decreases - * significantly in it. - * - * With sharing working memory worlds also automatically share memory reservation - * policy and memory manager. Thus, these parameters need to be customized for - * initial world to be used as sharing source only. - * - * Failure result status means a memory allocation failure. - * - * @param w The world to use the shared memory with. - * @param from_world Null or the world the shared memory is to be used from. - * @returns 1 for success and 0 for failure. - * - * @ingroup world - * @see dWorldCleanupWorkingMemory - * @see dWorldSetStepMemoryReservationPolicy - * @see dWorldSetStepMemoryManager - */ -ODE_API int dWorldUseSharedWorkingMemory(dWorldID w, dWorldID from_world/*=NULL*/); - -/** - * @brief Release internal working memory allocated for world - * - * The worlds allocate working memory internally for simulation stepping. This - * function can be used to free world's internal memory cache in case if number of - * objects/joints in the world decreases significantly. By default, internal - * allocation policy is used to only increase cache size as necessary and never - * decrease it. - * - * If a world shares its working memory with other worlds the cache deletion - * affects all the linked worlds. However the shared status itself remains intact. - * - * The function call does affect neither memory reservation policy nor memory manager. - * - * @param w The world to release working memory for. - * - * @ingroup world - * @see dWorldUseSharedWorkingMemory - * @see dWorldSetStepMemoryReservationPolicy - * @see dWorldSetStepMemoryManager - */ -ODE_API void dWorldCleanupWorkingMemory(dWorldID w); - -#define dWORLDSTEP_RESERVEFACTOR_DEFAULT 1.2f -#define dWORLDSTEP_RESERVESIZE_DEFAULT 65536U - -/** - * @struct dWorldStepReserveInfo - * @brief Memory reservation policy descriptor structure for world stepping functions. - * - * @c struct_size should be assigned the size of the structure. - * - * @c reserve_factor is a quotient that is multiplied by required memory size - * to allocate extra reserve whenever reallocation is needed. - * - * @c reserve_minimum is a minimum size that is checked against whenever reallocation - * is needed to allocate expected working memory minimum at once without extra - * reallocations as number of bodies/joints grows. - * - * @ingroup world - * @see dWorldSetStepMemoryReservationPolicy - */ -typedef struct -{ - unsigned struct_size; - float reserve_factor; // Use float as precision does not matter here - unsigned reserve_minimum; - -} dWorldStepReserveInfo; - -/** - * @brief Set memory reservation policy for world to be used with simulation stepping functions - * - * The function allows to customize reservation policy to be used for internal - * memory which is allocated to aid simulation for a world. By default, values - * of @c dWORLDSTEP_RESERVEFACTOR_DEFAULT and @c dWORLDSTEP_RESERVESIZE_DEFAULT - * are used. - * - * Passing @a policyinfo argument as NULL results in reservation policy being - * reset to defaults as if the world has been just created. The content of - * @a policyinfo structure is copied internally and does not need to remain valid - * after the call returns. - * - * If the world uses working memory sharing, changing memory reservation policy - * affects all the worlds linked together. - * - * Failure result status means a memory allocation failure. - * - * @param w The world to change memory reservation policy for. - * @param policyinfo Null or a pointer to policy descriptor structure. - * @returns 1 for success and 0 for failure. - * - * @ingroup world - * @see dWorldUseSharedWorkingMemory - */ -ODE_API int dWorldSetStepMemoryReservationPolicy(dWorldID w, const dWorldStepReserveInfo *policyinfo/*=NULL*/); - -/** -* @struct dWorldStepMemoryFunctionsInfo -* @brief World stepping memory manager descriptor structure -* -* This structure is intended to define the functions of memory manager to be used -* with world stepping functions. -* -* @c struct_size should be assigned the size of the structure -* -* @c alloc_block is a function to allocate memory block of given size. -* -* @c shrink_block is a function to shrink existing memory block to a smaller size. -* It must preserve the contents of block head while shrinking. The new block size -* is guaranteed to be always less than the existing one. -* -* @c free_block is a function to delete existing memory block. -* -* @ingroup init -* @see dWorldSetStepMemoryManager -*/ -typedef struct -{ - unsigned struct_size; - void *(*alloc_block)(size_t block_size); - void *(*shrink_block)(void *block_pointer, size_t block_current_size, size_t block_smaller_size); - void (*free_block)(void *block_pointer, size_t block_current_size); - -} dWorldStepMemoryFunctionsInfo; - -/** -* @brief Set memory manager for world to be used with simulation stepping functions -* -* The function allows to customize memory manager to be used for internal -* memory allocation during simulation for a world. By default, @c dAlloc/@c dRealloc/@c dFree -* based memory manager is used. -* -* Passing @a memfuncs argument as NULL results in memory manager being -* reset to default one as if the world has been just created. The content of -* @a memfuncs structure is copied internally and does not need to remain valid -* after the call returns. -* -* If the world uses working memory sharing, changing memory manager -* affects all the worlds linked together. -* -* Failure result status means a memory allocation failure. -* -* @param w The world to change memory reservation policy for. -* @param memfuncs Null or a pointer to memory manager descriptor structure. -* @returns 1 for success and 0 for failure. -* -* @ingroup world -* @see dWorldUseSharedWorkingMemory -*/ -ODE_API int dWorldSetStepMemoryManager(dWorldID w, const dWorldStepMemoryFunctionsInfo *memfuncs); - -/** - * @brief Step the world. - * - * This uses a "big matrix" method that takes time on the order of m^3 - * and memory on the order of m^2, where m is the total number of constraint - * rows. For large systems this will use a lot of memory and can be very slow, - * but this is currently the most accurate method. - * - * Failure result status means that the memory allocation has failed for operation. - * In such a case all the objects remain in unchanged state and simulation can be - * retried as soon as more memory is available. - * - * @param w The world to be stepped - * @param stepsize The number of seconds that the simulation has to advance. - * @returns 1 for success and 0 for failure - * - * @ingroup world - */ -ODE_API int dWorldStep (dWorldID w, dReal stepsize); - -/** - * @brief Quick-step the world. - * - * This uses an iterative method that takes time on the order of m*N - * and memory on the order of m, where m is the total number of constraint - * rows N is the number of iterations. - * For large systems this is a lot faster than dWorldStep(), - * but it is less accurate. - * - * QuickStep is great for stacks of objects especially when the - * auto-disable feature is used as well. - * However, it has poor accuracy for near-singular systems. - * Near-singular systems can occur when using high-friction contacts, motors, - * or certain articulated structures. For example, a robot with multiple legs - * sitting on the ground may be near-singular. - * - * There are ways to help overcome QuickStep's inaccuracy problems: - * - * \li Increase CFM. - * \li Reduce the number of contacts in your system (e.g. use the minimum - * number of contacts for the feet of a robot or creature). - * \li Don't use excessive friction in the contacts. - * \li Use contact slip if appropriate - * \li Avoid kinematic loops (however, kinematic loops are inevitable in - * legged creatures). - * \li Don't use excessive motor strength. - * \liUse force-based motors instead of velocity-based motors. - * - * Increasing the number of QuickStep iterations may help a little bit, but - * it is not going to help much if your system is really near singular. - * - * Failure result status means that the memory allocation has failed for operation. - * In such a case all the objects remain in unchanged state and simulation can be - * retried as soon as more memory is available. - * - * @param w The world to be stepped - * @param stepsize The number of seconds that the simulation has to advance. - * @returns 1 for success and 0 for failure - * - * @ingroup world - */ -ODE_API int dWorldQuickStep (dWorldID w, dReal stepsize); - - -/** -* @brief Converts an impulse to a force. -* @ingroup world -* @remarks -* If you want to apply a linear or angular impulse to a rigid body, -* instead of a force or a torque, then you can use this function to convert -* the desired impulse into a force/torque vector before calling the -* BodyAdd... function. -* The current algorithm simply scales the impulse by 1/stepsize, -* where stepsize is the step size for the next step that will be taken. -* This function is given a dWorldID because, in the future, the force -* computation may depend on integrator parameters that are set as -* properties of the world. -*/ -ODE_API void dWorldImpulseToForce -( - dWorldID, dReal stepsize, - dReal ix, dReal iy, dReal iz, dVector3 force - ); - - -/** - * @brief Set the number of iterations that the QuickStep method performs per - * step. - * @ingroup world - * @remarks - * More iterations will give a more accurate solution, but will take - * longer to compute. - * @param num The default is 20 iterations. - */ -ODE_API void dWorldSetQuickStepNumIterations (dWorldID, int num); - - -/** - * @brief Get the number of iterations that the QuickStep method performs per - * step. - * @ingroup world - * @return nr of iterations - */ -ODE_API int dWorldGetQuickStepNumIterations (dWorldID); - -/** - * @brief Set the SOR over-relaxation parameter - * @ingroup world - * @param over_relaxation value to use by SOR - */ -ODE_API void dWorldSetQuickStepW (dWorldID, dReal over_relaxation); - -/** - * @brief Get the SOR over-relaxation parameter - * @ingroup world - * @returns the over-relaxation setting - */ -ODE_API dReal dWorldGetQuickStepW (dWorldID); - -/* World contact parameter functions */ - -/** - * @brief Set the maximum correcting velocity that contacts are allowed - * to generate. - * @ingroup world - * @param vel The default value is infinity (i.e. no limit). - * @remarks - * Reducing this value can help prevent "popping" of deeply embedded objects. - */ -ODE_API void dWorldSetContactMaxCorrectingVel (dWorldID, dReal vel); - -/** - * @brief Get the maximum correcting velocity that contacts are allowed - * to generated. - * @ingroup world - */ -ODE_API dReal dWorldGetContactMaxCorrectingVel (dWorldID); - -/** - * @brief Set the depth of the surface layer around all geometry objects. - * @ingroup world - * @remarks - * Contacts are allowed to sink into the surface layer up to the given - * depth before coming to rest. - * @param depth The default value is zero. - * @remarks - * Increasing this to some small value (e.g. 0.001) can help prevent - * jittering problems due to contacts being repeatedly made and broken. - */ -ODE_API void dWorldSetContactSurfaceLayer (dWorldID, dReal depth); - -/** - * @brief Get the depth of the surface layer around all geometry objects. - * @ingroup world - * @returns the depth - */ -ODE_API dReal dWorldGetContactSurfaceLayer (dWorldID); - - -/** - * @defgroup disable Automatic Enabling and Disabling - * @ingroup world bodies - * - * Every body can be enabled or disabled. Enabled bodies participate in the - * simulation, while disabled bodies are turned off and do not get updated - * during a simulation step. New bodies are always created in the enabled state. - * - * A disabled body that is connected through a joint to an enabled body will be - * automatically re-enabled at the next simulation step. - * - * Disabled bodies do not consume CPU time, therefore to speed up the simulation - * bodies should be disabled when they come to rest. This can be done automatically - * with the auto-disable feature. - * - * If a body has its auto-disable flag turned on, it will automatically disable - * itself when - * @li It has been idle for a given number of simulation steps. - * @li It has also been idle for a given amount of simulation time. - * - * A body is considered to be idle when the magnitudes of both its - * linear average velocity and angular average velocity are below given thresholds. - * The sample size for the average defaults to one and can be disabled by setting - * to zero with - * - * Thus, every body has six auto-disable parameters: an enabled flag, a idle step - * count, an idle time, linear/angular average velocity thresholds, and the - * average samples count. - * - * Newly created bodies get these parameters from world. - */ - -/** - * @brief Get auto disable linear threshold for newly created bodies. - * @ingroup disable - * @return the threshold - */ -ODE_API dReal dWorldGetAutoDisableLinearThreshold (dWorldID); - -/** - * @brief Set auto disable linear threshold for newly created bodies. - * @param linear_threshold default is 0.01 - * @ingroup disable - */ -ODE_API void dWorldSetAutoDisableLinearThreshold (dWorldID, dReal linear_threshold); - -/** - * @brief Get auto disable angular threshold for newly created bodies. - * @ingroup disable - * @return the threshold - */ -ODE_API dReal dWorldGetAutoDisableAngularThreshold (dWorldID); - -/** - * @brief Set auto disable angular threshold for newly created bodies. - * @param linear_threshold default is 0.01 - * @ingroup disable - */ -ODE_API void dWorldSetAutoDisableAngularThreshold (dWorldID, dReal angular_threshold); - -/** - * @brief Get auto disable linear average threshold for newly created bodies. - * @ingroup disable - * @return the threshold - */ -ODE_API dReal dWorldGetAutoDisableLinearAverageThreshold (dWorldID); - -/** - * @brief Set auto disable linear average threshold for newly created bodies. - * @param linear_average_threshold default is 0.01 - * @ingroup disable - */ -ODE_API void dWorldSetAutoDisableLinearAverageThreshold (dWorldID, dReal linear_average_threshold); - -/** - * @brief Get auto disable angular average threshold for newly created bodies. - * @ingroup disable - * @return the threshold - */ -ODE_API dReal dWorldGetAutoDisableAngularAverageThreshold (dWorldID); - -/** - * @brief Set auto disable angular average threshold for newly created bodies. - * @param linear_average_threshold default is 0.01 - * @ingroup disable - */ -ODE_API void dWorldSetAutoDisableAngularAverageThreshold (dWorldID, dReal angular_average_threshold); - -/** - * @brief Get auto disable sample count for newly created bodies. - * @ingroup disable - * @return number of samples used - */ -ODE_API int dWorldGetAutoDisableAverageSamplesCount (dWorldID); - -/** - * @brief Set auto disable average sample count for newly created bodies. - * @ingroup disable - * @param average_samples_count Default is 1, meaning only instantaneous velocity is used. - * Set to zero to disable sampling and thus prevent any body from auto-disabling. - */ -ODE_API void dWorldSetAutoDisableAverageSamplesCount (dWorldID, unsigned int average_samples_count ); - -/** - * @brief Get auto disable steps for newly created bodies. - * @ingroup disable - * @return nr of steps - */ -ODE_API int dWorldGetAutoDisableSteps (dWorldID); - -/** - * @brief Set auto disable steps for newly created bodies. - * @ingroup disable - * @param steps default is 10 - */ -ODE_API void dWorldSetAutoDisableSteps (dWorldID, int steps); - -/** - * @brief Get auto disable time for newly created bodies. - * @ingroup disable - * @return nr of seconds - */ -ODE_API dReal dWorldGetAutoDisableTime (dWorldID); - -/** - * @brief Set auto disable time for newly created bodies. - * @ingroup disable - * @param time default is 0 seconds - */ -ODE_API void dWorldSetAutoDisableTime (dWorldID, dReal time); - -/** - * @brief Get auto disable flag for newly created bodies. - * @ingroup disable - * @return 0 or 1 - */ -ODE_API int dWorldGetAutoDisableFlag (dWorldID); - -/** - * @brief Set auto disable flag for newly created bodies. - * @ingroup disable - * @param do_auto_disable default is false. - */ -ODE_API void dWorldSetAutoDisableFlag (dWorldID, int do_auto_disable); - - -/** - * @defgroup damping Damping - * @ingroup bodies world - * - * Damping serves two purposes: reduce simulation instability, and to allow - * the bodies to come to rest (and possibly auto-disabling them). - * - * Bodies are constructed using the world's current damping parameters. Setting - * the scales to 0 disables the damping. - * - * Here is how it is done: after every time step linear and angular - * velocities are tested against the corresponding thresholds. If they - * are above, they are multiplied by (1 - scale). So a negative scale value - * will actually increase the speed, and values greater than one will - * make the object oscillate every step; both can make the simulation unstable. - * - * To disable damping just set the damping scale to zero. - * - * You can also limit the maximum angular velocity. In contrast to the damping - * functions, the angular velocity is affected before the body is moved. - * This means that it will introduce errors in joints that are forcing the body - * to rotate too fast. Some bodies have naturally high angular velocities - * (like cars' wheels), so you may want to give them a very high (like the default, - * dInfinity) limit. - * - * @note The velocities are damped after the stepper function has moved the - * object. Otherwise the damping could introduce errors in joints. First the - * joint constraints are processed by the stepper (moving the body), then - * the damping is applied. - * - * @note The damping happens right after the moved callback is called; this way - * it still possible use the exact velocities the body has acquired during the - * step. You can even use the callback to create your own customized damping. - */ - -/** - * @brief Get the world's linear damping threshold. - * @ingroup damping - */ -ODE_API dReal dWorldGetLinearDampingThreshold (dWorldID w); - -/** - * @brief Set the world's linear damping threshold. - * @param threshold The damping won't be applied if the linear speed is - * below this threshold. Default is 0.01. - * @ingroup damping - */ -ODE_API void dWorldSetLinearDampingThreshold(dWorldID w, dReal threshold); - -/** - * @brief Get the world's angular damping threshold. - * @ingroup damping - */ -ODE_API dReal dWorldGetAngularDampingThreshold (dWorldID w); - -/** - * @brief Set the world's angular damping threshold. - * @param threshold The damping won't be applied if the angular speed is - * below this threshold. Default is 0.01. - * @ingroup damping - */ -ODE_API void dWorldSetAngularDampingThreshold(dWorldID w, dReal threshold); - -/** - * @brief Get the world's linear damping scale. - * @ingroup damping - */ -ODE_API dReal dWorldGetLinearDamping (dWorldID w); - -/** - * @brief Set the world's linear damping scale. - * @param scale The linear damping scale that is to be applied to bodies. - * Default is 0 (no damping). Should be in the interval [0, 1]. - * @ingroup damping - */ -ODE_API void dWorldSetLinearDamping (dWorldID w, dReal scale); - -/** - * @brief Get the world's angular damping scale. - * @ingroup damping - */ -ODE_API dReal dWorldGetAngularDamping (dWorldID w); - -/** - * @brief Set the world's angular damping scale. - * @param scale The angular damping scale that is to be applied to bodies. - * Default is 0 (no damping). Should be in the interval [0, 1]. - * @ingroup damping - */ -ODE_API void dWorldSetAngularDamping(dWorldID w, dReal scale); - -/** - * @brief Convenience function to set body linear and angular scales. - * @param linear_scale The linear damping scale that is to be applied to bodies. - * @param angular_scale The angular damping scale that is to be applied to bodies. - * @ingroup damping - */ -ODE_API void dWorldSetDamping(dWorldID w, - dReal linear_scale, - dReal angular_scale); - -/** - * @brief Get the default maximum angular speed. - * @ingroup damping - * @sa dBodyGetMaxAngularSpeed() - */ -ODE_API dReal dWorldGetMaxAngularSpeed (dWorldID w); - - -/** - * @brief Set the default maximum angular speed for new bodies. - * @ingroup damping - * @sa dBodySetMaxAngularSpeed() - */ -ODE_API void dWorldSetMaxAngularSpeed (dWorldID w, dReal max_speed); - - - -/** - * @defgroup bodies Rigid Bodies - * - * A rigid body has various properties from the point of view of the - * simulation. Some properties change over time: - * - * @li Position vector (x,y,z) of the body's point of reference. - * Currently the point of reference must correspond to the body's center of mass. - * @li Linear velocity of the point of reference, a vector (vx,vy,vz). - * @li Orientation of a body, represented by a quaternion (qs,qx,qy,qz) or - * a 3x3 rotation matrix. - * @li Angular velocity vector (wx,wy,wz) which describes how the orientation - * changes over time. - * - * Other body properties are usually constant over time: - * - * @li Mass of the body. - * @li Position of the center of mass with respect to the point of reference. - * In the current implementation the center of mass and the point of - * reference must coincide. - * @li Inertia matrix. This is a 3x3 matrix that describes how the body's mass - * is distributed around the center of mass. Conceptually each body has an - * x-y-z coordinate frame embedded in it that moves and rotates with the body. - * - * The origin of this coordinate frame is the body's point of reference. Some values - * in ODE (vectors, matrices etc) are relative to the body coordinate frame, and others - * are relative to the global coordinate frame. - * - * Note that the shape of a rigid body is not a dynamical property (except insofar as - * it influences the various mass properties). It is only collision detection that cares - * about the detailed shape of the body. - */ - - -/** - * @brief Get auto disable linear average threshold. - * @ingroup bodies disable - * @return the threshold - */ -ODE_API dReal dBodyGetAutoDisableLinearThreshold (dBodyID); - -/** - * @brief Set auto disable linear average threshold. - * @ingroup bodies disable - * @return the threshold - */ -ODE_API void dBodySetAutoDisableLinearThreshold (dBodyID, dReal linear_average_threshold); - -/** - * @brief Get auto disable angular average threshold. - * @ingroup bodies disable - * @return the threshold - */ -ODE_API dReal dBodyGetAutoDisableAngularThreshold (dBodyID); - -/** - * @brief Set auto disable angular average threshold. - * @ingroup bodies disable - * @return the threshold - */ -ODE_API void dBodySetAutoDisableAngularThreshold (dBodyID, dReal angular_average_threshold); - -/** - * @brief Get auto disable average size (samples count). - * @ingroup bodies disable - * @return the nr of steps/size. - */ -ODE_API int dBodyGetAutoDisableAverageSamplesCount (dBodyID); - -/** - * @brief Set auto disable average buffer size (average steps). - * @ingroup bodies disable - * @param average_samples_count the nr of samples to review. - */ -ODE_API void dBodySetAutoDisableAverageSamplesCount (dBodyID, unsigned int average_samples_count); - - -/** - * @brief Get auto steps a body must be thought of as idle to disable - * @ingroup bodies disable - * @return the nr of steps - */ -ODE_API int dBodyGetAutoDisableSteps (dBodyID); - -/** - * @brief Set auto disable steps. - * @ingroup bodies disable - * @param steps the nr of steps. - */ -ODE_API void dBodySetAutoDisableSteps (dBodyID, int steps); - -/** - * @brief Get auto disable time. - * @ingroup bodies disable - * @return nr of seconds - */ -ODE_API dReal dBodyGetAutoDisableTime (dBodyID); - -/** - * @brief Set auto disable time. - * @ingroup bodies disable - * @param time nr of seconds. - */ -ODE_API void dBodySetAutoDisableTime (dBodyID, dReal time); - -/** - * @brief Get auto disable flag. - * @ingroup bodies disable - * @return 0 or 1 - */ -ODE_API int dBodyGetAutoDisableFlag (dBodyID); - -/** - * @brief Set auto disable flag. - * @ingroup bodies disable - * @param do_auto_disable 0 or 1 - */ -ODE_API void dBodySetAutoDisableFlag (dBodyID, int do_auto_disable); - -/** - * @brief Set auto disable defaults. - * @remarks - * Set the values for the body to those set as default for the world. - * @ingroup bodies disable - */ -ODE_API void dBodySetAutoDisableDefaults (dBodyID); - - -/** - * @brief Retrieves the world attached to te given body. - * @remarks - * - * @ingroup bodies - */ -ODE_API dWorldID dBodyGetWorld (dBodyID); - -/** - * @brief Create a body in given world. - * @remarks - * Default mass parameters are at position (0,0,0). - * @ingroup bodies - */ -ODE_API dBodyID dBodyCreate (dWorldID); - -/** - * @brief Destroy a body. - * @remarks - * All joints that are attached to this body will be put into limbo: - * i.e. unattached and not affecting the simulation, but they will NOT be - * deleted. - * @ingroup bodies - */ -ODE_API void dBodyDestroy (dBodyID); - -/** - * @brief Set the body's user-data pointer. - * @ingroup bodies - * @param data arbitraty pointer - */ -ODE_API void dBodySetData (dBodyID, void *data); - -/** - * @brief Get the body's user-data pointer. - * @ingroup bodies - * @return a pointer to the user's data. - */ -ODE_API void *dBodyGetData (dBodyID); - -/** - * @brief Set position of a body. - * @remarks - * After setting, the outcome of the simulation is undefined - * if the new configuration is inconsistent with the joints/constraints - * that are present. - * @ingroup bodies - */ -ODE_API void dBodySetPosition (dBodyID, dReal x, dReal y, dReal z); - -/** - * @brief Set the orientation of a body. - * @ingroup bodies - * @remarks - * After setting, the outcome of the simulation is undefined - * if the new configuration is inconsistent with the joints/constraints - * that are present. - */ -ODE_API void dBodySetRotation (dBodyID, const dMatrix3 R); - -/** - * @brief Set the orientation of a body. - * @ingroup bodies - * @remarks - * After setting, the outcome of the simulation is undefined - * if the new configuration is inconsistent with the joints/constraints - * that are present. - */ -ODE_API void dBodySetQuaternion (dBodyID, const dQuaternion q); - -/** - * @brief Set the linear velocity of a body. - * @ingroup bodies - */ -ODE_API void dBodySetLinearVel (dBodyID, dReal x, dReal y, dReal z); - -/** - * @brief Set the angular velocity of a body. - * @ingroup bodies - */ -ODE_API void dBodySetAngularVel (dBodyID, dReal x, dReal y, dReal z); - -/** - * @brief Get the position of a body. - * @ingroup bodies - * @remarks - * When getting, the returned values are pointers to internal data structures, - * so the vectors are valid until any changes are made to the rigid body - * system structure. - * @sa dBodyCopyPosition - */ -ODE_API const dReal * dBodyGetPosition (dBodyID); - - -/** - * @brief Copy the position of a body into a vector. - * @ingroup bodies - * @param body the body to query - * @param pos a copy of the body position - * @sa dBodyGetPosition - */ -ODE_API void dBodyCopyPosition (dBodyID body, dVector3 pos); - - -/** - * @brief Get the rotation of a body. - * @ingroup bodies - * @return pointer to a 4x3 rotation matrix. - */ -ODE_API const dReal * dBodyGetRotation (dBodyID); - - -/** - * @brief Copy the rotation of a body. - * @ingroup bodies - * @param body the body to query - * @param R a copy of the rotation matrix - * @sa dBodyGetRotation - */ -ODE_API void dBodyCopyRotation (dBodyID, dMatrix3 R); - - -/** - * @brief Get the rotation of a body. - * @ingroup bodies - * @return pointer to 4 scalars that represent the quaternion. - */ -ODE_API const dReal * dBodyGetQuaternion (dBodyID); - - -/** - * @brief Copy the orientation of a body into a quaternion. - * @ingroup bodies - * @param body the body to query - * @param quat a copy of the orientation quaternion - * @sa dBodyGetQuaternion - */ -ODE_API void dBodyCopyQuaternion(dBodyID body, dQuaternion quat); - - -/** - * @brief Get the linear velocity of a body. - * @ingroup bodies - */ -ODE_API const dReal * dBodyGetLinearVel (dBodyID); - -/** - * @brief Get the angular velocity of a body. - * @ingroup bodies - */ -ODE_API const dReal * dBodyGetAngularVel (dBodyID); - -/** - * @brief Set the mass of a body. - * @ingroup bodies - */ -ODE_API void dBodySetMass (dBodyID, const dMass *mass); - -/** - * @brief Get the mass of a body. - * @ingroup bodies - */ -ODE_API void dBodyGetMass (dBodyID, dMass *mass); - -/** - * @brief Add force at centre of mass of body in absolute coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddForce (dBodyID, dReal fx, dReal fy, dReal fz); - -/** - * @brief Add torque at centre of mass of body in absolute coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddTorque (dBodyID, dReal fx, dReal fy, dReal fz); - -/** - * @brief Add force at centre of mass of body in coordinates relative to body. - * @ingroup bodies - */ -ODE_API void dBodyAddRelForce (dBodyID, dReal fx, dReal fy, dReal fz); - -/** - * @brief Add torque at centre of mass of body in coordinates relative to body. - * @ingroup bodies - */ -ODE_API void dBodyAddRelTorque (dBodyID, dReal fx, dReal fy, dReal fz); - -/** - * @brief Add force at specified point in body in global coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); -/** - * @brief Add force at specified point in body in local coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); -/** - * @brief Add force at specified point in body in global coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddRelForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); -/** - * @brief Add force at specified point in body in local coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddRelForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); - -/** - * @brief Return the current accumulated force vector. - * @return points to an array of 3 reals. - * @remarks - * The returned values are pointers to internal data structures, so - * the vectors are only valid until any changes are made to the rigid - * body system. - * @ingroup bodies - */ -ODE_API const dReal * dBodyGetForce (dBodyID); - -/** - * @brief Return the current accumulated torque vector. - * @return points to an array of 3 reals. - * @remarks - * The returned values are pointers to internal data structures, so - * the vectors are only valid until any changes are made to the rigid - * body system. - * @ingroup bodies - */ -ODE_API const dReal * dBodyGetTorque (dBodyID); - -/** - * @brief Set the body force accumulation vector. - * @remarks - * This is mostly useful to zero the force and torque for deactivated bodies - * before they are reactivated, in the case where the force-adding functions - * were called on them while they were deactivated. - * @ingroup bodies - */ -ODE_API void dBodySetForce (dBodyID b, dReal x, dReal y, dReal z); - -/** - * @brief Set the body torque accumulation vector. - * @remarks - * This is mostly useful to zero the force and torque for deactivated bodies - * before they are reactivated, in the case where the force-adding functions - * were called on them while they were deactivated. - * @ingroup bodies - */ -ODE_API void dBodySetTorque (dBodyID b, dReal x, dReal y, dReal z); - -/** - * @brief Get world position of a relative point on body. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyGetRelPointPos -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Get velocity vector in global coords of a relative point on body. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyGetRelPointVel -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Get velocity vector in global coords of a globally - * specified point on a body. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyGetPointVel -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief takes a point in global coordinates and returns - * the point's position in body-relative coordinates. - * @remarks - * This is the inverse of dBodyGetRelPointPos() - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyGetPosRelPoint -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Convert from local to world coordinates. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyVectorToWorld -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Convert from world to local coordinates. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyVectorFromWorld -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief controls the way a body's orientation is updated at each timestep. - * @ingroup bodies - * @param mode can be 0 or 1: - * \li 0: An ``infinitesimal'' orientation update is used. - * This is fast to compute, but it can occasionally cause inaccuracies - * for bodies that are rotating at high speed, especially when those - * bodies are joined to other bodies. - * This is the default for every new body that is created. - * \li 1: A ``finite'' orientation update is used. - * This is more costly to compute, but will be more accurate for high - * speed rotations. - * @remarks - * Note however that high speed rotations can result in many types of - * error in a simulation, and the finite mode will only fix one of those - * sources of error. - */ -ODE_API void dBodySetFiniteRotationMode (dBodyID, int mode); - -/** - * @brief sets the finite rotation axis for a body. - * @ingroup bodies - * @remarks - * This is axis only has meaning when the finite rotation mode is set - * If this axis is zero (0,0,0), full finite rotations are performed on - * the body. - * If this axis is nonzero, the body is rotated by performing a partial finite - * rotation along the axis direction followed by an infinitesimal rotation - * along an orthogonal direction. - * @remarks - * This can be useful to alleviate certain sources of error caused by quickly - * spinning bodies. For example, if a car wheel is rotating at high speed - * you can call this function with the wheel's hinge axis as the argument to - * try and improve its behavior. - */ -ODE_API void dBodySetFiniteRotationAxis (dBodyID, dReal x, dReal y, dReal z); - -/** - * @brief Get the way a body's orientation is updated each timestep. - * @ingroup bodies - * @return the mode 0 (infitesimal) or 1 (finite). - */ -ODE_API int dBodyGetFiniteRotationMode (dBodyID); - -/** - * @brief Get the finite rotation axis. - * @param result will contain the axis. - * @ingroup bodies - */ -ODE_API void dBodyGetFiniteRotationAxis (dBodyID, dVector3 result); - -/** - * @brief Get the number of joints that are attached to this body. - * @ingroup bodies - * @return nr of joints - */ -ODE_API int dBodyGetNumJoints (dBodyID b); - -/** - * @brief Return a joint attached to this body, given by index. - * @ingroup bodies - * @param index valid range is 0 to n-1 where n is the value returned by - * dBodyGetNumJoints(). - */ -ODE_API dJointID dBodyGetJoint (dBodyID, int index); - - - - -/** - * @brief Set rigid body to dynamic state (default). - * @param dBodyID identification of body. - * @ingroup bodies - */ -ODE_API void dBodySetDynamic (dBodyID); - -/** - * @brief Set rigid body to kinematic state. - * When in kinematic state the body isn't simulated as a dynamic - * body (it's "unstoppable", doesn't respond to forces), - * but can still affect dynamic bodies (e.g. in joints). - * Kinematic bodies can be controlled by position and velocity. - * @note A kinematic body has infinite mass. If you set its mass - * to something else, it loses the kinematic state and behaves - * as a normal dynamic body. - * @param dBodyID identification of body. - * @ingroup bodies - */ -ODE_API void dBodySetKinematic (dBodyID); - -/** - * @brief Check wether a body is in kinematic state. - * @ingroup bodies - * @return 1 if a body is kinematic or 0 if it is dynamic. - */ -ODE_API int dBodyIsKinematic (dBodyID); - -/** - * @brief Manually enable a body. - * @param dBodyID identification of body. - * @ingroup bodies - */ -ODE_API void dBodyEnable (dBodyID); - -/** - * @brief Manually disable a body. - * @ingroup bodies - * @remarks - * A disabled body that is connected through a joint to an enabled body will - * be automatically re-enabled at the next simulation step. - */ -ODE_API void dBodyDisable (dBodyID); - -/** - * @brief Check wether a body is enabled. - * @ingroup bodies - * @return 1 if a body is currently enabled or 0 if it is disabled. - */ -ODE_API int dBodyIsEnabled (dBodyID); - -/** - * @brief Set whether the body is influenced by the world's gravity or not. - * @ingroup bodies - * @param mode when nonzero gravity affects this body. - * @remarks - * Newly created bodies are always influenced by the world's gravity. - */ -ODE_API void dBodySetGravityMode (dBodyID b, int mode); - -/** - * @brief Get whether the body is influenced by the world's gravity or not. - * @ingroup bodies - * @return nonzero means gravity affects this body. - */ -ODE_API int dBodyGetGravityMode (dBodyID b); - -/** - * @brief Set the 'moved' callback of a body. - * - * Whenever a body has its position or rotation changed during the - * timestep, the callback will be called (with body as the argument). - * Use it to know which body may need an update in an external - * structure (like a 3D engine). - * - * @param b the body that needs to be watched. - * @param callback the callback to be invoked when the body moves. Set to zero - * to disable. - * @ingroup bodies - */ -ODE_API void dBodySetMovedCallback(dBodyID b, void (*callback)(dBodyID)); - - -/** - * @brief Return the first geom associated with the body. - * - * You can traverse through the geoms by repeatedly calling - * dBodyGetNextGeom(). - * - * @return the first geom attached to this body, or 0. - * @ingroup bodies - */ -ODE_API dGeomID dBodyGetFirstGeom (dBodyID b); - - -/** - * @brief returns the next geom associated with the same body. - * @param g a geom attached to some body. - * @return the next geom attached to the same body, or 0. - * @sa dBodyGetFirstGeom - * @ingroup bodies - */ -ODE_API dGeomID dBodyGetNextGeom (dGeomID g); - - -/** - * @brief Resets the damping settings to the current world's settings. - * @ingroup bodies damping - */ -ODE_API void dBodySetDampingDefaults(dBodyID b); - -/** - * @brief Get the body's linear damping scale. - * @ingroup bodies damping - */ -ODE_API dReal dBodyGetLinearDamping (dBodyID b); - -/** - * @brief Set the body's linear damping scale. - * @param scale The linear damping scale. Should be in the interval [0, 1]. - * @ingroup bodies damping - * @remarks From now on the body will not use the world's linear damping - * scale until dBodySetDampingDefaults() is called. - * @sa dBodySetDampingDefaults() - */ -ODE_API void dBodySetLinearDamping(dBodyID b, dReal scale); - -/** - * @brief Get the body's angular damping scale. - * @ingroup bodies damping - * @remarks If the body's angular damping scale was not set, this function - * returns the world's angular damping scale. - */ -ODE_API dReal dBodyGetAngularDamping (dBodyID b); - -/** - * @brief Set the body's angular damping scale. - * @param scale The angular damping scale. Should be in the interval [0, 1]. - * @ingroup bodies damping - * @remarks From now on the body will not use the world's angular damping - * scale until dBodyResetAngularDamping() is called. - * @sa dBodyResetAngularDamping() - */ -ODE_API void dBodySetAngularDamping(dBodyID b, dReal scale); - -/** - * @brief Convenience function to set linear and angular scales at once. - * @param linear_scale The linear damping scale. Should be in the interval [0, 1]. - * @param angular_scale The angular damping scale. Should be in the interval [0, 1]. - * @ingroup bodies damping - * @sa dBodySetLinearDamping() dBodySetAngularDamping() - */ -ODE_API void dBodySetDamping(dBodyID b, dReal linear_scale, dReal angular_scale); - -/** - * @brief Get the body's linear damping threshold. - * @ingroup bodies damping - */ -ODE_API dReal dBodyGetLinearDampingThreshold (dBodyID b); - -/** - * @brief Set the body's linear damping threshold. - * @param threshold The linear threshold to be used. Damping - * is only applied if the linear speed is above this limit. - * @ingroup bodies damping - */ -ODE_API void dBodySetLinearDampingThreshold(dBodyID b, dReal threshold); - -/** - * @brief Get the body's angular damping threshold. - * @ingroup bodies damping - */ -ODE_API dReal dBodyGetAngularDampingThreshold (dBodyID b); - -/** - * @brief Set the body's angular damping threshold. - * @param threshold The angular threshold to be used. Damping is - * only used if the angular speed is above this limit. - * @ingroup bodies damping - */ -ODE_API void dBodySetAngularDampingThreshold(dBodyID b, dReal threshold); - -/** - * @brief Get the body's maximum angular speed. - * @ingroup damping bodies - * @sa dWorldGetMaxAngularSpeed() - */ -ODE_API dReal dBodyGetMaxAngularSpeed (dBodyID b); - -/** - * @brief Set the body's maximum angular speed. - * @ingroup damping bodies - * @sa dWorldSetMaxAngularSpeed() dBodyResetMaxAngularSpeed() - * The default value is dInfinity, but it's a good idea to limit - * it at less than 500 if the body has the gyroscopic term - * enabled. - */ -ODE_API void dBodySetMaxAngularSpeed(dBodyID b, dReal max_speed); - - - -/** - * @brief Get the body's gyroscopic state. - * - * @return nonzero if gyroscopic term computation is enabled (default), - * zero otherwise. - * @ingroup bodies - */ -ODE_API int dBodyGetGyroscopicMode(dBodyID b); - - -/** - * @brief Enable/disable the body's gyroscopic term. - * - * Disabling the gyroscopic term of a body usually improves - * stability. It also helps turning spining objects, like cars' - * wheels. - * - * @param enabled nonzero (default) to enable gyroscopic term, 0 - * to disable. - * @ingroup bodies - */ -ODE_API void dBodySetGyroscopicMode(dBodyID b, int enabled); - - - - -/** - * @defgroup joints Joints - * - * In real life a joint is something like a hinge, that is used to connect two - * objects. - * In ODE a joint is very similar: It is a relationship that is enforced between - * two bodies so that they can only have certain positions and orientations - * relative to each other. - * This relationship is called a constraint -- the words joint and - * constraint are often used interchangeably. - * - * A joint has a set of parameters that can be set. These include: - * - * - * \li dParamLoStop Low stop angle or position. Setting this to - * -dInfinity (the default value) turns off the low stop. - * For rotational joints, this stop must be greater than -pi to be - * effective. - * \li dParamHiStop High stop angle or position. Setting this to - * dInfinity (the default value) turns off the high stop. - * For rotational joints, this stop must be less than pi to be - * effective. - * If the high stop is less than the low stop then both stops will - * be ineffective. - * \li dParamVel Desired motor velocity (this will be an angular or - * linear velocity). - * \li dParamFMax The maximum force or torque that the motor will use to - * achieve the desired velocity. - * This must always be greater than or equal to zero. - * Setting this to zero (the default value) turns off the motor. - * \li dParamFudgeFactor The current joint stop/motor implementation has - * a small problem: - * when the joint is at one stop and the motor is set to move it away - * from the stop, too much force may be applied for one time step, - * causing a ``jumping'' motion. - * This fudge factor is used to scale this excess force. - * It should have a value between zero and one (the default value). - * If the jumping motion is too visible in a joint, the value can be - * reduced. - * Making this value too small can prevent the motor from being able to - * move the joint away from a stop. - * \li dParamBounce The bouncyness of the stops. - * This is a restitution parameter in the range 0..1. - * 0 means the stops are not bouncy at all, 1 means maximum bouncyness. - * \li dParamCFM The constraint force mixing (CFM) value used when not - * at a stop. - * \li dParamStopERP The error reduction parameter (ERP) used by the - * stops. - * \li dParamStopCFM The constraint force mixing (CFM) value used by the - * stops. Together with the ERP value this can be used to get spongy or - * soft stops. - * Note that this is intended for unpowered joints, it does not really - * work as expected when a powered joint reaches its limit. - * \li dParamSuspensionERP Suspension error reduction parameter (ERP). - * Currently this is only implemented on the hinge-2 joint. - * \li dParamSuspensionCFM Suspension constraint force mixing (CFM) value. - * Currently this is only implemented on the hinge-2 joint. - * - * If a particular parameter is not implemented by a given joint, setting it - * will have no effect. - * These parameter names can be optionally followed by a digit (2 or 3) - * to indicate the second or third set of parameters, e.g. for the second axis - * in a hinge-2 joint, or the third axis in an AMotor joint. - */ - - -/** - * @brief Create a new joint of the ball type. - * @ingroup joints - * @remarks - * The joint is initially in "limbo" (i.e. it has no effect on the simulation) - * because it does not connect to any bodies. - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateBall (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the hinge type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateHinge (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the slider type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateSlider (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the contact type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateContact (dWorldID, dJointGroupID, const dContact *); - -/** - * @brief Create a new joint of the hinge2 type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateHinge2 (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the universal type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateUniversal (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the PR (Prismatic and Rotoide) type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreatePR (dWorldID, dJointGroupID); - - /** - * @brief Create a new joint of the PU (Prismatic and Universal) type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ - ODE_API dJointID dJointCreatePU (dWorldID, dJointGroupID); - - /** - * @brief Create a new joint of the Piston type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given - * joint group. - */ - ODE_API dJointID dJointCreatePiston (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the fixed type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateFixed (dWorldID, dJointGroupID); - -ODE_API dJointID dJointCreateNull (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the A-motor type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateAMotor (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the L-motor type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateLMotor (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the plane-2d type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreatePlane2D (dWorldID, dJointGroupID); - -/** - * @brief Destroy a joint. - * @ingroup joints - * - * disconnects it from its attached bodies and removing it from the world. - * However, if the joint is a member of a group then this function has no - * effect - to destroy that joint the group must be emptied or destroyed. - */ -ODE_API void dJointDestroy (dJointID); - - -/** - * @brief Create a joint group - * @ingroup joints - * @param max_size deprecated. Set to 0. - */ -ODE_API dJointGroupID dJointGroupCreate (int max_size); - -/** - * @brief Destroy a joint group. - * @ingroup joints - * - * All joints in the joint group will be destroyed. - */ -ODE_API void dJointGroupDestroy (dJointGroupID); - -/** - * @brief Empty a joint group. - * @ingroup joints - * - * All joints in the joint group will be destroyed, - * but the joint group itself will not be destroyed. - */ -ODE_API void dJointGroupEmpty (dJointGroupID); - -/** - * @brief Return the number of bodies attached to the joint - * @ingroup joints - */ -ODE_API int dJointGetNumBodies(dJointID); - -/** - * @brief Attach the joint to some new bodies. - * @ingroup joints - * - * If the joint is already attached, it will be detached from the old bodies - * first. - * To attach this joint to only one body, set body1 or body2 to zero - a zero - * body refers to the static environment. - * Setting both bodies to zero puts the joint into "limbo", i.e. it will - * have no effect on the simulation. - * @remarks - * Some joints, like hinge-2 need to be attached to two bodies to work. - */ -ODE_API void dJointAttach (dJointID, dBodyID body1, dBodyID body2); - -/** - * @brief Manually enable a joint. - * @param dJointID identification of joint. - * @ingroup joints - */ -ODE_API void dJointEnable (dJointID); - -/** - * @brief Manually disable a joint. - * @ingroup joints - * @remarks - * A disabled joint will not affect the simulation, but will maintain the anchors and - * axes so it can be enabled later. - */ -ODE_API void dJointDisable (dJointID); - -/** - * @brief Check wether a joint is enabled. - * @ingroup joints - * @return 1 if a joint is currently enabled or 0 if it is disabled. - */ -ODE_API int dJointIsEnabled (dJointID); - -/** - * @brief Set the user-data pointer - * @ingroup joints - */ -ODE_API void dJointSetData (dJointID, void *data); - -/** - * @brief Get the user-data pointer - * @ingroup joints - */ -ODE_API void *dJointGetData (dJointID); - -/** - * @brief Get the type of the joint - * @ingroup joints - * @return the type, being one of these: - * \li dJointTypeBall - * \li dJointTypeHinge - * \li dJointTypeSlider - * \li dJointTypeContact - * \li dJointTypeUniversal - * \li dJointTypeHinge2 - * \li dJointTypeFixed - * \li dJointTypeNull - * \li dJointTypeAMotor - * \li dJointTypeLMotor - * \li dJointTypePlane2D - * \li dJointTypePR - * \li dJointTypePU - * \li dJointTypePiston - */ -ODE_API dJointType dJointGetType (dJointID); - -/** - * @brief Return the bodies that this joint connects. - * @ingroup joints - * @param index return the first (0) or second (1) body. - * @remarks - * If one of these returned body IDs is zero, the joint connects the other body - * to the static environment. - * If both body IDs are zero, the joint is in ``limbo'' and has no effect on - * the simulation. - */ -ODE_API dBodyID dJointGetBody (dJointID, int index); - -/** - * @brief Sets the datastructure that is to receive the feedback. - * - * The feedback can be used by the user, so that it is known how - * much force an individual joint exerts. - * @ingroup joints - */ -ODE_API void dJointSetFeedback (dJointID, dJointFeedback *); - -/** - * @brief Gets the datastructure that is to receive the feedback. - * @ingroup joints - */ -ODE_API dJointFeedback *dJointGetFeedback (dJointID); - -/** - * @brief Set the joint anchor point. - * @ingroup joints - * - * The joint will try to keep this point on each body - * together. The input is specified in world coordinates. - */ -ODE_API void dJointSetBallAnchor (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief Set the joint anchor point. - * @ingroup joints - */ -ODE_API void dJointSetBallAnchor2 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief Param setting for Ball joints - * @ingroup joints - */ -ODE_API void dJointSetBallParam (dJointID, int parameter, dReal value); - -/** - * @brief Set hinge anchor parameter. - * @ingroup joints - */ -ODE_API void dJointSetHingeAnchor (dJointID, dReal x, dReal y, dReal z); - -ODE_API void dJointSetHingeAnchorDelta (dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); - -/** - * @brief Set hinge axis. - * @ingroup joints - */ -ODE_API void dJointSetHingeAxis (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief Set the Hinge axis as if the 2 bodies were already at angle appart. - * @ingroup joints - * - * This function initialize the Axis and the relative orientation of each body - * as if body1 was rotated around the axis by the angle value. \br - * Ex: - *
- * dJointSetHingeAxis(jId, 1, 0, 0);
- * // If you request the position you will have: dJointGetHingeAngle(jId) == 0
- * dJointSetHingeAxisDelta(jId, 1, 0, 0, 0.23);
- * // If you request the position you will have: dJointGetHingeAngle(jId) == 0.23
- * 
- - * @param j The Hinge joint ID for which the axis will be set - * @param x The X component of the axis in world frame - * @param y The Y component of the axis in world frame - * @param z The Z component of the axis in world frame - * @param angle The angle for the offset of the relative orientation. - * As if body1 was rotated by angle when the Axis was set (see below). - * The rotation is around the new Hinge axis. - * - * @note Usually the function dJointSetHingeAxis set the current position of body1 - * and body2 as the zero angle position. This function set the current position - * as the if the 2 bodies where \b angle appart. - * @warning Calling dJointSetHingeAnchor or dJointSetHingeAxis will reset the "zero" - * angle position. - */ -ODE_API void dJointSetHingeAxisOffset (dJointID j, dReal x, dReal y, dReal z, dReal angle); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetHingeParam (dJointID, int parameter, dReal value); - -/** - * @brief Applies the torque about the hinge axis. - * - * That is, it applies a torque with specified magnitude in the direction - * of the hinge axis, to body 1, and with the same magnitude but in opposite - * direction to body 2. This function is just a wrapper for dBodyAddTorque()} - * @ingroup joints - */ -ODE_API void dJointAddHingeTorque(dJointID joint, dReal torque); - -/** - * @brief set the joint axis - * @ingroup joints - */ -ODE_API void dJointSetSliderAxis (dJointID, dReal x, dReal y, dReal z); - -/** - * @ingroup joints - */ -ODE_API void dJointSetSliderAxisDelta (dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetSliderParam (dJointID, int parameter, dReal value); - -/** - * @brief Applies the given force in the slider's direction. - * - * That is, it applies a force with specified magnitude, in the direction of - * slider's axis, to body1, and with the same magnitude but opposite - * direction to body2. This function is just a wrapper for dBodyAddForce(). - * @ingroup joints - */ -ODE_API void dJointAddSliderForce(dJointID joint, dReal force); - -/** - * @brief set anchor - * @ingroup joints - */ -ODE_API void dJointSetHinge2Anchor (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetHinge2Axis1 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetHinge2Axis2 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetHinge2Param (dJointID, int parameter, dReal value); - -/** - * @brief Applies torque1 about the hinge2's axis 1, torque2 about the - * hinge2's axis 2. - * @remarks This function is just a wrapper for dBodyAddTorque(). - * @ingroup joints - */ -ODE_API void dJointAddHinge2Torques(dJointID joint, dReal torque1, dReal torque2); - -/** - * @brief set anchor - * @ingroup joints - */ -ODE_API void dJointSetUniversalAnchor (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetUniversalAxis1 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief Set the Universal axis1 as if the 2 bodies were already at - * offset1 and offset2 appart with respect to axis1 and axis2. - * @ingroup joints - * - * This function initialize the axis1 and the relative orientation of - * each body as if body1 was rotated around the new axis1 by the offset1 - * value and as if body2 was rotated around the axis2 by offset2. \br - * Ex: -*
- * dJointSetHuniversalAxis1(jId, 1, 0, 0);
- * // If you request the position you will have: dJointGetUniversalAngle1(jId) == 0
- * // If you request the position you will have: dJointGetUniversalAngle2(jId) == 0
- * dJointSetHuniversalAxis1Offset(jId, 1, 0, 0, 0.2, 0.17);
- * // If you request the position you will have: dJointGetUniversalAngle1(jId) == 0.2
- * // If you request the position you will have: dJointGetUniversalAngle2(jId) == 0.17
- * 
- * - * @param j The Hinge joint ID for which the axis will be set - * @param x The X component of the axis in world frame - * @param y The Y component of the axis in world frame - * @param z The Z component of the axis in world frame - * @param angle The angle for the offset of the relative orientation. - * As if body1 was rotated by angle when the Axis was set (see below). - * The rotation is around the new Hinge axis. - * - * @note Usually the function dJointSetHingeAxis set the current position of body1 - * and body2 as the zero angle position. This function set the current position - * as the if the 2 bodies where \b offsets appart. - * - * @note Any previous offsets are erased. - * - * @warning Calling dJointSetUniversalAnchor, dJointSetUnivesalAxis1, - * dJointSetUniversalAxis2, dJointSetUniversalAxis2Offset - * will reset the "zero" angle position. - */ -ODE_API void dJointSetUniversalAxis1Offset (dJointID, dReal x, dReal y, dReal z, - dReal offset1, dReal offset2); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetUniversalAxis2 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief Set the Universal axis2 as if the 2 bodies were already at - * offset1 and offset2 appart with respect to axis1 and axis2. - * @ingroup joints - * - * This function initialize the axis2 and the relative orientation of - * each body as if body1 was rotated around the axis1 by the offset1 - * value and as if body2 was rotated around the new axis2 by offset2. \br - * Ex: - *
- * dJointSetHuniversalAxis2(jId, 0, 1, 0);
- * // If you request the position you will have: dJointGetUniversalAngle1(jId) == 0
- * // If you request the position you will have: dJointGetUniversalAngle2(jId) == 0
- * dJointSetHuniversalAxis2Offset(jId, 0, 1, 0, 0.2, 0.17);
- * // If you request the position you will have: dJointGetUniversalAngle1(jId) == 0.2
- * // If you request the position you will have: dJointGetUniversalAngle2(jId) == 0.17
- * 
- - * @param j The Hinge joint ID for which the axis will be set - * @param x The X component of the axis in world frame - * @param y The Y component of the axis in world frame - * @param z The Z component of the axis in world frame - * @param angle The angle for the offset of the relative orientation. - * As if body1 was rotated by angle when the Axis was set (see below). - * The rotation is around the new Hinge axis. - * - * @note Usually the function dJointSetHingeAxis set the current position of body1 - * and body2 as the zero angle position. This function set the current position - * as the if the 2 bodies where \b offsets appart. - * - * @note Any previous offsets are erased. - * - * @warning Calling dJointSetUniversalAnchor, dJointSetUnivesalAxis1, - * dJointSetUniversalAxis2, dJointSetUniversalAxis2Offset - * will reset the "zero" angle position. - */ - - -ODE_API void dJointSetUniversalAxis2Offset (dJointID, dReal x, dReal y, dReal z, - dReal offset1, dReal offset2); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetUniversalParam (dJointID, int parameter, dReal value); - -/** - * @brief Applies torque1 about the universal's axis 1, torque2 about the - * universal's axis 2. - * @remarks This function is just a wrapper for dBodyAddTorque(). - * @ingroup joints - */ -ODE_API void dJointAddUniversalTorques(dJointID joint, dReal torque1, dReal torque2); - - -/** - * @brief set anchor - * @ingroup joints - */ -ODE_API void dJointSetPRAnchor (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set the axis for the prismatic articulation - * @ingroup joints - */ -ODE_API void dJointSetPRAxis1 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set the axis for the rotoide articulation - * @ingroup joints - */ -ODE_API void dJointSetPRAxis2 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set joint parameter - * @ingroup joints - * - * @note parameterX where X equal 2 refer to parameter for the rotoide articulation - */ -ODE_API void dJointSetPRParam (dJointID, int parameter, dReal value); - -/** - * @brief Applies the torque about the rotoide axis of the PR joint - * - * That is, it applies a torque with specified magnitude in the direction - * of the rotoide axis, to body 1, and with the same magnitude but in opposite - * direction to body 2. This function is just a wrapper for dBodyAddTorque()} - * @ingroup joints - */ -ODE_API void dJointAddPRTorque (dJointID j, dReal torque); - - - /** - * @brief set anchor - * @ingroup joints - */ - ODE_API void dJointSetPUAnchor (dJointID, dReal x, dReal y, dReal z); - - /** - * @brief set anchor - * @ingroup joints - */ - ODE_API_DEPRECATED ODE_API void dJointSetPUAnchorDelta (dJointID, dReal x, dReal y, dReal z, - dReal dx, dReal dy, dReal dz); - - /** - * @brief Set the PU anchor as if the 2 bodies were already at [dx, dy, dz] appart. - * @ingroup joints - * - * This function initialize the anchor and the relative position of each body - * as if the position between body1 and body2 was already the projection of [dx, dy, dz] - * along the Piston axis. (i.e as if the body1 was at its current position - [dx,dy,dy] when the - * axis is set). - * Ex: - *
-   * dReal offset = 3;
-   * dVector3 axis;
-   * dJointGetPUAxis(jId, axis);
-   * dJointSetPUAnchor(jId, 0, 0, 0);
-   * // If you request the position you will have: dJointGetPUPosition(jId) == 0
-   * dJointSetPUAnchorOffset(jId, 0, 0, 0, axis[X]*offset, axis[Y]*offset, axis[Z]*offset);
-   * // If you request the position you will have: dJointGetPUPosition(jId) == offset
-   * 
- * @param j The PU joint for which the anchor point will be set - * @param x The X position of the anchor point in world frame - * @param y The Y position of the anchor point in world frame - * @param z The Z position of the anchor point in world frame - * @param dx A delta to be substracted to the X position as if the anchor was set - * when body1 was at current_position[X] - dx - * @param dx A delta to be substracted to the Y position as if the anchor was set - * when body1 was at current_position[Y] - dy - * @param dx A delta to be substracted to the Z position as if the anchor was set - * when body1 was at current_position[Z] - dz - */ - ODE_API void dJointSetPUAnchorOffset (dJointID, dReal x, dReal y, dReal z, - dReal dx, dReal dy, dReal dz); - - /** - * @brief set the axis for the first axis or the universal articulation - * @ingroup joints - */ - ODE_API void dJointSetPUAxis1 (dJointID, dReal x, dReal y, dReal z); - - /** - * @brief set the axis for the second axis or the universal articulation - * @ingroup joints - */ - ODE_API void dJointSetPUAxis2 (dJointID, dReal x, dReal y, dReal z); - - /** - * @brief set the axis for the prismatic articulation - * @ingroup joints - */ - ODE_API void dJointSetPUAxis3 (dJointID, dReal x, dReal y, dReal z); - - /** - * @brief set the axis for the prismatic articulation - * @ingroup joints - * @note This function was added for convenience it is the same as - * dJointSetPUAxis3 - */ - ODE_API void dJointSetPUAxisP (dJointID id, dReal x, dReal y, dReal z); - - - - /** - * @brief set joint parameter - * @ingroup joints - * - * @note parameterX where X equal 2 refer to parameter for second axis of the - * universal articulation - * @note parameterX where X equal 3 refer to parameter for prismatic - * articulation - */ - ODE_API void dJointSetPUParam (dJointID, int parameter, dReal value); - - /** - * @brief Applies the torque about the rotoide axis of the PU joint - * - * That is, it applies a torque with specified magnitude in the direction - * of the rotoide axis, to body 1, and with the same magnitude but in opposite - * direction to body 2. This function is just a wrapper for dBodyAddTorque()} - * @ingroup joints - */ - ODE_API void dJointAddPUTorque (dJointID j, dReal torque); - - - - - /** - * @brief set the joint anchor - * @ingroup joints - */ - ODE_API void dJointSetPistonAnchor (dJointID, dReal x, dReal y, dReal z); - - /** - * @brief Set the Piston anchor as if the 2 bodies were already at [dx,dy, dz] appart. - * @ingroup joints - * - * This function initialize the anchor and the relative position of each body - * as if the position between body1 and body2 was already the projection of [dx, dy, dz] - * along the Piston axis. (i.e as if the body1 was at its current position - [dx,dy,dy] when the - * axis is set). - * Ex: - *
-   * dReal offset = 3;
-   * dVector3 axis;
-   * dJointGetPistonAxis(jId, axis);
-   * dJointSetPistonAnchor(jId, 0, 0, 0);
-   * // If you request the position you will have: dJointGetPistonPosition(jId) == 0
-   * dJointSetPistonAnchorOffset(jId, 0, 0, 0, axis[X]*offset, axis[Y]*offset, axis[Z]*offset);
-   * // If you request the position you will have: dJointGetPistonPosition(jId) == offset
-   * 
- * @param j The Piston joint for which the anchor point will be set - * @param x The X position of the anchor point in world frame - * @param y The Y position of the anchor point in world frame - * @param z The Z position of the anchor point in world frame - * @param dx A delta to be substracted to the X position as if the anchor was set - * when body1 was at current_position[X] - dx - * @param dx A delta to be substracted to the Y position as if the anchor was set - * when body1 was at current_position[Y] - dy - * @param dx A delta to be substracted to the Z position as if the anchor was set - * when body1 was at current_position[Z] - dz - */ - ODE_API void dJointSetPistonAnchorOffset(dJointID j, dReal x, dReal y, dReal z, - dReal dx, dReal dy, dReal dz); - - /** - * @brief set the joint axis - * @ingroup joints - */ - ODE_API void dJointSetPistonAxis (dJointID, dReal x, dReal y, dReal z); - - /** - * This function set prismatic axis of the joint and also set the position - * of the joint. - * - * @ingroup joints - * @param j The joint affected by this function - * @param x The x component of the axis - * @param y The y component of the axis - * @param z The z component of the axis - * @param dx The Initial position of the prismatic join in the x direction - * @param dy The Initial position of the prismatic join in the y direction - * @param dz The Initial position of the prismatic join in the z direction - */ - ODE_API_DEPRECATED ODE_API void dJointSetPistonAxisDelta (dJointID j, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); - - /** - * @brief set joint parameter - * @ingroup joints - */ - ODE_API void dJointSetPistonParam (dJointID, int parameter, dReal value); - - /** - * @brief Applies the given force in the slider's direction. - * - * That is, it applies a force with specified magnitude, in the direction of - * prismatic's axis, to body1, and with the same magnitude but opposite - * direction to body2. This function is just a wrapper for dBodyAddForce(). - * @ingroup joints - */ - ODE_API void dJointAddPistonForce (dJointID joint, dReal force); - - -/** - * @brief Call this on the fixed joint after it has been attached to - * remember the current desired relative offset and desired relative - * rotation between the bodies. - * @ingroup joints - */ -ODE_API void dJointSetFixed (dJointID); - -/* - * @brief Sets joint parameter - * - * @ingroup joints - */ -ODE_API void dJointSetFixedParam (dJointID, int parameter, dReal value); - -/** - * @brief set the nr of axes - * @param num 0..3 - * @ingroup joints - */ -ODE_API void dJointSetAMotorNumAxes (dJointID, int num); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetAMotorAxis (dJointID, int anum, int rel, - dReal x, dReal y, dReal z); - -/** - * @brief Tell the AMotor what the current angle is along axis anum. - * - * This function should only be called in dAMotorUser mode, because in this - * mode the AMotor has no other way of knowing the joint angles. - * The angle information is needed if stops have been set along the axis, - * but it is not needed for axis motors. - * @ingroup joints - */ -ODE_API void dJointSetAMotorAngle (dJointID, int anum, dReal angle); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetAMotorParam (dJointID, int parameter, dReal value); - -/** - * @brief set mode - * @ingroup joints - */ -ODE_API void dJointSetAMotorMode (dJointID, int mode); - -/** - * @brief Applies torque0 about the AMotor's axis 0, torque1 about the - * AMotor's axis 1, and torque2 about the AMotor's axis 2. - * @remarks - * If the motor has fewer than three axes, the higher torques are ignored. - * This function is just a wrapper for dBodyAddTorque(). - * @ingroup joints - */ -ODE_API void dJointAddAMotorTorques (dJointID, dReal torque1, dReal torque2, dReal torque3); - -/** - * @brief Set the number of axes that will be controlled by the LMotor. - * @param num can range from 0 (which effectively deactivates the joint) to 3. - * @ingroup joints - */ -ODE_API void dJointSetLMotorNumAxes (dJointID, int num); - -/** - * @brief Set the AMotor axes. - * @param anum selects the axis to change (0,1 or 2). - * @param rel Each axis can have one of three ``relative orientation'' modes - * \li 0: The axis is anchored to the global frame. - * \li 1: The axis is anchored to the first body. - * \li 2: The axis is anchored to the second body. - * @remarks The axis vector is always specified in global coordinates - * regardless of the setting of rel. - * @ingroup joints - */ -ODE_API void dJointSetLMotorAxis (dJointID, int anum, int rel, dReal x, dReal y, dReal z); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetLMotorParam (dJointID, int parameter, dReal value); - -/** - * @ingroup joints - */ -ODE_API void dJointSetPlane2DXParam (dJointID, int parameter, dReal value); - -/** - * @ingroup joints - */ - -ODE_API void dJointSetPlane2DYParam (dJointID, int parameter, dReal value); - -/** - * @ingroup joints - */ -ODE_API void dJointSetPlane2DAngleParam (dJointID, int parameter, dReal value); - -/** - * @brief Get the joint anchor point, in world coordinates. - * - * This returns the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - */ -ODE_API void dJointGetBallAnchor (dJointID, dVector3 result); - -/** - * @brief Get the joint anchor point, in world coordinates. - * - * This returns the point on body 2. You can think of a ball and socket - * joint as trying to keep the result of dJointGetBallAnchor() and - * dJointGetBallAnchor2() the same. If the joint is perfectly satisfied, - * this function will return the same value as dJointGetBallAnchor() to - * within roundoff errors. dJointGetBallAnchor2() can be used, along with - * dJointGetBallAnchor(), to see how far the joint has come apart. - */ -ODE_API void dJointGetBallAnchor2 (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetBallParam (dJointID, int parameter); - -/** - * @brief Get the hinge anchor point, in world coordinates. - * - * This returns the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ -ODE_API void dJointGetHingeAnchor (dJointID, dVector3 result); - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return The point on body 2. If the joint is perfectly satisfied, - * this will return the same value as dJointGetHingeAnchor(). - * If not, this value will be slightly different. - * This can be used, for example, to see how far the joint has come apart. - * @ingroup joints - */ -ODE_API void dJointGetHingeAnchor2 (dJointID, dVector3 result); - -/** - * @brief get axis - * @ingroup joints - */ -ODE_API void dJointGetHingeAxis (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetHingeParam (dJointID, int parameter); - -/** - * @brief Get the hinge angle. - * - * The angle is measured between the two bodies, or between the body and - * the static environment. - * The angle will be between -pi..pi. - * Give the relative rotation with respect to the Hinge axis of Body 1 with - * respect to Body 2. - * When the hinge anchor or axis is set, the current position of the attached - * bodies is examined and that position will be the zero angle. - * @ingroup joints - */ -ODE_API dReal dJointGetHingeAngle (dJointID); - -/** - * @brief Get the hinge angle time derivative. - * @ingroup joints - */ -ODE_API dReal dJointGetHingeAngleRate (dJointID); - -/** - * @brief Get the slider linear position (i.e. the slider's extension) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - - * The position is the distance, with respect to the zero position, - * along the slider axis of body 1 with respect to - * body 2. (A NULL body is replaced by the world). - * @ingroup joints - */ -ODE_API dReal dJointGetSliderPosition (dJointID); - -/** - * @brief Get the slider linear position's time derivative. - * @ingroup joints - */ -ODE_API dReal dJointGetSliderPositionRate (dJointID); - -/** - * @brief Get the slider axis - * @ingroup joints - */ -ODE_API void dJointGetSliderAxis (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetSliderParam (dJointID, int parameter); - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ -ODE_API void dJointGetHinge2Anchor (dJointID, dVector3 result); - -/** - * @brief Get the joint anchor point, in world coordinates. - * This returns the point on body 2. If the joint is perfectly satisfied, - * this will return the same value as dJointGetHinge2Anchor. - * If not, this value will be slightly different. - * This can be used, for example, to see how far the joint has come apart. - * @ingroup joints - */ -ODE_API void dJointGetHinge2Anchor2 (dJointID, dVector3 result); - -/** - * @brief Get joint axis - * @ingroup joints - */ -ODE_API void dJointGetHinge2Axis1 (dJointID, dVector3 result); - -/** - * @brief Get joint axis - * @ingroup joints - */ -ODE_API void dJointGetHinge2Axis2 (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetHinge2Param (dJointID, int parameter); - -/** - * @brief Get angle - * @ingroup joints - */ -ODE_API dReal dJointGetHinge2Angle1 (dJointID); - -/** - * @brief Get time derivative of angle - * @ingroup joints - */ -ODE_API dReal dJointGetHinge2Angle1Rate (dJointID); - -/** - * @brief Get time derivative of angle - * @ingroup joints - */ -ODE_API dReal dJointGetHinge2Angle2Rate (dJointID); - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ -ODE_API void dJointGetUniversalAnchor (dJointID, dVector3 result); - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return This returns the point on body 2. - * @remarks - * You can think of the ball and socket part of a universal joint as - * trying to keep the result of dJointGetBallAnchor() and - * dJointGetBallAnchor2() the same. If the joint is - * perfectly satisfied, this function will return the same value - * as dJointGetUniversalAnchor() to within roundoff errors. - * dJointGetUniversalAnchor2() can be used, along with - * dJointGetUniversalAnchor(), to see how far the joint has come apart. - * @ingroup joints - */ -ODE_API void dJointGetUniversalAnchor2 (dJointID, dVector3 result); - -/** - * @brief Get axis - * @ingroup joints - */ -ODE_API void dJointGetUniversalAxis1 (dJointID, dVector3 result); - -/** - * @brief Get axis - * @ingroup joints - */ -ODE_API void dJointGetUniversalAxis2 (dJointID, dVector3 result); - - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalParam (dJointID, int parameter); - -/** - * @brief Get both angles at the same time. - * @ingroup joints - * - * @param joint The universal joint for which we want to calculate the angles - * @param angle1 The angle between the body1 and the axis 1 - * @param angle2 The angle between the body2 and the axis 2 - * - * @note This function combine getUniversalAngle1 and getUniversalAngle2 together - * and try to avoid redundant calculation - */ -ODE_API void dJointGetUniversalAngles (dJointID, dReal *angle1, dReal *angle2); - -/** - * @brief Get angle - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalAngle1 (dJointID); - -/** - * @brief Get angle - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalAngle2 (dJointID); - -/** - * @brief Get time derivative of angle - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalAngle1Rate (dJointID); - -/** - * @brief Get time derivative of angle - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalAngle2Rate (dJointID); - - - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ -ODE_API void dJointGetPRAnchor (dJointID, dVector3 result); - -/** - * @brief Get the PR linear position (i.e. the prismatic's extension) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - * - * The position is the "oriented" length between the - * position = (Prismatic axis) dot_product [(body1 + offset) - (body2 + anchor2)] - * - * @ingroup joints - */ -ODE_API dReal dJointGetPRPosition (dJointID); - -/** - * @brief Get the PR linear position's time derivative - * - * @ingroup joints - */ -ODE_API dReal dJointGetPRPositionRate (dJointID); - - -/** - * @brief Get the PR angular position (i.e. the twist between the 2 bodies) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - * @ingroup joints - */ -ODE_API dReal dJointGetPRAngle (dJointID); - -/** - * @brief Get the PR angular position's time derivative - * - * @ingroup joints - */ -ODE_API dReal dJointGetPRAngleRate (dJointID); - - -/** - * @brief Get the prismatic axis - * @ingroup joints - */ -ODE_API void dJointGetPRAxis1 (dJointID, dVector3 result); - -/** - * @brief Get the Rotoide axis - * @ingroup joints - */ -ODE_API void dJointGetPRAxis2 (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetPRParam (dJointID, int parameter); - - - - /** - * @brief Get the joint anchor point, in world coordinates. - * @return the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ - ODE_API void dJointGetPUAnchor (dJointID, dVector3 result); - - /** - * @brief Get the PU linear position (i.e. the prismatic's extension) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - * - * The position is the "oriented" length between the - * position = (Prismatic axis) dot_product [(body1 + offset) - (body2 + anchor2)] - * - * @ingroup joints - */ - ODE_API dReal dJointGetPUPosition (dJointID); - - /** - * @brief Get the PR linear position's time derivative - * - * @ingroup joints - */ - ODE_API dReal dJointGetPUPositionRate (dJointID); - - /** - * @brief Get the first axis of the universal component of the joint - * @ingroup joints - */ - ODE_API void dJointGetPUAxis1 (dJointID, dVector3 result); - - /** - * @brief Get the second axis of the Universal component of the joint - * @ingroup joints - */ - ODE_API void dJointGetPUAxis2 (dJointID, dVector3 result); - - /** - * @brief Get the prismatic axis - * @ingroup joints - */ - ODE_API void dJointGetPUAxis3 (dJointID, dVector3 result); - - /** - * @brief Get the prismatic axis - * @ingroup joints - * - * @note This function was added for convenience it is the same as - * dJointGetPUAxis3 - */ - ODE_API void dJointGetPUAxisP (dJointID id, dVector3 result); - - - - - /** - * @brief Get both angles at the same time. - * @ingroup joints - * - * @param joint The Prismatic universal joint for which we want to calculate the angles - * @param angle1 The angle between the body1 and the axis 1 - * @param angle2 The angle between the body2 and the axis 2 - * - * @note This function combine dJointGetPUAngle1 and dJointGetPUAngle2 together - * and try to avoid redundant calculation - */ - ODE_API void dJointGetPUAngles (dJointID, dReal *angle1, dReal *angle2); - - /** - * @brief Get angle - * @ingroup joints - */ - ODE_API dReal dJointGetPUAngle1 (dJointID); - - /** - * @brief * @brief Get time derivative of angle1 - * - * @ingroup joints - */ - ODE_API dReal dJointGetPUAngle1Rate (dJointID); - - - /** - * @brief Get angle - * @ingroup joints - */ - ODE_API dReal dJointGetPUAngle2 (dJointID); - - /** - * @brief * @brief Get time derivative of angle2 - * - * @ingroup joints - */ - ODE_API dReal dJointGetPUAngle2Rate (dJointID); - - /** - * @brief get joint parameter - * @ingroup joints - */ - ODE_API dReal dJointGetPUParam (dJointID, int parameter); - - - - - -/** - * @brief Get the Piston linear position (i.e. the piston's extension) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - * @ingroup joints - */ - ODE_API dReal dJointGetPistonPosition (dJointID); - - /** - * @brief Get the piston linear position's time derivative. - * @ingroup joints - */ - ODE_API dReal dJointGetPistonPositionRate (dJointID); - -/** - * @brief Get the Piston angular position (i.e. the twist between the 2 bodies) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - * @ingroup joints - */ - ODE_API dReal dJointGetPistonAngle (dJointID); - - /** - * @brief Get the piston angular position's time derivative. - * @ingroup joints - */ - ODE_API dReal dJointGetPistonAngleRate (dJointID); - - - /** - * @brief Get the joint anchor - * - * This returns the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2 in direction perpendicular - * to the prismatic axis. - * - * @ingroup joints - */ - ODE_API void dJointGetPistonAnchor (dJointID, dVector3 result); - - /** - * @brief Get the joint anchor w.r.t. body 2 - * - * This returns the point on body 2. You can think of a Piston - * joint as trying to keep the result of dJointGetPistonAnchor() and - * dJointGetPistonAnchor2() the same in the direction perpendicular to the - * pirsmatic axis. If the joint is perfectly satisfied, - * this function will return the same value as dJointGetPistonAnchor() to - * within roundoff errors. dJointGetPistonAnchor2() can be used, along with - * dJointGetPistonAnchor(), to see how far the joint has come apart. - * - * @ingroup joints - */ - ODE_API void dJointGetPistonAnchor2 (dJointID, dVector3 result); - - /** - * @brief Get the prismatic axis (This is also the rotoide axis. - * @ingroup joints - */ - ODE_API void dJointGetPistonAxis (dJointID, dVector3 result); - - /** - * @brief get joint parameter - * @ingroup joints - */ - ODE_API dReal dJointGetPistonParam (dJointID, int parameter); - - - /** - * @brief Get the number of angular axes that will be controlled by the - * AMotor. - * @param num can range from 0 (which effectively deactivates the - * joint) to 3. - * This is automatically set to 3 in dAMotorEuler mode. - * @ingroup joints - */ -ODE_API int dJointGetAMotorNumAxes (dJointID); - -/** - * @brief Get the AMotor axes. - * @param anum selects the axis to change (0,1 or 2). - * @param rel Each axis can have one of three ``relative orientation'' modes. - * \li 0: The axis is anchored to the global frame. - * \li 1: The axis is anchored to the first body. - * \li 2: The axis is anchored to the second body. - * @ingroup joints - */ -ODE_API void dJointGetAMotorAxis (dJointID, int anum, dVector3 result); - -/** - * @brief Get axis - * @remarks - * The axis vector is always specified in global coordinates regardless - * of the setting of rel. - * There are two GetAMotorAxis functions, one to return the axis and one to - * return the relative mode. - * - * For dAMotorEuler mode: - * \li Only axes 0 and 2 need to be set. Axis 1 will be determined - automatically at each time step. - * \li Axes 0 and 2 must be perpendicular to each other. - * \li Axis 0 must be anchored to the first body, axis 2 must be anchored - to the second body. - * @ingroup joints - */ -ODE_API int dJointGetAMotorAxisRel (dJointID, int anum); - -/** - * @brief Get the current angle for axis. - * @remarks - * In dAMotorUser mode this is simply the value that was set with - * dJointSetAMotorAngle(). - * In dAMotorEuler mode this is the corresponding euler angle. - * @ingroup joints - */ -ODE_API dReal dJointGetAMotorAngle (dJointID, int anum); - -/** - * @brief Get the current angle rate for axis anum. - * @remarks - * In dAMotorUser mode this is always zero, as not enough information is - * available. - * In dAMotorEuler mode this is the corresponding euler angle rate. - * @ingroup joints - */ -ODE_API dReal dJointGetAMotorAngleRate (dJointID, int anum); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetAMotorParam (dJointID, int parameter); - -/** - * @brief Get the angular motor mode. - * @param mode must be one of the following constants: - * \li dAMotorUser The AMotor axes and joint angle settings are entirely - * controlled by the user. This is the default mode. - * \li dAMotorEuler Euler angles are automatically computed. - * The axis a1 is also automatically computed. - * The AMotor axes must be set correctly when in this mode, - * as described below. - * When this mode is initially set the current relative orientations - * of the bodies will correspond to all euler angles at zero. - * @ingroup joints - */ -ODE_API int dJointGetAMotorMode (dJointID); - -/** - * @brief Get nr of axes. - * @ingroup joints - */ -ODE_API int dJointGetLMotorNumAxes (dJointID); - -/** - * @brief Get axis. - * @ingroup joints - */ -ODE_API void dJointGetLMotorAxis (dJointID, int anum, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetLMotorParam (dJointID, int parameter); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetFixedParam (dJointID, int parameter); - - -/** - * @ingroup joints - */ -ODE_API dJointID dConnectingJoint (dBodyID, dBodyID); - -/** - * @ingroup joints - */ -ODE_API int dConnectingJointList (dBodyID, dBodyID, dJointID*); - -/** - * @brief Utility function - * @return 1 if the two bodies are connected together by - * a joint, otherwise return 0. - * @ingroup joints - */ -ODE_API int dAreConnected (dBodyID, dBodyID); - -/** - * @brief Utility function - * @return 1 if the two bodies are connected together by - * a joint that does not have type @arg{joint_type}, otherwise return 0. - * @param body1 A body to check. - * @param body2 A body to check. - * @param joint_type is a dJointTypeXXX constant. - * This is useful for deciding whether to add contact joints between two bodies: - * if they are already connected by non-contact joints then it may not be - * appropriate to add contacts, however it is okay to add more contact between- - * bodies that already have contacts. - * @ingroup joints - */ -ODE_API int dAreConnectedExcluding (dBodyID body1, dBodyID body2, int joint_type); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/ode.h b/misc/builddeps/dp.linux64/include/ode/ode.h deleted file mode 100644 index af74e50f..00000000 --- a/misc/builddeps/dp.linux64/include/ode/ode.h +++ /dev/null @@ -1,48 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_ODE_H_ -#define _ODE_ODE_H_ - -/* include *everything* here */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/odeconfig.h b/misc/builddeps/dp.linux64/include/ode/odeconfig.h deleted file mode 100644 index 6e32fc65..00000000 --- a/misc/builddeps/dp.linux64/include/ode/odeconfig.h +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef ODECONFIG_H -#define ODECONFIG_H - -/* Pull in the standard headers */ -#include -#include -#include -#include -#include -#include -#include -#include - - -#if defined(ODE_DLL) || defined(ODE_LIB) -#define __ODE__ -#endif - -/* Define a DLL export symbol for those platforms that need it */ -#if defined(_MSC_VER) - #if defined(ODE_DLL) - #define ODE_API __declspec(dllexport) - #elif !defined(ODE_LIB) - #define ODE_DLL_API __declspec(dllimport) - #endif -#endif - -#if !defined(ODE_API) - #define ODE_API -#endif - -#if defined(_MSC_VER) -# define ODE_API_DEPRECATED __declspec(deprecated) -#elif defined (__GNUC__) && ( (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) ) -# define ODE_API_DEPRECATED __attribute__((__deprecated__)) -#else -# define ODE_API_DEPRECATED -#endif - -/* Well-defined common data types...need to define for 64 bit systems */ -#if defined(_M_IA64) || defined(__ia64__) || defined(_M_AMD64) || defined(__x86_64__) - #define X86_64_SYSTEM 1 - typedef int int32; - typedef unsigned int uint32; - typedef short int16; - typedef unsigned short uint16; - typedef signed char int8; - typedef unsigned char uint8; -#else - typedef int int32; - typedef unsigned int uint32; - typedef short int16; - typedef unsigned short uint16; - typedef signed char int8; - typedef unsigned char uint8; -#endif - -/* Visual C does not define these functions */ -#if defined(_MSC_VER) - #define copysignf(x, y) ((float)_copysign(x, y)) - #define copysign(x, y) _copysign(x, y) - #define nextafterf(x, y) _nextafterf(x, y) - #define nextafter(x, y) _nextafter(x, y) - #if !defined(_WIN64) - #define _ODE__NEXTAFTERF_REQUIRED - #endif -#endif - - - -/* Define the dInfinity macro */ -#ifdef INFINITY - #define dInfinity INFINITY -#elif defined(HUGE_VAL) - #ifdef dSINGLE - #ifdef HUGE_VALF - #define dInfinity HUGE_VALF - #else - #define dInfinity ((float)HUGE_VAL) - #endif - #else - #define dInfinity HUGE_VAL - #endif -#else - #ifdef dSINGLE - #define dInfinity ((float)(1.0/0.0)) - #else - #define dInfinity (1.0/0.0) - #endif -#endif - - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/odecpp.h b/misc/builddeps/dp.linux64/include/ode/odecpp.h deleted file mode 100644 index f7348925..00000000 --- a/misc/builddeps/dp.linux64/include/ode/odecpp.h +++ /dev/null @@ -1,1353 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001, 2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* C++ interface for non-collision stuff */ - - -#ifndef _ODE_ODECPP_H_ -#define _ODE_ODECPP_H_ -#ifdef __cplusplus - - - - -//namespace ode { - - -class dWorldSimpleIDContainer { -protected: - dWorldID _id; - - dWorldSimpleIDContainer(): _id(0) {} - ~dWorldSimpleIDContainer() { destroy(); } - - void destroy() { - if (_id) { - dWorldDestroy(_id); - _id = 0; - } - } -}; - -class dWorldDynamicIDContainer: public dWorldSimpleIDContainer { -protected: - virtual ~dWorldDynamicIDContainer() {} -}; - -template -class dWorldTemplate: public dWorldTemplateBase { - // intentionally undefined, don't use these - dWorldTemplate (const dWorldTemplate &); - void operator= (const dWorldTemplate &); - -protected: - dWorldID get_id() const { return dWorldTemplateBase::_id; } - void set_id(dWorldID value) { dWorldTemplateBase::_id = value; } - -public: - dWorldTemplate() - { set_id(dWorldCreate()); } - - dWorldID id() const - { return get_id(); } - operator dWorldID() const - { return get_id(); } - - void setGravity (dReal x, dReal y, dReal z) - { dWorldSetGravity (get_id(), x, y, z); } - void setGravity (const dVector3 g) - { setGravity (g[0], g[1], g[2]); } - void getGravity (dVector3 g) const - { dWorldGetGravity (get_id(), g); } - - void setERP (dReal erp) - { dWorldSetERP(get_id(), erp); } - dReal getERP() const - { return dWorldGetERP(get_id()); } - - void setCFM (dReal cfm) - { dWorldSetCFM(get_id(), cfm); } - dReal getCFM() const - { return dWorldGetCFM(get_id()); } - - void step (dReal stepsize) - { dWorldStep (get_id(), stepsize); } - - void quickStep(dReal stepsize) - { dWorldQuickStep (get_id(), stepsize); } - void setQuickStepNumIterations(int num) - { dWorldSetQuickStepNumIterations (get_id(), num); } - int getQuickStepNumIterations() const - { return dWorldGetQuickStepNumIterations (get_id()); } - void setQuickStepW(dReal over_relaxation) - { dWorldSetQuickStepW (get_id(), over_relaxation); } - dReal getQuickStepW() const - { return dWorldGetQuickStepW (get_id()); } - - void setAutoDisableLinearThreshold (dReal threshold) - { dWorldSetAutoDisableLinearThreshold (get_id(), threshold); } - dReal getAutoDisableLinearThreshold() const - { return dWorldGetAutoDisableLinearThreshold (get_id()); } - void setAutoDisableAngularThreshold (dReal threshold) - { dWorldSetAutoDisableAngularThreshold (get_id(), threshold); } - dReal getAutoDisableAngularThreshold() const - { return dWorldGetAutoDisableAngularThreshold (get_id()); } - void setAutoDisableSteps (int steps) - { dWorldSetAutoDisableSteps (get_id(), steps); } - int getAutoDisableSteps() const - { return dWorldGetAutoDisableSteps (get_id()); } - void setAutoDisableTime (dReal time) - { dWorldSetAutoDisableTime (get_id(), time); } - dReal getAutoDisableTime() const - { return dWorldGetAutoDisableTime (get_id()); } - void setAutoDisableFlag (int do_auto_disable) - { dWorldSetAutoDisableFlag (get_id(), do_auto_disable); } - int getAutoDisableFlag() const - { return dWorldGetAutoDisableFlag (get_id()); } - - dReal getLinearDampingThreshold() const - { return dWorldGetLinearDampingThreshold(get_id()); } - void setLinearDampingThreshold(dReal threshold) - { dWorldSetLinearDampingThreshold(get_id(), threshold); } - dReal getAngularDampingThreshold() const - { return dWorldGetAngularDampingThreshold(get_id()); } - void setAngularDampingThreshold(dReal threshold) - { dWorldSetAngularDampingThreshold(get_id(), threshold); } - dReal getLinearDamping() const - { return dWorldGetLinearDamping(get_id()); } - void setLinearDamping(dReal scale) - { dWorldSetLinearDamping(get_id(), scale); } - dReal getAngularDamping() const - { return dWorldGetAngularDamping(get_id()); } - void setAngularDamping(dReal scale) - { dWorldSetAngularDamping(get_id(), scale); } - void setDamping(dReal linear_scale, dReal angular_scale) - { dWorldSetDamping(get_id(), linear_scale, angular_scale); } - - dReal getMaxAngularSpeed() const - { return dWorldGetMaxAngularSpeed(get_id()); } - void setMaxAngularSpeed(dReal max_speed) - { dWorldSetMaxAngularSpeed(get_id(), max_speed); } - - void setContactSurfaceLayer(dReal depth) - { dWorldSetContactSurfaceLayer (get_id(), depth); } - dReal getContactSurfaceLayer() const - { return dWorldGetContactSurfaceLayer (get_id()); } - - void impulseToForce (dReal stepsize, dReal ix, dReal iy, dReal iz, - dVector3 force) - { dWorldImpulseToForce (get_id(), stepsize, ix, iy, iz, force); } -}; - - -class dBodySimpleIDContainer { -protected: - dBodyID _id; - - dBodySimpleIDContainer(): _id(0) {} - ~dBodySimpleIDContainer() { destroy(); } - - void destroy() { - if (_id) { - dBodyDestroy(_id); - _id = 0; - } - } -}; - -class dBodyDynamicIDContainer: public dBodySimpleIDContainer { -protected: - virtual ~dBodyDynamicIDContainer() {} -}; - -template -class dBodyTemplate: public dBodyTemplateBase { - // intentionally undefined, don't use these - dBodyTemplate (const dBodyTemplate &); - void operator= (const dBodyTemplate &); - -protected: - dBodyID get_id() const { return dBodyTemplateBase::_id; } - void set_id(dBodyID value) { dBodyTemplateBase::_id = value; } - - void destroy() { dBodyTemplateBase::destroy(); } - -public: - dBodyTemplate() - { } - dBodyTemplate (dWorldID world) - { set_id(dBodyCreate(world)); } - dBodyTemplate (dWorldTemplate& world) - { set_id(dBodyCreate(world.id())); } - - void create (dWorldID world) { - destroy(); - set_id(dBodyCreate(world)); - } - void create (dWorldTemplate& world) { - create(world.id()); - } - - dBodyID id() const - { return get_id(); } - operator dBodyID() const - { return get_id(); } - - void setData (void *data) - { dBodySetData (get_id(), data); } - void *getData() const - { return dBodyGetData (get_id()); } - - void setPosition (dReal x, dReal y, dReal z) - { dBodySetPosition (get_id(), x, y, z); } - void setPosition (const dVector3 p) - { setPosition(p[0], p[1], p[2]); } - - void setRotation (const dMatrix3 R) - { dBodySetRotation (get_id(), R); } - void setQuaternion (const dQuaternion q) - { dBodySetQuaternion (get_id(), q); } - void setLinearVel (dReal x, dReal y, dReal z) - { dBodySetLinearVel (get_id(), x, y, z); } - void setLinearVel (const dVector3 v) - { setLinearVel(v[0], v[1], v[2]); } - void setAngularVel (dReal x, dReal y, dReal z) - { dBodySetAngularVel (get_id(), x, y, z); } - void setAngularVel (const dVector3 v) - { setAngularVel (v[0], v[1], v[2]); } - - const dReal * getPosition() const - { return dBodyGetPosition (get_id()); } - const dReal * getRotation() const - { return dBodyGetRotation (get_id()); } - const dReal * getQuaternion() const - { return dBodyGetQuaternion (get_id()); } - const dReal * getLinearVel() const - { return dBodyGetLinearVel (get_id()); } - const dReal * getAngularVel() const - { return dBodyGetAngularVel (get_id()); } - - void setMass (const dMass *mass) - { dBodySetMass (get_id(), mass); } - void setMass (const dMass &mass) - { setMass (&mass); } - dMass getMass () const - { dMass mass; dBodyGetMass (get_id(), &mass); return mass; } - - void addForce (dReal fx, dReal fy, dReal fz) - { dBodyAddForce (get_id(), fx, fy, fz); } - void addForce (const dVector3 f) - { addForce (f[0], f[1], f[2]); } - void addTorque (dReal fx, dReal fy, dReal fz) - { dBodyAddTorque (get_id(), fx, fy, fz); } - void addTorque (const dVector3 t) - { addTorque(t[0], t[1], t[2]); } - - void addRelForce (dReal fx, dReal fy, dReal fz) - { dBodyAddRelForce (get_id(), fx, fy, fz); } - void addRelForce (const dVector3 f) - { addRelForce (f[0], f[1], f[2]); } - void addRelTorque (dReal fx, dReal fy, dReal fz) - { dBodyAddRelTorque (get_id(), fx, fy, fz); } - void addRelTorque (const dVector3 t) - { addRelTorque (t[0], t[1], t[2]); } - - void addForceAtPos (dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) - { dBodyAddForceAtPos (get_id(), fx, fy, fz, px, py, pz); } - void addForceAtPos (const dVector3 f, const dVector3 p) - { addForceAtPos (f[0], f[1], f[2], p[0], p[1], p[2]); } - - void addForceAtRelPos (dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) - { dBodyAddForceAtRelPos (get_id(), fx, fy, fz, px, py, pz); } - void addForceAtRelPos (const dVector3 f, const dVector3 p) - { addForceAtRelPos (f[0], f[1], f[2], p[0], p[1], p[2]); } - - void addRelForceAtPos (dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) - { dBodyAddRelForceAtPos (get_id(), fx, fy, fz, px, py, pz); } - void addRelForceAtPos (const dVector3 f, const dVector3 p) - { addRelForceAtPos (f[0], f[1], f[2], p[0], p[1], p[2]); } - - void addRelForceAtRelPos (dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) - { dBodyAddRelForceAtRelPos (get_id(), fx, fy, fz, px, py, pz); } - void addRelForceAtRelPos (const dVector3 f, const dVector3 p) - { addRelForceAtRelPos (f[0], f[1], f[2], p[0], p[1], p[2]); } - - const dReal * getForce() const - { return dBodyGetForce(get_id()); } - const dReal * getTorque() const - { return dBodyGetTorque(get_id()); } - void setForce (dReal x, dReal y, dReal z) - { dBodySetForce (get_id(), x, y, z); } - void setForce (const dVector3 f) - { setForce (f[0], f[1], f[2]); } - void setTorque (dReal x, dReal y, dReal z) - { dBodySetTorque (get_id(), x, y, z); } - void setTorque (const dVector3 t) - { setTorque (t[0], t[1], t[2]); } - - void setDynamic() - { dBodySetDynamic (get_id()); } - void setKinematic() - { dBodySetKinematic (get_id()); } - bool isKinematic() const - { return dBodyIsKinematic (get_id()) != 0; } - - void enable() - { dBodyEnable (get_id()); } - void disable() - { dBodyDisable (get_id()); } - bool isEnabled() const - { return dBodyIsEnabled (get_id()) != 0; } - - void getRelPointPos (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyGetRelPointPos (get_id(), px, py, pz, result); } - void getRelPointPos (const dVector3 p, dVector3 result) const - { getRelPointPos (p[0], p[1], p[2], result); } - - void getRelPointVel (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyGetRelPointVel (get_id(), px, py, pz, result); } - void getRelPointVel (const dVector3 p, dVector3 result) const - { getRelPointVel (p[0], p[1], p[2], result); } - - void getPointVel (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyGetPointVel (get_id(), px, py, pz, result); } - void getPointVel (const dVector3 p, dVector3 result) const - { getPointVel (p[0], p[1], p[2], result); } - - void getPosRelPoint (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyGetPosRelPoint (get_id(), px, py, pz, result); } - void getPosRelPoint (const dVector3 p, dVector3 result) const - { getPosRelPoint (p[0], p[1], p[2], result); } - - void vectorToWorld (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyVectorToWorld (get_id(), px, py, pz, result); } - void vectorToWorld (const dVector3 p, dVector3 result) const - { vectorToWorld (p[0], p[1], p[2], result); } - - void vectorFromWorld (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyVectorFromWorld (get_id(), px, py, pz, result); } - void vectorFromWorld (const dVector3 p, dVector3 result) const - { vectorFromWorld (p[0], p[1], p[2], result); } - - void setFiniteRotationMode (bool mode) - { dBodySetFiniteRotationMode (get_id(), mode); } - - void setFiniteRotationAxis (dReal x, dReal y, dReal z) - { dBodySetFiniteRotationAxis (get_id(), x, y, z); } - void setFiniteRotationAxis (const dVector3 a) - { setFiniteRotationAxis (a[0], a[1], a[2]); } - - bool getFiniteRotationMode() const - { return dBodyGetFiniteRotationMode (get_id()) != 0; } - void getFiniteRotationAxis (dVector3 result) const - { dBodyGetFiniteRotationAxis (get_id(), result); } - - int getNumJoints() const - { return dBodyGetNumJoints (get_id()); } - dJointID getJoint (int index) const - { return dBodyGetJoint (get_id(), index); } - - void setGravityMode (bool mode) - { dBodySetGravityMode (get_id(), mode); } - bool getGravityMode() const - { return dBodyGetGravityMode (get_id()) != 0; } - - bool isConnectedTo (dBodyID body) const - { return dAreConnected (get_id(), body) != 0; } - - void setAutoDisableLinearThreshold (dReal threshold) - { dBodySetAutoDisableLinearThreshold (get_id(), threshold); } - dReal getAutoDisableLinearThreshold() const - { return dBodyGetAutoDisableLinearThreshold (get_id()); } - void setAutoDisableAngularThreshold (dReal threshold) - { dBodySetAutoDisableAngularThreshold (get_id(), threshold); } - dReal getAutoDisableAngularThreshold() const - { return dBodyGetAutoDisableAngularThreshold (get_id()); } - void setAutoDisableSteps (int steps) - { dBodySetAutoDisableSteps (get_id(), steps); } - int getAutoDisableSteps() const - { return dBodyGetAutoDisableSteps (get_id()); } - void setAutoDisableTime (dReal time) - { dBodySetAutoDisableTime (get_id(), time); } - dReal getAutoDisableTime() const - { return dBodyGetAutoDisableTime (get_id()); } - void setAutoDisableFlag (bool do_auto_disable) - { dBodySetAutoDisableFlag (get_id(), do_auto_disable); } - bool getAutoDisableFlag() const - { return dBodyGetAutoDisableFlag (get_id()) != 0; } - - dReal getLinearDamping() const - { return dBodyGetLinearDamping(get_id()); } - void setLinearDamping(dReal scale) - { dBodySetLinearDamping(get_id(), scale); } - dReal getAngularDamping() const - { return dBodyGetAngularDamping(get_id()); } - void setAngularDamping(dReal scale) - { dBodySetAngularDamping(get_id(), scale); } - void setDamping(dReal linear_scale, dReal angular_scale) - { dBodySetDamping(get_id(), linear_scale, angular_scale); } - dReal getLinearDampingThreshold() const - { return dBodyGetLinearDampingThreshold(get_id()); } - void setLinearDampingThreshold(dReal threshold) const - { dBodySetLinearDampingThreshold(get_id(), threshold); } - dReal getAngularDampingThreshold() const - { return dBodyGetAngularDampingThreshold(get_id()); } - void setAngularDampingThreshold(dReal threshold) - { dBodySetAngularDampingThreshold(get_id(), threshold); } - void setDampingDefaults() - { dBodySetDampingDefaults(get_id()); } - - dReal getMaxAngularSpeed() const - { return dBodyGetMaxAngularSpeed(get_id()); } - void setMaxAngularSpeed(dReal max_speed) - { dBodySetMaxAngularSpeed(get_id(), max_speed); } - - bool getGyroscopicMode() const - { return dBodyGetGyroscopicMode(get_id()) != 0; } - void setGyroscopicMode(bool mode) - { dBodySetGyroscopicMode(get_id(), mode); } - -}; - - -class dJointGroupSimpleIDContainer { -protected: - dJointGroupID _id; - - dJointGroupSimpleIDContainer(): _id(0) {} - ~dJointGroupSimpleIDContainer() { destroy(); } - - void destroy() { - if (_id) { - dJointGroupDestroy(_id); - _id = 0; - } - } -}; - -class dJointGroupDynamicIDContainer: public dJointGroupSimpleIDContainer { -protected: - virtual ~dJointGroupDynamicIDContainer() {} -}; - -template -class dJointGroupTemplate: public dJointGroupTemplateBase { - // intentionally undefined, don't use these - dJointGroupTemplate (const dJointGroupTemplate &); - void operator= (const dJointGroupTemplate &); - -protected: - dJointGroupID get_id() const { return dJointGroupTemplateBase::_id; } - void set_id(dJointGroupID value) { dJointGroupTemplateBase::_id = value; } - - void destroy() { dJointGroupTemplateBase::destroy(); } - -public: - dJointGroupTemplate () - { set_id(dJointGroupCreate(0)); } - - void create () { - destroy(); - set_id(dJointGroupCreate(0)); - } - - dJointGroupID id() const - { return get_id(); } - operator dJointGroupID() const - { return get_id(); } - - void empty() - { dJointGroupEmpty (get_id()); } - void clear() - { empty(); } -}; - - -class dJointSimpleIDContainer { -protected: - dJointID _id; - - dJointSimpleIDContainer(): _id(0) {} - ~dJointSimpleIDContainer() { destroy(); } - - void destroy() { - if (_id) { - dJointDestroy (_id); - _id = 0; - } - } -}; - -class dJointDynamicIDContainer: public dJointSimpleIDContainer { -protected: - virtual ~dJointDynamicIDContainer() {} -}; - -template -class dJointTemplate: public dJointTemplateBase { -private: - // intentionally undefined, don't use these - dJointTemplate (const dJointTemplate &) ; - void operator= (const dJointTemplate &); - -protected: - dJointID get_id() const { return dJointTemplateBase::_id; } - void set_id(dJointID value) { dJointTemplateBase::_id = value; } - - void destroy() { dJointTemplateBase::destroy(); } - -protected: - dJointTemplate() // don't let user construct pure dJointTemplate objects - { } - -public: - dJointID id() const - { return get_id(); } - operator dJointID() const - { return get_id(); } - - int getNumBodies() const - { return dJointGetNumBodies(get_id()); } - - void attach (dBodyID body1, dBodyID body2) - { dJointAttach (get_id(), body1, body2); } - void attach (dBodyTemplate& body1, dBodyTemplate& body2) - { attach(body1.id(), body2.id()); } - - void enable() - { dJointEnable (get_id()); } - void disable() - { dJointDisable (get_id()); } - bool isEnabled() const - { return dJointIsEnabled (get_id()) != 0; } - - void setData (void *data) - { dJointSetData (get_id(), data); } - void *getData() const - { return dJointGetData (get_id()); } - - dJointType getType() const - { return dJointGetType (get_id()); } - - dBodyID getBody (int index) const - { return dJointGetBody (get_id(), index); } - - void setFeedback(dJointFeedback *fb) - { dJointSetFeedback(get_id(), fb); } - dJointFeedback *getFeedback() const - { return dJointGetFeedback(get_id()); } - - // If not implemented it will do nothing as describe in the doc - virtual void setParam (int, dReal) {}; - virtual dReal getParam (int) const { return 0; } -}; - - -template -class dBallJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dBallJointTemplate (const dBallJointTemplate &); - void operator= (const dBallJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dBallJointTemplate() { } - dBallJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateBall(world, group)); } - dBallJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateBall(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateBall(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetBallAnchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor (a[0], a[1], a[2]); } - void getAnchor (dVector3 result) const - { dJointGetBallAnchor (get_id(), result); } - void getAnchor2 (dVector3 result) const - { dJointGetBallAnchor2 (get_id(), result); } - virtual void setParam (int parameter, dReal value) - { dJointSetBallParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetBallParam (get_id(), parameter); } - // TODO: expose params through methods -} ; - - -template -class dHingeJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dHingeJointTemplate (const dHingeJointTemplate &); - void operator = (const dHingeJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dHingeJointTemplate() { } - dHingeJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateHinge(world, group)); } - dHingeJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateHinge(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateHinge (world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetHingeAnchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor (a[0], a[1], a[2]); } - void getAnchor (dVector3 result) const - { dJointGetHingeAnchor (get_id(), result); } - void getAnchor2 (dVector3 result) const - { dJointGetHingeAnchor2 (get_id(), result); } - - void setAxis (dReal x, dReal y, dReal z) - { dJointSetHingeAxis (get_id(), x, y, z); } - void setAxis (const dVector3 a) - { setAxis(a[0], a[1], a[2]); } - void getAxis (dVector3 result) const - { dJointGetHingeAxis (get_id(), result); } - - dReal getAngle() const - { return dJointGetHingeAngle (get_id()); } - dReal getAngleRate() const - { return dJointGetHingeAngleRate (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetHingeParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetHingeParam (get_id(), parameter); } - // TODO: expose params through methods - - void addTorque (dReal torque) - { dJointAddHingeTorque(get_id(), torque); } -}; - - -template -class dSliderJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dSliderJointTemplate (const dSliderJointTemplate &); - void operator = (const dSliderJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dSliderJointTemplate() { } - dSliderJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateSlider(world, group)); } - dSliderJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateSlider(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateSlider(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAxis (dReal x, dReal y, dReal z) - { dJointSetSliderAxis (get_id(), x, y, z); } - void setAxis (const dVector3 a) - { setAxis (a[0], a[1], a[2]); } - void getAxis (dVector3 result) const - { dJointGetSliderAxis (get_id(), result); } - - dReal getPosition() const - { return dJointGetSliderPosition (get_id()); } - dReal getPositionRate() const - { return dJointGetSliderPositionRate (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetSliderParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetSliderParam (get_id(), parameter); } - // TODO: expose params through methods - - void addForce (dReal force) - { dJointAddSliderForce(get_id(), force); } -}; - - -template -class dUniversalJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dUniversalJointTemplate (const dUniversalJointTemplate &); - void operator = (const dUniversalJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dUniversalJointTemplate() { } - dUniversalJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateUniversal(world, group)); } - dUniversalJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateUniversal(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateUniversal(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetUniversalAnchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor(a[0], a[1], a[2]); } - void setAxis1 (dReal x, dReal y, dReal z) - { dJointSetUniversalAxis1 (get_id(), x, y, z); } - void setAxis1 (const dVector3 a) - { setAxis1 (a[0], a[1], a[2]); } - void setAxis2 (dReal x, dReal y, dReal z) - { dJointSetUniversalAxis2 (get_id(), x, y, z); } - void setAxis2 (const dVector3 a) - { setAxis2 (a[0], a[1], a[2]); } - - void getAnchor (dVector3 result) const - { dJointGetUniversalAnchor (get_id(), result); } - void getAnchor2 (dVector3 result) const - { dJointGetUniversalAnchor2 (get_id(), result); } - void getAxis1 (dVector3 result) const - { dJointGetUniversalAxis1 (get_id(), result); } - void getAxis2 (dVector3 result) const - { dJointGetUniversalAxis2 (get_id(), result); } - - virtual void setParam (int parameter, dReal value) - { dJointSetUniversalParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetUniversalParam (get_id(), parameter); } - // TODO: expose params through methods - - void getAngles(dReal *angle1, dReal *angle2) const - { dJointGetUniversalAngles (get_id(), angle1, angle2); } - - dReal getAngle1() const - { return dJointGetUniversalAngle1 (get_id()); } - dReal getAngle1Rate() const - { return dJointGetUniversalAngle1Rate (get_id()); } - dReal getAngle2() const - { return dJointGetUniversalAngle2 (get_id()); } - dReal getAngle2Rate() const - { return dJointGetUniversalAngle2Rate (get_id()); } - - void addTorques (dReal torque1, dReal torque2) - { dJointAddUniversalTorques(get_id(), torque1, torque2); } -}; - - -template -class dHinge2JointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dHinge2JointTemplate (const dHinge2JointTemplate &); - void operator = (const dHinge2JointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dHinge2JointTemplate() { } - dHinge2JointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateHinge2(world, group)); } - dHinge2JointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateHinge2(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateHinge2(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetHinge2Anchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor(a[0], a[1], a[2]); } - void setAxis1 (dReal x, dReal y, dReal z) - { dJointSetHinge2Axis1 (get_id(), x, y, z); } - void setAxis1 (const dVector3 a) - { setAxis1 (a[0], a[1], a[2]); } - void setAxis2 (dReal x, dReal y, dReal z) - { dJointSetHinge2Axis2 (get_id(), x, y, z); } - void setAxis2 (const dVector3 a) - { setAxis2 (a[0], a[1], a[2]); } - - void getAnchor (dVector3 result) const - { dJointGetHinge2Anchor (get_id(), result); } - void getAnchor2 (dVector3 result) const - { dJointGetHinge2Anchor2 (get_id(), result); } - void getAxis1 (dVector3 result) const - { dJointGetHinge2Axis1 (get_id(), result); } - void getAxis2 (dVector3 result) const - { dJointGetHinge2Axis2 (get_id(), result); } - - dReal getAngle1() const - { return dJointGetHinge2Angle1 (get_id()); } - dReal getAngle1Rate() const - { return dJointGetHinge2Angle1Rate (get_id()); } - dReal getAngle2Rate() const - { return dJointGetHinge2Angle2Rate (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetHinge2Param (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetHinge2Param (get_id(), parameter); } - // TODO: expose params through methods - - void addTorques(dReal torque1, dReal torque2) - { dJointAddHinge2Torques(get_id(), torque1, torque2); } -}; - - -template -class dPRJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dPRJointTemplate (const dPRJointTemplate &); - void operator = (const dPRJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dPRJointTemplate() { } - dPRJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreatePR(world, group)); } - dPRJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreatePR(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreatePR(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetPRAnchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor (a[0], a[1], a[2]); } - void setAxis1 (dReal x, dReal y, dReal z) - { dJointSetPRAxis1 (get_id(), x, y, z); } - void setAxis1 (const dVector3 a) - { setAxis1(a[0], a[1], a[2]); } - void setAxis2 (dReal x, dReal y, dReal z) - { dJointSetPRAxis2 (get_id(), x, y, z); } - void setAxis2 (const dVector3 a) - { setAxis2(a[0], a[1], a[2]); } - - void getAnchor (dVector3 result) const - { dJointGetPRAnchor (get_id(), result); } - void getAxis1 (dVector3 result) const - { dJointGetPRAxis1 (get_id(), result); } - void getAxis2 (dVector3 result) const - { dJointGetPRAxis2 (get_id(), result); } - - dReal getPosition() const - { return dJointGetPRPosition (get_id()); } - dReal getPositionRate() const - { return dJointGetPRPositionRate (get_id()); } - - dReal getAngle() const - { return dJointGetPRAngle (get_id()); } - dReal getAngleRate() const - { return dJointGetPRAngleRate (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetPRParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetPRParam (get_id(), parameter); } -}; - - - -template -class dPUJointTemplate : public dJointTemplate -{ -private: - // intentionally undefined, don't use these - dPUJointTemplate (const dPUJointTemplate &); - void operator = (const dPUJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dPUJointTemplate() { } - dPUJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreatePU(world, group)); } - dPUJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreatePU(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) - { - destroy(); - set_id(dJointCreatePU(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetPUAnchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor (a[0], a[1], a[2]); } - void setAxis1 (dReal x, dReal y, dReal z) - { dJointSetPUAxis1 (get_id(), x, y, z); } - void setAxis1 (const dVector3 a) - { setAxis1(a[0], a[1], a[2]); } - void setAxis2 (dReal x, dReal y, dReal z) - { dJointSetPUAxis2 (get_id(), x, y, z); } - void setAxis3 (dReal x, dReal y, dReal z) - { dJointSetPUAxis3 (get_id(), x, y, z); } - void setAxis3 (const dVector3 a) - { setAxis3(a[0], a[1], a[2]); } - void setAxisP (dReal x, dReal y, dReal z) - { dJointSetPUAxis3 (get_id(), x, y, z); } - void setAxisP (const dVector3 a) - { setAxisP(a[0], a[1], a[2]); } - - virtual void getAnchor (dVector3 result) const - { dJointGetPUAnchor (get_id(), result); } - void getAxis1 (dVector3 result) const - { dJointGetPUAxis1 (get_id(), result); } - void getAxis2 (dVector3 result) const - { dJointGetPUAxis2 (get_id(), result); } - void getAxis3 (dVector3 result) const - { dJointGetPUAxis3 (get_id(), result); } - void getAxisP (dVector3 result) const - { dJointGetPUAxis3 (get_id(), result); } - - dReal getAngle1() const - { return dJointGetPUAngle1 (get_id()); } - dReal getAngle1Rate() const - { return dJointGetPUAngle1Rate (get_id()); } - dReal getAngle2() const - { return dJointGetPUAngle2 (get_id()); } - dReal getAngle2Rate() const - { return dJointGetPUAngle2Rate (get_id()); } - - dReal getPosition() const - { return dJointGetPUPosition (get_id()); } - dReal getPositionRate() const - { return dJointGetPUPositionRate (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetPUParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetPUParam (get_id(), parameter); } - // TODO: expose params through methods -}; - - - - - -template -class dPistonJointTemplate : public dJointTemplate -{ -private: - // intentionally undefined, don't use these - dPistonJointTemplate (const dPistonJointTemplate &); - void operator = (const dPistonJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dPistonJointTemplate() { } - dPistonJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreatePiston(world, group)); } - dPistonJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreatePiston(world, group)); } - - void create (dWorldID world, dJointGroupID group=0) - { - destroy(); - set_id(dJointCreatePiston(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetPistonAnchor (get_id(), x, y, z); } - void setAnchor (const dVector3 a) - { setAnchor (a[0], a[1], a[2]); } - void getAnchor (dVector3 result) const - { dJointGetPistonAnchor (get_id(), result); } - void getAnchor2 (dVector3 result) const - { dJointGetPistonAnchor2 (get_id(), result); } - - void setAxis (dReal x, dReal y, dReal z) - { dJointSetPistonAxis (get_id(), x, y, z); } - void setAxis (const dVector3 a) - { setAxis(a[0], a[1], a[2]); } - void getAxis (dVector3 result) const - { dJointGetPistonAxis (get_id(), result); } - - dReal getPosition() const - { return dJointGetPistonPosition (get_id()); } - dReal getPositionRate() const - { return dJointGetPistonPositionRate (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetPistonParam (get_id(), parameter, value); } - virtual dReal getParam (int parameter) const - { return dJointGetPistonParam (get_id(), parameter); } - // TODO: expose params through methods - - void addForce (dReal force) - { dJointAddPistonForce (get_id(), force); } -}; - - - -template -class dFixedJointTemplate : public dJointTemplate -{ -private: - // intentionally undefined, don't use these - dFixedJointTemplate (const dFixedJointTemplate &); - void operator = (const dFixedJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dFixedJointTemplate() { } - dFixedJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateFixed(world, group)); } - dFixedJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateFixed(world, group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateFixed(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void set() - { dJointSetFixed (get_id()); } - - virtual void setParam (int parameter, dReal value) - { dJointSetFixedParam (get_id(), parameter, value); } - - virtual dReal getParam (int parameter) const - { return dJointGetFixedParam (get_id(), parameter); } - // TODO: expose params through methods -}; - - -template -class dContactJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dContactJointTemplate (const dContactJointTemplate &); - void operator = (const dContactJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dContactJointTemplate() { } - dContactJointTemplate (dWorldID world, dJointGroupID group, dContact *contact) - { set_id(dJointCreateContact(world, group, contact)); } - dContactJointTemplate (dWorldTemplate& world, dJointGroupID group, dContact *contact) - { set_id(dJointCreateContact(world.id(), group, contact)); } - - void create (dWorldID world, dJointGroupID group, dContact *contact) { - destroy(); - set_id(dJointCreateContact(world, group, contact)); - } - - void create (dWorldTemplate& world, dJointGroupID group, dContact *contact) - { create(world.id(), group, contact); } -}; - - -template -class dNullJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dNullJointTemplate (const dNullJointTemplate &); - void operator = (const dNullJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dNullJointTemplate() { } - dNullJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateNull(world, group)); } - dNullJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateNull (world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateNull(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } -}; - - -template -class dAMotorJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dAMotorJointTemplate (const dAMotorJointTemplate &); - void operator = (const dAMotorJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dAMotorJointTemplate() { } - dAMotorJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateAMotor(world, group)); } - dAMotorJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateAMotor(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateAMotor(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setMode (int mode) - { dJointSetAMotorMode (get_id(), mode); } - int getMode() const - { return dJointGetAMotorMode (get_id()); } - - void setNumAxes (int num) - { dJointSetAMotorNumAxes (get_id(), num); } - int getNumAxes() const - { return dJointGetAMotorNumAxes (get_id()); } - - void setAxis (int anum, int rel, dReal x, dReal y, dReal z) - { dJointSetAMotorAxis (get_id(), anum, rel, x, y, z); } - void setAxis (int anum, int rel, const dVector3 a) - { setAxis(anum, rel, a[0], a[1], a[2]); } - void getAxis (int anum, dVector3 result) const - { dJointGetAMotorAxis (get_id(), anum, result); } - int getAxisRel (int anum) const - { return dJointGetAMotorAxisRel (get_id(), anum); } - - void setAngle (int anum, dReal angle) - { dJointSetAMotorAngle (get_id(), anum, angle); } - dReal getAngle (int anum) const - { return dJointGetAMotorAngle (get_id(), anum); } - dReal getAngleRate (int anum) - { return dJointGetAMotorAngleRate (get_id(), anum); } - - void setParam (int parameter, dReal value) - { dJointSetAMotorParam (get_id(), parameter, value); } - dReal getParam (int parameter) const - { return dJointGetAMotorParam (get_id(), parameter); } - // TODO: expose params through methods - - void addTorques(dReal torque1, dReal torque2, dReal torque3) - { dJointAddAMotorTorques(get_id(), torque1, torque2, torque3); } -}; - - -template -class dLMotorJointTemplate : public dJointTemplate { -private: - // intentionally undefined, don't use these - dLMotorJointTemplate (const dLMotorJointTemplate &); - void operator = (const dLMotorJointTemplate &); - -protected: - typedef dJointTemplate dBaseTemplate; - - dJointID get_id() const { return dBaseTemplate::get_id(); } - void set_id(dJointID value) { dBaseTemplate::set_id(value); } - - void destroy() { dBaseTemplate::destroy(); } - -public: - dLMotorJointTemplate() { } - dLMotorJointTemplate (dWorldID world, dJointGroupID group=0) - { set_id(dJointCreateLMotor(world, group)); } - dLMotorJointTemplate (dWorldTemplate& world, dJointGroupID group=0) - { set_id(dJointCreateLMotor(world.id(), group)); } - - void create (dWorldID world, dJointGroupID group=0) { - destroy(); - set_id(dJointCreateLMotor(world, group)); - } - void create (dWorldTemplate& world, dJointGroupID group=0) - { create(world.id(), group); } - - void setNumAxes (int num) - { dJointSetLMotorNumAxes (get_id(), num); } - int getNumAxes() const - { return dJointGetLMotorNumAxes (get_id()); } - - void setAxis (int anum, int rel, dReal x, dReal y, dReal z) - { dJointSetLMotorAxis (get_id(), anum, rel, x, y, z); } - void setAxis (int anum, int rel, const dVector3 a) - { setAxis(anum, rel, a[0], a[1], a[2]); } - void getAxis (int anum, dVector3 result) const - { dJointGetLMotorAxis (get_id(), anum, result); } - - void setParam (int parameter, dReal value) - { dJointSetLMotorParam (get_id(), parameter, value); } - dReal getParam (int parameter) const - { return dJointGetLMotorParam (get_id(), parameter); } - // TODO: expose params through methods -}; - -//} - -#if !defined(dODECPP_WORLD_TEMPLATE_BASE) - -#if defined(dODECPP_BODY_TEMPLATE_BASE) || defined(dODECPP_JOINTGROUP_TEMPLATE_BASE) || defined(dODECPP_JOINT_TEMPLATE_BASE) -#error All the odecpp template bases must be defined or not defined together -#endif - -#define dODECPP_WORLD_TEMPLATE_BASE dWorldDynamicIDContainer -#define dODECPP_BODY_TEMPLATE_BASE dBodyDynamicIDContainer -#define dODECPP_JOINTGROUP_TEMPLATE_BASE dJointGroupDynamicIDContainer -#define dODECPP_JOINT_TEMPLATE_BASE dJointDynamicIDContainer - -#else // #if defined(dODECPP_WORLD_TEMPLATE_BASE) - -#if !defined(dODECPP_BODY_TEMPLATE_BASE) || !defined(dODECPP_JOINTGROUP_TEMPLATE_BASE) || !defined(dODECPP_JOINT_TEMPLATE_BASE) -#error All the odecpp template bases must be defined or not defined together -#endif - -#endif // #if defined(dODECPP_WORLD_TEMPLATE_BASE) - - -typedef dWorldTemplate dWorld; -typedef dBodyTemplate dBody; -typedef dJointGroupTemplate dJointGroup; -typedef dJointTemplate dJoint; -typedef dBallJointTemplate dBallJoint; -typedef dHingeJointTemplate dHingeJoint; -typedef dSliderJointTemplate dSliderJoint; -typedef dUniversalJointTemplate dUniversalJoint; -typedef dHinge2JointTemplate dHinge2Joint; -typedef dPRJointTemplate dPRJoint; -typedef dPUJointTemplate dPUJoint; -typedef dPistonJointTemplate dPistonJoint; -typedef dFixedJointTemplate dFixedJoint; -typedef dContactJointTemplate dContactJoint; -typedef dNullJointTemplate dNullJoint; -typedef dAMotorJointTemplate dAMotorJoint; -typedef dLMotorJointTemplate dLMotorJoint; - - -#endif -#endif - -// Local variables: -// mode:c++ -// c-basic-offset:2 -// End: diff --git a/misc/builddeps/dp.linux64/include/ode/odecpp_collision.h b/misc/builddeps/dp.linux64/include/ode/odecpp_collision.h deleted file mode 100644 index 2377a5ef..00000000 --- a/misc/builddeps/dp.linux64/include/ode/odecpp_collision.h +++ /dev/null @@ -1,429 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* C++ interface for new collision API */ - - -#ifndef _ODE_ODECPP_COLLISION_H_ -#define _ODE_ODECPP_COLLISION_H_ -#ifdef __cplusplus - -//#include - -//namespace ode { - -class dGeom { - // intentionally undefined, don't use these - dGeom (dGeom &); - void operator= (dGeom &); - -protected: - dGeomID _id; - - dGeom() - { _id = 0; } -public: - ~dGeom() - { if (_id) dGeomDestroy (_id); } - - dGeomID id() const - { return _id; } - operator dGeomID() const - { return _id; } - - void destroy() { - if (_id) dGeomDestroy (_id); - _id = 0; - } - - int getClass() const - { return dGeomGetClass (_id); } - - dSpaceID getSpace() const - { return dGeomGetSpace (_id); } - - void setData (void *data) - { dGeomSetData (_id,data); } - void *getData() const - { return dGeomGetData (_id); } - - void setBody (dBodyID b) - { dGeomSetBody (_id,b); } - dBodyID getBody() const - { return dGeomGetBody (_id); } - - void setPosition (dReal x, dReal y, dReal z) - { dGeomSetPosition (_id,x,y,z); } - const dReal * getPosition() const - { return dGeomGetPosition (_id); } - - void setRotation (const dMatrix3 R) - { dGeomSetRotation (_id,R); } - const dReal * getRotation() const - { return dGeomGetRotation (_id); } - - void setQuaternion (const dQuaternion quat) - { dGeomSetQuaternion (_id,quat); } - void getQuaternion (dQuaternion quat) const - { dGeomGetQuaternion (_id,quat); } - - void getAABB (dReal aabb[6]) const - { dGeomGetAABB (_id, aabb); } - - int isSpace() - { return dGeomIsSpace (_id); } - - void setCategoryBits (unsigned long bits) - { dGeomSetCategoryBits (_id, bits); } - void setCollideBits (unsigned long bits) - { dGeomSetCollideBits (_id, bits); } - unsigned long getCategoryBits() - { return dGeomGetCategoryBits (_id); } - unsigned long getCollideBits() - { return dGeomGetCollideBits (_id); } - - void enable() - { dGeomEnable (_id); } - void disable() - { dGeomDisable (_id); } - int isEnabled() - { return dGeomIsEnabled (_id); } - - void getRelPointPos (dReal px, dReal py, dReal pz, dVector3 result) const - { dGeomGetRelPointPos (_id, px, py, pz, result); } - void getRelPointPos (const dVector3 p, dVector3 result) const - { getRelPointPos (p[0], p[1], p[2], result); } - - void getPosRelPoint (dReal px, dReal py, dReal pz, dVector3 result) const - { dGeomGetPosRelPoint (_id, px, py, pz, result); } - void getPosRelPoint (const dVector3 p, dVector3 result) const - { getPosRelPoint (p[0], p[1], p[2], result); } - - void vectorToWorld (dReal px, dReal py, dReal pz, dVector3 result) const - { dGeomVectorToWorld (_id, px, py, pz, result); } - void vectorToWorld (const dVector3 p, dVector3 result) const - { vectorToWorld (p[0], p[1], p[2], result); } - - void vectorFromWorld (dReal px, dReal py, dReal pz, dVector3 result) const - { dGeomVectorFromWorld (_id, px, py, pz, result); } - void vectorFromWorld (const dVector3 p, dVector3 result) const - { vectorFromWorld (p[0], p[1], p[2], result); } - - void collide2 (dGeomID g, void *data, dNearCallback *callback) - { dSpaceCollide2 (_id,g,data,callback); } -}; - - -class dSpace : public dGeom { - // intentionally undefined, don't use these - dSpace (dSpace &); - void operator= (dSpace &); - -protected: - // the default constructor is protected so that you - // can't instance this class. you must instance one - // of its subclasses instead. - dSpace () { _id = 0; } - -public: - dSpaceID id() const - { return (dSpaceID) _id; } - operator dSpaceID() const - { return (dSpaceID) _id; } - - void setCleanup (int mode) - { dSpaceSetCleanup (id(), mode); } - int getCleanup() - { return dSpaceGetCleanup (id()); } - - void add (dGeomID x) - { dSpaceAdd (id(), x); } - void remove (dGeomID x) - { dSpaceRemove (id(), x); } - int query (dGeomID x) - { return dSpaceQuery (id(),x); } - - int getNumGeoms() - { return dSpaceGetNumGeoms (id()); } - dGeomID getGeom (int i) - { return dSpaceGetGeom (id(),i); } - - void collide (void *data, dNearCallback *callback) - { dSpaceCollide (id(),data,callback); } -}; - - -class dSimpleSpace : public dSpace { - // intentionally undefined, don't use these - dSimpleSpace (dSimpleSpace &); - void operator= (dSimpleSpace &); - -public: - dSimpleSpace () - { _id = (dGeomID) dSimpleSpaceCreate (0); } - dSimpleSpace (dSpace &space) - { _id = (dGeomID) dSimpleSpaceCreate (space.id()); } - dSimpleSpace (dSpaceID space) - { _id = (dGeomID) dSimpleSpaceCreate (space); } -}; - - -class dHashSpace : public dSpace { - // intentionally undefined, don't use these - dHashSpace (dHashSpace &); - void operator= (dHashSpace &); - -public: - dHashSpace () - { _id = (dGeomID) dHashSpaceCreate (0); } - dHashSpace (dSpace &space) - { _id = (dGeomID) dHashSpaceCreate (space.id()); } - dHashSpace (dSpaceID space) - { _id = (dGeomID) dHashSpaceCreate (space); } - - void setLevels (int minlevel, int maxlevel) - { dHashSpaceSetLevels (id(),minlevel,maxlevel); } -}; - - -class dQuadTreeSpace : public dSpace { - // intentionally undefined, don't use these - dQuadTreeSpace (dQuadTreeSpace &); - void operator= (dQuadTreeSpace &); - -public: - dQuadTreeSpace (const dVector3 center, const dVector3 extents, int depth) - { _id = (dGeomID) dQuadTreeSpaceCreate (0,center,extents,depth); } - dQuadTreeSpace (dSpace &space, const dVector3 center, const dVector3 extents, int depth) - { _id = (dGeomID) dQuadTreeSpaceCreate (space.id(),center,extents,depth); } - dQuadTreeSpace (dSpaceID space, const dVector3 center, const dVector3 extents, int depth) - { _id = (dGeomID) dQuadTreeSpaceCreate (space,center,extents,depth); } -}; - - -class dSphere : public dGeom { - // intentionally undefined, don't use these - dSphere (dSphere &); - void operator= (dSphere &); - -public: - dSphere () { } - dSphere (dReal radius) - { _id = dCreateSphere (0, radius); } - dSphere (dSpace &space, dReal radius) - { _id = dCreateSphere (space.id(), radius); } - dSphere (dSpaceID space, dReal radius) - { _id = dCreateSphere (space, radius); } - - void create (dSpaceID space, dReal radius) { - if (_id) dGeomDestroy (_id); - _id = dCreateSphere (space, radius); - } - - void setRadius (dReal radius) - { dGeomSphereSetRadius (_id, radius); } - dReal getRadius() const - { return dGeomSphereGetRadius (_id); } -}; - - -class dBox : public dGeom { - // intentionally undefined, don't use these - dBox (dBox &); - void operator= (dBox &); - -public: - dBox () { } - dBox (dReal lx, dReal ly, dReal lz) - { _id = dCreateBox (0,lx,ly,lz); } - dBox (dSpace &space, dReal lx, dReal ly, dReal lz) - { _id = dCreateBox (space,lx,ly,lz); } - dBox (dSpaceID space, dReal lx, dReal ly, dReal lz) - { _id = dCreateBox (space,lx,ly,lz); } - - void create (dSpaceID space, dReal lx, dReal ly, dReal lz) { - if (_id) dGeomDestroy (_id); - _id = dCreateBox (space,lx,ly,lz); - } - - void setLengths (dReal lx, dReal ly, dReal lz) - { dGeomBoxSetLengths (_id, lx, ly, lz); } - void getLengths (dVector3 result) const - { dGeomBoxGetLengths (_id,result); } -}; - - -class dPlane : public dGeom { - // intentionally undefined, don't use these - dPlane (dPlane &); - void operator= (dPlane &); - -public: - dPlane() { } - dPlane (dReal a, dReal b, dReal c, dReal d) - { _id = dCreatePlane (0,a,b,c,d); } - dPlane (dSpace &space, dReal a, dReal b, dReal c, dReal d) - { _id = dCreatePlane (space.id(),a,b,c,d); } - dPlane (dSpaceID space, dReal a, dReal b, dReal c, dReal d) - { _id = dCreatePlane (space,a,b,c,d); } - - void create (dSpaceID space, dReal a, dReal b, dReal c, dReal d) { - if (_id) dGeomDestroy (_id); - _id = dCreatePlane (space,a,b,c,d); - } - - void setParams (dReal a, dReal b, dReal c, dReal d) - { dGeomPlaneSetParams (_id, a, b, c, d); } - void getParams (dVector4 result) const - { dGeomPlaneGetParams (_id,result); } -}; - - -class dCapsule : public dGeom { - // intentionally undefined, don't use these - dCapsule (dCapsule &); - void operator= (dCapsule &); - -public: - dCapsule() { } - dCapsule (dReal radius, dReal length) - { _id = dCreateCapsule (0,radius,length); } - dCapsule (dSpace &space, dReal radius, dReal length) - { _id = dCreateCapsule (space.id(),radius,length); } - dCapsule (dSpaceID space, dReal radius, dReal length) - { _id = dCreateCapsule (space,radius,length); } - - void create (dSpaceID space, dReal radius, dReal length) { - if (_id) dGeomDestroy (_id); - _id = dCreateCapsule (space,radius,length); - } - - void setParams (dReal radius, dReal length) - { dGeomCapsuleSetParams (_id, radius, length); } - void getParams (dReal *radius, dReal *length) const - { dGeomCapsuleGetParams (_id,radius,length); } -}; - - -class dCylinder : public dGeom { - // intentionally undefined, don't use these - dCylinder (dCylinder &); - void operator= (dCylinder &); - -public: - dCylinder() { } - dCylinder (dReal radius, dReal length) - { _id = dCreateCylinder (0,radius,length); } - dCylinder (dSpace &space, dReal radius, dReal length) - { _id = dCreateCylinder (space.id(),radius,length); } - dCylinder (dSpaceID space, dReal radius, dReal length) - { _id = dCreateCylinder (space,radius,length); } - - void create (dSpaceID space, dReal radius, dReal length) { - if (_id) dGeomDestroy (_id); - _id = dCreateCylinder (space,radius,length); - } - - void setParams (dReal radius, dReal length) - { dGeomCylinderSetParams (_id, radius, length); } - void getParams (dReal *radius, dReal *length) const - { dGeomCylinderGetParams (_id,radius,length); } -}; - - -class dRay : public dGeom { - // intentionally undefined, don't use these - dRay (dRay &); - void operator= (dRay &); - -public: - dRay() { } - dRay (dReal length) - { _id = dCreateRay (0,length); } - dRay (dSpace &space, dReal length) - { _id = dCreateRay (space.id(),length); } - dRay (dSpaceID space, dReal length) - { _id = dCreateRay (space,length); } - - void create (dSpaceID space, dReal length) { - if (_id) dGeomDestroy (_id); - _id = dCreateRay (space,length); - } - - void setLength (dReal length) - { dGeomRaySetLength (_id, length); } - dReal getLength() - { return dGeomRayGetLength (_id); } - - void set (dReal px, dReal py, dReal pz, dReal dx, dReal dy, dReal dz) - { dGeomRaySet (_id, px, py, pz, dx, dy, dz); } - void get (dVector3 start, dVector3 dir) - { dGeomRayGet (_id, start, dir); } - - void setParams (int firstContact, int backfaceCull) - { dGeomRaySetParams (_id, firstContact, backfaceCull); } - void getParams (int *firstContact, int *backfaceCull) - { dGeomRayGetParams (_id, firstContact, backfaceCull); } - void setClosestHit (int closestHit) - { dGeomRaySetClosestHit (_id, closestHit); } - int getClosestHit() - { return dGeomRayGetClosestHit (_id); } -}; - - -class dGeomTransform : public dGeom { - // intentionally undefined, don't use these - dGeomTransform (dGeomTransform &); - void operator= (dGeomTransform &); - -public: - dGeomTransform() { } - dGeomTransform (dSpace &space) - { _id = dCreateGeomTransform (space.id()); } - dGeomTransform (dSpaceID space) - { _id = dCreateGeomTransform (space); } - - void create (dSpaceID space=0) { - if (_id) dGeomDestroy (_id); - _id = dCreateGeomTransform (space); - } - - void setGeom (dGeomID geom) - { dGeomTransformSetGeom (_id, geom); } - dGeomID getGeom() const - { return dGeomTransformGetGeom (_id); } - - void setCleanup (int mode) - { dGeomTransformSetCleanup (_id,mode); } - int getCleanup () - { return dGeomTransformGetCleanup (_id); } - - void setInfo (int mode) - { dGeomTransformSetInfo (_id,mode); } - int getInfo() - { return dGeomTransformGetInfo (_id); } -}; - -//} - -#endif -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/odeinit.h b/misc/builddeps/dp.linux64/include/ode/odeinit.h deleted file mode 100644 index bb430c8f..00000000 --- a/misc/builddeps/dp.linux64/include/ode/odeinit.h +++ /dev/null @@ -1,236 +0,0 @@ -/************************************************************************* -* * -* Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * -* All rights reserved. Email: russ@q12.org Web: www.q12.org * -* * -* This library is free software; you can redistribute it and/or * -* modify it under the terms of EITHER: * -* (1) The GNU Lesser General Public License as published by the Free * -* Software Foundation; either version 2.1 of the License, or (at * -* your option) any later version. The text of the GNU Lesser * -* General Public License is included with this library in the * -* file LICENSE.TXT. * -* (2) The BSD-style license that is included with this library in * -* the file LICENSE-BSD.TXT. * -* * -* 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 files * -* LICENSE.TXT and LICENSE-BSD.TXT for more details. * -* * -*************************************************************************/ - -/* Library initialization/finalization functions. */ - -#ifndef _ODE_ODEINIT_H_ -#define _ODE_ODEINIT_H_ - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - -/* ************************************************************************ */ -/* Library initialization */ - -/** - * @defgroup init Library Initialization - * - * Library initialization functions prepare ODE internal data structures for use - * and release allocated resources after ODE is not needed any more. - */ - - -/** - * @brief Library initialization flags. - * - * These flags define ODE library initialization options. - * - * @c dInitFlagManualThreadCleanup indicates that resources allocated in TLS for threads - * using ODE are to be cleared by library client with explicit call to @c dCleanupODEAllDataForThread. - * If this flag is not specified the automatic resource tracking algorithm is used. - * - * With automatic resource tracking, On Windows, memory allocated for a thread may - * remain not freed for some time after the thread exits. The resources may be - * released when one of other threads calls @c dAllocateODEDataForThread. Ultimately, - * the resources are released when library is closed with @c dCloseODE. On other - * operating systems resources are always released by the thread itself on its exit - * or on library closure with @c dCloseODE. - * - * With manual thread data cleanup mode every collision space object must be - * explicitly switched to manual cleanup mode with @c dSpaceSetManualCleanup - * after creation. See description of the function for more details. - * - * If @c dInitFlagManualThreadCleanup was not specified during initialization, - * calls to @c dCleanupODEAllDataForThread are not allowed. - * - * @see dInitODE2 - * @see dAllocateODEDataForThread - * @see dSpaceSetManualCleanup - * @see dCloseODE - * @ingroup init - */ -enum dInitODEFlags { - dInitFlagManualThreadCleanup = 0x00000001 //@< Thread local data is to be cleared explicitly on @c dCleanupODEAllDataForThread function call -}; - -/** - * @brief Initializes ODE library. - * - * @c dInitODE is obsolete. @c dInitODE2 is to be used for library initialization. - * - * A call to @c dInitODE is equal to the following initialization sequence - * @code - * dInitODE2(0); - * dAllocateODEDataForThread(dAllocateMaskAll); - * @endcode - * - * @see dInitODE2 - * @see dAllocateODEDataForThread - * @ingroup init - */ -ODE_API void dInitODE(void); - -/** - * @brief Initializes ODE library. - * @param uiInitFlags Initialization options bitmask - * @return A nonzero if initialization succeeded and zero otherwise. - * - * This function must be called to initialize ODE library before first use. If - * initialization succeeds the function may not be called again until library is - * closed with a call to @c dCloseODE. - * - * The @a uiInitFlags parameter specifies initialization options to be used. These - * can be combination of zero or more @c dInitODEFlags flags. - * - * @note - * If @c dInitFlagManualThreadCleanup flag is used for initialization, - * @c dSpaceSetManualCleanup must be called to set manual cleanup mode for every - * space object right after creation. Failure to do so may lead to resource leaks. - * - * @see dInitODEFlags - * @see dCloseODE - * @see dSpaceSetManualCleanup - * @ingroup init - */ -ODE_API int dInitODE2(unsigned int uiInitFlags/*=0*/); - - -/** - * @brief ODE data allocation flags. - * - * These flags are used to indicate which data is to be pre-allocated in call to - * @c dAllocateODEDataForThread. - * - * @c dAllocateFlagBasicData tells to allocate the basic data set required for - * normal library operation. This flag is equal to zero and is always implicitly - * included. - * - * @c dAllocateFlagCollisionData tells that collision detection data is to be allocated. - * Collision detection functions may not be called if the data has not be allocated - * in advance. If collision detection is not going to be used, it is not necessary - * to specify this flag. - * - * @c dAllocateMaskAll is a mask that can be used for for allocating all possible - * data in cases when it is not known what exactly features of ODE will be used. - * The mask may not be used in combination with other flags. It is guaranteed to - * include all the current and future legal allocation flags. However, mature - * applications should use explicit flags they need rather than allocating everything. - * - * @see dAllocateODEDataForThread - * @ingroup init - */ -enum dAllocateODEDataFlags { - dAllocateFlagBasicData = 0, //@< Allocate basic data required for library to operate - - dAllocateFlagCollisionData = 0x00000001, //@< Allocate data for collision detection - - dAllocateMaskAll = ~0U //@< Allocate all the possible data that is currently defined or will be defined in the future. -}; - -/** - * @brief Allocate thread local data to allow the thread calling ODE. - * @param uiAllocateFlags Allocation options bitmask. - * @return A nonzero if allocation succeeded and zero otherwise. - * - * The function is required to be called for every thread that is going to use - * ODE. This function allocates the data that is required for accessing ODE from - * current thread along with optional data required for particular ODE subsystems. - * - * @a uiAllocateFlags parameter can contain zero or more flags from @c dAllocateODEDataFlags - * enumerated type. Multiple calls with different allocation flags are allowed. - * The flags that are already allocated are ignored in subsequent calls. If zero - * is passed as the parameter, it means to only allocate the set of most important - * data the library can not operate without. - * - * If the function returns failure status it means that none of the requested - * data has been allocated. The client may retry allocation attempt with the same - * flags when more system resources are available. - * - * @see dAllocateODEDataFlags - * @see dCleanupODEAllDataForThread - * @ingroup init - */ -ODE_API int dAllocateODEDataForThread(unsigned int uiAllocateFlags); - -/** - * @brief Free thread local data that was allocated for current thread. - * - * If library was initialized with @c dInitFlagManualThreadCleanup flag the function - * is required to be called on exit of every thread that was calling @c dAllocateODEDataForThread. - * Failure to call @c dCleanupODEAllDataForThread may result in some resources remaining - * not freed until program exit. The function may also be called when ODE is still - * being used to release resources allocated for all the current subsystems and - * possibly proceed with data pre-allocation for other subsystems. - * - * The function can safely be called several times in a row. The function can be - * called without prior invocation of @c dAllocateODEDataForThread. The function - * may not be called before ODE is initialized with @c dInitODE2 or after library - * has been closed with @c dCloseODE. A call to @c dCloseODE implicitly releases - * all the thread local resources that might be allocated for all the threads that - * were using ODE. - * - * If library was initialized without @c dInitFlagManualThreadCleanup flag - * @c dCleanupODEAllDataForThread must not be called. - * - * @see dAllocateODEDataForThread - * @see dInitODE2 - * @see dCloseODE - * @ingroup init - */ -ODE_API void dCleanupODEAllDataForThread(); - - -/** - * @brief Close ODE after it is not needed any more. - * - * The function is required to be called when program does not need ODE features any more. - * The call to @c dCloseODE releases all the resources allocated for library - * including all the thread local data that might be allocated for all the threads - * that were using ODE. - * - * @c dCloseODE is a paired function for @c dInitODE2 and must only be called - * after successful library initialization. - * - * @note Important! - * Make sure that all the threads that were using ODE have already terminated - * before calling @c dCloseODE. In particular it is not allowed to call - * @c dCleanupODEAllDataForThread after @c dCloseODE. - * - * @see dInitODE2 - * @see dCleanupODEAllDataForThread - * @ingroup init - */ -ODE_API void dCloseODE(void); - - - -#ifdef __cplusplus -} // extern "C" -#endif - - -#endif // _ODE_ODEINIT_H_ diff --git a/misc/builddeps/dp.linux64/include/ode/odemath.h b/misc/builddeps/dp.linux64/include/ode/odemath.h deleted file mode 100644 index 2e689dbf..00000000 --- a/misc/builddeps/dp.linux64/include/ode/odemath.h +++ /dev/null @@ -1,473 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_ODEMATH_H_ -#define _ODE_ODEMATH_H_ - -#include - -/* - * macro to access elements i,j in an NxM matrix A, independent of the - * matrix storage convention. - */ -#define dACCESS33(A,i,j) ((A)[(i)*4+(j)]) - -/* - * Macro to test for valid floating point values - */ -#define dVALIDVEC3(v) (!(dIsNan(v[0]) || dIsNan(v[1]) || dIsNan(v[2]))) -#define dVALIDVEC4(v) (!(dIsNan(v[0]) || dIsNan(v[1]) || dIsNan(v[2]) || dIsNan(v[3]))) -#define dVALIDMAT3(m) (!(dIsNan(m[0]) || dIsNan(m[1]) || dIsNan(m[2]) || dIsNan(m[3]) || dIsNan(m[4]) || dIsNan(m[5]) || dIsNan(m[6]) || dIsNan(m[7]) || dIsNan(m[8]) || dIsNan(m[9]) || dIsNan(m[10]) || dIsNan(m[11]))) -#define dVALIDMAT4(m) (!(dIsNan(m[0]) || dIsNan(m[1]) || dIsNan(m[2]) || dIsNan(m[3]) || dIsNan(m[4]) || dIsNan(m[5]) || dIsNan(m[6]) || dIsNan(m[7]) || dIsNan(m[8]) || dIsNan(m[9]) || dIsNan(m[10]) || dIsNan(m[11]) || dIsNan(m[12]) || dIsNan(m[13]) || dIsNan(m[14]) || dIsNan(m[15]) )) - - - -// Some vector math -PURE_INLINE void dAddVectors3(dReal *res, const dReal *a, const dReal *b) -{ - dReal res_0, res_1, res_2; - res_0 = a[0] + b[0]; - res_1 = a[1] + b[1]; - res_2 = a[2] + b[2]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dSubtractVectors3(dReal *res, const dReal *a, const dReal *b) -{ - dReal res_0, res_1, res_2; - res_0 = a[0] - b[0]; - res_1 = a[1] - b[1]; - res_2 = a[2] - b[2]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dAddScaledVectors3(dReal *res, const dReal *a, const dReal *b, dReal a_scale, dReal b_scale) -{ - dReal res_0, res_1, res_2; - res_0 = a_scale * a[0] + b_scale * b[0]; - res_1 = a_scale * a[1] + b_scale * b[1]; - res_2 = a_scale * a[2] + b_scale * b[2]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dScaleVector3(dReal *res, dReal nScale) -{ - res[0] *= nScale ; - res[1] *= nScale ; - res[2] *= nScale ; -} - -PURE_INLINE void dNegateVector3(dReal *res) -{ - res[0] = -res[0]; - res[1] = -res[1]; - res[2] = -res[2]; -} - -PURE_INLINE void dCopyVector3(dReal *res, const dReal *a) -{ - dReal res_0, res_1, res_2; - res_0 = a[0]; - res_1 = a[1]; - res_2 = a[2]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dCopyScaledVector3(dReal *res, const dReal *a, dReal nScale) -{ - dReal res_0, res_1, res_2; - res_0 = a[0] * nScale; - res_1 = a[1] * nScale; - res_2 = a[2] * nScale; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dCopyNegatedVector3(dReal *res, const dReal *a) -{ - dReal res_0, res_1, res_2; - res_0 = -a[0]; - res_1 = -a[1]; - res_2 = -a[2]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dCopyVector4(dReal *res, const dReal *a) -{ - dReal res_0, res_1, res_2, res_3; - res_0 = a[0]; - res_1 = a[1]; - res_2 = a[2]; - res_3 = a[3]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; res[3] = res_3; -} - -PURE_INLINE void dCopyMatrix4x4(dReal *res, const dReal *a) -{ - dCopyVector4(res + 0, a + 0); - dCopyVector4(res + 4, a + 4); - dCopyVector4(res + 8, a + 8); -} - -PURE_INLINE void dCopyMatrix4x3(dReal *res, const dReal *a) -{ - dCopyVector3(res + 0, a + 0); - dCopyVector3(res + 4, a + 4); - dCopyVector3(res + 8, a + 8); -} - -PURE_INLINE void dGetMatrixColumn3(dReal *res, const dReal *a, unsigned n) -{ - dReal res_0, res_1, res_2; - res_0 = a[n + 0]; - res_1 = a[n + 4]; - res_2 = a[n + 8]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE dReal dCalcVectorLength3(const dReal *a) -{ - return dSqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); -} - -PURE_INLINE dReal dCalcVectorLengthSquare3(const dReal *a) -{ - return (a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); -} - -PURE_INLINE dReal dCalcPointDepth3(const dReal *test_p, const dReal *plane_p, const dReal *plane_n) -{ - return (plane_p[0] - test_p[0]) * plane_n[0] + (plane_p[1] - test_p[1]) * plane_n[1] + (plane_p[2] - test_p[2]) * plane_n[2]; -} - - -/* -* 3-way dot product. _dCalcVectorDot3 means that elements of `a' and `b' are spaced -* step_a and step_b indexes apart respectively. dCalcVectorDot3() means dDot311. -*/ - -PURE_INLINE dReal _dCalcVectorDot3(const dReal *a, const dReal *b, unsigned step_a, unsigned step_b) -{ - return a[0] * b[0] + a[step_a] * b[step_b] + a[2 * step_a] * b[2 * step_b]; -} - - -PURE_INLINE dReal dCalcVectorDot3 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,1,1); } -PURE_INLINE dReal dCalcVectorDot3_13 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,1,3); } -PURE_INLINE dReal dCalcVectorDot3_31 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,3,1); } -PURE_INLINE dReal dCalcVectorDot3_33 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,3,3); } -PURE_INLINE dReal dCalcVectorDot3_14 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,1,4); } -PURE_INLINE dReal dCalcVectorDot3_41 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,4,1); } -PURE_INLINE dReal dCalcVectorDot3_44 (const dReal *a, const dReal *b) { return _dCalcVectorDot3(a,b,4,4); } - - -/* - * cross product, set res = a x b. _dCalcVectorCross3 means that elements of `res', `a' - * and `b' are spaced step_res, step_a and step_b indexes apart respectively. - * dCalcVectorCross3() means dCross3111. - */ - -PURE_INLINE void _dCalcVectorCross3(dReal *res, const dReal *a, const dReal *b, unsigned step_res, unsigned step_a, unsigned step_b) -{ - dReal res_0, res_1, res_2; - res_0 = a[ step_a]*b[2*step_b] - a[2*step_a]*b[ step_b]; - res_1 = a[2*step_a]*b[ 0] - a[ 0]*b[2*step_b]; - res_2 = a[ 0]*b[ step_b] - a[ step_a]*b[ 0]; - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[ 0] = res_0; - res[ step_res] = res_1; - res[2*step_res] = res_2; -} - -PURE_INLINE void dCalcVectorCross3 (dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 1, 1, 1); } -PURE_INLINE void dCalcVectorCross3_114(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 1, 1, 4); } -PURE_INLINE void dCalcVectorCross3_141(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 1, 4, 1); } -PURE_INLINE void dCalcVectorCross3_144(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 1, 4, 4); } -PURE_INLINE void dCalcVectorCross3_411(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 4, 1, 1); } -PURE_INLINE void dCalcVectorCross3_414(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 4, 1, 4); } -PURE_INLINE void dCalcVectorCross3_441(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 4, 4, 1); } -PURE_INLINE void dCalcVectorCross3_444(dReal *res, const dReal *a, const dReal *b) { _dCalcVectorCross3(res, a, b, 4, 4, 4); } - -PURE_INLINE void dAddVectorCross3(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dCalcVectorCross3(tmp, a, b); - dAddVectors3(res, res, tmp); -} - -PURE_INLINE void dSubtractVectorCross3(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dCalcVectorCross3(tmp, a, b); - dSubtractVectors3(res, res, tmp); -} - - -/* - * set a 3x3 submatrix of A to a matrix such that submatrix(A)*b = a x b. - * A is stored by rows, and has `skip' elements per row. the matrix is - * assumed to be already zero, so this does not write zero elements! - * if (plus,minus) is (+,-) then a positive version will be written. - * if (plus,minus) is (-,+) then a negative version will be written. - */ - -PURE_INLINE void dSetCrossMatrixPlus(dReal *res, const dReal *a, unsigned skip) -{ - const dReal a_0 = a[0], a_1 = a[1], a_2 = a[2]; - res[1] = -a_2; - res[2] = +a_1; - res[skip+0] = +a_2; - res[skip+2] = -a_0; - res[2*skip+0] = -a_1; - res[2*skip+1] = +a_0; -} - -PURE_INLINE void dSetCrossMatrixMinus(dReal *res, const dReal *a, unsigned skip) -{ - const dReal a_0 = a[0], a_1 = a[1], a_2 = a[2]; - res[1] = +a_2; - res[2] = -a_1; - res[skip+0] = -a_2; - res[skip+2] = +a_0; - res[2*skip+0] = +a_1; - res[2*skip+1] = -a_0; -} - - -/* - * compute the distance between two 3D-vectors - */ - -PURE_INLINE dReal dCalcPointsDistance3(const dReal *a, const dReal *b) -{ - dReal res; - dReal tmp[3]; - dSubtractVectors3(tmp, a, b); - res = dCalcVectorLength3(tmp); - return res; -} - -/* - * special case matrix multiplication, with operator selection - */ - -PURE_INLINE void dMultiplyHelper0_331(dReal *res, const dReal *a, const dReal *b) -{ - dReal res_0, res_1, res_2; - res_0 = dCalcVectorDot3(a, b); - res_1 = dCalcVectorDot3(a + 4, b); - res_2 = dCalcVectorDot3(a + 8, b); - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dMultiplyHelper1_331(dReal *res, const dReal *a, const dReal *b) -{ - dReal res_0, res_1, res_2; - res_0 = dCalcVectorDot3_41(a, b); - res_1 = dCalcVectorDot3_41(a + 1, b); - res_2 = dCalcVectorDot3_41(a + 2, b); - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -PURE_INLINE void dMultiplyHelper0_133(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper1_331(res, b, a); -} - -PURE_INLINE void dMultiplyHelper1_133(dReal *res, const dReal *a, const dReal *b) -{ - dReal res_0, res_1, res_2; - res_0 = dCalcVectorDot3_44(a, b); - res_1 = dCalcVectorDot3_44(a + 1, b); - res_2 = dCalcVectorDot3_44(a + 2, b); - // Only assign after all the calculations are over to avoid incurring memory aliasing - res[0] = res_0; res[1] = res_1; res[2] = res_2; -} - -/* -Note: NEVER call any of these functions/macros with the same variable for A and C, -it is not equivalent to A*=B. -*/ - -PURE_INLINE void dMultiply0_331(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper0_331(res, a, b); -} - -PURE_INLINE void dMultiply1_331(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper1_331(res, a, b); -} - -PURE_INLINE void dMultiply0_133(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper0_133(res, a, b); -} - -PURE_INLINE void dMultiply0_333(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper0_133(res + 0, a + 0, b); - dMultiplyHelper0_133(res + 4, a + 4, b); - dMultiplyHelper0_133(res + 8, a + 8, b); -} - -PURE_INLINE void dMultiply1_333(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper1_133(res + 0, b, a + 0); - dMultiplyHelper1_133(res + 4, b, a + 1); - dMultiplyHelper1_133(res + 8, b, a + 2); -} - -PURE_INLINE void dMultiply2_333(dReal *res, const dReal *a, const dReal *b) -{ - dMultiplyHelper0_331(res + 0, b, a + 0); - dMultiplyHelper0_331(res + 4, b, a + 4); - dMultiplyHelper0_331(res + 8, b, a + 8); -} - -PURE_INLINE void dMultiplyAdd0_331(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dMultiplyHelper0_331(tmp, a, b); - dAddVectors3(res, res, tmp); -} - -PURE_INLINE void dMultiplyAdd1_331(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dMultiplyHelper1_331(tmp, a, b); - dAddVectors3(res, res, tmp); -} - -PURE_INLINE void dMultiplyAdd0_133(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dMultiplyHelper0_133(tmp, a, b); - dAddVectors3(res, res, tmp); -} - -PURE_INLINE void dMultiplyAdd0_333(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dMultiplyHelper0_133(tmp, a + 0, b); - dAddVectors3(res+ 0, res + 0, tmp); - dMultiplyHelper0_133(tmp, a + 4, b); - dAddVectors3(res + 4, res + 4, tmp); - dMultiplyHelper0_133(tmp, a + 8, b); - dAddVectors3(res + 8, res + 8, tmp); -} - -PURE_INLINE void dMultiplyAdd1_333(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dMultiplyHelper1_133(tmp, b, a + 0); - dAddVectors3(res + 0, res + 0, tmp); - dMultiplyHelper1_133(tmp, b, a + 1); - dAddVectors3(res + 4, res + 4, tmp); - dMultiplyHelper1_133(tmp, b, a + 2); - dAddVectors3(res + 8, res + 8, tmp); -} - -PURE_INLINE void dMultiplyAdd2_333(dReal *res, const dReal *a, const dReal *b) -{ - dReal tmp[3]; - dMultiplyHelper0_331(tmp, b, a + 0); - dAddVectors3(res + 0, res + 0, tmp); - dMultiplyHelper0_331(tmp, b, a + 4); - dAddVectors3(res + 4, res + 4, tmp); - dMultiplyHelper0_331(tmp, b, a + 8); - dAddVectors3(res + 8, res + 8, tmp); -} - - -// Include legacy macros here -#include - - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * normalize 3x1 and 4x1 vectors (i.e. scale them to unit length) - */ - -// For DLL export -ODE_API int dSafeNormalize3 (dVector3 a); -ODE_API int dSafeNormalize4 (dVector4 a); -ODE_API void dNormalize3 (dVector3 a); // Potentially asserts on zero vec -ODE_API void dNormalize4 (dVector4 a); // Potentially asserts on zero vec - -#if defined(__ODE__) - -int _dSafeNormalize3 (dVector3 a); -int _dSafeNormalize4 (dVector4 a); - -PURE_INLINE void _dNormalize3(dVector3 a) -{ - int bNormalizationResult = _dSafeNormalize3(a); - dIVERIFY(bNormalizationResult); -} - -PURE_INLINE void _dNormalize4(dVector4 a) -{ - int bNormalizationResult = _dSafeNormalize4(a); - dIVERIFY(bNormalizationResult); -} - -// For internal use -#define dSafeNormalize3(a) _dSafeNormalize3(a) -#define dSafeNormalize4(a) _dSafeNormalize4(a) -#define dNormalize3(a) _dNormalize3(a) -#define dNormalize4(a) _dNormalize4(a) - -#endif // defined(__ODE__) - -/* - * given a unit length "normal" vector n, generate vectors p and q vectors - * that are an orthonormal basis for the plane space perpendicular to n. - * i.e. this makes p,q such that n,p,q are all perpendicular to each other. - * q will equal n x p. if n is not unit length then p will be unit length but - * q wont be. - */ - -ODE_API void dPlaneSpace (const dVector3 n, dVector3 p, dVector3 q); -/* Makes sure the matrix is a proper rotation */ -ODE_API void dOrthogonalizeR(dMatrix3 m); - - - -#ifdef __cplusplus -} -#endif - - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/odemath_legacy.h b/misc/builddeps/dp.linux64/include/ode/odemath_legacy.h deleted file mode 100644 index b7426380..00000000 --- a/misc/builddeps/dp.linux64/include/ode/odemath_legacy.h +++ /dev/null @@ -1,181 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_ODEMATH_LEGACY_H_ -#define _ODE_ODEMATH_LEGACY_H_ - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -* These macros are not used any more inside of ODE -* They are kept for backward compatibility with external code that -* might still be using them. -*/ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -/* -* General purpose vector operations with other vectors or constants. -*/ - -#define dOP(a,op,b,c) do { \ - (a)[0] = ((b)[0]) op ((c)[0]); \ - (a)[1] = ((b)[1]) op ((c)[1]); \ - (a)[2] = ((b)[2]) op ((c)[2]); \ -} while (0) -#define dOPC(a,op,b,c) do { \ - (a)[0] = ((b)[0]) op (c); \ - (a)[1] = ((b)[1]) op (c); \ - (a)[2] = ((b)[2]) op (c); \ -} while (0) -#define dOPE(a,op,b) do {\ - (a)[0] op ((b)[0]); \ - (a)[1] op ((b)[1]); \ - (a)[2] op ((b)[2]); \ -} while (0) -#define dOPEC(a,op,c) do { \ - (a)[0] op (c); \ - (a)[1] op (c); \ - (a)[2] op (c); \ -} while (0) - -/// Define an equation with operators -/// For example this function can be used to replace -///
-/// for (int i=0; i<3; ++i)
-///   a[i] += b[i] + c[i];
-/// 
-#define dOPE2(a,op1,b,op2,c) do { \ - (a)[0] op1 ((b)[0]) op2 ((c)[0]); \ - (a)[1] op1 ((b)[1]) op2 ((c)[1]); \ - (a)[2] op1 ((b)[2]) op2 ((c)[2]); \ -} while (0) - - -#define dLENGTHSQUARED(a) dCalcVectorLengthSquare3(a) -#define dLENGTH(a) dCalcVectorLength3(a) -#define dDISTANCE(a, b) dCalcPointsDistance3(a, b) - - -#define dDOT(a, b) dCalcVectorDot3(a, b) -#define dDOT13(a, b) dCalcVectorDot3_13(a, b) -#define dDOT31(a, b) dCalcVectorDot3_31(a, b) -#define dDOT33(a, b) dCalcVectorDot3_33(a, b) -#define dDOT14(a, b) dCalcVectorDot3_14(a, b) -#define dDOT41(a, b) dCalcVectorDot3_41(a, b) -#define dDOT44(a, b) dCalcVectorDot3_44(a, b) - - -/* -* cross product, set a = b x c. dCROSSpqr means that elements of `a', `b' -* and `c' are spaced p, q and r indexes apart respectively. -* dCROSS() means dCROSS111. `op' is normally `=', but you can set it to -* +=, -= etc to get other effects. -*/ - -#define dCROSS(a,op,b,c) \ - do { \ - (a)[0] op ((b)[1]*(c)[2] - (b)[2]*(c)[1]); \ - (a)[1] op ((b)[2]*(c)[0] - (b)[0]*(c)[2]); \ - (a)[2] op ((b)[0]*(c)[1] - (b)[1]*(c)[0]); \ - } while(0) -#define dCROSSpqr(a,op,b,c,p,q,r) \ - do { \ - (a)[ 0] op ((b)[ q]*(c)[2*r] - (b)[2*q]*(c)[ r]); \ - (a)[ p] op ((b)[2*q]*(c)[ 0] - (b)[ 0]*(c)[2*r]); \ - (a)[2*p] op ((b)[ 0]*(c)[ r] - (b)[ q]*(c)[ 0]); \ - } while(0) -#define dCROSS114(a,op,b,c) dCROSSpqr(a,op,b,c,1,1,4) -#define dCROSS141(a,op,b,c) dCROSSpqr(a,op,b,c,1,4,1) -#define dCROSS144(a,op,b,c) dCROSSpqr(a,op,b,c,1,4,4) -#define dCROSS411(a,op,b,c) dCROSSpqr(a,op,b,c,4,1,1) -#define dCROSS414(a,op,b,c) dCROSSpqr(a,op,b,c,4,1,4) -#define dCROSS441(a,op,b,c) dCROSSpqr(a,op,b,c,4,4,1) -#define dCROSS444(a,op,b,c) dCROSSpqr(a,op,b,c,4,4,4) - - -/* -* set a 3x3 submatrix of A to a matrix such that submatrix(A)*b = a x b. -* A is stored by rows, and has `skip' elements per row. the matrix is -* assumed to be already zero, so this does not write zero elements! -* if (plus,minus) is (+,-) then a positive version will be written. -* if (plus,minus) is (-,+) then a negative version will be written. -*/ - -#define dCROSSMAT(A,a,skip,plus,minus) \ - do { \ - (A)[1] = minus (a)[2]; \ - (A)[2] = plus (a)[1]; \ - (A)[(skip)+0] = plus (a)[2]; \ - (A)[(skip)+2] = minus (a)[0]; \ - (A)[2*(skip)+0] = minus (a)[1]; \ - (A)[2*(skip)+1] = plus (a)[0]; \ - } while(0) - - - - -/* -Note: NEVER call any of these functions/macros with the same variable for A and C, -it is not equivalent to A*=B. -*/ - -#define dMULTIPLY0_331(A, B, C) dMultiply0_331(A, B, C) -#define dMULTIPLY1_331(A, B, C) dMultiply1_331(A, B, C) -#define dMULTIPLY0_133(A, B, C) dMultiply0_133(A, B, C) -#define dMULTIPLY0_333(A, B, C) dMultiply0_333(A, B, C) -#define dMULTIPLY1_333(A, B, C) dMultiply1_333(A, B, C) -#define dMULTIPLY2_333(A, B, C) dMultiply2_333(A, B, C) - -#define dMULTIPLYADD0_331(A, B, C) dMultiplyAdd0_331(A, B, C) -#define dMULTIPLYADD1_331(A, B, C) dMultiplyAdd1_331(A, B, C) -#define dMULTIPLYADD0_133(A, B, C) dMultiplyAdd0_133(A, B, C) -#define dMULTIPLYADD0_333(A, B, C) dMultiplyAdd0_333(A, B, C) -#define dMULTIPLYADD1_333(A, B, C) dMultiplyAdd1_333(A, B, C) -#define dMULTIPLYADD2_333(A, B, C) dMultiplyAdd2_333(A, B, C) - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/* -* These macros are not used any more inside of ODE -* They are kept for backward compatibility with external code that -* might still be using them. -*/ -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - - -#endif // #ifndef _ODE_ODEMATH_LEGACY_H_ diff --git a/misc/builddeps/dp.linux64/include/ode/rotation.h b/misc/builddeps/dp.linux64/include/ode/rotation.h deleted file mode 100644 index a72be27f..00000000 --- a/misc/builddeps/dp.linux64/include/ode/rotation.h +++ /dev/null @@ -1,70 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_ROTATION_H_ -#define _ODE_ROTATION_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -ODE_API void dRSetIdentity (dMatrix3 R); - -ODE_API void dRFromAxisAndAngle (dMatrix3 R, dReal ax, dReal ay, dReal az, - dReal angle); - -ODE_API void dRFromEulerAngles (dMatrix3 R, dReal phi, dReal theta, dReal psi); - -ODE_API void dRFrom2Axes (dMatrix3 R, dReal ax, dReal ay, dReal az, - dReal bx, dReal by, dReal bz); - -ODE_API void dRFromZAxis (dMatrix3 R, dReal ax, dReal ay, dReal az); - -ODE_API void dQSetIdentity (dQuaternion q); - -ODE_API void dQFromAxisAndAngle (dQuaternion q, dReal ax, dReal ay, dReal az, - dReal angle); - -/* Quaternion multiplication, analogous to the matrix multiplication routines. */ -/* qa = rotate by qc, then qb */ -ODE_API void dQMultiply0 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc); -/* qa = rotate by qc, then by inverse of qb */ -ODE_API void dQMultiply1 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc); -/* qa = rotate by inverse of qc, then by qb */ -ODE_API void dQMultiply2 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc); -/* qa = rotate by inverse of qc, then by inverse of qb */ -ODE_API void dQMultiply3 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc); - -ODE_API void dRfromQ (dMatrix3 R, const dQuaternion q); -ODE_API void dQfromR (dQuaternion q, const dMatrix3 R); -ODE_API void dDQfromW (dReal dq[4], const dVector3 w, const dQuaternion q); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/include/ode/timer.h b/misc/builddeps/dp.linux64/include/ode/timer.h deleted file mode 100644 index fe1483f7..00000000 --- a/misc/builddeps/dp.linux64/include/ode/timer.h +++ /dev/null @@ -1,76 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * 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 files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_TIMER_H_ -#define _ODE_TIMER_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/* stop watch objects */ - -typedef struct dStopwatch { - double time; /* total clock count */ - unsigned long cc[2]; /* clock count since last `start' */ -} dStopwatch; - -ODE_API void dStopwatchReset (dStopwatch *); -ODE_API void dStopwatchStart (dStopwatch *); -ODE_API void dStopwatchStop (dStopwatch *); -ODE_API double dStopwatchTime (dStopwatch *); /* returns total time in secs */ - - -/* code timers */ - -ODE_API void dTimerStart (const char *description); /* pass a static string here */ -ODE_API void dTimerNow (const char *description); /* pass a static string here */ -ODE_API void dTimerEnd(void); - -/* print out a timer report. if `average' is nonzero, print out the average - * time for each slot (this is only meaningful if the same start-now-end - * calls are being made repeatedly. - */ -ODE_API void dTimerReport (FILE *fout, int average); - - -/* resolution */ - -/* returns the timer ticks per second implied by the timing hardware or API. - * the actual timer resolution may not be this great. - */ -ODE_API double dTimerTicksPerSecond(void); - -/* returns an estimate of the actual timer resolution, in seconds. this may - * be greater than 1/ticks_per_second. - */ -ODE_API double dTimerResolution(void); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/misc/builddeps/dp.linux64/lib/libd0_blind_id.a b/misc/builddeps/dp.linux64/lib/libd0_blind_id.a deleted file mode 100644 index 4f0fedab..00000000 Binary files a/misc/builddeps/dp.linux64/lib/libd0_blind_id.a and /dev/null differ diff --git a/misc/builddeps/dp.linux64/lib/libd0_blind_id.la b/misc/builddeps/dp.linux64/lib/libd0_blind_id.la deleted file mode 100755 index 34767d3b..00000000 --- a/misc/builddeps/dp.linux64/lib/libd0_blind_id.la +++ /dev/null @@ -1,41 +0,0 @@ -# libd0_blind_id.la - a libtool library file -# Generated by ltmain.sh (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libd0_blind_id.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs=' -L/tmp/d0_blind_id.deps/lib/ /tmp/g/lib/libgmp.la' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libd0_blind_id. -current=0 -age=0 -revision=0 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/lib' diff --git a/misc/builddeps/dp.linux64/lib/libd0_blind_id.so b/misc/builddeps/dp.linux64/lib/libd0_blind_id.so deleted file mode 120000 index 6adf4aa9..00000000 --- a/misc/builddeps/dp.linux64/lib/libd0_blind_id.so +++ /dev/null @@ -1 +0,0 @@ -libd0_blind_id.so.0.0.0 \ No newline at end of file diff --git a/misc/builddeps/dp.linux64/lib/libd0_blind_id.so.0 b/misc/builddeps/dp.linux64/lib/libd0_blind_id.so.0 deleted file mode 120000 index 6adf4aa9..00000000 --- a/misc/builddeps/dp.linux64/lib/libd0_blind_id.so.0 +++ /dev/null @@ -1 +0,0 @@ -libd0_blind_id.so.0.0.0 \ No newline at end of file diff --git a/misc/builddeps/dp.linux64/lib/libd0_blind_id.so.0.0.0 b/misc/builddeps/dp.linux64/lib/libd0_blind_id.so.0.0.0 deleted file mode 100755 index 11fb746a..00000000 Binary files a/misc/builddeps/dp.linux64/lib/libd0_blind_id.so.0.0.0 and /dev/null differ diff --git a/misc/builddeps/dp.linux64/lib/libd0_rijndael.a b/misc/builddeps/dp.linux64/lib/libd0_rijndael.a deleted file mode 100644 index 4e593022..00000000 Binary files a/misc/builddeps/dp.linux64/lib/libd0_rijndael.a and /dev/null differ diff --git a/misc/builddeps/dp.linux64/lib/libd0_rijndael.la b/misc/builddeps/dp.linux64/lib/libd0_rijndael.la deleted file mode 100755 index f0bab29d..00000000 --- a/misc/builddeps/dp.linux64/lib/libd0_rijndael.la +++ /dev/null @@ -1,41 +0,0 @@ -# libd0_rijndael.la - a libtool library file -# Generated by ltmain.sh (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libd0_rijndael.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs=' -L/tmp/d0_blind_id.deps/lib/ /tmp/g/lib/libgmp.la' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libd0_rijndael. -current=0 -age=0 -revision=0 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/lib' diff --git a/misc/builddeps/dp.linux64/lib/libd0_rijndael.so b/misc/builddeps/dp.linux64/lib/libd0_rijndael.so deleted file mode 120000 index 01dce017..00000000 --- a/misc/builddeps/dp.linux64/lib/libd0_rijndael.so +++ /dev/null @@ -1 +0,0 @@ -libd0_rijndael.so.0.0.0 \ No newline at end of file diff --git a/misc/builddeps/dp.linux64/lib/libd0_rijndael.so.0 b/misc/builddeps/dp.linux64/lib/libd0_rijndael.so.0 deleted file mode 120000 index 01dce017..00000000 --- a/misc/builddeps/dp.linux64/lib/libd0_rijndael.so.0 +++ /dev/null @@ -1 +0,0 @@ -libd0_rijndael.so.0.0.0 \ No newline at end of file diff --git a/misc/builddeps/dp.linux64/lib/libd0_rijndael.so.0.0.0 b/misc/builddeps/dp.linux64/lib/libd0_rijndael.so.0.0.0 deleted file mode 100755 index 16e0840a..00000000 Binary files a/misc/builddeps/dp.linux64/lib/libd0_rijndael.so.0.0.0 and /dev/null differ diff --git a/misc/builddeps/dp.linux64/lib/libgmp.a b/misc/builddeps/dp.linux64/lib/libgmp.a deleted file mode 100644 index abac8d22..00000000 Binary files a/misc/builddeps/dp.linux64/lib/libgmp.a and /dev/null differ diff --git a/misc/builddeps/dp.linux64/lib/libgmp.la b/misc/builddeps/dp.linux64/lib/libgmp.la deleted file mode 100755 index 34fab8f3..00000000 --- a/misc/builddeps/dp.linux64/lib/libgmp.la +++ /dev/null @@ -1,41 +0,0 @@ -# libgmp.la - a libtool library file -# Generated by ltmain.sh (GNU libtool) 2.2.6b -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libgmp.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs='' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libgmp. -current=10 -age=0 -revision=1 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/tmp/g/lib' diff --git a/misc/builddeps/dp.linux64/lib/libjpeg.a b/misc/builddeps/dp.linux64/lib/libjpeg.a deleted file mode 100644 index bc497396..00000000 Binary files a/misc/builddeps/dp.linux64/lib/libjpeg.a and /dev/null differ diff --git a/misc/builddeps/dp.linux64/lib/libjpeg.la b/misc/builddeps/dp.linux64/lib/libjpeg.la deleted file mode 100755 index ac8ef61f..00000000 --- a/misc/builddeps/dp.linux64/lib/libjpeg.la +++ /dev/null @@ -1,41 +0,0 @@ -# libjpeg.la - a libtool library file -# Generated by ltmain.sh (GNU libtool) 2.2.6b -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libjpeg.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs='' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libjpeg. -current=8 -age=0 -revision=2 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/tmp/j/lib' diff --git a/misc/builddeps/dp.linux64/lib/libode.a b/misc/builddeps/dp.linux64/lib/libode.a deleted file mode 100644 index 7da69ea1..00000000 Binary files a/misc/builddeps/dp.linux64/lib/libode.a and /dev/null differ diff --git a/misc/builddeps/dp.linux64/lib/libode.la b/misc/builddeps/dp.linux64/lib/libode.la deleted file mode 100755 index 7cabb97b..00000000 --- a/misc/builddeps/dp.linux64/lib/libode.la +++ /dev/null @@ -1,41 +0,0 @@ -# libode.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libode.a' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='' - -# Libraries that this one depends upon. -dependency_libs=' -L/tmp/ode-0.12.deps/lib/ -lpthread' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libode. -current=3 -age=0 -revision=0 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/lib' diff --git a/misc/builddeps/dp.linux64/lib/pkgconfig/d0_blind_id.pc b/misc/builddeps/dp.linux64/lib/pkgconfig/d0_blind_id.pc deleted file mode 100644 index 8c9bb32b..00000000 --- a/misc/builddeps/dp.linux64/lib/pkgconfig/d0_blind_id.pc +++ /dev/null @@ -1,11 +0,0 @@ -prefix=/usr/local -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: Blind-ID -Description: Library for user identification using RSA blind signatures -Requires: -Version: 0.5 -Libs: -L${libdir} -ld0_blind_id -Cflags: -I${includedir}/d0_blind_id diff --git a/misc/builddeps/dp.linux64/lib/pkgconfig/d0_rijndael.pc b/misc/builddeps/dp.linux64/lib/pkgconfig/d0_rijndael.pc deleted file mode 100644 index 1040d658..00000000 --- a/misc/builddeps/dp.linux64/lib/pkgconfig/d0_rijndael.pc +++ /dev/null @@ -1,11 +0,0 @@ -prefix=/usr/local -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: Rijndael -Description: Library for Rijndael encryption -Requires: -Version: 0.5 -Libs: -L${libdir} -ld0_rijndael -Cflags: -I${includedir}/d0_blind_id diff --git a/misc/builddeps/dp.linux64/lib/pkgconfig/ode.pc b/misc/builddeps/dp.linux64/lib/pkgconfig/ode.pc deleted file mode 100644 index 7be9daa0..00000000 --- a/misc/builddeps/dp.linux64/lib/pkgconfig/ode.pc +++ /dev/null @@ -1,11 +0,0 @@ -prefix=/usr/local -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: ode -Description: Open Dynamics Engine -Version: 0.12 -Libs: -L${libdir} -lode -Libs.private: -lstdc++ -lm -Cflags: -I${includedir} -DdDOUBLE diff --git a/misc/builddeps/dp.linux64/share/info/gmp.info b/misc/builddeps/dp.linux64/share/info/gmp.info deleted file mode 100644 index d65ab795..00000000 --- a/misc/builddeps/dp.linux64/share/info/gmp.info +++ /dev/null @@ -1,178 +0,0 @@ -This is ../../gmp/doc/gmp.info, produced by makeinfo version 4.8 from -../../gmp/doc/gmp.texi. - - This manual describes how to install and use the GNU multiple -precision arithmetic library, version 5.0.1. - - Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free -Software Foundation, Inc. - - Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version -1.3 or any later version published by the Free Software Foundation; -with no Invariant Sections, with the Front-Cover Texts being "A GNU -Manual", and with the Back-Cover Texts being "You have freedom to copy -and modify this GNU Manual, like GNU software". A copy of the license -is included in *Note GNU Free Documentation License::. - -INFO-DIR-SECTION GNU libraries -START-INFO-DIR-ENTRY -* gmp: (gmp). GNU Multiple Precision Arithmetic Library. -END-INFO-DIR-ENTRY - - -Indirect: -gmp.info-1: 981 -gmp.info-2: 300864 - -Tag Table: -(Indirect) -Node: Top981 -Node: Copying3211 -Node: Introduction to GMP5062 -Node: Installing GMP7773 -Node: Build Options8505 -Node: ABI and ISA24573 -Node: Notes for Package Builds34251 -Node: Notes for Particular Systems37338 -Node: Known Build Problems43895 -Node: Performance optimization47429 -Node: GMP Basics48563 -Node: Headers and Libraries49211 -Node: Nomenclature and Types50635 -Node: Function Classes52632 -Node: Variable Conventions54325 -Node: Parameter Conventions55934 -Node: Memory Management57990 -Node: Reentrancy59118 -Node: Useful Macros and Constants60991 -Node: Compatibility with older versions61989 -Node: Demonstration Programs62950 -Node: Efficiency64815 -Node: Debugging72439 -Node: Profiling78997 -Node: Autoconf82988 -Node: Emacs84767 -Node: Reporting Bugs85373 -Node: Integer Functions87916 -Node: Initializing Integers88692 -Node: Assigning Integers90839 -Node: Simultaneous Integer Init & Assign92426 -Node: Converting Integers94051 -Node: Integer Arithmetic96973 -Node: Integer Division98559 -Node: Integer Exponentiation104869 -Node: Integer Roots106309 -Node: Number Theoretic Functions107983 -Node: Integer Comparisons114126 -Node: Integer Logic and Bit Fiddling115504 -Node: I/O of Integers118051 -Node: Integer Random Numbers120935 -Node: Integer Import and Export123546 -Node: Miscellaneous Integer Functions127556 -Node: Integer Special Functions129416 -Node: Rational Number Functions132503 -Node: Initializing Rationals133696 -Node: Rational Conversions136157 -Node: Rational Arithmetic137888 -Node: Comparing Rationals139192 -Node: Applying Integer Functions140559 -Node: I/O of Rationals142042 -Node: Floating-point Functions143902 -Node: Initializing Floats146787 -Node: Assigning Floats150874 -Node: Simultaneous Float Init & Assign153441 -Node: Converting Floats154969 -Node: Float Arithmetic158217 -Node: Float Comparison160230 -Node: I/O of Floats161811 -Node: Miscellaneous Float Functions164409 -Node: Low-level Functions166303 -Node: Random Number Functions190437 -Node: Random State Initialization191505 -Node: Random State Seeding194363 -Node: Random State Miscellaneous195752 -Node: Formatted Output196393 -Node: Formatted Output Strings196638 -Node: Formatted Output Functions201852 -Node: C++ Formatted Output205927 -Node: Formatted Input208609 -Node: Formatted Input Strings208845 -Node: Formatted Input Functions213497 -Node: C++ Formatted Input216466 -Node: C++ Class Interface218369 -Node: C++ Interface General219370 -Node: C++ Interface Integers222440 -Node: C++ Interface Rationals225871 -Node: C++ Interface Floats229548 -Node: C++ Interface Random Numbers234830 -Node: C++ Interface Limitations237236 -Node: BSD Compatible Functions240056 -Node: Custom Allocation244767 -Node: Language Bindings249085 -Node: Algorithms253038 -Node: Multiplication Algorithms253738 -Node: Basecase Multiplication254710 -Node: Karatsuba Multiplication256618 -Node: Toom 3-Way Multiplication260243 -Node: Toom 4-Way Multiplication266657 -Node: FFT Multiplication268029 -Node: Other Multiplication273365 -Node: Unbalanced Multiplication275839 -Node: Division Algorithms276627 -Node: Single Limb Division277006 -Node: Basecase Division279897 -Node: Divide and Conquer Division281100 -Node: Block-Wise Barrett Division283169 -Node: Exact Division283821 -Node: Exact Remainder286986 -Node: Small Quotient Division289213 -Node: Greatest Common Divisor Algorithms290811 -Node: Binary GCD291108 -Node: Lehmer's Algorithm293957 -Node: Subquadratic GCD296177 -Node: Extended GCD298636 -Node: Jacobi Symbol299948 -Node: Powering Algorithms300864 -Node: Normal Powering Algorithm301127 -Node: Modular Powering Algorithm301655 -Node: Root Extraction Algorithms302435 -Node: Square Root Algorithm302750 -Node: Nth Root Algorithm304891 -Node: Perfect Square Algorithm305676 -Node: Perfect Power Algorithm307762 -Node: Radix Conversion Algorithms308383 -Node: Binary to Radix308759 -Node: Radix to Binary312688 -Node: Other Algorithms314776 -Node: Prime Testing Algorithm315128 -Node: Factorial Algorithm316312 -Node: Binomial Coefficients Algorithm317715 -Node: Fibonacci Numbers Algorithm318609 -Node: Lucas Numbers Algorithm321083 -Node: Random Number Algorithms321804 -Node: Assembly Coding323925 -Node: Assembly Code Organisation324885 -Node: Assembly Basics325852 -Node: Assembly Carry Propagation327002 -Node: Assembly Cache Handling328833 -Node: Assembly Functional Units330994 -Node: Assembly Floating Point332607 -Node: Assembly SIMD Instructions336385 -Node: Assembly Software Pipelining337367 -Node: Assembly Loop Unrolling338429 -Node: Assembly Writing Guide340644 -Node: Internals343409 -Node: Integer Internals343921 -Node: Rational Internals346177 -Node: Float Internals347415 -Node: Raw Output Internals354829 -Node: C++ Interface Internals356023 -Node: Contributors359309 -Node: References364267 -Node: GNU Free Documentation License369925 -Node: Concept Index395094 -Node: Function Index441276 - -End Tag Table diff --git a/misc/builddeps/dp.linux64/share/info/gmp.info-1 b/misc/builddeps/dp.linux64/share/info/gmp.info-1 deleted file mode 100644 index d1360599..00000000 --- a/misc/builddeps/dp.linux64/share/info/gmp.info-1 +++ /dev/null @@ -1,7084 +0,0 @@ -This is ../../gmp/doc/gmp.info, produced by makeinfo version 4.8 from -../../gmp/doc/gmp.texi. - - This manual describes how to install and use the GNU multiple -precision arithmetic library, version 5.0.1. - - Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free -Software Foundation, Inc. - - Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version -1.3 or any later version published by the Free Software Foundation; -with no Invariant Sections, with the Front-Cover Texts being "A GNU -Manual", and with the Back-Cover Texts being "You have freedom to copy -and modify this GNU Manual, like GNU software". A copy of the license -is included in *Note GNU Free Documentation License::. - -INFO-DIR-SECTION GNU libraries -START-INFO-DIR-ENTRY -* gmp: (gmp). GNU Multiple Precision Arithmetic Library. -END-INFO-DIR-ENTRY - - -File: gmp.info, Node: Top, Next: Copying, Prev: (dir), Up: (dir) - -GNU MP -****** - - This manual describes how to install and use the GNU multiple -precision arithmetic library, version 5.0.1. - - Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free -Software Foundation, Inc. - - Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version -1.3 or any later version published by the Free Software Foundation; -with no Invariant Sections, with the Front-Cover Texts being "A GNU -Manual", and with the Back-Cover Texts being "You have freedom to copy -and modify this GNU Manual, like GNU software". A copy of the license -is included in *Note GNU Free Documentation License::. - - -* Menu: - -* Copying:: GMP Copying Conditions (LGPL). -* Introduction to GMP:: Brief introduction to GNU MP. -* Installing GMP:: How to configure and compile the GMP library. -* GMP Basics:: What every GMP user should know. -* Reporting Bugs:: How to usefully report bugs. -* Integer Functions:: Functions for arithmetic on signed integers. -* Rational Number Functions:: Functions for arithmetic on rational numbers. -* Floating-point Functions:: Functions for arithmetic on floats. -* Low-level Functions:: Fast functions for natural numbers. -* Random Number Functions:: Functions for generating random numbers. -* Formatted Output:: `printf' style output. -* Formatted Input:: `scanf' style input. -* C++ Class Interface:: Class wrappers around GMP types. -* BSD Compatible Functions:: All functions found in BSD MP. -* Custom Allocation:: How to customize the internal allocation. -* Language Bindings:: Using GMP from other languages. -* Algorithms:: What happens behind the scenes. -* Internals:: How values are represented behind the scenes. - -* Contributors:: Who brings you this library? -* References:: Some useful papers and books to read. -* GNU Free Documentation License:: -* Concept Index:: -* Function Index:: - - -File: gmp.info, Node: Copying, Next: Introduction to GMP, Prev: Top, Up: Top - -GNU MP Copying Conditions -************************* - -This library is "free"; this means that everyone is free to use it and -free to redistribute it on a free basis. The library is not in the -public domain; it is copyrighted and there are restrictions on its -distribution, but these restrictions are designed to permit everything -that a good cooperating citizen would want to do. What is not allowed -is to try to prevent others from further sharing any version of this -library that they might get from you. - - Specifically, we want to make sure that you have the right to give -away copies of the library, that you receive source code or else can -get it if you want it, that you can change this library or use pieces -of it in new free programs, and that you know you can do these things. - - To make sure that everyone has such rights, we have to forbid you to -deprive anyone else of these rights. For example, if you distribute -copies of the GNU MP library, you must give the recipients all the -rights that you have. You must make sure that they, too, receive or -can get the source code. And you must tell them their rights. - - Also, for our own protection, we must make certain that everyone -finds out that there is no warranty for the GNU MP library. If it is -modified by someone else and passed on, we want their recipients to -know that what they have is not what we distributed, so that any -problems introduced by others will not reflect on our reputation. - - The precise conditions of the license for the GNU MP library are -found in the Lesser General Public License version 3 that accompanies -the source code, see `COPYING.LIB'. Certain demonstration programs are -provided under the terms of the plain General Public License version 3, -see `COPYING'. - - -File: gmp.info, Node: Introduction to GMP, Next: Installing GMP, Prev: Copying, Up: Top - -1 Introduction to GNU MP -************************ - -GNU MP is a portable library written in C for arbitrary precision -arithmetic on integers, rational numbers, and floating-point numbers. -It aims to provide the fastest possible arithmetic for all applications -that need higher precision than is directly supported by the basic C -types. - - Many applications use just a few hundred bits of precision; but some -applications may need thousands or even millions of bits. GMP is -designed to give good performance for both, by choosing algorithms -based on the sizes of the operands, and by carefully keeping the -overhead at a minimum. - - The speed of GMP is achieved by using fullwords as the basic -arithmetic type, by using sophisticated algorithms, by including -carefully optimized assembly code for the most common inner loops for -many different CPUs, and by a general emphasis on speed (as opposed to -simplicity or elegance). - - There is assembly code for these CPUs: ARM, DEC Alpha 21064, 21164, -and 21264, AMD 29000, AMD K6, K6-2, Athlon, and Athlon64, Hitachi -SuperH and SH-2, HPPA 1.0, 1.1 and 2.0, Intel Pentium, Pentium -Pro/II/III, Pentium 4, generic x86, Intel IA-64, i960, Motorola -MC68000, MC68020, MC88100, and MC88110, Motorola/IBM PowerPC 32 and 64, -National NS32000, IBM POWER, MIPS R3000, R4000, SPARCv7, SuperSPARC, -generic SPARCv8, UltraSPARC, DEC VAX, and Zilog Z8000. Some -optimizations also for Cray vector systems, Clipper, IBM ROMP (RT), and -Pyramid AP/XP. - -For up-to-date information on GMP, please see the GMP web pages at - - `http://gmplib.org/' - -The latest version of the library is available at - - `ftp://ftp.gnu.org/gnu/gmp/' - - Many sites around the world mirror `ftp.gnu.org', please use a mirror -near you, see `http://www.gnu.org/order/ftp.html' for a full list. - - There are three public mailing lists of interest. One for release -announcements, one for general questions and discussions about usage of -the GMP library and one for bug reports. For more information, see - - `http://gmplib.org/mailman/listinfo/'. - - The proper place for bug reports is . See -*Note Reporting Bugs:: for information about reporting bugs. - - -1.1 How to use this Manual -========================== - -Everyone should read *Note GMP Basics::. If you need to install the -library yourself, then read *Note Installing GMP::. If you have a -system with multiple ABIs, then read *Note ABI and ISA::, for the -compiler options that must be used on applications. - - The rest of the manual can be used for later reference, although it -is probably a good idea to glance through it. - - -File: gmp.info, Node: Installing GMP, Next: GMP Basics, Prev: Introduction to GMP, Up: Top - -2 Installing GMP -**************** - -GMP has an autoconf/automake/libtool based configuration system. On a -Unix-like system a basic build can be done with - - ./configure - make - -Some self-tests can be run with - - make check - -And you can install (under `/usr/local' by default) with - - make install - - If you experience problems, please report them to -. See *Note Reporting Bugs::, for information on -what to include in useful bug reports. - -* Menu: - -* Build Options:: -* ABI and ISA:: -* Notes for Package Builds:: -* Notes for Particular Systems:: -* Known Build Problems:: -* Performance optimization:: - - -File: gmp.info, Node: Build Options, Next: ABI and ISA, Prev: Installing GMP, Up: Installing GMP - -2.1 Build Options -================= - -All the usual autoconf configure options are available, run `./configure ---help' for a summary. The file `INSTALL.autoconf' has some generic -installation information too. - -Tools - `configure' requires various Unix-like tools. See *Note Notes for - Particular Systems::, for some options on non-Unix systems. - - It might be possible to build without the help of `configure', - certainly all the code is there, but unfortunately you'll be on - your own. - -Build Directory - To compile in a separate build directory, `cd' to that directory, - and prefix the configure command with the path to the GMP source - directory. For example - - cd /my/build/dir - /my/sources/gmp-5.0.1/configure - - Not all `make' programs have the necessary features (`VPATH') to - support this. In particular, SunOS and Slowaris `make' have bugs - that make them unable to build in a separate directory. Use GNU - `make' instead. - -`--prefix' and `--exec-prefix' - The `--prefix' option can be used in the normal way to direct GMP - to install under a particular tree. The default is `/usr/local'. - - `--exec-prefix' can be used to direct architecture-dependent files - like `libgmp.a' to a different location. This can be used to share - architecture-independent parts like the documentation, but - separate the dependent parts. Note however that `gmp.h' and - `mp.h' are architecture-dependent since they encode certain - aspects of `libgmp', so it will be necessary to ensure both - `$prefix/include' and `$exec_prefix/include' are available to the - compiler. - -`--disable-shared', `--disable-static' - By default both shared and static libraries are built (where - possible), but one or other can be disabled. Shared libraries - result in smaller executables and permit code sharing between - separate running processes, but on some CPUs are slightly slower, - having a small cost on each function call. - -Native Compilation, `--build=CPU-VENDOR-OS' - For normal native compilation, the system can be specified with - `--build'. By default `./configure' uses the output from running - `./config.guess'. On some systems `./config.guess' can determine - the exact CPU type, on others it will be necessary to give it - explicitly. For example, - - ./configure --build=ultrasparc-sun-solaris2.7 - - In all cases the `OS' part is important, since it controls how - libtool generates shared libraries. Running `./config.guess' is - the simplest way to see what it should be, if you don't know - already. - -Cross Compilation, `--host=CPU-VENDOR-OS' - When cross-compiling, the system used for compiling is given by - `--build' and the system where the library will run is given by - `--host'. For example when using a FreeBSD Athlon system to build - GNU/Linux m68k binaries, - - ./configure --build=athlon-pc-freebsd3.5 --host=m68k-mac-linux-gnu - - Compiler tools are sought first with the host system type as a - prefix. For example `m68k-mac-linux-gnu-ranlib' is tried, then - plain `ranlib'. This makes it possible for a set of - cross-compiling tools to co-exist with native tools. The prefix - is the argument to `--host', and this can be an alias, such as - `m68k-linux'. But note that tools don't have to be setup this - way, it's enough to just have a `PATH' with a suitable - cross-compiling `cc' etc. - - Compiling for a different CPU in the same family as the build - system is a form of cross-compilation, though very possibly this - would merely be special options on a native compiler. In any case - `./configure' avoids depending on being able to run code on the - build system, which is important when creating binaries for a - newer CPU since they very possibly won't run on the build system. - - In all cases the compiler must be able to produce an executable - (of whatever format) from a standard C `main'. Although only - object files will go to make up `libgmp', `./configure' uses - linking tests for various purposes, such as determining what - functions are available on the host system. - - Currently a warning is given unless an explicit `--build' is used - when cross-compiling, because it may not be possible to correctly - guess the build system type if the `PATH' has only a - cross-compiling `cc'. - - Note that the `--target' option is not appropriate for GMP. It's - for use when building compiler tools, with `--host' being where - they will run, and `--target' what they'll produce code for. - Ordinary programs or libraries like GMP are only interested in the - `--host' part, being where they'll run. (Some past versions of - GMP used `--target' incorrectly.) - -CPU types - In general, if you want a library that runs as fast as possible, - you should configure GMP for the exact CPU type your system uses. - However, this may mean the binaries won't run on older members of - the family, and might run slower on other members, older or newer. - The best idea is always to build GMP for the exact machine type - you intend to run it on. - - The following CPUs have specific support. See `configure.in' for - details of what code and compiler options they select. - - * Alpha: alpha, alphaev5, alphaev56, alphapca56, alphapca57, - alphaev6, alphaev67, alphaev68 alphaev7 - - * Cray: c90, j90, t90, sv1 - - * HPPA: hppa1.0, hppa1.1, hppa2.0, hppa2.0n, hppa2.0w, hppa64 - - * IA-64: ia64, itanium, itanium2 - - * MIPS: mips, mips3, mips64 - - * Motorola: m68k, m68000, m68010, m68020, m68030, m68040, - m68060, m68302, m68360, m88k, m88110 - - * POWER: power, power1, power2, power2sc - - * PowerPC: powerpc, powerpc64, powerpc401, powerpc403, - powerpc405, powerpc505, powerpc601, powerpc602, powerpc603, - powerpc603e, powerpc604, powerpc604e, powerpc620, powerpc630, - powerpc740, powerpc7400, powerpc7450, powerpc750, powerpc801, - powerpc821, powerpc823, powerpc860, powerpc970 - - * SPARC: sparc, sparcv8, microsparc, supersparc, sparcv9, - ultrasparc, ultrasparc2, ultrasparc2i, ultrasparc3, sparc64 - - * x86 family: i386, i486, i586, pentium, pentiummmx, pentiumpro, - pentium2, pentium3, pentium4, k6, k62, k63, athlon, amd64, - viac3, viac32 - - * Other: a29k, arm, clipper, i960, ns32k, pyramid, sh, sh2, vax, - z8k - - CPUs not listed will use generic C code. - -Generic C Build - If some of the assembly code causes problems, or if otherwise - desired, the generic C code can be selected with CPU `none'. For - example, - - ./configure --host=none-unknown-freebsd3.5 - - Note that this will run quite slowly, but it should be portable - and should at least make it possible to get something running if - all else fails. - -Fat binary, `--enable-fat' - Using `--enable-fat' selects a "fat binary" build on x86, where - optimized low level subroutines are chosen at runtime according to - the CPU detected. This means more code, but gives good - performance on all x86 chips. (This option might become available - for more architectures in the future.) - -`ABI' - On some systems GMP supports multiple ABIs (application binary - interfaces), meaning data type sizes and calling conventions. By - default GMP chooses the best ABI available, but a particular ABI - can be selected. For example - - ./configure --host=mips64-sgi-irix6 ABI=n32 - - See *Note ABI and ISA::, for the available choices on relevant - CPUs, and what applications need to do. - -`CC', `CFLAGS' - By default the C compiler used is chosen from among some likely - candidates, with `gcc' normally preferred if it's present. The - usual `CC=whatever' can be passed to `./configure' to choose - something different. - - For various systems, default compiler flags are set based on the - CPU and compiler. The usual `CFLAGS="-whatever"' can be passed to - `./configure' to use something different or to set good flags for - systems GMP doesn't otherwise know. - - The `CC' and `CFLAGS' used are printed during `./configure', and - can be found in each generated `Makefile'. This is the easiest way - to check the defaults when considering changing or adding - something. - - Note that when `CC' and `CFLAGS' are specified on a system - supporting multiple ABIs it's important to give an explicit - `ABI=whatever', since GMP can't determine the ABI just from the - flags and won't be able to select the correct assembly code. - - If just `CC' is selected then normal default `CFLAGS' for that - compiler will be used (if GMP recognises it). For example - `CC=gcc' can be used to force the use of GCC, with default flags - (and default ABI). - -`CPPFLAGS' - Any flags like `-D' defines or `-I' includes required by the - preprocessor should be set in `CPPFLAGS' rather than `CFLAGS'. - Compiling is done with both `CPPFLAGS' and `CFLAGS', but - preprocessing uses just `CPPFLAGS'. This distinction is because - most preprocessors won't accept all the flags the compiler does. - Preprocessing is done separately in some configure tests, and in - the `ansi2knr' support for K&R compilers. - -`CC_FOR_BUILD' - Some build-time programs are compiled and run to generate - host-specific data tables. `CC_FOR_BUILD' is the compiler used - for this. It doesn't need to be in any particular ABI or mode, it - merely needs to generate executables that can run. The default is - to try the selected `CC' and some likely candidates such as `cc' - and `gcc', looking for something that works. - - No flags are used with `CC_FOR_BUILD' because a simple invocation - like `cc foo.c' should be enough. If some particular options are - required they can be included as for instance `CC_FOR_BUILD="cc - -whatever"'. - -C++ Support, `--enable-cxx' - C++ support in GMP can be enabled with `--enable-cxx', in which - case a C++ compiler will be required. As a convenience - `--enable-cxx=detect' can be used to enable C++ support only if a - compiler can be found. The C++ support consists of a library - `libgmpxx.la' and header file `gmpxx.h' (*note Headers and - Libraries::). - - A separate `libgmpxx.la' has been adopted rather than having C++ - objects within `libgmp.la' in order to ensure dynamic linked C - programs aren't bloated by a dependency on the C++ standard - library, and to avoid any chance that the C++ compiler could be - required when linking plain C programs. - - `libgmpxx.la' will use certain internals from `libgmp.la' and can - only be expected to work with `libgmp.la' from the same GMP - version. Future changes to the relevant internals will be - accompanied by renaming, so a mismatch will cause unresolved - symbols rather than perhaps mysterious misbehaviour. - - In general `libgmpxx.la' will be usable only with the C++ compiler - that built it, since name mangling and runtime support are usually - incompatible between different compilers. - -`CXX', `CXXFLAGS' - When C++ support is enabled, the C++ compiler and its flags can be - set with variables `CXX' and `CXXFLAGS' in the usual way. The - default for `CXX' is the first compiler that works from a list of - likely candidates, with `g++' normally preferred when available. - The default for `CXXFLAGS' is to try `CFLAGS', `CFLAGS' without - `-g', then for `g++' either `-g -O2' or `-O2', or for other - compilers `-g' or nothing. Trying `CFLAGS' this way is convenient - when using `gcc' and `g++' together, since the flags for `gcc' will - usually suit `g++'. - - It's important that the C and C++ compilers match, meaning their - startup and runtime support routines are compatible and that they - generate code in the same ABI (if there's a choice of ABIs on the - system). `./configure' isn't currently able to check these things - very well itself, so for that reason `--disable-cxx' is the - default, to avoid a build failure due to a compiler mismatch. - Perhaps this will change in the future. - - Incidentally, it's normally not good enough to set `CXX' to the - same as `CC'. Although `gcc' for instance recognises `foo.cc' as - C++ code, only `g++' will invoke the linker the right way when - building an executable or shared library from C++ object files. - -Temporary Memory, `--enable-alloca=' - GMP allocates temporary workspace using one of the following three - methods, which can be selected with for instance - `--enable-alloca=malloc-reentrant'. - - * `alloca' - C library or compiler builtin. - - * `malloc-reentrant' - the heap, in a re-entrant fashion. - - * `malloc-notreentrant' - the heap, with global variables. - - For convenience, the following choices are also available. - `--disable-alloca' is the same as `no'. - - * `yes' - a synonym for `alloca'. - - * `no' - a synonym for `malloc-reentrant'. - - * `reentrant' - `alloca' if available, otherwise - `malloc-reentrant'. This is the default. - - * `notreentrant' - `alloca' if available, otherwise - `malloc-notreentrant'. - - `alloca' is reentrant and fast, and is recommended. It actually - allocates just small blocks on the stack; larger ones use - malloc-reentrant. - - `malloc-reentrant' is, as the name suggests, reentrant and thread - safe, but `malloc-notreentrant' is faster and should be used if - reentrancy is not required. - - The two malloc methods in fact use the memory allocation functions - selected by `mp_set_memory_functions', these being `malloc' and - friends by default. *Note Custom Allocation::. - - An additional choice `--enable-alloca=debug' is available, to help - when debugging memory related problems (*note Debugging::). - -FFT Multiplication, `--disable-fft' - By default multiplications are done using Karatsuba, 3-way Toom, - and Fermat FFT. The FFT is only used on large to very large - operands and can be disabled to save code size if desired. - -Berkeley MP, `--enable-mpbsd' - The Berkeley MP compatibility library (`libmp') and header file - (`mp.h') are built and installed only if `--enable-mpbsd' is used. - *Note BSD Compatible Functions::. - -Assertion Checking, `--enable-assert' - This option enables some consistency checking within the library. - This can be of use while debugging, *note Debugging::. - -Execution Profiling, `--enable-profiling=prof/gprof/instrument' - Enable profiling support, in one of various styles, *note - Profiling::. - -`MPN_PATH' - Various assembly versions of each mpn subroutines are provided. - For a given CPU, a search is made though a path to choose a - version of each. For example `sparcv8' has - - MPN_PATH="sparc32/v8 sparc32 generic" - - which means look first for v8 code, then plain sparc32 (which is - v7), and finally fall back on generic C. Knowledgeable users with - special requirements can specify a different path. Normally this - is completely unnecessary. - -Documentation - The source for the document you're now reading is `doc/gmp.texi', - in Texinfo format, see *Note Texinfo: (texinfo)Top. - - Info format `doc/gmp.info' is included in the distribution. The - usual automake targets are available to make PostScript, DVI, PDF - and HTML (these will require various TeX and Texinfo tools). - - DocBook and XML can be generated by the Texinfo `makeinfo' program - too, see *Note Options for `makeinfo': (texinfo)makeinfo options. - - Some supplementary notes can also be found in the `doc' - subdirectory. - - - -File: gmp.info, Node: ABI and ISA, Next: Notes for Package Builds, Prev: Build Options, Up: Installing GMP - -2.2 ABI and ISA -=============== - -ABI (Application Binary Interface) refers to the calling conventions -between functions, meaning what registers are used and what sizes the -various C data types are. ISA (Instruction Set Architecture) refers to -the instructions and registers a CPU has available. - - Some 64-bit ISA CPUs have both a 64-bit ABI and a 32-bit ABI -defined, the latter for compatibility with older CPUs in the family. -GMP supports some CPUs like this in both ABIs. In fact within GMP -`ABI' means a combination of chip ABI, plus how GMP chooses to use it. -For example in some 32-bit ABIs, GMP may support a limb as either a -32-bit `long' or a 64-bit `long long'. - - By default GMP chooses the best ABI available for a given system, -and this generally gives significantly greater speed. But an ABI can -be chosen explicitly to make GMP compatible with other libraries, or -particular application requirements. For example, - - ./configure ABI=32 - - In all cases it's vital that all object code used in a given program -is compiled for the same ABI. - - Usually a limb is implemented as a `long'. When a `long long' limb -is used this is encoded in the generated `gmp.h'. This is convenient -for applications, but it does mean that `gmp.h' will vary, and can't be -just copied around. `gmp.h' remains compiler independent though, since -all compilers for a particular ABI will be expected to use the same -limb type. - - Currently no attempt is made to follow whatever conventions a system -has for installing library or header files built for a particular ABI. -This will probably only matter when installing multiple builds of GMP, -and it might be as simple as configuring with a special `libdir', or it -might require more than that. Note that builds for different ABIs need -to done separately, with a fresh `./configure' and `make' each. - - -AMD64 (`x86_64') - On AMD64 systems supporting both 32-bit and 64-bit modes for - applications, the following ABI choices are available. - - `ABI=64' - The 64-bit ABI uses 64-bit limbs and pointers and makes full - use of the chip architecture. This is the default. - Applications will usually not need special compiler flags, - but for reference the option is - - gcc -m64 - - `ABI=32' - The 32-bit ABI is the usual i386 conventions. This will be - slower, and is not recommended except for inter-operating - with other code not yet 64-bit capable. Applications must be - compiled with - - gcc -m32 - - (In GCC 2.95 and earlier there's no `-m32' option, it's the - only mode.) - - -HPPA 2.0 (`hppa2.0*', `hppa64') - - `ABI=2.0w' - The 2.0w ABI uses 64-bit limbs and pointers and is available - on HP-UX 11 or up. Applications must be compiled with - - gcc [built for 2.0w] - cc +DD64 - - `ABI=2.0n' - The 2.0n ABI means the 32-bit HPPA 1.0 ABI and all its normal - calling conventions, but with 64-bit instructions permitted - within functions. GMP uses a 64-bit `long long' for a limb. - This ABI is available on hppa64 GNU/Linux and on HP-UX 10 or - higher. Applications must be compiled with - - gcc [built for 2.0n] - cc +DA2.0 +e - - Note that current versions of GCC (eg. 3.2) don't generate - 64-bit instructions for `long long' operations and so may be - slower than for 2.0w. (The GMP assembly code is the same - though.) - - `ABI=1.0' - HPPA 2.0 CPUs can run all HPPA 1.0 and 1.1 code in the 32-bit - HPPA 1.0 ABI. No special compiler options are needed for - applications. - - All three ABIs are available for CPU types `hppa2.0w', `hppa2.0' - and `hppa64', but for CPU type `hppa2.0n' only 2.0n or 1.0 are - considered. - - Note that GCC on HP-UX has no options to choose between 2.0n and - 2.0w modes, unlike HP `cc'. Instead it must be built for one or - the other ABI. GMP will detect how it was built, and skip to the - corresponding `ABI'. - - -IA-64 under HP-UX (`ia64*-*-hpux*', `itanium*-*-hpux*') - HP-UX supports two ABIs for IA-64. GMP performance is the same in - both. - - `ABI=32' - In the 32-bit ABI, pointers, `int's and `long's are 32 bits - and GMP uses a 64 bit `long long' for a limb. Applications - can be compiled without any special flags since this ABI is - the default in both HP C and GCC, but for reference the flags - are - - gcc -milp32 - cc +DD32 - - `ABI=64' - In the 64-bit ABI, `long's and pointers are 64 bits and GMP - uses a `long' for a limb. Applications must be compiled with - - gcc -mlp64 - cc +DD64 - - On other IA-64 systems, GNU/Linux for instance, `ABI=64' is the - only choice. - - -MIPS under IRIX 6 (`mips*-*-irix[6789]') - IRIX 6 always has a 64-bit MIPS 3 or better CPU, and supports ABIs - o32, n32, and 64. n32 or 64 are recommended, and GMP performance - will be the same in each. The default is n32. - - `ABI=o32' - The o32 ABI is 32-bit pointers and integers, and no 64-bit - operations. GMP will be slower than in n32 or 64, this - option only exists to support old compilers, eg. GCC 2.7.2. - Applications can be compiled with no special flags on an old - compiler, or on a newer compiler with - - gcc -mabi=32 - cc -32 - - `ABI=n32' - The n32 ABI is 32-bit pointers and integers, but with a - 64-bit limb using a `long long'. Applications must be - compiled with - - gcc -mabi=n32 - cc -n32 - - `ABI=64' - The 64-bit ABI is 64-bit pointers and integers. Applications - must be compiled with - - gcc -mabi=64 - cc -64 - - Note that MIPS GNU/Linux, as of kernel version 2.2, doesn't have - the necessary support for n32 or 64 and so only gets a 32-bit limb - and the MIPS 2 code. - - -PowerPC 64 (`powerpc64', `powerpc620', `powerpc630', `powerpc970', `power4', `power5') - - `ABI=aix64' - The AIX 64 ABI uses 64-bit limbs and pointers and is the - default on PowerPC 64 `*-*-aix*' systems. Applications must - be compiled with - - gcc -maix64 - xlc -q64 - - `ABI=mode64' - The `mode64' ABI uses 64-bit limbs and pointers, and is the - default on 64-bit GNU/Linux, BSD, and Mac OS X/Darwin - systems. Applications must be compiled with - - gcc -m64 - - `ABI=mode32' - The `mode32' ABI uses a 64-bit `long long' limb but with the - chip still in 32-bit mode and using 32-bit calling - conventions. This is the default on for systems where the - true 64-bit ABIs are unavailable. No special compiler - options are needed for applications. - - `ABI=32' - This is the basic 32-bit PowerPC ABI, with a 32-bit limb. No - special compiler options are needed for applications. - - GMP speed is greatest in `aix64' and `mode32'. In `ABI=32' only - the 32-bit ISA is used and this doesn't make full use of a 64-bit - chip. On a suitable system we could perhaps use more of the ISA, - but there are no plans to do so. - - -Sparc V9 (`sparc64', `sparcv9', `ultrasparc*') - - `ABI=64' - The 64-bit V9 ABI is available on the various BSD sparc64 - ports, recent versions of Sparc64 GNU/Linux, and Solaris 2.7 - and up (when the kernel is in 64-bit mode). GCC 3.2 or - higher, or Sun `cc' is required. On GNU/Linux, depending on - the default `gcc' mode, applications must be compiled with - - gcc -m64 - - On Solaris applications must be compiled with - - gcc -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9 - cc -xarch=v9 - - On the BSD sparc64 systems no special options are required, - since 64-bits is the only ABI available. - - `ABI=32' - For the basic 32-bit ABI, GMP still uses as much of the V9 - ISA as it can. In the Sun documentation this combination is - known as "v8plus". On GNU/Linux, depending on the default - `gcc' mode, applications may need to be compiled with - - gcc -m32 - - On Solaris, no special compiler options are required for - applications, though using something like the following is - recommended. (`gcc' 2.8 and earlier only support `-mv8' - though.) - - gcc -mv8plus - cc -xarch=v8plus - - GMP speed is greatest in `ABI=64', so it's the default where - available. The speed is partly because there are extra registers - available and partly because 64-bits is considered the more - important case and has therefore had better code written for it. - - Don't be confused by the names of the `-m' and `-x' compiler - options, they're called `arch' but effectively control both ABI - and ISA. - - On Solaris 2.6 and earlier, only `ABI=32' is available since the - kernel doesn't save all registers. - - On Solaris 2.7 with the kernel in 32-bit mode, a normal native - build will reject `ABI=64' because the resulting executables won't - run. `ABI=64' can still be built if desired by making it look - like a cross-compile, for example - - ./configure --build=none --host=sparcv9-sun-solaris2.7 ABI=64 - - -File: gmp.info, Node: Notes for Package Builds, Next: Notes for Particular Systems, Prev: ABI and ISA, Up: Installing GMP - -2.3 Notes for Package Builds -============================ - -GMP should present no great difficulties for packaging in a binary -distribution. - - Libtool is used to build the library and `-version-info' is set -appropriately, having started from `3:0:0' in GMP 3.0 (*note Library -interface versions: (libtool)Versioning.). - - The GMP 4 series will be upwardly binary compatible in each release -and will be upwardly binary compatible with all of the GMP 3 series. -Additional function interfaces may be added in each release, so on -systems where libtool versioning is not fully checked by the loader an -auxiliary mechanism may be needed to express that a dynamic linked -application depends on a new enough GMP. - - An auxiliary mechanism may also be needed to express that -`libgmpxx.la' (from `--enable-cxx', *note Build Options::) requires -`libgmp.la' from the same GMP version, since this is not done by the -libtool versioning, nor otherwise. A mismatch will result in -unresolved symbols from the linker, or perhaps the loader. - - When building a package for a CPU family, care should be taken to use -`--host' (or `--build') to choose the least common denominator among -the CPUs which might use the package. For example this might mean plain -`sparc' (meaning V7) for SPARCs. - - For x86s, `--enable-fat' sets things up for a fat binary build, -making a runtime selection of optimized low level routines. This is a -good choice for packaging to run on a range of x86 chips. - - Users who care about speed will want GMP built for their exact CPU -type, to make best use of the available optimizations. Providing a way -to suitably rebuild a package may be useful. This could be as simple -as making it possible for a user to omit `--build' (and `--host') so -`./config.guess' will detect the CPU. But a way to manually specify a -`--build' will be wanted for systems where `./config.guess' is inexact. - - On systems with multiple ABIs, a packaged build will need to decide -which among the choices is to be provided, see *Note ABI and ISA::. A -given run of `./configure' etc will only build one ABI. If a second -ABI is also required then a second run of `./configure' etc must be -made, starting from a clean directory tree (`make distclean'). - - As noted under "ABI and ISA", currently no attempt is made to follow -system conventions for install locations that vary with ABI, such as -`/usr/lib/sparcv9' for `ABI=64' as opposed to `/usr/lib' for `ABI=32'. -A package build can override `libdir' and other standard variables as -necessary. - - Note that `gmp.h' is a generated file, and will be architecture and -ABI dependent. When attempting to install two ABIs simultaneously it -will be important that an application compile gets the correct `gmp.h' -for its desired ABI. If compiler include paths don't vary with ABI -options then it might be necessary to create a `/usr/include/gmp.h' -which tests preprocessor symbols and chooses the correct actual `gmp.h'. - - -File: gmp.info, Node: Notes for Particular Systems, Next: Known Build Problems, Prev: Notes for Package Builds, Up: Installing GMP - -2.4 Notes for Particular Systems -================================ - -AIX 3 and 4 - On systems `*-*-aix[34]*' shared libraries are disabled by - default, since some versions of the native `ar' fail on the - convenience libraries used. A shared build can be attempted with - - ./configure --enable-shared --disable-static - - Note that the `--disable-static' is necessary because in a shared - build libtool makes `libgmp.a' a symlink to `libgmp.so', - apparently for the benefit of old versions of `ld' which only - recognise `.a', but unfortunately this is done even if a fully - functional `ld' is available. - -ARM - On systems `arm*-*-*', versions of GCC up to and including 2.95.3 - have a bug in unsigned division, giving wrong results for some - operands. GMP `./configure' will demand GCC 2.95.4 or later. - -Compaq C++ - Compaq C++ on OSF 5.1 has two flavours of `iostream', a standard - one and an old pre-standard one (see `man iostream_intro'). GMP - can only use the standard one, which unfortunately is not the - default but must be selected by defining `__USE_STD_IOSTREAM'. - Configure with for instance - - ./configure --enable-cxx CPPFLAGS=-D__USE_STD_IOSTREAM - -Floating Point Mode - On some systems, the hardware floating point has a control mode - which can set all operations to be done in a particular precision, - for instance single, double or extended on x86 systems (x87 - floating point). The GMP functions involving a `double' cannot be - expected to operate to their full precision when the hardware is - in single precision mode. Of course this affects all code, - including application code, not just GMP. - -MS-DOS and MS Windows - On an MS-DOS system DJGPP can be used to build GMP, and on an MS - Windows system Cygwin, DJGPP and MINGW can be used. All three are - excellent ports of GCC and the various GNU tools. - - `http://www.cygwin.com/' - `http://www.delorie.com/djgpp/' - `http://www.mingw.org/' - - Microsoft also publishes an Interix "Services for Unix" which can - be used to build GMP on Windows (with a normal `./configure'), but - it's not free software. - -MS Windows DLLs - On systems `*-*-cygwin*', `*-*-mingw*' and `*-*-pw32*' by default - GMP builds only a static library, but a DLL can be built instead - using - - ./configure --disable-static --enable-shared - - Static and DLL libraries can't both be built, since certain export - directives in `gmp.h' must be different. - - A MINGW DLL build of GMP can be used with Microsoft C. Libtool - doesn't install a `.lib' format import library, but it can be - created with MS `lib' as follows, and copied to the install - directory. Similarly for `libmp' and `libgmpxx'. - - cd .libs - lib /def:libgmp-3.dll.def /out:libgmp-3.lib - - MINGW uses the C runtime library `msvcrt.dll' for I/O, so - applications wanting to use the GMP I/O routines must be compiled - with `cl /MD' to do the same. If one of the other C runtime - library choices provided by MS C is desired then the suggestion is - to use the GMP string functions and confine I/O to the application. - -Motorola 68k CPU Types - `m68k' is taken to mean 68000. `m68020' or higher will give a - performance boost on applicable CPUs. `m68360' can be used for - CPU32 series chips. `m68302' can be used for "Dragonball" series - chips, though this is merely a synonym for `m68000'. - -OpenBSD 2.6 - `m4' in this release of OpenBSD has a bug in `eval' that makes it - unsuitable for `.asm' file processing. `./configure' will detect - the problem and either abort or choose another m4 in the `PATH'. - The bug is fixed in OpenBSD 2.7, so either upgrade or use GNU m4. - -Power CPU Types - In GMP, CPU types `power*' and `powerpc*' will each use - instructions not available on the other, so it's important to - choose the right one for the CPU that will be used. Currently GMP - has no assembly code support for using just the common instruction - subset. To get executables that run on both, the current - suggestion is to use the generic C code (CPU `none'), possibly - with appropriate compiler options (like `-mcpu=common' for `gcc'). - CPU `rs6000' (which is not a CPU but a family of workstations) is - accepted by `config.sub', but is currently equivalent to `none'. - -Sparc CPU Types - `sparcv8' or `supersparc' on relevant systems will give a - significant performance increase over the V7 code selected by plain - `sparc'. - -Sparc App Regs - The GMP assembly code for both 32-bit and 64-bit Sparc clobbers the - "application registers" `g2', `g3' and `g4', the same way that the - GCC default `-mapp-regs' does (*note SPARC Options: (gcc)SPARC - Options.). - - This makes that code unsuitable for use with the special V9 - `-mcmodel=embmedany' (which uses `g4' as a data segment pointer), - and for applications wanting to use those registers for special - purposes. In these cases the only suggestion currently is to - build GMP with CPU `none' to avoid the assembly code. - -SunOS 4 - `/usr/bin/m4' lacks various features needed to process `.asm' - files, and instead `./configure' will automatically use - `/usr/5bin/m4', which we believe is always available (if not then - use GNU m4). - -x86 CPU Types - `i586', `pentium' or `pentiummmx' code is good for its intended P5 - Pentium chips, but quite slow when run on Intel P6 class chips - (PPro, P-II, P-III). `i386' is a better choice when making - binaries that must run on both. - -x86 MMX and SSE2 Code - If the CPU selected has MMX code but the assembler doesn't support - it, a warning is given and non-MMX code is used instead. This - will be an inferior build, since the MMX code that's present is - there because it's faster than the corresponding plain integer - code. The same applies to SSE2. - - Old versions of `gas' don't support MMX instructions, in particular - version 1.92.3 that comes with FreeBSD 2.2.8 or the more recent - OpenBSD 3.1 doesn't. - - Solaris 2.6 and 2.7 `as' generate incorrect object code for - register to register `movq' instructions, and so can't be used for - MMX code. Install a recent `gas' if MMX code is wanted on these - systems. - - -File: gmp.info, Node: Known Build Problems, Next: Performance optimization, Prev: Notes for Particular Systems, Up: Installing GMP - -2.5 Known Build Problems -======================== - -You might find more up-to-date information at `http://gmplib.org/'. - -Compiler link options - The version of libtool currently in use rather aggressively strips - compiler options when linking a shared library. This will - hopefully be relaxed in the future, but for now if this is a - problem the suggestion is to create a little script to hide them, - and for instance configure with - - ./configure CC=gcc-with-my-options - -DJGPP (`*-*-msdosdjgpp*') - The DJGPP port of `bash' 2.03 is unable to run the `configure' - script, it exits silently, having died writing a preamble to - `config.log'. Use `bash' 2.04 or higher. - - `make all' was found to run out of memory during the final - `libgmp.la' link on one system tested, despite having 64Mb - available. Running `make libgmp.la' directly helped, perhaps - recursing into the various subdirectories uses up memory. - -GNU binutils `strip' prior to 2.12 - `strip' from GNU binutils 2.11 and earlier should not be used on - the static libraries `libgmp.a' and `libmp.a' since it will - discard all but the last of multiple archive members with the same - name, like the three versions of `init.o' in `libgmp.a'. Binutils - 2.12 or higher can be used successfully. - - The shared libraries `libgmp.so' and `libmp.so' are not affected by - this and any version of `strip' can be used on them. - -`make' syntax error - On certain versions of SCO OpenServer 5 and IRIX 6.5 the native - `make' is unable to handle the long dependencies list for - `libgmp.la'. The symptom is a "syntax error" on the following - line of the top-level `Makefile'. - - libgmp.la: $(libgmp_la_OBJECTS) $(libgmp_la_DEPENDENCIES) - - Either use GNU Make, or as a workaround remove - `$(libgmp_la_DEPENDENCIES)' from that line (which will make the - initial build work, but if any recompiling is done `libgmp.la' - might not be rebuilt). - -MacOS X (`*-*-darwin*') - Libtool currently only knows how to create shared libraries on - MacOS X using the native `cc' (which is a modified GCC), not a - plain GCC. A static-only build should work though - (`--disable-shared'). - -NeXT prior to 3.3 - The system compiler on old versions of NeXT was a massacred and - old GCC, even if it called itself `cc'. This compiler cannot be - used to build GMP, you need to get a real GCC, and install that. - (NeXT may have fixed this in release 3.3 of their system.) - -POWER and PowerPC - Bugs in GCC 2.7.2 (and 2.6.3) mean it can't be used to compile GMP - on POWER or PowerPC. If you want to use GCC for these machines, - get GCC 2.7.2.1 (or later). - -Sequent Symmetry - Use the GNU assembler instead of the system assembler, since the - latter has serious bugs. - -Solaris 2.6 - The system `sed' prints an error "Output line too long" when - libtool builds `libgmp.la'. This doesn't seem to cause any - obvious ill effects, but GNU `sed' is recommended, to avoid any - doubt. - -Sparc Solaris 2.7 with gcc 2.95.2 in `ABI=32' - A shared library build of GMP seems to fail in this combination, - it builds but then fails the tests, apparently due to some - incorrect data relocations within `gmp_randinit_lc_2exp_size'. - The exact cause is unknown, `--disable-shared' is recommended. - - -File: gmp.info, Node: Performance optimization, Prev: Known Build Problems, Up: Installing GMP - -2.6 Performance optimization -============================ - -For optimal performance, build GMP for the exact CPU type of the target -computer, see *Note Build Options::. - - Unlike what is the case for most other programs, the compiler -typically doesn't matter much, since GMP uses assembly language for the -most critical operation. - - In particular for long-running GMP applications, and applications -demanding extremely large numbers, building and running the `tuneup' -program in the `tune' subdirectory, can be important. For example, - - cd tune - make tuneup - ./tuneup - - will generate better contents for the `gmp-mparam.h' parameter file. - - To use the results, put the output in the file file indicated in the -`Parameters for ...' header. Then recompile from scratch. - - The `tuneup' program takes one useful parameter, `-f NNN', which -instructs the program how long to check FFT multiply parameters. If -you're going to use GMP for extremely large numbers, you may want to -run `tuneup' with a large NNN value. - - -File: gmp.info, Node: GMP Basics, Next: Reporting Bugs, Prev: Installing GMP, Up: Top - -3 GMP Basics -************ - -*Using functions, macros, data types, etc. not documented in this -manual is strongly discouraged. If you do so your application is -guaranteed to be incompatible with future versions of GMP.* - -* Menu: - -* Headers and Libraries:: -* Nomenclature and Types:: -* Function Classes:: -* Variable Conventions:: -* Parameter Conventions:: -* Memory Management:: -* Reentrancy:: -* Useful Macros and Constants:: -* Compatibility with older versions:: -* Demonstration Programs:: -* Efficiency:: -* Debugging:: -* Profiling:: -* Autoconf:: -* Emacs:: - - -File: gmp.info, Node: Headers and Libraries, Next: Nomenclature and Types, Prev: GMP Basics, Up: GMP Basics - -3.1 Headers and Libraries -========================= - -All declarations needed to use GMP are collected in the include file -`gmp.h'. It is designed to work with both C and C++ compilers. - - #include - - Note however that prototypes for GMP functions with `FILE *' -parameters are only provided if `' is included too. - - #include - #include - - Likewise `' (or `') is required for prototypes -with `va_list' parameters, such as `gmp_vprintf'. And `' -for prototypes with `struct obstack' parameters, such as -`gmp_obstack_printf', when available. - - All programs using GMP must link against the `libgmp' library. On a -typical Unix-like system this can be done with `-lgmp', for example - - gcc myprogram.c -lgmp - - GMP C++ functions are in a separate `libgmpxx' library. This is -built and installed if C++ support has been enabled (*note Build -Options::). For example, - - g++ mycxxprog.cc -lgmpxx -lgmp - - GMP is built using Libtool and an application can use that to link -if desired, *note GNU Libtool: (libtool)Top. - - If GMP has been installed to a non-standard location then it may be -necessary to use `-I' and `-L' compiler options to point to the right -directories, and some sort of run-time path for a shared library. - - -File: gmp.info, Node: Nomenclature and Types, Next: Function Classes, Prev: Headers and Libraries, Up: GMP Basics - -3.2 Nomenclature and Types -========================== - -In this manual, "integer" usually means a multiple precision integer, as -defined by the GMP library. The C data type for such integers is -`mpz_t'. Here are some examples of how to declare such integers: - - mpz_t sum; - - struct foo { mpz_t x, y; }; - - mpz_t vec[20]; - - "Rational number" means a multiple precision fraction. The C data -type for these fractions is `mpq_t'. For example: - - mpq_t quotient; - - "Floating point number" or "Float" for short, is an arbitrary -precision mantissa with a limited precision exponent. The C data type -for such objects is `mpf_t'. For example: - - mpf_t fp; - - The floating point functions accept and return exponents in the C -type `mp_exp_t'. Currently this is usually a `long', but on some -systems it's an `int' for efficiency. - - A "limb" means the part of a multi-precision number that fits in a -single machine word. (We chose this word because a limb of the human -body is analogous to a digit, only larger, and containing several -digits.) Normally a limb is 32 or 64 bits. The C data type for a limb -is `mp_limb_t'. - - Counts of limbs of a multi-precision number represented in the C type -`mp_size_t'. Currently this is normally a `long', but on some systems -it's an `int' for efficiency, and on some systems it will be `long -long' in the future. - - Counts of bits of a multi-precision number are represented in the C -type `mp_bitcnt_t'. Currently this is always an `unsigned long', but on -some systems it will be an `unsigned long long' in the future . - - "Random state" means an algorithm selection and current state data. -The C data type for such objects is `gmp_randstate_t'. For example: - - gmp_randstate_t rstate; - - Also, in general `mp_bitcnt_t' is used for bit counts and ranges, and -`size_t' is used for byte or character counts. - - -File: gmp.info, Node: Function Classes, Next: Variable Conventions, Prev: Nomenclature and Types, Up: GMP Basics - -3.3 Function Classes -==================== - -There are six classes of functions in the GMP library: - - 1. Functions for signed integer arithmetic, with names beginning with - `mpz_'. The associated type is `mpz_t'. There are about 150 - functions in this class. (*note Integer Functions::) - - 2. Functions for rational number arithmetic, with names beginning with - `mpq_'. The associated type is `mpq_t'. There are about 40 - functions in this class, but the integer functions can be used for - arithmetic on the numerator and denominator separately. (*note - Rational Number Functions::) - - 3. Functions for floating-point arithmetic, with names beginning with - `mpf_'. The associated type is `mpf_t'. There are about 60 - functions is this class. (*note Floating-point Functions::) - - 4. Functions compatible with Berkeley MP, such as `itom', `madd', and - `mult'. The associated type is `MINT'. (*note BSD Compatible - Functions::) - - 5. Fast low-level functions that operate on natural numbers. These - are used by the functions in the preceding groups, and you can - also call them directly from very time-critical user programs. - These functions' names begin with `mpn_'. The associated type is - array of `mp_limb_t'. There are about 30 (hard-to-use) functions - in this class. (*note Low-level Functions::) - - 6. Miscellaneous functions. Functions for setting up custom - allocation and functions for generating random numbers. (*note - Custom Allocation::, and *note Random Number Functions::) - - -File: gmp.info, Node: Variable Conventions, Next: Parameter Conventions, Prev: Function Classes, Up: GMP Basics - -3.4 Variable Conventions -======================== - -GMP functions generally have output arguments before input arguments. -This notation is by analogy with the assignment operator. The BSD MP -compatibility functions are exceptions, having the output arguments -last. - - GMP lets you use the same variable for both input and output in one -call. For example, the main function for integer multiplication, -`mpz_mul', can be used to square `x' and put the result back in `x' with - - mpz_mul (x, x, x); - - Before you can assign to a GMP variable, you need to initialize it -by calling one of the special initialization functions. When you're -done with a variable, you need to clear it out, using one of the -functions for that purpose. Which function to use depends on the type -of variable. See the chapters on integer functions, rational number -functions, and floating-point functions for details. - - A variable should only be initialized once, or at least cleared -between each initialization. After a variable has been initialized, it -may be assigned to any number of times. - - For efficiency reasons, avoid excessive initializing and clearing. -In general, initialize near the start of a function and clear near the -end. For example, - - void - foo (void) - { - mpz_t n; - int i; - mpz_init (n); - for (i = 1; i < 100; i++) - { - mpz_mul (n, ...); - mpz_fdiv_q (n, ...); - ... - } - mpz_clear (n); - } - - -File: gmp.info, Node: Parameter Conventions, Next: Memory Management, Prev: Variable Conventions, Up: GMP Basics - -3.5 Parameter Conventions -========================= - -When a GMP variable is used as a function parameter, it's effectively a -call-by-reference, meaning if the function stores a value there it will -change the original in the caller. Parameters which are input-only can -be designated `const' to provoke a compiler error or warning on -attempting to modify them. - - When a function is going to return a GMP result, it should designate -a parameter that it sets, like the library functions do. More than one -value can be returned by having more than one output parameter, again -like the library functions. A `return' of an `mpz_t' etc doesn't -return the object, only a pointer, and this is almost certainly not -what's wanted. - - Here's an example accepting an `mpz_t' parameter, doing a -calculation, and storing the result to the indicated parameter. - - void - foo (mpz_t result, const mpz_t param, unsigned long n) - { - unsigned long i; - mpz_mul_ui (result, param, n); - for (i = 1; i < n; i++) - mpz_add_ui (result, result, i*7); - } - - int - main (void) - { - mpz_t r, n; - mpz_init (r); - mpz_init_set_str (n, "123456", 0); - foo (r, n, 20L); - gmp_printf ("%Zd\n", r); - return 0; - } - - `foo' works even if the mainline passes the same variable for -`param' and `result', just like the library functions. But sometimes -it's tricky to make that work, and an application might not want to -bother supporting that sort of thing. - - For interest, the GMP types `mpz_t' etc are implemented as -one-element arrays of certain structures. This is why declaring a -variable creates an object with the fields GMP needs, but then using it -as a parameter passes a pointer to the object. Note that the actual -fields in each `mpz_t' etc are for internal use only and should not be -accessed directly by code that expects to be compatible with future GMP -releases. - - -File: gmp.info, Node: Memory Management, Next: Reentrancy, Prev: Parameter Conventions, Up: GMP Basics - -3.6 Memory Management -===================== - -The GMP types like `mpz_t' are small, containing only a couple of sizes, -and pointers to allocated data. Once a variable is initialized, GMP -takes care of all space allocation. Additional space is allocated -whenever a variable doesn't have enough. - - `mpz_t' and `mpq_t' variables never reduce their allocated space. -Normally this is the best policy, since it avoids frequent reallocation. -Applications that need to return memory to the heap at some particular -point can use `mpz_realloc2', or clear variables no longer needed. - - `mpf_t' variables, in the current implementation, use a fixed amount -of space, determined by the chosen precision and allocated at -initialization, so their size doesn't change. - - All memory is allocated using `malloc' and friends by default, but -this can be changed, see *Note Custom Allocation::. Temporary memory -on the stack is also used (via `alloca'), but this can be changed at -build-time if desired, see *Note Build Options::. - - -File: gmp.info, Node: Reentrancy, Next: Useful Macros and Constants, Prev: Memory Management, Up: GMP Basics - -3.7 Reentrancy -============== - -GMP is reentrant and thread-safe, with some exceptions: - - * If configured with `--enable-alloca=malloc-notreentrant' (or with - `--enable-alloca=notreentrant' when `alloca' is not available), - then naturally GMP is not reentrant. - - * `mpf_set_default_prec' and `mpf_init' use a global variable for the - selected precision. `mpf_init2' can be used instead, and in the - C++ interface an explicit precision to the `mpf_class' constructor. - - * `mpz_random' and the other old random number functions use a global - random state and are hence not reentrant. The newer random number - functions that accept a `gmp_randstate_t' parameter can be used - instead. - - * `gmp_randinit' (obsolete) returns an error indication through a - global variable, which is not thread safe. Applications are - advised to use `gmp_randinit_default' or `gmp_randinit_lc_2exp' - instead. - - * `mp_set_memory_functions' uses global variables to store the - selected memory allocation functions. - - * If the memory allocation functions set by a call to - `mp_set_memory_functions' (or `malloc' and friends by default) are - not reentrant, then GMP will not be reentrant either. - - * If the standard I/O functions such as `fwrite' are not reentrant - then the GMP I/O functions using them will not be reentrant either. - - * It's safe for two threads to read from the same GMP variable - simultaneously, but it's not safe for one to read while the - another might be writing, nor for two threads to write - simultaneously. It's not safe for two threads to generate a - random number from the same `gmp_randstate_t' simultaneously, - since this involves an update of that variable. - - -File: gmp.info, Node: Useful Macros and Constants, Next: Compatibility with older versions, Prev: Reentrancy, Up: GMP Basics - -3.8 Useful Macros and Constants -=============================== - - -- Global Constant: const int mp_bits_per_limb - The number of bits per limb. - - -- Macro: __GNU_MP_VERSION - -- Macro: __GNU_MP_VERSION_MINOR - -- Macro: __GNU_MP_VERSION_PATCHLEVEL - The major and minor GMP version, and patch level, respectively, as - integers. For GMP i.j, these numbers will be i, j, and 0, - respectively. For GMP i.j.k, these numbers will be i, j, and k, - respectively. - - -- Global Constant: const char * const gmp_version - The GMP version number, as a null-terminated string, in the form - "i.j.k". This release is "5.0.1". Note that the format "i.j" was - used when k was zero was used before version 4.3.0. - - -- Macro: __GMP_CC - -- Macro: __GMP_CFLAGS - The compiler and compiler flags, respectively, used when compiling - GMP, as strings. - - -File: gmp.info, Node: Compatibility with older versions, Next: Demonstration Programs, Prev: Useful Macros and Constants, Up: GMP Basics - -3.9 Compatibility with older versions -===================================== - -This version of GMP is upwardly binary compatible with all 4.x and 3.x -versions, and upwardly compatible at the source level with all 2.x -versions, with the following exceptions. - - * `mpn_gcd' had its source arguments swapped as of GMP 3.0, for - consistency with other `mpn' functions. - - * `mpf_get_prec' counted precision slightly differently in GMP 3.0 - and 3.0.1, but in 3.1 reverted to the 2.x style. - - There are a number of compatibility issues between GMP 1 and GMP 2 -that of course also apply when porting applications from GMP 1 to GMP -4. Please see the GMP 2 manual for details. - - The Berkeley MP compatibility library (*note BSD Compatible -Functions::) is source and binary compatible with the standard `libmp'. - - -File: gmp.info, Node: Demonstration Programs, Next: Efficiency, Prev: Compatibility with older versions, Up: GMP Basics - -3.10 Demonstration programs -=========================== - -The `demos' subdirectory has some sample programs using GMP. These -aren't built or installed, but there's a `Makefile' with rules for them. -For instance, - - make pexpr - ./pexpr 68^975+10 - -The following programs are provided - - * `pexpr' is an expression evaluator, the program used on the GMP - web page. - - * The `calc' subdirectory has a similar but simpler evaluator using - `lex' and `yacc'. - - * The `expr' subdirectory is yet another expression evaluator, a - library designed for ease of use within a C program. See - `demos/expr/README' for more information. - - * `factorize' is a Pollard-Rho factorization program. - - * `isprime' is a command-line interface to the `mpz_probab_prime_p' - function. - - * `primes' counts or lists primes in an interval, using a sieve. - - * `qcn' is an example use of `mpz_kronecker_ui' to estimate quadratic - class numbers. - - * The `perl' subdirectory is a comprehensive perl interface to GMP. - See `demos/perl/INSTALL' for more information. Documentation is - in POD format in `demos/perl/GMP.pm'. - - As an aside, consideration has been given at various times to some -sort of expression evaluation within the main GMP library. Going -beyond something minimal quickly leads to matters like user-defined -functions, looping, fixnums for control variables, etc, which are -considered outside the scope of GMP (much closer to language -interpreters or compilers, *Note Language Bindings::.) Something -simple for program input convenience may yet be a possibility, a -combination of the `expr' demo and the `pexpr' tree back-end perhaps. -But for now the above evaluators are offered as illustrations. - - -File: gmp.info, Node: Efficiency, Next: Debugging, Prev: Demonstration Programs, Up: GMP Basics - -3.11 Efficiency -=============== - -Small Operands - On small operands, the time for function call overheads and memory - allocation can be significant in comparison to actual calculation. - This is unavoidable in a general purpose variable precision - library, although GMP attempts to be as efficient as it can on - both large and small operands. - -Static Linking - On some CPUs, in particular the x86s, the static `libgmp.a' should - be used for maximum speed, since the PIC code in the shared - `libgmp.so' will have a small overhead on each function call and - global data address. For many programs this will be - insignificant, but for long calculations there's a gain to be had. - -Initializing and Clearing - Avoid excessive initializing and clearing of variables, since this - can be quite time consuming, especially in comparison to otherwise - fast operations like addition. - - A language interpreter might want to keep a free list or stack of - initialized variables ready for use. It should be possible to - integrate something like that with a garbage collector too. - -Reallocations - An `mpz_t' or `mpq_t' variable used to hold successively increasing - values will have its memory repeatedly `realloc'ed, which could be - quite slow or could fragment memory, depending on the C library. - If an application can estimate the final size then `mpz_init2' or - `mpz_realloc2' can be called to allocate the necessary space from - the beginning (*note Initializing Integers::). - - It doesn't matter if a size set with `mpz_init2' or `mpz_realloc2' - is too small, since all functions will do a further reallocation - if necessary. Badly overestimating memory required will waste - space though. - -`2exp' Functions - It's up to an application to call functions like `mpz_mul_2exp' - when appropriate. General purpose functions like `mpz_mul' make - no attempt to identify powers of two or other special forms, - because such inputs will usually be very rare and testing every - time would be wasteful. - -`ui' and `si' Functions - The `ui' functions and the small number of `si' functions exist for - convenience and should be used where applicable. But if for - example an `mpz_t' contains a value that fits in an `unsigned - long' there's no need extract it and call a `ui' function, just - use the regular `mpz' function. - -In-Place Operations - `mpz_abs', `mpq_abs', `mpf_abs', `mpz_neg', `mpq_neg' and - `mpf_neg' are fast when used for in-place operations like - `mpz_abs(x,x)', since in the current implementation only a single - field of `x' needs changing. On suitable compilers (GCC for - instance) this is inlined too. - - `mpz_add_ui', `mpz_sub_ui', `mpf_add_ui' and `mpf_sub_ui' benefit - from an in-place operation like `mpz_add_ui(x,x,y)', since usually - only one or two limbs of `x' will need to be changed. The same - applies to the full precision `mpz_add' etc if `y' is small. If - `y' is big then cache locality may be helped, but that's all. - - `mpz_mul' is currently the opposite, a separate destination is - slightly better. A call like `mpz_mul(x,x,y)' will, unless `y' is - only one limb, make a temporary copy of `x' before forming the - result. Normally that copying will only be a tiny fraction of the - time for the multiply, so this is not a particularly important - consideration. - - `mpz_set', `mpq_set', `mpq_set_num', `mpf_set', etc, make no - attempt to recognise a copy of something to itself, so a call like - `mpz_set(x,x)' will be wasteful. Naturally that would never be - written deliberately, but if it might arise from two pointers to - the same object then a test to avoid it might be desirable. - - if (x != y) - mpz_set (x, y); - - Note that it's never worth introducing extra `mpz_set' calls just - to get in-place operations. If a result should go to a particular - variable then just direct it there and let GMP take care of data - movement. - -Divisibility Testing (Small Integers) - `mpz_divisible_ui_p' and `mpz_congruent_ui_p' are the best - functions for testing whether an `mpz_t' is divisible by an - individual small integer. They use an algorithm which is faster - than `mpz_tdiv_ui', but which gives no useful information about - the actual remainder, only whether it's zero (or a particular - value). - - However when testing divisibility by several small integers, it's - best to take a remainder modulo their product, to save - multi-precision operations. For instance to test whether a number - is divisible by any of 23, 29 or 31 take a remainder modulo - 23*29*31 = 20677 and then test that. - - The division functions like `mpz_tdiv_q_ui' which give a quotient - as well as a remainder are generally a little slower than the - remainder-only functions like `mpz_tdiv_ui'. If the quotient is - only rarely wanted then it's probably best to just take a - remainder and then go back and calculate the quotient if and when - it's wanted (`mpz_divexact_ui' can be used if the remainder is - zero). - -Rational Arithmetic - The `mpq' functions operate on `mpq_t' values with no common - factors in the numerator and denominator. Common factors are - checked-for and cast out as necessary. In general, cancelling - factors every time is the best approach since it minimizes the - sizes for subsequent operations. - - However, applications that know something about the factorization - of the values they're working with might be able to avoid some of - the GCDs used for canonicalization, or swap them for divisions. - For example when multiplying by a prime it's enough to check for - factors of it in the denominator instead of doing a full GCD. Or - when forming a big product it might be known that very little - cancellation will be possible, and so canonicalization can be left - to the end. - - The `mpq_numref' and `mpq_denref' macros give access to the - numerator and denominator to do things outside the scope of the - supplied `mpq' functions. *Note Applying Integer Functions::. - - The canonical form for rationals allows mixed-type `mpq_t' and - integer additions or subtractions to be done directly with - multiples of the denominator. This will be somewhat faster than - `mpq_add'. For example, - - /* mpq increment */ - mpz_add (mpq_numref(q), mpq_numref(q), mpq_denref(q)); - - /* mpq += unsigned long */ - mpz_addmul_ui (mpq_numref(q), mpq_denref(q), 123UL); - - /* mpq -= mpz */ - mpz_submul (mpq_numref(q), mpq_denref(q), z); - -Number Sequences - Functions like `mpz_fac_ui', `mpz_fib_ui' and `mpz_bin_uiui' are - designed for calculating isolated values. If a range of values is - wanted it's probably best to call to get a starting point and - iterate from there. - -Text Input/Output - Hexadecimal or octal are suggested for input or output in text - form. Power-of-2 bases like these can be converted much more - efficiently than other bases, like decimal. For big numbers - there's usually nothing of particular interest to be seen in the - digits, so the base doesn't matter much. - - Maybe we can hope octal will one day become the normal base for - everyday use, as proposed by King Charles XII of Sweden and later - reformers. - - -File: gmp.info, Node: Debugging, Next: Profiling, Prev: Efficiency, Up: GMP Basics - -3.12 Debugging -============== - -Stack Overflow - Depending on the system, a segmentation violation or bus error - might be the only indication of stack overflow. See - `--enable-alloca' choices in *Note Build Options::, for how to - address this. - - In new enough versions of GCC, `-fstack-check' may be able to - ensure an overflow is recognised by the system before too much - damage is done, or `-fstack-limit-symbol' or - `-fstack-limit-register' may be able to add checking if the system - itself doesn't do any (*note Options for Code Generation: - (gcc)Code Gen Options.). These options must be added to the - `CFLAGS' used in the GMP build (*note Build Options::), adding - them just to an application will have no effect. Note also - they're a slowdown, adding overhead to each function call and each - stack allocation. - -Heap Problems - The most likely cause of application problems with GMP is heap - corruption. Failing to `init' GMP variables will have - unpredictable effects, and corruption arising elsewhere in a - program may well affect GMP. Initializing GMP variables more than - once or failing to clear them will cause memory leaks. - - In all such cases a `malloc' debugger is recommended. On a GNU or - BSD system the standard C library `malloc' has some diagnostic - facilities, see *Note Allocation Debugging: (libc)Allocation - Debugging, or `man 3 malloc'. Other possibilities, in no - particular order, include - - `http://www.inf.ethz.ch/personal/biere/projects/ccmalloc/' - `http://dmalloc.com/' - `http://www.perens.com/FreeSoftware/' (electric fence) - `http://packages.debian.org/stable/devel/fda' - `http://www.gnupdate.org/components/leakbug/' - `http://people.redhat.com/~otaylor/memprof/' - `http://www.cbmamiga.demon.co.uk/mpatrol/' - - The GMP default allocation routines in `memory.c' also have a - simple sentinel scheme which can be enabled with `#define DEBUG' - in that file. This is mainly designed for detecting buffer - overruns during GMP development, but might find other uses. - -Stack Backtraces - On some systems the compiler options GMP uses by default can - interfere with debugging. In particular on x86 and 68k systems - `-fomit-frame-pointer' is used and this generally inhibits stack - backtracing. Recompiling without such options may help while - debugging, though the usual caveats about it potentially moving a - memory problem or hiding a compiler bug will apply. - -GDB, the GNU Debugger - A sample `.gdbinit' is included in the distribution, showing how - to call some undocumented dump functions to print GMP variables - from within GDB. Note that these functions shouldn't be used in - final application code since they're undocumented and may be - subject to incompatible changes in future versions of GMP. - -Source File Paths - GMP has multiple source files with the same name, in different - directories. For example `mpz', `mpq' and `mpf' each have an - `init.c'. If the debugger can't already determine the right one - it may help to build with absolute paths on each C file. One way - to do that is to use a separate object directory with an absolute - path to the source directory. - - cd /my/build/dir - /my/source/dir/gmp-5.0.1/configure - - This works via `VPATH', and might require GNU `make'. Alternately - it might be possible to change the `.c.lo' rules appropriately. - -Assertion Checking - The build option `--enable-assert' is available to add some - consistency checks to the library (see *Note Build Options::). - These are likely to be of limited value to most applications. - Assertion failures are just as likely to indicate memory - corruption as a library or compiler bug. - - Applications using the low-level `mpn' functions, however, will - benefit from `--enable-assert' since it adds checks on the - parameters of most such functions, many of which have subtle - restrictions on their usage. Note however that only the generic C - code has checks, not the assembly code, so CPU `none' should be - used for maximum checking. - -Temporary Memory Checking - The build option `--enable-alloca=debug' arranges that each block - of temporary memory in GMP is allocated with a separate call to - `malloc' (or the allocation function set with - `mp_set_memory_functions'). - - This can help a malloc debugger detect accesses outside the - intended bounds, or detect memory not released. In a normal - build, on the other hand, temporary memory is allocated in blocks - which GMP divides up for its own use, or may be allocated with a - compiler builtin `alloca' which will go nowhere near any malloc - debugger hooks. - -Maximum Debuggability - To summarize the above, a GMP build for maximum debuggability - would be - - ./configure --disable-shared --enable-assert \ - --enable-alloca=debug --host=none CFLAGS=-g - - For C++, add `--enable-cxx CXXFLAGS=-g'. - -Checker - The GCC checker (`http://savannah.nongnu.org/projects/checker/') - can be used with GMP. It contains a stub library which means GMP - applications compiled with checker can use a normal GMP build. - - A build of GMP with checking within GMP itself can be made. This - will run very very slowly. On GNU/Linux for example, - - ./configure --host=none-pc-linux-gnu CC=checkergcc - - `--host=none' must be used, since the GMP assembly code doesn't - support the checking scheme. The GMP C++ features cannot be used, - since current versions of checker (0.9.9.1) don't yet support the - standard C++ library. - -Valgrind - The valgrind program (`http://valgrind.org/') is a memory checker - for x86s. It translates and emulates machine instructions to do - strong checks for uninitialized data (at the level of individual - bits), memory accesses through bad pointers, and memory leaks. - - Recent versions of Valgrind are getting support for MMX and - SSE/SSE2 instructions, for past versions GMP will need to be - configured not to use those, ie. for an x86 without them (for - instance plain `i486'). - -Other Problems - Any suspected bug in GMP itself should be isolated to make sure - it's not an application problem, see *Note Reporting Bugs::. - - -File: gmp.info, Node: Profiling, Next: Autoconf, Prev: Debugging, Up: GMP Basics - -3.13 Profiling -============== - -Running a program under a profiler is a good way to find where it's -spending most time and where improvements can be best sought. The -profiling choices for a GMP build are as follows. - -`--disable-profiling' - The default is to add nothing special for profiling. - - It should be possible to just compile the mainline of a program - with `-p' and use `prof' to get a profile consisting of - timer-based sampling of the program counter. Most of the GMP - assembly code has the necessary symbol information. - - This approach has the advantage of minimizing interference with - normal program operation, but on most systems the resolution of - the sampling is quite low (10 milliseconds for instance), - requiring long runs to get accurate information. - -`--enable-profiling=prof' - Build with support for the system `prof', which means `-p' added - to the `CFLAGS'. - - This provides call counting in addition to program counter - sampling, which allows the most frequently called routines to be - identified, and an average time spent in each routine to be - determined. - - The x86 assembly code has support for this option, but on other - processors the assembly routines will be as if compiled without - `-p' and therefore won't appear in the call counts. - - On some systems, such as GNU/Linux, `-p' in fact means `-pg' and in - this case `--enable-profiling=gprof' described below should be used - instead. - -`--enable-profiling=gprof' - Build with support for `gprof', which means `-pg' added to the - `CFLAGS'. - - This provides call graph construction in addition to call counting - and program counter sampling, which makes it possible to count - calls coming from different locations. For example the number of - calls to `mpn_mul' from `mpz_mul' versus the number from - `mpf_mul'. The program counter sampling is still flat though, so - only a total time in `mpn_mul' would be accumulated, not a - separate amount for each call site. - - The x86 assembly code has support for this option, but on other - processors the assembly routines will be as if compiled without - `-pg' and therefore not be included in the call counts. - - On x86 and m68k systems `-pg' and `-fomit-frame-pointer' are - incompatible, so the latter is omitted from the default flags in - that case, which might result in poorer code generation. - - Incidentally, it should be possible to use the `gprof' program - with a plain `--enable-profiling=prof' build. But in that case - only the `gprof -p' flat profile and call counts can be expected - to be valid, not the `gprof -q' call graph. - -`--enable-profiling=instrument' - Build with the GCC option `-finstrument-functions' added to the - `CFLAGS' (*note Options for Code Generation: (gcc)Code Gen - Options.). - - This inserts special instrumenting calls at the start and end of - each function, allowing exact timing and full call graph - construction. - - This instrumenting is not normally a standard system feature and - will require support from an external library, such as - - `http://sourceforge.net/projects/fnccheck/' - - This should be included in `LIBS' during the GMP configure so that - test programs will link. For example, - - ./configure --enable-profiling=instrument LIBS=-lfc - - On a GNU system the C library provides dummy instrumenting - functions, so programs compiled with this option will link. In - this case it's only necessary to ensure the correct library is - added when linking an application. - - The x86 assembly code supports this option, but on other - processors the assembly routines will be as if compiled without - `-finstrument-functions' meaning time spent in them will - effectively be attributed to their caller. - - -File: gmp.info, Node: Autoconf, Next: Emacs, Prev: Profiling, Up: GMP Basics - -3.14 Autoconf -============= - -Autoconf based applications can easily check whether GMP is installed. -The only thing to be noted is that GMP library symbols from version 3 -onwards have prefixes like `__gmpz'. The following therefore would be -a simple test, - - AC_CHECK_LIB(gmp, __gmpz_init) - - This just uses the default `AC_CHECK_LIB' actions for found or not -found, but an application that must have GMP would want to generate an -error if not found. For example, - - AC_CHECK_LIB(gmp, __gmpz_init, , - [AC_MSG_ERROR([GNU MP not found, see http://gmplib.org/])]) - - If functions added in some particular version of GMP are required, -then one of those can be used when checking. For example `mpz_mul_si' -was added in GMP 3.1, - - AC_CHECK_LIB(gmp, __gmpz_mul_si, , - [AC_MSG_ERROR( - [GNU MP not found, or not 3.1 or up, see http://gmplib.org/])]) - - An alternative would be to test the version number in `gmp.h' using -say `AC_EGREP_CPP'. That would make it possible to test the exact -version, if some particular sub-minor release is known to be necessary. - - In general it's recommended that applications should simply demand a -new enough GMP rather than trying to provide supplements for features -not available in past versions. - - Occasionally an application will need or want to know the size of a -type at configuration or preprocessing time, not just with `sizeof' in -the code. This can be done in the normal way with `mp_limb_t' etc, but -GMP 4.0 or up is best for this, since prior versions needed certain -`-D' defines on systems using a `long long' limb. The following would -suit Autoconf 2.50 or up, - - AC_CHECK_SIZEOF(mp_limb_t, , [#include ]) - - -File: gmp.info, Node: Emacs, Prev: Autoconf, Up: GMP Basics - -3.15 Emacs -========== - - (`info-lookup-symbol') is a good way to find documentation on -C functions while editing (*note Info Documentation Lookup: (emacs)Info -Lookup.). - - The GMP manual can be included in such lookups by putting the -following in your `.emacs', - - (eval-after-load "info-look" - '(let ((mode-value (assoc 'c-mode (assoc 'symbol info-lookup-alist)))) - (setcar (nthcdr 3 mode-value) - (cons '("(gmp)Function Index" nil "^ -.* " "\\>") - (nth 3 mode-value))))) - - -File: gmp.info, Node: Reporting Bugs, Next: Integer Functions, Prev: GMP Basics, Up: Top - -4 Reporting Bugs -**************** - -If you think you have found a bug in the GMP library, please -investigate it and report it. We have made this library available to -you, and it is not too much to ask you to report the bugs you find. - - Before you report a bug, check it's not already addressed in *Note -Known Build Problems::, or perhaps *Note Notes for Particular -Systems::. You may also want to check `http://gmplib.org/' for patches -for this release. - - Please include the following in any report, - - * The GMP version number, and if pre-packaged or patched then say so. - - * A test program that makes it possible for us to reproduce the bug. - Include instructions on how to run the program. - - * A description of what is wrong. If the results are incorrect, in - what way. If you get a crash, say so. - - * If you get a crash, include a stack backtrace from the debugger if - it's informative (`where' in `gdb', or `$C' in `adb'). - - * Please do not send core dumps, executables or `strace's. - - * The configuration options you used when building GMP, if any. - - * The name of the compiler and its version. For `gcc', get the - version with `gcc -v', otherwise perhaps `what `which cc`', or - similar. - - * The output from running `uname -a'. - - * The output from running `./config.guess', and from running - `./configfsf.guess' (might be the same). - - * If the bug is related to `configure', then the compressed contents - of `config.log'. - - * If the bug is related to an `asm' file not assembling, then the - contents of `config.m4' and the offending line or lines from the - temporary `mpn/tmp-.s'. - - Please make an effort to produce a self-contained report, with -something definite that can be tested or debugged. Vague queries or -piecemeal messages are difficult to act on and don't help the -development effort. - - It is not uncommon that an observed problem is actually due to a bug -in the compiler; the GMP code tends to explore interesting corners in -compilers. - - If your bug report is good, we will do our best to help you get a -corrected version of the library; if the bug report is poor, we won't -do anything about it (except maybe ask you to send a better report). - - Send your report to: . - - If you think something in this manual is unclear, or downright -incorrect, or if the language needs to be improved, please send a note -to the same address. - - -File: gmp.info, Node: Integer Functions, Next: Rational Number Functions, Prev: Reporting Bugs, Up: Top - -5 Integer Functions -******************* - -This chapter describes the GMP functions for performing integer -arithmetic. These functions start with the prefix `mpz_'. - - GMP integers are stored in objects of type `mpz_t'. - -* Menu: - -* Initializing Integers:: -* Assigning Integers:: -* Simultaneous Integer Init & Assign:: -* Converting Integers:: -* Integer Arithmetic:: -* Integer Division:: -* Integer Exponentiation:: -* Integer Roots:: -* Number Theoretic Functions:: -* Integer Comparisons:: -* Integer Logic and Bit Fiddling:: -* I/O of Integers:: -* Integer Random Numbers:: -* Integer Import and Export:: -* Miscellaneous Integer Functions:: -* Integer Special Functions:: - - -File: gmp.info, Node: Initializing Integers, Next: Assigning Integers, Prev: Integer Functions, Up: Integer Functions - -5.1 Initialization Functions -============================ - -The functions for integer arithmetic assume that all integer objects are -initialized. You do that by calling the function `mpz_init'. For -example, - - { - mpz_t integ; - mpz_init (integ); - ... - mpz_add (integ, ...); - ... - mpz_sub (integ, ...); - - /* Unless the program is about to exit, do ... */ - mpz_clear (integ); - } - - As you can see, you can store new values any number of times, once an -object is initialized. - - -- Function: void mpz_init (mpz_t X) - Initialize X, and set its value to 0. - - -- Function: void mpz_inits (mpz_t X, ...) - Initialize a NULL-terminated list of `mpz_t' variables, and set - their values to 0. - - -- Function: void mpz_init2 (mpz_t X, mp_bitcnt_t N) - Initialize X, with space for N-bit numbers, and set its value to 0. - Calling this function instead of `mpz_init' or `mpz_inits' is never - necessary; reallocation is handled automatically by GMP when - needed. - - N is only the initial space, X will grow automatically in the - normal way, if necessary, for subsequent values stored. - `mpz_init2' makes it possible to avoid such reallocations if a - maximum size is known in advance. - - -- Function: void mpz_clear (mpz_t X) - Free the space occupied by X. Call this function for all `mpz_t' - variables when you are done with them. - - -- Function: void mpz_clears (mpz_t X, ...) - Free the space occupied by a NULL-terminated list of `mpz_t' - variables. - - -- Function: void mpz_realloc2 (mpz_t X, mp_bitcnt_t N) - Change the space allocated for X to N bits. The value in X is - preserved if it fits, or is set to 0 if not. - - Calling this function is never necessary; reallocation is handled - automatically by GMP when needed. But this function can be used - to increase the space for a variable in order to avoid repeated - automatic reallocations, or to decrease it to give memory back to - the heap. - - -File: gmp.info, Node: Assigning Integers, Next: Simultaneous Integer Init & Assign, Prev: Initializing Integers, Up: Integer Functions - -5.2 Assignment Functions -======================== - -These functions assign new values to already initialized integers -(*note Initializing Integers::). - - -- Function: void mpz_set (mpz_t ROP, mpz_t OP) - -- Function: void mpz_set_ui (mpz_t ROP, unsigned long int OP) - -- Function: void mpz_set_si (mpz_t ROP, signed long int OP) - -- Function: void mpz_set_d (mpz_t ROP, double OP) - -- Function: void mpz_set_q (mpz_t ROP, mpq_t OP) - -- Function: void mpz_set_f (mpz_t ROP, mpf_t OP) - Set the value of ROP from OP. - - `mpz_set_d', `mpz_set_q' and `mpz_set_f' truncate OP to make it an - integer. - - -- Function: int mpz_set_str (mpz_t ROP, char *STR, int BASE) - Set the value of ROP from STR, a null-terminated C string in base - BASE. White space is allowed in the string, and is simply ignored. - - The BASE may vary from 2 to 62, or if BASE is 0, then the leading - characters are used: `0x' and `0X' for hexadecimal, `0b' and `0B' - for binary, `0' for octal, or decimal otherwise. - - For bases up to 36, case is ignored; upper-case and lower-case - letters have the same value. For bases 37 to 62, upper-case - letter represent the usual 10..35 while lower-case letter - represent 36..61. - - This function returns 0 if the entire string is a valid number in - base BASE. Otherwise it returns -1. - - -- Function: void mpz_swap (mpz_t ROP1, mpz_t ROP2) - Swap the values ROP1 and ROP2 efficiently. - - -File: gmp.info, Node: Simultaneous Integer Init & Assign, Next: Converting Integers, Prev: Assigning Integers, Up: Integer Functions - -5.3 Combined Initialization and Assignment Functions -==================================================== - -For convenience, GMP provides a parallel series of initialize-and-set -functions which initialize the output and then store the value there. -These functions' names have the form `mpz_init_set...' - - Here is an example of using one: - - { - mpz_t pie; - mpz_init_set_str (pie, "3141592653589793238462643383279502884", 10); - ... - mpz_sub (pie, ...); - ... - mpz_clear (pie); - } - -Once the integer has been initialized by any of the `mpz_init_set...' -functions, it can be used as the source or destination operand for the -ordinary integer functions. Don't use an initialize-and-set function -on a variable already initialized! - - -- Function: void mpz_init_set (mpz_t ROP, mpz_t OP) - -- Function: void mpz_init_set_ui (mpz_t ROP, unsigned long int OP) - -- Function: void mpz_init_set_si (mpz_t ROP, signed long int OP) - -- Function: void mpz_init_set_d (mpz_t ROP, double OP) - Initialize ROP with limb space and set the initial numeric value - from OP. - - -- Function: int mpz_init_set_str (mpz_t ROP, char *STR, int BASE) - Initialize ROP and set its value like `mpz_set_str' (see its - documentation above for details). - - If the string is a correct base BASE number, the function returns - 0; if an error occurs it returns -1. ROP is initialized even if - an error occurs. (I.e., you have to call `mpz_clear' for it.) - - -File: gmp.info, Node: Converting Integers, Next: Integer Arithmetic, Prev: Simultaneous Integer Init & Assign, Up: Integer Functions - -5.4 Conversion Functions -======================== - -This section describes functions for converting GMP integers to -standard C types. Functions for converting _to_ GMP integers are -described in *Note Assigning Integers:: and *Note I/O of Integers::. - - -- Function: unsigned long int mpz_get_ui (mpz_t OP) - Return the value of OP as an `unsigned long'. - - If OP is too big to fit an `unsigned long' then just the least - significant bits that do fit are returned. The sign of OP is - ignored, only the absolute value is used. - - -- Function: signed long int mpz_get_si (mpz_t OP) - If OP fits into a `signed long int' return the value of OP. - Otherwise return the least significant part of OP, with the same - sign as OP. - - If OP is too big to fit in a `signed long int', the returned - result is probably not very useful. To find out if the value will - fit, use the function `mpz_fits_slong_p'. - - -- Function: double mpz_get_d (mpz_t OP) - Convert OP to a `double', truncating if necessary (ie. rounding - towards zero). - - If the exponent from the conversion is too big, the result is - system dependent. An infinity is returned where available. A - hardware overflow trap may or may not occur. - - -- Function: double mpz_get_d_2exp (signed long int *EXP, mpz_t OP) - Convert OP to a `double', truncating if necessary (ie. rounding - towards zero), and returning the exponent separately. - - The return value is in the range 0.5<=abs(D)<1 and the exponent is - stored to `*EXP'. D * 2^EXP is the (truncated) OP value. If OP - is zero, the return is 0.0 and 0 is stored to `*EXP'. - - This is similar to the standard C `frexp' function (*note - Normalization Functions: (libc)Normalization Functions.). - - -- Function: char * mpz_get_str (char *STR, int BASE, mpz_t OP) - Convert OP to a string of digits in base BASE. The base argument - may vary from 2 to 62 or from -2 to -36. - - For BASE in the range 2..36, digits and lower-case letters are - used; for -2..-36, digits and upper-case letters are used; for - 37..62, digits, upper-case letters, and lower-case letters (in - that significance order) are used. - - If STR is `NULL', the result string is allocated using the current - allocation function (*note Custom Allocation::). The block will be - `strlen(str)+1' bytes, that being exactly enough for the string and - null-terminator. - - If STR is not `NULL', it should point to a block of storage large - enough for the result, that being `mpz_sizeinbase (OP, BASE) + 2'. - The two extra bytes are for a possible minus sign, and the - null-terminator. - - A pointer to the result string is returned, being either the - allocated block, or the given STR. - - -File: gmp.info, Node: Integer Arithmetic, Next: Integer Division, Prev: Converting Integers, Up: Integer Functions - -5.5 Arithmetic Functions -======================== - - -- Function: void mpz_add (mpz_t ROP, mpz_t OP1, mpz_t OP2) - -- Function: void mpz_add_ui (mpz_t ROP, mpz_t OP1, unsigned long int - OP2) - Set ROP to OP1 + OP2. - - -- Function: void mpz_sub (mpz_t ROP, mpz_t OP1, mpz_t OP2) - -- Function: void mpz_sub_ui (mpz_t ROP, mpz_t OP1, unsigned long int - OP2) - -- Function: void mpz_ui_sub (mpz_t ROP, unsigned long int OP1, mpz_t - OP2) - Set ROP to OP1 - OP2. - - -- Function: void mpz_mul (mpz_t ROP, mpz_t OP1, mpz_t OP2) - -- Function: void mpz_mul_si (mpz_t ROP, mpz_t OP1, long int OP2) - -- Function: void mpz_mul_ui (mpz_t ROP, mpz_t OP1, unsigned long int - OP2) - Set ROP to OP1 times OP2. - - -- Function: void mpz_addmul (mpz_t ROP, mpz_t OP1, mpz_t OP2) - -- Function: void mpz_addmul_ui (mpz_t ROP, mpz_t OP1, unsigned long - int OP2) - Set ROP to ROP + OP1 times OP2. - - -- Function: void mpz_submul (mpz_t ROP, mpz_t OP1, mpz_t OP2) - -- Function: void mpz_submul_ui (mpz_t ROP, mpz_t OP1, unsigned long - int OP2) - Set ROP to ROP - OP1 times OP2. - - -- Function: void mpz_mul_2exp (mpz_t ROP, mpz_t OP1, mp_bitcnt_t OP2) - Set ROP to OP1 times 2 raised to OP2. This operation can also be - defined as a left shift by OP2 bits. - - -- Function: void mpz_neg (mpz_t ROP, mpz_t OP) - Set ROP to -OP. - - -- Function: void mpz_abs (mpz_t ROP, mpz_t OP) - Set ROP to the absolute value of OP. - - -File: gmp.info, Node: Integer Division, Next: Integer Exponentiation, Prev: Integer Arithmetic, Up: Integer Functions - -5.6 Division Functions -====================== - -Division is undefined if the divisor is zero. Passing a zero divisor -to the division or modulo functions (including the modular powering -functions `mpz_powm' and `mpz_powm_ui'), will cause an intentional -division by zero. This lets a program handle arithmetic exceptions in -these functions the same way as for normal C `int' arithmetic. - - -- Function: void mpz_cdiv_q (mpz_t Q, mpz_t N, mpz_t D) - -- Function: void mpz_cdiv_r (mpz_t R, mpz_t N, mpz_t D) - -- Function: void mpz_cdiv_qr (mpz_t Q, mpz_t R, mpz_t N, mpz_t D) - -- Function: unsigned long int mpz_cdiv_q_ui (mpz_t Q, mpz_t N, - unsigned long int D) - -- Function: unsigned long int mpz_cdiv_r_ui (mpz_t R, mpz_t N, - unsigned long int D) - -- Function: unsigned long int mpz_cdiv_qr_ui (mpz_t Q, mpz_t R, - mpz_t N, unsigned long int D) - -- Function: unsigned long int mpz_cdiv_ui (mpz_t N, - unsigned long int D) - -- Function: void mpz_cdiv_q_2exp (mpz_t Q, mpz_t N, mp_bitcnt_t B) - -- Function: void mpz_cdiv_r_2exp (mpz_t R, mpz_t N, mp_bitcnt_t B) - - -- Function: void mpz_fdiv_q (mpz_t Q, mpz_t N, mpz_t D) - -- Function: void mpz_fdiv_r (mpz_t R, mpz_t N, mpz_t D) - -- Function: void mpz_fdiv_qr (mpz_t Q, mpz_t R, mpz_t N, mpz_t D) - -- Function: unsigned long int mpz_fdiv_q_ui (mpz_t Q, mpz_t N, - unsigned long int D) - -- Function: unsigned long int mpz_fdiv_r_ui (mpz_t R, mpz_t N, - unsigned long int D) - -- Function: unsigned long int mpz_fdiv_qr_ui (mpz_t Q, mpz_t R, - mpz_t N, unsigned long int D) - -- Function: unsigned long int mpz_fdiv_ui (mpz_t N, - unsigned long int D) - -- Function: void mpz_fdiv_q_2exp (mpz_t Q, mpz_t N, mp_bitcnt_t B) - -- Function: void mpz_fdiv_r_2exp (mpz_t R, mpz_t N, mp_bitcnt_t B) - - -- Function: void mpz_tdiv_q (mpz_t Q, mpz_t N, mpz_t D) - -- Function: void mpz_tdiv_r (mpz_t R, mpz_t N, mpz_t D) - -- Function: void mpz_tdiv_qr (mpz_t Q, mpz_t R, mpz_t N, mpz_t D) - -- Function: unsigned long int mpz_tdiv_q_ui (mpz_t Q, mpz_t N, - unsigned long int D) - -- Function: unsigned long int mpz_tdiv_r_ui (mpz_t R, mpz_t N, - unsigned long int D) - -- Function: unsigned long int mpz_tdiv_qr_ui (mpz_t Q, mpz_t R, - mpz_t N, unsigned long int D) - -- Function: unsigned long int mpz_tdiv_ui (mpz_t N, - unsigned long int D) - -- Function: void mpz_tdiv_q_2exp (mpz_t Q, mpz_t N, mp_bitcnt_t B) - -- Function: void mpz_tdiv_r_2exp (mpz_t R, mpz_t N, mp_bitcnt_t B) - - Divide N by D, forming a quotient Q and/or remainder R. For the - `2exp' functions, D=2^B. The rounding is in three styles, each - suiting different applications. - - * `cdiv' rounds Q up towards +infinity, and R will have the - opposite sign to D. The `c' stands for "ceil". - - * `fdiv' rounds Q down towards -infinity, and R will have the - same sign as D. The `f' stands for "floor". - - * `tdiv' rounds Q towards zero, and R will have the same sign - as N. The `t' stands for "truncate". - - In all cases Q and R will satisfy N=Q*D+R, and R will satisfy - 0<=abs(R) 0 and that MOD is odd. - - This function is designed to take the same time and have the same - cache access patterns for any two same-size arguments, assuming - that function arguments are placed at the same position and that - the machine state is identical upon function entry. This function - is intended for cryptographic purposes, where resilience to - side-channel attacks is desired. - - -- Function: void mpz_pow_ui (mpz_t ROP, mpz_t BASE, unsigned long int - EXP) - -- Function: void mpz_ui_pow_ui (mpz_t ROP, unsigned long int BASE, - unsigned long int EXP) - Set ROP to BASE raised to EXP. The case 0^0 yields 1. - - -File: gmp.info, Node: Integer Roots, Next: Number Theoretic Functions, Prev: Integer Exponentiation, Up: Integer Functions - -5.8 Root Extraction Functions -============================= - - -- Function: int mpz_root (mpz_t ROP, mpz_t OP, unsigned long int N) - Set ROP to the truncated integer part of the Nth root of OP. - Return non-zero if the computation was exact, i.e., if OP is ROP - to the Nth power. - - -- Function: void mpz_rootrem (mpz_t ROOT, mpz_t REM, mpz_t U, - unsigned long int N) - Set ROOT to the truncated integer part of the Nth root of U. Set - REM to the remainder, U-ROOT**N. - - -- Function: void mpz_sqrt (mpz_t ROP, mpz_t OP) - Set ROP to the truncated integer part of the square root of OP. - - -- Function: void mpz_sqrtrem (mpz_t ROP1, mpz_t ROP2, mpz_t OP) - Set ROP1 to the truncated integer part of the square root of OP, - like `mpz_sqrt'. Set ROP2 to the remainder OP-ROP1*ROP1, which - will be zero if OP is a perfect square. - - If ROP1 and ROP2 are the same variable, the results are undefined. - - -- Function: int mpz_perfect_power_p (mpz_t OP) - Return non-zero if OP is a perfect power, i.e., if there exist - integers A and B, with B>1, such that OP equals A raised to the - power B. - - Under this definition both 0 and 1 are considered to be perfect - powers. Negative values of OP are accepted, but of course can - only be odd perfect powers. - - -- Function: int mpz_perfect_square_p (mpz_t OP) - Return non-zero if OP is a perfect square, i.e., if the square - root of OP is an integer. Under this definition both 0 and 1 are - considered to be perfect squares. - - -File: gmp.info, Node: Number Theoretic Functions, Next: Integer Comparisons, Prev: Integer Roots, Up: Integer Functions - -5.9 Number Theoretic Functions -============================== - - -- Function: int mpz_probab_prime_p (mpz_t N, int REPS) - Determine whether N is prime. Return 2 if N is definitely prime, - return 1 if N is probably prime (without being certain), or return - 0 if N is definitely composite. - - This function does some trial divisions, then some Miller-Rabin - probabilistic primality tests. REPS controls how many such tests - are done, 5 to 10 is a reasonable number, more will reduce the - chances of a composite being returned as "probably prime". - - Miller-Rabin and similar tests can be more properly called - compositeness tests. Numbers which fail are known to be composite - but those which pass might be prime or might be composite. Only a - few composites pass, hence those which pass are considered - probably prime. - - -- Function: void mpz_nextprime (mpz_t ROP, mpz_t OP) - Set ROP to the next prime greater than OP. - - This function uses a probabilistic algorithm to identify primes. - For practical purposes it's adequate, the chance of a composite - passing will be extremely small. - - -- Function: void mpz_gcd (mpz_t ROP, mpz_t OP1, mpz_t OP2) - Set ROP to the greatest common divisor of OP1 and OP2. The result - is always positive even if one or both input operands are negative. - - -- Function: unsigned long int mpz_gcd_ui (mpz_t ROP, mpz_t OP1, - unsigned long int OP2) - Compute the greatest common divisor of OP1 and OP2. If ROP is not - `NULL', store the result there. - - If the result is small enough to fit in an `unsigned long int', it - is returned. If the result does not fit, 0 is returned, and the - result is equal to the argument OP1. Note that the result will - always fit if OP2 is non-zero. - - -- Function: void mpz_gcdext (mpz_t G, mpz_t S, mpz_t T, mpz_t A, - mpz_t B) - Set G to the greatest common divisor of A and B, and in addition - set S and T to coefficients satisfying A*S + B*T = G. The value - in G is always positive, even if one or both of A and B are - negative. The values in S and T are chosen such that abs(S) <= - abs(B) and abs(T) <= abs(A). - - If T is `NULL' then that value is not computed. - - -- Function: void mpz_lcm (mpz_t ROP, mpz_t OP1, mpz_t OP2) - -- Function: void mpz_lcm_ui (mpz_t ROP, mpz_t OP1, unsigned long OP2) - Set ROP to the least common multiple of OP1 and OP2. ROP is - always positive, irrespective of the signs of OP1 and OP2. ROP - will be zero if either OP1 or OP2 is zero. - - -- Function: int mpz_invert (mpz_t ROP, mpz_t OP1, mpz_t OP2) - Compute the inverse of OP1 modulo OP2 and put the result in ROP. - If the inverse exists, the return value is non-zero and ROP will - satisfy 0 <= ROP < OP2. If an inverse doesn't exist the return - value is zero and ROP is undefined. - - -- Function: int mpz_jacobi (mpz_t A, mpz_t B) - Calculate the Jacobi symbol (A/B). This is defined only for B odd. - - -- Function: int mpz_legendre (mpz_t A, mpz_t P) - Calculate the Legendre symbol (A/P). This is defined only for P - an odd positive prime, and for such P it's identical to the Jacobi - symbol. - - -- Function: int mpz_kronecker (mpz_t A, mpz_t B) - -- Function: int mpz_kronecker_si (mpz_t A, long B) - -- Function: int mpz_kronecker_ui (mpz_t A, unsigned long B) - -- Function: int mpz_si_kronecker (long A, mpz_t B) - -- Function: int mpz_ui_kronecker (unsigned long A, mpz_t B) - Calculate the Jacobi symbol (A/B) with the Kronecker extension - (a/2)=(2/a) when a odd, or (a/2)=0 when a even. - - When B is odd the Jacobi symbol and Kronecker symbol are - identical, so `mpz_kronecker_ui' etc can be used for mixed - precision Jacobi symbols too. - - For more information see Henri Cohen section 1.4.2 (*note - References::), or any number theory textbook. See also the - example program `demos/qcn.c' which uses `mpz_kronecker_ui'. - - -- Function: mp_bitcnt_t mpz_remove (mpz_t ROP, mpz_t OP, mpz_t F) - Remove all occurrences of the factor F from OP and store the - result in ROP. The return value is how many such occurrences were - removed. - - -- Function: void mpz_fac_ui (mpz_t ROP, unsigned long int OP) - Set ROP to OP!, the factorial of OP. - - -- Function: void mpz_bin_ui (mpz_t ROP, mpz_t N, unsigned long int K) - -- Function: void mpz_bin_uiui (mpz_t ROP, unsigned long int N, - unsigned long int K) - Compute the binomial coefficient N over K and store the result in - ROP. Negative values of N are supported by `mpz_bin_ui', using - the identity bin(-n,k) = (-1)^k * bin(n+k-1,k), see Knuth volume 1 - section 1.2.6 part G. - - -- Function: void mpz_fib_ui (mpz_t FN, unsigned long int N) - -- Function: void mpz_fib2_ui (mpz_t FN, mpz_t FNSUB1, unsigned long - int N) - `mpz_fib_ui' sets FN to to F[n], the N'th Fibonacci number. - `mpz_fib2_ui' sets FN to F[n], and FNSUB1 to F[n-1]. - - These functions are designed for calculating isolated Fibonacci - numbers. When a sequence of values is wanted it's best to start - with `mpz_fib2_ui' and iterate the defining F[n+1]=F[n]+F[n-1] or - similar. - - -- Function: void mpz_lucnum_ui (mpz_t LN, unsigned long int N) - -- Function: void mpz_lucnum2_ui (mpz_t LN, mpz_t LNSUB1, unsigned - long int N) - `mpz_lucnum_ui' sets LN to to L[n], the N'th Lucas number. - `mpz_lucnum2_ui' sets LN to L[n], and LNSUB1 to L[n-1]. - - These functions are designed for calculating isolated Lucas - numbers. When a sequence of values is wanted it's best to start - with `mpz_lucnum2_ui' and iterate the defining L[n+1]=L[n]+L[n-1] - or similar. - - The Fibonacci numbers and Lucas numbers are related sequences, so - it's never necessary to call both `mpz_fib2_ui' and - `mpz_lucnum2_ui'. The formulas for going from Fibonacci to Lucas - can be found in *Note Lucas Numbers Algorithm::, the reverse is - straightforward too. - - -File: gmp.info, Node: Integer Comparisons, Next: Integer Logic and Bit Fiddling, Prev: Number Theoretic Functions, Up: Integer Functions - -5.10 Comparison Functions -========================= - - -- Function: int mpz_cmp (mpz_t OP1, mpz_t OP2) - -- Function: int mpz_cmp_d (mpz_t OP1, double OP2) - -- Macro: int mpz_cmp_si (mpz_t OP1, signed long int OP2) - -- Macro: int mpz_cmp_ui (mpz_t OP1, unsigned long int OP2) - Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero - if OP1 = OP2, or a negative value if OP1 < OP2. - - `mpz_cmp_ui' and `mpz_cmp_si' are macros and will evaluate their - arguments more than once. `mpz_cmp_d' can be called with an - infinity, but results are undefined for a NaN. - - -- Function: int mpz_cmpabs (mpz_t OP1, mpz_t OP2) - -- Function: int mpz_cmpabs_d (mpz_t OP1, double OP2) - -- Function: int mpz_cmpabs_ui (mpz_t OP1, unsigned long int OP2) - Compare the absolute values of OP1 and OP2. Return a positive - value if abs(OP1) > abs(OP2), zero if abs(OP1) = abs(OP2), or a - negative value if abs(OP1) < abs(OP2). - - `mpz_cmpabs_d' can be called with an infinity, but results are - undefined for a NaN. - - -- Macro: int mpz_sgn (mpz_t OP) - Return +1 if OP > 0, 0 if OP = 0, and -1 if OP < 0. - - This function is actually implemented as a macro. It evaluates - its argument multiple times. - - -File: gmp.info, Node: Integer Logic and Bit Fiddling, Next: I/O of Integers, Prev: Integer Comparisons, Up: Integer Functions - -5.11 Logical and Bit Manipulation Functions -=========================================== - -These functions behave as if twos complement arithmetic were used -(although sign-magnitude is the actual implementation). The least -significant bit is number 0. - - -- Function: void mpz_and (mpz_t ROP, mpz_t OP1, mpz_t OP2) - Set ROP to OP1 bitwise-and OP2. - - -- Function: void mpz_ior (mpz_t ROP, mpz_t OP1, mpz_t OP2) - Set ROP to OP1 bitwise inclusive-or OP2. - - -- Function: void mpz_xor (mpz_t ROP, mpz_t OP1, mpz_t OP2) - Set ROP to OP1 bitwise exclusive-or OP2. - - -- Function: void mpz_com (mpz_t ROP, mpz_t OP) - Set ROP to the one's complement of OP. - - -- Function: mp_bitcnt_t mpz_popcount (mpz_t OP) - If OP>=0, return the population count of OP, which is the number - of 1 bits in the binary representation. If OP<0, the number of 1s - is infinite, and the return value is the largest possible - `mp_bitcnt_t'. - - -- Function: mp_bitcnt_t mpz_hamdist (mpz_t OP1, mpz_t OP2) - If OP1 and OP2 are both >=0 or both <0, return the hamming - distance between the two operands, which is the number of bit - positions where OP1 and OP2 have different bit values. If one - operand is >=0 and the other <0 then the number of bits different - is infinite, and the return value is the largest possible - `mp_bitcnt_t'. - - -- Function: mp_bitcnt_t mpz_scan0 (mpz_t OP, mp_bitcnt_t STARTING_BIT) - -- Function: mp_bitcnt_t mpz_scan1 (mpz_t OP, mp_bitcnt_t STARTING_BIT) - Scan OP, starting from bit STARTING_BIT, towards more significant - bits, until the first 0 or 1 bit (respectively) is found. Return - the index of the found bit. - - If the bit at STARTING_BIT is already what's sought, then - STARTING_BIT is returned. - - If there's no bit found, then the largest possible `mp_bitcnt_t' is - returned. This will happen in `mpz_scan0' past the end of a - negative number, or `mpz_scan1' past the end of a nonnegative - number. - - -- Function: void mpz_setbit (mpz_t ROP, mp_bitcnt_t BIT_INDEX) - Set bit BIT_INDEX in ROP. - - -- Function: void mpz_clrbit (mpz_t ROP, mp_bitcnt_t BIT_INDEX) - Clear bit BIT_INDEX in ROP. - - -- Function: void mpz_combit (mpz_t ROP, mp_bitcnt_t BIT_INDEX) - Complement bit BIT_INDEX in ROP. - - -- Function: int mpz_tstbit (mpz_t OP, mp_bitcnt_t BIT_INDEX) - Test bit BIT_INDEX in OP and return 0 or 1 accordingly. - - -File: gmp.info, Node: I/O of Integers, Next: Integer Random Numbers, Prev: Integer Logic and Bit Fiddling, Up: Integer Functions - -5.12 Input and Output Functions -=============================== - -Functions that perform input from a stdio stream, and functions that -output to a stdio stream. Passing a `NULL' pointer for a STREAM -argument to any of these functions will make them read from `stdin' and -write to `stdout', respectively. - - When using any of these functions, it is a good idea to include -`stdio.h' before `gmp.h', since that will allow `gmp.h' to define -prototypes for these functions. - - -- Function: size_t mpz_out_str (FILE *STREAM, int BASE, mpz_t OP) - Output OP on stdio stream STREAM, as a string of digits in base - BASE. The base argument may vary from 2 to 62 or from -2 to -36. - - For BASE in the range 2..36, digits and lower-case letters are - used; for -2..-36, digits and upper-case letters are used; for - 37..62, digits, upper-case letters, and lower-case letters (in - that significance order) are used. - - Return the number of bytes written, or if an error occurred, - return 0. - - -- Function: size_t mpz_inp_str (mpz_t ROP, FILE *STREAM, int BASE) - Input a possibly white-space preceded string in base BASE from - stdio stream STREAM, and put the read integer in ROP. - - The BASE may vary from 2 to 62, or if BASE is 0, then the leading - characters are used: `0x' and `0X' for hexadecimal, `0b' and `0B' - for binary, `0' for octal, or decimal otherwise. - - For bases up to 36, case is ignored; upper-case and lower-case - letters have the same value. For bases 37 to 62, upper-case - letter represent the usual 10..35 while lower-case letter - represent 36..61. - - Return the number of bytes read, or if an error occurred, return 0. - - -- Function: size_t mpz_out_raw (FILE *STREAM, mpz_t OP) - Output OP on stdio stream STREAM, in raw binary format. The - integer is written in a portable format, with 4 bytes of size - information, and that many bytes of limbs. Both the size and the - limbs are written in decreasing significance order (i.e., in - big-endian). - - The output can be read with `mpz_inp_raw'. - - Return the number of bytes written, or if an error occurred, - return 0. - - The output of this can not be read by `mpz_inp_raw' from GMP 1, - because of changes necessary for compatibility between 32-bit and - 64-bit machines. - - -- Function: size_t mpz_inp_raw (mpz_t ROP, FILE *STREAM) - Input from stdio stream STREAM in the format written by - `mpz_out_raw', and put the result in ROP. Return the number of - bytes read, or if an error occurred, return 0. - - This routine can read the output from `mpz_out_raw' also from GMP - 1, in spite of changes necessary for compatibility between 32-bit - and 64-bit machines. - - -File: gmp.info, Node: Integer Random Numbers, Next: Integer Import and Export, Prev: I/O of Integers, Up: Integer Functions - -5.13 Random Number Functions -============================ - -The random number functions of GMP come in two groups; older function -that rely on a global state, and newer functions that accept a state -parameter that is read and modified. Please see the *Note Random -Number Functions:: for more information on how to use and not to use -random number functions. - - -- Function: void mpz_urandomb (mpz_t ROP, gmp_randstate_t STATE, - mp_bitcnt_t N) - Generate a uniformly distributed random integer in the range 0 to - 2^N-1, inclusive. - - The variable STATE must be initialized by calling one of the - `gmp_randinit' functions (*Note Random State Initialization::) - before invoking this function. - - -- Function: void mpz_urandomm (mpz_t ROP, gmp_randstate_t STATE, - mpz_t N) - Generate a uniform random integer in the range 0 to N-1, inclusive. - - The variable STATE must be initialized by calling one of the - `gmp_randinit' functions (*Note Random State Initialization::) - before invoking this function. - - -- Function: void mpz_rrandomb (mpz_t ROP, gmp_randstate_t STATE, - mp_bitcnt_t N) - Generate a random integer with long strings of zeros and ones in - the binary representation. Useful for testing functions and - algorithms, since this kind of random numbers have proven to be - more likely to trigger corner-case bugs. The random number will - be in the range 0 to 2^N-1, inclusive. - - The variable STATE must be initialized by calling one of the - `gmp_randinit' functions (*Note Random State Initialization::) - before invoking this function. - - -- Function: void mpz_random (mpz_t ROP, mp_size_t MAX_SIZE) - Generate a random integer of at most MAX_SIZE limbs. The generated - random number doesn't satisfy any particular requirements of - randomness. Negative random numbers are generated when MAX_SIZE - is negative. - - This function is obsolete. Use `mpz_urandomb' or `mpz_urandomm' - instead. - - -- Function: void mpz_random2 (mpz_t ROP, mp_size_t MAX_SIZE) - Generate a random integer of at most MAX_SIZE limbs, with long - strings of zeros and ones in the binary representation. Useful - for testing functions and algorithms, since this kind of random - numbers have proven to be more likely to trigger corner-case bugs. - Negative random numbers are generated when MAX_SIZE is negative. - - This function is obsolete. Use `mpz_rrandomb' instead. - - -File: gmp.info, Node: Integer Import and Export, Next: Miscellaneous Integer Functions, Prev: Integer Random Numbers, Up: Integer Functions - -5.14 Integer Import and Export -============================== - -`mpz_t' variables can be converted to and from arbitrary words of binary -data with the following functions. - - -- Function: void mpz_import (mpz_t ROP, size_t COUNT, int ORDER, - size_t SIZE, int ENDIAN, size_t NAILS, const void *OP) - Set ROP from an array of word data at OP. - - The parameters specify the format of the data. COUNT many words - are read, each SIZE bytes. ORDER can be 1 for most significant - word first or -1 for least significant first. Within each word - ENDIAN can be 1 for most significant byte first, -1 for least - significant first, or 0 for the native endianness of the host CPU. - The most significant NAILS bits of each word are skipped, this - can be 0 to use the full words. - - There is no sign taken from the data, ROP will simply be a positive - integer. An application can handle any sign itself, and apply it - for instance with `mpz_neg'. - - There are no data alignment restrictions on OP, any address is - allowed. - - Here's an example converting an array of `unsigned long' data, most - significant element first, and host byte order within each value. - - unsigned long a[20]; - /* Initialize Z and A */ - mpz_import (z, 20, 1, sizeof(a[0]), 0, 0, a); - - This example assumes the full `sizeof' bytes are used for data in - the given type, which is usually true, and certainly true for - `unsigned long' everywhere we know of. However on Cray vector - systems it may be noted that `short' and `int' are always stored - in 8 bytes (and with `sizeof' indicating that) but use only 32 or - 46 bits. The NAILS feature can account for this, by passing for - instance `8*sizeof(int)-INT_BIT'. - - -- Function: void * mpz_export (void *ROP, size_t *COUNTP, int ORDER, - size_t SIZE, int ENDIAN, size_t NAILS, mpz_t OP) - Fill ROP with word data from OP. - - The parameters specify the format of the data produced. Each word - will be SIZE bytes and ORDER can be 1 for most significant word - first or -1 for least significant first. Within each word ENDIAN - can be 1 for most significant byte first, -1 for least significant - first, or 0 for the native endianness of the host CPU. The most - significant NAILS bits of each word are unused and set to zero, - this can be 0 to produce full words. - - The number of words produced is written to `*COUNTP', or COUNTP - can be `NULL' to discard the count. ROP must have enough space - for the data, or if ROP is `NULL' then a result array of the - necessary size is allocated using the current GMP allocation - function (*note Custom Allocation::). In either case the return - value is the destination used, either ROP or the allocated block. - - If OP is non-zero then the most significant word produced will be - non-zero. If OP is zero then the count returned will be zero and - nothing written to ROP. If ROP is `NULL' in this case, no block - is allocated, just `NULL' is returned. - - The sign of OP is ignored, just the absolute value is exported. An - application can use `mpz_sgn' to get the sign and handle it as - desired. (*note Integer Comparisons::) - - There are no data alignment restrictions on ROP, any address is - allowed. - - When an application is allocating space itself the required size - can be determined with a calculation like the following. Since - `mpz_sizeinbase' always returns at least 1, `count' here will be - at least one, which avoids any portability problems with - `malloc(0)', though if `z' is zero no space at all is actually - needed (or written). - - numb = 8*size - nail; - count = (mpz_sizeinbase (z, 2) + numb-1) / numb; - p = malloc (count * size); - - -File: gmp.info, Node: Miscellaneous Integer Functions, Next: Integer Special Functions, Prev: Integer Import and Export, Up: Integer Functions - -5.15 Miscellaneous Functions -============================ - - -- Function: int mpz_fits_ulong_p (mpz_t OP) - -- Function: int mpz_fits_slong_p (mpz_t OP) - -- Function: int mpz_fits_uint_p (mpz_t OP) - -- Function: int mpz_fits_sint_p (mpz_t OP) - -- Function: int mpz_fits_ushort_p (mpz_t OP) - -- Function: int mpz_fits_sshort_p (mpz_t OP) - Return non-zero iff the value of OP fits in an `unsigned long int', - `signed long int', `unsigned int', `signed int', `unsigned short - int', or `signed short int', respectively. Otherwise, return zero. - - -- Macro: int mpz_odd_p (mpz_t OP) - -- Macro: int mpz_even_p (mpz_t OP) - Determine whether OP is odd or even, respectively. Return - non-zero if yes, zero if no. These macros evaluate their argument - more than once. - - -- Function: size_t mpz_sizeinbase (mpz_t OP, int BASE) - Return the size of OP measured in number of digits in the given - BASE. BASE can vary from 2 to 62. The sign of OP is ignored, - just the absolute value is used. The result will be either exact - or 1 too big. If BASE is a power of 2, the result is always - exact. If OP is zero the return value is always 1. - - This function can be used to determine the space required when - converting OP to a string. The right amount of allocation is - normally two more than the value returned by `mpz_sizeinbase', one - extra for a minus sign and one for the null-terminator. - - It will be noted that `mpz_sizeinbase(OP,2)' can be used to locate - the most significant 1 bit in OP, counting from 1. (Unlike the - bitwise functions which start from 0, *Note Logical and Bit - Manipulation Functions: Integer Logic and Bit Fiddling.) - - -File: gmp.info, Node: Integer Special Functions, Prev: Miscellaneous Integer Functions, Up: Integer Functions - -5.16 Special Functions -====================== - -The functions in this section are for various special purposes. Most -applications will not need them. - - -- Function: void mpz_array_init (mpz_t INTEGER_ARRAY, mp_size_t - ARRAY_SIZE, mp_size_t FIXED_NUM_BITS) - This is a special type of initialization. *Fixed* space of - FIXED_NUM_BITS is allocated to each of the ARRAY_SIZE integers in - INTEGER_ARRAY. There is no way to free the storage allocated by - this function. Don't call `mpz_clear'! - - The INTEGER_ARRAY parameter is the first `mpz_t' in the array. For - example, - - mpz_t arr[20000]; - mpz_array_init (arr[0], 20000, 512); - - This function is only intended for programs that create a large - number of integers and need to reduce memory usage by avoiding the - overheads of allocating and reallocating lots of small blocks. In - normal programs this function is not recommended. - - The space allocated to each integer by this function will not be - automatically increased, unlike the normal `mpz_init', so an - application must ensure it is sufficient for any value stored. - The following space requirements apply to various routines, - - * `mpz_abs', `mpz_neg', `mpz_set', `mpz_set_si' and - `mpz_set_ui' need room for the value they store. - - * `mpz_add', `mpz_add_ui', `mpz_sub' and `mpz_sub_ui' need room - for the larger of the two operands, plus an extra - `mp_bits_per_limb'. - - * `mpz_mul', `mpz_mul_ui' and `mpz_mul_ui' need room for the sum - of the number of bits in their operands, but each rounded up - to a multiple of `mp_bits_per_limb'. - - * `mpz_swap' can be used between two array variables, but not - between an array and a normal variable. - - For other functions, or if in doubt, the suggestion is to - calculate in a regular `mpz_init' variable and copy the result to - an array variable with `mpz_set'. - - -- Function: void * _mpz_realloc (mpz_t INTEGER, mp_size_t NEW_ALLOC) - Change the space for INTEGER to NEW_ALLOC limbs. The value in - INTEGER is preserved if it fits, or is set to 0 if not. The return - value is not useful to applications and should be ignored. - - `mpz_realloc2' is the preferred way to accomplish allocation - changes like this. `mpz_realloc2' and `_mpz_realloc' are the same - except that `_mpz_realloc' takes its size in limbs. - - -- Function: mp_limb_t mpz_getlimbn (mpz_t OP, mp_size_t N) - Return limb number N from OP. The sign of OP is ignored, just the - absolute value is used. The least significant limb is number 0. - - `mpz_size' can be used to find how many limbs make up OP. - `mpz_getlimbn' returns zero if N is outside the range 0 to - `mpz_size(OP)-1'. - - -- Function: size_t mpz_size (mpz_t OP) - Return the size of OP measured in number of limbs. If OP is zero, - the returned value will be zero. - - -File: gmp.info, Node: Rational Number Functions, Next: Floating-point Functions, Prev: Integer Functions, Up: Top - -6 Rational Number Functions -*************************** - -This chapter describes the GMP functions for performing arithmetic on -rational numbers. These functions start with the prefix `mpq_'. - - Rational numbers are stored in objects of type `mpq_t'. - - All rational arithmetic functions assume operands have a canonical -form, and canonicalize their result. The canonical from means that the -denominator and the numerator have no common factors, and that the -denominator is positive. Zero has the unique representation 0/1. - - Pure assignment functions do not canonicalize the assigned variable. -It is the responsibility of the user to canonicalize the assigned -variable before any arithmetic operations are performed on that -variable. - - -- Function: void mpq_canonicalize (mpq_t OP) - Remove any factors that are common to the numerator and - denominator of OP, and make the denominator positive. - -* Menu: - -* Initializing Rationals:: -* Rational Conversions:: -* Rational Arithmetic:: -* Comparing Rationals:: -* Applying Integer Functions:: -* I/O of Rationals:: - - -File: gmp.info, Node: Initializing Rationals, Next: Rational Conversions, Prev: Rational Number Functions, Up: Rational Number Functions - -6.1 Initialization and Assignment Functions -=========================================== - - -- Function: void mpq_init (mpq_t X) - Initialize X and set it to 0/1. Each variable should normally - only be initialized once, or at least cleared out (using the - function `mpq_clear') between each initialization. - - -- Function: void mpq_inits (mpq_t X, ...) - Initialize a NULL-terminated list of `mpq_t' variables, and set - their values to 0/1. - - -- Function: void mpq_clear (mpq_t X) - Free the space occupied by X. Make sure to call this function for - all `mpq_t' variables when you are done with them. - - -- Function: void mpq_clears (mpq_t X, ...) - Free the space occupied by a NULL-terminated list of `mpq_t' - variables. - - -- Function: void mpq_set (mpq_t ROP, mpq_t OP) - -- Function: void mpq_set_z (mpq_t ROP, mpz_t OP) - Assign ROP from OP. - - -- Function: void mpq_set_ui (mpq_t ROP, unsigned long int OP1, - unsigned long int OP2) - -- Function: void mpq_set_si (mpq_t ROP, signed long int OP1, unsigned - long int OP2) - Set the value of ROP to OP1/OP2. Note that if OP1 and OP2 have - common factors, ROP has to be passed to `mpq_canonicalize' before - any operations are performed on ROP. - - -- Function: int mpq_set_str (mpq_t ROP, char *STR, int BASE) - Set ROP from a null-terminated string STR in the given BASE. - - The string can be an integer like "41" or a fraction like - "41/152". The fraction must be in canonical form (*note Rational - Number Functions::), or if not then `mpq_canonicalize' must be - called. - - The numerator and optional denominator are parsed the same as in - `mpz_set_str' (*note Assigning Integers::). White space is - allowed in the string, and is simply ignored. The BASE can vary - from 2 to 62, or if BASE is 0 then the leading characters are - used: `0x' or `0X' for hex, `0b' or `0B' for binary, `0' for - octal, or decimal otherwise. Note that this is done separately - for the numerator and denominator, so for instance `0xEF/100' is - 239/100, whereas `0xEF/0x100' is 239/256. - - The return value is 0 if the entire string is a valid number, or - -1 if not. - - -- Function: void mpq_swap (mpq_t ROP1, mpq_t ROP2) - Swap the values ROP1 and ROP2 efficiently. - - -File: gmp.info, Node: Rational Conversions, Next: Rational Arithmetic, Prev: Initializing Rationals, Up: Rational Number Functions - -6.2 Conversion Functions -======================== - - -- Function: double mpq_get_d (mpq_t OP) - Convert OP to a `double', truncating if necessary (ie. rounding - towards zero). - - If the exponent from the conversion is too big or too small to fit - a `double' then the result is system dependent. For too big an - infinity is returned when available. For too small 0.0 is - normally returned. Hardware overflow, underflow and denorm traps - may or may not occur. - - -- Function: void mpq_set_d (mpq_t ROP, double OP) - -- Function: void mpq_set_f (mpq_t ROP, mpf_t OP) - Set ROP to the value of OP. There is no rounding, this conversion - is exact. - - -- Function: char * mpq_get_str (char *STR, int BASE, mpq_t OP) - Convert OP to a string of digits in base BASE. The base may vary - from 2 to 36. The string will be of the form `num/den', or if the - denominator is 1 then just `num'. - - If STR is `NULL', the result string is allocated using the current - allocation function (*note Custom Allocation::). The block will be - `strlen(str)+1' bytes, that being exactly enough for the string and - null-terminator. - - If STR is not `NULL', it should point to a block of storage large - enough for the result, that being - - mpz_sizeinbase (mpq_numref(OP), BASE) - + mpz_sizeinbase (mpq_denref(OP), BASE) + 3 - - The three extra bytes are for a possible minus sign, possible - slash, and the null-terminator. - - A pointer to the result string is returned, being either the - allocated block, or the given STR. - - -File: gmp.info, Node: Rational Arithmetic, Next: Comparing Rationals, Prev: Rational Conversions, Up: Rational Number Functions - -6.3 Arithmetic Functions -======================== - - -- Function: void mpq_add (mpq_t SUM, mpq_t ADDEND1, mpq_t ADDEND2) - Set SUM to ADDEND1 + ADDEND2. - - -- Function: void mpq_sub (mpq_t DIFFERENCE, mpq_t MINUEND, mpq_t - SUBTRAHEND) - Set DIFFERENCE to MINUEND - SUBTRAHEND. - - -- Function: void mpq_mul (mpq_t PRODUCT, mpq_t MULTIPLIER, mpq_t - MULTIPLICAND) - Set PRODUCT to MULTIPLIER times MULTIPLICAND. - - -- Function: void mpq_mul_2exp (mpq_t ROP, mpq_t OP1, mp_bitcnt_t OP2) - Set ROP to OP1 times 2 raised to OP2. - - -- Function: void mpq_div (mpq_t QUOTIENT, mpq_t DIVIDEND, mpq_t - DIVISOR) - Set QUOTIENT to DIVIDEND/DIVISOR. - - -- Function: void mpq_div_2exp (mpq_t ROP, mpq_t OP1, mp_bitcnt_t OP2) - Set ROP to OP1 divided by 2 raised to OP2. - - -- Function: void mpq_neg (mpq_t NEGATED_OPERAND, mpq_t OPERAND) - Set NEGATED_OPERAND to -OPERAND. - - -- Function: void mpq_abs (mpq_t ROP, mpq_t OP) - Set ROP to the absolute value of OP. - - -- Function: void mpq_inv (mpq_t INVERTED_NUMBER, mpq_t NUMBER) - Set INVERTED_NUMBER to 1/NUMBER. If the new denominator is zero, - this routine will divide by zero. - - -File: gmp.info, Node: Comparing Rationals, Next: Applying Integer Functions, Prev: Rational Arithmetic, Up: Rational Number Functions - -6.4 Comparison Functions -======================== - - -- Function: int mpq_cmp (mpq_t OP1, mpq_t OP2) - Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero - if OP1 = OP2, and a negative value if OP1 < OP2. - - To determine if two rationals are equal, `mpq_equal' is faster than - `mpq_cmp'. - - -- Macro: int mpq_cmp_ui (mpq_t OP1, unsigned long int NUM2, unsigned - long int DEN2) - -- Macro: int mpq_cmp_si (mpq_t OP1, long int NUM2, unsigned long int - DEN2) - Compare OP1 and NUM2/DEN2. Return a positive value if OP1 > - NUM2/DEN2, zero if OP1 = NUM2/DEN2, and a negative value if OP1 < - NUM2/DEN2. - - NUM2 and DEN2 are allowed to have common factors. - - These functions are implemented as a macros and evaluate their - arguments multiple times. - - -- Macro: int mpq_sgn (mpq_t OP) - Return +1 if OP > 0, 0 if OP = 0, and -1 if OP < 0. - - This function is actually implemented as a macro. It evaluates its - arguments multiple times. - - -- Function: int mpq_equal (mpq_t OP1, mpq_t OP2) - Return non-zero if OP1 and OP2 are equal, zero if they are - non-equal. Although `mpq_cmp' can be used for the same purpose, - this function is much faster. - - -File: gmp.info, Node: Applying Integer Functions, Next: I/O of Rationals, Prev: Comparing Rationals, Up: Rational Number Functions - -6.5 Applying Integer Functions to Rationals -=========================================== - -The set of `mpq' functions is quite small. In particular, there are few -functions for either input or output. The following functions give -direct access to the numerator and denominator of an `mpq_t'. - - Note that if an assignment to the numerator and/or denominator could -take an `mpq_t' out of the canonical form described at the start of -this chapter (*note Rational Number Functions::) then -`mpq_canonicalize' must be called before any other `mpq' functions are -applied to that `mpq_t'. - - -- Macro: mpz_t mpq_numref (mpq_t OP) - -- Macro: mpz_t mpq_denref (mpq_t OP) - Return a reference to the numerator and denominator of OP, - respectively. The `mpz' functions can be used on the result of - these macros. - - -- Function: void mpq_get_num (mpz_t NUMERATOR, mpq_t RATIONAL) - -- Function: void mpq_get_den (mpz_t DENOMINATOR, mpq_t RATIONAL) - -- Function: void mpq_set_num (mpq_t RATIONAL, mpz_t NUMERATOR) - -- Function: void mpq_set_den (mpq_t RATIONAL, mpz_t DENOMINATOR) - Get or set the numerator or denominator of a rational. These - functions are equivalent to calling `mpz_set' with an appropriate - `mpq_numref' or `mpq_denref'. Direct use of `mpq_numref' or - `mpq_denref' is recommended instead of these functions. - - -File: gmp.info, Node: I/O of Rationals, Prev: Applying Integer Functions, Up: Rational Number Functions - -6.6 Input and Output Functions -============================== - -When using any of these functions, it's a good idea to include `stdio.h' -before `gmp.h', since that will allow `gmp.h' to define prototypes for -these functions. - - Passing a `NULL' pointer for a STREAM argument to any of these -functions will make them read from `stdin' and write to `stdout', -respectively. - - -- Function: size_t mpq_out_str (FILE *STREAM, int BASE, mpq_t OP) - Output OP on stdio stream STREAM, as a string of digits in base - BASE. The base may vary from 2 to 36. Output is in the form - `num/den' or if the denominator is 1 then just `num'. - - Return the number of bytes written, or if an error occurred, - return 0. - - -- Function: size_t mpq_inp_str (mpq_t ROP, FILE *STREAM, int BASE) - Read a string of digits from STREAM and convert them to a rational - in ROP. Any initial white-space characters are read and - discarded. Return the number of characters read (including white - space), or 0 if a rational could not be read. - - The input can be a fraction like `17/63' or just an integer like - `123'. Reading stops at the first character not in this form, and - white space is not permitted within the string. If the input - might not be in canonical form, then `mpq_canonicalize' must be - called (*note Rational Number Functions::). - - The BASE can be between 2 and 36, or can be 0 in which case the - leading characters of the string determine the base, `0x' or `0X' - for hexadecimal, `0' for octal, or decimal otherwise. The leading - characters are examined separately for the numerator and - denominator of a fraction, so for instance `0x10/11' is 16/11, - whereas `0x10/0x11' is 16/17. - - -File: gmp.info, Node: Floating-point Functions, Next: Low-level Functions, Prev: Rational Number Functions, Up: Top - -7 Floating-point Functions -************************** - -GMP floating point numbers are stored in objects of type `mpf_t' and -functions operating on them have an `mpf_' prefix. - - The mantissa of each float has a user-selectable precision, limited -only by available memory. Each variable has its own precision, and -that can be increased or decreased at any time. - - The exponent of each float is a fixed precision, one machine word on -most systems. In the current implementation the exponent is a count of -limbs, so for example on a 32-bit system this means a range of roughly -2^-68719476768 to 2^68719476736, or on a 64-bit system this will be -greater. Note however `mpf_get_str' can only return an exponent which -fits an `mp_exp_t' and currently `mpf_set_str' doesn't accept exponents -bigger than a `long'. - - Each variable keeps a size for the mantissa data actually in use. -This means that if a float is exactly represented in only a few bits -then only those bits will be used in a calculation, even if the -selected precision is high. - - All calculations are performed to the precision of the destination -variable. Each function is defined to calculate with "infinite -precision" followed by a truncation to the destination precision, but -of course the work done is only what's needed to determine a result -under that definition. - - The precision selected for a variable is a minimum value, GMP may -increase it a little to facilitate efficient calculation. Currently -this means rounding up to a whole limb, and then sometimes having a -further partial limb, depending on the high limb of the mantissa. But -applications shouldn't be concerned by such details. - - The mantissa in stored in binary, as might be imagined from the fact -precisions are expressed in bits. One consequence of this is that -decimal fractions like 0.1 cannot be represented exactly. The same is -true of plain IEEE `double' floats. This makes both highly unsuitable -for calculations involving money or other values that should be exact -decimal fractions. (Suitably scaled integers, or perhaps rationals, -are better choices.) - - `mpf' functions and variables have no special notion of infinity or -not-a-number, and applications must take care not to overflow the -exponent or results will be unpredictable. This might change in a -future release. - - Note that the `mpf' functions are _not_ intended as a smooth -extension to IEEE P754 arithmetic. In particular results obtained on -one computer often differ from the results on a computer with a -different word size. - -* Menu: - -* Initializing Floats:: -* Assigning Floats:: -* Simultaneous Float Init & Assign:: -* Converting Floats:: -* Float Arithmetic:: -* Float Comparison:: -* I/O of Floats:: -* Miscellaneous Float Functions:: - - -File: gmp.info, Node: Initializing Floats, Next: Assigning Floats, Prev: Floating-point Functions, Up: Floating-point Functions - -7.1 Initialization Functions -============================ - - -- Function: void mpf_set_default_prec (mp_bitcnt_t PREC) - Set the default precision to be *at least* PREC bits. All - subsequent calls to `mpf_init' will use this precision, but - previously initialized variables are unaffected. - - -- Function: mp_bitcnt_t mpf_get_default_prec (void) - Return the default precision actually used. - - An `mpf_t' object must be initialized before storing the first value -in it. The functions `mpf_init' and `mpf_init2' are used for that -purpose. - - -- Function: void mpf_init (mpf_t X) - Initialize X to 0. Normally, a variable should be initialized - once only or at least be cleared, using `mpf_clear', between - initializations. The precision of X is undefined unless a default - precision has already been established by a call to - `mpf_set_default_prec'. - - -- Function: void mpf_init2 (mpf_t X, mp_bitcnt_t PREC) - Initialize X to 0 and set its precision to be *at least* PREC - bits. Normally, a variable should be initialized once only or at - least be cleared, using `mpf_clear', between initializations. - - -- Function: void mpf_inits (mpf_t X, ...) - Initialize a NULL-terminated list of `mpf_t' variables, and set - their values to 0. The precision of the initialized variables is - undefined unless a default precision has already been established - by a call to `mpf_set_default_prec'. - - -- Function: void mpf_clear (mpf_t X) - Free the space occupied by X. Make sure to call this function for - all `mpf_t' variables when you are done with them. - - -- Function: void mpf_clears (mpf_t X, ...) - Free the space occupied by a NULL-terminated list of `mpf_t' - variables. - - Here is an example on how to initialize floating-point variables: - { - mpf_t x, y; - mpf_init (x); /* use default precision */ - mpf_init2 (y, 256); /* precision _at least_ 256 bits */ - ... - /* Unless the program is about to exit, do ... */ - mpf_clear (x); - mpf_clear (y); - } - - The following three functions are useful for changing the precision -during a calculation. A typical use would be for adjusting the -precision gradually in iterative algorithms like Newton-Raphson, making -the computation precision closely match the actual accurate part of the -numbers. - - -- Function: mp_bitcnt_t mpf_get_prec (mpf_t OP) - Return the current precision of OP, in bits. - - -- Function: void mpf_set_prec (mpf_t ROP, mp_bitcnt_t PREC) - Set the precision of ROP to be *at least* PREC bits. The value in - ROP will be truncated to the new precision. - - This function requires a call to `realloc', and so should not be - used in a tight loop. - - -- Function: void mpf_set_prec_raw (mpf_t ROP, mp_bitcnt_t PREC) - Set the precision of ROP to be *at least* PREC bits, without - changing the memory allocated. - - PREC must be no more than the allocated precision for ROP, that - being the precision when ROP was initialized, or in the most recent - `mpf_set_prec'. - - The value in ROP is unchanged, and in particular if it had a higher - precision than PREC it will retain that higher precision. New - values written to ROP will use the new PREC. - - Before calling `mpf_clear' or the full `mpf_set_prec', another - `mpf_set_prec_raw' call must be made to restore ROP to its original - allocated precision. Failing to do so will have unpredictable - results. - - `mpf_get_prec' can be used before `mpf_set_prec_raw' to get the - original allocated precision. After `mpf_set_prec_raw' it - reflects the PREC value set. - - `mpf_set_prec_raw' is an efficient way to use an `mpf_t' variable - at different precisions during a calculation, perhaps to gradually - increase precision in an iteration, or just to use various - different precisions for different purposes during a calculation. - - -File: gmp.info, Node: Assigning Floats, Next: Simultaneous Float Init & Assign, Prev: Initializing Floats, Up: Floating-point Functions - -7.2 Assignment Functions -======================== - -These functions assign new values to already initialized floats (*note -Initializing Floats::). - - -- Function: void mpf_set (mpf_t ROP, mpf_t OP) - -- Function: void mpf_set_ui (mpf_t ROP, unsigned long int OP) - -- Function: void mpf_set_si (mpf_t ROP, signed long int OP) - -- Function: void mpf_set_d (mpf_t ROP, double OP) - -- Function: void mpf_set_z (mpf_t ROP, mpz_t OP) - -- Function: void mpf_set_q (mpf_t ROP, mpq_t OP) - Set the value of ROP from OP. - - -- Function: int mpf_set_str (mpf_t ROP, char *STR, int BASE) - Set the value of ROP from the string in STR. The string is of the - form `M@N' or, if the base is 10 or less, alternatively `MeN'. - `M' is the mantissa and `N' is the exponent. The mantissa is - always in the specified base. The exponent is either in the - specified base or, if BASE is negative, in decimal. The decimal - point expected is taken from the current locale, on systems - providing `localeconv'. - - The argument BASE may be in the ranges 2 to 62, or -62 to -2. - Negative values are used to specify that the exponent is in - decimal. - - For bases up to 36, case is ignored; upper-case and lower-case - letters have the same value; for bases 37 to 62, upper-case letter - represent the usual 10..35 while lower-case letter represent - 36..61. - - Unlike the corresponding `mpz' function, the base will not be - determined from the leading characters of the string if BASE is 0. - This is so that numbers like `0.23' are not interpreted as octal. - - White space is allowed in the string, and is simply ignored. - [This is not really true; white-space is ignored in the beginning - of the string and within the mantissa, but not in other places, - such as after a minus sign or in the exponent. We are considering - changing the definition of this function, making it fail when - there is any white-space in the input, since that makes a lot of - sense. Please tell us your opinion about this change. Do you - really want it to accept "3 14" as meaning 314 as it does now?] - - This function returns 0 if the entire string is a valid number in - base BASE. Otherwise it returns -1. - - -- Function: void mpf_swap (mpf_t ROP1, mpf_t ROP2) - Swap ROP1 and ROP2 efficiently. Both the values and the - precisions of the two variables are swapped. - - -File: gmp.info, Node: Simultaneous Float Init & Assign, Next: Converting Floats, Prev: Assigning Floats, Up: Floating-point Functions - -7.3 Combined Initialization and Assignment Functions -==================================================== - -For convenience, GMP provides a parallel series of initialize-and-set -functions which initialize the output and then store the value there. -These functions' names have the form `mpf_init_set...' - - Once the float has been initialized by any of the `mpf_init_set...' -functions, it can be used as the source or destination operand for the -ordinary float functions. Don't use an initialize-and-set function on -a variable already initialized! - - -- Function: void mpf_init_set (mpf_t ROP, mpf_t OP) - -- Function: void mpf_init_set_ui (mpf_t ROP, unsigned long int OP) - -- Function: void mpf_init_set_si (mpf_t ROP, signed long int OP) - -- Function: void mpf_init_set_d (mpf_t ROP, double OP) - Initialize ROP and set its value from OP. - - The precision of ROP will be taken from the active default - precision, as set by `mpf_set_default_prec'. - - -- Function: int mpf_init_set_str (mpf_t ROP, char *STR, int BASE) - Initialize ROP and set its value from the string in STR. See - `mpf_set_str' above for details on the assignment operation. - - Note that ROP is initialized even if an error occurs. (I.e., you - have to call `mpf_clear' for it.) - - The precision of ROP will be taken from the active default - precision, as set by `mpf_set_default_prec'. - - -File: gmp.info, Node: Converting Floats, Next: Float Arithmetic, Prev: Simultaneous Float Init & Assign, Up: Floating-point Functions - -7.4 Conversion Functions -======================== - - -- Function: double mpf_get_d (mpf_t OP) - Convert OP to a `double', truncating if necessary (ie. rounding - towards zero). - - If the exponent in OP is too big or too small to fit a `double' - then the result is system dependent. For too big an infinity is - returned when available. For too small 0.0 is normally returned. - Hardware overflow, underflow and denorm traps may or may not occur. - - -- Function: double mpf_get_d_2exp (signed long int *EXP, mpf_t OP) - Convert OP to a `double', truncating if necessary (ie. rounding - towards zero), and with an exponent returned separately. - - The return value is in the range 0.5<=abs(D)<1 and the exponent is - stored to `*EXP'. D * 2^EXP is the (truncated) OP value. If OP - is zero, the return is 0.0 and 0 is stored to `*EXP'. - - This is similar to the standard C `frexp' function (*note - Normalization Functions: (libc)Normalization Functions.). - - -- Function: long mpf_get_si (mpf_t OP) - -- Function: unsigned long mpf_get_ui (mpf_t OP) - Convert OP to a `long' or `unsigned long', truncating any fraction - part. If OP is too big for the return type, the result is - undefined. - - See also `mpf_fits_slong_p' and `mpf_fits_ulong_p' (*note - Miscellaneous Float Functions::). - - -- Function: char * mpf_get_str (char *STR, mp_exp_t *EXPPTR, int - BASE, size_t N_DIGITS, mpf_t OP) - Convert OP to a string of digits in base BASE. The base argument - may vary from 2 to 62 or from -2 to -36. Up to N_DIGITS digits - will be generated. Trailing zeros are not returned. No more - digits than can be accurately represented by OP are ever - generated. If N_DIGITS is 0 then that accurate maximum number of - digits are generated. - - For BASE in the range 2..36, digits and lower-case letters are - used; for -2..-36, digits and upper-case letters are used; for - 37..62, digits, upper-case letters, and lower-case letters (in - that significance order) are used. - - If STR is `NULL', the result string is allocated using the current - allocation function (*note Custom Allocation::). The block will be - `strlen(str)+1' bytes, that being exactly enough for the string and - null-terminator. - - If STR is not `NULL', it should point to a block of N_DIGITS + 2 - bytes, that being enough for the mantissa, a possible minus sign, - and a null-terminator. When N_DIGITS is 0 to get all significant - digits, an application won't be able to know the space required, - and STR should be `NULL' in that case. - - The generated string is a fraction, with an implicit radix point - immediately to the left of the first digit. The applicable - exponent is written through the EXPPTR pointer. For example, the - number 3.1416 would be returned as string "31416" and exponent 1. - - When OP is zero, an empty string is produced and the exponent - returned is 0. - - A pointer to the result string is returned, being either the - allocated block or the given STR. - - -File: gmp.info, Node: Float Arithmetic, Next: Float Comparison, Prev: Converting Floats, Up: Floating-point Functions - -7.5 Arithmetic Functions -======================== - - -- Function: void mpf_add (mpf_t ROP, mpf_t OP1, mpf_t OP2) - -- Function: void mpf_add_ui (mpf_t ROP, mpf_t OP1, unsigned long int - OP2) - Set ROP to OP1 + OP2. - - -- Function: void mpf_sub (mpf_t ROP, mpf_t OP1, mpf_t OP2) - -- Function: void mpf_ui_sub (mpf_t ROP, unsigned long int OP1, mpf_t - OP2) - -- Function: void mpf_sub_ui (mpf_t ROP, mpf_t OP1, unsigned long int - OP2) - Set ROP to OP1 - OP2. - - -- Function: void mpf_mul (mpf_t ROP, mpf_t OP1, mpf_t OP2) - -- Function: void mpf_mul_ui (mpf_t ROP, mpf_t OP1, unsigned long int - OP2) - Set ROP to OP1 times OP2. - - Division is undefined if the divisor is zero, and passing a zero -divisor to the divide functions will make these functions intentionally -divide by zero. This lets the user handle arithmetic exceptions in -these functions in the same manner as other arithmetic exceptions. - - -- Function: void mpf_div (mpf_t ROP, mpf_t OP1, mpf_t OP2) - -- Function: void mpf_ui_div (mpf_t ROP, unsigned long int OP1, mpf_t - OP2) - -- Function: void mpf_div_ui (mpf_t ROP, mpf_t OP1, unsigned long int - OP2) - Set ROP to OP1/OP2. - - -- Function: void mpf_sqrt (mpf_t ROP, mpf_t OP) - -- Function: void mpf_sqrt_ui (mpf_t ROP, unsigned long int OP) - Set ROP to the square root of OP. - - -- Function: void mpf_pow_ui (mpf_t ROP, mpf_t OP1, unsigned long int - OP2) - Set ROP to OP1 raised to the power OP2. - - -- Function: void mpf_neg (mpf_t ROP, mpf_t OP) - Set ROP to -OP. - - -- Function: void mpf_abs (mpf_t ROP, mpf_t OP) - Set ROP to the absolute value of OP. - - -- Function: void mpf_mul_2exp (mpf_t ROP, mpf_t OP1, mp_bitcnt_t OP2) - Set ROP to OP1 times 2 raised to OP2. - - -- Function: void mpf_div_2exp (mpf_t ROP, mpf_t OP1, mp_bitcnt_t OP2) - Set ROP to OP1 divided by 2 raised to OP2. - - -File: gmp.info, Node: Float Comparison, Next: I/O of Floats, Prev: Float Arithmetic, Up: Floating-point Functions - -7.6 Comparison Functions -======================== - - -- Function: int mpf_cmp (mpf_t OP1, mpf_t OP2) - -- Function: int mpf_cmp_d (mpf_t OP1, double OP2) - -- Function: int mpf_cmp_ui (mpf_t OP1, unsigned long int OP2) - -- Function: int mpf_cmp_si (mpf_t OP1, signed long int OP2) - Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero - if OP1 = OP2, and a negative value if OP1 < OP2. - - `mpf_cmp_d' can be called with an infinity, but results are - undefined for a NaN. - - -- Function: int mpf_eq (mpf_t OP1, mpf_t OP2, mp_bitcnt_t op3) - Return non-zero if the first OP3 bits of OP1 and OP2 are equal, - zero otherwise. I.e., test if OP1 and OP2 are approximately equal. - - Caution 1: All version of GMP up to version 4.2.4 compared just - whole limbs, meaning sometimes more than OP3 bits, sometimes fewer. - - Caution 2: This function will consider XXX11...111 and XX100...000 - different, even if ... is replaced by a semi-infinite number of - bits. Such numbers are really just one ulp off, and should be - considered equal. - - -- Function: void mpf_reldiff (mpf_t ROP, mpf_t OP1, mpf_t OP2) - Compute the relative difference between OP1 and OP2 and store the - result in ROP. This is abs(OP1-OP2)/OP1. - - -- Macro: int mpf_sgn (mpf_t OP) - Return +1 if OP > 0, 0 if OP = 0, and -1 if OP < 0. - - This function is actually implemented as a macro. It evaluates - its arguments multiple times. - - -File: gmp.info, Node: I/O of Floats, Next: Miscellaneous Float Functions, Prev: Float Comparison, Up: Floating-point Functions - -7.7 Input and Output Functions -============================== - -Functions that perform input from a stdio stream, and functions that -output to a stdio stream. Passing a `NULL' pointer for a STREAM -argument to any of these functions will make them read from `stdin' and -write to `stdout', respectively. - - When using any of these functions, it is a good idea to include -`stdio.h' before `gmp.h', since that will allow `gmp.h' to define -prototypes for these functions. - - -- Function: size_t mpf_out_str (FILE *STREAM, int BASE, size_t - N_DIGITS, mpf_t OP) - Print OP to STREAM, as a string of digits. Return the number of - bytes written, or if an error occurred, return 0. - - The mantissa is prefixed with an `0.' and is in the given BASE, - which may vary from 2 to 62 or from -2 to -36. An exponent is - then printed, separated by an `e', or if the base is greater than - 10 then by an `@'. The exponent is always in decimal. The - decimal point follows the current locale, on systems providing - `localeconv'. - - For BASE in the range 2..36, digits and lower-case letters are - used; for -2..-36, digits and upper-case letters are used; for - 37..62, digits, upper-case letters, and lower-case letters (in - that significance order) are used. - - Up to N_DIGITS will be printed from the mantissa, except that no - more digits than are accurately representable by OP will be - printed. N_DIGITS can be 0 to select that accurate maximum. - - -- Function: size_t mpf_inp_str (mpf_t ROP, FILE *STREAM, int BASE) - Read a string in base BASE from STREAM, and put the read float in - ROP. The string is of the form `M@N' or, if the base is 10 or - less, alternatively `MeN'. `M' is the mantissa and `N' is the - exponent. The mantissa is always in the specified base. The - exponent is either in the specified base or, if BASE is negative, - in decimal. The decimal point expected is taken from the current - locale, on systems providing `localeconv'. - - The argument BASE may be in the ranges 2 to 36, or -36 to -2. - Negative values are used to specify that the exponent is in - decimal. - - Unlike the corresponding `mpz' function, the base will not be - determined from the leading characters of the string if BASE is 0. - This is so that numbers like `0.23' are not interpreted as octal. - - Return the number of bytes read, or if an error occurred, return 0. - - -File: gmp.info, Node: Miscellaneous Float Functions, Prev: I/O of Floats, Up: Floating-point Functions - -7.8 Miscellaneous Functions -=========================== - - -- Function: void mpf_ceil (mpf_t ROP, mpf_t OP) - -- Function: void mpf_floor (mpf_t ROP, mpf_t OP) - -- Function: void mpf_trunc (mpf_t ROP, mpf_t OP) - Set ROP to OP rounded to an integer. `mpf_ceil' rounds to the - next higher integer, `mpf_floor' to the next lower, and `mpf_trunc' - to the integer towards zero. - - -- Function: int mpf_integer_p (mpf_t OP) - Return non-zero if OP is an integer. - - -- Function: int mpf_fits_ulong_p (mpf_t OP) - -- Function: int mpf_fits_slong_p (mpf_t OP) - -- Function: int mpf_fits_uint_p (mpf_t OP) - -- Function: int mpf_fits_sint_p (mpf_t OP) - -- Function: int mpf_fits_ushort_p (mpf_t OP) - -- Function: int mpf_fits_sshort_p (mpf_t OP) - Return non-zero if OP would fit in the respective C data type, when - truncated to an integer. - - -- Function: void mpf_urandomb (mpf_t ROP, gmp_randstate_t STATE, - mp_bitcnt_t NBITS) - Generate a uniformly distributed random float in ROP, such that 0 - <= ROP < 1, with NBITS significant bits in the mantissa. - - The variable STATE must be initialized by calling one of the - `gmp_randinit' functions (*Note Random State Initialization::) - before invoking this function. - - -- Function: void mpf_random2 (mpf_t ROP, mp_size_t MAX_SIZE, mp_exp_t - EXP) - Generate a random float of at most MAX_SIZE limbs, with long - strings of zeros and ones in the binary representation. The - exponent of the number is in the interval -EXP to EXP (in limbs). - This function is useful for testing functions and algorithms, - since these kind of random numbers have proven to be more likely - to trigger corner-case bugs. Negative random numbers are - generated when MAX_SIZE is negative. - - -File: gmp.info, Node: Low-level Functions, Next: Random Number Functions, Prev: Floating-point Functions, Up: Top - -8 Low-level Functions -********************* - -This chapter describes low-level GMP functions, used to implement the -high-level GMP functions, but also intended for time-critical user code. - - These functions start with the prefix `mpn_'. - - The `mpn' functions are designed to be as fast as possible, *not* to -provide a coherent calling interface. The different functions have -somewhat similar interfaces, but there are variations that make them -hard to use. These functions do as little as possible apart from the -real multiple precision computation, so that no time is spent on things -that not all callers need. - - A source operand is specified by a pointer to the least significant -limb and a limb count. A destination operand is specified by just a -pointer. It is the responsibility of the caller to ensure that the -destination has enough space for storing the result. - - With this way of specifying operands, it is possible to perform -computations on subranges of an argument, and store the result into a -subrange of a destination. - - A common requirement for all functions is that each source area -needs at least one limb. No size argument may be zero. Unless -otherwise stated, in-place operations are allowed where source and -destination are the same, but not where they only partly overlap. - - The `mpn' functions are the base for the implementation of the -`mpz_', `mpf_', and `mpq_' functions. - - This example adds the number beginning at S1P and the number -beginning at S2P and writes the sum at DESTP. All areas have N limbs. - - cy = mpn_add_n (destp, s1p, s2p, n) - - It should be noted that the `mpn' functions make no attempt to -identify high or low zero limbs on their operands, or other special -forms. On random data such cases will be unlikely and it'd be wasteful -for every function to check every time. An application knowing -something about its data can take steps to trim or perhaps split its -calculations. - - -In the notation used below, a source operand is identified by the -pointer to the least significant limb, and the limb count in braces. -For example, {S1P, S1N}. - - -- Function: mp_limb_t mpn_add_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Add {S1P, N} and {S2P, N}, and write the N least significant limbs - of the result to RP. Return carry, either 0 or 1. - - This is the lowest-level function for addition. It is the - preferred function for addition, since it is written in assembly - for most CPUs. For addition of a variable to itself (i.e., S1P - equals S2P) use `mpn_lshift' with a count of 1 for optimal speed. - - -- Function: mp_limb_t mpn_add_1 (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t N, mp_limb_t S2LIMB) - Add {S1P, N} and S2LIMB, and write the N least significant limbs - of the result to RP. Return carry, either 0 or 1. - - -- Function: mp_limb_t mpn_add (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t S1N, const mp_limb_t *S2P, mp_size_t S2N) - Add {S1P, S1N} and {S2P, S2N}, and write the S1N least significant - limbs of the result to RP. Return carry, either 0 or 1. - - This function requires that S1N is greater than or equal to S2N. - - -- Function: mp_limb_t mpn_sub_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Subtract {S2P, N} from {S1P, N}, and write the N least significant - limbs of the result to RP. Return borrow, either 0 or 1. - - This is the lowest-level function for subtraction. It is the - preferred function for subtraction, since it is written in - assembly for most CPUs. - - -- Function: mp_limb_t mpn_sub_1 (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t N, mp_limb_t S2LIMB) - Subtract S2LIMB from {S1P, N}, and write the N least significant - limbs of the result to RP. Return borrow, either 0 or 1. - - -- Function: mp_limb_t mpn_sub (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t S1N, const mp_limb_t *S2P, mp_size_t S2N) - Subtract {S2P, S2N} from {S1P, S1N}, and write the S1N least - significant limbs of the result to RP. Return borrow, either 0 or - 1. - - This function requires that S1N is greater than or equal to S2N. - - -- Function: void mpn_neg (mp_limb_t *RP, const mp_limb_t *SP, - mp_size_t N) - Perform the negation of {SP, N}, and write the result to {RP, N}. - Return carry-out. - - -- Function: void mpn_mul_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Multiply {S1P, N} and {S2P, N}, and write the 2*N-limb result to - RP. - - The destination has to have space for 2*N limbs, even if the - product's most significant limb is zero. No overlap is permitted - between the destination and either source. - - If the two input operands are the same, use `mpn_sqr'. - - -- Function: mp_limb_t mpn_mul (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t S1N, const mp_limb_t *S2P, mp_size_t S2N) - Multiply {S1P, S1N} and {S2P, S2N}, and write the (S1N+S2N)-limb - result to RP. Return the most significant limb of the result. - - The destination has to have space for S1N + S2N limbs, even if the - product's most significant limb is zero. No overlap is permitted - between the destination and either source. - - This function requires that S1N is greater than or equal to S2N. - - -- Function: void mpn_sqr (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t N) - Compute the square of {S1P, N} and write the 2*N-limb result to RP. - - The destination has to have space for 2*N limbs, even if the - result's most significant limb is zero. No overlap is permitted - between the destination and the source. - - -- Function: mp_limb_t mpn_mul_1 (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t N, mp_limb_t S2LIMB) - Multiply {S1P, N} by S2LIMB, and write the N least significant - limbs of the product to RP. Return the most significant limb of - the product. {S1P, N} and {RP, N} are allowed to overlap provided - RP <= S1P. - - This is a low-level function that is a building block for general - multiplication as well as other operations in GMP. It is written - in assembly for most CPUs. - - Don't call this function if S2LIMB is a power of 2; use - `mpn_lshift' with a count equal to the logarithm of S2LIMB - instead, for optimal speed. - - -- Function: mp_limb_t mpn_addmul_1 (mp_limb_t *RP, const mp_limb_t - *S1P, mp_size_t N, mp_limb_t S2LIMB) - Multiply {S1P, N} and S2LIMB, and add the N least significant - limbs of the product to {RP, N} and write the result to RP. - Return the most significant limb of the product, plus carry-out - from the addition. - - This is a low-level function that is a building block for general - multiplication as well as other operations in GMP. It is written - in assembly for most CPUs. - - -- Function: mp_limb_t mpn_submul_1 (mp_limb_t *RP, const mp_limb_t - *S1P, mp_size_t N, mp_limb_t S2LIMB) - Multiply {S1P, N} and S2LIMB, and subtract the N least significant - limbs of the product from {RP, N} and write the result to RP. - Return the most significant limb of the product, plus borrow-out - from the subtraction. - - This is a low-level function that is a building block for general - multiplication and division as well as other operations in GMP. - It is written in assembly for most CPUs. - - -- Function: void mpn_tdiv_qr (mp_limb_t *QP, mp_limb_t *RP, mp_size_t - QXN, const mp_limb_t *NP, mp_size_t NN, const mp_limb_t *DP, - mp_size_t DN) - Divide {NP, NN} by {DP, DN} and put the quotient at {QP, NN-DN+1} - and the remainder at {RP, DN}. The quotient is rounded towards 0. - - No overlap is permitted between arguments, except that NP might - equal RP. The dividend size NN must be greater than or equal to - divisor size DN. The most significant limb of the divisor must be - non-zero. The QXN operand must be zero. - - -- Function: mp_limb_t mpn_divrem (mp_limb_t *R1P, mp_size_t QXN, - mp_limb_t *RS2P, mp_size_t RS2N, const mp_limb_t *S3P, - mp_size_t S3N) - [This function is obsolete. Please call `mpn_tdiv_qr' instead for - best performance.] - - Divide {RS2P, RS2N} by {S3P, S3N}, and write the quotient at R1P, - with the exception of the most significant limb, which is - returned. The remainder replaces the dividend at RS2P; it will be - S3N limbs long (i.e., as many limbs as the divisor). - - In addition to an integer quotient, QXN fraction limbs are - developed, and stored after the integral limbs. For most usages, - QXN will be zero. - - It is required that RS2N is greater than or equal to S3N. It is - required that the most significant bit of the divisor is set. - - If the quotient is not needed, pass RS2P + S3N as R1P. Aside from - that special case, no overlap between arguments is permitted. - - Return the most significant limb of the quotient, either 0 or 1. - - The area at R1P needs to be RS2N - S3N + QXN limbs large. - - -- Function: mp_limb_t mpn_divrem_1 (mp_limb_t *R1P, mp_size_t QXN, - mp_limb_t *S2P, mp_size_t S2N, mp_limb_t S3LIMB) - -- Macro: mp_limb_t mpn_divmod_1 (mp_limb_t *R1P, mp_limb_t *S2P, - mp_size_t S2N, mp_limb_t S3LIMB) - Divide {S2P, S2N} by S3LIMB, and write the quotient at R1P. - Return the remainder. - - The integer quotient is written to {R1P+QXN, S2N} and in addition - QXN fraction limbs are developed and written to {R1P, QXN}. - Either or both S2N and QXN can be zero. For most usages, QXN will - be zero. - - `mpn_divmod_1' exists for upward source compatibility and is - simply a macro calling `mpn_divrem_1' with a QXN of 0. - - The areas at R1P and S2P have to be identical or completely - separate, not partially overlapping. - - -- Function: mp_limb_t mpn_divmod (mp_limb_t *R1P, mp_limb_t *RS2P, - mp_size_t RS2N, const mp_limb_t *S3P, mp_size_t S3N) - [This function is obsolete. Please call `mpn_tdiv_qr' instead for - best performance.] - - -- Macro: mp_limb_t mpn_divexact_by3 (mp_limb_t *RP, mp_limb_t *SP, - mp_size_t N) - -- Function: mp_limb_t mpn_divexact_by3c (mp_limb_t *RP, mp_limb_t - *SP, mp_size_t N, mp_limb_t CARRY) - Divide {SP, N} by 3, expecting it to divide exactly, and writing - the result to {RP, N}. If 3 divides exactly, the return value is - zero and the result is the quotient. If not, the return value is - non-zero and the result won't be anything useful. - - `mpn_divexact_by3c' takes an initial carry parameter, which can be - the return value from a previous call, so a large calculation can - be done piece by piece from low to high. `mpn_divexact_by3' is - simply a macro calling `mpn_divexact_by3c' with a 0 carry - parameter. - - These routines use a multiply-by-inverse and will be faster than - `mpn_divrem_1' on CPUs with fast multiplication but slow division. - - The source a, result q, size n, initial carry i, and return value - c satisfy c*b^n + a-i = 3*q, where b=2^GMP_NUMB_BITS. The return - c is always 0, 1 or 2, and the initial carry i must also be 0, 1 - or 2 (these are both borrows really). When c=0 clearly q=(a-i)/3. - When c!=0, the remainder (a-i) mod 3 is given by 3-c, because b - == 1 mod 3 (when `mp_bits_per_limb' is even, which is always so - currently). - - -- Function: mp_limb_t mpn_mod_1 (mp_limb_t *S1P, mp_size_t S1N, - mp_limb_t S2LIMB) - Divide {S1P, S1N} by S2LIMB, and return the remainder. S1N can be - zero. - - -- Function: mp_limb_t mpn_lshift (mp_limb_t *RP, const mp_limb_t *SP, - mp_size_t N, unsigned int COUNT) - Shift {SP, N} left by COUNT bits, and write the result to {RP, N}. - The bits shifted out at the left are returned in the least - significant COUNT bits of the return value (the rest of the return - value is zero). - - COUNT must be in the range 1 to mp_bits_per_limb-1. The regions - {SP, N} and {RP, N} may overlap, provided RP >= SP. - - This function is written in assembly for most CPUs. - - -- Function: mp_limb_t mpn_rshift (mp_limb_t *RP, const mp_limb_t *SP, - mp_size_t N, unsigned int COUNT) - Shift {SP, N} right by COUNT bits, and write the result to {RP, - N}. The bits shifted out at the right are returned in the most - significant COUNT bits of the return value (the rest of the return - value is zero). - - COUNT must be in the range 1 to mp_bits_per_limb-1. The regions - {SP, N} and {RP, N} may overlap, provided RP <= SP. - - This function is written in assembly for most CPUs. - - -- Function: int mpn_cmp (const mp_limb_t *S1P, const mp_limb_t *S2P, - mp_size_t N) - Compare {S1P, N} and {S2P, N} and return a positive value if S1 > - S2, 0 if they are equal, or a negative value if S1 < S2. - - -- Function: mp_size_t mpn_gcd (mp_limb_t *RP, mp_limb_t *XP, - mp_size_t XN, mp_limb_t *YP, mp_size_t YN) - Set {RP, RETVAL} to the greatest common divisor of {XP, XN} and - {YP, YN}. The result can be up to YN limbs, the return value is - the actual number produced. Both source operands are destroyed. - - {XP, XN} must have at least as many bits as {YP, YN}. {YP, YN} - must be odd. Both operands must have non-zero most significant - limbs. No overlap is permitted between {XP, XN} and {YP, YN}. - - -- Function: mp_limb_t mpn_gcd_1 (const mp_limb_t *XP, mp_size_t XN, - mp_limb_t YLIMB) - Return the greatest common divisor of {XP, XN} and YLIMB. Both - operands must be non-zero. - - -- Function: mp_size_t mpn_gcdext (mp_limb_t *GP, mp_limb_t *SP, - mp_size_t *SN, mp_limb_t *XP, mp_size_t XN, mp_limb_t *YP, - mp_size_t YN) - Let U be defined by {XP, XN} and let V be defined by {YP, YN}. - - Compute the greatest common divisor G of U and V. Compute a - cofactor S such that G = US + VT. The second cofactor T is not - computed but can easily be obtained from (G - U*S) / V (the - division will be exact). It is required that U >= V > 0. - - S satisfies S = 1 or abs(S) < V / (2 G). S = 0 if and only if V - divides U (i.e., G = V). - - Store G at GP and let the return value define its limb count. - Store S at SP and let |*SN| define its limb count. S can be - negative; when this happens *SN will be negative. The areas at GP - and SP should each have room for XN+1 limbs. - - The areas {XP, XN+1} and {YP, YN+1} are destroyed (i.e. the input - operands plus an extra limb past the end of each). - - Compatibility note: GMP 4.3.0 and 4.3.1 defined S less strictly. - Earlier as well as later GMP releases define S as described here. - - -- Function: mp_size_t mpn_sqrtrem (mp_limb_t *R1P, mp_limb_t *R2P, - const mp_limb_t *SP, mp_size_t N) - Compute the square root of {SP, N} and put the result at {R1P, - ceil(N/2)} and the remainder at {R2P, RETVAL}. R2P needs space - for N limbs, but the return value indicates how many are produced. - - The most significant limb of {SP, N} must be non-zero. The areas - {R1P, ceil(N/2)} and {SP, N} must be completely separate. The - areas {R2P, N} and {SP, N} must be either identical or completely - separate. - - If the remainder is not wanted then R2P can be `NULL', and in this - case the return value is zero or non-zero according to whether the - remainder would have been zero or non-zero. - - A return value of zero indicates a perfect square. See also - `mpz_perfect_square_p'. - - -- Function: mp_size_t mpn_get_str (unsigned char *STR, int BASE, - mp_limb_t *S1P, mp_size_t S1N) - Convert {S1P, S1N} to a raw unsigned char array at STR in base - BASE, and return the number of characters produced. There may be - leading zeros in the string. The string is not in ASCII; to - convert it to printable format, add the ASCII codes for `0' or - `A', depending on the base and range. BASE can vary from 2 to 256. - - The most significant limb of the input {S1P, S1N} must be - non-zero. The input {S1P, S1N} is clobbered, except when BASE is - a power of 2, in which case it's unchanged. - - The area at STR has to have space for the largest possible number - represented by a S1N long limb array, plus one extra character. - - -- Function: mp_size_t mpn_set_str (mp_limb_t *RP, const unsigned char - *STR, size_t STRSIZE, int BASE) - Convert bytes {STR,STRSIZE} in the given BASE to limbs at RP. - - STR[0] is the most significant byte and STR[STRSIZE-1] is the - least significant. Each byte should be a value in the range 0 to - BASE-1, not an ASCII character. BASE can vary from 2 to 256. - - The return value is the number of limbs written to RP. If the most - significant input byte is non-zero then the high limb at RP will be - non-zero, and only that exact number of limbs will be required - there. - - If the most significant input byte is zero then there may be high - zero limbs written to RP and included in the return value. - - STRSIZE must be at least 1, and no overlap is permitted between - {STR,STRSIZE} and the result at RP. - - -- Function: mp_bitcnt_t mpn_scan0 (const mp_limb_t *S1P, mp_bitcnt_t - BIT) - Scan S1P from bit position BIT for the next clear bit. - - It is required that there be a clear bit within the area at S1P at - or beyond bit position BIT, so that the function has something to - return. - - -- Function: mp_bitcnt_t mpn_scan1 (const mp_limb_t *S1P, mp_bitcnt_t - BIT) - Scan S1P from bit position BIT for the next set bit. - - It is required that there be a set bit within the area at S1P at or - beyond bit position BIT, so that the function has something to - return. - - -- Function: void mpn_random (mp_limb_t *R1P, mp_size_t R1N) - -- Function: void mpn_random2 (mp_limb_t *R1P, mp_size_t R1N) - Generate a random number of length R1N and store it at R1P. The - most significant limb is always non-zero. `mpn_random' generates - uniformly distributed limb data, `mpn_random2' generates long - strings of zeros and ones in the binary representation. - - `mpn_random2' is intended for testing the correctness of the `mpn' - routines. - - -- Function: mp_bitcnt_t mpn_popcount (const mp_limb_t *S1P, mp_size_t - N) - Count the number of set bits in {S1P, N}. - - -- Function: mp_bitcnt_t mpn_hamdist (const mp_limb_t *S1P, const - mp_limb_t *S2P, mp_size_t N) - Compute the hamming distance between {S1P, N} and {S2P, N}, which - is the number of bit positions where the two operands have - different bit values. - - -- Function: int mpn_perfect_square_p (const mp_limb_t *S1P, mp_size_t - N) - Return non-zero iff {S1P, N} is a perfect square. - - -- Function: void mpn_and_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical and of {S1P, N} and {S2P, N}, and - write the result to {RP, N}. - - -- Function: void mpn_ior_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical inclusive or of {S1P, N} and {S2P, N}, - and write the result to {RP, N}. - - -- Function: void mpn_xor_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical exclusive or of {S1P, N} and {S2P, N}, - and write the result to {RP, N}. - - -- Function: void mpn_andn_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical and of {S1P, N} and the bitwise - complement of {S2P, N}, and write the result to {RP, N}. - - -- Function: void mpn_iorn_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical inclusive or of {S1P, N} and the - bitwise complement of {S2P, N}, and write the result to {RP, N}. - - -- Function: void mpn_nand_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical and of {S1P, N} and {S2P, N}, and - write the bitwise complement of the result to {RP, N}. - - -- Function: void mpn_nior_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical inclusive or of {S1P, N} and {S2P, N}, - and write the bitwise complement of the result to {RP, N}. - - -- Function: void mpn_xnor_n (mp_limb_t *RP, const mp_limb_t *S1P, - const mp_limb_t *S2P, mp_size_t N) - Perform the bitwise logical exclusive or of {S1P, N} and {S2P, N}, - and write the bitwise complement of the result to {RP, N}. - - -- Function: void mpn_com (mp_limb_t *RP, const mp_limb_t *SP, - mp_size_t N) - Perform the bitwise complement of {SP, N}, and write the result to - {RP, N}. - - -- Function: void mpn_copyi (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t N) - Copy from {S1P, N} to {RP, N}, increasingly. - - -- Function: void mpn_copyd (mp_limb_t *RP, const mp_limb_t *S1P, - mp_size_t N) - Copy from {S1P, N} to {RP, N}, decreasingly. - - -- Function: void mpn_zero (mp_limb_t *RP, mp_size_t N) - Zero {RP, N}. - - -8.1 Nails -========= - -*Everything in this section is highly experimental and may disappear or -be subject to incompatible changes in a future version of GMP.* - - Nails are an experimental feature whereby a few bits are left unused -at the top of each `mp_limb_t'. This can significantly improve carry -handling on some processors. - - All the `mpn' functions accepting limb data will expect the nail -bits to be zero on entry, and will return data with the nails similarly -all zero. This applies both to limb vectors and to single limb -arguments. - - Nails can be enabled by configuring with `--enable-nails'. By -default the number of bits will be chosen according to what suits the -host processor, but a particular number can be selected with -`--enable-nails=N'. - - At the mpn level, a nail build is neither source nor binary -compatible with a non-nail build, strictly speaking. But programs -acting on limbs only through the mpn functions are likely to work -equally well with either build, and judicious use of the definitions -below should make any program compatible with either build, at the -source level. - - For the higher level routines, meaning `mpz' etc, a nail build -should be fully source and binary compatible with a non-nail build. - - -- Macro: GMP_NAIL_BITS - -- Macro: GMP_NUMB_BITS - -- Macro: GMP_LIMB_BITS - `GMP_NAIL_BITS' is the number of nail bits, or 0 when nails are - not in use. `GMP_NUMB_BITS' is the number of data bits in a limb. - `GMP_LIMB_BITS' is the total number of bits in an `mp_limb_t'. In - all cases - - GMP_LIMB_BITS == GMP_NAIL_BITS + GMP_NUMB_BITS - - -- Macro: GMP_NAIL_MASK - -- Macro: GMP_NUMB_MASK - Bit masks for the nail and number parts of a limb. - `GMP_NAIL_MASK' is 0 when nails are not in use. - - `GMP_NAIL_MASK' is not often needed, since the nail part can be - obtained with `x >> GMP_NUMB_BITS', and that means one less large - constant, which can help various RISC chips. - - -- Macro: GMP_NUMB_MAX - The maximum value that can be stored in the number part of a limb. - This is the same as `GMP_NUMB_MASK', but can be used for clarity - when doing comparisons rather than bit-wise operations. - - The term "nails" comes from finger or toe nails, which are at the -ends of a limb (arm or leg). "numb" is short for number, but is also -how the developers felt after trying for a long time to come up with -sensible names for these things. - - In the future (the distant future most likely) a non-zero nail might -be permitted, giving non-unique representations for numbers in a limb -vector. This would help vector processors since carries would only -ever need to propagate one or two limbs. - - -File: gmp.info, Node: Random Number Functions, Next: Formatted Output, Prev: Low-level Functions, Up: Top - -9 Random Number Functions -************************* - -Sequences of pseudo-random numbers in GMP are generated using a -variable of type `gmp_randstate_t', which holds an algorithm selection -and a current state. Such a variable must be initialized by a call to -one of the `gmp_randinit' functions, and can be seeded with one of the -`gmp_randseed' functions. - - The functions actually generating random numbers are described in -*Note Integer Random Numbers::, and *Note Miscellaneous Float -Functions::. - - The older style random number functions don't accept a -`gmp_randstate_t' parameter but instead share a global variable of that -type. They use a default algorithm and are currently not seeded -(though perhaps that will change in the future). The new functions -accepting a `gmp_randstate_t' are recommended for applications that -care about randomness. - -* Menu: - -* Random State Initialization:: -* Random State Seeding:: -* Random State Miscellaneous:: - - -File: gmp.info, Node: Random State Initialization, Next: Random State Seeding, Prev: Random Number Functions, Up: Random Number Functions - -9.1 Random State Initialization -=============================== - - -- Function: void gmp_randinit_default (gmp_randstate_t STATE) - Initialize STATE with a default algorithm. This will be a - compromise between speed and randomness, and is recommended for - applications with no special requirements. Currently this is - `gmp_randinit_mt'. - - -- Function: void gmp_randinit_mt (gmp_randstate_t STATE) - Initialize STATE for a Mersenne Twister algorithm. This algorithm - is fast and has good randomness properties. - - -- Function: void gmp_randinit_lc_2exp (gmp_randstate_t STATE, mpz_t - A, unsigned long C, mp_bitcnt_t M2EXP) - Initialize STATE with a linear congruential algorithm X = (A*X + - C) mod 2^M2EXP. - - The low bits of X in this algorithm are not very random. The least - significant bit will have a period no more than 2, and the second - bit no more than 4, etc. For this reason only the high half of - each X is actually used. - - When a random number of more than M2EXP/2 bits is to be generated, - multiple iterations of the recurrence are used and the results - concatenated. - - -- Function: int gmp_randinit_lc_2exp_size (gmp_randstate_t STATE, - mp_bitcnt_t SIZE) - Initialize STATE for a linear congruential algorithm as per - `gmp_randinit_lc_2exp'. A, C and M2EXP are selected from a table, - chosen so that SIZE bits (or more) of each X will be used, ie. - M2EXP/2 >= SIZE. - - If successful the return value is non-zero. If SIZE is bigger - than the table data provides then the return value is zero. The - maximum SIZE currently supported is 128. - - -- Function: void gmp_randinit_set (gmp_randstate_t ROP, - gmp_randstate_t OP) - Initialize ROP with a copy of the algorithm and state from OP. - - -- Function: void gmp_randinit (gmp_randstate_t STATE, - gmp_randalg_t ALG, ...) - *This function is obsolete.* - - Initialize STATE with an algorithm selected by ALG. The only - choice is `GMP_RAND_ALG_LC', which is `gmp_randinit_lc_2exp_size' - described above. A third parameter of type `unsigned long' is - required, this is the SIZE for that function. - `GMP_RAND_ALG_DEFAULT' or 0 are the same as `GMP_RAND_ALG_LC'. - - `gmp_randinit' sets bits in the global variable `gmp_errno' to - indicate an error. `GMP_ERROR_UNSUPPORTED_ARGUMENT' if ALG is - unsupported, or `GMP_ERROR_INVALID_ARGUMENT' if the SIZE parameter - is too big. It may be noted this error reporting is not thread - safe (a good reason to use `gmp_randinit_lc_2exp_size' instead). - - -- Function: void gmp_randclear (gmp_randstate_t STATE) - Free all memory occupied by STATE. - - -File: gmp.info, Node: Random State Seeding, Next: Random State Miscellaneous, Prev: Random State Initialization, Up: Random Number Functions - -9.2 Random State Seeding -======================== - - -- Function: void gmp_randseed (gmp_randstate_t STATE, mpz_t SEED) - -- Function: void gmp_randseed_ui (gmp_randstate_t STATE, - unsigned long int SEED) - Set an initial seed value into STATE. - - The size of a seed determines how many different sequences of - random numbers that it's possible to generate. The "quality" of - the seed is the randomness of a given seed compared to the - previous seed used, and this affects the randomness of separate - number sequences. The method for choosing a seed is critical if - the generated numbers are to be used for important applications, - such as generating cryptographic keys. - - Traditionally the system time has been used to seed, but care - needs to be taken with this. If an application seeds often and - the resolution of the system clock is low, then the same sequence - of numbers might be repeated. Also, the system time is quite easy - to guess, so if unpredictability is required then it should - definitely not be the only source for the seed value. On some - systems there's a special device `/dev/random' which provides - random data better suited for use as a seed. - - -File: gmp.info, Node: Random State Miscellaneous, Prev: Random State Seeding, Up: Random Number Functions - -9.3 Random State Miscellaneous -============================== - - -- Function: unsigned long gmp_urandomb_ui (gmp_randstate_t STATE, - unsigned long N) - Return a uniformly distributed random number of N bits, ie. in the - range 0 to 2^N-1 inclusive. N must be less than or equal to the - number of bits in an `unsigned long'. - - -- Function: unsigned long gmp_urandomm_ui (gmp_randstate_t STATE, - unsigned long N) - Return a uniformly distributed random number in the range 0 to - N-1, inclusive. - - -File: gmp.info, Node: Formatted Output, Next: Formatted Input, Prev: Random Number Functions, Up: Top - -10 Formatted Output -******************* - -* Menu: - -* Formatted Output Strings:: -* Formatted Output Functions:: -* C++ Formatted Output:: - - -File: gmp.info, Node: Formatted Output Strings, Next: Formatted Output Functions, Prev: Formatted Output, Up: Formatted Output - -10.1 Format Strings -=================== - -`gmp_printf' and friends accept format strings similar to the standard C -`printf' (*note Formatted Output: (libc)Formatted Output.). A format -specification is of the form - - % [flags] [width] [.[precision]] [type] conv - - GMP adds types `Z', `Q' and `F' for `mpz_t', `mpq_t' and `mpf_t' -respectively, `M' for `mp_limb_t', and `N' for an `mp_limb_t' array. -`Z', `Q', `M' and `N' behave like integers. `Q' will print a `/' and a -denominator, if needed. `F' behaves like a float. For example, - - mpz_t z; - gmp_printf ("%s is an mpz %Zd\n", "here", z); - - mpq_t q; - gmp_printf ("a hex rational: %#40Qx\n", q); - - mpf_t f; - int n; - gmp_printf ("fixed point mpf %.*Ff with %d digits\n", n, f, n); - - mp_limb_t l; - gmp_printf ("limb %Mu\n", l); - - const mp_limb_t *ptr; - mp_size_t size; - gmp_printf ("limb array %Nx\n", ptr, size); - - For `N' the limbs are expected least significant first, as per the -`mpn' functions (*note Low-level Functions::). A negative size can be -given to print the value as a negative. - - All the standard C `printf' types behave the same as the C library -`printf', and can be freely intermixed with the GMP extensions. In the -current implementation the standard parts of the format string are -simply handed to `printf' and only the GMP extensions handled directly. - - The flags accepted are as follows. GLIBC style ' is only for the -standard C types (not the GMP types), and only if the C library -supports it. - - 0 pad with zeros (rather than spaces) - # show the base with `0x', `0X' or `0' - + always show a sign - (space) show a space or a `-' sign - ' group digits, GLIBC style (not GMP types) - - The optional width and precision can be given as a number within the -format string, or as a `*' to take an extra parameter of type `int', the -same as the standard `printf'. - - The standard types accepted are as follows. `h' and `l' are -portable, the rest will depend on the compiler (or include files) for -the type and the C library for the output. - - h short - hh char - j intmax_t or uintmax_t - l long or wchar_t - ll long long - L long double - q quad_t or u_quad_t - t ptrdiff_t - z size_t - -The GMP types are - - F mpf_t, float conversions - Q mpq_t, integer conversions - M mp_limb_t, integer conversions - N mp_limb_t array, integer conversions - Z mpz_t, integer conversions - - The conversions accepted are as follows. `a' and `A' are always -supported for `mpf_t' but depend on the C library for standard C float -types. `m' and `p' depend on the C library. - - a A hex floats, C99 style - c character - d decimal integer - e E scientific format float - f fixed point float - i same as d - g G fixed or scientific float - m `strerror' string, GLIBC style - n store characters written so far - o octal integer - p pointer - s string - u unsigned integer - x X hex integer - - `o', `x' and `X' are unsigned for the standard C types, but for -types `Z', `Q' and `N' they are signed. `u' is not meaningful for `Z', -`Q' and `N'. - - `M' is a proxy for the C library `l' or `L', according to the size -of `mp_limb_t'. Unsigned conversions will be usual, but a signed -conversion can be used and will interpret the value as a twos complement -negative. - - `n' can be used with any type, even the GMP types. - - Other types or conversions that might be accepted by the C library -`printf' cannot be used through `gmp_printf', this includes for -instance extensions registered with GLIBC `register_printf_function'. -Also currently there's no support for POSIX `$' style numbered arguments -(perhaps this will be added in the future). - - The precision field has it's usual meaning for integer `Z' and float -`F' types, but is currently undefined for `Q' and should not be used -with that. - - `mpf_t' conversions only ever generate as many digits as can be -accurately represented by the operand, the same as `mpf_get_str' does. -Zeros will be used if necessary to pad to the requested precision. This -happens even for an `f' conversion of an `mpf_t' which is an integer, -for instance 2^1024 in an `mpf_t' of 128 bits precision will only -produce about 40 digits, then pad with zeros to the decimal point. An -empty precision field like `%.Fe' or `%.Ff' can be used to specifically -request just the significant digits. - - The decimal point character (or string) is taken from the current -locale settings on systems which provide `localeconv' (*note Locales -and Internationalization: (libc)Locales.). The C library will normally -do the same for standard float output. - - The format string is only interpreted as plain `char's, multibyte -characters are not recognised. Perhaps this will change in the future. - - -File: gmp.info, Node: Formatted Output Functions, Next: C++ Formatted Output, Prev: Formatted Output Strings, Up: Formatted Output - -10.2 Functions -============== - -Each of the following functions is similar to the corresponding C -library function. The basic `printf' forms take a variable argument -list. The `vprintf' forms take an argument pointer, see *Note Variadic -Functions: (libc)Variadic Functions, or `man 3 va_start'. - - It should be emphasised that if a format string is invalid, or the -arguments don't match what the format specifies, then the behaviour of -any of these functions will be unpredictable. GCC format string -checking is not available, since it doesn't recognise the GMP -extensions. - - The file based functions `gmp_printf' and `gmp_fprintf' will return --1 to indicate a write error. Output is not "atomic", so partial -output may be produced if a write error occurs. All the functions can -return -1 if the C library `printf' variant in use returns -1, but this -shouldn't normally occur. - - -- Function: int gmp_printf (const char *FMT, ...) - -- Function: int gmp_vprintf (const char *FMT, va_list AP) - Print to the standard output `stdout'. Return the number of - characters written, or -1 if an error occurred. - - -- Function: int gmp_fprintf (FILE *FP, const char *FMT, ...) - -- Function: int gmp_vfprintf (FILE *FP, const char *FMT, va_list AP) - Print to the stream FP. Return the number of characters written, - or -1 if an error occurred. - - -- Function: int gmp_sprintf (char *BUF, const char *FMT, ...) - -- Function: int gmp_vsprintf (char *BUF, const char *FMT, va_list AP) - Form a null-terminated string in BUF. Return the number of - characters written, excluding the terminating null. - - No overlap is permitted between the space at BUF and the string - FMT. - - These functions are not recommended, since there's no protection - against exceeding the space available at BUF. - - -- Function: int gmp_snprintf (char *BUF, size_t SIZE, const char - *FMT, ...) - -- Function: int gmp_vsnprintf (char *BUF, size_t SIZE, const char - *FMT, va_list AP) - Form a null-terminated string in BUF. No more than SIZE bytes - will be written. To get the full output, SIZE must be enough for - the string and null-terminator. - - The return value is the total number of characters which ought to - have been produced, excluding the terminating null. If RETVAL >= - SIZE then the actual output has been truncated to the first SIZE-1 - characters, and a null appended. - - No overlap is permitted between the region {BUF,SIZE} and the FMT - string. - - Notice the return value is in ISO C99 `snprintf' style. This is - so even if the C library `vsnprintf' is the older GLIBC 2.0.x - style. - - -- Function: int gmp_asprintf (char **PP, const char *FMT, ...) - -- Function: int gmp_vasprintf (char **PP, const char *FMT, va_list AP) - Form a null-terminated string in a block of memory obtained from - the current memory allocation function (*note Custom - Allocation::). The block will be the size of the string and - null-terminator. The address of the block in stored to *PP. The - return value is the number of characters produced, excluding the - null-terminator. - - Unlike the C library `asprintf', `gmp_asprintf' doesn't return -1 - if there's no more memory available, it lets the current allocation - function handle that. - - -- Function: int gmp_obstack_printf (struct obstack *OB, const char - *FMT, ...) - -- Function: int gmp_obstack_vprintf (struct obstack *OB, const char - *FMT, va_list AP) - Append to the current object in OB. The return value is the - number of characters written. A null-terminator is not written. - - FMT cannot be within the current object in OB, since that object - might move as it grows. - - These functions are available only when the C library provides the - obstack feature, which probably means only on GNU systems, see - *Note Obstacks: (libc)Obstacks. - - -File: gmp.info, Node: C++ Formatted Output, Prev: Formatted Output Functions, Up: Formatted Output - -10.3 C++ Formatted Output -========================= - -The following functions are provided in `libgmpxx' (*note Headers and -Libraries::), which is built if C++ support is enabled (*note Build -Options::). Prototypes are available from `'. - - -- Function: ostream& operator<< (ostream& STREAM, mpz_t OP) - Print OP to STREAM, using its `ios' formatting settings. - `ios::width' is reset to 0 after output, the same as the standard - `ostream operator<<' routines do. - - In hex or octal, OP is printed as a signed number, the same as for - decimal. This is unlike the standard `operator<<' routines on - `int' etc, which instead give twos complement. - - -- Function: ostream& operator<< (ostream& STREAM, mpq_t OP) - Print OP to STREAM, using its `ios' formatting settings. - `ios::width' is reset to 0 after output, the same as the standard - `ostream operator<<' routines do. - - Output will be a fraction like `5/9', or if the denominator is 1 - then just a plain integer like `123'. - - In hex or octal, OP is printed as a signed value, the same as for - decimal. If `ios::showbase' is set then a base indicator is shown - on both the numerator and denominator (if the denominator is - required). - - -- Function: ostream& operator<< (ostream& STREAM, mpf_t OP) - Print OP to STREAM, using its `ios' formatting settings. - `ios::width' is reset to 0 after output, the same as the standard - `ostream operator<<' routines do. - - The decimal point follows the standard library float `operator<<', - which on recent systems means the `std::locale' imbued on STREAM. - - Hex and octal are supported, unlike the standard `operator<<' on - `double'. The mantissa will be in hex or octal, the exponent will - be in decimal. For hex the exponent delimiter is an `@'. This is - as per `mpf_out_str'. - - `ios::showbase' is supported, and will put a base on the mantissa, - for example hex `0x1.8' or `0x0.8', or octal `01.4' or `00.4'. - This last form is slightly strange, but at least differentiates - itself from decimal. - - These operators mean that GMP types can be printed in the usual C++ -way, for example, - - mpz_t z; - int n; - ... - cout << "iteration " << n << " value " << z << "\n"; - - But note that `ostream' output (and `istream' input, *note C++ -Formatted Input::) is the only overloading available for the GMP types -and that for instance using `+' with an `mpz_t' will have unpredictable -results. For classes with overloading, see *Note C++ Class Interface::. - - -File: gmp.info, Node: Formatted Input, Next: C++ Class Interface, Prev: Formatted Output, Up: Top - -11 Formatted Input -****************** - -* Menu: - -* Formatted Input Strings:: -* Formatted Input Functions:: -* C++ Formatted Input:: - - -File: gmp.info, Node: Formatted Input Strings, Next: Formatted Input Functions, Prev: Formatted Input, Up: Formatted Input - -11.1 Formatted Input Strings -============================ - -`gmp_scanf' and friends accept format strings similar to the standard C -`scanf' (*note Formatted Input: (libc)Formatted Input.). A format -specification is of the form - - % [flags] [width] [type] conv - - GMP adds types `Z', `Q' and `F' for `mpz_t', `mpq_t' and `mpf_t' -respectively. `Z' and `Q' behave like integers. `Q' will read a `/' -and a denominator, if present. `F' behaves like a float. - - GMP variables don't require an `&' when passed to `gmp_scanf', since -they're already "call-by-reference". For example, - - /* to read say "a(5) = 1234" */ - int n; - mpz_t z; - gmp_scanf ("a(%d) = %Zd\n", &n, z); - - mpq_t q1, q2; - gmp_sscanf ("0377 + 0x10/0x11", "%Qi + %Qi", q1, q2); - - /* to read say "topleft (1.55,-2.66)" */ - mpf_t x, y; - char buf[32]; - gmp_scanf ("%31s (%Ff,%Ff)", buf, x, y); - - All the standard C `scanf' types behave the same as in the C library -`scanf', and can be freely intermixed with the GMP extensions. In the -current implementation the standard parts of the format string are -simply handed to `scanf' and only the GMP extensions handled directly. - - The flags accepted are as follows. `a' and `'' will depend on -support from the C library, and `'' cannot be used with GMP types. - - * read but don't store - a allocate a buffer (string conversions) - ' grouped digits, GLIBC style (not GMP - types) - - The standard types accepted are as follows. `h' and `l' are -portable, the rest will depend on the compiler (or include files) for -the type and the C library for the input. - - h short - hh char - j intmax_t or uintmax_t - l long int, double or wchar_t - ll long long - L long double - q quad_t or u_quad_t - t ptrdiff_t - z size_t - -The GMP types are - - F mpf_t, float conversions - Q mpq_t, integer conversions - Z mpz_t, integer conversions - - The conversions accepted are as follows. `p' and `[' will depend on -support from the C library, the rest are standard. - - c character or characters - d decimal integer - e E f g G float - i integer with base indicator - n characters read so far - o octal integer - p pointer - s string of non-whitespace characters - u decimal integer - x X hex integer - [ string of characters in a set - - `e', `E', `f', `g' and `G' are identical, they all read either fixed -point or scientific format, and either upper or lower case `e' for the -exponent in scientific format. - - C99 style hex float format (`printf %a', *note Formatted Output -Strings::) is always accepted for `mpf_t', but for the standard float -types it will depend on the C library. - - `x' and `X' are identical, both accept both upper and lower case -hexadecimal. - - `o', `u', `x' and `X' all read positive or negative values. For the -standard C types these are described as "unsigned" conversions, but -that merely affects certain overflow handling, negatives are still -allowed (per `strtoul', *note Parsing of Integers: (libc)Parsing of -Integers.). For GMP types there are no overflows, so `d' and `u' are -identical. - - `Q' type reads the numerator and (optional) denominator as given. -If the value might not be in canonical form then `mpq_canonicalize' -must be called before using it in any calculations (*note Rational -Number Functions::). - - `Qi' will read a base specification separately for the numerator and -denominator. For example `0x10/11' would be 16/11, whereas `0x10/0x11' -would be 16/17. - - `n' can be used with any of the types above, even the GMP types. -`*' to suppress assignment is allowed, though in that case it would do -nothing at all. - - Other conversions or types that might be accepted by the C library -`scanf' cannot be used through `gmp_scanf'. - - Whitespace is read and discarded before a field, except for `c' and -`[' conversions. - - For float conversions, the decimal point character (or string) -expected is taken from the current locale settings on systems which -provide `localeconv' (*note Locales and Internationalization: -(libc)Locales.). The C library will normally do the same for standard -float input. - - The format string is only interpreted as plain `char's, multibyte -characters are not recognised. Perhaps this will change in the future. - - -File: gmp.info, Node: Formatted Input Functions, Next: C++ Formatted Input, Prev: Formatted Input Strings, Up: Formatted Input - -11.2 Formatted Input Functions -============================== - -Each of the following functions is similar to the corresponding C -library function. The plain `scanf' forms take a variable argument -list. The `vscanf' forms take an argument pointer, see *Note Variadic -Functions: (libc)Variadic Functions, or `man 3 va_start'. - - It should be emphasised that if a format string is invalid, or the -arguments don't match what the format specifies, then the behaviour of -any of these functions will be unpredictable. GCC format string -checking is not available, since it doesn't recognise the GMP -extensions. - - No overlap is permitted between the FMT string and any of the results -produced. - - -- Function: int gmp_scanf (const char *FMT, ...) - -- Function: int gmp_vscanf (const char *FMT, va_list AP) - Read from the standard input `stdin'. - - -- Function: int gmp_fscanf (FILE *FP, const char *FMT, ...) - -- Function: int gmp_vfscanf (FILE *FP, const char *FMT, va_list AP) - Read from the stream FP. - - -- Function: int gmp_sscanf (const char *S, const char *FMT, ...) - -- Function: int gmp_vsscanf (const char *S, const char *FMT, va_list - AP) - Read from a null-terminated string S. - - The return value from each of these functions is the same as the -standard C99 `scanf', namely the number of fields successfully parsed -and stored. `%n' fields and fields read but suppressed by `*' don't -count towards the return value. - - If end of input (or a file error) is reached before a character for -a field or a literal, and if no previous non-suppressed fields have -matched, then the return value is `EOF' instead of 0. A whitespace -character in the format string is only an optional match and doesn't -induce an `EOF' in this fashion. Leading whitespace read and discarded -for a field don't count as characters for that field. - - For the GMP types, input parsing follows C99 rules, namely one -character of lookahead is used and characters are read while they -continue to meet the format requirements. If this doesn't provide a -complete number then the function terminates, with that field not -stored nor counted towards the return value. For instance with `mpf_t' -an input `1.23e-XYZ' would be read up to the `X' and that character -pushed back since it's not a digit. The string `1.23e-' would then be -considered invalid since an `e' must be followed by at least one digit. - - For the standard C types, in the current implementation GMP calls -the C library `scanf' functions, which might have looser rules about -what constitutes a valid input. - - Note that `gmp_sscanf' is the same as `gmp_fscanf' and only does one -character of lookahead when parsing. Although clearly it could look at -its entire input, it is deliberately made identical to `gmp_fscanf', -the same way C99 `sscanf' is the same as `fscanf'. - - -File: gmp.info, Node: C++ Formatted Input, Prev: Formatted Input Functions, Up: Formatted Input - -11.3 C++ Formatted Input -======================== - -The following functions are provided in `libgmpxx' (*note Headers and -Libraries::), which is built only if C++ support is enabled (*note -Build Options::). Prototypes are available from `'. - - -- Function: istream& operator>> (istream& STREAM, mpz_t ROP) - Read ROP from STREAM, using its `ios' formatting settings. - - -- Function: istream& operator>> (istream& STREAM, mpq_t ROP) - An integer like `123' will be read, or a fraction like `5/9'. No - whitespace is allowed around the `/'. If the fraction is not in - canonical form then `mpq_canonicalize' must be called (*note - Rational Number Functions::) before operating on it. - - As per integer input, an `0' or `0x' base indicator is read when - none of `ios::dec', `ios::oct' or `ios::hex' are set. This is - done separately for numerator and denominator, so that for instance - `0x10/11' is 16/11 and `0x10/0x11' is 16/17. - - -- Function: istream& operator>> (istream& STREAM, mpf_t ROP) - Read ROP from STREAM, using its `ios' formatting settings. - - Hex or octal floats are not supported, but might be in the future, - or perhaps it's best to accept only what the standard float - `operator>>' does. - - Note that digit grouping specified by the `istream' locale is -currently not accepted. Perhaps this will change in the future. - - - These operators mean that GMP types can be read in the usual C++ -way, for example, - - mpz_t z; - ... - cin >> z; - - But note that `istream' input (and `ostream' output, *note C++ -Formatted Output::) is the only overloading available for the GMP types -and that for instance using `+' with an `mpz_t' will have unpredictable -results. For classes with overloading, see *Note C++ Class Interface::. - - -File: gmp.info, Node: C++ Class Interface, Next: BSD Compatible Functions, Prev: Formatted Input, Up: Top - -12 C++ Class Interface -********************** - -This chapter describes the C++ class based interface to GMP. - - All GMP C language types and functions can be used in C++ programs, -since `gmp.h' has `extern "C"' qualifiers, but the class interface -offers overloaded functions and operators which may be more convenient. - - Due to the implementation of this interface, a reasonably recent C++ -compiler is required, one supporting namespaces, partial specialization -of templates and member templates. For GCC this means version 2.91 or -later. - - *Everything described in this chapter is to be considered preliminary -and might be subject to incompatible changes if some unforeseen -difficulty reveals itself.* - -* Menu: - -* C++ Interface General:: -* C++ Interface Integers:: -* C++ Interface Rationals:: -* C++ Interface Floats:: -* C++ Interface Random Numbers:: -* C++ Interface Limitations:: - - -File: gmp.info, Node: C++ Interface General, Next: C++ Interface Integers, Prev: C++ Class Interface, Up: C++ Class Interface - -12.1 C++ Interface General -========================== - -All the C++ classes and functions are available with - - #include - - Programs should be linked with the `libgmpxx' and `libgmp' -libraries. For example, - - g++ mycxxprog.cc -lgmpxx -lgmp - -The classes defined are - - -- Class: mpz_class - -- Class: mpq_class - -- Class: mpf_class - - The standard operators and various standard functions are overloaded -to allow arithmetic with these classes. For example, - - int - main (void) - { - mpz_class a, b, c; - - a = 1234; - b = "-5678"; - c = a+b; - cout << "sum is " << c << "\n"; - cout << "absolute value is " << abs(c) << "\n"; - - return 0; - } - - An important feature of the implementation is that an expression like -`a=b+c' results in a single call to the corresponding `mpz_add', -without using a temporary for the `b+c' part. Expressions which by -their nature imply intermediate values, like `a=b*c+d*e', still use -temporaries though. - - The classes can be freely intermixed in expressions, as can the -classes and the standard types `long', `unsigned long' and `double'. -Smaller types like `int' or `float' can also be intermixed, since C++ -will promote them. - - Note that `bool' is not accepted directly, but must be explicitly -cast to an `int' first. This is because C++ will automatically convert -any pointer to a `bool', so if GMP accepted `bool' it would make all -sorts of invalid class and pointer combinations compile but almost -certainly not do anything sensible. - - Conversions back from the classes to standard C++ types aren't done -automatically, instead member functions like `get_si' are provided (see -the following sections for details). - - Also there are no automatic conversions from the classes to the -corresponding GMP C types, instead a reference to the underlying C -object can be obtained with the following functions, - - -- Function: mpz_t mpz_class::get_mpz_t () - -- Function: mpq_t mpq_class::get_mpq_t () - -- Function: mpf_t mpf_class::get_mpf_t () - - These can be used to call a C function which doesn't have a C++ class -interface. For example to set `a' to the GCD of `b' and `c', - - mpz_class a, b, c; - ... - mpz_gcd (a.get_mpz_t(), b.get_mpz_t(), c.get_mpz_t()); - - In the other direction, a class can be initialized from the -corresponding GMP C type, or assigned to if an explicit constructor is -used. In both cases this makes a copy of the value, it doesn't create -any sort of association. For example, - - mpz_t z; - // ... init and calculate z ... - mpz_class x(z); - mpz_class y; - y = mpz_class (z); - - There are no namespace setups in `gmpxx.h', all types and functions -are simply put into the global namespace. This is what `gmp.h' has -done in the past, and continues to do for compatibility. The extras -provided by `gmpxx.h' follow GMP naming conventions and are unlikely to -clash with anything. - - -File: gmp.info, Node: C++ Interface Integers, Next: C++ Interface Rationals, Prev: C++ Interface General, Up: C++ Class Interface - -12.2 C++ Interface Integers -=========================== - - -- Function: void mpz_class::mpz_class (type N) - Construct an `mpz_class'. All the standard C++ types may be used, - except `long long' and `long double', and all the GMP C++ classes - can be used. Any necessary conversion follows the corresponding C - function, for example `double' follows `mpz_set_d' (*note - Assigning Integers::). - - -- Function: void mpz_class::mpz_class (mpz_t Z) - Construct an `mpz_class' from an `mpz_t'. The value in Z is - copied into the new `mpz_class', there won't be any permanent - association between it and Z. - - -- Function: void mpz_class::mpz_class (const char *S) - -- Function: void mpz_class::mpz_class (const char *S, int BASE = 0) - -- Function: void mpz_class::mpz_class (const string& S) - -- Function: void mpz_class::mpz_class (const string& S, int BASE = 0) - Construct an `mpz_class' converted from a string using - `mpz_set_str' (*note Assigning Integers::). - - If the string is not a valid integer, an `std::invalid_argument' - exception is thrown. The same applies to `operator='. - - -- Function: mpz_class operator/ (mpz_class A, mpz_class D) - -- Function: mpz_class operator% (mpz_class A, mpz_class D) - Divisions involving `mpz_class' round towards zero, as per the - `mpz_tdiv_q' and `mpz_tdiv_r' functions (*note Integer Division::). - This is the same as the C99 `/' and `%' operators. - - The `mpz_fdiv...' or `mpz_cdiv...' functions can always be called - directly if desired. For example, - - mpz_class q, a, d; - ... - mpz_fdiv_q (q.get_mpz_t(), a.get_mpz_t(), d.get_mpz_t()); - - -- Function: mpz_class abs (mpz_class OP1) - -- Function: int cmp (mpz_class OP1, type OP2) - -- Function: int cmp (type OP1, mpz_class OP2) - -- Function: bool mpz_class::fits_sint_p (void) - -- Function: bool mpz_class::fits_slong_p (void) - -- Function: bool mpz_class::fits_sshort_p (void) - -- Function: bool mpz_class::fits_uint_p (void) - -- Function: bool mpz_class::fits_ulong_p (void) - -- Function: bool mpz_class::fits_ushort_p (void) - -- Function: double mpz_class::get_d (void) - -- Function: long mpz_class::get_si (void) - -- Function: string mpz_class::get_str (int BASE = 10) - -- Function: unsigned long mpz_class::get_ui (void) - -- Function: int mpz_class::set_str (const char *STR, int BASE) - -- Function: int mpz_class::set_str (const string& STR, int BASE) - -- Function: int sgn (mpz_class OP) - -- Function: mpz_class sqrt (mpz_class OP) - These functions provide a C++ class interface to the corresponding - GMP C routines. - - `cmp' can be used with any of the classes or the standard C++ - types, except `long long' and `long double'. - - - Overloaded operators for combinations of `mpz_class' and `double' -are provided for completeness, but it should be noted that if the given -`double' is not an integer then the way any rounding is done is -currently unspecified. The rounding might take place at the start, in -the middle, or at the end of the operation, and it might change in the -future. - - Conversions between `mpz_class' and `double', however, are defined -to follow the corresponding C functions `mpz_get_d' and `mpz_set_d'. -And comparisons are always made exactly, as per `mpz_cmp_d'. - - -File: gmp.info, Node: C++ Interface Rationals, Next: C++ Interface Floats, Prev: C++ Interface Integers, Up: C++ Class Interface - -12.3 C++ Interface Rationals -============================ - -In all the following constructors, if a fraction is given then it -should be in canonical form, or if not then `mpq_class::canonicalize' -called. - - -- Function: void mpq_class::mpq_class (type OP) - -- Function: void mpq_class::mpq_class (integer NUM, integer DEN) - Construct an `mpq_class'. The initial value can be a single value - of any type, or a pair of integers (`mpz_class' or standard C++ - integer types) representing a fraction, except that `long long' - and `long double' are not supported. For example, - - mpq_class q (99); - mpq_class q (1.75); - mpq_class q (1, 3); - - -- Function: void mpq_class::mpq_class (mpq_t Q) - Construct an `mpq_class' from an `mpq_t'. The value in Q is - copied into the new `mpq_class', there won't be any permanent - association between it and Q. - - -- Function: void mpq_class::mpq_class (const char *S) - -- Function: void mpq_class::mpq_class (const char *S, int BASE = 0) - -- Function: void mpq_class::mpq_class (const string& S) - -- Function: void mpq_class::mpq_class (const string& S, int BASE = 0) - Construct an `mpq_class' converted from a string using - `mpq_set_str' (*note Initializing Rationals::). - - If the string is not a valid rational, an `std::invalid_argument' - exception is thrown. The same applies to `operator='. - - -- Function: void mpq_class::canonicalize () - Put an `mpq_class' into canonical form, as per *Note Rational - Number Functions::. All arithmetic operators require their - operands in canonical form, and will return results in canonical - form. - - -- Function: mpq_class abs (mpq_class OP) - -- Function: int cmp (mpq_class OP1, type OP2) - -- Function: int cmp (type OP1, mpq_class OP2) - -- Function: double mpq_class::get_d (void) - -- Function: string mpq_class::get_str (int BASE = 10) - -- Function: int mpq_class::set_str (const char *STR, int BASE) - -- Function: int mpq_class::set_str (const string& STR, int BASE) - -- Function: int sgn (mpq_class OP) - These functions provide a C++ class interface to the corresponding - GMP C routines. - - `cmp' can be used with any of the classes or the standard C++ - types, except `long long' and `long double'. - - -- Function: mpz_class& mpq_class::get_num () - -- Function: mpz_class& mpq_class::get_den () - Get a reference to an `mpz_class' which is the numerator or - denominator of an `mpq_class'. This can be used both for read and - write access. If the object returned is modified, it modifies the - original `mpq_class'. - - If direct manipulation might produce a non-canonical value, then - `mpq_class::canonicalize' must be called before further operations. - - -- Function: mpz_t mpq_class::get_num_mpz_t () - -- Function: mpz_t mpq_class::get_den_mpz_t () - Get a reference to the underlying `mpz_t' numerator or denominator - of an `mpq_class'. This can be passed to C functions expecting an - `mpz_t'. Any modifications made to the `mpz_t' will modify the - original `mpq_class'. - - If direct manipulation might produce a non-canonical value, then - `mpq_class::canonicalize' must be called before further operations. - - -- Function: istream& operator>> (istream& STREAM, mpq_class& ROP); - Read ROP from STREAM, using its `ios' formatting settings, the - same as `mpq_t operator>>' (*note C++ Formatted Input::). - - If the ROP read might not be in canonical form then - `mpq_class::canonicalize' must be called. - - -File: gmp.info, Node: C++ Interface Floats, Next: C++ Interface Random Numbers, Prev: C++ Interface Rationals, Up: C++ Class Interface - -12.4 C++ Interface Floats -========================= - -When an expression requires the use of temporary intermediate -`mpf_class' values, like `f=g*h+x*y', those temporaries will have the -same precision as the destination `f'. Explicit constructors can be -used if this doesn't suit. - - -- Function: mpf_class::mpf_class (type OP) - -- Function: mpf_class::mpf_class (type OP, unsigned long PREC) - Construct an `mpf_class'. Any standard C++ type can be used, - except `long long' and `long double', and any of the GMP C++ - classes can be used. - - If PREC is given, the initial precision is that value, in bits. If - PREC is not given, then the initial precision is determined by the - type of OP given. An `mpz_class', `mpq_class', or C++ builtin - type will give the default `mpf' precision (*note Initializing - Floats::). An `mpf_class' or expression will give the precision - of that value. The precision of a binary expression is the higher - of the two operands. - - mpf_class f(1.5); // default precision - mpf_class f(1.5, 500); // 500 bits (at least) - mpf_class f(x); // precision of x - mpf_class f(abs(x)); // precision of x - mpf_class f(-g, 1000); // 1000 bits (at least) - mpf_class f(x+y); // greater of precisions of x and y - - -- Function: void mpf_class::mpf_class (const char *S) - -- Function: void mpf_class::mpf_class (const char *S, unsigned long - PREC, int BASE = 0) - -- Function: void mpf_class::mpf_class (const string& S) - -- Function: void mpf_class::mpf_class (const string& S, unsigned long - PREC, int BASE = 0) - Construct an `mpf_class' converted from a string using - `mpf_set_str' (*note Assigning Floats::). If PREC is given, the - initial precision is that value, in bits. If not, the default - `mpf' precision (*note Initializing Floats::) is used. - - If the string is not a valid float, an `std::invalid_argument' - exception is thrown. The same applies to `operator='. - - -- Function: mpf_class& mpf_class::operator= (type OP) - Convert and store the given OP value to an `mpf_class' object. The - same types are accepted as for the constructors above. - - Note that `operator=' only stores a new value, it doesn't copy or - change the precision of the destination, instead the value is - truncated if necessary. This is the same as `mpf_set' etc. Note - in particular this means for `mpf_class' a copy constructor is not - the same as a default constructor plus assignment. - - mpf_class x (y); // x created with precision of y - - mpf_class x; // x created with default precision - x = y; // value truncated to that precision - - Applications using templated code may need to be careful about the - assumptions the code makes in this area, when working with - `mpf_class' values of various different or non-default precisions. - For instance implementations of the standard `complex' template - have been seen in both styles above, though of course `complex' is - normally only actually specified for use with the builtin float - types. - - -- Function: mpf_class abs (mpf_class OP) - -- Function: mpf_class ceil (mpf_class OP) - -- Function: int cmp (mpf_class OP1, type OP2) - -- Function: int cmp (type OP1, mpf_class OP2) - -- Function: bool mpf_class::fits_sint_p (void) - -- Function: bool mpf_class::fits_slong_p (void) - -- Function: bool mpf_class::fits_sshort_p (void) - -- Function: bool mpf_class::fits_uint_p (void) - -- Function: bool mpf_class::fits_ulong_p (void) - -- Function: bool mpf_class::fits_ushort_p (void) - -- Function: mpf_class floor (mpf_class OP) - -- Function: mpf_class hypot (mpf_class OP1, mpf_class OP2) - -- Function: double mpf_class::get_d (void) - -- Function: long mpf_class::get_si (void) - -- Function: string mpf_class::get_str (mp_exp_t& EXP, int BASE = 10, - size_t DIGITS = 0) - -- Function: unsigned long mpf_class::get_ui (void) - -- Function: int mpf_class::set_str (const char *STR, int BASE) - -- Function: int mpf_class::set_str (const string& STR, int BASE) - -- Function: int sgn (mpf_class OP) - -- Function: mpf_class sqrt (mpf_class OP) - -- Function: mpf_class trunc (mpf_class OP) - These functions provide a C++ class interface to the corresponding - GMP C routines. - - `cmp' can be used with any of the classes or the standard C++ - types, except `long long' and `long double'. - - The accuracy provided by `hypot' is not currently guaranteed. - - -- Function: mp_bitcnt_t mpf_class::get_prec () - -- Function: void mpf_class::set_prec (mp_bitcnt_t PREC) - -- Function: void mpf_class::set_prec_raw (mp_bitcnt_t PREC) - Get or set the current precision of an `mpf_class'. - - The restrictions described for `mpf_set_prec_raw' (*note - Initializing Floats::) apply to `mpf_class::set_prec_raw'. Note - in particular that the `mpf_class' must be restored to it's - allocated precision before being destroyed. This must be done by - application code, there's no automatic mechanism for it. - - -File: gmp.info, Node: C++ Interface Random Numbers, Next: C++ Interface Limitations, Prev: C++ Interface Floats, Up: C++ Class Interface - -12.5 C++ Interface Random Numbers -================================= - - -- Class: gmp_randclass - The C++ class interface to the GMP random number functions uses - `gmp_randclass' to hold an algorithm selection and current state, - as per `gmp_randstate_t'. - - -- Function: gmp_randclass::gmp_randclass (void (*RANDINIT) - (gmp_randstate_t, ...), ...) - Construct a `gmp_randclass', using a call to the given RANDINIT - function (*note Random State Initialization::). The arguments - expected are the same as RANDINIT, but with `mpz_class' instead of - `mpz_t'. For example, - - gmp_randclass r1 (gmp_randinit_default); - gmp_randclass r2 (gmp_randinit_lc_2exp_size, 32); - gmp_randclass r3 (gmp_randinit_lc_2exp, a, c, m2exp); - gmp_randclass r4 (gmp_randinit_mt); - - `gmp_randinit_lc_2exp_size' will fail if the size requested is too - big, an `std::length_error' exception is thrown in that case. - - -- Function: gmp_randclass::gmp_randclass (gmp_randalg_t ALG, ...) - Construct a `gmp_randclass' using the same parameters as - `gmp_randinit' (*note Random State Initialization::). This - function is obsolete and the above RANDINIT style should be - preferred. - - -- Function: void gmp_randclass::seed (unsigned long int S) - -- Function: void gmp_randclass::seed (mpz_class S) - Seed a random number generator. See *note Random Number - Functions::, for how to choose a good seed. - - -- Function: mpz_class gmp_randclass::get_z_bits (unsigned long BITS) - -- Function: mpz_class gmp_randclass::get_z_bits (mpz_class BITS) - Generate a random integer with a specified number of bits. - - -- Function: mpz_class gmp_randclass::get_z_range (mpz_class N) - Generate a random integer in the range 0 to N-1 inclusive. - - -- Function: mpf_class gmp_randclass::get_f () - -- Function: mpf_class gmp_randclass::get_f (unsigned long PREC) - Generate a random float F in the range 0 <= F < 1. F will be to - PREC bits precision, or if PREC is not given then to the precision - of the destination. For example, - - gmp_randclass r; - ... - mpf_class f (0, 512); // 512 bits precision - f = r.get_f(); // random number, 512 bits - - -File: gmp.info, Node: C++ Interface Limitations, Prev: C++ Interface Random Numbers, Up: C++ Class Interface - -12.6 C++ Interface Limitations -============================== - -`mpq_class' and Templated Reading - A generic piece of template code probably won't know that - `mpq_class' requires a `canonicalize' call if inputs read with - `operator>>' might be non-canonical. This can lead to incorrect - results. - - `operator>>' behaves as it does for reasons of efficiency. A - canonicalize can be quite time consuming on large operands, and is - best avoided if it's not necessary. - - But this potential difficulty reduces the usefulness of - `mpq_class'. Perhaps a mechanism to tell `operator>>' what to do - will be adopted in the future, maybe a preprocessor define, a - global flag, or an `ios' flag pressed into service. Or maybe, at - the risk of inconsistency, the `mpq_class' `operator>>' could - canonicalize and leave `mpq_t' `operator>>' not doing so, for use - on those occasions when that's acceptable. Send feedback or - alternate ideas to . - -Subclassing - Subclassing the GMP C++ classes works, but is not currently - recommended. - - Expressions involving subclasses resolve correctly (or seem to), - but in normal C++ fashion the subclass doesn't inherit - constructors and assignments. There's many of those in the GMP - classes, and a good way to reestablish them in a subclass is not - yet provided. - -Templated Expressions - A subtle difficulty exists when using expressions together with - application-defined template functions. Consider the following, - with `T' intended to be some numeric type, - - template - T fun (const T &, const T &); - - When used with, say, plain `mpz_class' variables, it works fine: - `T' is resolved as `mpz_class'. - - mpz_class f(1), g(2); - fun (f, g); // Good - - But when one of the arguments is an expression, it doesn't work. - - mpz_class f(1), g(2), h(3); - fun (f, g+h); // Bad - - This is because `g+h' ends up being a certain expression template - type internal to `gmpxx.h', which the C++ template resolution - rules are unable to automatically convert to `mpz_class'. The - workaround is simply to add an explicit cast. - - mpz_class f(1), g(2), h(3); - fun (f, mpz_class(g+h)); // Good - - Similarly, within `fun' it may be necessary to cast an expression - to type `T' when calling a templated `fun2'. - - template - void fun (T f, T g) - { - fun2 (f, f+g); // Bad - } - - template - void fun (T f, T g) - { - fun2 (f, T(f+g)); // Good - } - - -File: gmp.info, Node: BSD Compatible Functions, Next: Custom Allocation, Prev: C++ Class Interface, Up: Top - -13 Berkeley MP Compatible Functions -*********************************** - -These functions are intended to be fully compatible with the Berkeley MP -library which is available on many BSD derived U*ix systems. The -`--enable-mpbsd' option must be used when building GNU MP to make these -available (*note Installing GMP::). - - The original Berkeley MP library has a usage restriction: you cannot -use the same variable as both source and destination in a single -function call. The compatible functions in GNU MP do not share this -restriction--inputs and outputs may overlap. - - It is not recommended that new programs are written using these -functions. Apart from the incomplete set of functions, the interface -for initializing `MINT' objects is more error prone, and the `pow' -function collides with `pow' in `libm.a'. - - Include the header `mp.h' to get the definition of the necessary -types and functions. If you are on a BSD derived system, make sure to -include GNU `mp.h' if you are going to link the GNU `libmp.a' to your -program. This means that you probably need to give the `-I' -option to the compiler, where `' is the directory where you have -GNU `mp.h'. - - -- Function: MINT * itom (signed short int INITIAL_VALUE) - Allocate an integer consisting of a `MINT' object and dynamic limb - space. Initialize the integer to INITIAL_VALUE. Return a pointer - to the `MINT' object. - - -- Function: MINT * xtom (char *INITIAL_VALUE) - Allocate an integer consisting of a `MINT' object and dynamic limb - space. Initialize the integer from INITIAL_VALUE, a hexadecimal, - null-terminated C string. Return a pointer to the `MINT' object. - - -- Function: void move (MINT *SRC, MINT *DEST) - Set DEST to SRC by copying. Both variables must be previously - initialized. - - -- Function: void madd (MINT *SRC_1, MINT *SRC_2, MINT *DESTINATION) - Add SRC_1 and SRC_2 and put the sum in DESTINATION. - - -- Function: void msub (MINT *SRC_1, MINT *SRC_2, MINT *DESTINATION) - Subtract SRC_2 from SRC_1 and put the difference in DESTINATION. - - -- Function: void mult (MINT *SRC_1, MINT *SRC_2, MINT *DESTINATION) - Multiply SRC_1 and SRC_2 and put the product in DESTINATION. - - -- Function: void mdiv (MINT *DIVIDEND, MINT *DIVISOR, MINT *QUOTIENT, - MINT *REMAINDER) - -- Function: void sdiv (MINT *DIVIDEND, signed short int DIVISOR, MINT - *QUOTIENT, signed short int *REMAINDER) - Set QUOTIENT to DIVIDEND/DIVISOR, and REMAINDER to DIVIDEND mod - DIVISOR. The quotient is rounded towards zero; the remainder has - the same sign as the dividend unless it is zero. - - Some implementations of these functions work differently--or not - at all--for negative arguments. - - -- Function: void msqrt (MINT *OP, MINT *ROOT, MINT *REMAINDER) - Set ROOT to the truncated integer part of the square root of OP, - like `mpz_sqrt'. Set REMAINDER to OP-ROOT*ROOT, i.e. zero if OP - is a perfect square. - - If ROOT and REMAINDER are the same variable, the results are - undefined. - - -- Function: void pow (MINT *BASE, MINT *EXP, MINT *MOD, MINT *DEST) - Set DEST to (BASE raised to EXP) modulo MOD. - - Note that the name `pow' clashes with `pow' from the standard C - math library (*note Exponentiation and Logarithms: (libc)Exponents - and Logarithms.). An application will only be able to use one or - the other. - - -- Function: void rpow (MINT *BASE, signed short int EXP, MINT *DEST) - Set DEST to BASE raised to EXP. - - -- Function: void gcd (MINT *OP1, MINT *OP2, MINT *RES) - Set RES to the greatest common divisor of OP1 and OP2. - - -- Function: int mcmp (MINT *OP1, MINT *OP2) - Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero - if OP1 = OP2, and a negative value if OP1 < OP2. - - -- Function: void min (MINT *DEST) - Input a decimal string from `stdin', and put the read integer in - DEST. SPC and TAB are allowed in the number string, and are - ignored. - - -- Function: void mout (MINT *SRC) - Output SRC to `stdout', as a decimal string. Also output a - newline. - - -- Function: char * mtox (MINT *OP) - Convert OP to a hexadecimal string, and return a pointer to the - string. The returned string is allocated using the default memory - allocation function, `malloc' by default. It will be - `strlen(str)+1' bytes, that being exactly enough for the string - and null-terminator. - - -- Function: void mfree (MINT *OP) - De-allocate, the space used by OP. *This function should only be - passed a value returned by `itom' or `xtom'.* - - -File: gmp.info, Node: Custom Allocation, Next: Language Bindings, Prev: BSD Compatible Functions, Up: Top - -14 Custom Allocation -******************** - -By default GMP uses `malloc', `realloc' and `free' for memory -allocation, and if they fail GMP prints a message to the standard error -output and terminates the program. - - Alternate functions can be specified, to allocate memory in a -different way or to have a different error action on running out of -memory. - - This feature is available in the Berkeley compatibility library -(*note BSD Compatible Functions::) as well as the main GMP library. - - -- Function: void mp_set_memory_functions ( - void *(*ALLOC_FUNC_PTR) (size_t), - void *(*REALLOC_FUNC_PTR) (void *, size_t, size_t), - void (*FREE_FUNC_PTR) (void *, size_t)) - Replace the current allocation functions from the arguments. If - an argument is `NULL', the corresponding default function is used. - - These functions will be used for all memory allocation done by - GMP, apart from temporary space from `alloca' if that function is - available and GMP is configured to use it (*note Build Options::). - - *Be sure to call `mp_set_memory_functions' only when there are no - active GMP objects allocated using the previous memory functions! - Usually that means calling it before any other GMP function.* - - The functions supplied should fit the following declarations: - - -- Function: void * allocate_function (size_t ALLOC_SIZE) - Return a pointer to newly allocated space with at least ALLOC_SIZE - bytes. - - -- Function: void * reallocate_function (void *PTR, size_t OLD_SIZE, - size_t NEW_SIZE) - Resize a previously allocated block PTR of OLD_SIZE bytes to be - NEW_SIZE bytes. - - The block may be moved if necessary or if desired, and in that - case the smaller of OLD_SIZE and NEW_SIZE bytes must be copied to - the new location. The return value is a pointer to the resized - block, that being the new location if moved or just PTR if not. - - PTR is never `NULL', it's always a previously allocated block. - NEW_SIZE may be bigger or smaller than OLD_SIZE. - - -- Function: void free_function (void *PTR, size_t SIZE) - De-allocate the space pointed to by PTR. - - PTR is never `NULL', it's always a previously allocated block of - SIZE bytes. - - A "byte" here means the unit used by the `sizeof' operator. - - The OLD_SIZE parameters to REALLOCATE_FUNCTION and FREE_FUNCTION are -passed for convenience, but of course can be ignored if not needed. -The default functions using `malloc' and friends for instance don't use -them. - - No error return is allowed from any of these functions, if they -return then they must have performed the specified operation. In -particular note that ALLOCATE_FUNCTION or REALLOCATE_FUNCTION mustn't -return `NULL'. - - Getting a different fatal error action is a good use for custom -allocation functions, for example giving a graphical dialog rather than -the default print to `stderr'. How much is possible when genuinely out -of memory is another question though. - - There's currently no defined way for the allocation functions to -recover from an error such as out of memory, they must terminate -program execution. A `longjmp' or throwing a C++ exception will have -undefined results. This may change in the future. - - GMP may use allocated blocks to hold pointers to other allocated -blocks. This will limit the assumptions a conservative garbage -collection scheme can make. - - Since the default GMP allocation uses `malloc' and friends, those -functions will be linked in even if the first thing a program does is an -`mp_set_memory_functions'. It's necessary to change the GMP sources if -this is a problem. - - - -- Function: void mp_get_memory_functions ( - void *(**ALLOC_FUNC_PTR) (size_t), - void *(**REALLOC_FUNC_PTR) (void *, size_t, size_t), - void (**FREE_FUNC_PTR) (void *, size_t)) - Get the current allocation functions, storing function pointers to - the locations given by the arguments. If an argument is `NULL', - that function pointer is not stored. - - For example, to get just the current free function, - - void (*freefunc) (void *, size_t); - - mp_get_memory_functions (NULL, NULL, &freefunc); - - -File: gmp.info, Node: Language Bindings, Next: Algorithms, Prev: Custom Allocation, Up: Top - -15 Language Bindings -******************** - -The following packages and projects offer access to GMP from languages -other than C, though perhaps with varying levels of functionality and -efficiency. - - -C++ - * GMP C++ class interface, *note C++ Class Interface:: - Straightforward interface, expression templates to eliminate - temporaries. - - * ALP `http://www-sop.inria.fr/saga/logiciels/ALP/' - Linear algebra and polynomials using templates. - - * Arithmos `http://www.win.ua.ac.be/~cant/arithmos/' - Rationals with infinities and square roots. - - * CLN `http://www.ginac.de/CLN/' - High level classes for arithmetic. - - * LiDIA `http://www.cdc.informatik.tu-darmstadt.de/TI/LiDIA/' - A C++ library for computational number theory. - - * Linbox `http://www.linalg.org/' - Sparse vectors and matrices. - - * NTL `http://www.shoup.net/ntl/' - A C++ number theory library. - -Fortran - * Omni F77 `http://phase.hpcc.jp/Omni/home.html' - Arbitrary precision floats. - -Haskell - * Glasgow Haskell Compiler `http://www.haskell.org/ghc/' - -Java - * Kaffe `http://www.kaffe.org/' - - * Kissme `http://kissme.sourceforge.net/' - -Lisp - * GNU Common Lisp `http://www.gnu.org/software/gcl/gcl.html' - - * Librep `http://librep.sourceforge.net/' - - * XEmacs (21.5.18 beta and up) `http://www.xemacs.org' - Optional big integers, rationals and floats using GMP. - -M4 - * GNU m4 betas `http://www.seindal.dk/rene/gnu/' - Optionally provides an arbitrary precision `mpeval'. - -ML - * MLton compiler `http://mlton.org/' - -Objective Caml - * MLGMP `http://www.di.ens.fr/~monniaux/programmes.html.en' - - * Numerix `http://pauillac.inria.fr/~quercia/' - Optionally using GMP. - -Oz - * Mozart `http://www.mozart-oz.org/' - -Pascal - * GNU Pascal Compiler `http://www.gnu-pascal.de/' - GMP unit. - - * Numerix `http://pauillac.inria.fr/~quercia/' - For Free Pascal, optionally using GMP. - -Perl - * GMP module, see `demos/perl' in the GMP sources (*note - Demonstration Programs::). - - * Math::GMP `http://www.cpan.org/' - Compatible with Math::BigInt, but not as many functions as - the GMP module above. - - * Math::BigInt::GMP `http://www.cpan.org/' - Plug Math::GMP into normal Math::BigInt operations. - -Pike - * mpz module in the standard distribution, - `http://pike.ida.liu.se/' - -Prolog - * SWI Prolog `http://www.swi-prolog.org/' - Arbitrary precision floats. - -Python - * mpz module in the standard distribution, - `http://www.python.org/' - - * GMPY `http://gmpy.sourceforge.net/' - -Scheme - * GNU Guile (upcoming 1.8) - `http://www.gnu.org/software/guile/guile.html' - - * RScheme `http://www.rscheme.org/' - - * STklos `http://www.stklos.org/' - -Smalltalk - * GNU Smalltalk - `http://www.smalltalk.org/versions/GNUSmalltalk.html' - -Other - * Axiom `http://savannah.nongnu.org/projects/axiom' - Computer algebra using GCL. - - * DrGenius `http://drgenius.seul.org/' - Geometry system and mathematical programming language. - - * GiNaC `http://www.ginac.de/' - C++ computer algebra using CLN. - - * GOO `http://www.googoogaga.org/' - Dynamic object oriented language. - - * Maxima `http://www.ma.utexas.edu/users/wfs/maxima.html' - Macsyma computer algebra using GCL. - - * Q `http://q-lang.sourceforge.net/' - Equational programming system. - - * Regina `http://regina.sourceforge.net/' - Topological calculator. - - * Yacas `http://www.xs4all.nl/~apinkus/yacas.html' - Yet another computer algebra system. - - - -File: gmp.info, Node: Algorithms, Next: Internals, Prev: Language Bindings, Up: Top - -16 Algorithms -************* - -This chapter is an introduction to some of the algorithms used for -various GMP operations. The code is likely to be hard to understand -without knowing something about the algorithms. - - Some GMP internals are mentioned, but applications that expect to be -compatible with future GMP releases should take care to use only the -documented functions. - -* Menu: - -* Multiplication Algorithms:: -* Division Algorithms:: -* Greatest Common Divisor Algorithms:: -* Powering Algorithms:: -* Root Extraction Algorithms:: -* Radix Conversion Algorithms:: -* Other Algorithms:: -* Assembly Coding:: - - -File: gmp.info, Node: Multiplication Algorithms, Next: Division Algorithms, Prev: Algorithms, Up: Algorithms - -16.1 Multiplication -=================== - -NxN limb multiplications and squares are done using one of five -algorithms, as the size N increases. - - Algorithm Threshold - Basecase (none) - Karatsuba `MUL_TOOM22_THRESHOLD' - Toom-3 `MUL_TOOM33_THRESHOLD' - Toom-4 `MUL_TOOM44_THRESHOLD' - FFT `MUL_FFT_THRESHOLD' - - Similarly for squaring, with the `SQR' thresholds. - - NxM multiplications of operands with different sizes above -`MUL_TOOM22_THRESHOLD' are currently done by special Toom-inspired -algorithms or directly with FFT, depending on operand size (*note -Unbalanced Multiplication::). - -* Menu: - -* Basecase Multiplication:: -* Karatsuba Multiplication:: -* Toom 3-Way Multiplication:: -* Toom 4-Way Multiplication:: -* FFT Multiplication:: -* Other Multiplication:: -* Unbalanced Multiplication:: - - -File: gmp.info, Node: Basecase Multiplication, Next: Karatsuba Multiplication, Prev: Multiplication Algorithms, Up: Multiplication Algorithms - -16.1.1 Basecase Multiplication ------------------------------- - -Basecase NxM multiplication is a straightforward rectangular set of -cross-products, the same as long multiplication done by hand and for -that reason sometimes known as the schoolbook or grammar school method. -This is an O(N*M) algorithm. See Knuth section 4.3.1 algorithm M -(*note References::), and the `mpn/generic/mul_basecase.c' code. - - Assembly implementations of `mpn_mul_basecase' are essentially the -same as the generic C code, but have all the usual assembly tricks and -obscurities introduced for speed. - - A square can be done in roughly half the time of a multiply, by -using the fact that the cross products above and below the diagonal are -the same. A triangle of products below the diagonal is formed, doubled -(left shift by one bit), and then the products on the diagonal added. -This can be seen in `mpn/generic/sqr_basecase.c'. Again the assembly -implementations take essentially the same approach. - - u0 u1 u2 u3 u4 - +---+---+---+---+---+ - u0 | d | | | | | - +---+---+---+---+---+ - u1 | | d | | | | - +---+---+---+---+---+ - u2 | | | d | | | - +---+---+---+---+---+ - u3 | | | | d | | - +---+---+---+---+---+ - u4 | | | | | d | - +---+---+---+---+---+ - - In practice squaring isn't a full 2x faster than multiplying, it's -usually around 1.5x. Less than 1.5x probably indicates -`mpn_sqr_basecase' wants improving on that CPU. - - On some CPUs `mpn_mul_basecase' can be faster than the generic C -`mpn_sqr_basecase' on some small sizes. `SQR_BASECASE_THRESHOLD' is -the size at which to use `mpn_sqr_basecase', this will be zero if that -routine should be used always. - - -File: gmp.info, Node: Karatsuba Multiplication, Next: Toom 3-Way Multiplication, Prev: Basecase Multiplication, Up: Multiplication Algorithms - -16.1.2 Karatsuba Multiplication -------------------------------- - -The Karatsuba multiplication algorithm is described in Knuth section -4.3.3 part A, and various other textbooks. A brief description is -given here. - - The inputs x and y are treated as each split into two parts of equal -length (or the most significant part one limb shorter if N is odd). - - high low - +----------+----------+ - | x1 | x0 | - +----------+----------+ - - +----------+----------+ - | y1 | y0 | - +----------+----------+ - - Let b be the power of 2 where the split occurs, ie. if x0 is k limbs -(y0 the same) then b=2^(k*mp_bits_per_limb). With that x=x1*b+x0 and -y=y1*b+y0, and the following holds, - - x*y = (b^2+b)*x1*y1 - b*(x1-x0)*(y1-y0) + (b+1)*x0*y0 - - This formula means doing only three multiplies of (N/2)x(N/2) limbs, -whereas a basecase multiply of NxN limbs is equivalent to four -multiplies of (N/2)x(N/2). The factors (b^2+b) etc represent the -positions where the three products must be added. - - high low - +--------+--------+ +--------+--------+ - | x1*y1 | | x0*y0 | - +--------+--------+ +--------+--------+ - +--------+--------+ - add | x1*y1 | - +--------+--------+ - +--------+--------+ - add | x0*y0 | - +--------+--------+ - +--------+--------+ - sub | (x1-x0)*(y1-y0) | - +--------+--------+ - - The term (x1-x0)*(y1-y0) is best calculated as an absolute value, -and the sign used to choose to add or subtract. Notice the sum -high(x0*y0)+low(x1*y1) occurs twice, so it's possible to do 5*k limb -additions, rather than 6*k, but in GMP extra function call overheads -outweigh the saving. - - Squaring is similar to multiplying, but with x=y the formula reduces -to an equivalent with three squares, - - x^2 = (b^2+b)*x1^2 - b*(x1-x0)^2 + (b+1)*x0^2 - - The final result is accumulated from those three squares the same -way as for the three multiplies above. The middle term (x1-x0)^2 is now -always positive. - - A similar formula for both multiplying and squaring can be -constructed with a middle term (x1+x0)*(y1+y0). But those sums can -exceed k limbs, leading to more carry handling and additions than the -form above. - - Karatsuba multiplication is asymptotically an O(N^1.585) algorithm, -the exponent being log(3)/log(2), representing 3 multiplies each 1/2 -the size of the inputs. This is a big improvement over the basecase -multiply at O(N^2) and the advantage soon overcomes the extra additions -Karatsuba performs. `MUL_TOOM22_THRESHOLD' can be as little as 10 -limbs. The `SQR' threshold is usually about twice the `MUL'. - - The basecase algorithm will take a time of the form M(N) = a*N^2 + -b*N + c and the Karatsuba algorithm K(N) = 3*M(N/2) + d*N + e, which -expands to K(N) = 3/4*a*N^2 + 3/2*b*N + 3*c + d*N + e. The factor 3/4 -for a means per-crossproduct speedups in the basecase code will -increase the threshold since they benefit M(N) more than K(N). And -conversely the 3/2 for b means linear style speedups of b will increase -the threshold since they benefit K(N) more than M(N). The latter can -be seen for instance when adding an optimized `mpn_sqr_diagonal' to -`mpn_sqr_basecase'. Of course all speedups reduce total time, and in -that sense the algorithm thresholds are merely of academic interest. - - -File: gmp.info, Node: Toom 3-Way Multiplication, Next: Toom 4-Way Multiplication, Prev: Karatsuba Multiplication, Up: Multiplication Algorithms - -16.1.3 Toom 3-Way Multiplication --------------------------------- - -The Karatsuba formula is the simplest case of a general approach to -splitting inputs that leads to both Toom and FFT algorithms. A -description of Toom can be found in Knuth section 4.3.3, with an -example 3-way calculation after Theorem A. The 3-way form used in GMP -is described here. - - The operands are each considered split into 3 pieces of equal length -(or the most significant part 1 or 2 limbs shorter than the other two). - - high low - +----------+----------+----------+ - | x2 | x1 | x0 | - +----------+----------+----------+ - - +----------+----------+----------+ - | y2 | y1 | y0 | - +----------+----------+----------+ - -These parts are treated as the coefficients of two polynomials - - X(t) = x2*t^2 + x1*t + x0 - Y(t) = y2*t^2 + y1*t + y0 - - Let b equal the power of 2 which is the size of the x0, x1, y0 and -y1 pieces, ie. if they're k limbs each then b=2^(k*mp_bits_per_limb). -With this x=X(b) and y=Y(b). - - Let a polynomial W(t)=X(t)*Y(t) and suppose its coefficients are - - W(t) = w4*t^4 + w3*t^3 + w2*t^2 + w1*t + w0 - - The w[i] are going to be determined, and when they are they'll give -the final result using w=W(b), since x*y=X(b)*Y(b)=W(b). The -coefficients will be roughly b^2 each, and the final W(b) will be an -addition like, - - high low - +-------+-------+ - | w4 | - +-------+-------+ - +--------+-------+ - | w3 | - +--------+-------+ - +--------+-------+ - | w2 | - +--------+-------+ - +--------+-------+ - | w1 | - +--------+-------+ - +-------+-------+ - | w0 | - +-------+-------+ - - The w[i] coefficients could be formed by a simple set of cross -products, like w4=x2*y2, w3=x2*y1+x1*y2, w2=x2*y0+x1*y1+x0*y2 etc, but -this would need all nine x[i]*y[j] for i,j=0,1,2, and would be -equivalent merely to a basecase multiply. Instead the following -approach is used. - - X(t) and Y(t) are evaluated and multiplied at 5 points, giving -values of W(t) at those points. In GMP the following points are used, - - Point Value - t=0 x0 * y0, which gives w0 immediately - t=1 (x2+x1+x0) * (y2+y1+y0) - t=-1 (x2-x1+x0) * (y2-y1+y0) - t=2 (4*x2+2*x1+x0) * (4*y2+2*y1+y0) - t=inf x2 * y2, which gives w4 immediately - - At t=-1 the values can be negative and that's handled using the -absolute values and tracking the sign separately. At t=inf the value -is actually X(t)*Y(t)/t^4 in the limit as t approaches infinity, but -it's much easier to think of as simply x2*y2 giving w4 immediately -(much like x0*y0 at t=0 gives w0 immediately). - - Each of the points substituted into W(t)=w4*t^4+...+w0 gives a -linear combination of the w[i] coefficients, and the value of those -combinations has just been calculated. - - W(0) = w0 - W(1) = w4 + w3 + w2 + w1 + w0 - W(-1) = w4 - w3 + w2 - w1 + w0 - W(2) = 16*w4 + 8*w3 + 4*w2 + 2*w1 + w0 - W(inf) = w4 - - This is a set of five equations in five unknowns, and some -elementary linear algebra quickly isolates each w[i]. This involves -adding or subtracting one W(t) value from another, and a couple of -divisions by powers of 2 and one division by 3, the latter using the -special `mpn_divexact_by3' (*note Exact Division::). - - The conversion of W(t) values to the coefficients is interpolation. -A polynomial of degree 4 like W(t) is uniquely determined by values -known at 5 different points. The points are arbitrary and can be -chosen to make the linear equations come out with a convenient set of -steps for quickly isolating the w[i]. - - Squaring follows the same procedure as multiplication, but there's -only one X(t) and it's evaluated at the 5 points, and those values -squared to give values of W(t). The interpolation is then identical, -and in fact the same `toom3_interpolate' subroutine is used for both -squaring and multiplying. - - Toom-3 is asymptotically O(N^1.465), the exponent being -log(5)/log(3), representing 5 recursive multiplies of 1/3 the original -size each. This is an improvement over Karatsuba at O(N^1.585), though -Toom does more work in the evaluation and interpolation and so it only -realizes its advantage above a certain size. - - Near the crossover between Toom-3 and Karatsuba there's generally a -range of sizes where the difference between the two is small. -`MUL_TOOM33_THRESHOLD' is a somewhat arbitrary point in that range and -successive runs of the tune program can give different values due to -small variations in measuring. A graph of time versus size for the two -shows the effect, see `tune/README'. - - At the fairly small sizes where the Toom-3 thresholds occur it's -worth remembering that the asymptotic behaviour for Karatsuba and -Toom-3 can't be expected to make accurate predictions, due of course to -the big influence of all sorts of overheads, and the fact that only a -few recursions of each are being performed. Even at large sizes -there's a good chance machine dependent effects like cache architecture -will mean actual performance deviates from what might be predicted. - - The formula given for the Karatsuba algorithm (*note Karatsuba -Multiplication::) has an equivalent for Toom-3 involving only five -multiplies, but this would be complicated and unenlightening. - - An alternate view of Toom-3 can be found in Zuras (*note -References::), using a vector to represent the x and y splits and a -matrix multiplication for the evaluation and interpolation stages. The -matrix inverses are not meant to be actually used, and they have -elements with values much greater than in fact arise in the -interpolation steps. The diagram shown for the 3-way is attractive, -but again doesn't have to be implemented that way and for example with -a bit of rearrangement just one division by 6 can be done. - - -File: gmp.info, Node: Toom 4-Way Multiplication, Next: FFT Multiplication, Prev: Toom 3-Way Multiplication, Up: Multiplication Algorithms - -16.1.4 Toom 4-Way Multiplication --------------------------------- - -Karatsuba and Toom-3 split the operands into 2 and 3 coefficients, -respectively. Toom-4 analogously splits the operands into 4 -coefficients. Using the notation from the section on Toom-3 -multiplication, we form two polynomials: - - X(t) = x3*t^3 + x2*t^2 + x1*t + x0 - Y(t) = y3*t^3 + y2*t^2 + y1*t + y0 - - X(t) and Y(t) are evaluated and multiplied at 7 points, giving -values of W(t) at those points. In GMP the following points are used, - - Point Value - t=0 x0 * y0, which gives w0 immediately - t=1/2 (x3+2*x2+4*x1+8*x0) * (y3+2*y2+4*y1+8*y0) - t=-1/2 (-x3+2*x2-4*x1+8*x0) * (-y3+2*y2-4*y1+8*y0) - t=1 (x3+x2+x1+x0) * (y3+y2+y1+y0) - t=-1 (-x3+x2-x1+x0) * (-y3+y2-y1+y0) - t=2 (8*x3+4*x2+2*x1+x0) * (8*y3+4*y2+2*y1+y0) - t=inf x3 * y3, which gives w6 immediately - - The number of additions and subtractions for Toom-4 is much larger -than for Toom-3. But several subexpressions occur multiple times, for -example x2+x0, occurs for both t=1 and t=-1. - - Toom-4 is asymptotically O(N^1.404), the exponent being -log(7)/log(4), representing 7 recursive multiplies of 1/4 the original -size each. - - -File: gmp.info, Node: FFT Multiplication, Next: Other Multiplication, Prev: Toom 4-Way Multiplication, Up: Multiplication Algorithms - -16.1.5 FFT Multiplication -------------------------- - -At large to very large sizes a Fermat style FFT multiplication is used, -following Scho"nhage and Strassen (*note References::). Descriptions -of FFTs in various forms can be found in many textbooks, for instance -Knuth section 4.3.3 part C or Lipson chapter IX. A brief description -of the form used in GMP is given here. - - The multiplication done is x*y mod 2^N+1, for a given N. A full -product x*y is obtained by choosing N>=bits(x)+bits(y) and padding x -and y with high zero limbs. The modular product is the native form for -the algorithm, so padding to get a full product is unavoidable. - - The algorithm follows a split, evaluate, pointwise multiply, -interpolate and combine similar to that described above for Karatsuba -and Toom-3. A k parameter controls the split, with an FFT-k splitting -into 2^k pieces of M=N/2^k bits each. N must be a multiple of -(2^k)*mp_bits_per_limb so the split falls on limb boundaries, avoiding -bit shifts in the split and combine stages. - - The evaluations, pointwise multiplications, and interpolation, are -all done modulo 2^N'+1 where N' is 2M+k+3 rounded up to a multiple of -2^k and of `mp_bits_per_limb'. The results of interpolation will be -the following negacyclic convolution of the input pieces, and the -choice of N' ensures these sums aren't truncated. - - --- - \ b - w[n] = / (-1) * x[i] * y[j] - --- - i+j==b*2^k+n - b=0,1 - - The points used for the evaluation are g^i for i=0 to 2^k-1 where -g=2^(2N'/2^k). g is a 2^k'th root of unity mod 2^N'+1, which produces -necessary cancellations at the interpolation stage, and it's also a -power of 2 so the fast Fourier transforms used for the evaluation and -interpolation do only shifts, adds and negations. - - The pointwise multiplications are done modulo 2^N'+1 and either -recurse into a further FFT or use a plain multiplication (Toom-3, -Karatsuba or basecase), whichever is optimal at the size N'. The -interpolation is an inverse fast Fourier transform. The resulting set -of sums of x[i]*y[j] are added at appropriate offsets to give the final -result. - - Squaring is the same, but x is the only input so it's one transform -at the evaluate stage and the pointwise multiplies are squares. The -interpolation is the same. - - For a mod 2^N+1 product, an FFT-k is an O(N^(k/(k-1))) algorithm, -the exponent representing 2^k recursed modular multiplies each -1/2^(k-1) the size of the original. Each successive k is an asymptotic -improvement, but overheads mean each is only faster at bigger and -bigger sizes. In the code, `MUL_FFT_TABLE' and `SQR_FFT_TABLE' are the -thresholds where each k is used. Each new k effectively swaps some -multiplying for some shifts, adds and overheads. - - A mod 2^N+1 product can be formed with a normal NxN->2N bit multiply -plus a subtraction, so an FFT and Toom-3 etc can be compared directly. -A k=4 FFT at O(N^1.333) can be expected to be the first faster than -Toom-3 at O(N^1.465). In practice this is what's found, with -`MUL_FFT_MODF_THRESHOLD' and `SQR_FFT_MODF_THRESHOLD' being between 300 -and 1000 limbs, depending on the CPU. So far it's been found that only -very large FFTs recurse into pointwise multiplies above these sizes. - - When an FFT is to give a full product, the change of N to 2N doesn't -alter the theoretical complexity for a given k, but for the purposes of -considering where an FFT might be first used it can be assumed that the -FFT is recursing into a normal multiply and that on that basis it's -doing 2^k recursed multiplies each 1/2^(k-2) the size of the inputs, -making it O(N^(k/(k-2))). This would mean k=7 at O(N^1.4) would be the -first FFT faster than Toom-3. In practice `MUL_FFT_THRESHOLD' and -`SQR_FFT_THRESHOLD' have been found to be in the k=8 range, somewhere -between 3000 and 10000 limbs. - - The way N is split into 2^k pieces and then 2M+k+3 is rounded up to -a multiple of 2^k and `mp_bits_per_limb' means that when -2^k>=mp_bits_per_limb the effective N is a multiple of 2^(2k-1) bits. -The +k+3 means some values of N just under such a multiple will be -rounded to the next. The complexity calculations above assume that a -favourable size is used, meaning one which isn't padded through -rounding, and it's also assumed that the extra +k+3 bits are negligible -at typical FFT sizes. - - The practical effect of the 2^(2k-1) constraint is to introduce a -step-effect into measured speeds. For example k=8 will round N up to a -multiple of 32768 bits, so for a 32-bit limb there'll be 512 limb -groups of sizes for which `mpn_mul_n' runs at the same speed. Or for -k=9 groups of 2048 limbs, k=10 groups of 8192 limbs, etc. In practice -it's been found each k is used at quite small multiples of its size -constraint and so the step effect is quite noticeable in a time versus -size graph. - - The threshold determinations currently measure at the mid-points of -size steps, but this is sub-optimal since at the start of a new step it -can happen that it's better to go back to the previous k for a while. -Something more sophisticated for `MUL_FFT_TABLE' and `SQR_FFT_TABLE' -will be needed. - - -File: gmp.info, Node: Other Multiplication, Next: Unbalanced Multiplication, Prev: FFT Multiplication, Up: Multiplication Algorithms - -16.1.6 Other Multiplication ---------------------------- - -The Toom algorithms described above (*note Toom 3-Way Multiplication::, -*note Toom 4-Way Multiplication::) generalizes to split into an -arbitrary number of pieces, as per Knuth section 4.3.3 algorithm C. -This is not currently used. The notes here are merely for interest. - - In general a split into r+1 pieces is made, and evaluations and -pointwise multiplications done at 2*r+1 points. A 4-way split does 7 -pointwise multiplies, 5-way does 9, etc. Asymptotically an (r+1)-way -algorithm is O(N^(log(2*r+1)/log(r+1))). Only the pointwise -multiplications count towards big-O complexity, but the time spent in -the evaluate and interpolate stages grows with r and has a significant -practical impact, with the asymptotic advantage of each r realized only -at bigger and bigger sizes. The overheads grow as O(N*r), whereas in -an r=2^k FFT they grow only as O(N*log(r)). - - Knuth algorithm C evaluates at points 0,1,2,...,2*r, but exercise 4 -uses -r,...,0,...,r and the latter saves some small multiplies in the -evaluate stage (or rather trades them for additions), and has a further -saving of nearly half the interpolate steps. The idea is to separate -odd and even final coefficients and then perform algorithm C steps C7 -and C8 on them separately. The divisors at step C7 become j^2 and the -multipliers at C8 become 2*t*j-j^2. - - Splitting odd and even parts through positive and negative points -can be thought of as using -1 as a square root of unity. If a 4th root -of unity was available then a further split and speedup would be -possible, but no such root exists for plain integers. Going to complex -integers with i=sqrt(-1) doesn't help, essentially because in Cartesian -form it takes three real multiplies to do a complex multiply. The -existence of 2^k'th roots of unity in a suitable ring or field lets the -fast Fourier transform keep splitting and get to O(N*log(r)). - - Floating point FFTs use complex numbers approximating Nth roots of -unity. Some processors have special support for such FFTs. But these -are not used in GMP since it's very difficult to guarantee an exact -result (to some number of bits). An occasional difference of 1 in the -last bit might not matter to a typical signal processing algorithm, but -is of course of vital importance to GMP. - - -File: gmp.info, Node: Unbalanced Multiplication, Prev: Other Multiplication, Up: Multiplication Algorithms - -16.1.7 Unbalanced Multiplication --------------------------------- - -Multiplication of operands with different sizes, both below -`MUL_TOOM22_THRESHOLD' are done with plain schoolbook multiplication -(*note Basecase Multiplication::). - - For really large operands, we invoke FFT directly. - - For operands between these sizes, we use Toom inspired algorithms -suggested by Alberto Zanoni and Marco Bodrato. The idea is to split -the operands into polynomials of different degree. GMP currently -splits the smaller operand onto 2 coefficients, i.e., a polynomial of -degree 1, but the larger operand can be split into 2, 3, or 4 -coefficients, i.e., a polynomial of degree 1 to 3. - - -File: gmp.info, Node: Division Algorithms, Next: Greatest Common Divisor Algorithms, Prev: Multiplication Algorithms, Up: Algorithms - -16.2 Division Algorithms -======================== - -* Menu: - -* Single Limb Division:: -* Basecase Division:: -* Divide and Conquer Division:: -* Block-Wise Barrett Division:: -* Exact Division:: -* Exact Remainder:: -* Small Quotient Division:: - - -File: gmp.info, Node: Single Limb Division, Next: Basecase Division, Prev: Division Algorithms, Up: Division Algorithms - -16.2.1 Single Limb Division ---------------------------- - -Nx1 division is implemented using repeated 2x1 divisions from high to -low, either with a hardware divide instruction or a multiplication by -inverse, whichever is best on a given CPU. - - The multiply by inverse follows "Improved division by invariant -integers" by Mo"ller and Granlund (*note References::) and is -implemented as `udiv_qrnnd_preinv' in `gmp-impl.h'. The idea is to -have a fixed-point approximation to 1/d (see `invert_limb') and then -multiply by the high limb (plus one bit) of the dividend to get a -quotient q. With d normalized (high bit set), q is no more than 1 too -small. Subtracting q*d from the dividend gives a remainder, and -reveals whether q or q-1 is correct. - - The result is a division done with two multiplications and four or -five arithmetic operations. On CPUs with low latency multipliers this -can be much faster than a hardware divide, though the cost of -calculating the inverse at the start may mean it's only better on -inputs bigger than say 4 or 5 limbs. - - When a divisor must be normalized, either for the generic C -`__udiv_qrnnd_c' or the multiply by inverse, the division performed is -actually a*2^k by d*2^k where a is the dividend and k is the power -necessary to have the high bit of d*2^k set. The bit shifts for the -dividend are usually accomplished "on the fly" meaning by extracting -the appropriate bits at each step. Done this way the quotient limbs -come out aligned ready to store. When only the remainder is wanted, an -alternative is to take the dividend limbs unshifted and calculate r = a -mod d*2^k followed by an extra final step r*2^k mod d*2^k. This can -help on CPUs with poor bit shifts or few registers. - - The multiply by inverse can be done two limbs at a time. The -calculation is basically the same, but the inverse is two limbs and the -divisor treated as if padded with a low zero limb. This means more -work, since the inverse will need a 2x2 multiply, but the four 1x1s to -do that are independent and can therefore be done partly or wholly in -parallel. Likewise for a 2x1 calculating q*d. The net effect is to -process two limbs with roughly the same two multiplies worth of latency -that one limb at a time gives. This extends to 3 or 4 limbs at a time, -though the extra work to apply the inverse will almost certainly soon -reach the limits of multiplier throughput. - - A similar approach in reverse can be taken to process just half a -limb at a time if the divisor is only a half limb. In this case the -1x1 multiply for the inverse effectively becomes two (1/2)x1 for each -limb, which can be a saving on CPUs with a fast half limb multiply, or -in fact if the only multiply is a half limb, and especially if it's not -pipelined. - - -File: gmp.info, Node: Basecase Division, Next: Divide and Conquer Division, Prev: Single Limb Division, Up: Division Algorithms - -16.2.2 Basecase Division ------------------------- - -Basecase NxM division is like long division done by hand, but in base -2^mp_bits_per_limb. See Knuth section 4.3.1 algorithm D, and -`mpn/generic/sb_divrem_mn.c'. - - Briefly stated, while the dividend remains larger than the divisor, -a high quotient limb is formed and the Nx1 product q*d subtracted at -the top end of the dividend. With a normalized divisor (most -significant bit set), each quotient limb can be formed with a 2x1 -division and a 1x1 multiplication plus some subtractions. The 2x1 -division is by the high limb of the divisor and is done either with a -hardware divide or a multiply by inverse (the same as in *Note Single -Limb Division::) whichever is faster. Such a quotient is sometimes one -too big, requiring an addback of the divisor, but that happens rarely. - - With Q=N-M being the number of quotient limbs, this is an O(Q*M) -algorithm and will run at a speed similar to a basecase QxM -multiplication, differing in fact only in the extra multiply and divide -for each of the Q quotient limbs. - - -File: gmp.info, Node: Divide and Conquer Division, Next: Block-Wise Barrett Division, Prev: Basecase Division, Up: Division Algorithms - -16.2.3 Divide and Conquer Division ----------------------------------- - -For divisors larger than `DC_DIV_QR_THRESHOLD', division is done by -dividing. Or to be precise by a recursive divide and conquer algorithm -based on work by Moenck and Borodin, Jebelean, and Burnikel and Ziegler -(*note References::). - - The algorithm consists essentially of recognising that a 2NxN -division can be done with the basecase division algorithm (*note -Basecase Division::), but using N/2 limbs as a base, not just a single -limb. This way the multiplications that arise are (N/2)x(N/2) and can -take advantage of Karatsuba and higher multiplication algorithms (*note -Multiplication Algorithms::). The two "digits" of the quotient are -formed by recursive Nx(N/2) divisions. - - If the (N/2)x(N/2) multiplies are done with a basecase multiplication -then the work is about the same as a basecase division, but with more -function call overheads and with some subtractions separated from the -multiplies. These overheads mean that it's only when N/2 is above -`MUL_TOOM22_THRESHOLD' that divide and conquer is of use. - - `DC_DIV_QR_THRESHOLD' is based on the divisor size N, so it will be -somewhere above twice `MUL_TOOM22_THRESHOLD', but how much above -depends on the CPU. An optimized `mpn_mul_basecase' can lower -`DC_DIV_QR_THRESHOLD' a little by offering a ready-made advantage over -repeated `mpn_submul_1' calls. - - Divide and conquer is asymptotically O(M(N)*log(N)) where M(N) is -the time for an NxN multiplication done with FFTs. The actual time is -a sum over multiplications of the recursed sizes, as can be seen near -the end of section 2.2 of Burnikel and Ziegler. For example, within -the Toom-3 range, divide and conquer is 2.63*M(N). With higher -algorithms the M(N) term improves and the multiplier tends to log(N). -In practice, at moderate to large sizes, a 2NxN division is about 2 to -4 times slower than an NxN multiplication. - - -File: gmp.info, Node: Block-Wise Barrett Division, Next: Exact Division, Prev: Divide and Conquer Division, Up: Division Algorithms - -16.2.4 Block-Wise Barrett Division ----------------------------------- - -For the largest divisions, a block-wise Barrett division algorithm is -used. Here, the divisor is inverted to a precision determined by the -relative size of the dividend and divisor. Blocks of quotient limbs -are then generated by multiplying blocks from the dividend by the -inverse. - - Our block-wise algorithm computes a smaller inverse than in the -plain Barrett algorithm. For a 2n/n division, the inverse will be just -ceil(n/2) limbs. - - -File: gmp.info, Node: Exact Division, Next: Exact Remainder, Prev: Block-Wise Barrett Division, Up: Division Algorithms - -16.2.5 Exact Division ---------------------- - -A so-called exact division is when the dividend is known to be an exact -multiple of the divisor. Jebelean's exact division algorithm uses this -knowledge to make some significant optimizations (*note References::). - - The idea can be illustrated in decimal for example with 368154 -divided by 543. Because the low digit of the dividend is 4, the low -digit of the quotient must be 8. This is arrived at from 4*7 mod 10, -using the fact 7 is the modular inverse of 3 (the low digit of the -divisor), since 3*7 == 1 mod 10. So 8*543=4344 can be subtracted from -the dividend leaving 363810. Notice the low digit has become zero. - - The procedure is repeated at the second digit, with the next -quotient digit 7 (7 == 1*7 mod 10), subtracting 7*543=3801, leaving -325800. And finally at the third digit with quotient digit 6 (8*7 mod -10), subtracting 6*543=3258 leaving 0. So the quotient is 678. - - Notice however that the multiplies and subtractions don't need to -extend past the low three digits of the dividend, since that's enough -to determine the three quotient digits. For the last quotient digit no -subtraction is needed at all. On a 2NxN division like this one, only -about half the work of a normal basecase division is necessary. - - For an NxM exact division producing Q=N-M quotient limbs, the saving -over a normal basecase division is in two parts. Firstly, each of the -Q quotient limbs needs only one multiply, not a 2x1 divide and -multiply. Secondly, the crossproducts are reduced when Q>M to -Q*M-M*(M+1)/2, or when Q<=M to Q*(Q-1)/2. Notice the savings are -complementary. If Q is big then many divisions are saved, or if Q is -small then the crossproducts reduce to a small number. - - The modular inverse used is calculated efficiently by `binvert_limb' -in `gmp-impl.h'. This does four multiplies for a 32-bit limb, or six -for a 64-bit limb. `tune/modlinv.c' has some alternate implementations -that might suit processors better at bit twiddling than multiplying. - - The sub-quadratic exact division described by Jebelean in "Exact -Division with Karatsuba Complexity" is not currently implemented. It -uses a rearrangement similar to the divide and conquer for normal -division (*note Divide and Conquer Division::), but operating from low -to high. A further possibility not currently implemented is -"Bidirectional Exact Integer Division" by Krandick and Jebelean which -forms quotient limbs from both the high and low ends of the dividend, -and can halve once more the number of crossproducts needed in a 2NxN -division. - - A special case exact division by 3 exists in `mpn_divexact_by3', -supporting Toom-3 multiplication and `mpq' canonicalizations. It forms -quotient digits with a multiply by the modular inverse of 3 (which is -`0xAA..AAB') and uses two comparisons to determine a borrow for the next -limb. The multiplications don't need to be on the dependent chain, as -long as the effect of the borrows is applied, which can help chips with -pipelined multipliers. - - -File: gmp.info, Node: Exact Remainder, Next: Small Quotient Division, Prev: Exact Division, Up: Division Algorithms - -16.2.6 Exact Remainder ----------------------- - -If the exact division algorithm is done with a full subtraction at each -stage and the dividend isn't a multiple of the divisor, then low zero -limbs are produced but with a remainder in the high limbs. For -dividend a, divisor d, quotient q, and b = 2^mp_bits_per_limb, this -remainder r is of the form - - a = q*d + r*b^n - - n represents the number of zero limbs produced by the subtractions, -that being the number of limbs produced for q. r will be in the range -0<=rb*r+u2 condition appropriately relaxed. - - -File: gmp.info, Node: Greatest Common Divisor Algorithms, Next: Powering Algorithms, Prev: Division Algorithms, Up: Algorithms - -16.3 Greatest Common Divisor -============================ - -* Menu: - -* Binary GCD:: -* Lehmer's Algorithm:: -* Subquadratic GCD:: -* Extended GCD:: -* Jacobi Symbol:: - - -File: gmp.info, Node: Binary GCD, Next: Lehmer's Algorithm, Prev: Greatest Common Divisor Algorithms, Up: Greatest Common Divisor Algorithms - -16.3.1 Binary GCD ------------------ - -At small sizes GMP uses an O(N^2) binary style GCD. This is described -in many textbooks, for example Knuth section 4.5.2 algorithm B. It -simply consists of successively reducing odd operands a and b using - - a,b = abs(a-b),min(a,b) - strip factors of 2 from a - - The Euclidean GCD algorithm, as per Knuth algorithms E and A, -repeatedly computes the quotient q = floor(a/b) and replaces a,b by v, -u - q v. The binary algorithm has so far been found to be faster than -the Euclidean algorithm everywhere. One reason the binary method does -well is that the implied quotient at each step is usually small, so -often only one or two subtractions are needed to get the same effect as -a division. Quotients 1, 2 and 3 for example occur 67.7% of the time, -see Knuth section 4.5.3 Theorem E. - - When the implied quotient is large, meaning b is much smaller than -a, then a division is worthwhile. This is the basis for the initial a -mod b reductions in `mpn_gcd' and `mpn_gcd_1' (the latter for both Nx1 -and 1x1 cases). But after that initial reduction, big quotients occur -too rarely to make it worth checking for them. - - - The final 1x1 GCD in `mpn_gcd_1' is done in the generic C code as -described above. For two N-bit operands, the algorithm takes about -0.68 iterations per bit. For optimum performance some attention needs -to be paid to the way the factors of 2 are stripped from a. - - Firstly it may be noted that in twos complement the number of low -zero bits on a-b is the same as b-a, so counting or testing can begin on -a-b without waiting for abs(a-b) to be determined. - - A loop stripping low zero bits tends not to branch predict well, -since the condition is data dependent. But on average there's only a -few low zeros, so an option is to strip one or two bits arithmetically -then loop for more (as done for AMD K6). Or use a lookup table to get -a count for several bits then loop for more (as done for AMD K7). An -alternative approach is to keep just one of a or b odd and iterate - - a,b = abs(a-b), min(a,b) - a = a/2 if even - b = b/2 if even - - This requires about 1.25 iterations per bit, but stripping of a -single bit at each step avoids any branching. Repeating the bit strip -reduces to about 0.9 iterations per bit, which may be a worthwhile -tradeoff. - - Generally with the above approaches a speed of perhaps 6 cycles per -bit can be achieved, which is still not terribly fast with for instance -a 64-bit GCD taking nearly 400 cycles. It's this sort of time which -means it's not usually advantageous to combine a set of divisibility -tests into a GCD. - - Currently, the binary algorithm is used for GCD only when N < 3. - - -File: gmp.info, Node: Lehmer's Algorithm, Next: Subquadratic GCD, Prev: Binary GCD, Up: Greatest Common Divisor Algorithms - -16.3.2 Lehmer's algorithm -------------------------- - -Lehmer's improvement of the Euclidean algorithms is based on the -observation that the initial part of the quotient sequence depends only -on the most significant parts of the inputs. The variant of Lehmer's -algorithm used in GMP splits off the most significant two limbs, as -suggested, e.g., in "A Double-Digit Lehmer-Euclid Algorithm" by -Jebelean (*note References::). The quotients of two double-limb inputs -are collected as a 2 by 2 matrix with single-limb elements. This is -done by the function `mpn_hgcd2'. The resulting matrix is applied to -the inputs using `mpn_mul_1' and `mpn_submul_1'. Each iteration usually -reduces the inputs by almost one limb. In the rare case of a large -quotient, no progress can be made by examining just the most -significant two limbs, and the quotient is computing using plain -division. - - The resulting algorithm is asymptotically O(N^2), just as the -Euclidean algorithm and the binary algorithm. The quadratic part of the -work are the calls to `mpn_mul_1' and `mpn_submul_1'. For small sizes, -the linear work is also significant. There are roughly N calls to the -`mpn_hgcd2' function. This function uses a couple of important -optimizations: - - * It uses the same relaxed notion of correctness as `mpn_hgcd' (see - next section). This means that when called with the most - significant two limbs of two large numbers, the returned matrix - does not always correspond exactly to the initial quotient - sequence for the two large numbers; the final quotient may - sometimes be one off. - - * It takes advantage of the fact the quotients are usually small. - The division operator is not used, since the corresponding - assembler instruction is very slow on most architectures. (This - code could probably be improved further, it uses many branches - that are unfriendly to prediction). - - * It switches from double-limb calculations to single-limb - calculations half-way through, when the input numbers have been - reduced in size from two limbs to one and a half. - - - -File: gmp.info, Node: Subquadratic GCD, Next: Extended GCD, Prev: Lehmer's Algorithm, Up: Greatest Common Divisor Algorithms - -16.3.3 Subquadratic GCD ------------------------ - -For inputs larger than `GCD_DC_THRESHOLD', GCD is computed via the HGCD -(Half GCD) function, as a generalization to Lehmer's algorithm. - - Let the inputs a,b be of size N limbs each. Put S = floor(N/2) + 1. -Then HGCD(a,b) returns a transformation matrix T with non-negative -elements, and reduced numbers (c;d) = T^-1 (a;b). The reduced numbers -c,d must be larger than S limbs, while their difference abs(c-d) must -fit in S limbs. The matrix elements will also be of size roughly N/2. - - The HGCD base case uses Lehmer's algorithm, but with the above stop -condition that returns reduced numbers and the corresponding -transformation matrix half-way through. For inputs larger than -`HGCD_THRESHOLD', HGCD is computed recursively, using the divide and -conquer algorithm in "On Scho"nhage's algorithm and subquadratic -integer GCD computation" by Mo"ller (*note References::). The recursive -algorithm consists of these main steps. - - * Call HGCD recursively, on the most significant N/2 limbs. Apply the - resulting matrix T_1 to the full numbers, reducing them to a size - just above 3N/2. - - * Perform a small number of division or subtraction steps to reduce - the numbers to size below 3N/2. This is essential mainly for the - unlikely case of large quotients. - - * Call HGCD recursively, on the most significant N/2 limbs of the - reduced numbers. Apply the resulting matrix T_2 to the full - numbers, reducing them to a size just above N/2. - - * Compute T = T_1 T_2. - - * Perform a small number of division and subtraction steps to - satisfy the requirements, and return. - - GCD is then implemented as a loop around HGCD, similarly to Lehmer's -algorithm. Where Lehmer repeatedly chops off the top two limbs, calls -`mpn_hgcd2', and applies the resulting matrix to the full numbers, the -subquadratic GCD chops off the most significant third of the limbs (the -proportion is a tuning parameter, and 1/3 seems to be more efficient -than, e.g, 1/2), calls `mpn_hgcd', and applies the resulting matrix. -Once the input numbers are reduced to size below `GCD_DC_THRESHOLD', -Lehmer's algorithm is used for the rest of the work. - - The asymptotic running time of both HGCD and GCD is O(M(N)*log(N)), -where M(N) is the time for multiplying two N-limb numbers. - - -File: gmp.info, Node: Extended GCD, Next: Jacobi Symbol, Prev: Subquadratic GCD, Up: Greatest Common Divisor Algorithms - -16.3.4 Extended GCD -------------------- - -The extended GCD function, or GCDEXT, calculates gcd(a,b) and also -cofactors x and y satisfying a*x+b*y=gcd(a,b). All the algorithms used -for plain GCD are extended to handle this case. The binary algorithm is -used only for single-limb GCDEXT. Lehmer's algorithm is used for sizes -up to `GCDEXT_DC_THRESHOLD'. Above this threshold, GCDEXT is -implemented as a loop around HGCD, but with more book-keeping to keep -track of the cofactors. This gives the same asymptotic running time as -for GCD and HGCD, O(M(N)*log(N)) - - One difference to plain GCD is that while the inputs a and b are -reduced as the algorithm proceeds, the cofactors x and y grow in size. -This makes the tuning of the chopping-point more difficult. The current -code chops off the most significant half of the inputs for the call to -HGCD in the first iteration, and the most significant two thirds for -the remaining calls. This strategy could surely be improved. Also the -stop condition for the loop, where Lehmer's algorithm is invoked once -the inputs are reduced below `GCDEXT_DC_THRESHOLD', could maybe be -improved by taking into account the current size of the cofactors. - - -File: gmp.info, Node: Jacobi Symbol, Prev: Extended GCD, Up: Greatest Common Divisor Algorithms - -16.3.5 Jacobi Symbol --------------------- - -`mpz_jacobi' and `mpz_kronecker' are currently implemented with a -simple binary algorithm similar to that described for the GCDs (*note -Binary GCD::). They're not very fast when both inputs are large. -Lehmer's multi-step improvement or a binary based multi-step algorithm -is likely to be better. - - When one operand fits a single limb, and that includes -`mpz_kronecker_ui' and friends, an initial reduction is done with -either `mpn_mod_1' or `mpn_modexact_1_odd', followed by the binary -algorithm on a single limb. The binary algorithm is well suited to a -single limb, and the whole calculation in this case is quite efficient. - - In all the routines sign changes for the result are accumulated -using some bit twiddling, avoiding table lookups or conditional jumps. - diff --git a/misc/builddeps/dp.linux64/share/info/gmp.info-2 b/misc/builddeps/dp.linux64/share/info/gmp.info-2 deleted file mode 100644 index 45846232..00000000 --- a/misc/builddeps/dp.linux64/share/info/gmp.info-2 +++ /dev/null @@ -1,3489 +0,0 @@ -This is ../../gmp/doc/gmp.info, produced by makeinfo version 4.8 from -../../gmp/doc/gmp.texi. - - This manual describes how to install and use the GNU multiple -precision arithmetic library, version 5.0.1. - - Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free -Software Foundation, Inc. - - Permission is granted to copy, distribute and/or modify this -document under the terms of the GNU Free Documentation License, Version -1.3 or any later version published by the Free Software Foundation; -with no Invariant Sections, with the Front-Cover Texts being "A GNU -Manual", and with the Back-Cover Texts being "You have freedom to copy -and modify this GNU Manual, like GNU software". A copy of the license -is included in *Note GNU Free Documentation License::. - -INFO-DIR-SECTION GNU libraries -START-INFO-DIR-ENTRY -* gmp: (gmp). GNU Multiple Precision Arithmetic Library. -END-INFO-DIR-ENTRY - - -File: gmp.info, Node: Powering Algorithms, Next: Root Extraction Algorithms, Prev: Greatest Common Divisor Algorithms, Up: Algorithms - -16.4 Powering Algorithms -======================== - -* Menu: - -* Normal Powering Algorithm:: -* Modular Powering Algorithm:: - - -File: gmp.info, Node: Normal Powering Algorithm, Next: Modular Powering Algorithm, Prev: Powering Algorithms, Up: Powering Algorithms - -16.4.1 Normal Powering ----------------------- - -Normal `mpz' or `mpf' powering uses a simple binary algorithm, -successively squaring and then multiplying by the base when a 1 bit is -seen in the exponent, as per Knuth section 4.6.3. The "left to right" -variant described there is used rather than algorithm A, since it's -just as easy and can be done with somewhat less temporary memory. - - -File: gmp.info, Node: Modular Powering Algorithm, Prev: Normal Powering Algorithm, Up: Powering Algorithms - -16.4.2 Modular Powering ------------------------ - -Modular powering is implemented using a 2^k-ary sliding window -algorithm, as per "Handbook of Applied Cryptography" algorithm 14.85 -(*note References::). k is chosen according to the size of the -exponent. Larger exponents use larger values of k, the choice being -made to minimize the average number of multiplications that must -supplement the squaring. - - The modular multiplies and squares use either a simple division or -the REDC method by Montgomery (*note References::). REDC is a little -faster, essentially saving N single limb divisions in a fashion similar -to an exact remainder (*note Exact Remainder::). - - -File: gmp.info, Node: Root Extraction Algorithms, Next: Radix Conversion Algorithms, Prev: Powering Algorithms, Up: Algorithms - -16.5 Root Extraction Algorithms -=============================== - -* Menu: - -* Square Root Algorithm:: -* Nth Root Algorithm:: -* Perfect Square Algorithm:: -* Perfect Power Algorithm:: - - -File: gmp.info, Node: Square Root Algorithm, Next: Nth Root Algorithm, Prev: Root Extraction Algorithms, Up: Root Extraction Algorithms - -16.5.1 Square Root ------------------- - -Square roots are taken using the "Karatsuba Square Root" algorithm by -Paul Zimmermann (*note References::). - - An input n is split into four parts of k bits each, so with b=2^k we -have n = a3*b^3 + a2*b^2 + a1*b + a0. Part a3 must be "normalized" so -that either the high or second highest bit is set. In GMP, k is kept -on a limb boundary and the input is left shifted (by an even number of -bits) to normalize. - - The square root of the high two parts is taken, by recursive -application of the algorithm (bottoming out in a one-limb Newton's -method), - - s1,r1 = sqrtrem (a3*b + a2) - - This is an approximation to the desired root and is extended by a -division to give s,r, - - q,u = divrem (r1*b + a1, 2*s1) - s = s1*b + q - r = u*b + a0 - q^2 - - The normalization requirement on a3 means at this point s is either -correct or 1 too big. r is negative in the latter case, so - - if r < 0 then - r = r + 2*s - 1 - s = s - 1 - - The algorithm is expressed in a divide and conquer form, but as -noted in the paper it can also be viewed as a discrete variant of -Newton's method, or as a variation on the schoolboy method (no longer -taught) for square roots two digits at a time. - - If the remainder r is not required then usually only a few high limbs -of r and u need to be calculated to determine whether an adjustment to -s is required. This optimization is not currently implemented. - - In the Karatsuba multiplication range this algorithm is -O(1.5*M(N/2)), where M(n) is the time to multiply two numbers of n -limbs. In the FFT multiplication range this grows to a bound of -O(6*M(N/2)). In practice a factor of about 1.5 to 1.8 is found in the -Karatsuba and Toom-3 ranges, growing to 2 or 3 in the FFT range. - - The algorithm does all its calculations in integers and the resulting -`mpn_sqrtrem' is used for both `mpz_sqrt' and `mpf_sqrt'. The extended -precision given by `mpf_sqrt_ui' is obtained by padding with zero limbs. - - -File: gmp.info, Node: Nth Root Algorithm, Next: Perfect Square Algorithm, Prev: Square Root Algorithm, Up: Root Extraction Algorithms - -16.5.2 Nth Root ---------------- - -Integer Nth roots are taken using Newton's method with the following -iteration, where A is the input and n is the root to be taken. - - 1 A - a[i+1] = - * ( --------- + (n-1)*a[i] ) - n a[i]^(n-1) - - The initial approximation a[1] is generated bitwise by successively -powering a trial root with or without new 1 bits, aiming to be just -above the true root. The iteration converges quadratically when -started from a good approximation. When n is large more initial bits -are needed to get good convergence. The current implementation is not -particularly well optimized. - - -File: gmp.info, Node: Perfect Square Algorithm, Next: Perfect Power Algorithm, Prev: Nth Root Algorithm, Up: Root Extraction Algorithms - -16.5.3 Perfect Square ---------------------- - -A significant fraction of non-squares can be quickly identified by -checking whether the input is a quadratic residue modulo small integers. - - `mpz_perfect_square_p' first tests the input mod 256, which means -just examining the low byte. Only 44 different values occur for -squares mod 256, so 82.8% of inputs can be immediately identified as -non-squares. - - On a 32-bit system similar tests are done mod 9, 5, 7, 13 and 17, -for a total 99.25% of inputs identified as non-squares. On a 64-bit -system 97 is tested too, for a total 99.62%. - - These moduli are chosen because they're factors of 2^24-1 (or 2^48-1 -for 64-bits), and such a remainder can be quickly taken just using -additions (see `mpn_mod_34lsub1'). - - When nails are in use moduli are instead selected by the `gen-psqr.c' -program and applied with an `mpn_mod_1'. The same 2^24-1 or 2^48-1 -could be done with nails using some extra bit shifts, but this is not -currently implemented. - - In any case each modulus is applied to the `mpn_mod_34lsub1' or -`mpn_mod_1' remainder and a table lookup identifies non-squares. By -using a "modexact" style calculation, and suitably permuted tables, -just one multiply each is required, see the code for details. Moduli -are also combined to save operations, so long as the lookup tables -don't become too big. `gen-psqr.c' does all the pre-calculations. - - A square root must still be taken for any value that passes these -tests, to verify it's really a square and not one of the small fraction -of non-squares that get through (ie. a pseudo-square to all the tested -bases). - - Clearly more residue tests could be done, `mpz_perfect_square_p' only -uses a compact and efficient set. Big inputs would probably benefit -from more residue testing, small inputs might be better off with less. -The assumed distribution of squares versus non-squares in the input -would affect such considerations. - - -File: gmp.info, Node: Perfect Power Algorithm, Prev: Perfect Square Algorithm, Up: Root Extraction Algorithms - -16.5.4 Perfect Power --------------------- - -Detecting perfect powers is required by some factorization algorithms. -Currently `mpz_perfect_power_p' is implemented using repeated Nth root -extractions, though naturally only prime roots need to be considered. -(*Note Nth Root Algorithm::.) - - If a prime divisor p with multiplicity e can be found, then only -roots which are divisors of e need to be considered, much reducing the -work necessary. To this end divisibility by a set of small primes is -checked. - - -File: gmp.info, Node: Radix Conversion Algorithms, Next: Other Algorithms, Prev: Root Extraction Algorithms, Up: Algorithms - -16.6 Radix Conversion -===================== - -Radix conversions are less important than other algorithms. A program -dominated by conversions should probably use a different data -representation. - -* Menu: - -* Binary to Radix:: -* Radix to Binary:: - - -File: gmp.info, Node: Binary to Radix, Next: Radix to Binary, Prev: Radix Conversion Algorithms, Up: Radix Conversion Algorithms - -16.6.1 Binary to Radix ----------------------- - -Conversions from binary to a power-of-2 radix use a simple and fast -O(N) bit extraction algorithm. - - Conversions from binary to other radices use one of two algorithms. -Sizes below `GET_STR_PRECOMPUTE_THRESHOLD' use a basic O(N^2) method. -Repeated divisions by b^n are made, where b is the radix and n is the -biggest power that fits in a limb. But instead of simply using the -remainder r from such divisions, an extra divide step is done to give a -fractional limb representing r/b^n. The digits of r can then be -extracted using multiplications by b rather than divisions. Special -case code is provided for decimal, allowing multiplications by 10 to -optimize to shifts and adds. - - Above `GET_STR_PRECOMPUTE_THRESHOLD' a sub-quadratic algorithm is -used. For an input t, powers b^(n*2^i) of the radix are calculated, -until a power between t and sqrt(t) is reached. t is then divided by -that largest power, giving a quotient which is the digits above that -power, and a remainder which is those below. These two parts are in -turn divided by the second highest power, and so on recursively. When -a piece has been divided down to less than `GET_STR_DC_THRESHOLD' -limbs, the basecase algorithm described above is used. - - The advantage of this algorithm is that big divisions can make use -of the sub-quadratic divide and conquer division (*note Divide and -Conquer Division::), and big divisions tend to have less overheads than -lots of separate single limb divisions anyway. But in any case the -cost of calculating the powers b^(n*2^i) must first be overcome. - - `GET_STR_PRECOMPUTE_THRESHOLD' and `GET_STR_DC_THRESHOLD' represent -the same basic thing, the point where it becomes worth doing a big -division to cut the input in half. `GET_STR_PRECOMPUTE_THRESHOLD' -includes the cost of calculating the radix power required, whereas -`GET_STR_DC_THRESHOLD' assumes that's already available, which is the -case when recursing. - - Since the base case produces digits from least to most significant -but they want to be stored from most to least, it's necessary to -calculate in advance how many digits there will be, or at least be sure -not to underestimate that. For GMP the number of input bits is -multiplied by `chars_per_bit_exactly' from `mp_bases', rounding up. -The result is either correct or one too big. - - Examining some of the high bits of the input could increase the -chance of getting the exact number of digits, but an exact result every -time would not be practical, since in general the difference between -numbers 100... and 99... is only in the last few bits and the work to -identify 99... might well be almost as much as a full conversion. - - `mpf_get_str' doesn't currently use the algorithm described here, it -multiplies or divides by a power of b to move the radix point to the -just above the highest non-zero digit (or at worst one above that -location), then multiplies by b^n to bring out digits. This is O(N^2) -and is certainly not optimal. - - The r/b^n scheme described above for using multiplications to bring -out digits might be useful for more than a single limb. Some brief -experiments with it on the base case when recursing didn't give a -noticeable improvement, but perhaps that was only due to the -implementation. Something similar would work for the sub-quadratic -divisions too, though there would be the cost of calculating a bigger -radix power. - - Another possible improvement for the sub-quadratic part would be to -arrange for radix powers that balanced the sizes of quotient and -remainder produced, ie. the highest power would be an b^(n*k) -approximately equal to sqrt(t), not restricted to a 2^i factor. That -ought to smooth out a graph of times against sizes, but may or may not -be a net speedup. - - -File: gmp.info, Node: Radix to Binary, Prev: Binary to Radix, Up: Radix Conversion Algorithms - -16.6.2 Radix to Binary ----------------------- - -*This section needs to be rewritten, it currently describes the -algorithms used before GMP 4.3.* - - Conversions from a power-of-2 radix into binary use a simple and fast -O(N) bitwise concatenation algorithm. - - Conversions from other radices use one of two algorithms. Sizes -below `SET_STR_PRECOMPUTE_THRESHOLD' use a basic O(N^2) method. Groups -of n digits are converted to limbs, where n is the biggest power of the -base b which will fit in a limb, then those groups are accumulated into -the result by multiplying by b^n and adding. This saves -multi-precision operations, as per Knuth section 4.4 part E (*note -References::). Some special case code is provided for decimal, giving -the compiler a chance to optimize multiplications by 10. - - Above `SET_STR_PRECOMPUTE_THRESHOLD' a sub-quadratic algorithm is -used. First groups of n digits are converted into limbs. Then adjacent -limbs are combined into limb pairs with x*b^n+y, where x and y are the -limbs. Adjacent limb pairs are combined into quads similarly with -x*b^(2n)+y. This continues until a single block remains, that being -the result. - - The advantage of this method is that the multiplications for each x -are big blocks, allowing Karatsuba and higher algorithms to be used. -But the cost of calculating the powers b^(n*2^i) must be overcome. -`SET_STR_PRECOMPUTE_THRESHOLD' usually ends up quite big, around 5000 -digits, and on some processors much bigger still. - - `SET_STR_PRECOMPUTE_THRESHOLD' is based on the input digits (and -tuned for decimal), though it might be better based on a limb count, so -as to be independent of the base. But that sort of count isn't used by -the base case and so would need some sort of initial calculation or -estimate. - - The main reason `SET_STR_PRECOMPUTE_THRESHOLD' is so much bigger -than the corresponding `GET_STR_PRECOMPUTE_THRESHOLD' is that -`mpn_mul_1' is much faster than `mpn_divrem_1' (often by a factor of 5, -or more). - - -File: gmp.info, Node: Other Algorithms, Next: Assembly Coding, Prev: Radix Conversion Algorithms, Up: Algorithms - -16.7 Other Algorithms -===================== - -* Menu: - -* Prime Testing Algorithm:: -* Factorial Algorithm:: -* Binomial Coefficients Algorithm:: -* Fibonacci Numbers Algorithm:: -* Lucas Numbers Algorithm:: -* Random Number Algorithms:: - - -File: gmp.info, Node: Prime Testing Algorithm, Next: Factorial Algorithm, Prev: Other Algorithms, Up: Other Algorithms - -16.7.1 Prime Testing --------------------- - -The primality testing in `mpz_probab_prime_p' (*note Number Theoretic -Functions::) first does some trial division by small factors and then -uses the Miller-Rabin probabilistic primality testing algorithm, as -described in Knuth section 4.5.4 algorithm P (*note References::). - - For an odd input n, and with n = q*2^k+1 where q is odd, this -algorithm selects a random base x and tests whether x^q mod n is 1 or --1, or an x^(q*2^j) mod n is 1, for 1<=j<=k. If so then n is probably -prime, if not then n is definitely composite. - - Any prime n will pass the test, but some composites do too. Such -composites are known as strong pseudoprimes to base x. No n is a -strong pseudoprime to more than 1/4 of all bases (see Knuth exercise -22), hence with x chosen at random there's no more than a 1/4 chance a -"probable prime" will in fact be composite. - - In fact strong pseudoprimes are quite rare, making the test much more -powerful than this analysis would suggest, but 1/4 is all that's proven -for an arbitrary n. - - -File: gmp.info, Node: Factorial Algorithm, Next: Binomial Coefficients Algorithm, Prev: Prime Testing Algorithm, Up: Other Algorithms - -16.7.2 Factorial ----------------- - -Factorials are calculated by a combination of removal of twos, -powering, and binary splitting. The procedure can be best illustrated -with an example, - - 23! = 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23 - -has factors of two removed, - - 23! = 2^19.1.1.3.1.5.3.7.1.9.5.11.3.13.7.15.1.17.9.19.5.21.11.23 - -and the resulting terms collected up according to their multiplicity, - - 23! = 2^19.(3.5)^3.(7.9.11)^2.(13.15.17.19.21.23) - - Each sequence such as 13.15.17.19.21.23 is evaluated by splitting -into every second term, as for instance (13.17.21).(15.19.23), and the -same recursively on each half. This is implemented iteratively using -some bit twiddling. - - Such splitting is more efficient than repeated Nx1 multiplies since -it forms big multiplies, allowing Karatsuba and higher algorithms to be -used. And even below the Karatsuba threshold a big block of work can -be more efficient for the basecase algorithm. - - Splitting into subsequences of every second term keeps the resulting -products more nearly equal in size than would the simpler approach of -say taking the first half and second half of the sequence. Nearly -equal products are more efficient for the current multiply -implementation. - - -File: gmp.info, Node: Binomial Coefficients Algorithm, Next: Fibonacci Numbers Algorithm, Prev: Factorial Algorithm, Up: Other Algorithms - -16.7.3 Binomial Coefficients ----------------------------- - -Binomial coefficients C(n,k) are calculated by first arranging k <= n/2 -using C(n,k) = C(n,n-k) if necessary, and then evaluating the following -product simply from i=2 to i=k. - - k (n-k+i) - C(n,k) = (n-k+1) * prod ------- - i=2 i - - It's easy to show that each denominator i will divide the product so -far, so the exact division algorithm is used (*note Exact Division::). - - The numerators n-k+i and denominators i are first accumulated into -as many fit a limb, to save multi-precision operations, though for -`mpz_bin_ui' this applies only to the divisors, since n is an `mpz_t' -and n-k+i in general won't fit in a limb at all. - - -File: gmp.info, Node: Fibonacci Numbers Algorithm, Next: Lucas Numbers Algorithm, Prev: Binomial Coefficients Algorithm, Up: Other Algorithms - -16.7.4 Fibonacci Numbers ------------------------- - -The Fibonacci functions `mpz_fib_ui' and `mpz_fib2_ui' are designed for -calculating isolated F[n] or F[n],F[n-1] values efficiently. - - For small n, a table of single limb values in `__gmp_fib_table' is -used. On a 32-bit limb this goes up to F[47], or on a 64-bit limb up -to F[93]. For convenience the table starts at F[-1]. - - Beyond the table, values are generated with a binary powering -algorithm, calculating a pair F[n] and F[n-1] working from high to low -across the bits of n. The formulas used are - - F[2k+1] = 4*F[k]^2 - F[k-1]^2 + 2*(-1)^k - F[2k-1] = F[k]^2 + F[k-1]^2 - - F[2k] = F[2k+1] - F[2k-1] - - At each step, k is the high b bits of n. If the next bit of n is 0 -then F[2k],F[2k-1] is used, or if it's a 1 then F[2k+1],F[2k] is used, -and the process repeated until all bits of n are incorporated. Notice -these formulas require just two squares per bit of n. - - It'd be possible to handle the first few n above the single limb -table with simple additions, using the defining Fibonacci recurrence -F[k+1]=F[k]+F[k-1], but this is not done since it usually turns out to -be faster for only about 10 or 20 values of n, and including a block of -code for just those doesn't seem worthwhile. If they really mattered -it'd be better to extend the data table. - - Using a table avoids lots of calculations on small numbers, and -makes small n go fast. A bigger table would make more small n go fast, -it's just a question of balancing size against desired speed. For GMP -the code is kept compact, with the emphasis primarily on a good -powering algorithm. - - `mpz_fib2_ui' returns both F[n] and F[n-1], but `mpz_fib_ui' is only -interested in F[n]. In this case the last step of the algorithm can -become one multiply instead of two squares. One of the following two -formulas is used, according as n is odd or even. - - F[2k] = F[k]*(F[k]+2F[k-1]) - - F[2k+1] = (2F[k]+F[k-1])*(2F[k]-F[k-1]) + 2*(-1)^k - - F[2k+1] here is the same as above, just rearranged to be a multiply. -For interest, the 2*(-1)^k term both here and above can be applied -just to the low limb of the calculation, without a carry or borrow into -further limbs, which saves some code size. See comments with -`mpz_fib_ui' and the internal `mpn_fib2_ui' for how this is done. - - -File: gmp.info, Node: Lucas Numbers Algorithm, Next: Random Number Algorithms, Prev: Fibonacci Numbers Algorithm, Up: Other Algorithms - -16.7.5 Lucas Numbers --------------------- - -`mpz_lucnum2_ui' derives a pair of Lucas numbers from a pair of -Fibonacci numbers with the following simple formulas. - - L[k] = F[k] + 2*F[k-1] - L[k-1] = 2*F[k] - F[k-1] - - `mpz_lucnum_ui' is only interested in L[n], and some work can be -saved. Trailing zero bits on n can be handled with a single square -each. - - L[2k] = L[k]^2 - 2*(-1)^k - - And the lowest 1 bit can be handled with one multiply of a pair of -Fibonacci numbers, similar to what `mpz_fib_ui' does. - - L[2k+1] = 5*F[k-1]*(2*F[k]+F[k-1]) - 4*(-1)^k - - -File: gmp.info, Node: Random Number Algorithms, Prev: Lucas Numbers Algorithm, Up: Other Algorithms - -16.7.6 Random Numbers ---------------------- - -For the `urandomb' functions, random numbers are generated simply by -concatenating bits produced by the generator. As long as the generator -has good randomness properties this will produce well-distributed N bit -numbers. - - For the `urandomm' functions, random numbers in a range 0<=R48 bit pieces is convenient. With -some care though six 21x32->53 bit products can be used, if one of the -lower two 21-bit pieces also uses the sign bit. - - For the `mpn_mul_1' family of functions on a 64-bit machine, the -invariant single limb is split at the start, into 3 or 4 pieces. -Inside the loop, the bignum operand is split into 32-bit pieces. Fast -conversion of these unsigned 32-bit pieces to floating point is highly -machine-dependent. In some cases, reading the data into the integer -unit, zero-extending to 64-bits, then transferring to the floating -point unit back via memory is the only option. - - Converting partial products back to 64-bit limbs is usually best -done as a signed conversion. Since all values are smaller than 2^53, -signed and unsigned are the same, but most processors lack unsigned -conversions. - - - - Here is a diagram showing 16x32 bit products for an `mpn_mul_1' or -`mpn_addmul_1' with a 64-bit limb. The single limb operand V is split -into four 16-bit parts. The multi-limb operand U is split in the loop -into two 32-bit parts. - - +---+---+---+---+ - |v48|v32|v16|v00| V operand - +---+---+---+---+ - - +-------+---+---+ - x | u32 | u00 | U operand (one limb) - +---------------+ - - --------------------------------- - - +-----------+ - | u00 x v00 | p00 48-bit products - +-----------+ - +-----------+ - | u00 x v16 | p16 - +-----------+ - +-----------+ - | u00 x v32 | p32 - +-----------+ - +-----------+ - | u00 x v48 | p48 - +-----------+ - +-----------+ - | u32 x v00 | r32 - +-----------+ - +-----------+ - | u32 x v16 | r48 - +-----------+ - +-----------+ - | u32 x v32 | r64 - +-----------+ - +-----------+ - | u32 x v48 | r80 - +-----------+ - - p32 and r32 can be summed using floating-point addition, and -likewise p48 and r48. p00 and p16 can be summed with r64 and r80 from -the previous iteration. - - For each loop then, four 49-bit quantities are transferred to the -integer unit, aligned as follows, - - |-----64bits----|-----64bits----| - +------------+ - | p00 + r64' | i00 - +------------+ - +------------+ - | p16 + r80' | i16 - +------------+ - +------------+ - | p32 + r32 | i32 - +------------+ - +------------+ - | p48 + r48 | i48 - +------------+ - - The challenge then is to sum these efficiently and add in a carry -limb, generating a low 64-bit result limb and a high 33-bit carry limb -(i48 extends 33 bits into the high half). - - -File: gmp.info, Node: Assembly SIMD Instructions, Next: Assembly Software Pipelining, Prev: Assembly Floating Point, Up: Assembly Coding - -16.8.7 SIMD Instructions ------------------------- - -The single-instruction multiple-data support in current microprocessors -is aimed at signal processing algorithms where each data point can be -treated more or less independently. There's generally not much support -for propagating the sort of carries that arise in GMP. - - SIMD multiplications of say four 16x16 bit multiplies only do as much -work as one 32x32 from GMP's point of view, and need some shifts and -adds besides. But of course if say the SIMD form is fully pipelined -and uses less instruction decoding then it may still be worthwhile. - - On the x86 chips, MMX has so far found a use in `mpn_rshift' and -`mpn_lshift', and is used in a special case for 16-bit multipliers in -the P55 `mpn_mul_1'. SSE2 is used for Pentium 4 `mpn_mul_1', -`mpn_addmul_1', and `mpn_submul_1'. - - -File: gmp.info, Node: Assembly Software Pipelining, Next: Assembly Loop Unrolling, Prev: Assembly SIMD Instructions, Up: Assembly Coding - -16.8.8 Software Pipelining --------------------------- - -Software pipelining consists of scheduling instructions around the -branch point in a loop. For example a loop might issue a load not for -use in the present iteration but the next, thereby allowing extra -cycles for the data to arrive from memory. - - Naturally this is wanted only when doing things like loads or -multiplies that take several cycles to complete, and only where a CPU -has multiple functional units so that other work can be done in the -meantime. - - A pipeline with several stages will have a data value in progress at -each stage and each loop iteration moves them along one stage. This is -like juggling. - - If the latency of some instruction is greater than the loop time -then it will be necessary to unroll, so one register has a result ready -to use while another (or multiple others) are still in progress. -(*note Assembly Loop Unrolling::). - - -File: gmp.info, Node: Assembly Loop Unrolling, Next: Assembly Writing Guide, Prev: Assembly Software Pipelining, Up: Assembly Coding - -16.8.9 Loop Unrolling ---------------------- - -Loop unrolling consists of replicating code so that several limbs are -processed in each loop. At a minimum this reduces loop overheads by a -corresponding factor, but it can also allow better register usage, for -example alternately using one register combination and then another. -Judicious use of `m4' macros can help avoid lots of duplication in the -source code. - - Any amount of unrolling can be handled with a loop counter that's -decremented by N each time, stopping when the remaining count is less -than the further N the loop will process. Or by subtracting N at the -start, the termination condition becomes when the counter C is less -than 0 (and the count of remaining limbs is C+N). - - Alternately for a power of 2 unroll the loop count and remainder can -be established with a shift and mask. This is convenient if also -making a computed jump into the middle of a large loop. - - The limbs not a multiple of the unrolling can be handled in various -ways, for example - - * A simple loop at the end (or the start) to process the excess. - Care will be wanted that it isn't too much slower than the - unrolled part. - - * A set of binary tests, for example after an 8-limb unrolling, test - for 4 more limbs to process, then a further 2 more or not, and - finally 1 more or not. This will probably take more code space - than a simple loop. - - * A `switch' statement, providing separate code for each possible - excess, for example an 8-limb unrolling would have separate code - for 0 remaining, 1 remaining, etc, up to 7 remaining. This might - take a lot of code, but may be the best way to optimize all cases - in combination with a deep pipelined loop. - - * A computed jump into the middle of the loop, thus making the first - iteration handle the excess. This should make times smoothly - increase with size, which is attractive, but setups for the jump - and adjustments for pointers can be tricky and could become quite - difficult in combination with deep pipelining. - - -File: gmp.info, Node: Assembly Writing Guide, Prev: Assembly Loop Unrolling, Up: Assembly Coding - -16.8.10 Writing Guide ---------------------- - -This is a guide to writing software pipelined loops for processing limb -vectors in assembly. - - First determine the algorithm and which instructions are needed. -Code it without unrolling or scheduling, to make sure it works. On a -3-operand CPU try to write each new value to a new register, this will -greatly simplify later steps. - - Then note for each instruction the functional unit and/or issue port -requirements. If an instruction can use either of two units, like U0 -or U1 then make a category "U0/U1". Count the total using each unit -(or combined unit), and count all instructions. - - Figure out from those counts the best possible loop time. The goal -will be to find a perfect schedule where instruction latencies are -completely hidden. The total instruction count might be the limiting -factor, or perhaps a particular functional unit. It might be possible -to tweak the instructions to help the limiting factor. - - Suppose the loop time is N, then make N issue buckets, with the -final loop branch at the end of the last. Now fill the buckets with -dummy instructions using the functional units desired. Run this to -make sure the intended speed is reached. - - Now replace the dummy instructions with the real instructions from -the slow but correct loop you started with. The first will typically -be a load instruction. Then the instruction using that value is placed -in a bucket an appropriate distance down. Run the loop again, to check -it still runs at target speed. - - Keep placing instructions, frequently measuring the loop. After a -few you will need to wrap around from the last bucket back to the top -of the loop. If you used the new-register for new-value strategy above -then there will be no register conflicts. If not then take care not to -clobber something already in use. Changing registers at this time is -very error prone. - - The loop will overlap two or more of the original loop iterations, -and the computation of one vector element result will be started in one -iteration of the new loop, and completed one or several iterations -later. - - The final step is to create feed-in and wind-down code for the loop. -A good way to do this is to make a copy (or copies) of the loop at the -start and delete those instructions which don't have valid antecedents, -and at the end replicate and delete those whose results are unwanted -(including any further loads). - - The loop will have a minimum number of limbs loaded and processed, -so the feed-in code must test if the request size is smaller and skip -either to a suitable part of the wind-down or to special code for small -sizes. - - -File: gmp.info, Node: Internals, Next: Contributors, Prev: Algorithms, Up: Top - -17 Internals -************ - -*This chapter is provided only for informational purposes and the -various internals described here may change in future GMP releases. -Applications expecting to be compatible with future releases should use -only the documented interfaces described in previous chapters.* - -* Menu: - -* Integer Internals:: -* Rational Internals:: -* Float Internals:: -* Raw Output Internals:: -* C++ Interface Internals:: - - -File: gmp.info, Node: Integer Internals, Next: Rational Internals, Prev: Internals, Up: Internals - -17.1 Integer Internals -====================== - -`mpz_t' variables represent integers using sign and magnitude, in space -dynamically allocated and reallocated. The fields are as follows. - -`_mp_size' - The number of limbs, or the negative of that when representing a - negative integer. Zero is represented by `_mp_size' set to zero, - in which case the `_mp_d' data is unused. - -`_mp_d' - A pointer to an array of limbs which is the magnitude. These are - stored "little endian" as per the `mpn' functions, so `_mp_d[0]' - is the least significant limb and `_mp_d[ABS(_mp_size)-1]' is the - most significant. Whenever `_mp_size' is non-zero, the most - significant limb is non-zero. - - Currently there's always at least one limb allocated, so for - instance `mpz_set_ui' never needs to reallocate, and `mpz_get_ui' - can fetch `_mp_d[0]' unconditionally (though its value is then - only wanted if `_mp_size' is non-zero). - -`_mp_alloc' - `_mp_alloc' is the number of limbs currently allocated at `_mp_d', - and naturally `_mp_alloc >= ABS(_mp_size)'. When an `mpz' routine - is about to (or might be about to) increase `_mp_size', it checks - `_mp_alloc' to see whether there's enough space, and reallocates - if not. `MPZ_REALLOC' is generally used for this. - - The various bitwise logical functions like `mpz_and' behave as if -negative values were twos complement. But sign and magnitude is always -used internally, and necessary adjustments are made during the -calculations. Sometimes this isn't pretty, but sign and magnitude are -best for other routines. - - Some internal temporary variables are setup with `MPZ_TMP_INIT' and -these have `_mp_d' space obtained from `TMP_ALLOC' rather than the -memory allocation functions. Care is taken to ensure that these are -big enough that no reallocation is necessary (since it would have -unpredictable consequences). - - `_mp_size' and `_mp_alloc' are `int', although `mp_size_t' is -usually a `long'. This is done to make the fields just 32 bits on some -64 bits systems, thereby saving a few bytes of data space but still -providing plenty of range. - - -File: gmp.info, Node: Rational Internals, Next: Float Internals, Prev: Integer Internals, Up: Internals - -17.2 Rational Internals -======================= - -`mpq_t' variables represent rationals using an `mpz_t' numerator and -denominator (*note Integer Internals::). - - The canonical form adopted is denominator positive (and non-zero), -no common factors between numerator and denominator, and zero uniquely -represented as 0/1. - - It's believed that casting out common factors at each stage of a -calculation is best in general. A GCD is an O(N^2) operation so it's -better to do a few small ones immediately than to delay and have to do -a big one later. Knowing the numerator and denominator have no common -factors can be used for example in `mpq_mul' to make only two cross -GCDs necessary, not four. - - This general approach to common factors is badly sub-optimal in the -presence of simple factorizations or little prospect for cancellation, -but GMP has no way to know when this will occur. As per *Note -Efficiency::, that's left to applications. The `mpq_t' framework might -still suit, with `mpq_numref' and `mpq_denref' for direct access to the -numerator and denominator, or of course `mpz_t' variables can be used -directly. - - -File: gmp.info, Node: Float Internals, Next: Raw Output Internals, Prev: Rational Internals, Up: Internals - -17.3 Float Internals -==================== - -Efficient calculation is the primary aim of GMP floats and the use of -whole limbs and simple rounding facilitates this. - - `mpf_t' floats have a variable precision mantissa and a single -machine word signed exponent. The mantissa is represented using sign -and magnitude. - - most least - significant significant - limb limb - - _mp_d - |---- _mp_exp ---> | - _____ _____ _____ _____ _____ - |_____|_____|_____|_____|_____| - . <------------ radix point - - <-------- _mp_size ---------> - -The fields are as follows. - -`_mp_size' - The number of limbs currently in use, or the negative of that when - representing a negative value. Zero is represented by `_mp_size' - and `_mp_exp' both set to zero, and in that case the `_mp_d' data - is unused. (In the future `_mp_exp' might be undefined when - representing zero.) - -`_mp_prec' - The precision of the mantissa, in limbs. In any calculation the - aim is to produce `_mp_prec' limbs of result (the most significant - being non-zero). - -`_mp_d' - A pointer to the array of limbs which is the absolute value of the - mantissa. These are stored "little endian" as per the `mpn' - functions, so `_mp_d[0]' is the least significant limb and - `_mp_d[ABS(_mp_size)-1]' the most significant. - - The most significant limb is always non-zero, but there are no - other restrictions on its value, in particular the highest 1 bit - can be anywhere within the limb. - - `_mp_prec+1' limbs are allocated to `_mp_d', the extra limb being - for convenience (see below). There are no reallocations during a - calculation, only in a change of precision with `mpf_set_prec'. - -`_mp_exp' - The exponent, in limbs, determining the location of the implied - radix point. Zero means the radix point is just above the most - significant limb. Positive values mean a radix point offset - towards the lower limbs and hence a value >= 1, as for example in - the diagram above. Negative exponents mean a radix point further - above the highest limb. - - Naturally the exponent can be any value, it doesn't have to fall - within the limbs as the diagram shows, it can be a long way above - or a long way below. Limbs other than those included in the - `{_mp_d,_mp_size}' data are treated as zero. - - The `_mp_size' and `_mp_prec' fields are `int', although the -`mp_size_t' type is usually a `long'. The `_mp_exp' field is usually -`long'. This is done to make some fields just 32 bits on some 64 bits -systems, thereby saving a few bytes of data space but still providing -plenty of precision and a very large range. - - -The following various points should be noted. - -Low Zeros - The least significant limbs `_mp_d[0]' etc can be zero, though - such low zeros can always be ignored. Routines likely to produce - low zeros check and avoid them to save time in subsequent - calculations, but for most routines they're quite unlikely and - aren't checked. - -Mantissa Size Range - The `_mp_size' count of limbs in use can be less than `_mp_prec' if - the value can be represented in less. This means low precision - values or small integers stored in a high precision `mpf_t' can - still be operated on efficiently. - - `_mp_size' can also be greater than `_mp_prec'. Firstly a value is - allowed to use all of the `_mp_prec+1' limbs available at `_mp_d', - and secondly when `mpf_set_prec_raw' lowers `_mp_prec' it leaves - `_mp_size' unchanged and so the size can be arbitrarily bigger than - `_mp_prec'. - -Rounding - All rounding is done on limb boundaries. Calculating `_mp_prec' - limbs with the high non-zero will ensure the application requested - minimum precision is obtained. - - The use of simple "trunc" rounding towards zero is efficient, - since there's no need to examine extra limbs and increment or - decrement. - -Bit Shifts - Since the exponent is in limbs, there are no bit shifts in basic - operations like `mpf_add' and `mpf_mul'. When differing exponents - are encountered all that's needed is to adjust pointers to line up - the relevant limbs. - - Of course `mpf_mul_2exp' and `mpf_div_2exp' will require bit - shifts, but the choice is between an exponent in limbs which - requires shifts there, or one in bits which requires them almost - everywhere else. - -Use of `_mp_prec+1' Limbs - The extra limb on `_mp_d' (`_mp_prec+1' rather than just - `_mp_prec') helps when an `mpf' routine might get a carry from its - operation. `mpf_add' for instance will do an `mpn_add' of - `_mp_prec' limbs. If there's no carry then that's the result, but - if there is a carry then it's stored in the extra limb of space and - `_mp_size' becomes `_mp_prec+1'. - - Whenever `_mp_prec+1' limbs are held in a variable, the low limb - is not needed for the intended precision, only the `_mp_prec' high - limbs. But zeroing it out or moving the rest down is unnecessary. - Subsequent routines reading the value will simply take the high - limbs they need, and this will be `_mp_prec' if their target has - that same precision. This is no more than a pointer adjustment, - and must be checked anyway since the destination precision can be - different from the sources. - - Copy functions like `mpf_set' will retain a full `_mp_prec+1' limbs - if available. This ensures that a variable which has `_mp_size' - equal to `_mp_prec+1' will get its full exact value copied. - Strictly speaking this is unnecessary since only `_mp_prec' limbs - are needed for the application's requested precision, but it's - considered that an `mpf_set' from one variable into another of the - same precision ought to produce an exact copy. - -Application Precisions - `__GMPF_BITS_TO_PREC' converts an application requested precision - to an `_mp_prec'. The value in bits is rounded up to a whole limb - then an extra limb is added since the most significant limb of - `_mp_d' is only non-zero and therefore might contain only one bit. - - `__GMPF_PREC_TO_BITS' does the reverse conversion, and removes the - extra limb from `_mp_prec' before converting to bits. The net - effect of reading back with `mpf_get_prec' is simply the precision - rounded up to a multiple of `mp_bits_per_limb'. - - Note that the extra limb added here for the high only being - non-zero is in addition to the extra limb allocated to `_mp_d'. - For example with a 32-bit limb, an application request for 250 - bits will be rounded up to 8 limbs, then an extra added for the - high being only non-zero, giving an `_mp_prec' of 9. `_mp_d' then - gets 10 limbs allocated. Reading back with `mpf_get_prec' will - take `_mp_prec' subtract 1 limb and multiply by 32, giving 256 - bits. - - Strictly speaking, the fact the high limb has at least one bit - means that a float with, say, 3 limbs of 32-bits each will be - holding at least 65 bits, but for the purposes of `mpf_t' it's - considered simply to be 64 bits, a nice multiple of the limb size. - - -File: gmp.info, Node: Raw Output Internals, Next: C++ Interface Internals, Prev: Float Internals, Up: Internals - -17.4 Raw Output Internals -========================= - -`mpz_out_raw' uses the following format. - - +------+------------------------+ - | size | data bytes | - +------+------------------------+ - - The size is 4 bytes written most significant byte first, being the -number of subsequent data bytes, or the twos complement negative of -that when a negative integer is represented. The data bytes are the -absolute value of the integer, written most significant byte first. - - The most significant data byte is always non-zero, so the output is -the same on all systems, irrespective of limb size. - - In GMP 1, leading zero bytes were written to pad the data bytes to a -multiple of the limb size. `mpz_inp_raw' will still accept this, for -compatibility. - - The use of "big endian" for both the size and data fields is -deliberate, it makes the data easy to read in a hex dump of a file. -Unfortunately it also means that the limb data must be reversed when -reading or writing, so neither a big endian nor little endian system -can just read and write `_mp_d'. - - -File: gmp.info, Node: C++ Interface Internals, Prev: Raw Output Internals, Up: Internals - -17.5 C++ Interface Internals -============================ - -A system of expression templates is used to ensure something like -`a=b+c' turns into a simple call to `mpz_add' etc. For `mpf_class' the -scheme also ensures the precision of the final destination is used for -any temporaries within a statement like `f=w*x+y*z'. These are -important features which a naive implementation cannot provide. - - A simplified description of the scheme follows. The true scheme is -complicated by the fact that expressions have different return types. -For detailed information, refer to the source code. - - To perform an operation, say, addition, we first define a "function -object" evaluating it, - - struct __gmp_binary_plus - { - static void eval(mpf_t f, mpf_t g, mpf_t h) { mpf_add(f, g, h); } - }; - -And an "additive expression" object, - - __gmp_expr<__gmp_binary_expr > - operator+(const mpf_class &f, const mpf_class &g) - { - return __gmp_expr - <__gmp_binary_expr >(f, g); - } - - The seemingly redundant `__gmp_expr<__gmp_binary_expr<...>>' is used -to encapsulate any possible kind of expression into a single template -type. In fact even `mpf_class' etc are `typedef' specializations of -`__gmp_expr'. - - Next we define assignment of `__gmp_expr' to `mpf_class'. - - template - mpf_class & mpf_class::operator=(const __gmp_expr &expr) - { - expr.eval(this->get_mpf_t(), this->precision()); - return *this; - } - - template - void __gmp_expr<__gmp_binary_expr >::eval - (mpf_t f, mp_bitcnt_t precision) - { - Op::eval(f, expr.val1.get_mpf_t(), expr.val2.get_mpf_t()); - } - - where `expr.val1' and `expr.val2' are references to the expression's -operands (here `expr' is the `__gmp_binary_expr' stored within the -`__gmp_expr'). - - This way, the expression is actually evaluated only at the time of -assignment, when the required precision (that of `f') is known. -Furthermore the target `mpf_t' is now available, thus we can call -`mpf_add' directly with `f' as the output argument. - - Compound expressions are handled by defining operators taking -subexpressions as their arguments, like this: - - template - __gmp_expr - <__gmp_binary_expr<__gmp_expr, __gmp_expr, __gmp_binary_plus> > - operator+(const __gmp_expr &expr1, const __gmp_expr &expr2) - { - return __gmp_expr - <__gmp_binary_expr<__gmp_expr, __gmp_expr, __gmp_binary_plus> > - (expr1, expr2); - } - - And the corresponding specializations of `__gmp_expr::eval': - - template - void __gmp_expr - <__gmp_binary_expr<__gmp_expr, __gmp_expr, Op> >::eval - (mpf_t f, mp_bitcnt_t precision) - { - // declare two temporaries - mpf_class temp1(expr.val1, precision), temp2(expr.val2, precision); - Op::eval(f, temp1.get_mpf_t(), temp2.get_mpf_t()); - } - - The expression is thus recursively evaluated to any level of -complexity and all subexpressions are evaluated to the precision of `f'. - - -File: gmp.info, Node: Contributors, Next: References, Prev: Internals, Up: Top - -Appendix A Contributors -*********************** - -Torbjo"rn Granlund wrote the original GMP library and is still the main -developer. Code not explicitly attributed to others, was contributed by -Torbjo"rn. Several other individuals and organizations have contributed -GMP. Here is a list in chronological order on first contribution: - - Gunnar Sjo"din and Hans Riesel helped with mathematical problems in -early versions of the library. - - Richard Stallman helped with the interface design and revised the -first version of this manual. - - Brian Beuning and Doug Lea helped with testing of early versions of -the library and made creative suggestions. - - John Amanatides of York University in Canada contributed the function -`mpz_probab_prime_p'. - - Paul Zimmermann wrote the REDC-based mpz_powm code, the -Scho"nhage-Strassen FFT multiply code, and the Karatsuba square root -code. He also improved the Toom3 code for GMP 4.2. Paul sparked the -development of GMP 2, with his comparisons between bignum packages. -The ECMNET project Paul is organizing was a driving force behind many -of the optimizations in GMP 3. Paul also wrote the new GMP 4.3 nth -root code (with Torbjo"rn). - - Ken Weber (Kent State University, Universidade Federal do Rio Grande -do Sul) contributed now defunct versions of `mpz_gcd', `mpz_divexact', -`mpn_gcd', and `mpn_bdivmod', partially supported by CNPq (Brazil) -grant 301314194-2. - - Per Bothner of Cygnus Support helped to set up GMP to use Cygnus' -configure. He has also made valuable suggestions and tested numerous -intermediary releases. - - Joachim Hollman was involved in the design of the `mpf' interface, -and in the `mpz' design revisions for version 2. - - Bennet Yee contributed the initial versions of `mpz_jacobi' and -`mpz_legendre'. - - Andreas Schwab contributed the files `mpn/m68k/lshift.S' and -`mpn/m68k/rshift.S' (now in `.asm' form). - - Robert Harley of Inria, France and David Seal of ARM, England, -suggested clever improvements for population count. Robert also wrote -highly optimized Karatsuba and 3-way Toom multiplication functions for -GMP 3, and contributed the ARM assembly code. - - Torsten Ekedahl of the Mathematical department of Stockholm -University provided significant inspiration during several phases of -the GMP development. His mathematical expertise helped improve several -algorithms. - - Linus Nordberg wrote the new configure system based on autoconf and -implemented the new random functions. - - Kevin Ryde worked on a large number of things: optimized x86 code, -m4 asm macros, parameter tuning, speed measuring, the configure system, -function inlining, divisibility tests, bit scanning, Jacobi symbols, -Fibonacci and Lucas number functions, printf and scanf functions, perl -interface, demo expression parser, the algorithms chapter in the -manual, `gmpasm-mode.el', and various miscellaneous improvements -elsewhere. - - Kent Boortz made the Mac OS 9 port. - - Steve Root helped write the optimized alpha 21264 assembly code. - - Gerardo Ballabio wrote the `gmpxx.h' C++ class interface and the C++ -`istream' input routines. - - Jason Moxham rewrote `mpz_fac_ui'. - - Pedro Gimeno implemented the Mersenne Twister and made other random -number improvements. - - Niels Mo"ller wrote the sub-quadratic GCD and extended GCD code, the -quadratic Hensel division code, and (with Torbjo"rn) the new divide and -conquer division code for GMP 4.3. Niels also helped implement the new -Toom multiply code for GMP 4.3 and implemented helper functions to -simplify Toom evaluations for GMP 5.0. He wrote the original version -of mpn_mulmod_bnm1. - - Alberto Zanoni and Marco Bodrato suggested the unbalanced multiply -strategy, and found the optimal strategies for evaluation and -interpolation in Toom multiplication. - - Marco Bodrato helped implement the new Toom multiply code for GMP -4.3 and implemented most of the new Toom multiply and squaring code for -5.0. He is the main author of the current mpn_mulmod_bnm1 and -mpn_mullo_n. Marco also wrote the functions mpn_invert and -mpn_invertappr. - - David Harvey suggested the internal function `mpn_bdiv_dbm1', -implementing division relevant to Toom multiplication. He also worked -on fast assembly sequences, in particular on a fast AMD64 -`mpn_mul_basecase'. - - Martin Boij wrote `mpn_perfect_power_p'. - - (This list is chronological, not ordered after significance. If you -have contributed to GMP but are not listed above, please tell - about the omission!) - - The development of floating point functions of GNU MP 2, were -supported in part by the ESPRIT-BRA (Basic Research Activities) 6846 -project POSSO (POlynomial System SOlving). - - The development of GMP 2, 3, and 4 was supported in part by the IDA -Center for Computing Sciences. - - Thanks go to Hans Thorsen for donating an SGI system for the GMP -test system environment. - - -File: gmp.info, Node: References, Next: GNU Free Documentation License, Prev: Contributors, Up: Top - -Appendix B References -********************* - -B.1 Books -========= - - * Jonathan M. Borwein and Peter B. Borwein, "Pi and the AGM: A Study - in Analytic Number Theory and Computational Complexity", Wiley, - 1998. - - * Richard Crandall and Carl Pomerance, "Prime Numbers: A - Computational Perspective", 2nd edition, Springer-Verlag, 2005. - `http://math.dartmouth.edu/~carlp/' - - * Henri Cohen, "A Course in Computational Algebraic Number Theory", - Graduate Texts in Mathematics number 138, Springer-Verlag, 1993. - `http://www.math.u-bordeaux.fr/~cohen/' - - * Donald E. Knuth, "The Art of Computer Programming", volume 2, - "Seminumerical Algorithms", 3rd edition, Addison-Wesley, 1998. - `http://www-cs-faculty.stanford.edu/~knuth/taocp.html' - - * John D. Lipson, "Elements of Algebra and Algebraic Computing", The - Benjamin Cummings Publishing Company Inc, 1981. - - * Alfred J. Menezes, Paul C. van Oorschot and Scott A. Vanstone, - "Handbook of Applied Cryptography", - `http://www.cacr.math.uwaterloo.ca/hac/' - - * Richard M. Stallman and the GCC Developer Community, "Using the - GNU Compiler Collection", Free Software Foundation, 2008, - available online `http://gcc.gnu.org/onlinedocs/', and in the GCC - package `ftp://ftp.gnu.org/gnu/gcc/' - -B.2 Papers -========== - - * Yves Bertot, Nicolas Magaud and Paul Zimmermann, "A Proof of GMP - Square Root", Journal of Automated Reasoning, volume 29, 2002, pp. - 225-252. Also available online as INRIA Research Report 4475, - June 2001, `http://www.inria.fr/rrrt/rr-4475.html' - - * Christoph Burnikel and Joachim Ziegler, "Fast Recursive Division", - Max-Planck-Institut fuer Informatik Research Report MPI-I-98-1-022, - `http://data.mpi-sb.mpg.de/internet/reports.nsf/NumberView/1998-1-022' - - * Torbjo"rn Granlund and Peter L. Montgomery, "Division by Invariant - Integers using Multiplication", in Proceedings of the SIGPLAN - PLDI'94 Conference, June 1994. Also available - `ftp://ftp.cwi.nl/pub/pmontgom/divcnst.psa4.gz' (and .psl.gz). - - * Niels Mo"ller and Torbjo"rn Granlund, "Improved division by - invariant integers", to appear. - - * Torbjo"rn Granlund and Niels Mo"ller, "Division of integers large - and small", to appear. - - * Tudor Jebelean, "An algorithm for exact division", Journal of - Symbolic Computation, volume 15, 1993, pp. 169-180. Research - report version available - `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1992/92-35.ps.gz' - - * Tudor Jebelean, "Exact Division with Karatsuba Complexity - - Extended Abstract", RISC-Linz technical report 96-31, - `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1996/96-31.ps.gz' - - * Tudor Jebelean, "Practical Integer Division with Karatsuba - Complexity", ISSAC 97, pp. 339-341. Technical report available - `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1996/96-29.ps.gz' - - * Tudor Jebelean, "A Generalization of the Binary GCD Algorithm", - ISSAC 93, pp. 111-116. Technical report version available - `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1993/93-01.ps.gz' - - * Tudor Jebelean, "A Double-Digit Lehmer-Euclid Algorithm for - Finding the GCD of Long Integers", Journal of Symbolic - Computation, volume 19, 1995, pp. 145-157. Technical report - version also available - `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1992/92-69.ps.gz' - - * Werner Krandick and Tudor Jebelean, "Bidirectional Exact Integer - Division", Journal of Symbolic Computation, volume 21, 1996, pp. - 441-455. Early technical report version also available - `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1994/94-50.ps.gz' - - * Makoto Matsumoto and Takuji Nishimura, "Mersenne Twister: A - 623-dimensionally equidistributed uniform pseudorandom number - generator", ACM Transactions on Modelling and Computer Simulation, - volume 8, January 1998, pp. 3-30. Available online - `http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/ARTICLES/mt.ps.gz' - (or .pdf) - - * R. Moenck and A. Borodin, "Fast Modular Transforms via Division", - Proceedings of the 13th Annual IEEE Symposium on Switching and - Automata Theory, October 1972, pp. 90-96. Reprinted as "Fast - Modular Transforms", Journal of Computer and System Sciences, - volume 8, number 3, June 1974, pp. 366-386. - - * Niels Mo"ller, "On Scho"nhage's algorithm and subquadratic integer - GCD computation", in Mathematics of Computation, volume 77, - January 2008, pp. 589-607. - - * Peter L. Montgomery, "Modular Multiplication Without Trial - Division", in Mathematics of Computation, volume 44, number 170, - April 1985. - - * Arnold Scho"nhage and Volker Strassen, "Schnelle Multiplikation - grosser Zahlen", Computing 7, 1971, pp. 281-292. - - * Kenneth Weber, "The accelerated integer GCD algorithm", ACM - Transactions on Mathematical Software, volume 21, number 1, March - 1995, pp. 111-122. - - * Paul Zimmermann, "Karatsuba Square Root", INRIA Research Report - 3805, November 1999, `http://www.inria.fr/rrrt/rr-3805.html' - - * Paul Zimmermann, "A Proof of GMP Fast Division and Square Root - Implementations", - `http://www.loria.fr/~zimmerma/papers/proof-div-sqrt.ps.gz' - - * Dan Zuras, "On Squaring and Multiplying Large Integers", ARITH-11: - IEEE Symposium on Computer Arithmetic, 1993, pp. 260 to 271. - Reprinted as "More on Multiplying and Squaring Large Integers", - IEEE Transactions on Computers, volume 43, number 8, August 1994, - pp. 899-908. - - -File: gmp.info, Node: GNU Free Documentation License, Next: Concept Index, Prev: References, Up: Top - -Appendix C GNU Free Documentation License -***************************************** - - Version 1.3, 3 November 2008 - - Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. - `http://fsf.org/' - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - 0. PREAMBLE - - The purpose of this License is to make a manual, textbook, or other - functional and useful document "free" in the sense of freedom: to - assure everyone the effective freedom to copy and redistribute it, - with or without modifying it, either commercially or - noncommercially. Secondarily, this License preserves for the - author and publisher a way to get credit for their work, while not - being considered responsible for modifications made by others. - - This License is a kind of "copyleft", which means that derivative - works of the document must themselves be free in the same sense. - It complements the GNU General Public License, which is a copyleft - license designed for free software. - - We have designed this License in order to use it for manuals for - free software, because free software needs free documentation: a - free program should come with manuals providing the same freedoms - that the software does. But this License is not limited to - software manuals; it can be used for any textual work, regardless - of subject matter or whether it is published as a printed book. - We recommend this License principally for works whose purpose is - instruction or reference. - - 1. APPLICABILITY AND DEFINITIONS - - This License applies to any manual or other work, in any medium, - that contains a notice placed by the copyright holder saying it - can be distributed under the terms of this License. Such a notice - grants a world-wide, royalty-free license, unlimited in duration, - to use that work under the conditions stated herein. The - "Document", below, refers to any such manual or work. Any member - of the public is a licensee, and is addressed as "you". You - accept the license if you copy, modify or distribute the work in a - way requiring permission under copyright law. - - A "Modified Version" of the Document means any work containing the - Document or a portion of it, either copied verbatim, or with - modifications and/or translated into another language. - - A "Secondary Section" is a named appendix or a front-matter section - of the Document that deals exclusively with the relationship of the - publishers or authors of the Document to the Document's overall - subject (or to related matters) and contains nothing that could - fall directly within that overall subject. (Thus, if the Document - is in part a textbook of mathematics, a Secondary Section may not - explain any mathematics.) The relationship could be a matter of - historical connection with the subject or with related matters, or - of legal, commercial, philosophical, ethical or political position - regarding them. - - The "Invariant Sections" are certain Secondary Sections whose - titles are designated, as being those of Invariant Sections, in - the notice that says that the Document is released under this - License. If a section does not fit the above definition of - Secondary then it is not allowed to be designated as Invariant. - The Document may contain zero Invariant Sections. If the Document - does not identify any Invariant Sections then there are none. - - The "Cover Texts" are certain short passages of text that are - listed, as Front-Cover Texts or Back-Cover Texts, in the notice - that says that the Document is released under this License. A - Front-Cover Text may be at most 5 words, and a Back-Cover Text may - be at most 25 words. - - A "Transparent" copy of the Document means a machine-readable copy, - represented in a format whose specification is available to the - general public, that is suitable for revising the document - straightforwardly with generic text editors or (for images - composed of pixels) generic paint programs or (for drawings) some - widely available drawing editor, and that is suitable for input to - text formatters or for automatic translation to a variety of - formats suitable for input to text formatters. A copy made in an - otherwise Transparent file format whose markup, or absence of - markup, has been arranged to thwart or discourage subsequent - modification by readers is not Transparent. An image format is - not Transparent if used for any substantial amount of text. A - copy that is not "Transparent" is called "Opaque". - - Examples of suitable formats for Transparent copies include plain - ASCII without markup, Texinfo input format, LaTeX input format, - SGML or XML using a publicly available DTD, and - standard-conforming simple HTML, PostScript or PDF designed for - human modification. Examples of transparent image formats include - PNG, XCF and JPG. Opaque formats include proprietary formats that - can be read and edited only by proprietary word processors, SGML or - XML for which the DTD and/or processing tools are not generally - available, and the machine-generated HTML, PostScript or PDF - produced by some word processors for output purposes only. - - The "Title Page" means, for a printed book, the title page itself, - plus such following pages as are needed to hold, legibly, the - material this License requires to appear in the title page. For - works in formats which do not have any title page as such, "Title - Page" means the text near the most prominent appearance of the - work's title, preceding the beginning of the body of the text. - - The "publisher" means any person or entity that distributes copies - of the Document to the public. - - A section "Entitled XYZ" means a named subunit of the Document - whose title either is precisely XYZ or contains XYZ in parentheses - following text that translates XYZ in another language. (Here XYZ - stands for a specific section name mentioned below, such as - "Acknowledgements", "Dedications", "Endorsements", or "History".) - To "Preserve the Title" of such a section when you modify the - Document means that it remains a section "Entitled XYZ" according - to this definition. - - The Document may include Warranty Disclaimers next to the notice - which states that this License applies to the Document. These - Warranty Disclaimers are considered to be included by reference in - this License, but only as regards disclaiming warranties: any other - implication that these Warranty Disclaimers may have is void and - has no effect on the meaning of this License. - - 2. VERBATIM COPYING - - You may copy and distribute the Document in any medium, either - commercially or noncommercially, provided that this License, the - copyright notices, and the license notice saying this License - applies to the Document are reproduced in all copies, and that you - add no other conditions whatsoever to those of this License. You - may not use technical measures to obstruct or control the reading - or further copying of the copies you make or distribute. However, - you may accept compensation in exchange for copies. If you - distribute a large enough number of copies you must also follow - the conditions in section 3. - - You may also lend copies, under the same conditions stated above, - and you may publicly display copies. - - 3. COPYING IN QUANTITY - - If you publish printed copies (or copies in media that commonly - have printed covers) of the Document, numbering more than 100, and - the Document's license notice requires Cover Texts, you must - enclose the copies in covers that carry, clearly and legibly, all - these Cover Texts: Front-Cover Texts on the front cover, and - Back-Cover Texts on the back cover. Both covers must also clearly - and legibly identify you as the publisher of these copies. The - front cover must present the full title with all words of the - title equally prominent and visible. You may add other material - on the covers in addition. Copying with changes limited to the - covers, as long as they preserve the title of the Document and - satisfy these conditions, can be treated as verbatim copying in - other respects. - - If the required texts for either cover are too voluminous to fit - legibly, you should put the first ones listed (as many as fit - reasonably) on the actual cover, and continue the rest onto - adjacent pages. - - If you publish or distribute Opaque copies of the Document - numbering more than 100, you must either include a - machine-readable Transparent copy along with each Opaque copy, or - state in or with each Opaque copy a computer-network location from - which the general network-using public has access to download - using public-standard network protocols a complete Transparent - copy of the Document, free of added material. If you use the - latter option, you must take reasonably prudent steps, when you - begin distribution of Opaque copies in quantity, to ensure that - this Transparent copy will remain thus accessible at the stated - location until at least one year after the last time you - distribute an Opaque copy (directly or through your agents or - retailers) of that edition to the public. - - It is requested, but not required, that you contact the authors of - the Document well before redistributing any large number of - copies, to give them a chance to provide you with an updated - version of the Document. - - 4. MODIFICATIONS - - You may copy and distribute a Modified Version of the Document - under the conditions of sections 2 and 3 above, provided that you - release the Modified Version under precisely this License, with - the Modified Version filling the role of the Document, thus - licensing distribution and modification of the Modified Version to - whoever possesses a copy of it. In addition, you must do these - things in the Modified Version: - - A. Use in the Title Page (and on the covers, if any) a title - distinct from that of the Document, and from those of - previous versions (which should, if there were any, be listed - in the History section of the Document). You may use the - same title as a previous version if the original publisher of - that version gives permission. - - B. List on the Title Page, as authors, one or more persons or - entities responsible for authorship of the modifications in - the Modified Version, together with at least five of the - principal authors of the Document (all of its principal - authors, if it has fewer than five), unless they release you - from this requirement. - - C. State on the Title page the name of the publisher of the - Modified Version, as the publisher. - - D. Preserve all the copyright notices of the Document. - - E. Add an appropriate copyright notice for your modifications - adjacent to the other copyright notices. - - F. Include, immediately after the copyright notices, a license - notice giving the public permission to use the Modified - Version under the terms of this License, in the form shown in - the Addendum below. - - G. Preserve in that license notice the full lists of Invariant - Sections and required Cover Texts given in the Document's - license notice. - - H. Include an unaltered copy of this License. - - I. Preserve the section Entitled "History", Preserve its Title, - and add to it an item stating at least the title, year, new - authors, and publisher of the Modified Version as given on - the Title Page. If there is no section Entitled "History" in - the Document, create one stating the title, year, authors, - and publisher of the Document as given on its Title Page, - then add an item describing the Modified Version as stated in - the previous sentence. - - J. Preserve the network location, if any, given in the Document - for public access to a Transparent copy of the Document, and - likewise the network locations given in the Document for - previous versions it was based on. These may be placed in - the "History" section. You may omit a network location for a - work that was published at least four years before the - Document itself, or if the original publisher of the version - it refers to gives permission. - - K. For any section Entitled "Acknowledgements" or "Dedications", - Preserve the Title of the section, and preserve in the - section all the substance and tone of each of the contributor - acknowledgements and/or dedications given therein. - - L. Preserve all the Invariant Sections of the Document, - unaltered in their text and in their titles. Section numbers - or the equivalent are not considered part of the section - titles. - - M. Delete any section Entitled "Endorsements". Such a section - may not be included in the Modified Version. - - N. Do not retitle any existing section to be Entitled - "Endorsements" or to conflict in title with any Invariant - Section. - - O. Preserve any Warranty Disclaimers. - - If the Modified Version includes new front-matter sections or - appendices that qualify as Secondary Sections and contain no - material copied from the Document, you may at your option - designate some or all of these sections as invariant. To do this, - add their titles to the list of Invariant Sections in the Modified - Version's license notice. These titles must be distinct from any - other section titles. - - You may add a section Entitled "Endorsements", provided it contains - nothing but endorsements of your Modified Version by various - parties--for example, statements of peer review or that the text - has been approved by an organization as the authoritative - definition of a standard. - - You may add a passage of up to five words as a Front-Cover Text, - and a passage of up to 25 words as a Back-Cover Text, to the end - of the list of Cover Texts in the Modified Version. Only one - passage of Front-Cover Text and one of Back-Cover Text may be - added by (or through arrangements made by) any one entity. If the - Document already includes a cover text for the same cover, - previously added by you or by arrangement made by the same entity - you are acting on behalf of, you may not add another; but you may - replace the old one, on explicit permission from the previous - publisher that added the old one. - - The author(s) and publisher(s) of the Document do not by this - License give permission to use their names for publicity for or to - assert or imply endorsement of any Modified Version. - - 5. COMBINING DOCUMENTS - - You may combine the Document with other documents released under - this License, under the terms defined in section 4 above for - modified versions, provided that you include in the combination - all of the Invariant Sections of all of the original documents, - unmodified, and list them all as Invariant Sections of your - combined work in its license notice, and that you preserve all - their Warranty Disclaimers. - - The combined work need only contain one copy of this License, and - multiple identical Invariant Sections may be replaced with a single - copy. If there are multiple Invariant Sections with the same name - but different contents, make the title of each such section unique - by adding at the end of it, in parentheses, the name of the - original author or publisher of that section if known, or else a - unique number. Make the same adjustment to the section titles in - the list of Invariant Sections in the license notice of the - combined work. - - In the combination, you must combine any sections Entitled - "History" in the various original documents, forming one section - Entitled "History"; likewise combine any sections Entitled - "Acknowledgements", and any sections Entitled "Dedications". You - must delete all sections Entitled "Endorsements." - - 6. COLLECTIONS OF DOCUMENTS - - You may make a collection consisting of the Document and other - documents released under this License, and replace the individual - copies of this License in the various documents with a single copy - that is included in the collection, provided that you follow the - rules of this License for verbatim copying of each of the - documents in all other respects. - - You may extract a single document from such a collection, and - distribute it individually under this License, provided you insert - a copy of this License into the extracted document, and follow - this License in all other respects regarding verbatim copying of - that document. - - 7. AGGREGATION WITH INDEPENDENT WORKS - - A compilation of the Document or its derivatives with other - separate and independent documents or works, in or on a volume of - a storage or distribution medium, is called an "aggregate" if the - copyright resulting from the compilation is not used to limit the - legal rights of the compilation's users beyond what the individual - works permit. When the Document is included in an aggregate, this - License does not apply to the other works in the aggregate which - are not themselves derivative works of the Document. - - If the Cover Text requirement of section 3 is applicable to these - copies of the Document, then if the Document is less than one half - of the entire aggregate, the Document's Cover Texts may be placed - on covers that bracket the Document within the aggregate, or the - electronic equivalent of covers if the Document is in electronic - form. Otherwise they must appear on printed covers that bracket - the whole aggregate. - - 8. TRANSLATION - - Translation is considered a kind of modification, so you may - distribute translations of the Document under the terms of section - 4. Replacing Invariant Sections with translations requires special - permission from their copyright holders, but you may include - translations of some or all Invariant Sections in addition to the - original versions of these Invariant Sections. You may include a - translation of this License, and all the license notices in the - Document, and any Warranty Disclaimers, provided that you also - include the original English version of this License and the - original versions of those notices and disclaimers. In case of a - disagreement between the translation and the original version of - this License or a notice or disclaimer, the original version will - prevail. - - If a section in the Document is Entitled "Acknowledgements", - "Dedications", or "History", the requirement (section 4) to - Preserve its Title (section 1) will typically require changing the - actual title. - - 9. TERMINATION - - You may not copy, modify, sublicense, or distribute the Document - except as expressly provided under this License. Any attempt - otherwise to copy, modify, sublicense, or distribute it is void, - and will automatically terminate your rights under this License. - - However, if you cease all violation of this License, then your - license from a particular copyright holder is reinstated (a) - provisionally, unless and until the copyright holder explicitly - and finally terminates your license, and (b) permanently, if the - copyright holder fails to notify you of the violation by some - reasonable means prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is - reinstated permanently if the copyright holder notifies you of the - violation by some reasonable means, this is the first time you have - received notice of violation of this License (for any work) from - that copyright holder, and you cure the violation prior to 30 days - after your receipt of the notice. - - Termination of your rights under this section does not terminate - the licenses of parties who have received copies or rights from - you under this License. If your rights have been terminated and - not permanently reinstated, receipt of a copy of some or all of - the same material does not give you any rights to use it. - - 10. FUTURE REVISIONS OF THIS LICENSE - - The Free Software Foundation may publish new, revised versions of - the GNU Free Documentation License from time to time. Such new - versions will be similar in spirit to the present version, but may - differ in detail to address new problems or concerns. See - `http://www.gnu.org/copyleft/'. - - Each version of the License is given a distinguishing version - number. If the Document specifies that a particular numbered - version of this License "or any later version" applies to it, you - have the option of following the terms and conditions either of - that specified version or of any later version that has been - published (not as a draft) by the Free Software Foundation. If - the Document does not specify a version number of this License, - you may choose any version ever published (not as a draft) by the - Free Software Foundation. If the Document specifies that a proxy - can decide which future versions of this License can be used, that - proxy's public statement of acceptance of a version permanently - authorizes you to choose that version for the Document. - - 11. RELICENSING - - "Massive Multiauthor Collaboration Site" (or "MMC Site") means any - World Wide Web server that publishes copyrightable works and also - provides prominent facilities for anybody to edit those works. A - public wiki that anybody can edit is an example of such a server. - A "Massive Multiauthor Collaboration" (or "MMC") contained in the - site means any set of copyrightable works thus published on the MMC - site. - - "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 - license published by Creative Commons Corporation, a not-for-profit - corporation with a principal place of business in San Francisco, - California, as well as future copyleft versions of that license - published by that same organization. - - "Incorporate" means to publish or republish a Document, in whole or - in part, as part of another Document. - - An MMC is "eligible for relicensing" if it is licensed under this - License, and if all works that were first published under this - License somewhere other than this MMC, and subsequently - incorporated in whole or in part into the MMC, (1) had no cover - texts or invariant sections, and (2) were thus incorporated prior - to November 1, 2008. - - The operator of an MMC Site may republish an MMC contained in the - site under CC-BY-SA on the same site at any time before August 1, - 2009, provided the MMC is eligible for relicensing. - - -ADDENDUM: How to use this License for your documents -==================================================== - -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and license -notices just after the title page: - - Copyright (C) YEAR YOUR NAME. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.3 - or any later version published by the Free Software Foundation; - with no Invariant Sections, no Front-Cover Texts, and no Back-Cover - Texts. A copy of the license is included in the section entitled ``GNU - Free Documentation License''. - - If you have Invariant Sections, Front-Cover Texts and Back-Cover -Texts, replace the "with...Texts." line with this: - - with the Invariant Sections being LIST THEIR TITLES, with - the Front-Cover Texts being LIST, and with the Back-Cover Texts - being LIST. - - If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. - - If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, to -permit their use in free software. - - -File: gmp.info, Node: Concept Index, Next: Function Index, Prev: GNU Free Documentation License, Up: Top - -Concept Index -************* - -[index] -* Menu: - -* #include: Headers and Libraries. - (line 6) -* --build: Build Options. (line 52) -* --disable-fft: Build Options. (line 317) -* --disable-shared: Build Options. (line 45) -* --disable-static: Build Options. (line 45) -* --enable-alloca: Build Options. (line 278) -* --enable-assert: Build Options. (line 327) -* --enable-cxx: Build Options. (line 230) -* --enable-fat: Build Options. (line 164) -* --enable-mpbsd: Build Options. (line 322) -* --enable-profiling <1>: Profiling. (line 6) -* --enable-profiling: Build Options. (line 331) -* --exec-prefix: Build Options. (line 32) -* --host: Build Options. (line 66) -* --prefix: Build Options. (line 32) -* -finstrument-functions: Profiling. (line 66) -* 2exp functions: Efficiency. (line 43) -* 68000: Notes for Particular Systems. - (line 80) -* 80x86: Notes for Particular Systems. - (line 126) -* ABI <1>: Build Options. (line 171) -* ABI: ABI and ISA. (line 6) -* About this manual: Introduction to GMP. (line 58) -* AC_CHECK_LIB: Autoconf. (line 11) -* AIX <1>: ABI and ISA. (line 184) -* AIX <2>: Notes for Particular Systems. - (line 7) -* AIX: ABI and ISA. (line 169) -* Algorithms: Algorithms. (line 6) -* alloca: Build Options. (line 278) -* Allocation of memory: Custom Allocation. (line 6) -* AMD64: ABI and ISA. (line 44) -* Anonymous FTP of latest version: Introduction to GMP. (line 38) -* Application Binary Interface: ABI and ISA. (line 6) -* Arithmetic functions <1>: Float Arithmetic. (line 6) -* Arithmetic functions <2>: Integer Arithmetic. (line 6) -* Arithmetic functions: Rational Arithmetic. (line 6) -* ARM: Notes for Particular Systems. - (line 20) -* Assembly cache handling: Assembly Cache Handling. - (line 6) -* Assembly carry propagation: Assembly Carry Propagation. - (line 6) -* Assembly code organisation: Assembly Code Organisation. - (line 6) -* Assembly coding: Assembly Coding. (line 6) -* Assembly floating Point: Assembly Floating Point. - (line 6) -* Assembly loop unrolling: Assembly Loop Unrolling. - (line 6) -* Assembly SIMD: Assembly SIMD Instructions. - (line 6) -* Assembly software pipelining: Assembly Software Pipelining. - (line 6) -* Assembly writing guide: Assembly Writing Guide. - (line 6) -* Assertion checking <1>: Debugging. (line 79) -* Assertion checking: Build Options. (line 327) -* Assignment functions <1>: Assigning Floats. (line 6) -* Assignment functions <2>: Initializing Rationals. - (line 6) -* Assignment functions <3>: Simultaneous Integer Init & Assign. - (line 6) -* Assignment functions <4>: Simultaneous Float Init & Assign. - (line 6) -* Assignment functions: Assigning Integers. (line 6) -* Autoconf: Autoconf. (line 6) -* Basics: GMP Basics. (line 6) -* Berkeley MP compatible functions <1>: Build Options. (line 322) -* Berkeley MP compatible functions: BSD Compatible Functions. - (line 6) -* Binomial coefficient algorithm: Binomial Coefficients Algorithm. - (line 6) -* Binomial coefficient functions: Number Theoretic Functions. - (line 100) -* Binutils strip: Known Build Problems. - (line 28) -* Bit manipulation functions: Integer Logic and Bit Fiddling. - (line 6) -* Bit scanning functions: Integer Logic and Bit Fiddling. - (line 38) -* Bit shift left: Integer Arithmetic. (line 35) -* Bit shift right: Integer Division. (line 53) -* Bits per limb: Useful Macros and Constants. - (line 7) -* BSD MP compatible functions <1>: Build Options. (line 322) -* BSD MP compatible functions: BSD Compatible Functions. - (line 6) -* Bug reporting: Reporting Bugs. (line 6) -* Build directory: Build Options. (line 19) -* Build notes for binary packaging: Notes for Package Builds. - (line 6) -* Build notes for particular systems: Notes for Particular Systems. - (line 6) -* Build options: Build Options. (line 6) -* Build problems known: Known Build Problems. - (line 6) -* Build system: Build Options. (line 52) -* Building GMP: Installing GMP. (line 6) -* Bus error: Debugging. (line 7) -* C compiler: Build Options. (line 182) -* C++ compiler: Build Options. (line 254) -* C++ interface: C++ Class Interface. (line 6) -* C++ interface internals: C++ Interface Internals. - (line 6) -* C++ istream input: C++ Formatted Input. (line 6) -* C++ ostream output: C++ Formatted Output. - (line 6) -* C++ support: Build Options. (line 230) -* CC: Build Options. (line 182) -* CC_FOR_BUILD: Build Options. (line 217) -* CFLAGS: Build Options. (line 182) -* Checker: Debugging. (line 115) -* checkergcc: Debugging. (line 122) -* Code organisation: Assembly Code Organisation. - (line 6) -* Compaq C++: Notes for Particular Systems. - (line 25) -* Comparison functions <1>: Integer Comparisons. (line 6) -* Comparison functions <2>: Comparing Rationals. (line 6) -* Comparison functions: Float Comparison. (line 6) -* Compatibility with older versions: Compatibility with older versions. - (line 6) -* Conditions for copying GNU MP: Copying. (line 6) -* Configuring GMP: Installing GMP. (line 6) -* Congruence algorithm: Exact Remainder. (line 29) -* Congruence functions: Integer Division. (line 124) -* Constants: Useful Macros and Constants. - (line 6) -* Contributors: Contributors. (line 6) -* Conventions for parameters: Parameter Conventions. - (line 6) -* Conventions for variables: Variable Conventions. - (line 6) -* Conversion functions <1>: Converting Integers. (line 6) -* Conversion functions <2>: Converting Floats. (line 6) -* Conversion functions: Rational Conversions. - (line 6) -* Copying conditions: Copying. (line 6) -* CPPFLAGS: Build Options. (line 208) -* CPU types <1>: Introduction to GMP. (line 24) -* CPU types: Build Options. (line 108) -* Cross compiling: Build Options. (line 66) -* Custom allocation: Custom Allocation. (line 6) -* CXX: Build Options. (line 254) -* CXXFLAGS: Build Options. (line 254) -* Cygwin: Notes for Particular Systems. - (line 43) -* Darwin: Known Build Problems. - (line 51) -* Debugging: Debugging. (line 6) -* Demonstration programs: Demonstration Programs. - (line 6) -* Digits in an integer: Miscellaneous Integer Functions. - (line 23) -* Divisibility algorithm: Exact Remainder. (line 29) -* Divisibility functions: Integer Division. (line 124) -* Divisibility testing: Efficiency. (line 91) -* Division algorithms: Division Algorithms. (line 6) -* Division functions <1>: Rational Arithmetic. (line 22) -* Division functions <2>: Integer Division. (line 6) -* Division functions: Float Arithmetic. (line 33) -* DJGPP <1>: Notes for Particular Systems. - (line 43) -* DJGPP: Known Build Problems. - (line 18) -* DLLs: Notes for Particular Systems. - (line 56) -* DocBook: Build Options. (line 354) -* Documentation formats: Build Options. (line 347) -* Documentation license: GNU Free Documentation License. - (line 6) -* DVI: Build Options. (line 350) -* Efficiency: Efficiency. (line 6) -* Emacs: Emacs. (line 6) -* Exact division functions: Integer Division. (line 102) -* Exact remainder: Exact Remainder. (line 6) -* Example programs: Demonstration Programs. - (line 6) -* Exec prefix: Build Options. (line 32) -* Execution profiling <1>: Profiling. (line 6) -* Execution profiling: Build Options. (line 331) -* Exponentiation functions <1>: Integer Exponentiation. - (line 6) -* Exponentiation functions: Float Arithmetic. (line 41) -* Export: Integer Import and Export. - (line 45) -* Expression parsing demo: Demonstration Programs. - (line 18) -* Extended GCD: Number Theoretic Functions. - (line 45) -* Factor removal functions: Number Theoretic Functions. - (line 90) -* Factorial algorithm: Factorial Algorithm. (line 6) -* Factorial functions: Number Theoretic Functions. - (line 95) -* Factorization demo: Demonstration Programs. - (line 25) -* Fast Fourier Transform: FFT Multiplication. (line 6) -* Fat binary: Build Options. (line 164) -* FFT multiplication <1>: FFT Multiplication. (line 6) -* FFT multiplication: Build Options. (line 317) -* Fibonacci number algorithm: Fibonacci Numbers Algorithm. - (line 6) -* Fibonacci sequence functions: Number Theoretic Functions. - (line 108) -* Float arithmetic functions: Float Arithmetic. (line 6) -* Float assignment functions <1>: Simultaneous Float Init & Assign. - (line 6) -* Float assignment functions: Assigning Floats. (line 6) -* Float comparison functions: Float Comparison. (line 6) -* Float conversion functions: Converting Floats. (line 6) -* Float functions: Floating-point Functions. - (line 6) -* Float initialization functions <1>: Simultaneous Float Init & Assign. - (line 6) -* Float initialization functions: Initializing Floats. (line 6) -* Float input and output functions: I/O of Floats. (line 6) -* Float internals: Float Internals. (line 6) -* Float miscellaneous functions: Miscellaneous Float Functions. - (line 6) -* Float random number functions: Miscellaneous Float Functions. - (line 27) -* Float rounding functions: Miscellaneous Float Functions. - (line 9) -* Float sign tests: Float Comparison. (line 33) -* Floating point mode: Notes for Particular Systems. - (line 34) -* Floating-point functions: Floating-point Functions. - (line 6) -* Floating-point number: Nomenclature and Types. - (line 21) -* fnccheck: Profiling. (line 77) -* Formatted input: Formatted Input. (line 6) -* Formatted output: Formatted Output. (line 6) -* Free Documentation License: GNU Free Documentation License. - (line 6) -* frexp <1>: Converting Floats. (line 23) -* frexp: Converting Integers. (line 42) -* FTP of latest version: Introduction to GMP. (line 38) -* Function classes: Function Classes. (line 6) -* FunctionCheck: Profiling. (line 77) -* GCC Checker: Debugging. (line 115) -* GCD algorithms: Greatest Common Divisor Algorithms. - (line 6) -* GCD extended: Number Theoretic Functions. - (line 45) -* GCD functions: Number Theoretic Functions. - (line 30) -* GDB: Debugging. (line 58) -* Generic C: Build Options. (line 153) -* GMP Perl module: Demonstration Programs. - (line 35) -* GMP version number: Useful Macros and Constants. - (line 12) -* gmp.h: Headers and Libraries. - (line 6) -* gmpxx.h: C++ Interface General. - (line 8) -* GNU Debugger: Debugging. (line 58) -* GNU Free Documentation License: GNU Free Documentation License. - (line 6) -* GNU strip: Known Build Problems. - (line 28) -* gprof: Profiling. (line 41) -* Greatest common divisor algorithms: Greatest Common Divisor Algorithms. - (line 6) -* Greatest common divisor functions: Number Theoretic Functions. - (line 30) -* Hardware floating point mode: Notes for Particular Systems. - (line 34) -* Headers: Headers and Libraries. - (line 6) -* Heap problems: Debugging. (line 24) -* Home page: Introduction to GMP. (line 34) -* Host system: Build Options. (line 66) -* HP-UX: ABI and ISA. (line 107) -* HPPA: ABI and ISA. (line 68) -* I/O functions <1>: I/O of Integers. (line 6) -* I/O functions <2>: I/O of Rationals. (line 6) -* I/O functions: I/O of Floats. (line 6) -* i386: Notes for Particular Systems. - (line 126) -* IA-64: ABI and ISA. (line 107) -* Import: Integer Import and Export. - (line 11) -* In-place operations: Efficiency. (line 57) -* Include files: Headers and Libraries. - (line 6) -* info-lookup-symbol: Emacs. (line 6) -* Initialization functions <1>: Initializing Integers. - (line 6) -* Initialization functions <2>: Initializing Rationals. - (line 6) -* Initialization functions <3>: Random State Initialization. - (line 6) -* Initialization functions <4>: Simultaneous Float Init & Assign. - (line 6) -* Initialization functions <5>: Simultaneous Integer Init & Assign. - (line 6) -* Initialization functions: Initializing Floats. (line 6) -* Initializing and clearing: Efficiency. (line 21) -* Input functions <1>: I/O of Integers. (line 6) -* Input functions <2>: I/O of Rationals. (line 6) -* Input functions <3>: I/O of Floats. (line 6) -* Input functions: Formatted Input Functions. - (line 6) -* Install prefix: Build Options. (line 32) -* Installing GMP: Installing GMP. (line 6) -* Instruction Set Architecture: ABI and ISA. (line 6) -* instrument-functions: Profiling. (line 66) -* Integer: Nomenclature and Types. - (line 6) -* Integer arithmetic functions: Integer Arithmetic. (line 6) -* Integer assignment functions <1>: Simultaneous Integer Init & Assign. - (line 6) -* Integer assignment functions: Assigning Integers. (line 6) -* Integer bit manipulation functions: Integer Logic and Bit Fiddling. - (line 6) -* Integer comparison functions: Integer Comparisons. (line 6) -* Integer conversion functions: Converting Integers. (line 6) -* Integer division functions: Integer Division. (line 6) -* Integer exponentiation functions: Integer Exponentiation. - (line 6) -* Integer export: Integer Import and Export. - (line 45) -* Integer functions: Integer Functions. (line 6) -* Integer import: Integer Import and Export. - (line 11) -* Integer initialization functions <1>: Simultaneous Integer Init & Assign. - (line 6) -* Integer initialization functions: Initializing Integers. - (line 6) -* Integer input and output functions: I/O of Integers. (line 6) -* Integer internals: Integer Internals. (line 6) -* Integer logical functions: Integer Logic and Bit Fiddling. - (line 6) -* Integer miscellaneous functions: Miscellaneous Integer Functions. - (line 6) -* Integer random number functions: Integer Random Numbers. - (line 6) -* Integer root functions: Integer Roots. (line 6) -* Integer sign tests: Integer Comparisons. (line 28) -* Integer special functions: Integer Special Functions. - (line 6) -* Interix: Notes for Particular Systems. - (line 51) -* Internals: Internals. (line 6) -* Introduction: Introduction to GMP. (line 6) -* Inverse modulo functions: Number Theoretic Functions. - (line 60) -* IRIX <1>: Known Build Problems. - (line 38) -* IRIX: ABI and ISA. (line 132) -* ISA: ABI and ISA. (line 6) -* istream input: C++ Formatted Input. (line 6) -* Jacobi symbol algorithm: Jacobi Symbol. (line 6) -* Jacobi symbol functions: Number Theoretic Functions. - (line 66) -* Karatsuba multiplication: Karatsuba Multiplication. - (line 6) -* Karatsuba square root algorithm: Square Root Algorithm. - (line 6) -* Kronecker symbol functions: Number Theoretic Functions. - (line 78) -* Language bindings: Language Bindings. (line 6) -* Latest version of GMP: Introduction to GMP. (line 38) -* LCM functions: Number Theoretic Functions. - (line 55) -* Least common multiple functions: Number Theoretic Functions. - (line 55) -* Legendre symbol functions: Number Theoretic Functions. - (line 69) -* libgmp: Headers and Libraries. - (line 22) -* libgmpxx: Headers and Libraries. - (line 27) -* Libraries: Headers and Libraries. - (line 22) -* Libtool: Headers and Libraries. - (line 33) -* Libtool versioning: Notes for Package Builds. - (line 9) -* License conditions: Copying. (line 6) -* Limb: Nomenclature and Types. - (line 31) -* Limb size: Useful Macros and Constants. - (line 7) -* Linear congruential algorithm: Random Number Algorithms. - (line 25) -* Linear congruential random numbers: Random State Initialization. - (line 32) -* Linking: Headers and Libraries. - (line 22) -* Logical functions: Integer Logic and Bit Fiddling. - (line 6) -* Low-level functions: Low-level Functions. (line 6) -* Lucas number algorithm: Lucas Numbers Algorithm. - (line 6) -* Lucas number functions: Number Theoretic Functions. - (line 119) -* MacOS X: Known Build Problems. - (line 51) -* Mailing lists: Introduction to GMP. (line 45) -* Malloc debugger: Debugging. (line 30) -* Malloc problems: Debugging. (line 24) -* Memory allocation: Custom Allocation. (line 6) -* Memory management: Memory Management. (line 6) -* Mersenne twister algorithm: Random Number Algorithms. - (line 17) -* Mersenne twister random numbers: Random State Initialization. - (line 13) -* MINGW: Notes for Particular Systems. - (line 43) -* MIPS: ABI and ISA. (line 132) -* Miscellaneous float functions: Miscellaneous Float Functions. - (line 6) -* Miscellaneous integer functions: Miscellaneous Integer Functions. - (line 6) -* MMX: Notes for Particular Systems. - (line 132) -* Modular inverse functions: Number Theoretic Functions. - (line 60) -* Most significant bit: Miscellaneous Integer Functions. - (line 34) -* mp.h: BSD Compatible Functions. - (line 21) -* MPN_PATH: Build Options. (line 335) -* MS Windows: Notes for Particular Systems. - (line 56) -* MS-DOS: Notes for Particular Systems. - (line 43) -* Multi-threading: Reentrancy. (line 6) -* Multiplication algorithms: Multiplication Algorithms. - (line 6) -* Nails: Low-level Functions. (line 478) -* Native compilation: Build Options. (line 52) -* NeXT: Known Build Problems. - (line 57) -* Next prime function: Number Theoretic Functions. - (line 23) -* Nomenclature: Nomenclature and Types. - (line 6) -* Non-Unix systems: Build Options. (line 11) -* Nth root algorithm: Nth Root Algorithm. (line 6) -* Number sequences: Efficiency. (line 147) -* Number theoretic functions: Number Theoretic Functions. - (line 6) -* Numerator and denominator: Applying Integer Functions. - (line 6) -* obstack output: Formatted Output Functions. - (line 81) -* OpenBSD: Notes for Particular Systems. - (line 86) -* Optimizing performance: Performance optimization. - (line 6) -* ostream output: C++ Formatted Output. - (line 6) -* Other languages: Language Bindings. (line 6) -* Output functions <1>: I/O of Floats. (line 6) -* Output functions <2>: I/O of Rationals. (line 6) -* Output functions <3>: Formatted Output Functions. - (line 6) -* Output functions: I/O of Integers. (line 6) -* Packaged builds: Notes for Package Builds. - (line 6) -* Parameter conventions: Parameter Conventions. - (line 6) -* Parsing expressions demo: Demonstration Programs. - (line 21) -* Particular systems: Notes for Particular Systems. - (line 6) -* Past GMP versions: Compatibility with older versions. - (line 6) -* PDF: Build Options. (line 350) -* Perfect power algorithm: Perfect Power Algorithm. - (line 6) -* Perfect power functions: Integer Roots. (line 27) -* Perfect square algorithm: Perfect Square Algorithm. - (line 6) -* Perfect square functions: Integer Roots. (line 36) -* perl: Demonstration Programs. - (line 35) -* Perl module: Demonstration Programs. - (line 35) -* Postscript: Build Options. (line 350) -* Power/PowerPC <1>: Known Build Problems. - (line 63) -* Power/PowerPC: Notes for Particular Systems. - (line 92) -* Powering algorithms: Powering Algorithms. (line 6) -* Powering functions <1>: Float Arithmetic. (line 41) -* Powering functions: Integer Exponentiation. - (line 6) -* PowerPC: ABI and ISA. (line 167) -* Precision of floats: Floating-point Functions. - (line 6) -* Precision of hardware floating point: Notes for Particular Systems. - (line 34) -* Prefix: Build Options. (line 32) -* Prime testing algorithms: Prime Testing Algorithm. - (line 6) -* Prime testing functions: Number Theoretic Functions. - (line 7) -* printf formatted output: Formatted Output. (line 6) -* Probable prime testing functions: Number Theoretic Functions. - (line 7) -* prof: Profiling. (line 24) -* Profiling: Profiling. (line 6) -* Radix conversion algorithms: Radix Conversion Algorithms. - (line 6) -* Random number algorithms: Random Number Algorithms. - (line 6) -* Random number functions <1>: Integer Random Numbers. - (line 6) -* Random number functions <2>: Miscellaneous Float Functions. - (line 27) -* Random number functions: Random Number Functions. - (line 6) -* Random number seeding: Random State Seeding. - (line 6) -* Random number state: Random State Initialization. - (line 6) -* Random state: Nomenclature and Types. - (line 46) -* Rational arithmetic: Efficiency. (line 113) -* Rational arithmetic functions: Rational Arithmetic. (line 6) -* Rational assignment functions: Initializing Rationals. - (line 6) -* Rational comparison functions: Comparing Rationals. (line 6) -* Rational conversion functions: Rational Conversions. - (line 6) -* Rational initialization functions: Initializing Rationals. - (line 6) -* Rational input and output functions: I/O of Rationals. (line 6) -* Rational internals: Rational Internals. (line 6) -* Rational number: Nomenclature and Types. - (line 16) -* Rational number functions: Rational Number Functions. - (line 6) -* Rational numerator and denominator: Applying Integer Functions. - (line 6) -* Rational sign tests: Comparing Rationals. (line 27) -* Raw output internals: Raw Output Internals. - (line 6) -* Reallocations: Efficiency. (line 30) -* Reentrancy: Reentrancy. (line 6) -* References: References. (line 6) -* Remove factor functions: Number Theoretic Functions. - (line 90) -* Reporting bugs: Reporting Bugs. (line 6) -* Root extraction algorithm: Nth Root Algorithm. (line 6) -* Root extraction algorithms: Root Extraction Algorithms. - (line 6) -* Root extraction functions <1>: Float Arithmetic. (line 37) -* Root extraction functions: Integer Roots. (line 6) -* Root testing functions: Integer Roots. (line 36) -* Rounding functions: Miscellaneous Float Functions. - (line 9) -* Sample programs: Demonstration Programs. - (line 6) -* Scan bit functions: Integer Logic and Bit Fiddling. - (line 38) -* scanf formatted input: Formatted Input. (line 6) -* SCO: Known Build Problems. - (line 38) -* Seeding random numbers: Random State Seeding. - (line 6) -* Segmentation violation: Debugging. (line 7) -* Sequent Symmetry: Known Build Problems. - (line 68) -* Services for Unix: Notes for Particular Systems. - (line 51) -* Shared library versioning: Notes for Package Builds. - (line 9) -* Sign tests <1>: Float Comparison. (line 33) -* Sign tests <2>: Integer Comparisons. (line 28) -* Sign tests: Comparing Rationals. (line 27) -* Size in digits: Miscellaneous Integer Functions. - (line 23) -* Small operands: Efficiency. (line 7) -* Solaris <1>: ABI and ISA. (line 201) -* Solaris: Known Build Problems. - (line 78) -* Sparc: Notes for Particular Systems. - (line 108) -* Sparc V9: ABI and ISA. (line 201) -* Special integer functions: Integer Special Functions. - (line 6) -* Square root algorithm: Square Root Algorithm. - (line 6) -* SSE2: Notes for Particular Systems. - (line 132) -* Stack backtrace: Debugging. (line 50) -* Stack overflow <1>: Debugging. (line 7) -* Stack overflow: Build Options. (line 278) -* Static linking: Efficiency. (line 14) -* stdarg.h: Headers and Libraries. - (line 17) -* stdio.h: Headers and Libraries. - (line 11) -* Stripped libraries: Known Build Problems. - (line 28) -* Sun: ABI and ISA. (line 201) -* SunOS: Notes for Particular Systems. - (line 120) -* Systems: Notes for Particular Systems. - (line 6) -* Temporary memory: Build Options. (line 278) -* Texinfo: Build Options. (line 347) -* Text input/output: Efficiency. (line 153) -* Thread safety: Reentrancy. (line 6) -* Toom multiplication <1>: Other Multiplication. - (line 6) -* Toom multiplication <2>: Toom 4-Way Multiplication. - (line 6) -* Toom multiplication: Toom 3-Way Multiplication. - (line 6) -* Types: Nomenclature and Types. - (line 6) -* ui and si functions: Efficiency. (line 50) -* Unbalanced multiplication: Unbalanced Multiplication. - (line 6) -* Upward compatibility: Compatibility with older versions. - (line 6) -* Useful macros and constants: Useful Macros and Constants. - (line 6) -* User-defined precision: Floating-point Functions. - (line 6) -* Valgrind: Debugging. (line 130) -* Variable conventions: Variable Conventions. - (line 6) -* Version number: Useful Macros and Constants. - (line 12) -* Web page: Introduction to GMP. (line 34) -* Windows: Notes for Particular Systems. - (line 56) -* x86: Notes for Particular Systems. - (line 126) -* x87: Notes for Particular Systems. - (line 34) -* XML: Build Options. (line 354) - - -File: gmp.info, Node: Function Index, Prev: Concept Index, Up: Top - -Function and Type Index -*********************** - -[index] -* Menu: - -* __GMP_CC: Useful Macros and Constants. - (line 23) -* __GMP_CFLAGS: Useful Macros and Constants. - (line 24) -* __GNU_MP_VERSION: Useful Macros and Constants. - (line 10) -* __GNU_MP_VERSION_MINOR: Useful Macros and Constants. - (line 11) -* __GNU_MP_VERSION_PATCHLEVEL: Useful Macros and Constants. - (line 12) -* _mpz_realloc: Integer Special Functions. - (line 51) -* abs <1>: C++ Interface Rationals. - (line 43) -* abs <2>: C++ Interface Integers. - (line 42) -* abs: C++ Interface Floats. - (line 70) -* ceil: C++ Interface Floats. - (line 71) -* cmp <1>: C++ Interface Floats. - (line 72) -* cmp <2>: C++ Interface Rationals. - (line 44) -* cmp <3>: C++ Interface Integers. - (line 44) -* cmp: C++ Interface Rationals. - (line 45) -* floor: C++ Interface Floats. - (line 80) -* gcd: BSD Compatible Functions. - (line 82) -* gmp_asprintf: Formatted Output Functions. - (line 65) -* gmp_errno: Random State Initialization. - (line 55) -* GMP_ERROR_INVALID_ARGUMENT: Random State Initialization. - (line 55) -* GMP_ERROR_UNSUPPORTED_ARGUMENT: Random State Initialization. - (line 55) -* gmp_fprintf: Formatted Output Functions. - (line 29) -* gmp_fscanf: Formatted Input Functions. - (line 25) -* GMP_LIMB_BITS: Low-level Functions. (line 508) -* GMP_NAIL_BITS: Low-level Functions. (line 506) -* GMP_NAIL_MASK: Low-level Functions. (line 516) -* GMP_NUMB_BITS: Low-level Functions. (line 507) -* GMP_NUMB_MASK: Low-level Functions. (line 517) -* GMP_NUMB_MAX: Low-level Functions. (line 525) -* gmp_obstack_printf: Formatted Output Functions. - (line 79) -* gmp_obstack_vprintf: Formatted Output Functions. - (line 81) -* gmp_printf: Formatted Output Functions. - (line 24) -* GMP_RAND_ALG_DEFAULT: Random State Initialization. - (line 49) -* GMP_RAND_ALG_LC: Random State Initialization. - (line 49) -* gmp_randclass: C++ Interface Random Numbers. - (line 7) -* gmp_randclass::get_f: C++ Interface Random Numbers. - (line 45) -* gmp_randclass::get_z_bits: C++ Interface Random Numbers. - (line 39) -* gmp_randclass::get_z_range: C++ Interface Random Numbers. - (line 42) -* gmp_randclass::gmp_randclass: C++ Interface Random Numbers. - (line 13) -* gmp_randclass::seed: C++ Interface Random Numbers. - (line 33) -* gmp_randclear: Random State Initialization. - (line 62) -* gmp_randinit: Random State Initialization. - (line 47) -* gmp_randinit_default: Random State Initialization. - (line 7) -* gmp_randinit_lc_2exp: Random State Initialization. - (line 18) -* gmp_randinit_lc_2exp_size: Random State Initialization. - (line 32) -* gmp_randinit_mt: Random State Initialization. - (line 13) -* gmp_randinit_set: Random State Initialization. - (line 43) -* gmp_randseed: Random State Seeding. - (line 7) -* gmp_randseed_ui: Random State Seeding. - (line 9) -* gmp_randstate_t: Nomenclature and Types. - (line 46) -* gmp_scanf: Formatted Input Functions. - (line 21) -* gmp_snprintf: Formatted Output Functions. - (line 46) -* gmp_sprintf: Formatted Output Functions. - (line 34) -* gmp_sscanf: Formatted Input Functions. - (line 29) -* gmp_urandomb_ui: Random State Miscellaneous. - (line 8) -* gmp_urandomm_ui: Random State Miscellaneous. - (line 14) -* gmp_vasprintf: Formatted Output Functions. - (line 66) -* gmp_version: Useful Macros and Constants. - (line 18) -* gmp_vfprintf: Formatted Output Functions. - (line 30) -* gmp_vfscanf: Formatted Input Functions. - (line 26) -* gmp_vprintf: Formatted Output Functions. - (line 25) -* gmp_vscanf: Formatted Input Functions. - (line 22) -* gmp_vsnprintf: Formatted Output Functions. - (line 48) -* gmp_vsprintf: Formatted Output Functions. - (line 35) -* gmp_vsscanf: Formatted Input Functions. - (line 31) -* hypot: C++ Interface Floats. - (line 81) -* itom: BSD Compatible Functions. - (line 29) -* madd: BSD Compatible Functions. - (line 43) -* mcmp: BSD Compatible Functions. - (line 85) -* mdiv: BSD Compatible Functions. - (line 53) -* mfree: BSD Compatible Functions. - (line 105) -* min: BSD Compatible Functions. - (line 89) -* MINT: BSD Compatible Functions. - (line 21) -* mout: BSD Compatible Functions. - (line 94) -* move: BSD Compatible Functions. - (line 39) -* mp_bitcnt_t: Nomenclature and Types. - (line 42) -* mp_bits_per_limb: Useful Macros and Constants. - (line 7) -* mp_exp_t: Nomenclature and Types. - (line 27) -* mp_get_memory_functions: Custom Allocation. (line 93) -* mp_limb_t: Nomenclature and Types. - (line 31) -* mp_set_memory_functions: Custom Allocation. (line 21) -* mp_size_t: Nomenclature and Types. - (line 37) -* mpf_abs: Float Arithmetic. (line 47) -* mpf_add: Float Arithmetic. (line 7) -* mpf_add_ui: Float Arithmetic. (line 9) -* mpf_ceil: Miscellaneous Float Functions. - (line 7) -* mpf_class: C++ Interface General. - (line 20) -* mpf_class::fits_sint_p: C++ Interface Floats. - (line 74) -* mpf_class::fits_slong_p: C++ Interface Floats. - (line 75) -* mpf_class::fits_sshort_p: C++ Interface Floats. - (line 76) -* mpf_class::fits_uint_p: C++ Interface Floats. - (line 77) -* mpf_class::fits_ulong_p: C++ Interface Floats. - (line 78) -* mpf_class::fits_ushort_p: C++ Interface Floats. - (line 79) -* mpf_class::get_d: C++ Interface Floats. - (line 82) -* mpf_class::get_mpf_t: C++ Interface General. - (line 66) -* mpf_class::get_prec: C++ Interface Floats. - (line 100) -* mpf_class::get_si: C++ Interface Floats. - (line 83) -* mpf_class::get_str: C++ Interface Floats. - (line 85) -* mpf_class::get_ui: C++ Interface Floats. - (line 86) -* mpf_class::mpf_class: C++ Interface Floats. - (line 38) -* mpf_class::operator=: C++ Interface Floats. - (line 47) -* mpf_class::set_prec: C++ Interface Floats. - (line 101) -* mpf_class::set_prec_raw: C++ Interface Floats. - (line 102) -* mpf_class::set_str: C++ Interface Floats. - (line 88) -* mpf_clear: Initializing Floats. (line 37) -* mpf_clears: Initializing Floats. (line 41) -* mpf_cmp: Float Comparison. (line 7) -* mpf_cmp_d: Float Comparison. (line 8) -* mpf_cmp_si: Float Comparison. (line 10) -* mpf_cmp_ui: Float Comparison. (line 9) -* mpf_div: Float Arithmetic. (line 29) -* mpf_div_2exp: Float Arithmetic. (line 53) -* mpf_div_ui: Float Arithmetic. (line 33) -* mpf_eq: Float Comparison. (line 17) -* mpf_fits_sint_p: Miscellaneous Float Functions. - (line 20) -* mpf_fits_slong_p: Miscellaneous Float Functions. - (line 18) -* mpf_fits_sshort_p: Miscellaneous Float Functions. - (line 22) -* mpf_fits_uint_p: Miscellaneous Float Functions. - (line 19) -* mpf_fits_ulong_p: Miscellaneous Float Functions. - (line 17) -* mpf_fits_ushort_p: Miscellaneous Float Functions. - (line 21) -* mpf_floor: Miscellaneous Float Functions. - (line 8) -* mpf_get_d: Converting Floats. (line 7) -* mpf_get_d_2exp: Converting Floats. (line 16) -* mpf_get_default_prec: Initializing Floats. (line 12) -* mpf_get_prec: Initializing Floats. (line 62) -* mpf_get_si: Converting Floats. (line 27) -* mpf_get_str: Converting Floats. (line 37) -* mpf_get_ui: Converting Floats. (line 28) -* mpf_init: Initializing Floats. (line 19) -* mpf_init2: Initializing Floats. (line 26) -* mpf_init_set: Simultaneous Float Init & Assign. - (line 16) -* mpf_init_set_d: Simultaneous Float Init & Assign. - (line 19) -* mpf_init_set_si: Simultaneous Float Init & Assign. - (line 18) -* mpf_init_set_str: Simultaneous Float Init & Assign. - (line 25) -* mpf_init_set_ui: Simultaneous Float Init & Assign. - (line 17) -* mpf_inits: Initializing Floats. (line 31) -* mpf_inp_str: I/O of Floats. (line 37) -* mpf_integer_p: Miscellaneous Float Functions. - (line 14) -* mpf_mul: Float Arithmetic. (line 19) -* mpf_mul_2exp: Float Arithmetic. (line 50) -* mpf_mul_ui: Float Arithmetic. (line 21) -* mpf_neg: Float Arithmetic. (line 44) -* mpf_out_str: I/O of Floats. (line 17) -* mpf_pow_ui: Float Arithmetic. (line 41) -* mpf_random2: Miscellaneous Float Functions. - (line 36) -* mpf_reldiff: Float Comparison. (line 29) -* mpf_set: Assigning Floats. (line 10) -* mpf_set_d: Assigning Floats. (line 13) -* mpf_set_default_prec: Initializing Floats. (line 7) -* mpf_set_prec: Initializing Floats. (line 65) -* mpf_set_prec_raw: Initializing Floats. (line 72) -* mpf_set_q: Assigning Floats. (line 15) -* mpf_set_si: Assigning Floats. (line 12) -* mpf_set_str: Assigning Floats. (line 18) -* mpf_set_ui: Assigning Floats. (line 11) -* mpf_set_z: Assigning Floats. (line 14) -* mpf_sgn: Float Comparison. (line 33) -* mpf_sqrt: Float Arithmetic. (line 36) -* mpf_sqrt_ui: Float Arithmetic. (line 37) -* mpf_sub: Float Arithmetic. (line 12) -* mpf_sub_ui: Float Arithmetic. (line 16) -* mpf_swap: Assigning Floats. (line 52) -* mpf_t: Nomenclature and Types. - (line 21) -* mpf_trunc: Miscellaneous Float Functions. - (line 9) -* mpf_ui_div: Float Arithmetic. (line 31) -* mpf_ui_sub: Float Arithmetic. (line 14) -* mpf_urandomb: Miscellaneous Float Functions. - (line 27) -* mpn_add: Low-level Functions. (line 69) -* mpn_add_1: Low-level Functions. (line 64) -* mpn_add_n: Low-level Functions. (line 54) -* mpn_addmul_1: Low-level Functions. (line 148) -* mpn_and_n: Low-level Functions. (line 420) -* mpn_andn_n: Low-level Functions. (line 435) -* mpn_cmp: Low-level Functions. (line 284) -* mpn_com: Low-level Functions. (line 460) -* mpn_copyd: Low-level Functions. (line 469) -* mpn_copyi: Low-level Functions. (line 465) -* mpn_divexact_by3: Low-level Functions. (line 229) -* mpn_divexact_by3c: Low-level Functions. (line 231) -* mpn_divmod: Low-level Functions. (line 224) -* mpn_divmod_1: Low-level Functions. (line 208) -* mpn_divrem: Low-level Functions. (line 182) -* mpn_divrem_1: Low-level Functions. (line 206) -* mpn_gcd: Low-level Functions. (line 289) -* mpn_gcd_1: Low-level Functions. (line 299) -* mpn_gcdext: Low-level Functions. (line 305) -* mpn_get_str: Low-level Functions. (line 346) -* mpn_hamdist: Low-level Functions. (line 410) -* mpn_ior_n: Low-level Functions. (line 425) -* mpn_iorn_n: Low-level Functions. (line 440) -* mpn_lshift: Low-level Functions. (line 260) -* mpn_mod_1: Low-level Functions. (line 255) -* mpn_mul: Low-level Functions. (line 114) -* mpn_mul_1: Low-level Functions. (line 133) -* mpn_mul_n: Low-level Functions. (line 103) -* mpn_nand_n: Low-level Functions. (line 445) -* mpn_neg: Low-level Functions. (line 98) -* mpn_nior_n: Low-level Functions. (line 450) -* mpn_perfect_square_p: Low-level Functions. (line 416) -* mpn_popcount: Low-level Functions. (line 406) -* mpn_random: Low-level Functions. (line 395) -* mpn_random2: Low-level Functions. (line 396) -* mpn_rshift: Low-level Functions. (line 272) -* mpn_scan0: Low-level Functions. (line 380) -* mpn_scan1: Low-level Functions. (line 388) -* mpn_set_str: Low-level Functions. (line 361) -* mpn_sqr: Low-level Functions. (line 125) -* mpn_sqrtrem: Low-level Functions. (line 328) -* mpn_sub: Low-level Functions. (line 90) -* mpn_sub_1: Low-level Functions. (line 85) -* mpn_sub_n: Low-level Functions. (line 76) -* mpn_submul_1: Low-level Functions. (line 159) -* mpn_tdiv_qr: Low-level Functions. (line 171) -* mpn_xnor_n: Low-level Functions. (line 455) -* mpn_xor_n: Low-level Functions. (line 430) -* mpn_zero: Low-level Functions. (line 472) -* mpq_abs: Rational Arithmetic. (line 31) -* mpq_add: Rational Arithmetic. (line 7) -* mpq_canonicalize: Rational Number Functions. - (line 22) -* mpq_class: C++ Interface General. - (line 19) -* mpq_class::canonicalize: C++ Interface Rationals. - (line 37) -* mpq_class::get_d: C++ Interface Rationals. - (line 46) -* mpq_class::get_den: C++ Interface Rationals. - (line 58) -* mpq_class::get_den_mpz_t: C++ Interface Rationals. - (line 68) -* mpq_class::get_mpq_t: C++ Interface General. - (line 65) -* mpq_class::get_num: C++ Interface Rationals. - (line 57) -* mpq_class::get_num_mpz_t: C++ Interface Rationals. - (line 67) -* mpq_class::get_str: C++ Interface Rationals. - (line 47) -* mpq_class::mpq_class: C++ Interface Rationals. - (line 22) -* mpq_class::set_str: C++ Interface Rationals. - (line 49) -* mpq_clear: Initializing Rationals. - (line 16) -* mpq_clears: Initializing Rationals. - (line 20) -* mpq_cmp: Comparing Rationals. (line 7) -* mpq_cmp_si: Comparing Rationals. (line 17) -* mpq_cmp_ui: Comparing Rationals. (line 15) -* mpq_denref: Applying Integer Functions. - (line 18) -* mpq_div: Rational Arithmetic. (line 22) -* mpq_div_2exp: Rational Arithmetic. (line 25) -* mpq_equal: Comparing Rationals. (line 33) -* mpq_get_d: Rational Conversions. - (line 7) -* mpq_get_den: Applying Integer Functions. - (line 24) -* mpq_get_num: Applying Integer Functions. - (line 23) -* mpq_get_str: Rational Conversions. - (line 22) -* mpq_init: Initializing Rationals. - (line 7) -* mpq_inits: Initializing Rationals. - (line 12) -* mpq_inp_str: I/O of Rationals. (line 23) -* mpq_inv: Rational Arithmetic. (line 34) -* mpq_mul: Rational Arithmetic. (line 15) -* mpq_mul_2exp: Rational Arithmetic. (line 18) -* mpq_neg: Rational Arithmetic. (line 28) -* mpq_numref: Applying Integer Functions. - (line 17) -* mpq_out_str: I/O of Rationals. (line 15) -* mpq_set: Initializing Rationals. - (line 24) -* mpq_set_d: Rational Conversions. - (line 17) -* mpq_set_den: Applying Integer Functions. - (line 26) -* mpq_set_f: Rational Conversions. - (line 18) -* mpq_set_num: Applying Integer Functions. - (line 25) -* mpq_set_si: Initializing Rationals. - (line 31) -* mpq_set_str: Initializing Rationals. - (line 36) -* mpq_set_ui: Initializing Rationals. - (line 29) -* mpq_set_z: Initializing Rationals. - (line 25) -* mpq_sgn: Comparing Rationals. (line 27) -* mpq_sub: Rational Arithmetic. (line 11) -* mpq_swap: Initializing Rationals. - (line 56) -* mpq_t: Nomenclature and Types. - (line 16) -* mpz_abs: Integer Arithmetic. (line 42) -* mpz_add: Integer Arithmetic. (line 7) -* mpz_add_ui: Integer Arithmetic. (line 9) -* mpz_addmul: Integer Arithmetic. (line 25) -* mpz_addmul_ui: Integer Arithmetic. (line 27) -* mpz_and: Integer Logic and Bit Fiddling. - (line 11) -* mpz_array_init: Integer Special Functions. - (line 11) -* mpz_bin_ui: Number Theoretic Functions. - (line 98) -* mpz_bin_uiui: Number Theoretic Functions. - (line 100) -* mpz_cdiv_q: Integer Division. (line 13) -* mpz_cdiv_q_2exp: Integer Division. (line 24) -* mpz_cdiv_q_ui: Integer Division. (line 17) -* mpz_cdiv_qr: Integer Division. (line 15) -* mpz_cdiv_qr_ui: Integer Division. (line 21) -* mpz_cdiv_r: Integer Division. (line 14) -* mpz_cdiv_r_2exp: Integer Division. (line 25) -* mpz_cdiv_r_ui: Integer Division. (line 19) -* mpz_cdiv_ui: Integer Division. (line 23) -* mpz_class: C++ Interface General. - (line 18) -* mpz_class::fits_sint_p: C++ Interface Integers. - (line 45) -* mpz_class::fits_slong_p: C++ Interface Integers. - (line 46) -* mpz_class::fits_sshort_p: C++ Interface Integers. - (line 47) -* mpz_class::fits_uint_p: C++ Interface Integers. - (line 48) -* mpz_class::fits_ulong_p: C++ Interface Integers. - (line 49) -* mpz_class::fits_ushort_p: C++ Interface Integers. - (line 50) -* mpz_class::get_d: C++ Interface Integers. - (line 51) -* mpz_class::get_mpz_t: C++ Interface General. - (line 64) -* mpz_class::get_si: C++ Interface Integers. - (line 52) -* mpz_class::get_str: C++ Interface Integers. - (line 53) -* mpz_class::get_ui: C++ Interface Integers. - (line 54) -* mpz_class::mpz_class: C++ Interface Integers. - (line 7) -* mpz_class::set_str: C++ Interface Integers. - (line 56) -* mpz_clear: Initializing Integers. - (line 44) -* mpz_clears: Initializing Integers. - (line 48) -* mpz_clrbit: Integer Logic and Bit Fiddling. - (line 54) -* mpz_cmp: Integer Comparisons. (line 7) -* mpz_cmp_d: Integer Comparisons. (line 8) -* mpz_cmp_si: Integer Comparisons. (line 9) -* mpz_cmp_ui: Integer Comparisons. (line 10) -* mpz_cmpabs: Integer Comparisons. (line 18) -* mpz_cmpabs_d: Integer Comparisons. (line 19) -* mpz_cmpabs_ui: Integer Comparisons. (line 20) -* mpz_com: Integer Logic and Bit Fiddling. - (line 20) -* mpz_combit: Integer Logic and Bit Fiddling. - (line 57) -* mpz_congruent_2exp_p: Integer Division. (line 124) -* mpz_congruent_p: Integer Division. (line 121) -* mpz_congruent_ui_p: Integer Division. (line 123) -* mpz_divexact: Integer Division. (line 101) -* mpz_divexact_ui: Integer Division. (line 102) -* mpz_divisible_2exp_p: Integer Division. (line 112) -* mpz_divisible_p: Integer Division. (line 110) -* mpz_divisible_ui_p: Integer Division. (line 111) -* mpz_even_p: Miscellaneous Integer Functions. - (line 18) -* mpz_export: Integer Import and Export. - (line 45) -* mpz_fac_ui: Number Theoretic Functions. - (line 95) -* mpz_fdiv_q: Integer Division. (line 27) -* mpz_fdiv_q_2exp: Integer Division. (line 38) -* mpz_fdiv_q_ui: Integer Division. (line 31) -* mpz_fdiv_qr: Integer Division. (line 29) -* mpz_fdiv_qr_ui: Integer Division. (line 35) -* mpz_fdiv_r: Integer Division. (line 28) -* mpz_fdiv_r_2exp: Integer Division. (line 39) -* mpz_fdiv_r_ui: Integer Division. (line 33) -* mpz_fdiv_ui: Integer Division. (line 37) -* mpz_fib2_ui: Number Theoretic Functions. - (line 108) -* mpz_fib_ui: Number Theoretic Functions. - (line 106) -* mpz_fits_sint_p: Miscellaneous Integer Functions. - (line 10) -* mpz_fits_slong_p: Miscellaneous Integer Functions. - (line 8) -* mpz_fits_sshort_p: Miscellaneous Integer Functions. - (line 12) -* mpz_fits_uint_p: Miscellaneous Integer Functions. - (line 9) -* mpz_fits_ulong_p: Miscellaneous Integer Functions. - (line 7) -* mpz_fits_ushort_p: Miscellaneous Integer Functions. - (line 11) -* mpz_gcd: Number Theoretic Functions. - (line 30) -* mpz_gcd_ui: Number Theoretic Functions. - (line 35) -* mpz_gcdext: Number Theoretic Functions. - (line 45) -* mpz_get_d: Converting Integers. (line 27) -* mpz_get_d_2exp: Converting Integers. (line 35) -* mpz_get_si: Converting Integers. (line 18) -* mpz_get_str: Converting Integers. (line 46) -* mpz_get_ui: Converting Integers. (line 11) -* mpz_getlimbn: Integer Special Functions. - (line 60) -* mpz_hamdist: Integer Logic and Bit Fiddling. - (line 29) -* mpz_import: Integer Import and Export. - (line 11) -* mpz_init: Initializing Integers. - (line 26) -* mpz_init2: Initializing Integers. - (line 33) -* mpz_init_set: Simultaneous Integer Init & Assign. - (line 27) -* mpz_init_set_d: Simultaneous Integer Init & Assign. - (line 30) -* mpz_init_set_si: Simultaneous Integer Init & Assign. - (line 29) -* mpz_init_set_str: Simultaneous Integer Init & Assign. - (line 34) -* mpz_init_set_ui: Simultaneous Integer Init & Assign. - (line 28) -* mpz_inits: Initializing Integers. - (line 29) -* mpz_inp_raw: I/O of Integers. (line 59) -* mpz_inp_str: I/O of Integers. (line 28) -* mpz_invert: Number Theoretic Functions. - (line 60) -* mpz_ior: Integer Logic and Bit Fiddling. - (line 14) -* mpz_jacobi: Number Theoretic Functions. - (line 66) -* mpz_kronecker: Number Theoretic Functions. - (line 74) -* mpz_kronecker_si: Number Theoretic Functions. - (line 75) -* mpz_kronecker_ui: Number Theoretic Functions. - (line 76) -* mpz_lcm: Number Theoretic Functions. - (line 54) -* mpz_lcm_ui: Number Theoretic Functions. - (line 55) -* mpz_legendre: Number Theoretic Functions. - (line 69) -* mpz_lucnum2_ui: Number Theoretic Functions. - (line 119) -* mpz_lucnum_ui: Number Theoretic Functions. - (line 117) -* mpz_mod: Integer Division. (line 91) -* mpz_mod_ui: Integer Division. (line 93) -* mpz_mul: Integer Arithmetic. (line 19) -* mpz_mul_2exp: Integer Arithmetic. (line 35) -* mpz_mul_si: Integer Arithmetic. (line 20) -* mpz_mul_ui: Integer Arithmetic. (line 22) -* mpz_neg: Integer Arithmetic. (line 39) -* mpz_nextprime: Number Theoretic Functions. - (line 23) -* mpz_odd_p: Miscellaneous Integer Functions. - (line 17) -* mpz_out_raw: I/O of Integers. (line 43) -* mpz_out_str: I/O of Integers. (line 16) -* mpz_perfect_power_p: Integer Roots. (line 27) -* mpz_perfect_square_p: Integer Roots. (line 36) -* mpz_popcount: Integer Logic and Bit Fiddling. - (line 23) -* mpz_pow_ui: Integer Exponentiation. - (line 31) -* mpz_powm: Integer Exponentiation. - (line 8) -* mpz_powm_sec: Integer Exponentiation. - (line 18) -* mpz_powm_ui: Integer Exponentiation. - (line 10) -* mpz_probab_prime_p: Number Theoretic Functions. - (line 7) -* mpz_random: Integer Random Numbers. - (line 42) -* mpz_random2: Integer Random Numbers. - (line 51) -* mpz_realloc2: Initializing Integers. - (line 52) -* mpz_remove: Number Theoretic Functions. - (line 90) -* mpz_root: Integer Roots. (line 7) -* mpz_rootrem: Integer Roots. (line 13) -* mpz_rrandomb: Integer Random Numbers. - (line 31) -* mpz_scan0: Integer Logic and Bit Fiddling. - (line 37) -* mpz_scan1: Integer Logic and Bit Fiddling. - (line 38) -* mpz_set: Assigning Integers. (line 10) -* mpz_set_d: Assigning Integers. (line 13) -* mpz_set_f: Assigning Integers. (line 15) -* mpz_set_q: Assigning Integers. (line 14) -* mpz_set_si: Assigning Integers. (line 12) -* mpz_set_str: Assigning Integers. (line 21) -* mpz_set_ui: Assigning Integers. (line 11) -* mpz_setbit: Integer Logic and Bit Fiddling. - (line 51) -* mpz_sgn: Integer Comparisons. (line 28) -* mpz_si_kronecker: Number Theoretic Functions. - (line 77) -* mpz_size: Integer Special Functions. - (line 68) -* mpz_sizeinbase: Miscellaneous Integer Functions. - (line 23) -* mpz_sqrt: Integer Roots. (line 17) -* mpz_sqrtrem: Integer Roots. (line 20) -* mpz_sub: Integer Arithmetic. (line 12) -* mpz_sub_ui: Integer Arithmetic. (line 14) -* mpz_submul: Integer Arithmetic. (line 30) -* mpz_submul_ui: Integer Arithmetic. (line 32) -* mpz_swap: Assigning Integers. (line 37) -* mpz_t: Nomenclature and Types. - (line 6) -* mpz_tdiv_q: Integer Division. (line 41) -* mpz_tdiv_q_2exp: Integer Division. (line 52) -* mpz_tdiv_q_ui: Integer Division. (line 45) -* mpz_tdiv_qr: Integer Division. (line 43) -* mpz_tdiv_qr_ui: Integer Division. (line 49) -* mpz_tdiv_r: Integer Division. (line 42) -* mpz_tdiv_r_2exp: Integer Division. (line 53) -* mpz_tdiv_r_ui: Integer Division. (line 47) -* mpz_tdiv_ui: Integer Division. (line 51) -* mpz_tstbit: Integer Logic and Bit Fiddling. - (line 60) -* mpz_ui_kronecker: Number Theoretic Functions. - (line 78) -* mpz_ui_pow_ui: Integer Exponentiation. - (line 33) -* mpz_ui_sub: Integer Arithmetic. (line 16) -* mpz_urandomb: Integer Random Numbers. - (line 14) -* mpz_urandomm: Integer Random Numbers. - (line 23) -* mpz_xor: Integer Logic and Bit Fiddling. - (line 17) -* msqrt: BSD Compatible Functions. - (line 63) -* msub: BSD Compatible Functions. - (line 46) -* mtox: BSD Compatible Functions. - (line 98) -* mult: BSD Compatible Functions. - (line 49) -* operator%: C++ Interface Integers. - (line 30) -* operator/: C++ Interface Integers. - (line 29) -* operator<<: C++ Formatted Output. - (line 20) -* operator>> <1>: C++ Formatted Input. (line 11) -* operator>>: C++ Interface Rationals. - (line 77) -* pow: BSD Compatible Functions. - (line 71) -* rpow: BSD Compatible Functions. - (line 79) -* sdiv: BSD Compatible Functions. - (line 55) -* sgn <1>: C++ Interface Rationals. - (line 50) -* sgn <2>: C++ Interface Integers. - (line 57) -* sgn: C++ Interface Floats. - (line 89) -* sqrt <1>: C++ Interface Integers. - (line 58) -* sqrt: C++ Interface Floats. - (line 90) -* trunc: C++ Interface Floats. - (line 91) -* xtom: BSD Compatible Functions. - (line 34) - - diff --git a/misc/builddeps/dp.linux64/share/man/man1/cjpeg.1 b/misc/builddeps/dp.linux64/share/man/man1/cjpeg.1 deleted file mode 100644 index 01bfa259..00000000 --- a/misc/builddeps/dp.linux64/share/man/man1/cjpeg.1 +++ /dev/null @@ -1,325 +0,0 @@ -.TH CJPEG 1 "30 December 2009" -.SH NAME -cjpeg \- compress an image file to a JPEG file -.SH SYNOPSIS -.B cjpeg -[ -.I options -] -[ -.I filename -] -.LP -.SH DESCRIPTION -.LP -.B cjpeg -compresses the named image file, or the standard input if no file is -named, and produces a JPEG/JFIF file on the standard output. -The currently supported input file formats are: PPM (PBMPLUS color -format), PGM (PBMPLUS gray-scale format), BMP, Targa, and RLE (Utah Raster -Toolkit format). (RLE is supported only if the URT library is available.) -.SH OPTIONS -All switch names may be abbreviated; for example, -.B \-grayscale -may be written -.B \-gray -or -.BR \-gr . -Most of the "basic" switches can be abbreviated to as little as one letter. -Upper and lower case are equivalent (thus -.B \-BMP -is the same as -.BR \-bmp ). -British spellings are also accepted (e.g., -.BR \-greyscale ), -though for brevity these are not mentioned below. -.PP -The basic switches are: -.TP -.BI \-quality " N[,...]" -Scale quantization tables to adjust image quality. Quality is 0 (worst) to -100 (best); default is 75. (See below for more info.) -.TP -.B \-grayscale -Create monochrome JPEG file from color input. Be sure to use this switch when -compressing a grayscale BMP file, because -.B cjpeg -isn't bright enough to notice whether a BMP file uses only shades of gray. -By saying -.BR \-grayscale , -you'll get a smaller JPEG file that takes less time to process. -.TP -.B \-optimize -Perform optimization of entropy encoding parameters. Without this, default -encoding parameters are used. -.B \-optimize -usually makes the JPEG file a little smaller, but -.B cjpeg -runs somewhat slower and needs much more memory. Image quality and speed of -decompression are unaffected by -.BR \-optimize . -.TP -.B \-progressive -Create progressive JPEG file (see below). -.TP -.BI \-scale " M/N" -Scale the output image by a factor M/N. Currently supported scale factors are -8/N with all N from 1 to 16. -.TP -.B \-targa -Input file is Targa format. Targa files that contain an "identification" -field will not be automatically recognized by -.BR cjpeg ; -for such files you must specify -.B \-targa -to make -.B cjpeg -treat the input as Targa format. -For most Targa files, you won't need this switch. -.PP -The -.B \-quality -switch lets you trade off compressed file size against quality of the -reconstructed image: the higher the quality setting, the larger the JPEG file, -and the closer the output image will be to the original input. Normally you -want to use the lowest quality setting (smallest file) that decompresses into -something visually indistinguishable from the original image. For this -purpose the quality setting should be between 50 and 95; the default of 75 is -often about right. If you see defects at -.B \-quality -75, then go up 5 or 10 counts at a time until you are happy with the output -image. (The optimal setting will vary from one image to another.) -.PP -.B \-quality -100 will generate a quantization table of all 1's, minimizing loss in the -quantization step (but there is still information loss in subsampling, as well -as roundoff error). This setting is mainly of interest for experimental -purposes. Quality values above about 95 are -.B not -recommended for normal use; the compressed file size goes up dramatically for -hardly any gain in output image quality. -.PP -In the other direction, quality values below 50 will produce very small files -of low image quality. Settings around 5 to 10 might be useful in preparing an -index of a large image library, for example. Try -.B \-quality -2 (or so) for some amusing Cubist effects. (Note: quality -values below about 25 generate 2-byte quantization tables, which are -considered optional in the JPEG standard. -.B cjpeg -emits a warning message when you give such a quality value, because some -other JPEG programs may be unable to decode the resulting file. Use -.B \-baseline -if you need to ensure compatibility at low quality values.) -.PP -The -.B \-quality -option has been extended in IJG version 7 for support of separate quality -settings for luminance and chrominance (or in general, for every provided -quantization table slot). This feature is useful for high-quality -applications which cannot accept the damage of color data by coarse -subsampling settings. You can now easily reduce the color data amount more -smoothly with finer control without separate subsampling. The resulting file -is fully compliant with standard JPEG decoders. -Note that the -.B \-quality -ratings refer to the quantization table slots, and that the last value is -replicated if there are more q-table slots than parameters. The default -q-table slots are 0 for luminance and 1 for chrominance with default tables as -given in the JPEG standard. This is compatible with the old behaviour in case -that only one parameter is given, which is then used for both luminance and -chrominance (slots 0 and 1). More or custom quantization tables can be set -with -.B \-qtables -and assigned to components with -.B \-qslots -parameter (see the "wizard" switches below). -.B Caution: -You must explicitly add -.BI \-sample " 1x1" -for efficient separate color -quality selection, since the default value used by library is 2x2! -.PP -The -.B \-progressive -switch creates a "progressive JPEG" file. In this type of JPEG file, the data -is stored in multiple scans of increasing quality. If the file is being -transmitted over a slow communications link, the decoder can use the first -scan to display a low-quality image very quickly, and can then improve the -display with each subsequent scan. The final image is exactly equivalent to a -standard JPEG file of the same quality setting, and the total file size is -about the same --- often a little smaller. -.PP -Switches for advanced users: -.TP -.B \-dct int -Use integer DCT method (default). -.TP -.B \-dct fast -Use fast integer DCT (less accurate). -.TP -.B \-dct float -Use floating-point DCT method. -The float method is very slightly more accurate than the int method, but is -much slower unless your machine has very fast floating-point hardware. Also -note that results of the floating-point method may vary slightly across -machines, while the integer methods should give the same results everywhere. -The fast integer method is much less accurate than the other two. -.TP -.B \-nosmooth -Don't use high-quality downsampling. -.TP -.BI \-restart " N" -Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is -attached to the number. -.B \-restart 0 -(the default) means no restart markers. -.TP -.BI \-smooth " N" -Smooth the input image to eliminate dithering noise. N, ranging from 1 to -100, indicates the strength of smoothing. 0 (the default) means no smoothing. -.TP -.BI \-maxmemory " N" -Set limit for amount of memory to use in processing large images. Value is -in thousands of bytes, or millions of bytes if "M" is attached to the -number. For example, -.B \-max 4m -selects 4000000 bytes. If more space is needed, temporary files will be used. -.TP -.BI \-outfile " name" -Send output image to the named file, not to standard output. -.TP -.B \-verbose -Enable debug printout. More -.BR \-v 's -give more output. Also, version information is printed at startup. -.TP -.B \-debug -Same as -.BR \-verbose . -.PP -The -.B \-restart -option inserts extra markers that allow a JPEG decoder to resynchronize after -a transmission error. Without restart markers, any damage to a compressed -file will usually ruin the image from the point of the error to the end of the -image; with restart markers, the damage is usually confined to the portion of -the image up to the next restart marker. Of course, the restart markers -occupy extra space. We recommend -.B \-restart 1 -for images that will be transmitted across unreliable networks such as Usenet. -.PP -The -.B \-smooth -option filters the input to eliminate fine-scale noise. This is often useful -when converting dithered images to JPEG: a moderate smoothing factor of 10 to -50 gets rid of dithering patterns in the input file, resulting in a smaller -JPEG file and a better-looking image. Too large a smoothing factor will -visibly blur the image, however. -.PP -Switches for wizards: -.TP -.B \-arithmetic -Use arithmetic coding. -.B Caution: -arithmetic coded JPEG is not yet widely implemented, so many decoders will be -unable to view an arithmetic coded JPEG file at all. -.TP -.B \-baseline -Force baseline-compatible quantization tables to be generated. This clamps -quantization values to 8 bits even at low quality settings. (This switch is -poorly named, since it does not ensure that the output is actually baseline -JPEG. For example, you can use -.B \-baseline -and -.B \-progressive -together.) -.TP -.BI \-qtables " file" -Use the quantization tables given in the specified text file. -.TP -.BI \-qslots " N[,...]" -Select which quantization table to use for each color component. -.TP -.BI \-sample " HxV[,...]" -Set JPEG sampling factors for each color component. -.TP -.BI \-scans " file" -Use the scan script given in the specified text file. -.PP -The "wizard" switches are intended for experimentation with JPEG. If you -don't know what you are doing, \fBdon't use them\fR. These switches are -documented further in the file wizard.txt. -.SH EXAMPLES -.LP -This example compresses the PPM file foo.ppm with a quality factor of -60 and saves the output as foo.jpg: -.IP -.B cjpeg \-quality -.I 60 foo.ppm -.B > -.I foo.jpg -.SH HINTS -Color GIF files are not the ideal input for JPEG; JPEG is really intended for -compressing full-color (24-bit) images. In particular, don't try to convert -cartoons, line drawings, and other images that have only a few distinct -colors. GIF works great on these, JPEG does not. If you want to convert a -GIF to JPEG, you should experiment with -.BR cjpeg 's -.B \-quality -and -.B \-smooth -options to get a satisfactory conversion. -.B \-smooth 10 -or so is often helpful. -.PP -Avoid running an image through a series of JPEG compression/decompression -cycles. Image quality loss will accumulate; after ten or so cycles the image -may be noticeably worse than it was after one cycle. It's best to use a -lossless format while manipulating an image, then convert to JPEG format when -you are ready to file the image away. -.PP -The -.B \-optimize -option to -.B cjpeg -is worth using when you are making a "final" version for posting or archiving. -It's also a win when you are using low quality settings to make very small -JPEG files; the percentage improvement is often a lot more than it is on -larger files. (At present, -.B \-optimize -mode is always selected when generating progressive JPEG files.) -.SH ENVIRONMENT -.TP -.B JPEGMEM -If this environment variable is set, its value is the default memory limit. -The value is specified as described for the -.B \-maxmemory -switch. -.B JPEGMEM -overrides the default value specified when the program was compiled, and -itself is overridden by an explicit -.BR \-maxmemory . -.SH SEE ALSO -.BR djpeg (1), -.BR jpegtran (1), -.BR rdjpgcom (1), -.BR wrjpgcom (1) -.br -.BR ppm (5), -.BR pgm (5) -.br -Wallace, Gregory K. "The JPEG Still Picture Compression Standard", -Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. -.SH AUTHOR -Independent JPEG Group -.SH BUGS -GIF input files are no longer supported, to avoid the Unisys LZW patent. -(Conversion of GIF files to JPEG is usually a bad idea anyway.) -.PP -Not all variants of BMP and Targa file formats are supported. -.PP -The -.B \-targa -switch is not a bug, it's a feature. (It would be a bug if the Targa format -designers had not been clueless.) diff --git a/misc/builddeps/dp.linux64/share/man/man1/djpeg.1 b/misc/builddeps/dp.linux64/share/man/man1/djpeg.1 deleted file mode 100644 index f3722d15..00000000 --- a/misc/builddeps/dp.linux64/share/man/man1/djpeg.1 +++ /dev/null @@ -1,252 +0,0 @@ -.TH DJPEG 1 "3 October 2009" -.SH NAME -djpeg \- decompress a JPEG file to an image file -.SH SYNOPSIS -.B djpeg -[ -.I options -] -[ -.I filename -] -.LP -.SH DESCRIPTION -.LP -.B djpeg -decompresses the named JPEG file, or the standard input if no file is named, -and produces an image file on the standard output. PBMPLUS (PPM/PGM), BMP, -GIF, Targa, or RLE (Utah Raster Toolkit) output format can be selected. -(RLE is supported only if the URT library is available.) -.SH OPTIONS -All switch names may be abbreviated; for example, -.B \-grayscale -may be written -.B \-gray -or -.BR \-gr . -Most of the "basic" switches can be abbreviated to as little as one letter. -Upper and lower case are equivalent (thus -.B \-BMP -is the same as -.BR \-bmp ). -British spellings are also accepted (e.g., -.BR \-greyscale ), -though for brevity these are not mentioned below. -.PP -The basic switches are: -.TP -.BI \-colors " N" -Reduce image to at most N colors. This reduces the number of colors used in -the output image, so that it can be displayed on a colormapped display or -stored in a colormapped file format. For example, if you have an 8-bit -display, you'd need to reduce to 256 or fewer colors. -.TP -.BI \-quantize " N" -Same as -.BR \-colors . -.B \-colors -is the recommended name, -.B \-quantize -is provided only for backwards compatibility. -.TP -.B \-fast -Select recommended processing options for fast, low quality output. (The -default options are chosen for highest quality output.) Currently, this is -equivalent to \fB\-dct fast \-nosmooth \-onepass \-dither ordered\fR. -.TP -.B \-grayscale -Force gray-scale output even if JPEG file is color. Useful for viewing on -monochrome displays; also, -.B djpeg -runs noticeably faster in this mode. -.TP -.BI \-scale " M/N" -Scale the output image by a factor M/N. Currently supported scale factors are -M/N with all M from 1 to 16, where N is the source DCT size, which is 8 for -baseline JPEG. If the /N part is omitted, then M specifies the DCT scaled -size to be applied on the given input. For baseline JPEG this is equivalent -to M/8 scaling, since the source DCT size for baseline JPEG is 8. -Scaling is handy if the image is larger than your screen; also, -.B djpeg -runs much faster when scaling down the output. -.TP -.B \-bmp -Select BMP output format (Windows flavor). 8-bit colormapped format is -emitted if -.B \-colors -or -.B \-grayscale -is specified, or if the JPEG file is gray-scale; otherwise, 24-bit full-color -format is emitted. -.TP -.B \-gif -Select GIF output format. Since GIF does not support more than 256 colors, -.B \-colors 256 -is assumed (unless you specify a smaller number of colors). -.TP -.B \-os2 -Select BMP output format (OS/2 1.x flavor). 8-bit colormapped format is -emitted if -.B \-colors -or -.B \-grayscale -is specified, or if the JPEG file is gray-scale; otherwise, 24-bit full-color -format is emitted. -.TP -.B \-pnm -Select PBMPLUS (PPM/PGM) output format (this is the default format). -PGM is emitted if the JPEG file is gray-scale or if -.B \-grayscale -is specified; otherwise PPM is emitted. -.TP -.B \-rle -Select RLE output format. (Requires URT library.) -.TP -.B \-targa -Select Targa output format. Gray-scale format is emitted if the JPEG file is -gray-scale or if -.B \-grayscale -is specified; otherwise, colormapped format is emitted if -.B \-colors -is specified; otherwise, 24-bit full-color format is emitted. -.PP -Switches for advanced users: -.TP -.B \-dct int -Use integer DCT method (default). -.TP -.B \-dct fast -Use fast integer DCT (less accurate). -.TP -.B \-dct float -Use floating-point DCT method. -The float method is very slightly more accurate than the int method, but is -much slower unless your machine has very fast floating-point hardware. Also -note that results of the floating-point method may vary slightly across -machines, while the integer methods should give the same results everywhere. -The fast integer method is much less accurate than the other two. -.TP -.B \-dither fs -Use Floyd-Steinberg dithering in color quantization. -.TP -.B \-dither ordered -Use ordered dithering in color quantization. -.TP -.B \-dither none -Do not use dithering in color quantization. -By default, Floyd-Steinberg dithering is applied when quantizing colors; this -is slow but usually produces the best results. Ordered dither is a compromise -between speed and quality; no dithering is fast but usually looks awful. Note -that these switches have no effect unless color quantization is being done. -Ordered dither is only available in -.B \-onepass -mode. -.TP -.BI \-map " file" -Quantize to the colors used in the specified image file. This is useful for -producing multiple files with identical color maps, or for forcing a -predefined set of colors to be used. The -.I file -must be a GIF or PPM file. This option overrides -.B \-colors -and -.BR \-onepass . -.TP -.B \-nosmooth -Don't use high-quality upsampling. -.TP -.B \-onepass -Use one-pass instead of two-pass color quantization. The one-pass method is -faster and needs less memory, but it produces a lower-quality image. -.B \-onepass -is ignored unless you also say -.B \-colors -.IR N . -Also, the one-pass method is always used for gray-scale output (the two-pass -method is no improvement then). -.TP -.BI \-maxmemory " N" -Set limit for amount of memory to use in processing large images. Value is -in thousands of bytes, or millions of bytes if "M" is attached to the -number. For example, -.B \-max 4m -selects 4000000 bytes. If more space is needed, temporary files will be used. -.TP -.BI \-outfile " name" -Send output image to the named file, not to standard output. -.TP -.B \-verbose -Enable debug printout. More -.BR \-v 's -give more output. Also, version information is printed at startup. -.TP -.B \-debug -Same as -.BR \-verbose . -.SH EXAMPLES -.LP -This example decompresses the JPEG file foo.jpg, quantizes it to -256 colors, and saves the output in 8-bit BMP format in foo.bmp: -.IP -.B djpeg \-colors 256 \-bmp -.I foo.jpg -.B > -.I foo.bmp -.SH HINTS -To get a quick preview of an image, use the -.B \-grayscale -and/or -.B \-scale -switches. -.B \-grayscale \-scale 1/8 -is the fastest case. -.PP -Several options are available that trade off image quality to gain speed. -.B \-fast -turns on the recommended settings. -.PP -.B \-dct fast -and/or -.B \-nosmooth -gain speed at a small sacrifice in quality. -When producing a color-quantized image, -.B \-onepass \-dither ordered -is fast but much lower quality than the default behavior. -.B \-dither none -may give acceptable results in two-pass mode, but is seldom tolerable in -one-pass mode. -.PP -If you are fortunate enough to have very fast floating point hardware, -\fB\-dct float\fR may be even faster than \fB\-dct fast\fR. But on most -machines \fB\-dct float\fR is slower than \fB\-dct int\fR; in this case it is -not worth using, because its theoretical accuracy advantage is too small to be -significant in practice. -.SH ENVIRONMENT -.TP -.B JPEGMEM -If this environment variable is set, its value is the default memory limit. -The value is specified as described for the -.B \-maxmemory -switch. -.B JPEGMEM -overrides the default value specified when the program was compiled, and -itself is overridden by an explicit -.BR \-maxmemory . -.SH SEE ALSO -.BR cjpeg (1), -.BR jpegtran (1), -.BR rdjpgcom (1), -.BR wrjpgcom (1) -.br -.BR ppm (5), -.BR pgm (5) -.br -Wallace, Gregory K. "The JPEG Still Picture Compression Standard", -Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. -.SH AUTHOR -Independent JPEG Group -.SH BUGS -To avoid the Unisys LZW patent, -.B djpeg -produces uncompressed GIF files. These are larger than they should be, but -are readable by standard GIF decoders. diff --git a/misc/builddeps/dp.linux64/share/man/man1/jpegtran.1 b/misc/builddeps/dp.linux64/share/man/man1/jpegtran.1 deleted file mode 100644 index 0ad1bbc8..00000000 --- a/misc/builddeps/dp.linux64/share/man/man1/jpegtran.1 +++ /dev/null @@ -1,285 +0,0 @@ -.TH JPEGTRAN 1 "28 December 2009" -.SH NAME -jpegtran \- lossless transformation of JPEG files -.SH SYNOPSIS -.B jpegtran -[ -.I options -] -[ -.I filename -] -.LP -.SH DESCRIPTION -.LP -.B jpegtran -performs various useful transformations of JPEG files. -It can translate the coded representation from one variant of JPEG to another, -for example from baseline JPEG to progressive JPEG or vice versa. It can also -perform some rearrangements of the image data, for example turning an image -from landscape to portrait format by rotation. -.PP -.B jpegtran -works by rearranging the compressed data (DCT coefficients), without -ever fully decoding the image. Therefore, its transformations are lossless: -there is no image degradation at all, which would not be true if you used -.B djpeg -followed by -.B cjpeg -to accomplish the same conversion. But by the same token, -.B jpegtran -cannot perform lossy operations such as changing the image quality. -.PP -.B jpegtran -reads the named JPEG/JFIF file, or the standard input if no file is -named, and produces a JPEG/JFIF file on the standard output. -.SH OPTIONS -All switch names may be abbreviated; for example, -.B \-optimize -may be written -.B \-opt -or -.BR \-o . -Upper and lower case are equivalent. -British spellings are also accepted (e.g., -.BR \-optimise ), -though for brevity these are not mentioned below. -.PP -To specify the coded JPEG representation used in the output file, -.B jpegtran -accepts a subset of the switches recognized by -.BR cjpeg : -.TP -.B \-optimize -Perform optimization of entropy encoding parameters. -.TP -.B \-progressive -Create progressive JPEG file. -.TP -.BI \-restart " N" -Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is -attached to the number. -.TP -.B \-arithmetic -Use arithmetic coding. -.TP -.BI \-scans " file" -Use the scan script given in the specified text file. -.PP -See -.BR cjpeg (1) -for more details about these switches. -If you specify none of these switches, you get a plain baseline-JPEG output -file. The quality setting and so forth are determined by the input file. -.PP -The image can be losslessly transformed by giving one of these switches: -.TP -.B \-flip horizontal -Mirror image horizontally (left-right). -.TP -.B \-flip vertical -Mirror image vertically (top-bottom). -.TP -.B \-rotate 90 -Rotate image 90 degrees clockwise. -.TP -.B \-rotate 180 -Rotate image 180 degrees. -.TP -.B \-rotate 270 -Rotate image 270 degrees clockwise (or 90 ccw). -.TP -.B \-transpose -Transpose image (across UL-to-LR axis). -.TP -.B \-transverse -Transverse transpose (across UR-to-LL axis). -.IP -The transpose transformation has no restrictions regarding image dimensions. -The other transformations operate rather oddly if the image dimensions are not -a multiple of the iMCU size (usually 8 or 16 pixels), because they can only -transform complete blocks of DCT coefficient data in the desired way. -.IP -.BR jpegtran 's -default behavior when transforming an odd-size image is designed -to preserve exact reversibility and mathematical consistency of the -transformation set. As stated, transpose is able to flip the entire image -area. Horizontal mirroring leaves any partial iMCU column at the right edge -untouched, but is able to flip all rows of the image. Similarly, vertical -mirroring leaves any partial iMCU row at the bottom edge untouched, but is -able to flip all columns. The other transforms can be built up as sequences -of transpose and flip operations; for consistency, their actions on edge -pixels are defined to be the same as the end result of the corresponding -transpose-and-flip sequence. -.IP -For practical use, you may prefer to discard any untransformable edge pixels -rather than having a strange-looking strip along the right and/or bottom edges -of a transformed image. To do this, add the -.B \-trim -switch: -.TP -.B \-trim -Drop non-transformable edge blocks. -.IP -Obviously, a transformation with -.B \-trim -is not reversible, so strictly speaking -.B jpegtran -with this switch is not lossless. Also, the expected mathematical -equivalences between the transformations no longer hold. For example, -.B \-rot 270 -trim -trims only the bottom edge, but -.B \-rot 90 -trim -followed by -.B \-rot 180 -trim -trims both edges. -.IP -If you are only interested in perfect transformation, add the -.B \-perfect -switch: -.TP -.B \-perfect -Fails with an error if the transformation is not perfect. -.IP -For example you may want to do -.IP -.B (jpegtran \-rot 90 -perfect -.I foo.jpg -.B || djpeg -.I foo.jpg -.B | pnmflip \-r90 | cjpeg) -.IP -to do a perfect rotation if available or an approximated one if not. -.PP -We also offer a lossless-crop option, which discards data outside a given -image region but losslessly preserves what is inside. Like the rotate and -flip transforms, lossless crop is restricted by the current JPEG format: the -upper left corner of the selected region must fall on an iMCU boundary. If -this does not hold for the given crop parameters, we silently move the upper -left corner up and/or left to make it so, simultaneously increasing the region -dimensions to keep the lower right crop corner unchanged. (Thus, the output -image covers at least the requested region, but may cover more.) - -The image can be losslessly cropped by giving the switch: -.TP -.B \-crop WxH+X+Y -Crop to a rectangular subarea of width W, height H starting at point X,Y. -.PP -Other not-strictly-lossless transformation switches are: -.TP -.B \-grayscale -Force grayscale output. -.IP -This option discards the chrominance channels if the input image is YCbCr -(ie, a standard color JPEG), resulting in a grayscale JPEG file. The -luminance channel is preserved exactly, so this is a better method of reducing -to grayscale than decompression, conversion, and recompression. This switch -is particularly handy for fixing a monochrome picture that was mistakenly -encoded as a color JPEG. (In such a case, the space savings from getting rid -of the near-empty chroma channels won't be large; but the decoding time for -a grayscale JPEG is substantially less than that for a color JPEG.) -.TP -.BI \-scale " M/N" -Scale the output image by a factor M/N. -.IP -Currently supported scale factors are M/N with all M from 1 to 16, where N is -the source DCT size, which is 8 for baseline JPEG. If the /N part is omitted, -then M specifies the DCT scaled size to be applied on the given input. For -baseline JPEG this is equivalent to M/8 scaling, since the source DCT size -for baseline JPEG is 8. -.B Caution: -An implementation of the JPEG SmartScale extension is required for this -feature. SmartScale enabled JPEG is not yet widely implemented, so many -decoders will be unable to view a SmartScale extended JPEG file at all. -.PP -.B jpegtran -also recognizes these switches that control what to do with "extra" markers, -such as comment blocks: -.TP -.B \-copy none -Copy no extra markers from source file. This setting suppresses all -comments and other excess baggage present in the source file. -.TP -.B \-copy comments -Copy only comment markers. This setting copies comments from the source file, -but discards any other inessential (for image display) data. -.TP -.B \-copy all -Copy all extra markers. This setting preserves miscellaneous markers -found in the source file, such as JFIF thumbnails, Exif data, and Photoshop -settings. In some files these extra markers can be sizable. -.IP -The default behavior is -.BR "\-copy comments" . -(Note: in IJG releases v6 and v6a, -.B jpegtran -always did the equivalent of -.BR "\-copy none" .) -.PP -Additional switches recognized by jpegtran are: -.TP -.BI \-maxmemory " N" -Set limit for amount of memory to use in processing large images. Value is -in thousands of bytes, or millions of bytes if "M" is attached to the -number. For example, -.B \-max 4m -selects 4000000 bytes. If more space is needed, temporary files will be used. -.TP -.BI \-outfile " name" -Send output image to the named file, not to standard output. -.TP -.B \-verbose -Enable debug printout. More -.BR \-v 's -give more output. Also, version information is printed at startup. -.TP -.B \-debug -Same as -.BR \-verbose . -.SH EXAMPLES -.LP -This example converts a baseline JPEG file to progressive form: -.IP -.B jpegtran \-progressive -.I foo.jpg -.B > -.I fooprog.jpg -.PP -This example rotates an image 90 degrees clockwise, discarding any -unrotatable edge pixels: -.IP -.B jpegtran \-rot 90 -trim -.I foo.jpg -.B > -.I foo90.jpg -.SH ENVIRONMENT -.TP -.B JPEGMEM -If this environment variable is set, its value is the default memory limit. -The value is specified as described for the -.B \-maxmemory -switch. -.B JPEGMEM -overrides the default value specified when the program was compiled, and -itself is overridden by an explicit -.BR \-maxmemory . -.SH SEE ALSO -.BR cjpeg (1), -.BR djpeg (1), -.BR rdjpgcom (1), -.BR wrjpgcom (1) -.br -Wallace, Gregory K. "The JPEG Still Picture Compression Standard", -Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. -.SH AUTHOR -Independent JPEG Group -.SH BUGS -The transform options can't transform odd-size images perfectly. Use -.B \-trim -or -.B \-perfect -if you don't like the results. -.PP -The entire image is read into memory and then written out again, even in -cases where this isn't really necessary. Expect swapping on large images, -especially when using the more complex transform options. diff --git a/misc/builddeps/dp.linux64/share/man/man1/rdjpgcom.1 b/misc/builddeps/dp.linux64/share/man/man1/rdjpgcom.1 deleted file mode 100644 index 97611df8..00000000 --- a/misc/builddeps/dp.linux64/share/man/man1/rdjpgcom.1 +++ /dev/null @@ -1,63 +0,0 @@ -.TH RDJPGCOM 1 "02 April 2009" -.SH NAME -rdjpgcom \- display text comments from a JPEG file -.SH SYNOPSIS -.B rdjpgcom -[ -.B \-raw -] -[ -.B \-verbose -] -[ -.I filename -] -.LP -.SH DESCRIPTION -.LP -.B rdjpgcom -reads the named JPEG/JFIF file, or the standard input if no file is named, -and prints any text comments found in the file on the standard output. -.PP -The JPEG standard allows "comment" (COM) blocks to occur within a JPEG file. -Although the standard doesn't actually define what COM blocks are for, they -are widely used to hold user-supplied text strings. This lets you add -annotations, titles, index terms, etc to your JPEG files, and later retrieve -them as text. COM blocks do not interfere with the image stored in the JPEG -file. The maximum size of a COM block is 64K, but you can have as many of -them as you like in one JPEG file. -.SH OPTIONS -.TP -.B \-raw -Normally -.B rdjpgcom -escapes non-printable characters in comments, for security reasons. -This option avoids that. -.PP -.B \-verbose -Causes -.B rdjpgcom -to also display the JPEG image dimensions. -.PP -Switch names may be abbreviated, and are not case sensitive. -.SH HINTS -.B rdjpgcom -does not depend on the IJG JPEG library. Its source code is intended as an -illustration of the minimum amount of code required to parse a JPEG file -header correctly. -.PP -In -.B \-verbose -mode, -.B rdjpgcom -will also attempt to print the contents of any "APP12" markers as text. -Some digital cameras produce APP12 markers containing useful textual -information. If you like, you can modify the source code to print -other APPn marker types as well. -.SH SEE ALSO -.BR cjpeg (1), -.BR djpeg (1), -.BR jpegtran (1), -.BR wrjpgcom (1) -.SH AUTHOR -Independent JPEG Group diff --git a/misc/builddeps/dp.linux64/share/man/man1/wrjpgcom.1 b/misc/builddeps/dp.linux64/share/man/man1/wrjpgcom.1 deleted file mode 100644 index d419a999..00000000 --- a/misc/builddeps/dp.linux64/share/man/man1/wrjpgcom.1 +++ /dev/null @@ -1,103 +0,0 @@ -.TH WRJPGCOM 1 "15 June 1995" -.SH NAME -wrjpgcom \- insert text comments into a JPEG file -.SH SYNOPSIS -.B wrjpgcom -[ -.B \-replace -] -[ -.BI \-comment " text" -] -[ -.BI \-cfile " name" -] -[ -.I filename -] -.LP -.SH DESCRIPTION -.LP -.B wrjpgcom -reads the named JPEG/JFIF file, or the standard input if no file is named, -and generates a new JPEG/JFIF file on standard output. A comment block is -added to the file. -.PP -The JPEG standard allows "comment" (COM) blocks to occur within a JPEG file. -Although the standard doesn't actually define what COM blocks are for, they -are widely used to hold user-supplied text strings. This lets you add -annotations, titles, index terms, etc to your JPEG files, and later retrieve -them as text. COM blocks do not interfere with the image stored in the JPEG -file. The maximum size of a COM block is 64K, but you can have as many of -them as you like in one JPEG file. -.PP -.B wrjpgcom -adds a COM block, containing text you provide, to a JPEG file. -Ordinarily, the COM block is added after any existing COM blocks; but you -can delete the old COM blocks if you wish. -.SH OPTIONS -Switch names may be abbreviated, and are not case sensitive. -.TP -.B \-replace -Delete any existing COM blocks from the file. -.TP -.BI \-comment " text" -Supply text for new COM block on command line. -.TP -.BI \-cfile " name" -Read text for new COM block from named file. -.PP -If you have only one line of comment text to add, you can provide it on the -command line with -.BR \-comment . -The comment text must be surrounded with quotes so that it is treated as a -single argument. Longer comments can be read from a text file. -.PP -If you give neither -.B \-comment -nor -.BR \-cfile , -then -.B wrjpgcom -will read the comment text from standard input. (In this case an input image -file name MUST be supplied, so that the source JPEG file comes from somewhere -else.) You can enter multiple lines, up to 64KB worth. Type an end-of-file -indicator (usually control-D) to terminate the comment text entry. -.PP -.B wrjpgcom -will not add a COM block if the provided comment string is empty. Therefore -\fB\-replace \-comment ""\fR can be used to delete all COM blocks from a file. -.SH EXAMPLES -.LP -Add a short comment to in.jpg, producing out.jpg: -.IP -.B wrjpgcom \-c -\fI"View of my back yard" in.jpg -.B > -.I out.jpg -.PP -Attach a long comment previously stored in comment.txt: -.IP -.B wrjpgcom -.I in.jpg -.B < -.I comment.txt -.B > -.I out.jpg -.PP -or equivalently -.IP -.B wrjpgcom -.B -cfile -.I comment.txt -.B < -.I in.jpg -.B > -.I out.jpg -.SH SEE ALSO -.BR cjpeg (1), -.BR djpeg (1), -.BR jpegtran (1), -.BR rdjpgcom (1) -.SH AUTHOR -Independent JPEG Group diff --git a/misc/builddeps/dp.osx/empty b/misc/builddeps/dp.osx/empty deleted file mode 100644 index e69de29b..00000000 diff --git a/misc/builddeps/dp.win32/bin/SDL.dll b/misc/builddeps/dp.win32/bin/SDL.dll deleted file mode 100755 index 49f8aa00..00000000 Binary files a/misc/builddeps/dp.win32/bin/SDL.dll and /dev/null differ diff --git a/misc/builddeps/dp.win32/bin/libgmp-10.dll b/misc/builddeps/dp.win32/bin/libgmp-10.dll deleted file mode 100755 index 33b5eb82..00000000 Binary files a/misc/builddeps/dp.win32/bin/libgmp-10.dll and /dev/null differ diff --git a/misc/builddeps/dp.win32/bin/sdl-config b/misc/builddeps/dp.win32/bin/sdl-config deleted file mode 100755 index 3144d44f..00000000 --- a/misc/builddeps/dp.win32/bin/sdl-config +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/sh - -prefix=${0%/bin/sdl-config} -exec_prefix=${prefix} -exec_prefix_set=no -libdir=${exec_prefix}/lib - -#usage="\ -#Usage: sdl-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]" -usage="\ -Usage: sdl-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]" - -if test $# -eq 0; then - echo "${usage}" 1>&2 - exit 1 -fi - -while test $# -gt 0; do - case "$1" in - -*=*) optarg=`echo "$1" | LC_ALL="C" sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - case $1 in - --prefix=*) - prefix=$optarg - if test $exec_prefix_set = no ; then - exec_prefix=$optarg - fi - ;; - --prefix) - echo $prefix - ;; - --exec-prefix=*) - exec_prefix=$optarg - exec_prefix_set=yes - ;; - --exec-prefix) - echo $exec_prefix - ;; - --version) - echo 1.2.14 - ;; - --cflags) - echo -I${prefix}/include/SDL -D_GNU_SOURCE=1 -Dmain=SDL_main - ;; - --libs) - echo -L${exec_prefix}/lib -lmingw32 -lSDLmain -lSDL -mwindows - ;; - --static-libs) -# --libs|--static-libs) - echo -L${exec_prefix}/lib -lmingw32 -lSDLmain -lSDL -mwindows -lm -luser32 -lgdi32 -lwinmm -ldxguid -ldinput8 - ;; - *) - echo "${usage}" 1>&2 - exit 1 - ;; - esac - shift -done diff --git a/misc/builddeps/dp.win32/bin/zlib1.dll b/misc/builddeps/dp.win32/bin/zlib1.dll deleted file mode 100755 index 1ced00e0..00000000 Binary files a/misc/builddeps/dp.win32/bin/zlib1.dll and /dev/null differ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL.h b/misc/builddeps/dp.win32/include/SDL/SDL.h deleted file mode 100644 index 119ed7ff..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL.h - * Main include header for the SDL library - */ - -#ifndef _SDL_H -#define _SDL_H - -#include "SDL_main.h" -#include "SDL_stdinc.h" -#include "SDL_audio.h" -#include "SDL_cdrom.h" -#include "SDL_cpuinfo.h" -#include "SDL_endian.h" -#include "SDL_error.h" -#include "SDL_events.h" -#include "SDL_loadso.h" -#include "SDL_mutex.h" -#include "SDL_rwops.h" -#include "SDL_thread.h" -#include "SDL_timer.h" -#include "SDL_video.h" -#include "SDL_version.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** @file SDL.h - * @note As of version 0.5, SDL is loaded dynamically into the application - */ - -/** @name SDL_INIT Flags - * These are the flags which may be passed to SDL_Init() -- you should - * specify the subsystems which you will be using in your application. - */ -/*@{*/ -#define SDL_INIT_TIMER 0x00000001 -#define SDL_INIT_AUDIO 0x00000010 -#define SDL_INIT_VIDEO 0x00000020 -#define SDL_INIT_CDROM 0x00000100 -#define SDL_INIT_JOYSTICK 0x00000200 -#define SDL_INIT_NOPARACHUTE 0x00100000 /**< Don't catch fatal signals */ -#define SDL_INIT_EVENTTHREAD 0x01000000 /**< Not supported on all OS's */ -#define SDL_INIT_EVERYTHING 0x0000FFFF -/*@}*/ - -/** This function loads the SDL dynamically linked library and initializes - * the subsystems specified by 'flags' (and those satisfying dependencies) - * Unless the SDL_INIT_NOPARACHUTE flag is set, it will install cleanup - * signal handlers for some commonly ignored fatal signals (like SIGSEGV) - */ -extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags); - -/** This function initializes specific SDL subsystems */ -extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags); - -/** This function cleans up specific SDL subsystems */ -extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags); - -/** This function returns mask of the specified subsystems which have - * been initialized. - * If 'flags' is 0, it returns a mask of all initialized subsystems. - */ -extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags); - -/** This function cleans up all initialized subsystems and unloads the - * dynamically linked library. You should call it upon all exit conditions. - */ -extern DECLSPEC void SDLCALL SDL_Quit(void); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_H */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_active.h b/misc/builddeps/dp.win32/include/SDL/SDL_active.h deleted file mode 100644 index 0ae92f2d..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_active.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * @file SDL_active.h - * Include file for SDL application focus event handling - */ - -#ifndef _SDL_active_h -#define _SDL_active_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** @name The available application states */ -/*@{*/ -#define SDL_APPMOUSEFOCUS 0x01 /**< The app has mouse coverage */ -#define SDL_APPINPUTFOCUS 0x02 /**< The app has input focus */ -#define SDL_APPACTIVE 0x04 /**< The application is active */ -/*@}*/ - -/* Function prototypes */ -/** - * This function returns the current state of the application, which is a - * bitwise combination of SDL_APPMOUSEFOCUS, SDL_APPINPUTFOCUS, and - * SDL_APPACTIVE. If SDL_APPACTIVE is set, then the user is able to - * see your application, otherwise it has been iconified or disabled. - */ -extern DECLSPEC Uint8 SDLCALL SDL_GetAppState(void); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_active_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_audio.h b/misc/builddeps/dp.win32/include/SDL/SDL_audio.h deleted file mode 100644 index 3a8e7fa8..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_audio.h +++ /dev/null @@ -1,284 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * @file SDL_audio.h - * Access to the raw audio mixing buffer for the SDL library - */ - -#ifndef _SDL_audio_h -#define _SDL_audio_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_endian.h" -#include "SDL_mutex.h" -#include "SDL_thread.h" -#include "SDL_rwops.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** - * When filling in the desired audio spec structure, - * - 'desired->freq' should be the desired audio frequency in samples-per-second. - * - 'desired->format' should be the desired audio format. - * - 'desired->samples' is the desired size of the audio buffer, in samples. - * This number should be a power of two, and may be adjusted by the audio - * driver to a value more suitable for the hardware. Good values seem to - * range between 512 and 8096 inclusive, depending on the application and - * CPU speed. Smaller values yield faster response time, but can lead - * to underflow if the application is doing heavy processing and cannot - * fill the audio buffer in time. A stereo sample consists of both right - * and left channels in LR ordering. - * Note that the number of samples is directly related to time by the - * following formula: ms = (samples*1000)/freq - * - 'desired->size' is the size in bytes of the audio buffer, and is - * calculated by SDL_OpenAudio(). - * - 'desired->silence' is the value used to set the buffer to silence, - * and is calculated by SDL_OpenAudio(). - * - 'desired->callback' should be set to a function that will be called - * when the audio device is ready for more data. It is passed a pointer - * to the audio buffer, and the length in bytes of the audio buffer. - * This function usually runs in a separate thread, and so you should - * protect data structures that it accesses by calling SDL_LockAudio() - * and SDL_UnlockAudio() in your code. - * - 'desired->userdata' is passed as the first parameter to your callback - * function. - * - * @note The calculated values in this structure are calculated by SDL_OpenAudio() - * - */ -typedef struct SDL_AudioSpec { - int freq; /**< DSP frequency -- samples per second */ - Uint16 format; /**< Audio data format */ - Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */ - Uint8 silence; /**< Audio buffer silence value (calculated) */ - Uint16 samples; /**< Audio buffer size in samples (power of 2) */ - Uint16 padding; /**< Necessary for some compile environments */ - Uint32 size; /**< Audio buffer size in bytes (calculated) */ - /** - * This function is called when the audio device needs more data. - * - * @param[out] stream A pointer to the audio data buffer - * @param[in] len The length of the audio buffer in bytes. - * - * Once the callback returns, the buffer will no longer be valid. - * Stereo samples are stored in a LRLRLR ordering. - */ - void (SDLCALL *callback)(void *userdata, Uint8 *stream, int len); - void *userdata; -} SDL_AudioSpec; - -/** - * @name Audio format flags - * defaults to LSB byte order - */ -/*@{*/ -#define AUDIO_U8 0x0008 /**< Unsigned 8-bit samples */ -#define AUDIO_S8 0x8008 /**< Signed 8-bit samples */ -#define AUDIO_U16LSB 0x0010 /**< Unsigned 16-bit samples */ -#define AUDIO_S16LSB 0x8010 /**< Signed 16-bit samples */ -#define AUDIO_U16MSB 0x1010 /**< As above, but big-endian byte order */ -#define AUDIO_S16MSB 0x9010 /**< As above, but big-endian byte order */ -#define AUDIO_U16 AUDIO_U16LSB -#define AUDIO_S16 AUDIO_S16LSB - -/** - * @name Native audio byte ordering - */ -/*@{*/ -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define AUDIO_U16SYS AUDIO_U16LSB -#define AUDIO_S16SYS AUDIO_S16LSB -#else -#define AUDIO_U16SYS AUDIO_U16MSB -#define AUDIO_S16SYS AUDIO_S16MSB -#endif -/*@}*/ - -/*@}*/ - - -/** A structure to hold a set of audio conversion filters and buffers */ -typedef struct SDL_AudioCVT { - int needed; /**< Set to 1 if conversion possible */ - Uint16 src_format; /**< Source audio format */ - Uint16 dst_format; /**< Target audio format */ - double rate_incr; /**< Rate conversion increment */ - Uint8 *buf; /**< Buffer to hold entire audio data */ - int len; /**< Length of original audio buffer */ - int len_cvt; /**< Length of converted audio buffer */ - int len_mult; /**< buffer must be len*len_mult big */ - double len_ratio; /**< Given len, final size is len*len_ratio */ - void (SDLCALL *filters[10])(struct SDL_AudioCVT *cvt, Uint16 format); - int filter_index; /**< Current audio conversion function */ -} SDL_AudioCVT; - - -/* Function prototypes */ - -/** - * @name Audio Init and Quit - * These functions are used internally, and should not be used unless you - * have a specific need to specify the audio driver you want to use. - * You should normally use SDL_Init() or SDL_InitSubSystem(). - */ -/*@{*/ -extern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name); -extern DECLSPEC void SDLCALL SDL_AudioQuit(void); -/*@}*/ - -/** - * This function fills the given character buffer with the name of the - * current audio driver, and returns a pointer to it if the audio driver has - * been initialized. It returns NULL if no driver has been initialized. - */ -extern DECLSPEC char * SDLCALL SDL_AudioDriverName(char *namebuf, int maxlen); - -/** - * This function opens the audio device with the desired parameters, and - * returns 0 if successful, placing the actual hardware parameters in the - * structure pointed to by 'obtained'. If 'obtained' is NULL, the audio - * data passed to the callback function will be guaranteed to be in the - * requested format, and will be automatically converted to the hardware - * audio format if necessary. This function returns -1 if it failed - * to open the audio device, or couldn't set up the audio thread. - * - * The audio device starts out playing silence when it's opened, and should - * be enabled for playing by calling SDL_PauseAudio(0) when you are ready - * for your audio callback function to be called. Since the audio driver - * may modify the requested size of the audio buffer, you should allocate - * any local mixing buffers after you open the audio device. - * - * @sa SDL_AudioSpec - */ -extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); - -typedef enum { - SDL_AUDIO_STOPPED = 0, - SDL_AUDIO_PLAYING, - SDL_AUDIO_PAUSED -} SDL_audiostatus; - -/** Get the current audio state */ -extern DECLSPEC SDL_audiostatus SDLCALL SDL_GetAudioStatus(void); - -/** - * This function pauses and unpauses the audio callback processing. - * It should be called with a parameter of 0 after opening the audio - * device to start playing sound. This is so you can safely initialize - * data for your callback function after opening the audio device. - * Silence will be written to the audio device during the pause. - */ -extern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on); - -/** - * This function loads a WAVE from the data source, automatically freeing - * that source if 'freesrc' is non-zero. For example, to load a WAVE file, - * you could do: - * @code SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...); @endcode - * - * If this function succeeds, it returns the given SDL_AudioSpec, - * filled with the audio data format of the wave data, and sets - * 'audio_buf' to a malloc()'d buffer containing the audio data, - * and sets 'audio_len' to the length of that audio buffer, in bytes. - * You need to free the audio buffer with SDL_FreeWAV() when you are - * done with it. - * - * This function returns NULL and sets the SDL error message if the - * wave file cannot be opened, uses an unknown data format, or is - * corrupt. Currently raw and MS-ADPCM WAVE files are supported. - */ -extern DECLSPEC SDL_AudioSpec * SDLCALL SDL_LoadWAV_RW(SDL_RWops *src, int freesrc, SDL_AudioSpec *spec, Uint8 **audio_buf, Uint32 *audio_len); - -/** Compatibility convenience function -- loads a WAV from a file */ -#define SDL_LoadWAV(file, spec, audio_buf, audio_len) \ - SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len) - -/** - * This function frees data previously allocated with SDL_LoadWAV_RW() - */ -extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 *audio_buf); - -/** - * This function takes a source format and rate and a destination format - * and rate, and initializes the 'cvt' structure with information needed - * by SDL_ConvertAudio() to convert a buffer of audio data from one format - * to the other. - * - * @return This function returns 0, or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT *cvt, - Uint16 src_format, Uint8 src_channels, int src_rate, - Uint16 dst_format, Uint8 dst_channels, int dst_rate); - -/** - * Once you have initialized the 'cvt' structure using SDL_BuildAudioCVT(), - * created an audio buffer cvt->buf, and filled it with cvt->len bytes of - * audio data in the source format, this function will convert it in-place - * to the desired format. - * The data conversion may expand the size of the audio data, so the buffer - * cvt->buf should be allocated after the cvt structure is initialized by - * SDL_BuildAudioCVT(), and should be cvt->len*cvt->len_mult bytes long. - */ -extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT *cvt); - - -#define SDL_MIX_MAXVOLUME 128 -/** - * This takes two audio buffers of the playing audio format and mixes - * them, performing addition, volume adjustment, and overflow clipping. - * The volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME - * for full audio volume. Note this does not change hardware volume. - * This is provided for convenience -- you can mix your own audio data. - */ -extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 *dst, const Uint8 *src, Uint32 len, int volume); - -/** - * @name Audio Locks - * The lock manipulated by these functions protects the callback function. - * During a LockAudio/UnlockAudio pair, you can be guaranteed that the - * callback function is not running. Do not call these from the callback - * function or you will cause deadlock. - */ -/*@{*/ -extern DECLSPEC void SDLCALL SDL_LockAudio(void); -extern DECLSPEC void SDLCALL SDL_UnlockAudio(void); -/*@}*/ - -/** - * This function shuts down audio processing and closes the audio device. - */ -extern DECLSPEC void SDLCALL SDL_CloseAudio(void); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_audio_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_byteorder.h b/misc/builddeps/dp.win32/include/SDL/SDL_byteorder.h deleted file mode 100644 index 9b93cd69..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_byteorder.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * @file SDL_byteorder.h - * @deprecated Use SDL_endian.h instead - */ - -/* DEPRECATED */ -#include "SDL_endian.h" diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_cdrom.h b/misc/builddeps/dp.win32/include/SDL/SDL_cdrom.h deleted file mode 100644 index fff5cfa1..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_cdrom.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * @file SDL_cdrom.h - * This is the CD-audio control API for Simple DirectMedia Layer - */ - -#ifndef _SDL_cdrom_h -#define _SDL_cdrom_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @file SDL_cdrom.h - * In order to use these functions, SDL_Init() must have been called - * with the SDL_INIT_CDROM flag. This causes SDL to scan the system - * for CD-ROM drives, and load appropriate drivers. - */ - -/** The maximum number of CD-ROM tracks on a disk */ -#define SDL_MAX_TRACKS 99 - -/** @name Track Types - * The types of CD-ROM track possible - */ -/*@{*/ -#define SDL_AUDIO_TRACK 0x00 -#define SDL_DATA_TRACK 0x04 -/*@}*/ - -/** The possible states which a CD-ROM drive can be in. */ -typedef enum { - CD_TRAYEMPTY, - CD_STOPPED, - CD_PLAYING, - CD_PAUSED, - CD_ERROR = -1 -} CDstatus; - -/** Given a status, returns true if there's a disk in the drive */ -#define CD_INDRIVE(status) ((int)(status) > 0) - -typedef struct SDL_CDtrack { - Uint8 id; /**< Track number */ - Uint8 type; /**< Data or audio track */ - Uint16 unused; - Uint32 length; /**< Length, in frames, of this track */ - Uint32 offset; /**< Offset, in frames, from start of disk */ -} SDL_CDtrack; - -/** This structure is only current as of the last call to SDL_CDStatus() */ -typedef struct SDL_CD { - int id; /**< Private drive identifier */ - CDstatus status; /**< Current drive status */ - - /** The rest of this structure is only valid if there's a CD in drive */ - /*@{*/ - int numtracks; /**< Number of tracks on disk */ - int cur_track; /**< Current track position */ - int cur_frame; /**< Current frame offset within current track */ - SDL_CDtrack track[SDL_MAX_TRACKS+1]; - /*@}*/ -} SDL_CD; - -/** @name Frames / MSF Conversion Functions - * Conversion functions from frames to Minute/Second/Frames and vice versa - */ -/*@{*/ -#define CD_FPS 75 -#define FRAMES_TO_MSF(f, M,S,F) { \ - int value = f; \ - *(F) = value%CD_FPS; \ - value /= CD_FPS; \ - *(S) = value%60; \ - value /= 60; \ - *(M) = value; \ -} -#define MSF_TO_FRAMES(M, S, F) ((M)*60*CD_FPS+(S)*CD_FPS+(F)) -/*@}*/ - -/* CD-audio API functions: */ - -/** - * Returns the number of CD-ROM drives on the system, or -1 if - * SDL_Init() has not been called with the SDL_INIT_CDROM flag. - */ -extern DECLSPEC int SDLCALL SDL_CDNumDrives(void); - -/** - * Returns a human-readable, system-dependent identifier for the CD-ROM. - * Example: - * - "/dev/cdrom" - * - "E:" - * - "/dev/disk/ide/1/master" - */ -extern DECLSPEC const char * SDLCALL SDL_CDName(int drive); - -/** - * Opens a CD-ROM drive for access. It returns a drive handle on success, - * or NULL if the drive was invalid or busy. This newly opened CD-ROM - * becomes the default CD used when other CD functions are passed a NULL - * CD-ROM handle. - * Drives are numbered starting with 0. Drive 0 is the system default CD-ROM. - */ -extern DECLSPEC SDL_CD * SDLCALL SDL_CDOpen(int drive); - -/** - * This function returns the current status of the given drive. - * If the drive has a CD in it, the table of contents of the CD and current - * play position of the CD will be stored in the SDL_CD structure. - */ -extern DECLSPEC CDstatus SDLCALL SDL_CDStatus(SDL_CD *cdrom); - -/** - * Play the given CD starting at 'start_track' and 'start_frame' for 'ntracks' - * tracks and 'nframes' frames. If both 'ntrack' and 'nframe' are 0, play - * until the end of the CD. This function will skip data tracks. - * This function should only be called after calling SDL_CDStatus() to - * get track information about the CD. - * For example: - * @code - * // Play entire CD: - * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) - * SDL_CDPlayTracks(cdrom, 0, 0, 0, 0); - * // Play last track: - * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) { - * SDL_CDPlayTracks(cdrom, cdrom->numtracks-1, 0, 0, 0); - * } - * // Play first and second track and 10 seconds of third track: - * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) - * SDL_CDPlayTracks(cdrom, 0, 0, 2, 10); - * @endcode - * - * @return This function returns 0, or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_CDPlayTracks(SDL_CD *cdrom, - int start_track, int start_frame, int ntracks, int nframes); - -/** - * Play the given CD starting at 'start' frame for 'length' frames. - * @return It returns 0, or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_CDPlay(SDL_CD *cdrom, int start, int length); - -/** Pause play - * @return returns 0, or -1 on error - */ -extern DECLSPEC int SDLCALL SDL_CDPause(SDL_CD *cdrom); - -/** Resume play - * @return returns 0, or -1 on error - */ -extern DECLSPEC int SDLCALL SDL_CDResume(SDL_CD *cdrom); - -/** Stop play - * @return returns 0, or -1 on error - */ -extern DECLSPEC int SDLCALL SDL_CDStop(SDL_CD *cdrom); - -/** Eject CD-ROM - * @return returns 0, or -1 on error - */ -extern DECLSPEC int SDLCALL SDL_CDEject(SDL_CD *cdrom); - -/** Closes the handle for the CD-ROM drive */ -extern DECLSPEC void SDLCALL SDL_CDClose(SDL_CD *cdrom); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_video_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_config.h b/misc/builddeps/dp.win32/include/SDL/SDL_config.h deleted file mode 100644 index b1abcd3d..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_config.h +++ /dev/null @@ -1,311 +0,0 @@ -/* include/SDL_config.h. Generated from SDL_config.h.in by configure. */ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_config_h -#define _SDL_config_h - -/* This is a set of defines to configure the SDL features */ - -/* General platform specific identifiers */ -#include "SDL_platform.h" - -/* Make sure that this isn't included by Visual C++ */ -#ifdef _MSC_VER -#error You should copy include/SDL_config.h.default to include/SDL_config.h -#endif - -/* C language features */ -/* #undef const */ -/* #undef inline */ -/* #undef volatile */ - -/* C datatypes */ -/* #undef size_t */ -/* #undef int8_t */ -/* #undef uint8_t */ -/* #undef int16_t */ -/* #undef uint16_t */ -/* #undef int32_t */ -/* #undef uint32_t */ -/* #undef int64_t */ -/* #undef uint64_t */ -/* #undef uintptr_t */ -#define SDL_HAS_64BIT_TYPE 1 - -/* Endianness */ -#define SDL_BYTEORDER 1234 - -/* Comment this if you want to build without any C library requirements */ -#define HAVE_LIBC 1 -#if HAVE_LIBC - -/* Useful headers */ -/* #undef HAVE_ALLOCA_H */ -#define HAVE_SYS_TYPES_H 1 -#define HAVE_STDIO_H 1 -#define STDC_HEADERS 1 -#define HAVE_STDLIB_H 1 -#define HAVE_STDARG_H 1 -#define HAVE_MALLOC_H 1 -#define HAVE_MEMORY_H 1 -#define HAVE_STRING_H 1 -#define HAVE_STRINGS_H 1 -#define HAVE_INTTYPES_H 1 -#define HAVE_STDINT_H 1 -#define HAVE_CTYPE_H 1 -#define HAVE_MATH_H 1 -/* #undef HAVE_ICONV_H */ -#define HAVE_SIGNAL_H 1 -/* #undef HAVE_ALTIVEC_H */ - -/* C library functions */ -#define HAVE_MALLOC 1 -#define HAVE_CALLOC 1 -#define HAVE_REALLOC 1 -#define HAVE_FREE 1 -/* #undef HAVE_ALLOCA */ -#ifndef _WIN32 /* Don't use C runtime versions of these on Windows */ -#define HAVE_GETENV 1 -#define HAVE_PUTENV 1 -/* #undef HAVE_UNSETENV */ -#endif -#define HAVE_QSORT 1 -#define HAVE_ABS 1 -/* #undef HAVE_BCOPY */ -#define HAVE_MEMSET 1 -#define HAVE_MEMCPY 1 -#define HAVE_MEMMOVE 1 -/* #undef HAVE_MEMCMP */ -#define HAVE_STRLEN 1 -/* #undef HAVE_STRLCPY */ -/* #undef HAVE_STRLCAT */ -#define HAVE_STRDUP 1 -#define HAVE__STRREV 1 -#define HAVE__STRUPR 1 -#define HAVE__STRLWR 1 -/* #undef HAVE_INDEX */ -/* #undef HAVE_RINDEX */ -#define HAVE_STRCHR 1 -#define HAVE_STRRCHR 1 -#define HAVE_STRSTR 1 -#define HAVE_ITOA 1 -#define HAVE__LTOA 1 -/* #undef HAVE__UITOA */ -#define HAVE__ULTOA 1 -#define HAVE_STRTOL 1 -#define HAVE_STRTOUL 1 -#define HAVE__I64TOA 1 -#define HAVE__UI64TOA 1 -#define HAVE_STRTOLL 1 -#define HAVE_STRTOULL 1 -/* #undef HAVE_STRTOD */ -#define HAVE_ATOI 1 -#define HAVE_ATOF 1 -#define HAVE_STRCMP 1 -#define HAVE_STRNCMP 1 -#define HAVE__STRICMP 1 -#define HAVE_STRCASECMP 1 -#define HAVE__STRNICMP 1 -#define HAVE_STRNCASECMP 1 -#define HAVE_SSCANF 1 -#define HAVE_SNPRINTF 1 -#define HAVE_VSNPRINTF 1 -/* #undef HAVE_ICONV */ -/* #undef HAVE_SIGACTION */ -/* #undef HAVE_SETJMP */ -/* #undef HAVE_NANOSLEEP */ -/* #undef HAVE_CLOCK_GETTIME */ -/* #undef HAVE_GETPAGESIZE */ -/* #undef HAVE_MPROTECT */ - -#else -/* We may need some replacement for stdarg.h here */ -#include -#endif /* HAVE_LIBC */ - -/* Allow disabling of core subsystems */ -/* #undef SDL_AUDIO_DISABLED */ -/* #undef SDL_CDROM_DISABLED */ -/* #undef SDL_CPUINFO_DISABLED */ -/* #undef SDL_EVENTS_DISABLED */ -/* #undef SDL_FILE_DISABLED */ -/* #undef SDL_JOYSTICK_DISABLED */ -/* #undef SDL_LOADSO_DISABLED */ -/* #undef SDL_THREADS_DISABLED */ -/* #undef SDL_TIMERS_DISABLED */ -/* #undef SDL_VIDEO_DISABLED */ - -/* Enable various audio drivers */ -/* #undef SDL_AUDIO_DRIVER_ALSA */ -/* #undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC */ -/* #undef SDL_AUDIO_DRIVER_ARTS */ -/* #undef SDL_AUDIO_DRIVER_ARTS_DYNAMIC */ -/* #undef SDL_AUDIO_DRIVER_BAUDIO */ -/* #undef SDL_AUDIO_DRIVER_BSD */ -/* #undef SDL_AUDIO_DRIVER_COREAUDIO */ -/* #undef SDL_AUDIO_DRIVER_DART */ -/* #undef SDL_AUDIO_DRIVER_DC */ -#define SDL_AUDIO_DRIVER_DISK 1 -#define SDL_AUDIO_DRIVER_DUMMY 1 -/* #undef SDL_AUDIO_DRIVER_DMEDIA */ -#define SDL_AUDIO_DRIVER_DSOUND 1 -/* #undef SDL_AUDIO_DRIVER_PULSE */ -/* #undef SDL_AUDIO_DRIVER_PULSE_DYNAMIC */ -/* #undef SDL_AUDIO_DRIVER_ESD */ -/* #undef SDL_AUDIO_DRIVER_ESD_DYNAMIC */ -/* #undef SDL_AUDIO_DRIVER_MINT */ -/* #undef SDL_AUDIO_DRIVER_MMEAUDIO */ -/* #undef SDL_AUDIO_DRIVER_NAS */ -/* #undef SDL_AUDIO_DRIVER_NAS_DYNAMIC */ -/* #undef SDL_AUDIO_DRIVER_OSS */ -/* #undef SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H */ -/* #undef SDL_AUDIO_DRIVER_PAUD */ -/* #undef SDL_AUDIO_DRIVER_QNXNTO */ -/* #undef SDL_AUDIO_DRIVER_SNDMGR */ -/* #undef SDL_AUDIO_DRIVER_SUNAUDIO */ -#define SDL_AUDIO_DRIVER_WAVEOUT 1 - -/* Enable various cdrom drivers */ -/* #undef SDL_CDROM_AIX */ -/* #undef SDL_CDROM_BEOS */ -/* #undef SDL_CDROM_BSDI */ -/* #undef SDL_CDROM_DC */ -/* #undef SDL_CDROM_DUMMY */ -/* #undef SDL_CDROM_FREEBSD */ -/* #undef SDL_CDROM_LINUX */ -/* #undef SDL_CDROM_MACOS */ -/* #undef SDL_CDROM_MACOSX */ -/* #undef SDL_CDROM_MINT */ -/* #undef SDL_CDROM_OPENBSD */ -/* #undef SDL_CDROM_OS2 */ -/* #undef SDL_CDROM_OSF */ -/* #undef SDL_CDROM_QNX */ -#define SDL_CDROM_WIN32 1 - -/* Enable various input drivers */ -/* #undef SDL_INPUT_LINUXEV */ -/* #undef SDL_INPUT_TSLIB */ -/* #undef SDL_JOYSTICK_BEOS */ -/* #undef SDL_JOYSTICK_DC */ -/* #undef SDL_JOYSTICK_DUMMY */ -/* #undef SDL_JOYSTICK_IOKIT */ -/* #undef SDL_JOYSTICK_LINUX */ -/* #undef SDL_JOYSTICK_MACOS */ -/* #undef SDL_JOYSTICK_MINT */ -/* #undef SDL_JOYSTICK_OS2 */ -/* #undef SDL_JOYSTICK_RISCOS */ -#define SDL_JOYSTICK_WINMM 1 -/* #undef SDL_JOYSTICK_USBHID */ -/* #undef SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H */ - -/* Enable various shared object loading systems */ -/* #undef SDL_LOADSO_BEOS */ -/* #undef SDL_LOADSO_DLCOMPAT */ -/* #undef SDL_LOADSO_DLOPEN */ -/* #undef SDL_LOADSO_DUMMY */ -/* #undef SDL_LOADSO_LDG */ -/* #undef SDL_LOADSO_MACOS */ -/* #undef SDL_LOADSO_OS2 */ -#define SDL_LOADSO_WIN32 1 - -/* Enable various threading systems */ -/* #undef SDL_THREAD_BEOS */ -/* #undef SDL_THREAD_DC */ -/* #undef SDL_THREAD_OS2 */ -/* #undef SDL_THREAD_PTH */ -/* #undef SDL_THREAD_PTHREAD */ -/* #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX */ -/* #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP */ -/* #undef SDL_THREAD_SPROC */ -#define SDL_THREAD_WIN32 1 - -/* Enable various timer systems */ -/* #undef SDL_TIMER_BEOS */ -/* #undef SDL_TIMER_DC */ -/* #undef SDL_TIMER_DUMMY */ -/* #undef SDL_TIMER_MACOS */ -/* #undef SDL_TIMER_MINT */ -/* #undef SDL_TIMER_OS2 */ -/* #undef SDL_TIMER_RISCOS */ -/* #undef SDL_TIMER_UNIX */ -#define SDL_TIMER_WIN32 1 -/* #undef SDL_TIMER_WINCE */ - -/* Enable various video drivers */ -/* #undef SDL_VIDEO_DRIVER_AALIB */ -/* #undef SDL_VIDEO_DRIVER_BWINDOW */ -/* #undef SDL_VIDEO_DRIVER_CACA */ -/* #undef SDL_VIDEO_DRIVER_DC */ -#define SDL_VIDEO_DRIVER_DDRAW 1 -/* #undef SDL_VIDEO_DRIVER_DGA */ -/* #undef SDL_VIDEO_DRIVER_DIRECTFB */ -/* #undef SDL_VIDEO_DRIVER_DRAWSPROCKET */ -#define SDL_VIDEO_DRIVER_DUMMY 1 -/* #undef SDL_VIDEO_DRIVER_FBCON */ -/* #undef SDL_VIDEO_DRIVER_GAPI */ -/* #undef SDL_VIDEO_DRIVER_GEM */ -/* #undef SDL_VIDEO_DRIVER_GGI */ -/* #undef SDL_VIDEO_DRIVER_IPOD */ -/* #undef SDL_VIDEO_DRIVER_NANOX */ -/* #undef SDL_VIDEO_DRIVER_OS2FS */ -/* #undef SDL_VIDEO_DRIVER_PHOTON */ -/* #undef SDL_VIDEO_DRIVER_PICOGUI */ -/* #undef SDL_VIDEO_DRIVER_PS2GS */ -/* #undef SDL_VIDEO_DRIVER_PS3 */ -/* #undef SDL_VIDEO_DRIVER_QTOPIA */ -/* #undef SDL_VIDEO_DRIVER_QUARTZ */ -/* #undef SDL_VIDEO_DRIVER_RISCOS */ -/* #undef SDL_VIDEO_DRIVER_SVGALIB */ -/* #undef SDL_VIDEO_DRIVER_TOOLBOX */ -/* #undef SDL_VIDEO_DRIVER_VGL */ -#define SDL_VIDEO_DRIVER_WINDIB 1 -/* #undef SDL_VIDEO_DRIVER_WSCONS */ -/* #undef SDL_VIDEO_DRIVER_X11 */ -/* #undef SDL_VIDEO_DRIVER_X11_DGAMOUSE */ -/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC */ -/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT */ -/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR */ -/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER */ -/* #undef SDL_VIDEO_DRIVER_X11_VIDMODE */ -/* #undef SDL_VIDEO_DRIVER_X11_XINERAMA */ -/* #undef SDL_VIDEO_DRIVER_X11_XME */ -/* #undef SDL_VIDEO_DRIVER_X11_XRANDR */ -/* #undef SDL_VIDEO_DRIVER_X11_XV */ -/* #undef SDL_VIDEO_DRIVER_XBIOS */ - -/* Enable OpenGL support */ -#define SDL_VIDEO_OPENGL 1 -/* #undef SDL_VIDEO_OPENGL_GLX */ -#define SDL_VIDEO_OPENGL_WGL 1 -/* #undef SDL_VIDEO_OPENGL_OSMESA */ -/* #undef SDL_VIDEO_OPENGL_OSMESA_DYNAMIC */ - -/* Disable screensaver */ -#define SDL_VIDEO_DISABLE_SCREENSAVER 1 - -/* Enable assembly routines */ -#define SDL_ASSEMBLY_ROUTINES 1 -#define SDL_HERMES_BLITTERS 1 -/* #undef SDL_ALTIVEC_BLITTERS */ - -#endif /* _SDL_config_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_copying.h b/misc/builddeps/dp.win32/include/SDL/SDL_copying.h deleted file mode 100644 index 1bd6b84c..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_copying.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_cpuinfo.h b/misc/builddeps/dp.win32/include/SDL/SDL_cpuinfo.h deleted file mode 100644 index f4be8e03..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_cpuinfo.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * @file SDL_cpuinfo.h - * CPU feature detection for SDL - */ - -#ifndef _SDL_cpuinfo_h -#define _SDL_cpuinfo_h - -#include "SDL_stdinc.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** This function returns true if the CPU has the RDTSC instruction */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); - -/** This function returns true if the CPU has MMX features */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); - -/** This function returns true if the CPU has MMX Ext. features */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasMMXExt(void); - -/** This function returns true if the CPU has 3DNow features */ -extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); - -/** This function returns true if the CPU has 3DNow! Ext. features */ -extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNowExt(void); - -/** This function returns true if the CPU has SSE features */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); - -/** This function returns true if the CPU has SSE2 features */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); - -/** This function returns true if the CPU has AltiVec features */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_cpuinfo_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_endian.h b/misc/builddeps/dp.win32/include/SDL/SDL_endian.h deleted file mode 100644 index f7a2e2f8..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_endian.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * @file SDL_endian.h - * Functions for reading and writing endian-specific values - */ - -#ifndef _SDL_endian_h -#define _SDL_endian_h - -#include "SDL_stdinc.h" - -/** @name SDL_ENDIANs - * The two types of endianness - */ -/*@{*/ -#define SDL_LIL_ENDIAN 1234 -#define SDL_BIG_ENDIAN 4321 -/*@}*/ - -#ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */ -#if defined(__hppa__) || \ - defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ - (defined(__MIPS__) && defined(__MISPEB__)) || \ - defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \ - defined(__sparc__) -#define SDL_BYTEORDER SDL_BIG_ENDIAN -#else -#define SDL_BYTEORDER SDL_LIL_ENDIAN -#endif -#endif /* !SDL_BYTEORDER */ - - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @name SDL_Swap Functions - * Use inline functions for compilers that support them, and static - * functions for those that do not. Because these functions become - * static for compilers that do not support inline functions, this - * header should only be included in files that actually use them. - */ -/*@{*/ -#if defined(__GNUC__) && defined(__i386__) && \ - !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) -static __inline__ Uint16 SDL_Swap16(Uint16 x) -{ - __asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x)); - return x; -} -#elif defined(__GNUC__) && defined(__x86_64__) -static __inline__ Uint16 SDL_Swap16(Uint16 x) -{ - __asm__("xchgb %b0,%h0" : "=Q" (x) : "0" (x)); - return x; -} -#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) -static __inline__ Uint16 SDL_Swap16(Uint16 x) -{ - Uint16 result; - - __asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x)); - return result; -} -#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) -static __inline__ Uint16 SDL_Swap16(Uint16 x) -{ - __asm__("rorw #8,%0" : "=d" (x) : "0" (x) : "cc"); - return x; -} -#else -static __inline__ Uint16 SDL_Swap16(Uint16 x) { - return((x<<8)|(x>>8)); -} -#endif - -#if defined(__GNUC__) && defined(__i386__) && \ - !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) -static __inline__ Uint32 SDL_Swap32(Uint32 x) -{ - __asm__("bswap %0" : "=r" (x) : "0" (x)); - return x; -} -#elif defined(__GNUC__) && defined(__x86_64__) -static __inline__ Uint32 SDL_Swap32(Uint32 x) -{ - __asm__("bswapl %0" : "=r" (x) : "0" (x)); - return x; -} -#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) -static __inline__ Uint32 SDL_Swap32(Uint32 x) -{ - Uint32 result; - - __asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x)); - __asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (x)); - __asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (x)); - return result; -} -#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) -static __inline__ Uint32 SDL_Swap32(Uint32 x) -{ - __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) : "0" (x) : "cc"); - return x; -} -#else -static __inline__ Uint32 SDL_Swap32(Uint32 x) { - return((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24)); -} -#endif - -#ifdef SDL_HAS_64BIT_TYPE -#if defined(__GNUC__) && defined(__i386__) && \ - !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) -static __inline__ Uint64 SDL_Swap64(Uint64 x) -{ - union { - struct { Uint32 a,b; } s; - Uint64 u; - } v; - v.u = x; - __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" - : "=r" (v.s.a), "=r" (v.s.b) - : "0" (v.s.a), "1" (v.s.b)); - return v.u; -} -#elif defined(__GNUC__) && defined(__x86_64__) -static __inline__ Uint64 SDL_Swap64(Uint64 x) -{ - __asm__("bswapq %0" : "=r" (x) : "0" (x)); - return x; -} -#else -static __inline__ Uint64 SDL_Swap64(Uint64 x) -{ - Uint32 hi, lo; - - /* Separate into high and low 32-bit values and swap them */ - lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF); - x >>= 32; - hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF); - x = SDL_Swap32(lo); - x <<= 32; - x |= SDL_Swap32(hi); - return(x); -} -#endif -#else -/* This is mainly to keep compilers from complaining in SDL code. - * If there is no real 64-bit datatype, then compilers will complain about - * the fake 64-bit datatype that SDL provides when it compiles user code. - */ -#define SDL_Swap64(X) (X) -#endif /* SDL_HAS_64BIT_TYPE */ -/*@}*/ - -/** - * @name SDL_SwapLE and SDL_SwapBE Functions - * Byteswap item from the specified endianness to the native endianness - */ -/*@{*/ -#if SDL_BYTEORDER == SDL_LIL_ENDIAN -#define SDL_SwapLE16(X) (X) -#define SDL_SwapLE32(X) (X) -#define SDL_SwapLE64(X) (X) -#define SDL_SwapBE16(X) SDL_Swap16(X) -#define SDL_SwapBE32(X) SDL_Swap32(X) -#define SDL_SwapBE64(X) SDL_Swap64(X) -#else -#define SDL_SwapLE16(X) SDL_Swap16(X) -#define SDL_SwapLE32(X) SDL_Swap32(X) -#define SDL_SwapLE64(X) SDL_Swap64(X) -#define SDL_SwapBE16(X) (X) -#define SDL_SwapBE32(X) (X) -#define SDL_SwapBE64(X) (X) -#endif -/*@}*/ - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_endian_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_error.h b/misc/builddeps/dp.win32/include/SDL/SDL_error.h deleted file mode 100644 index b103703a..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_error.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * @file SDL_error.h - * Simple error message routines for SDL - */ - -#ifndef _SDL_error_h -#define _SDL_error_h - -#include "SDL_stdinc.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @name Public functions - */ -/*@{*/ -extern DECLSPEC void SDLCALL SDL_SetError(const char *fmt, ...); -extern DECLSPEC char * SDLCALL SDL_GetError(void); -extern DECLSPEC void SDLCALL SDL_ClearError(void); -/*@}*/ - -/** - * @name Private functions - * @internal Private error message function - used internally - */ -/*@{*/ -#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM) -#define SDL_Unsupported() SDL_Error(SDL_UNSUPPORTED) -typedef enum { - SDL_ENOMEM, - SDL_EFREAD, - SDL_EFWRITE, - SDL_EFSEEK, - SDL_UNSUPPORTED, - SDL_LASTERROR -} SDL_errorcode; -extern DECLSPEC void SDLCALL SDL_Error(SDL_errorcode code); -/*@}*/ - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_error_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_events.h b/misc/builddeps/dp.win32/include/SDL/SDL_events.h deleted file mode 100644 index c94a30c9..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_events.h +++ /dev/null @@ -1,356 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * @file SDL_events.h - * Include file for SDL event handling - */ - -#ifndef _SDL_events_h -#define _SDL_events_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_active.h" -#include "SDL_keyboard.h" -#include "SDL_mouse.h" -#include "SDL_joystick.h" -#include "SDL_quit.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** @name General keyboard/mouse state definitions */ -/*@{*/ -#define SDL_RELEASED 0 -#define SDL_PRESSED 1 -/*@}*/ - -/** Event enumerations */ -typedef enum { - SDL_NOEVENT = 0, /**< Unused (do not remove) */ - SDL_ACTIVEEVENT, /**< Application loses/gains visibility */ - SDL_KEYDOWN, /**< Keys pressed */ - SDL_KEYUP, /**< Keys released */ - SDL_MOUSEMOTION, /**< Mouse moved */ - SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */ - SDL_MOUSEBUTTONUP, /**< Mouse button released */ - SDL_JOYAXISMOTION, /**< Joystick axis motion */ - SDL_JOYBALLMOTION, /**< Joystick trackball motion */ - SDL_JOYHATMOTION, /**< Joystick hat position change */ - SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ - SDL_JOYBUTTONUP, /**< Joystick button released */ - SDL_QUIT, /**< User-requested quit */ - SDL_SYSWMEVENT, /**< System specific event */ - SDL_EVENT_RESERVEDA, /**< Reserved for future use.. */ - SDL_EVENT_RESERVEDB, /**< Reserved for future use.. */ - SDL_VIDEORESIZE, /**< User resized video mode */ - SDL_VIDEOEXPOSE, /**< Screen needs to be redrawn */ - SDL_EVENT_RESERVED2, /**< Reserved for future use.. */ - SDL_EVENT_RESERVED3, /**< Reserved for future use.. */ - SDL_EVENT_RESERVED4, /**< Reserved for future use.. */ - SDL_EVENT_RESERVED5, /**< Reserved for future use.. */ - SDL_EVENT_RESERVED6, /**< Reserved for future use.. */ - SDL_EVENT_RESERVED7, /**< Reserved for future use.. */ - /** Events SDL_USEREVENT through SDL_MAXEVENTS-1 are for your use */ - SDL_USEREVENT = 24, - /** This last event is only for bounding internal arrays - * It is the number of bits in the event mask datatype -- Uint32 - */ - SDL_NUMEVENTS = 32 -} SDL_EventType; - -/** @name Predefined event masks */ -/*@{*/ -#define SDL_EVENTMASK(X) (1<<(X)) -typedef enum { - SDL_ACTIVEEVENTMASK = SDL_EVENTMASK(SDL_ACTIVEEVENT), - SDL_KEYDOWNMASK = SDL_EVENTMASK(SDL_KEYDOWN), - SDL_KEYUPMASK = SDL_EVENTMASK(SDL_KEYUP), - SDL_KEYEVENTMASK = SDL_EVENTMASK(SDL_KEYDOWN)| - SDL_EVENTMASK(SDL_KEYUP), - SDL_MOUSEMOTIONMASK = SDL_EVENTMASK(SDL_MOUSEMOTION), - SDL_MOUSEBUTTONDOWNMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN), - SDL_MOUSEBUTTONUPMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONUP), - SDL_MOUSEEVENTMASK = SDL_EVENTMASK(SDL_MOUSEMOTION)| - SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN)| - SDL_EVENTMASK(SDL_MOUSEBUTTONUP), - SDL_JOYAXISMOTIONMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION), - SDL_JOYBALLMOTIONMASK = SDL_EVENTMASK(SDL_JOYBALLMOTION), - SDL_JOYHATMOTIONMASK = SDL_EVENTMASK(SDL_JOYHATMOTION), - SDL_JOYBUTTONDOWNMASK = SDL_EVENTMASK(SDL_JOYBUTTONDOWN), - SDL_JOYBUTTONUPMASK = SDL_EVENTMASK(SDL_JOYBUTTONUP), - SDL_JOYEVENTMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION)| - SDL_EVENTMASK(SDL_JOYBALLMOTION)| - SDL_EVENTMASK(SDL_JOYHATMOTION)| - SDL_EVENTMASK(SDL_JOYBUTTONDOWN)| - SDL_EVENTMASK(SDL_JOYBUTTONUP), - SDL_VIDEORESIZEMASK = SDL_EVENTMASK(SDL_VIDEORESIZE), - SDL_VIDEOEXPOSEMASK = SDL_EVENTMASK(SDL_VIDEOEXPOSE), - SDL_QUITMASK = SDL_EVENTMASK(SDL_QUIT), - SDL_SYSWMEVENTMASK = SDL_EVENTMASK(SDL_SYSWMEVENT) -} SDL_EventMask ; -#define SDL_ALLEVENTS 0xFFFFFFFF -/*@}*/ - -/** Application visibility event structure */ -typedef struct SDL_ActiveEvent { - Uint8 type; /**< SDL_ACTIVEEVENT */ - Uint8 gain; /**< Whether given states were gained or lost (1/0) */ - Uint8 state; /**< A mask of the focus states */ -} SDL_ActiveEvent; - -/** Keyboard event structure */ -typedef struct SDL_KeyboardEvent { - Uint8 type; /**< SDL_KEYDOWN or SDL_KEYUP */ - Uint8 which; /**< The keyboard device index */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ - SDL_keysym keysym; -} SDL_KeyboardEvent; - -/** Mouse motion event structure */ -typedef struct SDL_MouseMotionEvent { - Uint8 type; /**< SDL_MOUSEMOTION */ - Uint8 which; /**< The mouse device index */ - Uint8 state; /**< The current button state */ - Uint16 x, y; /**< The X/Y coordinates of the mouse */ - Sint16 xrel; /**< The relative motion in the X direction */ - Sint16 yrel; /**< The relative motion in the Y direction */ -} SDL_MouseMotionEvent; - -/** Mouse button event structure */ -typedef struct SDL_MouseButtonEvent { - Uint8 type; /**< SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP */ - Uint8 which; /**< The mouse device index */ - Uint8 button; /**< The mouse button index */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ - Uint16 x, y; /**< The X/Y coordinates of the mouse at press time */ -} SDL_MouseButtonEvent; - -/** Joystick axis motion event structure */ -typedef struct SDL_JoyAxisEvent { - Uint8 type; /**< SDL_JOYAXISMOTION */ - Uint8 which; /**< The joystick device index */ - Uint8 axis; /**< The joystick axis index */ - Sint16 value; /**< The axis value (range: -32768 to 32767) */ -} SDL_JoyAxisEvent; - -/** Joystick trackball motion event structure */ -typedef struct SDL_JoyBallEvent { - Uint8 type; /**< SDL_JOYBALLMOTION */ - Uint8 which; /**< The joystick device index */ - Uint8 ball; /**< The joystick trackball index */ - Sint16 xrel; /**< The relative motion in the X direction */ - Sint16 yrel; /**< The relative motion in the Y direction */ -} SDL_JoyBallEvent; - -/** Joystick hat position change event structure */ -typedef struct SDL_JoyHatEvent { - Uint8 type; /**< SDL_JOYHATMOTION */ - Uint8 which; /**< The joystick device index */ - Uint8 hat; /**< The joystick hat index */ - Uint8 value; /**< The hat position value: - * SDL_HAT_LEFTUP SDL_HAT_UP SDL_HAT_RIGHTUP - * SDL_HAT_LEFT SDL_HAT_CENTERED SDL_HAT_RIGHT - * SDL_HAT_LEFTDOWN SDL_HAT_DOWN SDL_HAT_RIGHTDOWN - * Note that zero means the POV is centered. - */ -} SDL_JoyHatEvent; - -/** Joystick button event structure */ -typedef struct SDL_JoyButtonEvent { - Uint8 type; /**< SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP */ - Uint8 which; /**< The joystick device index */ - Uint8 button; /**< The joystick button index */ - Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ -} SDL_JoyButtonEvent; - -/** The "window resized" event - * When you get this event, you are responsible for setting a new video - * mode with the new width and height. - */ -typedef struct SDL_ResizeEvent { - Uint8 type; /**< SDL_VIDEORESIZE */ - int w; /**< New width */ - int h; /**< New height */ -} SDL_ResizeEvent; - -/** The "screen redraw" event */ -typedef struct SDL_ExposeEvent { - Uint8 type; /**< SDL_VIDEOEXPOSE */ -} SDL_ExposeEvent; - -/** The "quit requested" event */ -typedef struct SDL_QuitEvent { - Uint8 type; /**< SDL_QUIT */ -} SDL_QuitEvent; - -/** A user-defined event type */ -typedef struct SDL_UserEvent { - Uint8 type; /**< SDL_USEREVENT through SDL_NUMEVENTS-1 */ - int code; /**< User defined event code */ - void *data1; /**< User defined data pointer */ - void *data2; /**< User defined data pointer */ -} SDL_UserEvent; - -/** If you want to use this event, you should include SDL_syswm.h */ -struct SDL_SysWMmsg; -typedef struct SDL_SysWMmsg SDL_SysWMmsg; -typedef struct SDL_SysWMEvent { - Uint8 type; - SDL_SysWMmsg *msg; -} SDL_SysWMEvent; - -/** General event structure */ -typedef union SDL_Event { - Uint8 type; - SDL_ActiveEvent active; - SDL_KeyboardEvent key; - SDL_MouseMotionEvent motion; - SDL_MouseButtonEvent button; - SDL_JoyAxisEvent jaxis; - SDL_JoyBallEvent jball; - SDL_JoyHatEvent jhat; - SDL_JoyButtonEvent jbutton; - SDL_ResizeEvent resize; - SDL_ExposeEvent expose; - SDL_QuitEvent quit; - SDL_UserEvent user; - SDL_SysWMEvent syswm; -} SDL_Event; - - -/* Function prototypes */ - -/** Pumps the event loop, gathering events from the input devices. - * This function updates the event queue and internal input device state. - * This should only be run in the thread that sets the video mode. - */ -extern DECLSPEC void SDLCALL SDL_PumpEvents(void); - -typedef enum { - SDL_ADDEVENT, - SDL_PEEKEVENT, - SDL_GETEVENT -} SDL_eventaction; - -/** - * Checks the event queue for messages and optionally returns them. - * - * If 'action' is SDL_ADDEVENT, up to 'numevents' events will be added to - * the back of the event queue. - * If 'action' is SDL_PEEKEVENT, up to 'numevents' events at the front - * of the event queue, matching 'mask', will be returned and will not - * be removed from the queue. - * If 'action' is SDL_GETEVENT, up to 'numevents' events at the front - * of the event queue, matching 'mask', will be returned and will be - * removed from the queue. - * - * @return - * This function returns the number of events actually stored, or -1 - * if there was an error. - * - * This function is thread-safe. - */ -extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event *events, int numevents, - SDL_eventaction action, Uint32 mask); - -/** Polls for currently pending events, and returns 1 if there are any pending - * events, or 0 if there are none available. If 'event' is not NULL, the next - * event is removed from the queue and stored in that area. - */ -extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event *event); - -/** Waits indefinitely for the next available event, returning 1, or 0 if there - * was an error while waiting for events. If 'event' is not NULL, the next - * event is removed from the queue and stored in that area. - */ -extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event *event); - -/** Add an event to the event queue. - * This function returns 0 on success, or -1 if the event queue was full - * or there was some other error. - */ -extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event *event); - -/** @name Event Filtering */ -/*@{*/ -typedef int (SDLCALL *SDL_EventFilter)(const SDL_Event *event); -/** - * This function sets up a filter to process all events before they - * change internal state and are posted to the internal event queue. - * - * The filter is protypted as: - * @code typedef int (SDLCALL *SDL_EventFilter)(const SDL_Event *event); @endcode - * - * If the filter returns 1, then the event will be added to the internal queue. - * If it returns 0, then the event will be dropped from the queue, but the - * internal state will still be updated. This allows selective filtering of - * dynamically arriving events. - * - * @warning Be very careful of what you do in the event filter function, as - * it may run in a different thread! - * - * There is one caveat when dealing with the SDL_QUITEVENT event type. The - * event filter is only called when the window manager desires to close the - * application window. If the event filter returns 1, then the window will - * be closed, otherwise the window will remain open if possible. - * If the quit event is generated by an interrupt signal, it will bypass the - * internal queue and be delivered to the application at the next event poll. - */ -extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter); - -/** - * Return the current event filter - can be used to "chain" filters. - * If there is no event filter set, this function returns NULL. - */ -extern DECLSPEC SDL_EventFilter SDLCALL SDL_GetEventFilter(void); -/*@}*/ - -/** @name Event State */ -/*@{*/ -#define SDL_QUERY -1 -#define SDL_IGNORE 0 -#define SDL_DISABLE 0 -#define SDL_ENABLE 1 -/*@}*/ - -/** -* This function allows you to set the state of processing certain events. -* If 'state' is set to SDL_IGNORE, that event will be automatically dropped -* from the event queue and will not event be filtered. -* If 'state' is set to SDL_ENABLE, that event will be processed normally. -* If 'state' is set to SDL_QUERY, SDL_EventState() will return the -* current processing state of the specified event. -*/ -extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint8 type, int state); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_events_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_getenv.h b/misc/builddeps/dp.win32/include/SDL/SDL_getenv.h deleted file mode 100644 index 253ad88c..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_getenv.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_getenv.h - * @deprecated Use SDL_stdinc.h instead - */ - -/* DEPRECATED */ -#include "SDL_stdinc.h" diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_joystick.h b/misc/builddeps/dp.win32/include/SDL/SDL_joystick.h deleted file mode 100644 index d5135c3d..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_joystick.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_joystick.h - * Include file for SDL joystick event handling - */ - -#ifndef _SDL_joystick_h -#define _SDL_joystick_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** @file SDL_joystick.h - * @note In order to use these functions, SDL_Init() must have been called - * with the SDL_INIT_JOYSTICK flag. This causes SDL to scan the system - * for joysticks, and load appropriate drivers. - */ - -/** The joystick structure used to identify an SDL joystick */ -struct _SDL_Joystick; -typedef struct _SDL_Joystick SDL_Joystick; - -/* Function prototypes */ -/** - * Count the number of joysticks attached to the system - */ -extern DECLSPEC int SDLCALL SDL_NumJoysticks(void); - -/** - * Get the implementation dependent name of a joystick. - * - * This can be called before any joysticks are opened. - * If no name can be found, this function returns NULL. - */ -extern DECLSPEC const char * SDLCALL SDL_JoystickName(int device_index); - -/** - * Open a joystick for use. - * - * @param[in] device_index - * The index passed as an argument refers to - * the N'th joystick on the system. This index is the value which will - * identify this joystick in future joystick events. - * - * @return This function returns a joystick identifier, or NULL if an error occurred. - */ -extern DECLSPEC SDL_Joystick * SDLCALL SDL_JoystickOpen(int device_index); - -/** - * Returns 1 if the joystick has been opened, or 0 if it has not. - */ -extern DECLSPEC int SDLCALL SDL_JoystickOpened(int device_index); - -/** - * Get the device index of an opened joystick. - */ -extern DECLSPEC int SDLCALL SDL_JoystickIndex(SDL_Joystick *joystick); - -/** - * Get the number of general axis controls on a joystick - */ -extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick *joystick); - -/** - * Get the number of trackballs on a joystick - * - * Joystick trackballs have only relative motion events associated - * with them and their state cannot be polled. - */ -extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick *joystick); - -/** - * Get the number of POV hats on a joystick - */ -extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick *joystick); - -/** - * Get the number of buttons on a joystick - */ -extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick *joystick); - -/** - * Update the current state of the open joysticks. - * - * This is called automatically by the event loop if any joystick - * events are enabled. - */ -extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void); - -/** - * Enable/disable joystick event polling. - * - * If joystick events are disabled, you must call SDL_JoystickUpdate() - * yourself and check the state of the joystick when you want joystick - * information. - * - * @param[in] state The state can be one of SDL_QUERY, SDL_ENABLE or SDL_IGNORE. - */ -extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); - -/** - * Get the current state of an axis control on a joystick - * - * @param[in] axis The axis indices start at index 0. - * - * @return The state is a value ranging from -32768 to 32767. - */ -extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick *joystick, int axis); - -/** - * @name Hat Positions - * The return value of SDL_JoystickGetHat() is one of the following positions: - */ -/*@{*/ -#define SDL_HAT_CENTERED 0x00 -#define SDL_HAT_UP 0x01 -#define SDL_HAT_RIGHT 0x02 -#define SDL_HAT_DOWN 0x04 -#define SDL_HAT_LEFT 0x08 -#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP) -#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN) -#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP) -#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN) -/*@}*/ - -/** - * Get the current state of a POV hat on a joystick - * - * @param[in] hat The hat indices start at index 0. - */ -extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick *joystick, int hat); - -/** - * Get the ball axis change since the last poll - * - * @param[in] ball The ball indices start at index 0. - * - * @return This returns 0, or -1 if you passed it invalid parameters. - */ -extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int *dx, int *dy); - -/** - * Get the current state of a button on a joystick - * - * @param[in] button The button indices start at index 0. - */ -extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick *joystick, int button); - -/** - * Close a joystick previously opened with SDL_JoystickOpen() - */ -extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick *joystick); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_joystick_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_keyboard.h b/misc/builddeps/dp.win32/include/SDL/SDL_keyboard.h deleted file mode 100644 index 7b59d24e..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_keyboard.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_keyboard.h - * Include file for SDL keyboard event handling - */ - -#ifndef _SDL_keyboard_h -#define _SDL_keyboard_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_keysym.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** Keysym structure - * - * - The scancode is hardware dependent, and should not be used by general - * applications. If no hardware scancode is available, it will be 0. - * - * - The 'unicode' translated character is only available when character - * translation is enabled by the SDL_EnableUNICODE() API. If non-zero, - * this is a UNICODE character corresponding to the keypress. If the - * high 9 bits of the character are 0, then this maps to the equivalent - * ASCII character: - * @code - * char ch; - * if ( (keysym.unicode & 0xFF80) == 0 ) { - * ch = keysym.unicode & 0x7F; - * } else { - * An international character.. - * } - * @endcode - */ -typedef struct SDL_keysym { - Uint8 scancode; /**< hardware specific scancode */ - SDLKey sym; /**< SDL virtual keysym */ - SDLMod mod; /**< current key modifiers */ - Uint16 unicode; /**< translated character */ -} SDL_keysym; - -/** This is the mask which refers to all hotkey bindings */ -#define SDL_ALL_HOTKEYS 0xFFFFFFFF - -/* Function prototypes */ -/** - * Enable/Disable UNICODE translation of keyboard input. - * - * This translation has some overhead, so translation defaults off. - * - * @param[in] enable - * If 'enable' is 1, translation is enabled. - * If 'enable' is 0, translation is disabled. - * If 'enable' is -1, the translation state is not changed. - * - * @return It returns the previous state of keyboard translation. - */ -extern DECLSPEC int SDLCALL SDL_EnableUNICODE(int enable); - -#define SDL_DEFAULT_REPEAT_DELAY 500 -#define SDL_DEFAULT_REPEAT_INTERVAL 30 -/** - * Enable/Disable keyboard repeat. Keyboard repeat defaults to off. - * - * @param[in] delay - * 'delay' is the initial delay in ms between the time when a key is - * pressed, and keyboard repeat begins. - * - * @param[in] interval - * 'interval' is the time in ms between keyboard repeat events. - * - * If 'delay' is set to 0, keyboard repeat is disabled. - */ -extern DECLSPEC int SDLCALL SDL_EnableKeyRepeat(int delay, int interval); -extern DECLSPEC void SDLCALL SDL_GetKeyRepeat(int *delay, int *interval); - -/** - * Get a snapshot of the current state of the keyboard. - * Returns an array of keystates, indexed by the SDLK_* syms. - * Usage: - * @code - * Uint8 *keystate = SDL_GetKeyState(NULL); - * if ( keystate[SDLK_RETURN] ) //... \ is pressed. - * @endcode - */ -extern DECLSPEC Uint8 * SDLCALL SDL_GetKeyState(int *numkeys); - -/** - * Get the current key modifier state - */ -extern DECLSPEC SDLMod SDLCALL SDL_GetModState(void); - -/** - * Set the current key modifier state. - * This does not change the keyboard state, only the key modifier flags. - */ -extern DECLSPEC void SDLCALL SDL_SetModState(SDLMod modstate); - -/** - * Get the name of an SDL virtual keysym - */ -extern DECLSPEC char * SDLCALL SDL_GetKeyName(SDLKey key); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_keyboard_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_keysym.h b/misc/builddeps/dp.win32/include/SDL/SDL_keysym.h deleted file mode 100644 index 90101286..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_keysym.h +++ /dev/null @@ -1,326 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_keysym_h -#define _SDL_keysym_h - -/** What we really want is a mapping of every raw key on the keyboard. - * To support international keyboards, we use the range 0xA1 - 0xFF - * as international virtual keycodes. We'll follow in the footsteps of X11... - * @brief The names of the keys - */ -typedef enum { - /** @name ASCII mapped keysyms - * The keyboard syms have been cleverly chosen to map to ASCII - */ - /*@{*/ - SDLK_UNKNOWN = 0, - SDLK_FIRST = 0, - SDLK_BACKSPACE = 8, - SDLK_TAB = 9, - SDLK_CLEAR = 12, - SDLK_RETURN = 13, - SDLK_PAUSE = 19, - SDLK_ESCAPE = 27, - SDLK_SPACE = 32, - SDLK_EXCLAIM = 33, - SDLK_QUOTEDBL = 34, - SDLK_HASH = 35, - SDLK_DOLLAR = 36, - SDLK_AMPERSAND = 38, - SDLK_QUOTE = 39, - SDLK_LEFTPAREN = 40, - SDLK_RIGHTPAREN = 41, - SDLK_ASTERISK = 42, - SDLK_PLUS = 43, - SDLK_COMMA = 44, - SDLK_MINUS = 45, - SDLK_PERIOD = 46, - SDLK_SLASH = 47, - SDLK_0 = 48, - SDLK_1 = 49, - SDLK_2 = 50, - SDLK_3 = 51, - SDLK_4 = 52, - SDLK_5 = 53, - SDLK_6 = 54, - SDLK_7 = 55, - SDLK_8 = 56, - SDLK_9 = 57, - SDLK_COLON = 58, - SDLK_SEMICOLON = 59, - SDLK_LESS = 60, - SDLK_EQUALS = 61, - SDLK_GREATER = 62, - SDLK_QUESTION = 63, - SDLK_AT = 64, - /* - Skip uppercase letters - */ - SDLK_LEFTBRACKET = 91, - SDLK_BACKSLASH = 92, - SDLK_RIGHTBRACKET = 93, - SDLK_CARET = 94, - SDLK_UNDERSCORE = 95, - SDLK_BACKQUOTE = 96, - SDLK_a = 97, - SDLK_b = 98, - SDLK_c = 99, - SDLK_d = 100, - SDLK_e = 101, - SDLK_f = 102, - SDLK_g = 103, - SDLK_h = 104, - SDLK_i = 105, - SDLK_j = 106, - SDLK_k = 107, - SDLK_l = 108, - SDLK_m = 109, - SDLK_n = 110, - SDLK_o = 111, - SDLK_p = 112, - SDLK_q = 113, - SDLK_r = 114, - SDLK_s = 115, - SDLK_t = 116, - SDLK_u = 117, - SDLK_v = 118, - SDLK_w = 119, - SDLK_x = 120, - SDLK_y = 121, - SDLK_z = 122, - SDLK_DELETE = 127, - /* End of ASCII mapped keysyms */ - /*@}*/ - - /** @name International keyboard syms */ - /*@{*/ - SDLK_WORLD_0 = 160, /* 0xA0 */ - SDLK_WORLD_1 = 161, - SDLK_WORLD_2 = 162, - SDLK_WORLD_3 = 163, - SDLK_WORLD_4 = 164, - SDLK_WORLD_5 = 165, - SDLK_WORLD_6 = 166, - SDLK_WORLD_7 = 167, - SDLK_WORLD_8 = 168, - SDLK_WORLD_9 = 169, - SDLK_WORLD_10 = 170, - SDLK_WORLD_11 = 171, - SDLK_WORLD_12 = 172, - SDLK_WORLD_13 = 173, - SDLK_WORLD_14 = 174, - SDLK_WORLD_15 = 175, - SDLK_WORLD_16 = 176, - SDLK_WORLD_17 = 177, - SDLK_WORLD_18 = 178, - SDLK_WORLD_19 = 179, - SDLK_WORLD_20 = 180, - SDLK_WORLD_21 = 181, - SDLK_WORLD_22 = 182, - SDLK_WORLD_23 = 183, - SDLK_WORLD_24 = 184, - SDLK_WORLD_25 = 185, - SDLK_WORLD_26 = 186, - SDLK_WORLD_27 = 187, - SDLK_WORLD_28 = 188, - SDLK_WORLD_29 = 189, - SDLK_WORLD_30 = 190, - SDLK_WORLD_31 = 191, - SDLK_WORLD_32 = 192, - SDLK_WORLD_33 = 193, - SDLK_WORLD_34 = 194, - SDLK_WORLD_35 = 195, - SDLK_WORLD_36 = 196, - SDLK_WORLD_37 = 197, - SDLK_WORLD_38 = 198, - SDLK_WORLD_39 = 199, - SDLK_WORLD_40 = 200, - SDLK_WORLD_41 = 201, - SDLK_WORLD_42 = 202, - SDLK_WORLD_43 = 203, - SDLK_WORLD_44 = 204, - SDLK_WORLD_45 = 205, - SDLK_WORLD_46 = 206, - SDLK_WORLD_47 = 207, - SDLK_WORLD_48 = 208, - SDLK_WORLD_49 = 209, - SDLK_WORLD_50 = 210, - SDLK_WORLD_51 = 211, - SDLK_WORLD_52 = 212, - SDLK_WORLD_53 = 213, - SDLK_WORLD_54 = 214, - SDLK_WORLD_55 = 215, - SDLK_WORLD_56 = 216, - SDLK_WORLD_57 = 217, - SDLK_WORLD_58 = 218, - SDLK_WORLD_59 = 219, - SDLK_WORLD_60 = 220, - SDLK_WORLD_61 = 221, - SDLK_WORLD_62 = 222, - SDLK_WORLD_63 = 223, - SDLK_WORLD_64 = 224, - SDLK_WORLD_65 = 225, - SDLK_WORLD_66 = 226, - SDLK_WORLD_67 = 227, - SDLK_WORLD_68 = 228, - SDLK_WORLD_69 = 229, - SDLK_WORLD_70 = 230, - SDLK_WORLD_71 = 231, - SDLK_WORLD_72 = 232, - SDLK_WORLD_73 = 233, - SDLK_WORLD_74 = 234, - SDLK_WORLD_75 = 235, - SDLK_WORLD_76 = 236, - SDLK_WORLD_77 = 237, - SDLK_WORLD_78 = 238, - SDLK_WORLD_79 = 239, - SDLK_WORLD_80 = 240, - SDLK_WORLD_81 = 241, - SDLK_WORLD_82 = 242, - SDLK_WORLD_83 = 243, - SDLK_WORLD_84 = 244, - SDLK_WORLD_85 = 245, - SDLK_WORLD_86 = 246, - SDLK_WORLD_87 = 247, - SDLK_WORLD_88 = 248, - SDLK_WORLD_89 = 249, - SDLK_WORLD_90 = 250, - SDLK_WORLD_91 = 251, - SDLK_WORLD_92 = 252, - SDLK_WORLD_93 = 253, - SDLK_WORLD_94 = 254, - SDLK_WORLD_95 = 255, /* 0xFF */ - /*@}*/ - - /** @name Numeric keypad */ - /*@{*/ - SDLK_KP0 = 256, - SDLK_KP1 = 257, - SDLK_KP2 = 258, - SDLK_KP3 = 259, - SDLK_KP4 = 260, - SDLK_KP5 = 261, - SDLK_KP6 = 262, - SDLK_KP7 = 263, - SDLK_KP8 = 264, - SDLK_KP9 = 265, - SDLK_KP_PERIOD = 266, - SDLK_KP_DIVIDE = 267, - SDLK_KP_MULTIPLY = 268, - SDLK_KP_MINUS = 269, - SDLK_KP_PLUS = 270, - SDLK_KP_ENTER = 271, - SDLK_KP_EQUALS = 272, - /*@}*/ - - /** @name Arrows + Home/End pad */ - /*@{*/ - SDLK_UP = 273, - SDLK_DOWN = 274, - SDLK_RIGHT = 275, - SDLK_LEFT = 276, - SDLK_INSERT = 277, - SDLK_HOME = 278, - SDLK_END = 279, - SDLK_PAGEUP = 280, - SDLK_PAGEDOWN = 281, - /*@}*/ - - /** @name Function keys */ - /*@{*/ - SDLK_F1 = 282, - SDLK_F2 = 283, - SDLK_F3 = 284, - SDLK_F4 = 285, - SDLK_F5 = 286, - SDLK_F6 = 287, - SDLK_F7 = 288, - SDLK_F8 = 289, - SDLK_F9 = 290, - SDLK_F10 = 291, - SDLK_F11 = 292, - SDLK_F12 = 293, - SDLK_F13 = 294, - SDLK_F14 = 295, - SDLK_F15 = 296, - /*@}*/ - - /** @name Key state modifier keys */ - /*@{*/ - SDLK_NUMLOCK = 300, - SDLK_CAPSLOCK = 301, - SDLK_SCROLLOCK = 302, - SDLK_RSHIFT = 303, - SDLK_LSHIFT = 304, - SDLK_RCTRL = 305, - SDLK_LCTRL = 306, - SDLK_RALT = 307, - SDLK_LALT = 308, - SDLK_RMETA = 309, - SDLK_LMETA = 310, - SDLK_LSUPER = 311, /**< Left "Windows" key */ - SDLK_RSUPER = 312, /**< Right "Windows" key */ - SDLK_MODE = 313, /**< "Alt Gr" key */ - SDLK_COMPOSE = 314, /**< Multi-key compose key */ - /*@}*/ - - /** @name Miscellaneous function keys */ - /*@{*/ - SDLK_HELP = 315, - SDLK_PRINT = 316, - SDLK_SYSREQ = 317, - SDLK_BREAK = 318, - SDLK_MENU = 319, - SDLK_POWER = 320, /**< Power Macintosh power key */ - SDLK_EURO = 321, /**< Some european keyboards */ - SDLK_UNDO = 322, /**< Atari keyboard has Undo */ - /*@}*/ - - /* Add any other keys here */ - - SDLK_LAST -} SDLKey; - -/** Enumeration of valid key mods (possibly OR'd together) */ -typedef enum { - KMOD_NONE = 0x0000, - KMOD_LSHIFT= 0x0001, - KMOD_RSHIFT= 0x0002, - KMOD_LCTRL = 0x0040, - KMOD_RCTRL = 0x0080, - KMOD_LALT = 0x0100, - KMOD_RALT = 0x0200, - KMOD_LMETA = 0x0400, - KMOD_RMETA = 0x0800, - KMOD_NUM = 0x1000, - KMOD_CAPS = 0x2000, - KMOD_MODE = 0x4000, - KMOD_RESERVED = 0x8000 -} SDLMod; - -#define KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) -#define KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) -#define KMOD_ALT (KMOD_LALT|KMOD_RALT) -#define KMOD_META (KMOD_LMETA|KMOD_RMETA) - -#endif /* _SDL_keysym_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_loadso.h b/misc/builddeps/dp.win32/include/SDL/SDL_loadso.h deleted file mode 100644 index 45a17f9f..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_loadso.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_loadso.h - * System dependent library loading routines - */ - -/** @file SDL_loadso.h - * Some things to keep in mind: - * - These functions only work on C function names. Other languages may - * have name mangling and intrinsic language support that varies from - * compiler to compiler. - * - Make sure you declare your function pointers with the same calling - * convention as the actual library function. Your code will crash - * mysteriously if you do not do this. - * - Avoid namespace collisions. If you load a symbol from the library, - * it is not defined whether or not it goes into the global symbol - * namespace for the application. If it does and it conflicts with - * symbols in your code or other shared libraries, you will not get - * the results you expect. :) - */ - - -#ifndef _SDL_loadso_h -#define _SDL_loadso_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** - * This function dynamically loads a shared object and returns a pointer - * to the object handle (or NULL if there was an error). - * The 'sofile' parameter is a system dependent name of the object file. - */ -extern DECLSPEC void * SDLCALL SDL_LoadObject(const char *sofile); - -/** - * Given an object handle, this function looks up the address of the - * named function in the shared object and returns it. This address - * is no longer valid after calling SDL_UnloadObject(). - */ -extern DECLSPEC void * SDLCALL SDL_LoadFunction(void *handle, const char *name); - -/** Unload a shared object from memory */ -extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_loadso_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_main.h b/misc/builddeps/dp.win32/include/SDL/SDL_main.h deleted file mode 100644 index b7f6b2c8..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_main.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_main_h -#define _SDL_main_h - -#include "SDL_stdinc.h" - -/** @file SDL_main.h - * Redefine main() on Win32 and MacOS so that it is called by winmain.c - */ - -#if defined(__WIN32__) || \ - (defined(__MWERKS__) && !defined(__BEOS__)) || \ - defined(__MACOS__) || defined(__MACOSX__) || \ - defined(__SYMBIAN32__) || defined(QWS) - -#ifdef __cplusplus -#define C_LINKAGE "C" -#else -#define C_LINKAGE -#endif /* __cplusplus */ - -/** The application's main() function must be called with C linkage, - * and should be declared like this: - * @code - * #ifdef __cplusplus - * extern "C" - * #endif - * int main(int argc, char *argv[]) - * { - * } - * @endcode - */ -#define main SDL_main - -/** The prototype for the application's main() function */ -extern C_LINKAGE int SDL_main(int argc, char *argv[]); - - -/** @name From the SDL library code -- needed for registering the app on Win32 */ -/*@{*/ -#ifdef __WIN32__ - -#include "begin_code.h" -#ifdef __cplusplus -extern "C" { -#endif - -/** This should be called from your WinMain() function, if any */ -extern DECLSPEC void SDLCALL SDL_SetModuleHandle(void *hInst); -/** This can also be called, but is no longer necessary */ -extern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style, void *hInst); -/** This can also be called, but is no longer necessary (SDL_Quit calls it) */ -extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); -#ifdef __cplusplus -} -#endif -#include "close_code.h" -#endif -/*@}*/ - -/** @name From the SDL library code -- needed for registering QuickDraw on MacOS */ -/*@{*/ -#if defined(__MACOS__) - -#include "begin_code.h" -#ifdef __cplusplus -extern "C" { -#endif - -/** Forward declaration so we don't need to include QuickDraw.h */ -struct QDGlobals; - -/** This should be called from your main() function, if any */ -extern DECLSPEC void SDLCALL SDL_InitQuickDraw(struct QDGlobals *the_qd); - -#ifdef __cplusplus -} -#endif -#include "close_code.h" -#endif -/*@}*/ - -#endif /* Need to redefine main()? */ - -#endif /* _SDL_main_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_mouse.h b/misc/builddeps/dp.win32/include/SDL/SDL_mouse.h deleted file mode 100644 index a573f04e..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_mouse.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_mouse.h - * Include file for SDL mouse event handling - */ - -#ifndef _SDL_mouse_h -#define _SDL_mouse_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_video.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct WMcursor WMcursor; /**< Implementation dependent */ -typedef struct SDL_Cursor { - SDL_Rect area; /**< The area of the mouse cursor */ - Sint16 hot_x, hot_y; /**< The "tip" of the cursor */ - Uint8 *data; /**< B/W cursor data */ - Uint8 *mask; /**< B/W cursor mask */ - Uint8 *save[2]; /**< Place to save cursor area */ - WMcursor *wm_cursor; /**< Window-manager cursor */ -} SDL_Cursor; - -/* Function prototypes */ -/** - * Retrieve the current state of the mouse. - * The current button state is returned as a button bitmask, which can - * be tested using the SDL_BUTTON(X) macros, and x and y are set to the - * current mouse cursor position. You can pass NULL for either x or y. - */ -extern DECLSPEC Uint8 SDLCALL SDL_GetMouseState(int *x, int *y); - -/** - * Retrieve the current state of the mouse. - * The current button state is returned as a button bitmask, which can - * be tested using the SDL_BUTTON(X) macros, and x and y are set to the - * mouse deltas since the last call to SDL_GetRelativeMouseState(). - */ -extern DECLSPEC Uint8 SDLCALL SDL_GetRelativeMouseState(int *x, int *y); - -/** - * Set the position of the mouse cursor (generates a mouse motion event) - */ -extern DECLSPEC void SDLCALL SDL_WarpMouse(Uint16 x, Uint16 y); - -/** - * Create a cursor using the specified data and mask (in MSB format). - * The cursor width must be a multiple of 8 bits. - * - * The cursor is created in black and white according to the following: - * data mask resulting pixel on screen - * 0 1 White - * 1 1 Black - * 0 0 Transparent - * 1 0 Inverted color if possible, black if not. - * - * Cursors created with this function must be freed with SDL_FreeCursor(). - */ -extern DECLSPEC SDL_Cursor * SDLCALL SDL_CreateCursor - (Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y); - -/** - * Set the currently active cursor to the specified one. - * If the cursor is currently visible, the change will be immediately - * represented on the display. - */ -extern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor *cursor); - -/** - * Returns the currently active cursor. - */ -extern DECLSPEC SDL_Cursor * SDLCALL SDL_GetCursor(void); - -/** - * Deallocates a cursor created with SDL_CreateCursor(). - */ -extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor *cursor); - -/** - * Toggle whether or not the cursor is shown on the screen. - * The cursor start off displayed, but can be turned off. - * SDL_ShowCursor() returns 1 if the cursor was being displayed - * before the call, or 0 if it was not. You can query the current - * state by passing a 'toggle' value of -1. - */ -extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle); - -/*@{*/ -/** Used as a mask when testing buttons in buttonstate - * Button 1: Left mouse button - * Button 2: Middle mouse button - * Button 3: Right mouse button - * Button 4: Mouse wheel up (may also be a real button) - * Button 5: Mouse wheel down (may also be a real button) - */ -#define SDL_BUTTON(X) (1 << ((X)-1)) -#define SDL_BUTTON_LEFT 1 -#define SDL_BUTTON_MIDDLE 2 -#define SDL_BUTTON_RIGHT 3 -#define SDL_BUTTON_WHEELUP 4 -#define SDL_BUTTON_WHEELDOWN 5 -#define SDL_BUTTON_X1 6 -#define SDL_BUTTON_X2 7 -#define SDL_BUTTON_LMASK SDL_BUTTON(SDL_BUTTON_LEFT) -#define SDL_BUTTON_MMASK SDL_BUTTON(SDL_BUTTON_MIDDLE) -#define SDL_BUTTON_RMASK SDL_BUTTON(SDL_BUTTON_RIGHT) -#define SDL_BUTTON_X1MASK SDL_BUTTON(SDL_BUTTON_X1) -#define SDL_BUTTON_X2MASK SDL_BUTTON(SDL_BUTTON_X2) -/*@}*/ - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_mouse_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_mutex.h b/misc/builddeps/dp.win32/include/SDL/SDL_mutex.h deleted file mode 100644 index 920971df..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_mutex.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_mutex_h -#define _SDL_mutex_h - -/** @file SDL_mutex.h - * Functions to provide thread synchronization primitives - * - * @note These are independent of the other SDL routines. - */ - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** Synchronization functions which can time out return this value - * if they time out. - */ -#define SDL_MUTEX_TIMEDOUT 1 - -/** This is the timeout value which corresponds to never time out */ -#define SDL_MUTEX_MAXWAIT (~(Uint32)0) - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/** @name Mutex functions */ /*@{*/ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/** The SDL mutex structure, defined in SDL_mutex.c */ -struct SDL_mutex; -typedef struct SDL_mutex SDL_mutex; - -/** Create a mutex, initialized unlocked */ -extern DECLSPEC SDL_mutex * SDLCALL SDL_CreateMutex(void); - -#define SDL_LockMutex(m) SDL_mutexP(m) -/** Lock the mutex - * @return 0, or -1 on error - */ -extern DECLSPEC int SDLCALL SDL_mutexP(SDL_mutex *mutex); - -#define SDL_UnlockMutex(m) SDL_mutexV(m) -/** Unlock the mutex - * @return 0, or -1 on error - * - * It is an error to unlock a mutex that has not been locked by - * the current thread, and doing so results in undefined behavior. - */ -extern DECLSPEC int SDLCALL SDL_mutexV(SDL_mutex *mutex); - -/** Destroy a mutex */ -extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex *mutex); - -/*@}*/ - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/** @name Semaphore functions */ /*@{*/ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/** The SDL semaphore structure, defined in SDL_sem.c */ -struct SDL_semaphore; -typedef struct SDL_semaphore SDL_sem; - -/** Create a semaphore, initialized with value, returns NULL on failure. */ -extern DECLSPEC SDL_sem * SDLCALL SDL_CreateSemaphore(Uint32 initial_value); - -/** Destroy a semaphore */ -extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem *sem); - -/** - * This function suspends the calling thread until the semaphore pointed - * to by sem has a positive count. It then atomically decreases the semaphore - * count. - */ -extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem *sem); - -/** Non-blocking variant of SDL_SemWait(). - * @return 0 if the wait succeeds, - * SDL_MUTEX_TIMEDOUT if the wait would block, and -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem *sem); - -/** Variant of SDL_SemWait() with a timeout in milliseconds, returns 0 if - * the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait does not succeed in - * the allotted time, and -1 on error. - * - * On some platforms this function is implemented by looping with a delay - * of 1 ms, and so should be avoided if possible. - */ -extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem *sem, Uint32 ms); - -/** Atomically increases the semaphore's count (not blocking). - * @return 0, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem *sem); - -/** Returns the current count of the semaphore */ -extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem *sem); - -/*@}*/ - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/** @name Condition_variable_functions */ /*@{*/ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*@{*/ -/** The SDL condition variable structure, defined in SDL_cond.c */ -struct SDL_cond; -typedef struct SDL_cond SDL_cond; -/*@}*/ - -/** Create a condition variable */ -extern DECLSPEC SDL_cond * SDLCALL SDL_CreateCond(void); - -/** Destroy a condition variable */ -extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond *cond); - -/** Restart one of the threads that are waiting on the condition variable, - * @return 0 or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond *cond); - -/** Restart all threads that are waiting on the condition variable, - * @return 0 or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond *cond); - -/** Wait on the condition variable, unlocking the provided mutex. - * The mutex must be locked before entering this function! - * The mutex is re-locked once the condition variable is signaled. - * @return 0 when it is signaled, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond *cond, SDL_mutex *mut); - -/** Waits for at most 'ms' milliseconds, and returns 0 if the condition - * variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not - * signaled in the allotted time, and -1 on error. - * On some platforms this function is implemented by looping with a delay - * of 1 ms, and so should be avoided if possible. - */ -extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond *cond, SDL_mutex *mutex, Uint32 ms); - -/*@}*/ - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_mutex_h */ - diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_name.h b/misc/builddeps/dp.win32/include/SDL/SDL_name.h deleted file mode 100644 index 511619af..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_name.h +++ /dev/null @@ -1,11 +0,0 @@ - -#ifndef _SDLname_h_ -#define _SDLname_h_ - -#if defined(__STDC__) || defined(__cplusplus) -#define NeedFunctionPrototypes 1 -#endif - -#define SDL_NAME(X) SDL_##X - -#endif /* _SDLname_h_ */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_opengl.h b/misc/builddeps/dp.win32/include/SDL/SDL_opengl.h deleted file mode 100644 index c479a3a4..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_opengl.h +++ /dev/null @@ -1,6556 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_opengl.h - * This is a simple file to encapsulate the OpenGL API headers - */ - -#include "SDL_config.h" - -#ifdef __WIN32__ -#define WIN32_LEAN_AND_MEAN -#ifndef NOMINMAX -#define NOMINMAX /* Don't defined min() and max() */ -#endif -#include -#endif -#ifndef NO_SDL_GLEXT -#define __glext_h_ /* Don't let gl.h include glext.h */ -#endif -#if defined(__MACOSX__) -#include /* Header File For The OpenGL Library */ -#include /* Header File For The GLU Library */ -#elif defined(__MACOS__) -#include /* Header File For The OpenGL Library */ -#include /* Header File For The GLU Library */ -#else -#include /* Header File For The OpenGL Library */ -#include /* Header File For The GLU Library */ -#endif -#ifndef NO_SDL_GLEXT -#undef __glext_h_ -#endif - -/** @name GLext.h - * This file taken from "GLext.h" from the Jeff Molofee OpenGL tutorials. - * It is included here because glext.h is not available on some systems. - * If you don't want this version included, simply define "NO_SDL_GLEXT" - */ -/*@{*/ -#ifndef NO_SDL_GLEXT -#if !defined(__glext_h_) && !defined(GL_GLEXT_LEGACY) -#define __glext_h_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** License Applicability. Except to the extent portions of this file are -** made subject to an alternative license as permitted in the SGI Free -** Software License B, Version 1.1 (the "License"), the contents of this -** file are subject only to the provisions of the License. You may not use -** this file except in compliance with the License. You may obtain a copy -** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 -** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: -** -** http://oss.sgi.com/projects/FreeB -** -** Note that, as provided in the License, the Software is distributed on an -** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS -** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND -** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A -** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -** -** Original Code. The Original Code is: OpenGL Sample Implementation, -** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, -** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc. -** Copyright in any portions created by third parties is as indicated -** elsewhere herein. All Rights Reserved. -** -** Additional Notice Provisions: This software was created using the -** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has -** not been independently verified as being compliant with the OpenGL(R) -** version 1.2.1 Specification. -*/ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) -#define WIN32_LEAN_AND_MEAN 1 -#include -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif -#ifndef APIENTRYP -#define APIENTRYP APIENTRY * -#endif -#ifndef GLAPI -#define GLAPI extern -#endif - -/*************************************************************/ - -/* Header file version number, required by OpenGL ABI for Linux */ -/* glext.h last updated 2005/06/20 */ -/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ -#define GL_GLEXT_VERSION 29 - -#ifndef GL_VERSION_1_2 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_RESCALE_NORMAL 0x803A -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#endif - -#ifndef GL_ARB_imaging -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CONSTANT_BORDER 0x8151 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 -#endif - -#ifndef GL_VERSION_1_3 -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_MULTISAMPLE_BIT 0x20000000 -#define GL_NORMAL_MAP 0x8511 -#define GL_REFLECTION_MAP 0x8512 -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMPRESSED_ALPHA 0x84E9 -#define GL_COMPRESSED_LUMINANCE 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB -#define GL_COMPRESSED_INTENSITY 0x84EC -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_RGB 0x8582 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_SUBTRACT 0x84E7 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF -#endif - -#ifndef GL_VERSION_1_4 -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_FOG_COORDINATE_SOURCE 0x8450 -#define GL_FOG_COORDINATE 0x8451 -#define GL_FRAGMENT_DEPTH 0x8452 -#define GL_CURRENT_FOG_COORDINATE 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 -#define GL_FOG_COORDINATE_ARRAY 0x8457 -#define GL_COLOR_SUM 0x8458 -#define GL_CURRENT_SECONDARY_COLOR 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D -#define GL_SECONDARY_COLOR_ARRAY 0x845E -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_FILTER_CONTROL 0x8500 -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_DEPTH_TEXTURE_MODE 0x884B -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_COMPARE_R_TO_TEXTURE 0x884E -#endif - -#ifndef GL_VERSION_1_5 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 -#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE -#define GL_FOG_COORD GL_FOG_COORDINATE -#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE -#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE -#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE -#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER -#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -#define GL_SRC0_RGB GL_SOURCE0_RGB -#define GL_SRC1_RGB GL_SOURCE1_RGB -#define GL_SRC2_RGB GL_SOURCE2_RGB -#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA -#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA -#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA -#endif - -#ifndef GL_VERSION_2_0 -#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_COORDS 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#endif - -#ifndef GL_ARB_multitexture -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -#endif - -#ifndef GL_ARB_multisample -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -#endif - -#ifndef GL_ARB_texture_env_add -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C -#endif - -#ifndef GL_ARB_texture_compression -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 -#endif - -#ifndef GL_ARB_texture_border_clamp -#define GL_CLAMP_TO_BORDER_ARB 0x812D -#endif - -#ifndef GL_ARB_point_parameters -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 -#endif - -#ifndef GL_ARB_vertex_blend -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F -#endif - -#ifndef GL_ARB_matrix_palette -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 -#endif - -#ifndef GL_ARB_texture_env_combine -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 -#endif - -#ifndef GL_ARB_texture_env_crossbar -#endif - -#ifndef GL_ARB_texture_env_dot3 -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF -#endif - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_MIRRORED_REPEAT_ARB 0x8370 -#endif - -#ifndef GL_ARB_depth_texture -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B -#endif - -#ifndef GL_ARB_shadow -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E -#endif - -#ifndef GL_ARB_shadow_ambient -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF -#endif - -#ifndef GL_ARB_window_pos -#endif - -#ifndef GL_ARB_vertex_program -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF -#endif - -#ifndef GL_ARB_fragment_program -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 -#endif - -#ifndef GL_ARB_vertex_buffer_object -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA -#endif - -#ifndef GL_ARB_occlusion_query -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 -#endif - -#ifndef GL_ARB_shader_objects -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 -#endif - -#ifndef GL_ARB_vertex_shader -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A -#endif - -#ifndef GL_ARB_fragment_shader -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B -#endif - -#ifndef GL_ARB_shading_language_100 -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C -#endif - -#ifndef GL_ARB_texture_non_power_of_two -#endif - -#ifndef GL_ARB_point_sprite -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 -#endif - -#ifndef GL_ARB_fragment_program_shadow -#endif - -#ifndef GL_ARB_draw_buffers -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 -#endif - -#ifndef GL_ARB_texture_rectangle -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#endif - -#ifndef GL_ARB_color_buffer_float -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D -#endif - -#ifndef GL_ARB_half_float_pixel -#define GL_HALF_FLOAT_ARB 0x140B -#endif - -#ifndef GL_ARB_texture_float -#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 -#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 -#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 -#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_ALPHA32F_ARB 0x8816 -#define GL_INTENSITY32F_ARB 0x8817 -#define GL_LUMINANCE32F_ARB 0x8818 -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#define GL_ALPHA16F_ARB 0x881C -#define GL_INTENSITY16F_ARB 0x881D -#define GL_LUMINANCE16F_ARB 0x881E -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F -#endif - -#ifndef GL_ARB_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF -#endif - -#ifndef GL_EXT_abgr -#define GL_ABGR_EXT 0x8000 -#endif - -#ifndef GL_EXT_blend_color -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 -#endif - -#ifndef GL_EXT_texture -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 -#endif - -#ifndef GL_EXT_texture3D -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_FILTER4_SGIS 0x8146 -#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 -#endif - -#ifndef GL_EXT_subtexture -#endif - -#ifndef GL_EXT_copy_texture -#endif - -#ifndef GL_EXT_histogram -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 -#endif - -#ifndef GL_EXT_convolution -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -#endif - -#ifndef GL_SGI_color_matrix -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB -#endif - -#ifndef GL_SGI_color_table -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF -#endif - -#ifndef GL_SGIS_pixel_texture -#define GL_PIXEL_TEXTURE_SGIS 0x8353 -#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 -#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 -#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_PIXEL_TEX_GEN_SGIX 0x8139 -#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B -#endif - -#ifndef GL_SGIS_texture4D -#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 -#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 -#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 -#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 -#define GL_TEXTURE_4D_SGIS 0x8134 -#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 -#define GL_TEXTURE_4DSIZE_SGIS 0x8136 -#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 -#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 -#define GL_TEXTURE_4D_BINDING_SGIS 0x814F -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD -#endif - -#ifndef GL_EXT_cmyka -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F -#endif - -#ifndef GL_EXT_texture_object -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 -#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 -#define GL_LINEAR_DETAIL_SGIS 0x8097 -#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 -#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 -#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A -#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B -#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_LINEAR_SHARPEN_SGIS 0x80AD -#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE -#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF -#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D -#endif - -#ifndef GL_SGIS_multisample -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_RESCALE_NORMAL_EXT 0x803A -#endif - -#ifndef GL_EXT_vertex_array -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 -#endif - -#ifndef GL_EXT_misc_attribute -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 -#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 -#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 -#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 -#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 -#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 -#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 -#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 -#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 -#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D -#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E -#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F -#endif - -#ifndef GL_SGIX_shadow -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_CLAMP_TO_EDGE_SGIS 0x812F -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_CLAMP_TO_BORDER_SGIS 0x812D -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B -#endif - -#ifndef GL_EXT_blend_logic_op -#endif - -#ifndef GL_SGIX_interlace -#define GL_INTERLACE_SGIX 0x8094 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E -#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F -#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 -#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 -#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 -#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 -#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 -#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 -#endif - -#ifndef GL_SGIS_texture_select -#define GL_DUAL_ALPHA4_SGIS 0x8110 -#define GL_DUAL_ALPHA8_SGIS 0x8111 -#define GL_DUAL_ALPHA12_SGIS 0x8112 -#define GL_DUAL_ALPHA16_SGIS 0x8113 -#define GL_DUAL_LUMINANCE4_SGIS 0x8114 -#define GL_DUAL_LUMINANCE8_SGIS 0x8115 -#define GL_DUAL_LUMINANCE12_SGIS 0x8116 -#define GL_DUAL_LUMINANCE16_SGIS 0x8117 -#define GL_DUAL_INTENSITY4_SGIS 0x8118 -#define GL_DUAL_INTENSITY8_SGIS 0x8119 -#define GL_DUAL_INTENSITY12_SGIS 0x811A -#define GL_DUAL_INTENSITY16_SGIS 0x811B -#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C -#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D -#define GL_QUAD_ALPHA4_SGIS 0x811E -#define GL_QUAD_ALPHA8_SGIS 0x811F -#define GL_QUAD_LUMINANCE4_SGIS 0x8120 -#define GL_QUAD_LUMINANCE8_SGIS 0x8121 -#define GL_QUAD_INTENSITY4_SGIS 0x8122 -#define GL_QUAD_INTENSITY8_SGIS 0x8123 -#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 -#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SPRITE_SGIX 0x8148 -#define GL_SPRITE_MODE_SGIX 0x8149 -#define GL_SPRITE_AXIS_SGIX 0x814A -#define GL_SPRITE_TRANSLATION_SGIX 0x814B -#define GL_SPRITE_AXIAL_SGIX 0x814C -#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D -#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E -#endif - -#ifndef GL_EXT_point_parameters -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_POINT_SIZE_MIN_SGIS 0x8126 -#define GL_POINT_SIZE_MAX_SGIS 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 -#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 -#endif - -#ifndef GL_SGIX_instruments -#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 -#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C -#endif - -#ifndef GL_SGIX_framezoom -#define GL_FRAMEZOOM_SGIX 0x818B -#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C -#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#endif - -#ifndef GL_FfdMaskSGIX -#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 -#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 -#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 -#define GL_DEFORMATIONS_MASK_SGIX 0x8196 -#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_REFERENCE_PLANE_SGIX 0x817D -#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E -#endif - -#ifndef GL_SGIX_flush_raster -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_FOG_FUNC_SGIS 0x812A -#define GL_FOG_FUNC_POINTS_SGIS 0x812B -#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 -#endif - -#ifndef GL_HP_image_transform -#define GL_IMAGE_SCALE_X_HP 0x8155 -#define GL_IMAGE_SCALE_Y_HP 0x8156 -#define GL_IMAGE_TRANSLATE_X_HP 0x8157 -#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 -#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 -#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A -#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B -#define GL_IMAGE_MAG_FILTER_HP 0x815C -#define GL_IMAGE_MIN_FILTER_HP 0x815D -#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E -#define GL_CUBIC_HP 0x815F -#define GL_AVERAGE_HP 0x8160 -#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 -#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 -#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_IGNORE_BORDER_HP 0x8150 -#define GL_CONSTANT_BORDER_HP 0x8151 -#define GL_REPLICATE_BORDER_HP 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 -#endif - -#ifndef GL_INGR_palette_buffer -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE -#endif - -#ifndef GL_EXT_color_subtable -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_LIST_PRIORITY_SGIX 0x8182 -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_IR_INSTRUMENT1_SGIX 0x817F -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SHADOW_AMBIENT_SGIX 0x80BF -#endif - -#ifndef GL_EXT_index_texture -#endif - -#ifndef GL_EXT_index_material -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -#endif - -#ifndef GL_EXT_index_func -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_YCRCB_422_SGIX 0x81BB -#define GL_YCRCB_444_SGIX 0x81BC -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 -#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 -#define GL_LIGHT_ENV_MODE_SGIX 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B -#define GL_FRAGMENT_LIGHT0_SGIX 0x840C -#define GL_FRAGMENT_LIGHT1_SGIX 0x840D -#define GL_FRAGMENT_LIGHT2_SGIX 0x840E -#define GL_FRAGMENT_LIGHT3_SGIX 0x840F -#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 -#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 -#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 -#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 -#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 -#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 -#endif - -#ifndef GL_WIN_phong_shading -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB -#endif - -#ifndef GL_WIN_specular_fog -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC -#endif - -#ifndef GL_EXT_light_texture -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -/* reuse GL_FRAGMENT_DEPTH_EXT */ -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 -#endif - -#ifndef GL_SGIX_impact_pixel_texture -#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 -#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 -#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 -#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 -#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 -#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 -#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A -#endif - -#ifndef GL_EXT_bgra -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 -#endif - -#ifndef GL_SGIX_async -#define GL_ASYNC_MARKER_SGIX 0x8329 -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D -#endif - -#ifndef GL_INTEL_texture_scissor -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -#endif - -#ifndef GL_HP_occlusion_test -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA -#endif - -#ifndef GL_EXT_secondary_color -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -#endif - -#ifndef GL_EXT_multi_draw_arrays -#endif - -#ifndef GL_EXT_fog_coord -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_TRANSFORM_HINT_APPLE 0x85B1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_FOG_SCALE_SGIX 0x81FC -#define GL_FOG_SCALE_VALUE_SGIX 0x81FD -#endif - -#ifndef GL_SUNX_constant_data -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 -#endif - -#ifndef GL_SUN_global_alpha -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA -#endif - -#ifndef GL_SUN_triangle_list -#define GL_RESTART_SUN 0x0001 -#define GL_REPLACE_MIDDLE_SUN 0x0002 -#define GL_REPLACE_OLDEST_SUN 0x0003 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -#endif - -#ifndef GL_SUN_vertex -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -#endif - -#ifndef GL_INGR_color_clamp -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INTERLACE_READ_INGR 0x8568 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 -#endif - -#ifndef GL_EXT_texture_cube_map -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_WRAP_BORDER_SUN 0x81D4 -#endif - -#ifndef GL_EXT_texture_env_add -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT GL_MODELVIEW -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -#endif - -#ifndef GL_NV_register_combiners -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -/* reuse GL_TEXTURE0_ARB */ -/* reuse GL_TEXTURE1_ARB */ -/* reuse GL_ZERO */ -/* reuse GL_NONE */ -/* reuse GL_FOG */ -#endif - -#ifndef GL_NV_fog_distance -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C -/* reuse GL_EYE_PLANE */ -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F -#endif - -#ifndef GL_NV_blend_square -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B -#endif - -#ifndef GL_MESA_resize_buffers -#endif - -#ifndef GL_MESA_window_pos -#endif - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_CULL_VERTEX_IBM 103050 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 -#endif - -#ifndef GL_SGIX_subsample -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 -#endif - -#ifndef GL_SGI_depth_pass_instrument -#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 -#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 -#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 -#endif - -#ifndef GL_3DFX_tbuffer -#endif - -#ifndef GL_EXT_multisample -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 -#endif - -#ifndef GL_SGIX_vertex_preclip -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_CONVOLUTION_HINT_SGIX 0x8316 -#endif - -#ifndef GL_SGIX_resample -#define GL_PACK_RESAMPLE_SGIX 0x842C -#define GL_UNPACK_RESAMPLE_SGIX 0x842D -#define GL_RESAMPLE_REPLICATE_SGIX 0x842E -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF -#endif - -#ifndef GL_EXT_texture_env_dot3 -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 -#endif - -#ifndef GL_ATI_texture_mirror_once -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 -#endif - -#ifndef GL_NV_fence -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 -#endif - -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_MIRRORED_REPEAT_IBM 0x8370 -#endif - -#ifndef GL_NV_evaluators -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 -#endif - -#ifndef GL_NV_packed_depth_stencil -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA -#endif - -#ifndef GL_NV_register_combiners2 -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 -#endif - -#ifndef GL_NV_texture_compression_vtc -#endif - -#ifndef GL_NV_texture_rectangle -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 -#endif - -#ifndef GL_NV_texture_shader -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV -#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV -#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F -#endif - -#ifndef GL_NV_texture_shader2 -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#endif - -#ifndef GL_NV_vertex_array_range2 -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 -#endif - -#ifndef GL_NV_vertex_program -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F -#endif - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 -#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A -#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B -#endif - -#ifndef GL_SGIX_scalebias_hint -#define GL_SCALEBIAS_HINT_SGIX 0x8322 -#endif - -#ifndef GL_OML_interlace -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 -#endif - -#ifndef GL_OML_subsample -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 -#endif - -#ifndef GL_OML_resample -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 -#endif - -#ifndef GL_NV_copy_depth_to_color -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F -#endif - -#ifndef GL_ATI_envmap_bumpmap -#define GL_BUMP_ROT_MATRIX_ATI 0x8775 -#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 -#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 -#define GL_BUMP_TEX_UNITS_ATI 0x8778 -#define GL_DUDV_ATI 0x8779 -#define GL_DU8DV8_ATI 0x877A -#define GL_BUMP_ENVMAP_ATI 0x877B -#define GL_BUMP_TARGET_ATI 0x877C -#endif - -#ifndef GL_ATI_fragment_shader -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_REG_6_ATI 0x8927 -#define GL_REG_7_ATI 0x8928 -#define GL_REG_8_ATI 0x8929 -#define GL_REG_9_ATI 0x892A -#define GL_REG_10_ATI 0x892B -#define GL_REG_11_ATI 0x892C -#define GL_REG_12_ATI 0x892D -#define GL_REG_13_ATI 0x892E -#define GL_REG_14_ATI 0x892F -#define GL_REG_15_ATI 0x8930 -#define GL_REG_16_ATI 0x8931 -#define GL_REG_17_ATI 0x8932 -#define GL_REG_18_ATI 0x8933 -#define GL_REG_19_ATI 0x8934 -#define GL_REG_20_ATI 0x8935 -#define GL_REG_21_ATI 0x8936 -#define GL_REG_22_ATI 0x8937 -#define GL_REG_23_ATI 0x8938 -#define GL_REG_24_ATI 0x8939 -#define GL_REG_25_ATI 0x893A -#define GL_REG_26_ATI 0x893B -#define GL_REG_27_ATI 0x893C -#define GL_REG_28_ATI 0x893D -#define GL_REG_29_ATI 0x893E -#define GL_REG_30_ATI 0x893F -#define GL_REG_31_ATI 0x8940 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_CON_8_ATI 0x8949 -#define GL_CON_9_ATI 0x894A -#define GL_CON_10_ATI 0x894B -#define GL_CON_11_ATI 0x894C -#define GL_CON_12_ATI 0x894D -#define GL_CON_13_ATI 0x894E -#define GL_CON_14_ATI 0x894F -#define GL_CON_15_ATI 0x8950 -#define GL_CON_16_ATI 0x8951 -#define GL_CON_17_ATI 0x8952 -#define GL_CON_18_ATI 0x8953 -#define GL_CON_19_ATI 0x8954 -#define GL_CON_20_ATI 0x8955 -#define GL_CON_21_ATI 0x8956 -#define GL_CON_22_ATI 0x8957 -#define GL_CON_23_ATI 0x8958 -#define GL_CON_24_ATI 0x8959 -#define GL_CON_25_ATI 0x895A -#define GL_CON_26_ATI 0x895B -#define GL_CON_27_ATI 0x895C -#define GL_CON_28_ATI 0x895D -#define GL_CON_29_ATI 0x895E -#define GL_CON_30_ATI 0x895F -#define GL_CON_31_ATI 0x8960 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E -#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F -#define GL_NUM_PASSES_ATI 0x8970 -#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 -#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 -#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 -#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 -#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_SWIZZLE_STRQ_ATI 0x897A -#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B -#define GL_RED_BIT_ATI 0x00000001 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_2X_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -#endif - -#ifndef GL_ATI_pn_triangles -#define GL_PN_TRIANGLES_ATI 0x87F0 -#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 -#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 -#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 -#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 -#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 -#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 -#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 -#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 -#endif - -#ifndef GL_ATI_vertex_array_object -#define GL_STATIC_ATI 0x8760 -#define GL_DYNAMIC_ATI 0x8761 -#define GL_PRESERVE_ATI 0x8762 -#define GL_DISCARD_ATI 0x8763 -#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 -#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 -#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 -#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 -#endif - -#ifndef GL_EXT_vertex_shader -#define GL_VERTEX_SHADER_EXT 0x8780 -#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 -#define GL_OP_INDEX_EXT 0x8782 -#define GL_OP_NEGATE_EXT 0x8783 -#define GL_OP_DOT3_EXT 0x8784 -#define GL_OP_DOT4_EXT 0x8785 -#define GL_OP_MUL_EXT 0x8786 -#define GL_OP_ADD_EXT 0x8787 -#define GL_OP_MADD_EXT 0x8788 -#define GL_OP_FRAC_EXT 0x8789 -#define GL_OP_MAX_EXT 0x878A -#define GL_OP_MIN_EXT 0x878B -#define GL_OP_SET_GE_EXT 0x878C -#define GL_OP_SET_LT_EXT 0x878D -#define GL_OP_CLAMP_EXT 0x878E -#define GL_OP_FLOOR_EXT 0x878F -#define GL_OP_ROUND_EXT 0x8790 -#define GL_OP_EXP_BASE_2_EXT 0x8791 -#define GL_OP_LOG_BASE_2_EXT 0x8792 -#define GL_OP_POWER_EXT 0x8793 -#define GL_OP_RECIP_EXT 0x8794 -#define GL_OP_RECIP_SQRT_EXT 0x8795 -#define GL_OP_SUB_EXT 0x8796 -#define GL_OP_CROSS_PRODUCT_EXT 0x8797 -#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 -#define GL_OP_MOV_EXT 0x8799 -#define GL_OUTPUT_VERTEX_EXT 0x879A -#define GL_OUTPUT_COLOR0_EXT 0x879B -#define GL_OUTPUT_COLOR1_EXT 0x879C -#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D -#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E -#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F -#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 -#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 -#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 -#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 -#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 -#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 -#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 -#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 -#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 -#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 -#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA -#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB -#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC -#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD -#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE -#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF -#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 -#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 -#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 -#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 -#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 -#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 -#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 -#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 -#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 -#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 -#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA -#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB -#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC -#define GL_OUTPUT_FOG_EXT 0x87BD -#define GL_SCALAR_EXT 0x87BE -#define GL_VECTOR_EXT 0x87BF -#define GL_MATRIX_EXT 0x87C0 -#define GL_VARIANT_EXT 0x87C1 -#define GL_INVARIANT_EXT 0x87C2 -#define GL_LOCAL_CONSTANT_EXT 0x87C3 -#define GL_LOCAL_EXT 0x87C4 -#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 -#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 -#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 -#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 -#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE -#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF -#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 -#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 -#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 -#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 -#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 -#define GL_X_EXT 0x87D5 -#define GL_Y_EXT 0x87D6 -#define GL_Z_EXT 0x87D7 -#define GL_W_EXT 0x87D8 -#define GL_NEGATIVE_X_EXT 0x87D9 -#define GL_NEGATIVE_Y_EXT 0x87DA -#define GL_NEGATIVE_Z_EXT 0x87DB -#define GL_NEGATIVE_W_EXT 0x87DC -#define GL_ZERO_EXT 0x87DD -#define GL_ONE_EXT 0x87DE -#define GL_NEGATIVE_ONE_EXT 0x87DF -#define GL_NORMALIZED_RANGE_EXT 0x87E0 -#define GL_FULL_RANGE_EXT 0x87E1 -#define GL_CURRENT_VERTEX_EXT 0x87E2 -#define GL_MVP_MATRIX_EXT 0x87E3 -#define GL_VARIANT_VALUE_EXT 0x87E4 -#define GL_VARIANT_DATATYPE_EXT 0x87E5 -#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 -#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 -#define GL_VARIANT_ARRAY_EXT 0x87E8 -#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 -#define GL_INVARIANT_VALUE_EXT 0x87EA -#define GL_INVARIANT_DATATYPE_EXT 0x87EB -#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC -#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED -#endif - -#ifndef GL_ATI_vertex_streams -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_STREAM0_ATI 0x876C -#define GL_VERTEX_STREAM1_ATI 0x876D -#define GL_VERTEX_STREAM2_ATI 0x876E -#define GL_VERTEX_STREAM3_ATI 0x876F -#define GL_VERTEX_STREAM4_ATI 0x8770 -#define GL_VERTEX_STREAM5_ATI 0x8771 -#define GL_VERTEX_STREAM6_ATI 0x8772 -#define GL_VERTEX_STREAM7_ATI 0x8773 -#define GL_VERTEX_SOURCE_ATI 0x8774 -#endif - -#ifndef GL_ATI_element_array -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A -#endif - -#ifndef GL_SUN_mesh_array -#define GL_QUAD_MESH_SUN 0x8614 -#define GL_TRIANGLE_MESH_SUN 0x8615 -#endif - -#ifndef GL_SUN_slice_accum -#define GL_SLICE_ACCUM_SUN 0x85CC -#endif - -#ifndef GL_NV_multisample_filter_hint -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 -#endif - -#ifndef GL_NV_depth_clamp -#define GL_DEPTH_CLAMP_NV 0x864F -#endif - -#ifndef GL_NV_occlusion_query -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 -#endif - -#ifndef GL_NV_point_sprite -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 -#endif - -#ifndef GL_NV_texture_shader3 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 -#endif - -#ifndef GL_NV_vertex_program1_1 -#endif - -#ifndef GL_EXT_shadow_funcs -#endif - -#ifndef GL_EXT_stencil_two_side -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 -#endif - -#ifndef GL_ATI_text_fragment_shader -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 -#endif - -#ifndef GL_APPLE_client_storage -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 -#endif - -#ifndef GL_APPLE_element_array -#define GL_ELEMENT_ARRAY_APPLE 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A -#endif - -#ifndef GL_APPLE_fence -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B -#endif - -#ifndef GL_APPLE_vertex_array_object -#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 -#endif - -#ifndef GL_APPLE_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E -#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F -#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF -#endif - -#ifndef GL_APPLE_ycbcr_422 -#define GL_YCBCR_422_APPLE 0x85B9 -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#endif - -#ifndef GL_S3_s3tc -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#endif - -#ifndef GL_ATI_draw_buffers -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 -#endif - -#ifndef GL_ATI_pixel_format_float -#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 -#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 -#endif - -#ifndef GL_ATI_texture_env_combine3 -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 -#endif - -#ifndef GL_ATI_texture_float -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F -#endif - -#ifndef GL_NV_float_buffer -#define GL_FLOAT_R_NV 0x8880 -#define GL_FLOAT_RG_NV 0x8881 -#define GL_FLOAT_RGB_NV 0x8882 -#define GL_FLOAT_RGBA_NV 0x8883 -#define GL_FLOAT_R16_NV 0x8884 -#define GL_FLOAT_R32_NV 0x8885 -#define GL_FLOAT_RG16_NV 0x8886 -#define GL_FLOAT_RG32_NV 0x8887 -#define GL_FLOAT_RGB16_NV 0x8888 -#define GL_FLOAT_RGB32_NV 0x8889 -#define GL_FLOAT_RGBA16_NV 0x888A -#define GL_FLOAT_RGBA32_NV 0x888B -#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C -#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D -#define GL_FLOAT_RGBA_MODE_NV 0x888E -#endif - -#ifndef GL_NV_fragment_program -#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 -#define GL_FRAGMENT_PROGRAM_NV 0x8870 -#define GL_MAX_TEXTURE_COORDS_NV 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 -#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 -#define GL_PROGRAM_ERROR_STRING_NV 0x8874 -#endif - -#ifndef GL_NV_half_float -#define GL_HALF_FLOAT_NV 0x140B -#endif - -#ifndef GL_NV_pixel_data_range -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D -#endif - -#ifndef GL_NV_primitive_restart -#define GL_PRIMITIVE_RESTART_NV 0x8558 -#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 -#endif - -#ifndef GL_NV_texture_expand_normal -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F -#endif - -#ifndef GL_NV_vertex_program2 -#endif - -#ifndef GL_ATI_map_object_buffer -#endif - -#ifndef GL_ATI_separate_stencil -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 -#endif - -#ifndef GL_ATI_vertex_attrib_array_object -#endif - -#ifndef GL_OES_read_format -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B -#endif - -#ifndef GL_EXT_depth_bounds_test -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 -#endif - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 -#endif - -#ifndef GL_EXT_blend_equation_separate -#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D -#endif - -#ifndef GL_MESA_pack_invert -#define GL_PACK_INVERT_MESA 0x8758 -#endif - -#ifndef GL_MESA_ycbcr_texture -#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB -#define GL_YCBCR_MESA 0x8757 -#endif - -#ifndef GL_EXT_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF -#endif - -#ifndef GL_NV_fragment_program_option -#endif - -#ifndef GL_NV_fragment_program2 -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 -#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 -#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 -#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 -#endif - -#ifndef GL_NV_vertex_program2_option -/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ -/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ -#endif - -#ifndef GL_NV_vertex_program3 -/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ -#endif - -#ifndef GL_EXT_framebuffer_object -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 -#endif - -#ifndef GL_GREMEDY_string_marker -#endif - - -/*************************************************************/ - -#include -#ifndef GL_VERSION_2_0 -/* GL type for program/shader text */ -typedef char GLchar; /* native character */ -#endif - -#ifndef GL_VERSION_1_5 -/* GL types for handling large vertex buffer objects */ -typedef ptrdiff_t GLintptr; -typedef ptrdiff_t GLsizeiptr; -#endif - -#ifndef GL_ARB_vertex_buffer_object -/* GL types for handling large vertex buffer objects */ -typedef ptrdiff_t GLintptrARB; -typedef ptrdiff_t GLsizeiptrARB; -#endif - -#ifndef GL_ARB_shader_objects -/* GL types for handling shader object handles and program/shader text */ -typedef char GLcharARB; /* native character */ -typedef unsigned int GLhandleARB; /* shader object handle */ -#endif - -/* GL types for "half" precision (s10e5) float data in host memory */ -#ifndef GL_ARB_half_float_pixel -typedef unsigned short GLhalfARB; -#endif - -#ifndef GL_NV_half_float -typedef unsigned short GLhalfNV; -#endif - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); -GLAPI void APIENTRY glBlendEquation (GLenum); -GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -GLAPI void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); -GLAPI void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); -GLAPI void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -GLAPI void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -GLAPI void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); -GLAPI void APIENTRY glMinmax (GLenum, GLenum, GLboolean); -GLAPI void APIENTRY glResetHistogram (GLenum); -GLAPI void APIENTRY glResetMinmax (GLenum); -GLAPI void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); -typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTexture (GLenum); -GLAPI void APIENTRY glClientActiveTexture (GLenum); -GLAPI void APIENTRY glMultiTexCoord1d (GLenum, GLdouble); -GLAPI void APIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord1f (GLenum, GLfloat); -GLAPI void APIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord1i (GLenum, GLint); -GLAPI void APIENTRY glMultiTexCoord1iv (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord1s (GLenum, GLshort); -GLAPI void APIENTRY glMultiTexCoord1sv (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord2i (GLenum, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord2iv (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord2sv (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord3iv (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord3sv (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord4iv (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord4sv (GLenum, const GLshort *); -GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *); -GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *); -GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *); -GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *); -GLAPI void APIENTRY glSampleCoverage (GLclampf, GLboolean); -GLAPI void APIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glGetCompressedTexImage (GLenum, GLint, GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); -#endif - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glFogCoordf (GLfloat); -GLAPI void APIENTRY glFogCoordfv (const GLfloat *); -GLAPI void APIENTRY glFogCoordd (GLdouble); -GLAPI void APIENTRY glFogCoorddv (const GLdouble *); -GLAPI void APIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei); -GLAPI void APIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); -GLAPI void APIENTRY glPointParameterf (GLenum, GLfloat); -GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *); -GLAPI void APIENTRY glPointParameteri (GLenum, GLint); -GLAPI void APIENTRY glPointParameteriv (GLenum, const GLint *); -GLAPI void APIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *); -GLAPI void APIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *); -GLAPI void APIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *); -GLAPI void APIENTRY glSecondaryColor3i (GLint, GLint, GLint); -GLAPI void APIENTRY glSecondaryColor3iv (const GLint *); -GLAPI void APIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *); -GLAPI void APIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *); -GLAPI void APIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint); -GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *); -GLAPI void APIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort); -GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *); -GLAPI void APIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glWindowPos2d (GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos2dv (const GLdouble *); -GLAPI void APIENTRY glWindowPos2f (GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos2fv (const GLfloat *); -GLAPI void APIENTRY glWindowPos2i (GLint, GLint); -GLAPI void APIENTRY glWindowPos2iv (const GLint *); -GLAPI void APIENTRY glWindowPos2s (GLshort, GLshort); -GLAPI void APIENTRY glWindowPos2sv (const GLshort *); -GLAPI void APIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos3dv (const GLdouble *); -GLAPI void APIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos3fv (const GLfloat *); -GLAPI void APIENTRY glWindowPos3i (GLint, GLint, GLint); -GLAPI void APIENTRY glWindowPos3iv (const GLint *); -GLAPI void APIENTRY glWindowPos3s (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glWindowPos3sv (const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); -#endif - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueries (GLsizei, GLuint *); -GLAPI void APIENTRY glDeleteQueries (GLsizei, const GLuint *); -GLAPI GLboolean APIENTRY glIsQuery (GLuint); -GLAPI void APIENTRY glBeginQuery (GLenum, GLuint); -GLAPI void APIENTRY glEndQuery (GLenum); -GLAPI void APIENTRY glGetQueryiv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetQueryObjectiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetQueryObjectuiv (GLuint, GLenum, GLuint *); -GLAPI void APIENTRY glBindBuffer (GLenum, GLuint); -GLAPI void APIENTRY glDeleteBuffers (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenBuffers (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsBuffer (GLuint); -GLAPI void APIENTRY glBufferData (GLenum, GLsizeiptr, const GLvoid *, GLenum); -GLAPI void APIENTRY glBufferSubData (GLenum, GLintptr, GLsizeiptr, const GLvoid *); -GLAPI void APIENTRY glGetBufferSubData (GLenum, GLintptr, GLsizeiptr, GLvoid *); -GLAPI GLvoid* APIENTRY glMapBuffer (GLenum, GLenum); -GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum); -GLAPI void APIENTRY glGetBufferParameteriv (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetBufferPointerv (GLenum, GLenum, GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparate (GLenum, GLenum); -GLAPI void APIENTRY glDrawBuffers (GLsizei, const GLenum *); -GLAPI void APIENTRY glStencilOpSeparate (GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glStencilFuncSeparate (GLenum, GLenum, GLint, GLuint); -GLAPI void APIENTRY glStencilMaskSeparate (GLenum, GLuint); -GLAPI void APIENTRY glAttachShader (GLuint, GLuint); -GLAPI void APIENTRY glBindAttribLocation (GLuint, GLuint, const GLchar *); -GLAPI void APIENTRY glCompileShader (GLuint); -GLAPI GLuint APIENTRY glCreateProgram (void); -GLAPI GLuint APIENTRY glCreateShader (GLenum); -GLAPI void APIENTRY glDeleteProgram (GLuint); -GLAPI void APIENTRY glDeleteShader (GLuint); -GLAPI void APIENTRY glDetachShader (GLuint, GLuint); -GLAPI void APIENTRY glDisableVertexAttribArray (GLuint); -GLAPI void APIENTRY glEnableVertexAttribArray (GLuint); -GLAPI void APIENTRY glGetActiveAttrib (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); -GLAPI void APIENTRY glGetActiveUniform (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); -GLAPI void APIENTRY glGetAttachedShaders (GLuint, GLsizei, GLsizei *, GLuint *); -GLAPI GLint APIENTRY glGetAttribLocation (GLuint, const GLchar *); -GLAPI void APIENTRY glGetProgramiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetProgramInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); -GLAPI void APIENTRY glGetShaderiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetShaderInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); -GLAPI void APIENTRY glGetShaderSource (GLuint, GLsizei, GLsizei *, GLchar *); -GLAPI GLint APIENTRY glGetUniformLocation (GLuint, const GLchar *); -GLAPI void APIENTRY glGetUniformfv (GLuint, GLint, GLfloat *); -GLAPI void APIENTRY glGetUniformiv (GLuint, GLint, GLint *); -GLAPI void APIENTRY glGetVertexAttribdv (GLuint, GLenum, GLdouble *); -GLAPI void APIENTRY glGetVertexAttribfv (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVertexAttribiv (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint, GLenum, GLvoid* *); -GLAPI GLboolean APIENTRY glIsProgram (GLuint); -GLAPI GLboolean APIENTRY glIsShader (GLuint); -GLAPI void APIENTRY glLinkProgram (GLuint); -GLAPI void APIENTRY glShaderSource (GLuint, GLsizei, const GLchar* *, const GLint *); -GLAPI void APIENTRY glUseProgram (GLuint); -GLAPI void APIENTRY glUniform1f (GLint, GLfloat); -GLAPI void APIENTRY glUniform2f (GLint, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform3f (GLint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform4f (GLint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform1i (GLint, GLint); -GLAPI void APIENTRY glUniform2i (GLint, GLint, GLint); -GLAPI void APIENTRY glUniform3i (GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glUniform4i (GLint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glUniform1fv (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform2fv (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform3fv (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform4fv (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform1iv (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform2iv (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform3iv (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform4iv (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniformMatrix2fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix3fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix4fv (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glValidateProgram (GLuint); -GLAPI void APIENTRY glVertexAttrib1d (GLuint, GLdouble); -GLAPI void APIENTRY glVertexAttrib1dv (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib1f (GLuint, GLfloat); -GLAPI void APIENTRY glVertexAttrib1fv (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib1s (GLuint, GLshort); -GLAPI void APIENTRY glVertexAttrib1sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib2d (GLuint, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib2dv (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib2f (GLuint, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib2fv (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib2s (GLuint, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib2sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib3d (GLuint, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib3dv (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib3f (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib3fv (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib3s (GLuint, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib3sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttrib4Niv (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4Nub (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttrib4bv (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttrib4d (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib4dv (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib4f (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib4fv (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib4iv (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttrib4s (GLuint, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib4sv (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4ubv (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttrib4uiv (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttrib4usv (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttribPointer (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); -typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTextureARB (GLenum); -GLAPI void APIENTRY glClientActiveTextureARB (GLenum); -GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); -GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); -GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); -GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); -GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); -GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); -GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); -GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); -GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); -GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); -GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); -GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -#endif - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); -#endif - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 -#endif - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); -#endif - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 -#endif - -#ifndef GL_ARB_point_parameters -#define GL_ARB_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfARB (GLenum, GLfloat); -GLAPI void APIENTRY glPointParameterfvARB (GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_ARB_vertex_blend -#define GL_ARB_vertex_blend 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWeightbvARB (GLint, const GLbyte *); -GLAPI void APIENTRY glWeightsvARB (GLint, const GLshort *); -GLAPI void APIENTRY glWeightivARB (GLint, const GLint *); -GLAPI void APIENTRY glWeightfvARB (GLint, const GLfloat *); -GLAPI void APIENTRY glWeightdvARB (GLint, const GLdouble *); -GLAPI void APIENTRY glWeightubvARB (GLint, const GLubyte *); -GLAPI void APIENTRY glWeightusvARB (GLint, const GLushort *); -GLAPI void APIENTRY glWeightuivARB (GLint, const GLuint *); -GLAPI void APIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glVertexBlendARB (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); -typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); -typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); -typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); -typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); -typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); -typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); -typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); -typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); -#endif - -#ifndef GL_ARB_matrix_palette -#define GL_ARB_matrix_palette 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint); -GLAPI void APIENTRY glMatrixIndexubvARB (GLint, const GLubyte *); -GLAPI void APIENTRY glMatrixIndexusvARB (GLint, const GLushort *); -GLAPI void APIENTRY glMatrixIndexuivARB (GLint, const GLuint *); -GLAPI void APIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); -typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_ARB_texture_env_combine -#define GL_ARB_texture_env_combine 1 -#endif - -#ifndef GL_ARB_texture_env_crossbar -#define GL_ARB_texture_env_crossbar 1 -#endif - -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 -#endif - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 -#endif - -#ifndef GL_ARB_depth_texture -#define GL_ARB_depth_texture 1 -#endif - -#ifndef GL_ARB_shadow -#define GL_ARB_shadow 1 -#endif - -#ifndef GL_ARB_shadow_ambient -#define GL_ARB_shadow_ambient 1 -#endif - -#ifndef GL_ARB_window_pos -#define GL_ARB_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dARB (GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *); -GLAPI void APIENTRY glWindowPos2fARB (GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *); -GLAPI void APIENTRY glWindowPos2iARB (GLint, GLint); -GLAPI void APIENTRY glWindowPos2ivARB (const GLint *); -GLAPI void APIENTRY glWindowPos2sARB (GLshort, GLshort); -GLAPI void APIENTRY glWindowPos2svARB (const GLshort *); -GLAPI void APIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *); -GLAPI void APIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *); -GLAPI void APIENTRY glWindowPos3iARB (GLint, GLint, GLint); -GLAPI void APIENTRY glWindowPos3ivARB (const GLint *); -GLAPI void APIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glWindowPos3svARB (const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); -#endif - -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttrib1dARB (GLuint, GLdouble); -GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib1fARB (GLuint, GLfloat); -GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib1sARB (GLuint, GLshort); -GLAPI void APIENTRY glVertexAttrib1svARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib2svARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib3svARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *); -GLAPI void APIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint, const GLint *); -GLAPI void APIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib4svARB (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *); -GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *); -GLAPI void APIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); -GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint); -GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint); -GLAPI void APIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glBindProgramARB (GLenum, GLuint); -GLAPI void APIENTRY glDeleteProgramsARB (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenProgramsARB (GLsizei, GLuint *); -GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *); -GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *); -GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *); -GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *); -GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *); -GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *); -GLAPI void APIENTRY glGetProgramivARB (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *); -GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *); -GLAPI GLboolean APIENTRY glIsProgramARB (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); -typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); -#endif - -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 -/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ -#endif - -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindBufferARB (GLenum, GLuint); -GLAPI void APIENTRY glDeleteBuffersARB (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenBuffersARB (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsBufferARB (GLuint); -GLAPI void APIENTRY glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); -GLAPI void APIENTRY glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); -GLAPI void APIENTRY glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); -GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum, GLenum); -GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum); -GLAPI void APIENTRY glGetBufferParameterivARB (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueriesARB (GLsizei, GLuint *); -GLAPI void APIENTRY glDeleteQueriesARB (GLsizei, const GLuint *); -GLAPI GLboolean APIENTRY glIsQueryARB (GLuint); -GLAPI void APIENTRY glBeginQueryARB (GLenum, GLuint); -GLAPI void APIENTRY glEndQueryARB (GLenum); -GLAPI void APIENTRY glGetQueryivARB (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetQueryObjectivARB (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint, GLenum, GLuint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB); -GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum); -GLAPI void APIENTRY glDetachObjectARB (GLhandleARB, GLhandleARB); -GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum); -GLAPI void APIENTRY glShaderSourceARB (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); -GLAPI void APIENTRY glCompileShaderARB (GLhandleARB); -GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); -GLAPI void APIENTRY glAttachObjectARB (GLhandleARB, GLhandleARB); -GLAPI void APIENTRY glLinkProgramARB (GLhandleARB); -GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB); -GLAPI void APIENTRY glValidateProgramARB (GLhandleARB); -GLAPI void APIENTRY glUniform1fARB (GLint, GLfloat); -GLAPI void APIENTRY glUniform2fARB (GLint, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform3fARB (GLint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform4fARB (GLint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glUniform1iARB (GLint, GLint); -GLAPI void APIENTRY glUniform2iARB (GLint, GLint, GLint); -GLAPI void APIENTRY glUniform3iARB (GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glUniform4iARB (GLint, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glUniform1fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform2fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform3fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform4fvARB (GLint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glUniform1ivARB (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform2ivARB (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform3ivARB (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniform4ivARB (GLint, GLsizei, const GLint *); -GLAPI void APIENTRY glUniformMatrix2fvARB (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix3fvARB (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glUniformMatrix4fvARB (GLint, GLsizei, GLboolean, const GLfloat *); -GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB, GLenum, GLfloat *); -GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB, GLenum, GLint *); -GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); -GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); -GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB, const GLcharARB *); -GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); -GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB, GLint, GLfloat *); -GLAPI void APIENTRY glGetUniformivARB (GLhandleARB, GLint, GLint *); -GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); -typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); -typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); -#endif - -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB, GLuint, const GLcharARB *); -GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); -GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB, const GLcharARB *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -#endif - -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 -#endif - -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 -#endif - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 -#endif - -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 -#endif - -#ifndef GL_ARB_fragment_program_shadow -#define GL_ARB_fragment_program_shadow 1 -#endif - -#ifndef GL_ARB_draw_buffers -#define GL_ARB_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersARB (GLsizei, const GLenum *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); -#endif - -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle 1 -#endif - -#ifndef GL_ARB_color_buffer_float -#define GL_ARB_color_buffer_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClampColorARB (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); -#endif - -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel 1 -#endif - -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 -#endif - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 -#endif - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 -#endif - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); -#endif - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 -#endif - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); -typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#endif - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); -GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); -GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); -GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); -GLAPI void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); -GLAPI void APIENTRY glResetHistogramEXT (GLenum); -GLAPI void APIENTRY glResetMinmaxEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); -#endif - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); -GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); -GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -#endif - -#ifndef GL_EXT_color_matrix -#define GL_EXT_color_matrix 1 -#endif - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); -GLAPI void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenSGIX (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); -#endif - -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); -GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); -GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); -GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); -GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); -GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 -#endif - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 -#endif - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); -GLAPI void APIENTRY glBindTextureEXT (GLenum, GLuint); -GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint); -GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); -typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); -typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); -GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 -#endif - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); -GLAPI void APIENTRY glSamplePatternSGIS (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 -#endif - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glArrayElementEXT (GLint); -GLAPI void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); -GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); -GLAPI void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); -GLAPI void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -GLAPI void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); -typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); -typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 -#endif - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 -#endif - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 -#endif - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 -#endif - -#ifndef GL_SGIX_texture_select -#define GL_SGIX_texture_select 1 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); -GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); -GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); -GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 -#endif - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfEXT (GLenum, GLfloat); -GLAPI void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_SGIS_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); -GLAPI void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_SGIX_instruments -#define GL_SGIX_instruments 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); -GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); -GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *); -GLAPI void APIENTRY glReadInstrumentsSGIX (GLint); -GLAPI void APIENTRY glStartInstrumentsSGIX (void); -GLAPI void APIENTRY glStopInstrumentsSGIX (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); -typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); -typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); -typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 -#endif - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFrameZoomSGIX (GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTagSampleBufferSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_SGIX_polynomial_ffd 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); -GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); -GLAPI void APIENTRY glDeformSGIX (GLbitfield); -GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); -#endif - -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushRasterSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); -GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 -#endif - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); -GLAPI void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 -#endif - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glHintPGI (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); -GLAPI void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); -GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); -GLAPI void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); -GLAPI void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); -GLAPI void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_SGIX_calligraphic_fragment 1 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 -#endif - -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 -#endif - -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexMaterialEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexFuncEXT (GLenum, GLclampf); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLockArraysEXT (GLint, GLsizei); -GLAPI void APIENTRY glUnlockArraysEXT (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); -GLAPI void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_SGIX_fragment_lighting 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); -GLAPI void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); -GLAPI void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); -GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); -GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); -GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); -GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); -GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glLightEnviSGIX (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -#endif - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 -#endif - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 -#endif - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glApplyTextureEXT (GLenum); -GLAPI void APIENTRY glTextureLightEXT (GLenum); -GLAPI void APIENTRY glTextureMaterialEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 -#endif - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 -#endif - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint); -GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *); -GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *); -GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei); -GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); -GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); -typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); -typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); -GLAPI void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); -GLAPI void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); -GLAPI void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -#endif - -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); -GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); -GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 -#endif - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); -GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); -GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); -GLAPI void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); -GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *); -GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *); -GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); -GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); -GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *); -GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); -GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *); -GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureNormalEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); -GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -#endif - -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogCoordfEXT (GLfloat); -GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *); -GLAPI void APIENTRY glFogCoorddEXT (GLdouble); -GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *); -GLAPI void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *); -GLAPI void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *); -GLAPI void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *); -GLAPI void APIENTRY glTangent3iEXT (GLint, GLint, GLint); -GLAPI void APIENTRY glTangent3ivEXT (const GLint *); -GLAPI void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glTangent3svEXT (const GLshort *); -GLAPI void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *); -GLAPI void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *); -GLAPI void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *); -GLAPI void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); -GLAPI void APIENTRY glBinormal3ivEXT (const GLint *); -GLAPI void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glBinormal3svEXT (const GLshort *); -GLAPI void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); -typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); -typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); -typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); -typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); -typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); -typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); -typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); -typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); -typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); -typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_SGIX_fog_scale 1 -#endif - -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFinishTextureSUNX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); -#endif - -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); -GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort); -GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint); -GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); -GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble); -GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); -GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort); -GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -#endif - -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint); -GLAPI void APIENTRY glReplacementCodeusSUN (GLushort); -GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte); -GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *); -GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *); -GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *); -GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); -#endif - -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); -GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_blend_func_separate -#define GL_INGR_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 -#endif - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexWeightfEXT (GLfloat); -GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *); -GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); -GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); -#endif - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); -GLAPI void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); -GLAPI void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); -GLAPI void APIENTRY glCombinerParameteriNV (GLenum, GLint); -GLAPI void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); -GLAPI void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); -#endif - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 -#endif - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 -#endif - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glResizeBuffersMESA (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); -#endif - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *); -GLAPI void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *); -GLAPI void APIENTRY glWindowPos2iMESA (GLint, GLint); -GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *); -GLAPI void APIENTRY glWindowPos2sMESA (GLshort, GLshort); -GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *); -GLAPI void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *); -GLAPI void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *); -GLAPI void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); -GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *); -GLAPI void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); -GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *); -GLAPI void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *); -GLAPI void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *); -GLAPI void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *); -GLAPI void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint); -GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* const *, GLsizei, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); -GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -GLAPI void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -#endif - -#ifndef GL_SGIX_subsample -#define GL_SGIX_subsample 1 -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#define GL_SGIX_ycrcb_subsample 1 -#endif - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 -#endif - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTbufferMask3DFX (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); -#endif - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); -GLAPI void APIENTRY glSamplePatternEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); -#endif - -#ifndef GL_SGIX_vertex_preclip -#define GL_SGIX_vertex_preclip 1 -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 -#endif - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_SGIS_texture_color_mask 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#endif - -#ifndef GL_SGIX_igloo_interface -#define GL_SGIX_igloo_interface 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); -#endif - -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 -#endif - -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 -#endif - -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenFencesNV (GLsizei, GLuint *); -GLAPI GLboolean APIENTRY glIsFenceNV (GLuint); -GLAPI GLboolean APIENTRY glTestFenceNV (GLuint); -GLAPI void APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glFinishFenceNV (GLuint); -GLAPI void APIENTRY glSetFenceNV (GLuint, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); -typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); -typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -#endif - -#ifndef GL_NV_evaluators -#define GL_NV_evaluators 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *); -GLAPI void APIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *); -GLAPI void APIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *); -GLAPI void APIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glEvalMapsNV (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); -typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); -typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); -#endif - -#ifndef GL_NV_packed_depth_stencil -#define GL_NV_packed_depth_stencil 1 -#endif - -#ifndef GL_NV_register_combiners2 -#define GL_NV_register_combiners2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *); -GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_NV_texture_compression_vtc -#define GL_NV_texture_compression_vtc 1 -#endif - -#ifndef GL_NV_texture_rectangle -#define GL_NV_texture_rectangle 1 -#endif - -#ifndef GL_NV_texture_shader -#define GL_NV_texture_shader 1 -#endif - -#ifndef GL_NV_texture_shader2 -#define GL_NV_texture_shader2 1 -#endif - -#ifndef GL_NV_vertex_array_range2 -#define GL_NV_vertex_array_range2 1 -#endif - -#ifndef GL_NV_vertex_program -#define GL_NV_vertex_program 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *); -GLAPI void APIENTRY glBindProgramNV (GLenum, GLuint); -GLAPI void APIENTRY glDeleteProgramsNV (GLsizei, const GLuint *); -GLAPI void APIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glGenProgramsNV (GLsizei, GLuint *); -GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *); -GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetProgramivNV (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *); -GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *); -GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *); -GLAPI GLboolean APIENTRY glIsProgramNV (GLuint); -GLAPI void APIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *); -GLAPI void APIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *); -GLAPI void APIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *); -GLAPI void APIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *); -GLAPI void APIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *); -GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *); -GLAPI void APIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum); -GLAPI void APIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *); -GLAPI void APIENTRY glVertexAttrib1dNV (GLuint, GLdouble); -GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib1fNV (GLuint, GLfloat); -GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib1sNV (GLuint, GLshort); -GLAPI void APIENTRY glVertexAttrib1svNV (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib2svNV (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib3svNV (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *); -GLAPI void APIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *); -GLAPI void APIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexAttrib4svNV (GLuint, const GLshort *); -GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *); -GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *); -GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *); -GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *); -GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *); -GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *); -GLAPI void APIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *); -GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); -typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); -typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); -typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); -typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); -#endif - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_SGIX_texture_coordinate_clamp 1 -#endif - -#ifndef GL_SGIX_scalebias_hint -#define GL_SGIX_scalebias_hint 1 -#endif - -#ifndef GL_OML_interlace -#define GL_OML_interlace 1 -#endif - -#ifndef GL_OML_subsample -#define GL_OML_subsample 1 -#endif - -#ifndef GL_OML_resample -#define GL_OML_resample 1 -#endif - -#ifndef GL_NV_copy_depth_to_color -#define GL_NV_copy_depth_to_color 1 -#endif - -#ifndef GL_ATI_envmap_bumpmap -#define GL_ATI_envmap_bumpmap 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBumpParameterivATI (GLenum, const GLint *); -GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum, GLint *); -GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -#endif - -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint); -GLAPI void APIENTRY glBindFragmentShaderATI (GLuint); -GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint); -GLAPI void APIENTRY glBeginFragmentShaderATI (void); -GLAPI void APIENTRY glEndFragmentShaderATI (void); -GLAPI void APIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum); -GLAPI void APIENTRY glSampleMapATI (GLuint, GLuint, GLenum); -GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); -typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); -typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); -typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); -typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); -#endif - -#ifndef GL_ATI_pn_triangles -#define GL_ATI_pn_triangles 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPNTrianglesiATI (GLenum, GLint); -GLAPI void APIENTRY glPNTrianglesfATI (GLenum, GLfloat); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); -#endif - -#ifndef GL_ATI_vertex_array_object -#define GL_ATI_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum); -GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint); -GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); -GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glFreeObjectBufferATI (GLuint); -GLAPI void APIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); -GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *); -GLAPI void APIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *); -GLAPI void APIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint); -GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); -typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); -typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); -#endif - -#ifndef GL_EXT_vertex_shader -#define GL_EXT_vertex_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginVertexShaderEXT (void); -GLAPI void APIENTRY glEndVertexShaderEXT (void); -GLAPI void APIENTRY glBindVertexShaderEXT (GLuint); -GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint); -GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint); -GLAPI void APIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint); -GLAPI void APIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint); -GLAPI void APIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint); -GLAPI void APIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint); -GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint); -GLAPI void APIENTRY glSetInvariantEXT (GLuint, GLenum, const GLvoid *); -GLAPI void APIENTRY glSetLocalConstantEXT (GLuint, GLenum, const GLvoid *); -GLAPI void APIENTRY glVariantbvEXT (GLuint, const GLbyte *); -GLAPI void APIENTRY glVariantsvEXT (GLuint, const GLshort *); -GLAPI void APIENTRY glVariantivEXT (GLuint, const GLint *); -GLAPI void APIENTRY glVariantfvEXT (GLuint, const GLfloat *); -GLAPI void APIENTRY glVariantdvEXT (GLuint, const GLdouble *); -GLAPI void APIENTRY glVariantubvEXT (GLuint, const GLubyte *); -GLAPI void APIENTRY glVariantusvEXT (GLuint, const GLushort *); -GLAPI void APIENTRY glVariantuivEXT (GLuint, const GLuint *); -GLAPI void APIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const GLvoid *); -GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint); -GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint); -GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum, GLenum); -GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum, GLenum); -GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum); -GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum); -GLAPI GLuint APIENTRY glBindParameterEXT (GLenum); -GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint, GLenum); -GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *); -GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *); -GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *); -GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *); -GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); -typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); -typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); -typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); -typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); -typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); -typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); -typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); -typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); -typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); -typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); -typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); -typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); -typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); -typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); -typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); -typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); -typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); -typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); -typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); -typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); -typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -#endif - -#ifndef GL_ATI_vertex_streams -#define GL_ATI_vertex_streams 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexStream1sATI (GLenum, GLshort); -GLAPI void APIENTRY glVertexStream1svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glVertexStream1iATI (GLenum, GLint); -GLAPI void APIENTRY glVertexStream1ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glVertexStream1fATI (GLenum, GLfloat); -GLAPI void APIENTRY glVertexStream1fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glVertexStream1dATI (GLenum, GLdouble); -GLAPI void APIENTRY glVertexStream1dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort); -GLAPI void APIENTRY glVertexStream2svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glVertexStream2iATI (GLenum, GLint, GLint); -GLAPI void APIENTRY glVertexStream2ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexStream2fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexStream2dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexStream3svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint); -GLAPI void APIENTRY glVertexStream3ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexStream3fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexStream3dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glVertexStream4svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint); -GLAPI void APIENTRY glVertexStream4ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glVertexStream4fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glVertexStream4dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte); -GLAPI void APIENTRY glNormalStream3bvATI (GLenum, const GLbyte *); -GLAPI void APIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort); -GLAPI void APIENTRY glNormalStream3svATI (GLenum, const GLshort *); -GLAPI void APIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint); -GLAPI void APIENTRY glNormalStream3ivATI (GLenum, const GLint *); -GLAPI void APIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glNormalStream3fvATI (GLenum, const GLfloat *); -GLAPI void APIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glNormalStream3dvATI (GLenum, const GLdouble *); -GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum); -GLAPI void APIENTRY glVertexBlendEnviATI (GLenum, GLint); -GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum, GLfloat); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); -typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); -#endif - -#ifndef GL_ATI_element_array -#define GL_ATI_element_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerATI (GLenum, const GLvoid *); -GLAPI void APIENTRY glDrawElementArrayATI (GLenum, GLsizei); -GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); -#endif - -#ifndef GL_SUN_mesh_array -#define GL_SUN_mesh_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); -#endif - -#ifndef GL_SUN_slice_accum -#define GL_SUN_slice_accum 1 -#endif - -#ifndef GL_NV_multisample_filter_hint -#define GL_NV_multisample_filter_hint 1 -#endif - -#ifndef GL_NV_depth_clamp -#define GL_NV_depth_clamp 1 -#endif - -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *); -GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *); -GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint); -GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint); -GLAPI void APIENTRY glEndOcclusionQueryNV (void); -GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *); -GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); -typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -#ifndef GL_NV_point_sprite -#define GL_NV_point_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameteriNV (GLenum, GLint); -GLAPI void APIENTRY glPointParameterivNV (GLenum, const GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 -#endif - -#ifndef GL_NV_vertex_program1_1 -#define GL_NV_vertex_program1_1 1 -#endif - -#ifndef GL_EXT_shadow_funcs -#define GL_EXT_shadow_funcs 1 -#endif - -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); -#endif - -#ifndef GL_ATI_text_fragment_shader -#define GL_ATI_text_fragment_shader 1 -#endif - -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 -#endif - -#ifndef GL_APPLE_element_array -#define GL_APPLE_element_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerAPPLE (GLenum, const GLvoid *); -GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum, GLint, GLsizei); -GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, GLint, GLsizei); -GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum, const GLint *, const GLsizei *, GLsizei); -GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, const GLint *, const GLsizei *, GLsizei); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); -#endif - -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenFencesAPPLE (GLsizei, GLuint *); -GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei, const GLuint *); -GLAPI void APIENTRY glSetFenceAPPLE (GLuint); -GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint); -GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint); -GLAPI void APIENTRY glFinishFenceAPPLE (GLuint); -GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum, GLuint); -GLAPI void APIENTRY glFinishObjectAPPLE (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); -typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); -typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); -typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); -#endif - -#ifndef GL_APPLE_vertex_array_object -#define GL_APPLE_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint); -GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei, const GLuint *); -GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); -#endif - -#ifndef GL_APPLE_vertex_array_range -#define GL_APPLE_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei, GLvoid *); -GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei, GLvoid *); -GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum, GLint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 1 -#endif - -#ifndef GL_S3_s3tc -#define GL_S3_s3tc 1 -#endif - -#ifndef GL_ATI_draw_buffers -#define GL_ATI_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersATI (GLsizei, const GLenum *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); -#endif - -#ifndef GL_ATI_pixel_format_float -#define GL_ATI_pixel_format_float 1 -/* This is really a WGL extension, but defines some associated GL enums. - * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. - */ -#endif - -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 -#endif - -#ifndef GL_ATI_texture_float -#define GL_ATI_texture_float 1 -#endif - -#ifndef GL_NV_float_buffer -#define GL_NV_float_buffer 1 -#endif - -#ifndef GL_NV_fragment_program -#define GL_NV_fragment_program 1 -/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat); -GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble); -GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint, GLsizei, const GLubyte *, const GLfloat *); -GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint, GLsizei, const GLubyte *, const GLdouble *); -GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint, GLsizei, const GLubyte *, GLfloat *); -GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint, GLsizei, const GLubyte *, GLdouble *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); -typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); -#endif - -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertex2hNV (GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *); -GLAPI void APIENTRY glVertex3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glVertex4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *); -GLAPI void APIENTRY glNormal3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glColor4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *); -GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV); -GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *); -GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *); -GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *); -GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum, GLhalfNV); -GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum, const GLhalfNV *); -GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum, const GLhalfNV *); -GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum, const GLhalfNV *); -GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum, const GLhalfNV *); -GLAPI void APIENTRY glFogCoordhNV (GLhalfNV); -GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *); -GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *); -GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV); -GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *); -GLAPI void APIENTRY glVertexAttrib1hNV (GLuint, GLhalfNV); -GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttrib2hNV (GLuint, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttrib3hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttrib4hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); -GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint, GLsizei, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint, GLsizei, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint, GLsizei, const GLhalfNV *); -GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint, GLsizei, const GLhalfNV *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); -typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); -typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); -typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); -typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); -typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); -typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -#endif - -#ifndef GL_NV_pixel_data_range -#define GL_NV_pixel_data_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelDataRangeNV (GLenum, GLsizei, GLvoid *); -GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); -#endif - -#ifndef GL_NV_primitive_restart -#define GL_NV_primitive_restart 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPrimitiveRestartNV (void); -GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); -#endif - -#ifndef GL_NV_texture_expand_normal -#define GL_NV_texture_expand_normal 1 -#endif - -#ifndef GL_NV_vertex_program2 -#define GL_NV_vertex_program2 1 -#endif - -#ifndef GL_ATI_map_object_buffer -#define GL_ATI_map_object_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint); -GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); -#endif - -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilOpSeparateATI (GLenum, GLenum, GLenum, GLenum); -GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum, GLenum, GLint, GLuint); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -#endif - -#ifndef GL_ATI_vertex_attrib_array_object -#define GL_ATI_vertex_attrib_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); -GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint, GLenum, GLfloat *); -GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint, GLenum, GLint *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); -#endif - -#ifndef GL_OES_read_format -#define GL_OES_read_format 1 -#endif - -#ifndef GL_EXT_depth_bounds_test -#define GL_EXT_depth_bounds_test 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthBoundsEXT (GLclampd, GLclampd); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); -#endif - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_EXT_texture_mirror_clamp 1 -#endif - -#ifndef GL_EXT_blend_equation_separate -#define GL_EXT_blend_equation_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum, GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); -#endif - -#ifndef GL_MESA_pack_invert -#define GL_MESA_pack_invert 1 -#endif - -#ifndef GL_MESA_ycbcr_texture -#define GL_MESA_ycbcr_texture 1 -#endif - -#ifndef GL_EXT_pixel_buffer_object -#define GL_EXT_pixel_buffer_object 1 -#endif - -#ifndef GL_NV_fragment_program_option -#define GL_NV_fragment_program_option 1 -#endif - -#ifndef GL_NV_fragment_program2 -#define GL_NV_fragment_program2 1 -#endif - -#ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option 1 -#endif - -#ifndef GL_NV_vertex_program3 -#define GL_NV_vertex_program3 1 -#endif - -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint); -GLAPI void APIENTRY glBindRenderbufferEXT (GLenum, GLuint); -GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei, GLuint *); -GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum, GLenum, GLsizei, GLsizei); -GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum, GLenum, GLint *); -GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint); -GLAPI void APIENTRY glBindFramebufferEXT (GLenum, GLuint); -GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei, const GLuint *); -GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *); -GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum); -GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum, GLenum, GLenum, GLuint, GLint); -GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum, GLenum, GLenum, GLuint, GLint); -GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLint); -GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum, GLenum, GLenum, GLuint); -GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum, GLenum, GLenum, GLint *); -GLAPI void APIENTRY glGenerateMipmapEXT (GLenum); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); -typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); -#endif - -#ifndef GL_GREMEDY_string_marker -#define GL_GREMEDY_string_marker 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei, const GLvoid *); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); -#endif - - -#ifdef __cplusplus -} -#endif - -#endif -#endif /* NO_SDL_GLEXT */ -/*@}*/ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_platform.h b/misc/builddeps/dp.win32/include/SDL/SDL_platform.h deleted file mode 100644 index 11d86736..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_platform.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_platform.h - * Try to get a standard set of platform defines - */ - -#ifndef _SDL_platform_h -#define _SDL_platform_h - -#if defined(_AIX) -#undef __AIX__ -#define __AIX__ 1 -#endif -#if defined(__BEOS__) -#undef __BEOS__ -#define __BEOS__ 1 -#endif -#if defined(__HAIKU__) -#undef __HAIKU__ -#define __HAIKU__ 1 -#endif -#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) -#undef __BSDI__ -#define __BSDI__ 1 -#endif -#if defined(_arch_dreamcast) -#undef __DREAMCAST__ -#define __DREAMCAST__ 1 -#endif -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) -#undef __FREEBSD__ -#define __FREEBSD__ 1 -#endif -#if defined(__HAIKU__) -#undef __HAIKU__ -#define __HAIKU__ 1 -#endif -#if defined(hpux) || defined(__hpux) || defined(__hpux__) -#undef __HPUX__ -#define __HPUX__ 1 -#endif -#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) -#undef __IRIX__ -#define __IRIX__ 1 -#endif -#if defined(linux) || defined(__linux) || defined(__linux__) -#undef __LINUX__ -#define __LINUX__ 1 -#endif -#if defined(__APPLE__) -#undef __MACOSX__ -#define __MACOSX__ 1 -#elif defined(macintosh) -#undef __MACOS__ -#define __MACOS__ 1 -#endif -#if defined(__NetBSD__) -#undef __NETBSD__ -#define __NETBSD__ 1 -#endif -#if defined(__OpenBSD__) -#undef __OPENBSD__ -#define __OPENBSD__ 1 -#endif -#if defined(__OS2__) -#undef __OS2__ -#define __OS2__ 1 -#endif -#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) -#undef __OSF__ -#define __OSF__ 1 -#endif -#if defined(__QNXNTO__) -#undef __QNXNTO__ -#define __QNXNTO__ 1 -#endif -#if defined(riscos) || defined(__riscos) || defined(__riscos__) -#undef __RISCOS__ -#define __RISCOS__ 1 -#endif -#if defined(__SVR4) -#undef __SOLARIS__ -#define __SOLARIS__ 1 -#endif -#if defined(WIN32) || defined(_WIN32) -#undef __WIN32__ -#define __WIN32__ 1 -#endif - -#endif /* _SDL_platform_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_quit.h b/misc/builddeps/dp.win32/include/SDL/SDL_quit.h deleted file mode 100644 index 6d82e7e0..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_quit.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_quit.h - * Include file for SDL quit event handling - */ - -#ifndef _SDL_quit_h -#define _SDL_quit_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -/** @file SDL_quit.h - * An SDL_QUITEVENT is generated when the user tries to close the application - * window. If it is ignored or filtered out, the window will remain open. - * If it is not ignored or filtered, it is queued normally and the window - * is allowed to close. When the window is closed, screen updates will - * complete, but have no effect. - * - * SDL_Init() installs signal handlers for SIGINT (keyboard interrupt) - * and SIGTERM (system termination request), if handlers do not already - * exist, that generate SDL_QUITEVENT events as well. There is no way - * to determine the cause of an SDL_QUITEVENT, but setting a signal - * handler in your application will override the default generation of - * quit events for that signal. - */ - -/** @file SDL_quit.h - * There are no functions directly affecting the quit event - */ - -#define SDL_QuitRequested() \ - (SDL_PumpEvents(), SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUITMASK)) - -#endif /* _SDL_quit_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_rwops.h b/misc/builddeps/dp.win32/include/SDL/SDL_rwops.h deleted file mode 100644 index a450119f..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_rwops.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_rwops.h - * This file provides a general interface for SDL to read and write - * data sources. It can easily be extended to files, memory, etc. - */ - -#ifndef _SDL_rwops_h -#define _SDL_rwops_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** This is the read/write operation structure -- very basic */ - -typedef struct SDL_RWops { - /** Seek to 'offset' relative to whence, one of stdio's whence values: - * SEEK_SET, SEEK_CUR, SEEK_END - * Returns the final offset in the data source. - */ - int (SDLCALL *seek)(struct SDL_RWops *context, int offset, int whence); - - /** Read up to 'maxnum' objects each of size 'size' from the data - * source to the area pointed at by 'ptr'. - * Returns the number of objects read, or -1 if the read failed. - */ - int (SDLCALL *read)(struct SDL_RWops *context, void *ptr, int size, int maxnum); - - /** Write exactly 'num' objects each of size 'objsize' from the area - * pointed at by 'ptr' to data source. - * Returns 'num', or -1 if the write failed. - */ - int (SDLCALL *write)(struct SDL_RWops *context, const void *ptr, int size, int num); - - /** Close and free an allocated SDL_FSops structure */ - int (SDLCALL *close)(struct SDL_RWops *context); - - Uint32 type; - union { -#if defined(__WIN32__) && !defined(__SYMBIAN32__) - struct { - int append; - void *h; - struct { - void *data; - int size; - int left; - } buffer; - } win32io; -#endif -#ifdef HAVE_STDIO_H - struct { - int autoclose; - FILE *fp; - } stdio; -#endif - struct { - Uint8 *base; - Uint8 *here; - Uint8 *stop; - } mem; - struct { - void *data1; - } unknown; - } hidden; - -} SDL_RWops; - - -/** @name Functions to create SDL_RWops structures from various data sources */ -/*@{*/ - -extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFile(const char *file, const char *mode); - -#ifdef HAVE_STDIO_H -extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFP(FILE *fp, int autoclose); -#endif - -extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromMem(void *mem, int size); -extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromConstMem(const void *mem, int size); - -extern DECLSPEC SDL_RWops * SDLCALL SDL_AllocRW(void); -extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops *area); - -/*@}*/ - -/** @name Seek Reference Points */ -/*@{*/ -#define RW_SEEK_SET 0 /**< Seek from the beginning of data */ -#define RW_SEEK_CUR 1 /**< Seek relative to current read point */ -#define RW_SEEK_END 2 /**< Seek relative to the end of data */ -/*@}*/ - -/** @name Macros to easily read and write from an SDL_RWops structure */ -/*@{*/ -#define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence) -#define SDL_RWtell(ctx) (ctx)->seek(ctx, 0, RW_SEEK_CUR) -#define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) -#define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) -#define SDL_RWclose(ctx) (ctx)->close(ctx) -/*@}*/ - -/** @name Read an item of the specified endianness and return in native format */ -/*@{*/ -extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops *src); -extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops *src); -extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops *src); -extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops *src); -extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops *src); -extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops *src); -/*@}*/ - -/** @name Write an item of native format to the specified endianness */ -/*@{*/ -extern DECLSPEC int SDLCALL SDL_WriteLE16(SDL_RWops *dst, Uint16 value); -extern DECLSPEC int SDLCALL SDL_WriteBE16(SDL_RWops *dst, Uint16 value); -extern DECLSPEC int SDLCALL SDL_WriteLE32(SDL_RWops *dst, Uint32 value); -extern DECLSPEC int SDLCALL SDL_WriteBE32(SDL_RWops *dst, Uint32 value); -extern DECLSPEC int SDLCALL SDL_WriteLE64(SDL_RWops *dst, Uint64 value); -extern DECLSPEC int SDLCALL SDL_WriteBE64(SDL_RWops *dst, Uint64 value); -/*@}*/ - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_rwops_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_stdinc.h b/misc/builddeps/dp.win32/include/SDL/SDL_stdinc.h deleted file mode 100644 index e1f85fb7..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_stdinc.h +++ /dev/null @@ -1,620 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_stdinc.h - * This is a general header that includes C language support - */ - -#ifndef _SDL_stdinc_h -#define _SDL_stdinc_h - -#include "SDL_config.h" - - -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_STDIO_H -#include -#endif -#if defined(STDC_HEADERS) -# include -# include -# include -#else -# if defined(HAVE_STDLIB_H) -# include -# elif defined(HAVE_MALLOC_H) -# include -# endif -# if defined(HAVE_STDDEF_H) -# include -# endif -# if defined(HAVE_STDARG_H) -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#if defined(HAVE_INTTYPES_H) -# include -#elif defined(HAVE_STDINT_H) -# include -#endif -#ifdef HAVE_CTYPE_H -# include -#endif -#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) -# include -#endif - -/** The number of elements in an array */ -#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) -#define SDL_TABLESIZE(table) SDL_arraysize(table) - -/* Use proper C++ casts when compiled as C++ to be compatible with the option - -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above. */ -#ifdef __cplusplus -#define SDL_reinterpret_cast(type, expression) reinterpret_cast(expression) -#define SDL_static_cast(type, expression) static_cast(expression) -#else -#define SDL_reinterpret_cast(type, expression) ((type)(expression)) -#define SDL_static_cast(type, expression) ((type)(expression)) -#endif - -/** @name Basic data types */ -/*@{*/ -typedef enum { - SDL_FALSE = 0, - SDL_TRUE = 1 -} SDL_bool; - -typedef int8_t Sint8; -typedef uint8_t Uint8; -typedef int16_t Sint16; -typedef uint16_t Uint16; -typedef int32_t Sint32; -typedef uint32_t Uint32; - -#ifdef SDL_HAS_64BIT_TYPE -typedef int64_t Sint64; -#ifndef SYMBIAN32_GCCE -typedef uint64_t Uint64; -#endif -#else -/* This is really just a hack to prevent the compiler from complaining */ -typedef struct { - Uint32 hi; - Uint32 lo; -} Uint64, Sint64; -#endif - -/*@}*/ - -/** @name Make sure the types really have the right sizes */ -/*@{*/ -#define SDL_COMPILE_TIME_ASSERT(name, x) \ - typedef int SDL_dummy_ ## name[(x) * 2 - 1] - -SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); -SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); -SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); -SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); -SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); -SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); -SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); -SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); -/*@}*/ - -/** @name Enum Size Check - * Check to make sure enums are the size of ints, for structure packing. - * For both Watcom C/C++ and Borland C/C++ the compiler option that makes - * enums having the size of an int must be enabled. - * This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). - */ -/* Enable enums always int in CodeWarrior (for MPW use "-enum int") */ -#ifdef __MWERKS__ -#pragma enumsalwaysint on -#endif - -typedef enum { - DUMMY_ENUM_VALUE -} SDL_DUMMY_ENUM; - -#ifndef __NDS__ -SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); -#endif -/*@}*/ - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef HAVE_MALLOC -#define SDL_malloc malloc -#else -extern DECLSPEC void * SDLCALL SDL_malloc(size_t size); -#endif - -#ifdef HAVE_CALLOC -#define SDL_calloc calloc -#else -extern DECLSPEC void * SDLCALL SDL_calloc(size_t nmemb, size_t size); -#endif - -#ifdef HAVE_REALLOC -#define SDL_realloc realloc -#else -extern DECLSPEC void * SDLCALL SDL_realloc(void *mem, size_t size); -#endif - -#ifdef HAVE_FREE -#define SDL_free free -#else -extern DECLSPEC void SDLCALL SDL_free(void *mem); -#endif - -#if defined(HAVE_ALLOCA) && !defined(alloca) -# if defined(HAVE_ALLOCA_H) -# include -# elif defined(__GNUC__) -# define alloca __builtin_alloca -# elif defined(_MSC_VER) -# include -# define alloca _alloca -# elif defined(__WATCOMC__) -# include -# elif defined(__BORLANDC__) -# include -# elif defined(__DMC__) -# include -# elif defined(__AIX__) - #pragma alloca -# elif defined(__MRC__) - void *alloca (unsigned); -# else - char *alloca (); -# endif -#endif -#ifdef HAVE_ALLOCA -#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) -#define SDL_stack_free(data) -#else -#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) -#define SDL_stack_free(data) SDL_free(data) -#endif - -#ifdef HAVE_GETENV -#define SDL_getenv getenv -#else -extern DECLSPEC char * SDLCALL SDL_getenv(const char *name); -#endif - -#ifdef HAVE_PUTENV -#define SDL_putenv putenv -#else -extern DECLSPEC int SDLCALL SDL_putenv(const char *variable); -#endif - -#ifdef HAVE_QSORT -#define SDL_qsort qsort -#else -extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, - int (*compare)(const void *, const void *)); -#endif - -#ifdef HAVE_ABS -#define SDL_abs abs -#else -#define SDL_abs(X) ((X) < 0 ? -(X) : (X)) -#endif - -#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) -#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) - -#ifdef HAVE_CTYPE_H -#define SDL_isdigit(X) isdigit(X) -#define SDL_isspace(X) isspace(X) -#define SDL_toupper(X) toupper(X) -#define SDL_tolower(X) tolower(X) -#else -#define SDL_isdigit(X) (((X) >= '0') && ((X) <= '9')) -#define SDL_isspace(X) (((X) == ' ') || ((X) == '\t') || ((X) == '\r') || ((X) == '\n')) -#define SDL_toupper(X) (((X) >= 'a') && ((X) <= 'z') ? ('A'+((X)-'a')) : (X)) -#define SDL_tolower(X) (((X) >= 'A') && ((X) <= 'Z') ? ('a'+((X)-'A')) : (X)) -#endif - -#ifdef HAVE_MEMSET -#define SDL_memset memset -#else -extern DECLSPEC void * SDLCALL SDL_memset(void *dst, int c, size_t len); -#endif - -#if defined(__GNUC__) && defined(i386) -#define SDL_memset4(dst, val, len) \ -do { \ - int u0, u1, u2; \ - __asm__ __volatile__ ( \ - "cld\n\t" \ - "rep ; stosl\n\t" \ - : "=&D" (u0), "=&a" (u1), "=&c" (u2) \ - : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, len)) \ - : "memory" ); \ -} while(0) -#endif -#ifndef SDL_memset4 -#define SDL_memset4(dst, val, len) \ -do { \ - unsigned _count = (len); \ - unsigned _n = (_count + 3) / 4; \ - Uint32 *_p = SDL_static_cast(Uint32 *, dst); \ - Uint32 _val = (val); \ - if (len == 0) break; \ - switch (_count % 4) { \ - case 0: do { *_p++ = _val; \ - case 3: *_p++ = _val; \ - case 2: *_p++ = _val; \ - case 1: *_p++ = _val; \ - } while ( --_n ); \ - } \ -} while(0) -#endif - -/* We can count on memcpy existing on Mac OS X and being well-tuned. */ -#if defined(__MACH__) && defined(__APPLE__) -#define SDL_memcpy(dst, src, len) memcpy(dst, src, len) -#elif defined(__GNUC__) && defined(i386) -#define SDL_memcpy(dst, src, len) \ -do { \ - int u0, u1, u2; \ - __asm__ __volatile__ ( \ - "cld\n\t" \ - "rep ; movsl\n\t" \ - "testb $2,%b4\n\t" \ - "je 1f\n\t" \ - "movsw\n" \ - "1:\ttestb $1,%b4\n\t" \ - "je 2f\n\t" \ - "movsb\n" \ - "2:" \ - : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ - : "0" (SDL_static_cast(unsigned, len)/4), "q" (len), "1" (dst),"2" (src) \ - : "memory" ); \ -} while(0) -#endif -#ifndef SDL_memcpy -#ifdef HAVE_MEMCPY -#define SDL_memcpy memcpy -#elif defined(HAVE_BCOPY) -#define SDL_memcpy(d, s, n) bcopy((s), (d), (n)) -#else -extern DECLSPEC void * SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); -#endif -#endif - -/* We can count on memcpy existing on Mac OS X and being well-tuned. */ -#if defined(__MACH__) && defined(__APPLE__) -#define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len)*4) -#elif defined(__GNUC__) && defined(i386) -#define SDL_memcpy4(dst, src, len) \ -do { \ - int ecx, edi, esi; \ - __asm__ __volatile__ ( \ - "cld\n\t" \ - "rep ; movsl" \ - : "=&c" (ecx), "=&D" (edi), "=&S" (esi) \ - : "0" (SDL_static_cast(unsigned, len)), "1" (dst), "2" (src) \ - : "memory" ); \ -} while(0) -#endif -#ifndef SDL_memcpy4 -#define SDL_memcpy4(dst, src, len) SDL_memcpy(dst, src, (len) << 2) -#endif - -#if defined(__GNUC__) && defined(i386) -#define SDL_revcpy(dst, src, len) \ -do { \ - int u0, u1, u2; \ - char *dstp = SDL_static_cast(char *, dst); \ - char *srcp = SDL_static_cast(char *, src); \ - int n = (len); \ - if ( n >= 4 ) { \ - __asm__ __volatile__ ( \ - "std\n\t" \ - "rep ; movsl\n\t" \ - "cld\n\t" \ - : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ - : "0" (n >> 2), \ - "1" (dstp+(n-4)), "2" (srcp+(n-4)) \ - : "memory" ); \ - } \ - switch (n & 3) { \ - case 3: dstp[2] = srcp[2]; \ - case 2: dstp[1] = srcp[1]; \ - case 1: dstp[0] = srcp[0]; \ - break; \ - default: \ - break; \ - } \ -} while(0) -#endif -#ifndef SDL_revcpy -extern DECLSPEC void * SDLCALL SDL_revcpy(void *dst, const void *src, size_t len); -#endif - -#ifdef HAVE_MEMMOVE -#define SDL_memmove memmove -#elif defined(HAVE_BCOPY) -#define SDL_memmove(d, s, n) bcopy((s), (d), (n)) -#else -#define SDL_memmove(dst, src, len) \ -do { \ - if ( dst < src ) { \ - SDL_memcpy(dst, src, len); \ - } else { \ - SDL_revcpy(dst, src, len); \ - } \ -} while(0) -#endif - -#ifdef HAVE_MEMCMP -#define SDL_memcmp memcmp -#else -extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); -#endif - -#ifdef HAVE_STRLEN -#define SDL_strlen strlen -#else -extern DECLSPEC size_t SDLCALL SDL_strlen(const char *string); -#endif - -#ifdef HAVE_STRLCPY -#define SDL_strlcpy strlcpy -#else -extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen); -#endif - -#ifdef HAVE_STRLCAT -#define SDL_strlcat strlcat -#else -extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src, size_t maxlen); -#endif - -#ifdef HAVE_STRDUP -#define SDL_strdup strdup -#else -extern DECLSPEC char * SDLCALL SDL_strdup(const char *string); -#endif - -#ifdef HAVE__STRREV -#define SDL_strrev _strrev -#else -extern DECLSPEC char * SDLCALL SDL_strrev(char *string); -#endif - -#ifdef HAVE__STRUPR -#define SDL_strupr _strupr -#else -extern DECLSPEC char * SDLCALL SDL_strupr(char *string); -#endif - -#ifdef HAVE__STRLWR -#define SDL_strlwr _strlwr -#else -extern DECLSPEC char * SDLCALL SDL_strlwr(char *string); -#endif - -#ifdef HAVE_STRCHR -#define SDL_strchr strchr -#elif defined(HAVE_INDEX) -#define SDL_strchr index -#else -extern DECLSPEC char * SDLCALL SDL_strchr(const char *string, int c); -#endif - -#ifdef HAVE_STRRCHR -#define SDL_strrchr strrchr -#elif defined(HAVE_RINDEX) -#define SDL_strrchr rindex -#else -extern DECLSPEC char * SDLCALL SDL_strrchr(const char *string, int c); -#endif - -#ifdef HAVE_STRSTR -#define SDL_strstr strstr -#else -extern DECLSPEC char * SDLCALL SDL_strstr(const char *haystack, const char *needle); -#endif - -#ifdef HAVE_ITOA -#define SDL_itoa itoa -#else -#define SDL_itoa(value, string, radix) SDL_ltoa((long)value, string, radix) -#endif - -#ifdef HAVE__LTOA -#define SDL_ltoa _ltoa -#else -extern DECLSPEC char * SDLCALL SDL_ltoa(long value, char *string, int radix); -#endif - -#ifdef HAVE__UITOA -#define SDL_uitoa _uitoa -#else -#define SDL_uitoa(value, string, radix) SDL_ultoa((long)value, string, radix) -#endif - -#ifdef HAVE__ULTOA -#define SDL_ultoa _ultoa -#else -extern DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *string, int radix); -#endif - -#ifdef HAVE_STRTOL -#define SDL_strtol strtol -#else -extern DECLSPEC long SDLCALL SDL_strtol(const char *string, char **endp, int base); -#endif - -#ifdef HAVE_STRTOUL -#define SDL_strtoul strtoul -#else -extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *string, char **endp, int base); -#endif - -#ifdef SDL_HAS_64BIT_TYPE - -#ifdef HAVE__I64TOA -#define SDL_lltoa _i64toa -#else -extern DECLSPEC char* SDLCALL SDL_lltoa(Sint64 value, char *string, int radix); -#endif - -#ifdef HAVE__UI64TOA -#define SDL_ulltoa _ui64toa -#else -extern DECLSPEC char* SDLCALL SDL_ulltoa(Uint64 value, char *string, int radix); -#endif - -#ifdef HAVE_STRTOLL -#define SDL_strtoll strtoll -#else -extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *string, char **endp, int base); -#endif - -#ifdef HAVE_STRTOULL -#define SDL_strtoull strtoull -#else -extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *string, char **endp, int base); -#endif - -#endif /* SDL_HAS_64BIT_TYPE */ - -#ifdef HAVE_STRTOD -#define SDL_strtod strtod -#else -extern DECLSPEC double SDLCALL SDL_strtod(const char *string, char **endp); -#endif - -#ifdef HAVE_ATOI -#define SDL_atoi atoi -#else -#define SDL_atoi(X) SDL_strtol(X, NULL, 0) -#endif - -#ifdef HAVE_ATOF -#define SDL_atof atof -#else -#define SDL_atof(X) SDL_strtod(X, NULL) -#endif - -#ifdef HAVE_STRCMP -#define SDL_strcmp strcmp -#else -extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); -#endif - -#ifdef HAVE_STRNCMP -#define SDL_strncmp strncmp -#else -extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); -#endif - -#ifdef HAVE_STRCASECMP -#define SDL_strcasecmp strcasecmp -#elif defined(HAVE__STRICMP) -#define SDL_strcasecmp _stricmp -#else -extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); -#endif - -#ifdef HAVE_STRNCASECMP -#define SDL_strncasecmp strncasecmp -#elif defined(HAVE__STRNICMP) -#define SDL_strncasecmp _strnicmp -#else -extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen); -#endif - -#ifdef HAVE_SSCANF -#define SDL_sscanf sscanf -#else -extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt, ...); -#endif - -#ifdef HAVE_SNPRINTF -#define SDL_snprintf snprintf -#else -extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...); -#endif - -#ifdef HAVE_VSNPRINTF -#define SDL_vsnprintf vsnprintf -#else -extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap); -#endif - -/** @name SDL_ICONV Error Codes - * The SDL implementation of iconv() returns these error codes - */ -/*@{*/ -#define SDL_ICONV_ERROR (size_t)-1 -#define SDL_ICONV_E2BIG (size_t)-2 -#define SDL_ICONV_EILSEQ (size_t)-3 -#define SDL_ICONV_EINVAL (size_t)-4 -/*@}*/ - -#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) -#define SDL_iconv_t iconv_t -#define SDL_iconv_open iconv_open -#define SDL_iconv_close iconv_close -#else -typedef struct _SDL_iconv_t *SDL_iconv_t; -extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, const char *fromcode); -extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); -#endif -extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); -/** This function converts a string between encodings in one pass, returning a - * string that must be freed with SDL_free() or NULL on error. - */ -extern DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft); -#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) -#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) -#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_stdinc_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_syswm.h b/misc/builddeps/dp.win32/include/SDL/SDL_syswm.h deleted file mode 100644 index 716dddcb..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_syswm.h +++ /dev/null @@ -1,225 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_syswm.h - * Include file for SDL custom system window manager hooks - */ - -#ifndef _SDL_syswm_h -#define _SDL_syswm_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_version.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** @file SDL_syswm.h - * Your application has access to a special type of event 'SDL_SYSWMEVENT', - * which contains window-manager specific information and arrives whenever - * an unhandled window event occurs. This event is ignored by default, but - * you can enable it with SDL_EventState() - */ -#ifdef SDL_PROTOTYPES_ONLY -struct SDL_SysWMinfo; -typedef struct SDL_SysWMinfo SDL_SysWMinfo; -#else - -/* This is the structure for custom window manager events */ -#if defined(SDL_VIDEO_DRIVER_X11) -#if defined(__APPLE__) && defined(__MACH__) -/* conflicts with Quickdraw.h */ -#define Cursor X11Cursor -#endif - -#include -#include - -#if defined(__APPLE__) && defined(__MACH__) -/* matches the re-define above */ -#undef Cursor -#endif - -/** These are the various supported subsystems under UNIX */ -typedef enum { - SDL_SYSWM_X11 -} SDL_SYSWM_TYPE; - -/** The UNIX custom event structure */ -struct SDL_SysWMmsg { - SDL_version version; - SDL_SYSWM_TYPE subsystem; - union { - XEvent xevent; - } event; -}; - -/** The UNIX custom window manager information structure. - * When this structure is returned, it holds information about which - * low level system it is using, and will be one of SDL_SYSWM_TYPE. - */ -typedef struct SDL_SysWMinfo { - SDL_version version; - SDL_SYSWM_TYPE subsystem; - union { - struct { - Display *display; /**< The X11 display */ - Window window; /**< The X11 display window */ - /** These locking functions should be called around - * any X11 functions using the display variable, - * but not the gfxdisplay variable. - * They lock the event thread, so should not be - * called around event functions or from event filters. - */ - /*@{*/ - void (*lock_func)(void); - void (*unlock_func)(void); - /*@}*/ - - /** @name Introduced in SDL 1.0.2 */ - /*@{*/ - Window fswindow; /**< The X11 fullscreen window */ - Window wmwindow; /**< The X11 managed input window */ - /*@}*/ - - /** @name Introduced in SDL 1.2.12 */ - /*@{*/ - Display *gfxdisplay; /**< The X11 display to which rendering is done */ - /*@}*/ - } x11; - } info; -} SDL_SysWMinfo; - -#elif defined(SDL_VIDEO_DRIVER_NANOX) -#include - -/** The generic custom event structure */ -struct SDL_SysWMmsg { - SDL_version version; - int data; -}; - -/** The windows custom window manager information structure */ -typedef struct SDL_SysWMinfo { - SDL_version version ; - GR_WINDOW_ID window ; /* The display window */ -} SDL_SysWMinfo; - -#elif defined(SDL_VIDEO_DRIVER_WINDIB) || defined(SDL_VIDEO_DRIVER_DDRAW) || defined(SDL_VIDEO_DRIVER_GAPI) -#define WIN32_LEAN_AND_MEAN -#include - -/** The windows custom event structure */ -struct SDL_SysWMmsg { - SDL_version version; - HWND hwnd; /**< The window for the message */ - UINT msg; /**< The type of message */ - WPARAM wParam; /**< WORD message parameter */ - LPARAM lParam; /**< LONG message parameter */ -}; - -/** The windows custom window manager information structure */ -typedef struct SDL_SysWMinfo { - SDL_version version; - HWND window; /**< The Win32 display window */ - HGLRC hglrc; /**< The OpenGL context, if any */ -} SDL_SysWMinfo; - -#elif defined(SDL_VIDEO_DRIVER_RISCOS) - -/** RISC OS custom event structure */ -struct SDL_SysWMmsg { - SDL_version version; - int eventCode; /**< The window for the message */ - int pollBlock[64]; -}; - -/** The RISC OS custom window manager information structure */ -typedef struct SDL_SysWMinfo { - SDL_version version; - int wimpVersion; /**< Wimp version running under */ - int taskHandle; /**< The RISC OS task handle */ - int window; /**< The RISC OS display window */ -} SDL_SysWMinfo; - -#elif defined(SDL_VIDEO_DRIVER_PHOTON) -#include -#include - -/** The QNX custom event structure */ -struct SDL_SysWMmsg { - SDL_version version; - int data; -}; - -/** The QNX custom window manager information structure */ -typedef struct SDL_SysWMinfo { - SDL_version version; - int data; -} SDL_SysWMinfo; - -#else - -/** The generic custom event structure */ -struct SDL_SysWMmsg { - SDL_version version; - int data; -}; - -/** The generic custom window manager information structure */ -typedef struct SDL_SysWMinfo { - SDL_version version; - int data; -} SDL_SysWMinfo; - -#endif /* video driver type */ - -#endif /* SDL_PROTOTYPES_ONLY */ - -/* Function prototypes */ -/** - * This function gives you custom hooks into the window manager information. - * It fills the structure pointed to by 'info' with custom information and - * returns 1 if the function is implemented. If it's not implemented, or - * the version member of the 'info' structure is invalid, it returns 0. - * - * You typically use this function like this: - * @code - * SDL_SysWMInfo info; - * SDL_VERSION(&info.version); - * if ( SDL_GetWMInfo(&info) ) { ... } - * @endcode - */ -extern DECLSPEC int SDLCALL SDL_GetWMInfo(SDL_SysWMinfo *info); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_syswm_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_thread.h b/misc/builddeps/dp.win32/include/SDL/SDL_thread.h deleted file mode 100644 index 1ca9a1bc..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_thread.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_thread_h -#define _SDL_thread_h - -/** @file SDL_thread.h - * Header for the SDL thread management routines - * - * @note These are independent of the other SDL routines. - */ - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -/* Thread synchronization primitives */ -#include "SDL_mutex.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** The SDL thread structure, defined in SDL_thread.c */ -struct SDL_Thread; -typedef struct SDL_Thread SDL_Thread; - -/** Create a thread */ -#if ((defined(__WIN32__) && !defined(HAVE_LIBC)) || defined(__OS2__)) && !defined(__SYMBIAN32__) -/** - * We compile SDL into a DLL on OS/2. This means, that it's the DLL which - * creates a new thread for the calling process with the SDL_CreateThread() - * API. There is a problem with this, that only the RTL of the SDL.DLL will - * be initialized for those threads, and not the RTL of the calling application! - * To solve this, we make a little hack here. - * We'll always use the caller's _beginthread() and _endthread() APIs to - * start a new thread. This way, if it's the SDL.DLL which uses this API, - * then the RTL of SDL.DLL will be used to create the new thread, and if it's - * the application, then the RTL of the application will be used. - * So, in short: - * Always use the _beginthread() and _endthread() of the calling runtime library! - */ -#define SDL_PASSED_BEGINTHREAD_ENDTHREAD -#ifndef _WIN32_WCE -#include /* This has _beginthread() and _endthread() defined! */ -#endif - -#ifdef __OS2__ -typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void *arg); -typedef void (*pfnSDL_CurrentEndThread)(void); -#elif __GNUC__ -typedef unsigned long (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned, - unsigned (__stdcall *func)(void *), void *arg, - unsigned, unsigned *threadID); -typedef void (__cdecl *pfnSDL_CurrentEndThread)(unsigned code); -#else -typedef uintptr_t (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned, - unsigned (__stdcall *func)(void *), void *arg, - unsigned, unsigned *threadID); -typedef void (__cdecl *pfnSDL_CurrentEndThread)(unsigned code); -#endif - -extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data, pfnSDL_CurrentBeginThread pfnBeginThread, pfnSDL_CurrentEndThread pfnEndThread); - -#ifdef __OS2__ -#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthread, _endthread) -#elif defined(_WIN32_WCE) -#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, NULL, NULL) -#else -#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthreadex, _endthreadex) -#endif -#else -extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data); -#endif - -/** Get the 32-bit thread identifier for the current thread */ -extern DECLSPEC Uint32 SDLCALL SDL_ThreadID(void); - -/** Get the 32-bit thread identifier for the specified thread, - * equivalent to SDL_ThreadID() if the specified thread is NULL. - */ -extern DECLSPEC Uint32 SDLCALL SDL_GetThreadID(SDL_Thread *thread); - -/** Wait for a thread to finish. - * The return code for the thread function is placed in the area - * pointed to by 'status', if 'status' is not NULL. - */ -extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status); - -/** Forcefully kill a thread without worrying about its state */ -extern DECLSPEC void SDLCALL SDL_KillThread(SDL_Thread *thread); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_thread_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_timer.h b/misc/builddeps/dp.win32/include/SDL/SDL_timer.h deleted file mode 100644 index d7cd0246..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_timer.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -#ifndef _SDL_timer_h -#define _SDL_timer_h - -/** @file SDL_timer.h - * Header for the SDL time management routines - */ - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** This is the OS scheduler timeslice, in milliseconds */ -#define SDL_TIMESLICE 10 - -/** This is the maximum resolution of the SDL timer on all platforms */ -#define TIMER_RESOLUTION 10 /**< Experimentally determined */ - -/** - * Get the number of milliseconds since the SDL library initialization. - * Note that this value wraps if the program runs for more than ~49 days. - */ -extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void); - -/** Wait a specified number of milliseconds before returning */ -extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); - -/** Function prototype for the timer callback function */ -typedef Uint32 (SDLCALL *SDL_TimerCallback)(Uint32 interval); - -/** - * Set a callback to run after the specified number of milliseconds has - * elapsed. The callback function is passed the current timer interval - * and returns the next timer interval. If the returned value is the - * same as the one passed in, the periodic alarm continues, otherwise a - * new alarm is scheduled. If the callback returns 0, the periodic alarm - * is cancelled. - * - * To cancel a currently running timer, call SDL_SetTimer(0, NULL); - * - * The timer callback function may run in a different thread than your - * main code, and so shouldn't call any functions from within itself. - * - * The maximum resolution of this timer is 10 ms, which means that if - * you request a 16 ms timer, your callback will run approximately 20 ms - * later on an unloaded system. If you wanted to set a flag signaling - * a frame update at 30 frames per second (every 33 ms), you might set a - * timer for 30 ms: - * @code SDL_SetTimer((33/10)*10, flag_update); @endcode - * - * If you use this function, you need to pass SDL_INIT_TIMER to SDL_Init(). - * - * Under UNIX, you should not use raise or use SIGALRM and this function - * in the same program, as it is implemented using setitimer(). You also - * should not use this function in multi-threaded applications as signals - * to multi-threaded apps have undefined behavior in some implementations. - * - * This function returns 0 if successful, or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_SetTimer(Uint32 interval, SDL_TimerCallback callback); - -/** @name New timer API - * New timer API, supports multiple timers - * Written by Stephane Peter - */ -/*@{*/ - -/** - * Function prototype for the new timer callback function. - * The callback function is passed the current timer interval and returns - * the next timer interval. If the returned value is the same as the one - * passed in, the periodic alarm continues, otherwise a new alarm is - * scheduled. If the callback returns 0, the periodic alarm is cancelled. - */ -typedef Uint32 (SDLCALL *SDL_NewTimerCallback)(Uint32 interval, void *param); - -/** Definition of the timer ID type */ -typedef struct _SDL_TimerID *SDL_TimerID; - -/** Add a new timer to the pool of timers already running. - * Returns a timer ID, or NULL when an error occurs. - */ -extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param); - -/** - * Remove one of the multiple timers knowing its ID. - * Returns a boolean value indicating success. - */ -extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID t); - -/*@}*/ - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_timer_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_types.h b/misc/builddeps/dp.win32/include/SDL/SDL_types.h deleted file mode 100644 index cfa35236..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_types.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_types.h - * @deprecated Use SDL_stdinc.h instead. - */ - -/* DEPRECATED */ -#include "SDL_stdinc.h" diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_version.h b/misc/builddeps/dp.win32/include/SDL/SDL_version.h deleted file mode 100644 index fa02c3f6..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_version.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_version.h - * This header defines the current SDL version - */ - -#ifndef _SDL_version_h -#define _SDL_version_h - -#include "SDL_stdinc.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** @name Version Number - * Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL - */ -/*@{*/ -#define SDL_MAJOR_VERSION 1 -#define SDL_MINOR_VERSION 2 -#define SDL_PATCHLEVEL 14 -/*@}*/ - -typedef struct SDL_version { - Uint8 major; - Uint8 minor; - Uint8 patch; -} SDL_version; - -/** - * This macro can be used to fill a version structure with the compile-time - * version of the SDL library. - */ -#define SDL_VERSION(X) \ -{ \ - (X)->major = SDL_MAJOR_VERSION; \ - (X)->minor = SDL_MINOR_VERSION; \ - (X)->patch = SDL_PATCHLEVEL; \ -} - -/** This macro turns the version numbers into a numeric value: - * (1,2,3) -> (1203) - * This assumes that there will never be more than 100 patchlevels - */ -#define SDL_VERSIONNUM(X, Y, Z) \ - ((X)*1000 + (Y)*100 + (Z)) - -/** This is the version number macro for the current SDL version */ -#define SDL_COMPILEDVERSION \ - SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL) - -/** This macro will evaluate to true if compiled with SDL at least X.Y.Z */ -#define SDL_VERSION_ATLEAST(X, Y, Z) \ - (SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) - -/** This function gets the version of the dynamically linked SDL library. - * it should NOT be used to fill a version structure, instead you should - * use the SDL_Version() macro. - */ -extern DECLSPEC const SDL_version * SDLCALL SDL_Linked_Version(void); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_version_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/SDL_video.h b/misc/builddeps/dp.win32/include/SDL/SDL_video.h deleted file mode 100644 index 8f7f3052..00000000 --- a/misc/builddeps/dp.win32/include/SDL/SDL_video.h +++ /dev/null @@ -1,951 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** @file SDL_video.h - * Header file for access to the SDL raw framebuffer window - */ - -#ifndef _SDL_video_h -#define _SDL_video_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" -#include "SDL_rwops.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** @name Transparency definitions - * These define alpha as the opacity of a surface - */ -/*@{*/ -#define SDL_ALPHA_OPAQUE 255 -#define SDL_ALPHA_TRANSPARENT 0 -/*@}*/ - -/** @name Useful data types */ -/*@{*/ -typedef struct SDL_Rect { - Sint16 x, y; - Uint16 w, h; -} SDL_Rect; - -typedef struct SDL_Color { - Uint8 r; - Uint8 g; - Uint8 b; - Uint8 unused; -} SDL_Color; -#define SDL_Colour SDL_Color - -typedef struct SDL_Palette { - int ncolors; - SDL_Color *colors; -} SDL_Palette; -/*@}*/ - -/** Everything in the pixel format structure is read-only */ -typedef struct SDL_PixelFormat { - SDL_Palette *palette; - Uint8 BitsPerPixel; - Uint8 BytesPerPixel; - Uint8 Rloss; - Uint8 Gloss; - Uint8 Bloss; - Uint8 Aloss; - Uint8 Rshift; - Uint8 Gshift; - Uint8 Bshift; - Uint8 Ashift; - Uint32 Rmask; - Uint32 Gmask; - Uint32 Bmask; - Uint32 Amask; - - /** RGB color key information */ - Uint32 colorkey; - /** Alpha value information (per-surface alpha) */ - Uint8 alpha; -} SDL_PixelFormat; - -/** This structure should be treated as read-only, except for 'pixels', - * which, if not NULL, contains the raw pixel data for the surface. - */ -typedef struct SDL_Surface { - Uint32 flags; /**< Read-only */ - SDL_PixelFormat *format; /**< Read-only */ - int w, h; /**< Read-only */ - Uint16 pitch; /**< Read-only */ - void *pixels; /**< Read-write */ - int offset; /**< Private */ - - /** Hardware-specific surface info */ - struct private_hwdata *hwdata; - - /** clipping information */ - SDL_Rect clip_rect; /**< Read-only */ - Uint32 unused1; /**< for binary compatibility */ - - /** Allow recursive locks */ - Uint32 locked; /**< Private */ - - /** info for fast blit mapping to other surfaces */ - struct SDL_BlitMap *map; /**< Private */ - - /** format version, bumped at every change to invalidate blit maps */ - unsigned int format_version; /**< Private */ - - /** Reference count -- used when freeing surface */ - int refcount; /**< Read-mostly */ -} SDL_Surface; - -/** @name SDL_Surface Flags - * These are the currently supported flags for the SDL_surface - */ -/*@{*/ - -/** Available for SDL_CreateRGBSurface() or SDL_SetVideoMode() */ -/*@{*/ -#define SDL_SWSURFACE 0x00000000 /**< Surface is in system memory */ -#define SDL_HWSURFACE 0x00000001 /**< Surface is in video memory */ -#define SDL_ASYNCBLIT 0x00000004 /**< Use asynchronous blits if possible */ -/*@}*/ - -/** Available for SDL_SetVideoMode() */ -/*@{*/ -#define SDL_ANYFORMAT 0x10000000 /**< Allow any video depth/pixel-format */ -#define SDL_HWPALETTE 0x20000000 /**< Surface has exclusive palette */ -#define SDL_DOUBLEBUF 0x40000000 /**< Set up double-buffered video mode */ -#define SDL_FULLSCREEN 0x80000000 /**< Surface is a full screen display */ -#define SDL_OPENGL 0x00000002 /**< Create an OpenGL rendering context */ -#define SDL_OPENGLBLIT 0x0000000A /**< Create an OpenGL rendering context and use it for blitting */ -#define SDL_RESIZABLE 0x00000010 /**< This video mode may be resized */ -#define SDL_NOFRAME 0x00000020 /**< No window caption or edge frame */ -/*@}*/ - -/** Used internally (read-only) */ -/*@{*/ -#define SDL_HWACCEL 0x00000100 /**< Blit uses hardware acceleration */ -#define SDL_SRCCOLORKEY 0x00001000 /**< Blit uses a source color key */ -#define SDL_RLEACCELOK 0x00002000 /**< Private flag */ -#define SDL_RLEACCEL 0x00004000 /**< Surface is RLE encoded */ -#define SDL_SRCALPHA 0x00010000 /**< Blit uses source alpha blending */ -#define SDL_PREALLOC 0x01000000 /**< Surface uses preallocated memory */ -/*@}*/ - -/*@}*/ - -/** Evaluates to true if the surface needs to be locked before access */ -#define SDL_MUSTLOCK(surface) \ - (surface->offset || \ - ((surface->flags & (SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_RLEACCEL)) != 0)) - -/** typedef for private surface blitting functions */ -typedef int (*SDL_blit)(struct SDL_Surface *src, SDL_Rect *srcrect, - struct SDL_Surface *dst, SDL_Rect *dstrect); - - -/** Useful for determining the video hardware capabilities */ -typedef struct SDL_VideoInfo { - Uint32 hw_available :1; /**< Flag: Can you create hardware surfaces? */ - Uint32 wm_available :1; /**< Flag: Can you talk to a window manager? */ - Uint32 UnusedBits1 :6; - Uint32 UnusedBits2 :1; - Uint32 blit_hw :1; /**< Flag: Accelerated blits HW --> HW */ - Uint32 blit_hw_CC :1; /**< Flag: Accelerated blits with Colorkey */ - Uint32 blit_hw_A :1; /**< Flag: Accelerated blits with Alpha */ - Uint32 blit_sw :1; /**< Flag: Accelerated blits SW --> HW */ - Uint32 blit_sw_CC :1; /**< Flag: Accelerated blits with Colorkey */ - Uint32 blit_sw_A :1; /**< Flag: Accelerated blits with Alpha */ - Uint32 blit_fill :1; /**< Flag: Accelerated color fill */ - Uint32 UnusedBits3 :16; - Uint32 video_mem; /**< The total amount of video memory (in K) */ - SDL_PixelFormat *vfmt; /**< Value: The format of the video surface */ - int current_w; /**< Value: The current video mode width */ - int current_h; /**< Value: The current video mode height */ -} SDL_VideoInfo; - - -/** @name Overlay Formats - * The most common video overlay formats. - * For an explanation of these pixel formats, see: - * http://www.webartz.com/fourcc/indexyuv.htm - * - * For information on the relationship between color spaces, see: - * http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html - */ -/*@{*/ -#define SDL_YV12_OVERLAY 0x32315659 /**< Planar mode: Y + V + U (3 planes) */ -#define SDL_IYUV_OVERLAY 0x56555949 /**< Planar mode: Y + U + V (3 planes) */ -#define SDL_YUY2_OVERLAY 0x32595559 /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */ -#define SDL_UYVY_OVERLAY 0x59565955 /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */ -#define SDL_YVYU_OVERLAY 0x55595659 /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */ -/*@}*/ - -/** The YUV hardware video overlay */ -typedef struct SDL_Overlay { - Uint32 format; /**< Read-only */ - int w, h; /**< Read-only */ - int planes; /**< Read-only */ - Uint16 *pitches; /**< Read-only */ - Uint8 **pixels; /**< Read-write */ - - /** @name Hardware-specific surface info */ - /*@{*/ - struct private_yuvhwfuncs *hwfuncs; - struct private_yuvhwdata *hwdata; - /*@{*/ - - /** @name Special flags */ - /*@{*/ - Uint32 hw_overlay :1; /**< Flag: This overlay hardware accelerated? */ - Uint32 UnusedBits :31; - /*@}*/ -} SDL_Overlay; - - -/** Public enumeration for setting the OpenGL window attributes. */ -typedef enum { - SDL_GL_RED_SIZE, - SDL_GL_GREEN_SIZE, - SDL_GL_BLUE_SIZE, - SDL_GL_ALPHA_SIZE, - SDL_GL_BUFFER_SIZE, - SDL_GL_DOUBLEBUFFER, - SDL_GL_DEPTH_SIZE, - SDL_GL_STENCIL_SIZE, - SDL_GL_ACCUM_RED_SIZE, - SDL_GL_ACCUM_GREEN_SIZE, - SDL_GL_ACCUM_BLUE_SIZE, - SDL_GL_ACCUM_ALPHA_SIZE, - SDL_GL_STEREO, - SDL_GL_MULTISAMPLEBUFFERS, - SDL_GL_MULTISAMPLESAMPLES, - SDL_GL_ACCELERATED_VISUAL, - SDL_GL_SWAP_CONTROL -} SDL_GLattr; - -/** @name flags for SDL_SetPalette() */ -/*@{*/ -#define SDL_LOGPAL 0x01 -#define SDL_PHYSPAL 0x02 -/*@}*/ - -/* Function prototypes */ - -/** - * @name Video Init and Quit - * These functions are used internally, and should not be used unless you - * have a specific need to specify the video driver you want to use. - * You should normally use SDL_Init() or SDL_InitSubSystem(). - */ -/*@{*/ -/** - * Initializes the video subsystem. Sets up a connection - * to the window manager, etc, and determines the current video mode and - * pixel format, but does not initialize a window or graphics mode. - * Note that event handling is activated by this routine. - * - * If you use both sound and video in your application, you need to call - * SDL_Init() before opening the sound device, otherwise under Win32 DirectX, - * you won't be able to set full-screen display modes. - */ -extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name, Uint32 flags); -extern DECLSPEC void SDLCALL SDL_VideoQuit(void); -/*@}*/ - -/** - * This function fills the given character buffer with the name of the - * video driver, and returns a pointer to it if the video driver has - * been initialized. It returns NULL if no driver has been initialized. - */ -extern DECLSPEC char * SDLCALL SDL_VideoDriverName(char *namebuf, int maxlen); - -/** - * This function returns a pointer to the current display surface. - * If SDL is doing format conversion on the display surface, this - * function returns the publicly visible surface, not the real video - * surface. - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_GetVideoSurface(void); - -/** - * This function returns a read-only pointer to information about the - * video hardware. If this is called before SDL_SetVideoMode(), the 'vfmt' - * member of the returned structure will contain the pixel format of the - * "best" video mode. - */ -extern DECLSPEC const SDL_VideoInfo * SDLCALL SDL_GetVideoInfo(void); - -/** - * Check to see if a particular video mode is supported. - * It returns 0 if the requested mode is not supported under any bit depth, - * or returns the bits-per-pixel of the closest available mode with the - * given width and height. If this bits-per-pixel is different from the - * one used when setting the video mode, SDL_SetVideoMode() will succeed, - * but will emulate the requested bits-per-pixel with a shadow surface. - * - * The arguments to SDL_VideoModeOK() are the same ones you would pass to - * SDL_SetVideoMode() - */ -extern DECLSPEC int SDLCALL SDL_VideoModeOK(int width, int height, int bpp, Uint32 flags); - -/** - * Return a pointer to an array of available screen dimensions for the - * given format and video flags, sorted largest to smallest. Returns - * NULL if there are no dimensions available for a particular format, - * or (SDL_Rect **)-1 if any dimension is okay for the given format. - * - * If 'format' is NULL, the mode list will be for the format given - * by SDL_GetVideoInfo()->vfmt - */ -extern DECLSPEC SDL_Rect ** SDLCALL SDL_ListModes(SDL_PixelFormat *format, Uint32 flags); - -/** - * Set up a video mode with the specified width, height and bits-per-pixel. - * - * If 'bpp' is 0, it is treated as the current display bits per pixel. - * - * If SDL_ANYFORMAT is set in 'flags', the SDL library will try to set the - * requested bits-per-pixel, but will return whatever video pixel format is - * available. The default is to emulate the requested pixel format if it - * is not natively available. - * - * If SDL_HWSURFACE is set in 'flags', the video surface will be placed in - * video memory, if possible, and you may have to call SDL_LockSurface() - * in order to access the raw framebuffer. Otherwise, the video surface - * will be created in system memory. - * - * If SDL_ASYNCBLIT is set in 'flags', SDL will try to perform rectangle - * updates asynchronously, but you must always lock before accessing pixels. - * SDL will wait for updates to complete before returning from the lock. - * - * If SDL_HWPALETTE is set in 'flags', the SDL library will guarantee - * that the colors set by SDL_SetColors() will be the colors you get. - * Otherwise, in 8-bit mode, SDL_SetColors() may not be able to set all - * of the colors exactly the way they are requested, and you should look - * at the video surface structure to determine the actual palette. - * If SDL cannot guarantee that the colors you request can be set, - * i.e. if the colormap is shared, then the video surface may be created - * under emulation in system memory, overriding the SDL_HWSURFACE flag. - * - * If SDL_FULLSCREEN is set in 'flags', the SDL library will try to set - * a fullscreen video mode. The default is to create a windowed mode - * if the current graphics system has a window manager. - * If the SDL library is able to set a fullscreen video mode, this flag - * will be set in the surface that is returned. - * - * If SDL_DOUBLEBUF is set in 'flags', the SDL library will try to set up - * two surfaces in video memory and swap between them when you call - * SDL_Flip(). This is usually slower than the normal single-buffering - * scheme, but prevents "tearing" artifacts caused by modifying video - * memory while the monitor is refreshing. It should only be used by - * applications that redraw the entire screen on every update. - * - * If SDL_RESIZABLE is set in 'flags', the SDL library will allow the - * window manager, if any, to resize the window at runtime. When this - * occurs, SDL will send a SDL_VIDEORESIZE event to you application, - * and you must respond to the event by re-calling SDL_SetVideoMode() - * with the requested size (or another size that suits the application). - * - * If SDL_NOFRAME is set in 'flags', the SDL library will create a window - * without any title bar or frame decoration. Fullscreen video modes have - * this flag set automatically. - * - * This function returns the video framebuffer surface, or NULL if it fails. - * - * If you rely on functionality provided by certain video flags, check the - * flags of the returned surface to make sure that functionality is available. - * SDL will fall back to reduced functionality if the exact flags you wanted - * are not available. - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_SetVideoMode - (int width, int height, int bpp, Uint32 flags); - -/** @name SDL_Update Functions - * These functions should not be called while 'screen' is locked. - */ -/*@{*/ -/** - * Makes sure the given list of rectangles is updated on the given screen. - */ -extern DECLSPEC void SDLCALL SDL_UpdateRects - (SDL_Surface *screen, int numrects, SDL_Rect *rects); -/** - * If 'x', 'y', 'w' and 'h' are all 0, SDL_UpdateRect will update the entire - * screen. - */ -extern DECLSPEC void SDLCALL SDL_UpdateRect - (SDL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h); -/*@}*/ - -/** - * On hardware that supports double-buffering, this function sets up a flip - * and returns. The hardware will wait for vertical retrace, and then swap - * video buffers before the next video surface blit or lock will return. - * On hardware that doesn not support double-buffering, this is equivalent - * to calling SDL_UpdateRect(screen, 0, 0, 0, 0); - * The SDL_DOUBLEBUF flag must have been passed to SDL_SetVideoMode() when - * setting the video mode for this function to perform hardware flipping. - * This function returns 0 if successful, or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_Flip(SDL_Surface *screen); - -/** - * Set the gamma correction for each of the color channels. - * The gamma values range (approximately) between 0.1 and 10.0 - * - * If this function isn't supported directly by the hardware, it will - * be emulated using gamma ramps, if available. If successful, this - * function returns 0, otherwise it returns -1. - */ -extern DECLSPEC int SDLCALL SDL_SetGamma(float red, float green, float blue); - -/** - * Set the gamma translation table for the red, green, and blue channels - * of the video hardware. Each table is an array of 256 16-bit quantities, - * representing a mapping between the input and output for that channel. - * The input is the index into the array, and the output is the 16-bit - * gamma value at that index, scaled to the output color precision. - * - * You may pass NULL for any of the channels to leave it unchanged. - * If the call succeeds, it will return 0. If the display driver or - * hardware does not support gamma translation, or otherwise fails, - * this function will return -1. - */ -extern DECLSPEC int SDLCALL SDL_SetGammaRamp(const Uint16 *red, const Uint16 *green, const Uint16 *blue); - -/** - * Retrieve the current values of the gamma translation tables. - * - * You must pass in valid pointers to arrays of 256 16-bit quantities. - * Any of the pointers may be NULL to ignore that channel. - * If the call succeeds, it will return 0. If the display driver or - * hardware does not support gamma translation, or otherwise fails, - * this function will return -1. - */ -extern DECLSPEC int SDLCALL SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue); - -/** - * Sets a portion of the colormap for the given 8-bit surface. If 'surface' - * is not a palettized surface, this function does nothing, returning 0. - * If all of the colors were set as passed to SDL_SetColors(), it will - * return 1. If not all the color entries were set exactly as given, - * it will return 0, and you should look at the surface palette to - * determine the actual color palette. - * - * When 'surface' is the surface associated with the current display, the - * display colormap will be updated with the requested colors. If - * SDL_HWPALETTE was set in SDL_SetVideoMode() flags, SDL_SetColors() - * will always return 1, and the palette is guaranteed to be set the way - * you desire, even if the window colormap has to be warped or run under - * emulation. - */ -extern DECLSPEC int SDLCALL SDL_SetColors(SDL_Surface *surface, - SDL_Color *colors, int firstcolor, int ncolors); - -/** - * Sets a portion of the colormap for a given 8-bit surface. - * 'flags' is one or both of: - * SDL_LOGPAL -- set logical palette, which controls how blits are mapped - * to/from the surface, - * SDL_PHYSPAL -- set physical palette, which controls how pixels look on - * the screen - * Only screens have physical palettes. Separate change of physical/logical - * palettes is only possible if the screen has SDL_HWPALETTE set. - * - * The return value is 1 if all colours could be set as requested, and 0 - * otherwise. - * - * SDL_SetColors() is equivalent to calling this function with - * flags = (SDL_LOGPAL|SDL_PHYSPAL). - */ -extern DECLSPEC int SDLCALL SDL_SetPalette(SDL_Surface *surface, int flags, - SDL_Color *colors, int firstcolor, - int ncolors); - -/** - * Maps an RGB triple to an opaque pixel value for a given pixel format - */ -extern DECLSPEC Uint32 SDLCALL SDL_MapRGB -(const SDL_PixelFormat * const format, - const Uint8 r, const Uint8 g, const Uint8 b); - -/** - * Maps an RGBA quadruple to a pixel value for a given pixel format - */ -extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA -(const SDL_PixelFormat * const format, - const Uint8 r, const Uint8 g, const Uint8 b, const Uint8 a); - -/** - * Maps a pixel value into the RGB components for a given pixel format - */ -extern DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, - const SDL_PixelFormat * const fmt, - Uint8 *r, Uint8 *g, Uint8 *b); - -/** - * Maps a pixel value into the RGBA components for a given pixel format - */ -extern DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, - const SDL_PixelFormat * const fmt, - Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); - -/** @sa SDL_CreateRGBSurface */ -#define SDL_AllocSurface SDL_CreateRGBSurface -/** - * Allocate and free an RGB surface (must be called after SDL_SetVideoMode) - * If the depth is 4 or 8 bits, an empty palette is allocated for the surface. - * If the depth is greater than 8 bits, the pixel format is set using the - * flags '[RGB]mask'. - * If the function runs out of memory, it will return NULL. - * - * The 'flags' tell what kind of surface to create. - * SDL_SWSURFACE means that the surface should be created in system memory. - * SDL_HWSURFACE means that the surface should be created in video memory, - * with the same format as the display surface. This is useful for surfaces - * that will not change much, to take advantage of hardware acceleration - * when being blitted to the display surface. - * SDL_ASYNCBLIT means that SDL will try to perform asynchronous blits with - * this surface, but you must always lock it before accessing the pixels. - * SDL will wait for current blits to finish before returning from the lock. - * SDL_SRCCOLORKEY indicates that the surface will be used for colorkey blits. - * If the hardware supports acceleration of colorkey blits between - * two surfaces in video memory, SDL will try to place the surface in - * video memory. If this isn't possible or if there is no hardware - * acceleration available, the surface will be placed in system memory. - * SDL_SRCALPHA means that the surface will be used for alpha blits and - * if the hardware supports hardware acceleration of alpha blits between - * two surfaces in video memory, to place the surface in video memory - * if possible, otherwise it will be placed in system memory. - * If the surface is created in video memory, blits will be _much_ faster, - * but the surface format must be identical to the video surface format, - * and the only way to access the pixels member of the surface is to use - * the SDL_LockSurface() and SDL_UnlockSurface() calls. - * If the requested surface actually resides in video memory, SDL_HWSURFACE - * will be set in the flags member of the returned surface. If for some - * reason the surface could not be placed in video memory, it will not have - * the SDL_HWSURFACE flag set, and will be created in system memory instead. - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_CreateRGBSurface - (Uint32 flags, int width, int height, int depth, - Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); -/** @sa SDL_CreateRGBSurface */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_CreateRGBSurfaceFrom(void *pixels, - int width, int height, int depth, int pitch, - Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); -extern DECLSPEC void SDLCALL SDL_FreeSurface(SDL_Surface *surface); - -/** - * SDL_LockSurface() sets up a surface for directly accessing the pixels. - * Between calls to SDL_LockSurface()/SDL_UnlockSurface(), you can write - * to and read from 'surface->pixels', using the pixel format stored in - * 'surface->format'. Once you are done accessing the surface, you should - * use SDL_UnlockSurface() to release it. - * - * Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates - * to 0, then you can read and write to the surface at any time, and the - * pixel format of the surface will not change. In particular, if the - * SDL_HWSURFACE flag is not given when calling SDL_SetVideoMode(), you - * will not need to lock the display surface before accessing it. - * - * No operating system or library calls should be made between lock/unlock - * pairs, as critical system locks may be held during this time. - * - * SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked. - */ -extern DECLSPEC int SDLCALL SDL_LockSurface(SDL_Surface *surface); -extern DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface *surface); - -/** - * Load a surface from a seekable SDL data source (memory or file.) - * If 'freesrc' is non-zero, the source will be closed after being read. - * Returns the new surface, or NULL if there was an error. - * The new surface should be freed with SDL_FreeSurface(). - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_RW(SDL_RWops *src, int freesrc); - -/** Convenience macro -- load a surface from a file */ -#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) - -/** - * Save a surface to a seekable SDL data source (memory or file.) - * If 'freedst' is non-zero, the source will be closed after being written. - * Returns 0 if successful or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_SaveBMP_RW - (SDL_Surface *surface, SDL_RWops *dst, int freedst); - -/** Convenience macro -- save a surface to a file */ -#define SDL_SaveBMP(surface, file) \ - SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1) - -/** - * Sets the color key (transparent pixel) in a blittable surface. - * If 'flag' is SDL_SRCCOLORKEY (optionally OR'd with SDL_RLEACCEL), - * 'key' will be the transparent pixel in the source image of a blit. - * SDL_RLEACCEL requests RLE acceleration for the surface if present, - * and removes RLE acceleration if absent. - * If 'flag' is 0, this function clears any current color key. - * This function returns 0, or -1 if there was an error. - */ -extern DECLSPEC int SDLCALL SDL_SetColorKey - (SDL_Surface *surface, Uint32 flag, Uint32 key); - -/** - * This function sets the alpha value for the entire surface, as opposed to - * using the alpha component of each pixel. This value measures the range - * of transparency of the surface, 0 being completely transparent to 255 - * being completely opaque. An 'alpha' value of 255 causes blits to be - * opaque, the source pixels copied to the destination (the default). Note - * that per-surface alpha can be combined with colorkey transparency. - * - * If 'flag' is 0, alpha blending is disabled for the surface. - * If 'flag' is SDL_SRCALPHA, alpha blending is enabled for the surface. - * OR:ing the flag with SDL_RLEACCEL requests RLE acceleration for the - * surface; if SDL_RLEACCEL is not specified, the RLE accel will be removed. - * - * The 'alpha' parameter is ignored for surfaces that have an alpha channel. - */ -extern DECLSPEC int SDLCALL SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha); - -/** - * Sets the clipping rectangle for the destination surface in a blit. - * - * If the clip rectangle is NULL, clipping will be disabled. - * If the clip rectangle doesn't intersect the surface, the function will - * return SDL_FALSE and blits will be completely clipped. Otherwise the - * function returns SDL_TRUE and blits to the surface will be clipped to - * the intersection of the surface area and the clipping rectangle. - * - * Note that blits are automatically clipped to the edges of the source - * and destination surfaces. - */ -extern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect); - -/** - * Gets the clipping rectangle for the destination surface in a blit. - * 'rect' must be a pointer to a valid rectangle which will be filled - * with the correct values. - */ -extern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface *surface, SDL_Rect *rect); - -/** - * Creates a new surface of the specified format, and then copies and maps - * the given surface to it so the blit of the converted surface will be as - * fast as possible. If this function fails, it returns NULL. - * - * The 'flags' parameter is passed to SDL_CreateRGBSurface() and has those - * semantics. You can also pass SDL_RLEACCEL in the flags parameter and - * SDL will try to RLE accelerate colorkey and alpha blits in the resulting - * surface. - * - * This function is used internally by SDL_DisplayFormat(). - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_ConvertSurface - (SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags); - -/** - * This performs a fast blit from the source surface to the destination - * surface. It assumes that the source and destination rectangles are - * the same size. If either 'srcrect' or 'dstrect' are NULL, the entire - * surface (src or dst) is copied. The final blit rectangles are saved - * in 'srcrect' and 'dstrect' after all clipping is performed. - * If the blit is successful, it returns 0, otherwise it returns -1. - * - * The blit function should not be called on a locked surface. - * - * The blit semantics for surfaces with and without alpha and colorkey - * are defined as follows: - * - * RGBA->RGB: - * SDL_SRCALPHA set: - * alpha-blend (using alpha-channel). - * SDL_SRCCOLORKEY ignored. - * SDL_SRCALPHA not set: - * copy RGB. - * if SDL_SRCCOLORKEY set, only copy the pixels matching the - * RGB values of the source colour key, ignoring alpha in the - * comparison. - * - * RGB->RGBA: - * SDL_SRCALPHA set: - * alpha-blend (using the source per-surface alpha value); - * set destination alpha to opaque. - * SDL_SRCALPHA not set: - * copy RGB, set destination alpha to source per-surface alpha value. - * both: - * if SDL_SRCCOLORKEY set, only copy the pixels matching the - * source colour key. - * - * RGBA->RGBA: - * SDL_SRCALPHA set: - * alpha-blend (using the source alpha channel) the RGB values; - * leave destination alpha untouched. [Note: is this correct?] - * SDL_SRCCOLORKEY ignored. - * SDL_SRCALPHA not set: - * copy all of RGBA to the destination. - * if SDL_SRCCOLORKEY set, only copy the pixels matching the - * RGB values of the source colour key, ignoring alpha in the - * comparison. - * - * RGB->RGB: - * SDL_SRCALPHA set: - * alpha-blend (using the source per-surface alpha value). - * SDL_SRCALPHA not set: - * copy RGB. - * both: - * if SDL_SRCCOLORKEY set, only copy the pixels matching the - * source colour key. - * - * If either of the surfaces were in video memory, and the blit returns -2, - * the video memory was lost, so it should be reloaded with artwork and - * re-blitted: - * @code - * while ( SDL_BlitSurface(image, imgrect, screen, dstrect) == -2 ) { - * while ( SDL_LockSurface(image) < 0 ) - * Sleep(10); - * -- Write image pixels to image->pixels -- - * SDL_UnlockSurface(image); - * } - * @endcode - * - * This happens under DirectX 5.0 when the system switches away from your - * fullscreen application. The lock will also fail until you have access - * to the video memory again. - * - * You should call SDL_BlitSurface() unless you know exactly how SDL - * blitting works internally and how to use the other blit functions. - */ -#define SDL_BlitSurface SDL_UpperBlit - -/** This is the public blit function, SDL_BlitSurface(), and it performs - * rectangle validation and clipping before passing it to SDL_LowerBlit() - */ -extern DECLSPEC int SDLCALL SDL_UpperBlit - (SDL_Surface *src, SDL_Rect *srcrect, - SDL_Surface *dst, SDL_Rect *dstrect); -/** This is a semi-private blit function and it performs low-level surface - * blitting only. - */ -extern DECLSPEC int SDLCALL SDL_LowerBlit - (SDL_Surface *src, SDL_Rect *srcrect, - SDL_Surface *dst, SDL_Rect *dstrect); - -/** - * This function performs a fast fill of the given rectangle with 'color' - * The given rectangle is clipped to the destination surface clip area - * and the final fill rectangle is saved in the passed in pointer. - * If 'dstrect' is NULL, the whole surface will be filled with 'color' - * The color should be a pixel of the format used by the surface, and - * can be generated by the SDL_MapRGB() function. - * This function returns 0 on success, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_FillRect - (SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); - -/** - * This function takes a surface and copies it to a new surface of the - * pixel format and colors of the video framebuffer, suitable for fast - * blitting onto the display surface. It calls SDL_ConvertSurface() - * - * If you want to take advantage of hardware colorkey or alpha blit - * acceleration, you should set the colorkey and alpha value before - * calling this function. - * - * If the conversion fails or runs out of memory, it returns NULL - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_DisplayFormat(SDL_Surface *surface); - -/** - * This function takes a surface and copies it to a new surface of the - * pixel format and colors of the video framebuffer (if possible), - * suitable for fast alpha blitting onto the display surface. - * The new surface will always have an alpha channel. - * - * If you want to take advantage of hardware colorkey or alpha blit - * acceleration, you should set the colorkey and alpha value before - * calling this function. - * - * If the conversion fails or runs out of memory, it returns NULL - */ -extern DECLSPEC SDL_Surface * SDLCALL SDL_DisplayFormatAlpha(SDL_Surface *surface); - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/** @name YUV video surface overlay functions */ /*@{*/ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/** This function creates a video output overlay - * Calling the returned surface an overlay is something of a misnomer because - * the contents of the display surface underneath the area where the overlay - * is shown is undefined - it may be overwritten with the converted YUV data. - */ -extern DECLSPEC SDL_Overlay * SDLCALL SDL_CreateYUVOverlay(int width, int height, - Uint32 format, SDL_Surface *display); - -/** Lock an overlay for direct access, and unlock it when you are done */ -extern DECLSPEC int SDLCALL SDL_LockYUVOverlay(SDL_Overlay *overlay); -extern DECLSPEC void SDLCALL SDL_UnlockYUVOverlay(SDL_Overlay *overlay); - -/** Blit a video overlay to the display surface. - * The contents of the video surface underneath the blit destination are - * not defined. - * The width and height of the destination rectangle may be different from - * that of the overlay, but currently only 2x scaling is supported. - */ -extern DECLSPEC int SDLCALL SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect); - -/** Free a video overlay */ -extern DECLSPEC void SDLCALL SDL_FreeYUVOverlay(SDL_Overlay *overlay); - -/*@}*/ - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/** @name OpenGL support functions. */ /*@{*/ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/** - * Dynamically load an OpenGL library, or the default one if path is NULL - * - * If you do this, you need to retrieve all of the GL functions used in - * your program from the dynamic library using SDL_GL_GetProcAddress(). - */ -extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path); - -/** - * Get the address of a GL function - */ -extern DECLSPEC void * SDLCALL SDL_GL_GetProcAddress(const char* proc); - -/** - * Set an attribute of the OpenGL subsystem before intialization. - */ -extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); - -/** - * Get an attribute of the OpenGL subsystem from the windowing - * interface, such as glX. This is of course different from getting - * the values from SDL's internal OpenGL subsystem, which only - * stores the values you request before initialization. - * - * Developers should track the values they pass into SDL_GL_SetAttribute - * themselves if they want to retrieve these values. - */ -extern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int* value); - -/** - * Swap the OpenGL buffers, if double-buffering is supported. - */ -extern DECLSPEC void SDLCALL SDL_GL_SwapBuffers(void); - -/** @name OpenGL Internal Functions - * Internal functions that should not be called unless you have read - * and understood the source code for these functions. - */ -/*@{*/ -extern DECLSPEC void SDLCALL SDL_GL_UpdateRects(int numrects, SDL_Rect* rects); -extern DECLSPEC void SDLCALL SDL_GL_Lock(void); -extern DECLSPEC void SDLCALL SDL_GL_Unlock(void); -/*@}*/ - -/*@}*/ - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/** @name Window Manager Functions */ -/** These functions allow interaction with the window manager, if any. */ /*@{*/ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/** - * Sets the title and icon text of the display window (UTF-8 encoded) - */ -extern DECLSPEC void SDLCALL SDL_WM_SetCaption(const char *title, const char *icon); -/** - * Gets the title and icon text of the display window (UTF-8 encoded) - */ -extern DECLSPEC void SDLCALL SDL_WM_GetCaption(char **title, char **icon); - -/** - * Sets the icon for the display window. - * This function must be called before the first call to SDL_SetVideoMode(). - * It takes an icon surface, and a mask in MSB format. - * If 'mask' is NULL, the entire icon surface will be used as the icon. - */ -extern DECLSPEC void SDLCALL SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); - -/** - * This function iconifies the window, and returns 1 if it succeeded. - * If the function succeeds, it generates an SDL_APPACTIVE loss event. - * This function is a noop and returns 0 in non-windowed environments. - */ -extern DECLSPEC int SDLCALL SDL_WM_IconifyWindow(void); - -/** - * Toggle fullscreen mode without changing the contents of the screen. - * If the display surface does not require locking before accessing - * the pixel information, then the memory pointers will not change. - * - * If this function was able to toggle fullscreen mode (change from - * running in a window to fullscreen, or vice-versa), it will return 1. - * If it is not implemented, or fails, it returns 0. - * - * The next call to SDL_SetVideoMode() will set the mode fullscreen - * attribute based on the flags parameter - if SDL_FULLSCREEN is not - * set, then the display will be windowed by default where supported. - * - * This is currently only implemented in the X11 video driver. - */ -extern DECLSPEC int SDLCALL SDL_WM_ToggleFullScreen(SDL_Surface *surface); - -typedef enum { - SDL_GRAB_QUERY = -1, - SDL_GRAB_OFF = 0, - SDL_GRAB_ON = 1, - SDL_GRAB_FULLSCREEN /**< Used internally */ -} SDL_GrabMode; -/** - * This function allows you to set and query the input grab state of - * the application. It returns the new input grab state. - * - * Grabbing means that the mouse is confined to the application window, - * and nearly all keyboard input is passed directly to the application, - * and not interpreted by a window manager, if any. - */ -extern DECLSPEC SDL_GrabMode SDLCALL SDL_WM_GrabInput(SDL_GrabMode mode); - -/*@}*/ - -/** @internal Not in public API at the moment - do not use! */ -extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface *src, SDL_Rect *srcrect, - SDL_Surface *dst, SDL_Rect *dstrect); - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include "close_code.h" - -#endif /* _SDL_video_h */ diff --git a/misc/builddeps/dp.win32/include/SDL/begin_code.h b/misc/builddeps/dp.win32/include/SDL/begin_code.h deleted file mode 100644 index 22748090..00000000 --- a/misc/builddeps/dp.win32/include/SDL/begin_code.h +++ /dev/null @@ -1,191 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - 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 - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * @file begin_code.h - * This file sets things up for C dynamic library function definitions, - * static inlined functions, and structures aligned at 4-byte alignment. - * If you don't like ugly C preprocessor code, don't look at this file. :) - */ - -/** - * @file begin_code.h - * This shouldn't be nested -- included it around code only. - */ -#ifdef _begin_code_h -#error Nested inclusion of begin_code.h -#endif -#define _begin_code_h - -/** - * @def DECLSPEC - * Some compilers use a special export keyword - */ -#ifndef DECLSPEC -# if defined(__BEOS__) || defined(__HAIKU__) -# if defined(__GNUC__) -# define DECLSPEC __declspec(dllexport) -# else -# define DECLSPEC __declspec(export) -# endif -# elif defined(__WIN32__) -# ifdef __BORLANDC__ -# ifdef BUILD_SDL -# define DECLSPEC -# else -# define DECLSPEC __declspec(dllimport) -# endif -# else -# define DECLSPEC __declspec(dllexport) -# endif -# elif defined(__OS2__) -# ifdef __WATCOMC__ -# ifdef BUILD_SDL -# define DECLSPEC __declspec(dllexport) -# else -# define DECLSPEC -# endif -# elif defined (__GNUC__) && __GNUC__ < 4 -# /* Added support for GCC-EMX = 4 -# define DECLSPEC __attribute__ ((visibility("default"))) -# else -# define DECLSPEC -# endif -# endif -#endif - -/** - * @def SDLCALL - * By default SDL uses the C calling convention - */ -#ifndef SDLCALL -# if defined(__WIN32__) && !defined(__GNUC__) -# define SDLCALL __cdecl -# elif defined(__OS2__) -# if defined (__GNUC__) && __GNUC__ < 4 -# /* Added support for GCC-EMX