iup-stack/iup/srcmglplot/mgl2/define.h

378 lines
15 KiB
C
Raw Permalink Normal View History

2023-02-20 16:44:45 +00:00
/***************************************************************************
* define.h is part of Math Graphic Library
* Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru> *
* *
* This program 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 3 of the *
* License, or (at your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef _MGL_DEFINE_H_
#define _MGL_DEFINE_H_
//-----------------------------------------------------------------------------
// Disable warnings for MSVC:
// 4190 - C-linkage of std::complex,
// 4996 - deprecated abi functions
// 4786 - disable warnings on 255 char debug symbols
// 4231 - disable warnings on extern before template instantiation
// 4800 - "int,uint32_t,etc" forcing value to bool 'true' or 'false' (performance warning)
// 4244 - conversion from 'mreal,double' to 'float', possible loss of data
// 4267 - conversion from 'size_t' to 'long,int,etc', possible loss of data
// 4305 - truncation from 'double' to 'float'
#if defined(_MSC_VER)
#pragma warning(disable: 4996 4190 4786 4231 4800 4244 4267 4305)
#endif
#include "mgl2/config.h"
#ifndef SWIG
#if MGL_HAVE_PTHR_WIDGET|MGL_HAVE_PTHREAD
#include <pthread.h>
#endif
#include "mgl2/dllexport.h"
#if defined(_MSC_VER)
#define MGL_OBSOLETE MGL_NO_EXPORT
#else
#define MGL_OBSOLETE MGL_EXPORT
#endif
#if MGL_HAVE_ATTRIBUTE
#define MGL_FUNC_CONST __attribute__((const))
#define MGL_FUNC_PURE __attribute__((pure))
#else
#define MGL_FUNC_CONST
#define MGL_FUNC_PURE
#endif
#define MGL_EXPORT_CONST MGL_EXPORT MGL_FUNC_CONST
#define MGL_EXPORT_PURE MGL_EXPORT MGL_FUNC_PURE
#define MGL_LOCAL_CONST MGL_NO_EXPORT MGL_FUNC_CONST
#define MGL_LOCAL_PURE MGL_NO_EXPORT MGL_FUNC_PURE
#if MGL_HAVE_RVAL // C++11 don't support register keyword
#if (!defined(_MSC_VER)) || (defined(_MSC_VER) && (_MSC_VER < 1310))
#define register
#endif
#endif
#endif
//-----------------------------------------------------------------------------
#ifdef WIN32 //_MSC_VER needs this before math.h
#define _USE_MATH_DEFINES
#endif
#ifdef MGL_SRC
#if MGL_HAVE_ZLIB
#include <zlib.h>
#ifndef Z_BEST_COMPRESSION
#define Z_BEST_COMPRESSION 9
#endif
#else
#define gzFile FILE*
#define gzread(fp,buf,size) fread(buf,1,size,fp)
#define gzopen fopen
#define gzclose fclose
#define gzprintf fprintf
#define gzgets(fp,str,size) fgets(str,size,fp)
#define gzgetc fgetc
#endif
#endif
#if (defined(_MSC_VER) && (_MSC_VER<1600)) || defined(__BORLANDC__)
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed long int32_t;
typedef signed long long int64_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
typedef unsigned long long uint64_t;
#else
#include <stdint.h>
#endif
#if defined(__BORLANDC__)
typedef unsigned long uintptr_t;
#endif
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#if defined(_MSC_VER)
#define collapse(a) // MSVS don't support OpenMP 3.*
#if (_MSC_VER<=1800)
#define strtoull _strtoui64
//#define hypot _hypot
#define getcwd _getcwd
#define chdir _chdir // BORLAND has chdir
#endif
#define snprintf _snprintf
#if (_MSC_VER<1600) // based on https://hg.python.org/cpython/rev/9aedb876c2d7
#define hypot _hypot
#endif
#endif
#if !MGL_SYS_NAN
#include <float.h>
#include <math.h>
const unsigned long long mgl_nan[2] = {0x7fffffffffffffff, 0x7fffffff};
const unsigned long long mgl_inf[2] = {0x7ff0000000000000, 0x7f800000};
#define NANd (*(double*)mgl_nan)
#define NANf (*(float*)(mgl_nan+1))
#define INFd (*(double*)mgl_inf)
#define INFf (*(float*)(mgl_inf+1))
#if !defined(NAN)
#if MGL_USE_DOUBLE
#define NAN NANd
#else
#define NAN NANf
#endif
#endif
#if !defined(INFINITY)
#if MGL_USE_DOUBLE
#define INFINITY INFd
#else
#define INFINITY INFf
#endif
#endif
#endif // !MGL_SYS_NAN
#ifndef M_PI
#define M_PI 3.14159265358979323846 /* pi */
#endif
//-----------------------------------------------------------------------------
#ifdef WIN32
#define mglprintf _snwprintf
#else
#define mglprintf swprintf
#endif
//#define FLT_EPS 1.1920928955078125e-07
//-----------------------------------------------------------------------------
#if MGL_USE_DOUBLE
typedef double mreal;
#define MGL_EPSILON (1.+1e-10)
#define MGL_MIN_VAL 1e-307
#else
typedef float mreal;
#define MGL_EPSILON (1.+1e-5)
#define MGL_MIN_VAL 1e-37
#endif
#define MGL_FEPSILON (1.+1e-5)
//-----------------------------------------------------------------------------
#ifndef MGL_CMAP_COLOR
#define MGL_CMAP_COLOR 32
#endif
//-----------------------------------------------------------------------------
#ifndef MGL_DEF_VIEWER
#define MGL_DEF_VIEWER "evince"
#endif
//-----------------------------------------------------------------------------
#if MGL_HAVE_TYPEOF
#define mgl_isrange(a,b) ({typeof (a) _a = (a); typeof (b) _b = (b); fabs(_a-_b)>MGL_MIN_VAL && _a-_a==mreal(0.) && _b-_b==mreal(0.);})
#define mgl_isbad(a) ({typeof (a) _a = (a); _a-_a!=mreal(0.);})
#define mgl_isfin(a) ({typeof (a) _a = (a); _a-_a==mreal(0.);})
#define mgl_isnum(a) ({typeof (a) _a = (a); _a==_a;})
#define mgl_isnan(a) ({typeof (a) _a = (a); _a!=_a;})
#define mgl_min(a,b) ({typeof (a) _a = (a); typeof (b) _b = (b); _a > _b ? _b : _a;})
#define mgl_max(a,b) ({typeof (a) _a = (a); typeof (b) _b = (b); _a > _b ? _a : _b;})
#define mgl_sign(a) ({typeof (a) _a = (a); _a<0 ? -1:1;})
#define mgl_int(a) ({typeof (a) _a = (a); long(_a+(_a>=0 ? 0.5:-0.5));})
#else
#define mgl_isrange(a,b) (fabs((a)-(b))>MGL_EPSILON && (a)-(a)==mreal(0.) && (b)-(b)==mreal(0.))
#define mgl_min(a,b) (((a)>(b)) ? (b) : (a))
#define mgl_max(a,b) (((a)>(b)) ? (a) : (b))
#define mgl_isnan(a) ((a)!=(a))
#define mgl_isnum(a) ((a)==(a))
#define mgl_isfin(a) ((a)-(a)==mreal(0.))
#define mgl_isbad(a) ((a)-(a)!=mreal(0.))
#define mgl_sign(a) ((a)<0 ? -1:1)
#define mgl_int(a) (long(a+((a)>=0 ? 0.5:-0.5)))
#endif
//-----------------------------------------------------------------------------
enum{ // types of predefined curvelinear coordinate systems
mglCartesian = 0, // no transformation
mglPolar,
mglSpherical,
mglParabolic,
mglParaboloidal,
mglOblate,
mglProlate,
mglElliptic,
mglToroidal,
mglBispherical,
mglBipolar,
mglLogLog,
mglLogX,
mglLogY
};
//-----------------------------------------------------------------------------
// types of drawing
#define MGL_DRAW_WIRE 0 // fastest, no faces
#define MGL_DRAW_FAST 1 // fast, no color interpolation
#define MGL_DRAW_NORM 2 // high quality, slower
#define MGL_DRAW_LMEM 4 // low memory usage (direct to pixel)
#define MGL_DRAW_DOTS 8 // draw dots instead of primitives
#define MGL_DRAW_NONE 9 // no ouput (for testing only)
//-----------------------------------------------------------------------------
enum{ // Codes for warnings/messages
mglWarnNone = 0,// Everything OK
mglWarnDim, // Data dimension(s) is incompatible
mglWarnLow, // Data dimension(s) is too small
mglWarnNeg, // Minimal data value is negative
mglWarnFile, // No file or wrong data dimensions
mglWarnMem, // Not enough memory
mglWarnZero, // Data values are zero
mglWarnLeg, // No legend entries
mglWarnSlc, // Slice value is out of range
mglWarnCnt, // Number of contours is zero or negative
mglWarnOpen, // Couldn't open file
mglWarnLId, // Light: ID is out of range
mglWarnSize, // Setsize: size(s) is zero or negative
mglWarnFmt, // Format is not supported for that build
mglWarnTern, // Axis ranges are incompatible
mglWarnNull, // Pointer is NULL
mglWarnSpc, // Not enough space for plot
mglScrArg, // Wrong argument(s) in MGL script
mglScrCmd, // Wrong command in MGL script
mglScrLong, // Too long line in MGL script
mglScrStr, // Unbalanced ' in MGL script
mglScrTemp, // Change temporary data in MGL script
mglWarnEnd // Maximal number of warnings (must be last)
};
//-----------------------------------------------------------------------------
#define MGL_DEF_PAL "bgrcmyhlnqeupH" // default palette
#define MGL_DEF_SCH "BbcyrR" // default palette
#define MGL_COLORS "kwrgbcymhWRGBCYMHlenpquLENPQU"
//-----------------------------------------------------------------------------
/// Brushes for mask with symbol "-+=;oOsS~<>jdD*^" correspondingly
extern uint64_t mgl_mask_val[16];
#define MGL_MASK_ID "-+=;oOsS~<>jdD*^"
#define MGL_SOLID_MASK 0xffffffffffffffff
//-----------------------------------------------------------------------------
#define MGL_TRANSP_NORM 0x000000
#define MGL_TRANSP_GLASS 0x000001
#define MGL_TRANSP_LAMP 0x000002
#define MGL_ENABLE_CUT 0x000004 ///< Flag which determines how points outside bounding box are drown.
#define MGL_ENABLE_RTEXT 0x000008 ///< Use text rotation along axis
#define MGL_AUTO_FACTOR 0x000010 ///< Enable autochange PlotFactor
#define MGL_ENABLE_ALPHA 0x000020 ///< Flag that Alpha is used
#define MGL_ENABLE_LIGHT 0x000040 ///< Flag of using lightning
#define MGL_TICKS_ROTATE 0x000080 ///< Allow ticks rotation
#define MGL_TICKS_SKIP 0x000100 ///< Allow ticks rotation
// flags for internal use only
#define MGL_DISABLE_SCALE 0x000200 ///< Temporary flag for disable scaling (used for axis)
#define MGL_FINISHED 0x000400 ///< Flag that final picture (i.e. mglCanvas::G) is ready
#define MGL_USE_GMTIME 0x000800 ///< Use gmtime instead of localtime
#define MGL_SHOW_POS 0x001000 ///< Switch to show or not mouse click position
#define MGL_CLF_ON_UPD 0x002000 ///< Clear plot before Update()
#define MGL_NOSUBTICKS 0x004000 ///< Disable subticks drawing (for bounding box)
#define MGL_LOCAL_LIGHT 0x008000 ///< Keep light sources for each inplot
#define MGL_VECT_FRAME 0x010000 ///< Use DrwDat to remember all data of frames
#define MGL_REDUCEACC 0x020000 ///< Reduce accuracy of points (to reduc size of output files)
#define MGL_PREFERVC 0x040000 ///< Prefer vertex color instead of texture if output format supports
#define MGL_ONESIDED 0x080000 ///< Render only front side of surfaces if output format supports (for debugging)
#define MGL_NO_ORIGIN 0x100000 ///< Don't draw tick labels at axis origin
#define MGL_GRAY_MODE 0x100000 ///< Convert all colors to gray ones
//-----------------------------------------------------------------------------
#if MGL_HAVE_C99_COMPLEX
#include <complex.h>
#if MGL_USE_DOUBLE
typedef double _Complex mdual;
#else
typedef float _Complex mdual;
#endif
#ifndef _Complex_I
#define _Complex_I 1.0i
#endif
const mdual mgl_I=_Complex_I;
#define mgl_abs(x) cabs(x)
#endif
#ifdef __cplusplus
#include <string>
#include <vector>
#if defined(IUP_MSC_VER)
template class MGL_EXPORT std::allocator<char>;
template class MGL_EXPORT std::allocator<wchar_t>;
template struct MGL_EXPORT std::char_traits<char>;
template struct MGL_EXPORT std::char_traits<wchar_t>;
template class MGL_EXPORT std::basic_string< char, std::char_traits<char>, std::allocator<char> >;
template class MGL_EXPORT std::basic_string< wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >;
template class MGL_EXPORT std::vector<long>;
template class MGL_EXPORT std::vector<mreal>;
#endif
//-----------------------------------------------------------------------------
extern float mgl_cos[360]; ///< contain cosine with step 1 degree
//-----------------------------------------------------------------------------
#include <complex>
#if defined(IUP_MSC_VER)
template class MGL_EXPORT std::complex<float>;
template class MGL_EXPORT std::complex<double>;
#endif
typedef std::complex<mreal> dual;
typedef std::complex<double> ddual;
#if !MGL_HAVE_C99_COMPLEX
#define mdual dual
#define mgl_I dual(0,1)
#define mgl_abs(x) abs(x)
#endif
//-----------------------------------------------------------------------------
extern "C" {
#else
#include <complex.h>
typedef double _Complex ddual;
#define dual mdual
#endif
/// Find length of wchar_t string (bypass standard wcslen bug)
double MGL_EXPORT_CONST mgl_hypot(double x, double y);
/// Find length of wchar_t string (bypass standard wcslen bug)
size_t MGL_EXPORT mgl_wcslen(const wchar_t *str);
/// Get RGB values for given color id or fill by -1 if no one found
void MGL_EXPORT mgl_chrrgb(char id, float rgb[3]);
/// Check if string contain color id and return its number
long MGL_EXPORT mgl_have_color(const char *stl);
/// Find symbol in string excluding {} and return its position or NULL
MGL_EXPORT const char *mglchr(const char *str, char ch);
/// Find any symbol from chr in string excluding {} and return its position or NULL
MGL_EXPORT const char *mglchrs(const char *str, const char *chr);
/// Set number of thread for plotting and data handling (for pthread version only)
void MGL_EXPORT mgl_set_num_thr(int n);
void MGL_EXPORT mgl_set_num_thr_(int *n);
void MGL_EXPORT mgl_test_txt(const char *str, ...);
void MGL_EXPORT mgl_set_test_mode(int enable);
/// Remove spaces at begining and at the end of the string
void MGL_EXPORT mgl_strtrim(char *str);
void MGL_EXPORT mgl_wcstrim(wchar_t *str);
/** Change register to lowercase (only for ANSI symbols) */
void MGL_EXPORT mgl_strlwr(char *str);
void MGL_EXPORT mgl_wcslwr(wchar_t *str);
/// Convert wchar_t* string into char* one
void MGL_EXPORT mgl_wcstombs(char *dst, const wchar_t *src, int size);
/// Clear internal data for speeding up FFT and Hankel transforms
void MGL_EXPORT mgl_clear_fft();
/// Set global warning message
void MGL_EXPORT mgl_set_global_warn(const char *text);
void MGL_EXPORT mgl_set_global_warn_(const char *text,int);
/// Get text of global warning message(s)
MGL_EXPORT const char *mgl_get_global_warn();
int MGL_EXPORT mgl_get_global_warn_(char *out, int len);
#ifdef __cplusplus
}
#endif
//-----------------------------------------------------------------------------
#endif
//-----------------------------------------------------------------------------