Alexey Balakin <balakin@appl.sci-nnov.ru>\r
\r
Some extensions was written by:\r
-Dmitriy Kulagin - autoconf/automake script\r
+Dmitriy Kulagin - cmake script\r
+Mikhail Vidassov - U3D/PDF/OBJ export\r
Mikhail Barg - Pascal/Delphi interface\r
Sergey Plis - Forth interface
\ No newline at end of file
MGL_DEPENDENT_OPTION(enable-hdf5 "Enable hdf5 support" OFF "NOT enable-lgpl" ON "NOT enable-all" ON)
CMAKE_DEPENDENT_OPTION(enable-pdf "Enable pdf support" OFF "NOT enable-all" ON)
CMAKE_DEPENDENT_OPTION(enable-gif "Enable gif support" OFF "NOT enable-all" ON)
-MGL_DEPENDENT_OPTION(enable-glut "Enable glut support" OFF "NOT enable-lgpl" ON "NOT enable-all-widgets" ON)
-MGL_DEPENDENT_OPTION(enable-fltk "Enable fltk widget" OFF "NOT enable-lgpl" ON "NOT enable-all-widgets" ON)
-CMAKE_DEPENDENT_OPTION(enable-wx "Enable wxWidget widget" OFF "NOT enable-lgpl" OFF)
-MGL_DEPENDENT_OPTION(enable-qt4 "Enable Qt4 widget" OFF "NOT enable-lgpl" ON "NOT enable-all-widgets" ON)
-MGL_DEPENDENT_OPTION(enable-qt5 "Enable Qt5 widget" OFF "NOT enable-lgpl" ON "NOT enable-all-widgets" ON)
+CMAKE_DEPENDENT_OPTION(enable-glut "Enable glut support" OFF "NOT enable-all-widgets" ON)
+CMAKE_DEPENDENT_OPTION(enable-fltk "Enable fltk widget" OFF "NOT enable-all-widgets" ON)
+CMAKE_DEPENDENT_OPTION(enable-wx "Enable wxWidget widget" OFF "NOT enable-all-widgets" ON)
+CMAKE_DEPENDENT_OPTION(enable-qt4 "Enable Qt4 widget" OFF "NOT enable-all-widgets" ON)
+CMAKE_DEPENDENT_OPTION(enable-qt5 "Enable Qt5 widget" OFF "NOT enable-all-widgets" ON)
CMAKE_DEPENDENT_OPTION(enable-qt5asqt "Set Qt5 as default libmgl-qt" ON "enable-qt5" OFF)
MGL_DEPENDENT_OPTION(enable-python "Enable python interface" OFF "NOT enable-lgpl" ON "NOT enable-all-swig" ON)
MGL_DEPENDENT_OPTION(enable-lua "Enable Lua (v.5.1) interface" OFF "NOT enable-lgpl" ON "NOT enable-all-swig" ON)
+2.2.2 Released ?? February 2014
+
+* Add mgl_region_3d() to draw region (or ribbon) between 2 curves. Correspondingly extend mglGraph::Region() function and MGL command 'region'.
+* Add mgl_datac_diffr() for calculation of one step of diffraction by finite-difference method
+* Improve export to TeX
+* Add missing functions to Fortran interface
+* Bugfix for legend with enabled lighting
+* Minor bugfixes and memory leaks
+
+
2.2.1 Released 22 January 2014
* Add Qt5 support.
MathGL is a free library of fast C++ routines for the plotting of the data \r
-varied in one or more dimensions. MathGL has more than 40 general types \r
+varied in one or more dimensions. MathGL has more than 50 general types \r
of graphics for 1d, 2d and 3d data arrays. It can export graphics to bitmap \r
-and vector (EPS or SVG) files. It has OpenGL interface and can be used from \r
+and vector (EPS, SVG etc) files. It has OpenGL interface and can be used from \r
console programs. It has functions for data handling and script MGL language \r
for simplification of data plotting. Also it has several types of transparency \r
and smoothed lightning, vector fonts and TeX-like symbol parsing, arbitrary \r
curvilinear coordinate system and many over useful things. Finally it is \r
-platform independent and free (under GPL v.2.0 license).\r
-\r
-MathGL can plot a wide range of graphics. It includes:\r
- * one-dimensional plots (Plot(), Area(), Bars(), Step(), Stem(), Torus(), \r
- Chart(), Error(), Tube(), Mark(), Text()), \r
- * two-dimensional plots (Mesh(), Surf(), Dens(), Cont(), ContF(), \r
- Boxs(), Axial(), Belt()),\r
- * three-dimensional plots (Dens3(), Cont3(), ContF3(), Surf3(), \r
- CloudQ(), CloudP()).\r
- * dual data plots: vector plot Vect() and VectC(), flow chart Flow(), \r
- mapping chart Map(), surface or isosurface transpared (SurfA(), Surf3A()) \r
- or colored (SurfC(), Surf3C()) by other data \r
- * and so on. See class mglGraph for detail.\r
-\r
-In fact, I created functions for drawing of all scientific plots that I know.\r
-The list of plots is enlarging, so if you need some special type of plot then \r
-write me e-mail (balakin@appl.sci-nnov.ru) and it will appear in new version.\r
-\r
-I tried to make plots as well-looking as possible: surface can be transparent \r
-and highlighted by several (up to 10) light sources. Most of drawing functions \r
-have 2 variants: simple one for the fast plotting of data, complex one for \r
-specifying of the exact position of plot (including parametric representation). \r
-Resulting image can be saved in bitmap (with the help of mglGraphZB, mglGraphGL) \r
-PNG, JPEG, TIFF format or in vector EPS or SVG format (with the help of \r
-mglGraphPS).\r
-\r
-All text are drawn by vector font, that allows high scalability and portability. \r
-Text may contain commands for: some of TeX-like symbols, changing index (upper \r
-or lower indexes) and style of font inside text string (see mglFont). Texts of \r
-ticks are rotated with axis rotation. It is possible to create a legend of plot \r
-and put text in arbitrary position of plot.\r
-\r
-Special class mglData is used for data incapsulation. Except safe creation and \r
-deletion of data arrays it includes functions for data processing (smoothing, \r
-differentiating, integrating, interpolating and so on) and reading of data \r
-files with automatic size determination. Class mglData can handle arrays with \r
-up to three dimensions (arrays which depend up to 3 independent indexes \r
-a[i,j,k]). Using an array with higher number of dimensions is not reasonable \r
-because I do not know how it can be plotted. Data filling and modifying may be \r
-fulfilled manually or by textual formulas.\r
-\r
-Class mglFormula allows the fast evaluation of a textual mathematical \r
-expression. It is based on string precompilation to tree-like code at creation \r
-of class instance. At evaluation stage code performs only fast tree-walk and \r
-returns the value of the expression. Except changing data values, textual \r
-formulas are used for drawing in \emph{arbitrary} curvilinear coordinates. \r
-A set of such curvilinear coordinates is limited only by user imagination \r
-but not a fixed list like polar, parabolic, spherical and so on.\r
-\r
+platform independent and free (under GPL v.2.0 or later license).\r
Installation instructions are provided in the manual (don't worry, it\r
is straightforward).\r
\r
+About LGPL and GPL licenses.\r
+Generally, MathGL is GPL library. However, you can use LGPL license for MathGL \r
+core and widget libraries if you don't use SWIG-based interfaces and disable GSL \r
+and HDF features. This can be done by using 'enable-lgpl' option at build time.\r
+However, I ask you to put the information of used MathGL version and link to \r
+MathGL website into "About" section of yours program.\r
+\r
CONTACTS\r
--------\r
MathGL was written by Alexey Balakin. You can contact me at \r
--- /dev/null
+find . -name '.svn' -print0 | xargs -0 rm -rf
+find . -name '*~' -print0 | xargs -0 rm -f
+rm ./clean-svn
{\r
mglParse par;\r
setlocale(LC_CTYPE, "");\r
- par.Execute(gr,"box\r\n\r\naxis");\r
+ par.Execute(gr,"new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)'\n\\r
+ new y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)'\n\\r
+ new z 50 40 '0.8*cos(pi*(y+1)/2)'\nlight on\n\\r
+ title 'parametric form':rotate 50 60:box\n\\r
+ surf x y z ''\nwrite '1.tex'");\r
+// par.Execute(gr,"light on:addlegend 'r' 'r':legend");\r
}\r
//-----------------------------------------------------------------------------\r
#if !defined(_MSC_VER) && !defined(__BORLANDC__)\r
#ifdef __cplusplus
//-----------------------------------------------------------------------------
/// Explicit scheme for 1 step of axial diffraction
-int MGL_EXPORT mgl_difr_axial(dual *a, int n, dual q, int Border,dual *b, dual *d, int kk, double di);
+void MGL_EXPORT mgl_difr_axial(dual *a,int n,int step,dual q,int Border,dual *tmp,int kk, double di);
/// Explicit scheme for 1 step of plane diffraction
-int MGL_EXPORT mgl_difr_grid(dual *a,int n,dual q,int Border,dual *b,dual *d,int kk);
+void MGL_EXPORT mgl_difr_grid(dual *a,int n,int step,dual q,int Border,dual *tmp,int kk);
//-----------------------------------------------------------------------------
extern "C" {
#endif
mreal b[9];\r
mreal x,y,z,pf;\r
bool norot; // flag to disable pnts rotation\r
- mglMatrix() { clear(); }\r
+ mglMatrix() { memset(this,0,sizeof(mglMatrix)); clear(); }\r
void Rotate(mreal tetz,mreal tetx,mreal tety);\r
void RotateN(mreal Tet,mreal x,mreal y,mreal z);\r
inline void clear() { x=y=z=pf=0; memset(b,0,9*sizeof(mreal)); b[0]=b[4]=b[8]=1; norot=false; }\r
void MGL_EXPORT mgl_axis_grid_(uintptr_t *gr, const char *dir,const char *pen, const char *opt,int,int,int);\r
/// Print the label text for axis dir.\r
void MGL_EXPORT mgl_label(HMGL gr, char dir, const char *text, double pos, const char *opt);\r
-void MGL_EXPORT mgl_label_(uintptr_t *gr, const char *dir, const char *text, const char *opt,int,int,int);\r
+void MGL_EXPORT mgl_label_(uintptr_t *gr, const char *dir, const char *text, mreal *pos, const char *opt,int,int,int);\r
void MGL_EXPORT mgl_labelw(HMGL gr, char dir, const wchar_t *text, double pos, const char *opt);\r
\r
/// Draw colorbar at edge of axis\r
void MGL_EXPORT mgl_columnplot_(uintptr_t *gr, int *num, int *i, mreal *d);\r
/// Put further plotting in matrix cell of previous subplot/inplot.\r
void MGL_EXPORT mgl_gridplot(HMGL gr, int nx, int ny, int m, double d);\r
-void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *i, mreal *d);\r
+void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *m, mreal *d);\r
/// Put further plotting in cell of stick rotated on angles tet, phi.\r
void MGL_EXPORT mgl_stickplot(HMGL gr, int num, int ind, double tet, double phi);\r
void MGL_EXPORT mgl_stickplot_(uintptr_t *gr, int *num, int *i, mreal *tet, mreal *phi);\r
void MGL_EXPORT mgl_data_fill_sample_(uintptr_t *dat, const char *how,int);\r
/// Find correlation between 2 data arrays\r
HMDT MGL_EXPORT mgl_data_correl(HCDT dat1, HCDT dat2, const char *dir);\r
-uintptr_t MGL_EXPORT mgl_data_correl_(uintptr_t dat1, uintptr_t dat2, const char *dir,int);\r
+uintptr_t MGL_EXPORT mgl_data_correl_(uintptr_t *dat1, uintptr_t *dat2, const char *dir,int);\r
\r
/// Allocate and prepare data for Fourier transform by nthr threads\r
MGL_EXPORT void *mgl_fft_alloc(long n, void **space, long nthr);\r
void MGL_EXPORT mgl_delete_expr_(uintptr_t *ex);\r
/// Return value of expression for given x,y,z variables\r
double MGL_EXPORT mgl_expr_eval(HMEX ex, double x, double y,double z);\r
-double MGL_EXPORT mgl_eval_expr_(uintptr_t *ex, mreal *x, mreal *y, mreal *z);\r
+double MGL_EXPORT mgl_expr_eval_(uintptr_t *ex, mreal *x, mreal *y, mreal *z);\r
/// Return value of expression for given variables\r
double MGL_EXPORT mgl_expr_eval_v(HMEX ex, mreal *vars);\r
/// Return value of expression differentiation over variable dir for given x,y,z variables\r
double MGL_EXPORT mgl_expr_diff(HMEX ex, char dir, double x, double y,double z);\r
-double MGL_EXPORT mgl_diff_expr_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int);\r
+double MGL_EXPORT mgl_expr_diff_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int);\r
/// Return value of expression differentiation over variable dir for given variables\r
double MGL_EXPORT mgl_expr_diff_v(HMEX ex, char dir, mreal *vars);\r
\r
inline void Hankel(const char *dir) { mgl_datac_hankel(this,dir); }\r
/// Fourier transform\r
inline void FFT(const char *dir) { mgl_datac_fft(this,dir); }\r
+ /// Calculate one step of diffraction by finite-difference method with parameter q\r
+ inline void Diffraction(const char *how, mreal q) { mgl_datac_diffr(this,how,q); }\r
\r
/// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
inline dual Spline(mreal x,mreal y=0,mreal z=0) const\r
double MGL_EXPORT mgl_rnd();\r
/// Get integer power of x\r
dual MGL_EXPORT mgl_ipowc(dual x,int n);\r
+dual MGL_EXPORT mgl_ipowc_(dual *x,int *n);\r
/// Get exp(i*a)\r
dual MGL_EXPORT mgl_expi(dual a);\r
\r
void MGL_EXPORT mgl_datac_set_matrix(HADT dat, gsl_matrix *m);\r
/// Set value of data element [i,j,k]\r
void MGL_EXPORT mgl_datac_set_value(HADT dat, dual v, long i, long j, long k);\r
-void MGL_EXPORT mgl_datac_set_value_(uintptr_t *d, mreal *v, int *i, int *j, int *k);\r
+void MGL_EXPORT mgl_datac_set_value_(uintptr_t *d, dual *v, int *i, int *j, int *k);\r
/// Get value of data element [i,j,k]\r
dual MGL_EXPORT mgl_datac_get_value(HCDT dat, long i, long j, long k);\r
+dual MGL_EXPORT mgl_datac_get_value_(uintptr_t *d, int *i, int *j, int *k);\r
/// Allocate memory and scanf the data from the string\r
void MGL_EXPORT mgl_datac_set_values(HADT dat, const char *val, long nx, long ny, long nz);\r
void MGL_EXPORT mgl_datac_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l);\r
int MGL_EXPORT mgl_datac_read_range_(uintptr_t *d, const char *fname, mreal *from, mreal *to, mreal *step, int *as_slice,int l);\r
/// Read data from tab-separated text files with auto determining size which filenames are satisfied to template (like "t_*.dat")\r
int MGL_EXPORT mgl_datac_read_all(HADT dat, const char *templ, int as_slice);\r
-int MGL_EXPORT mgl_data_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l);\r
+int MGL_EXPORT mgl_datac_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l);\r
/// Save whole data array (for ns=-1) or only ns-th slice to text file\r
void MGL_EXPORT mgl_datac_save(HCDT dat, const char *fname,long ns);\r
void MGL_EXPORT mgl_datac_save_(uintptr_t *dat, const char *fname,int *ns,int);\r
void MGL_EXPORT mgl_datac_set_id_(uintptr_t *dat, const char *id,int l);\r
/// Equidistantly fill the data to range [x1,x2] in direction dir\r
void MGL_EXPORT mgl_datac_fill(HADT dat, dual x1,dual x2,char dir);\r
-void MGL_EXPORT mgl_datac_fill_(uintptr_t *dat, mreal *x1,mreal *x2,const char *dir,int);\r
+void MGL_EXPORT mgl_datac_fill_(uintptr_t *dat, dual *x1,dual *x2,const char *dir,int);\r
/// Modify the data by specified formula assuming x,y,z in range [r1,r2]\r
void MGL_EXPORT mgl_datac_fill_eq(HMGL gr, HADT dat, const char *eq, HCDT vdat, HCDT wdat,const char *opt);\r
void MGL_EXPORT mgl_datac_fill_eq_(uintptr_t *gr, uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,const char *opt, int, int);\r
void MGL_EXPORT mgl_datac_mirror_(uintptr_t *dat, const char *dir,int);\r
/// Crop the data\r
void MGL_EXPORT mgl_datac_crop(HADT dat, long n1, long n2, char dir);\r
-void MGL_EXPORT mgl_data_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int);\r
+void MGL_EXPORT mgl_datac_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int);\r
\r
/// Apply Hankel transform\r
void MGL_EXPORT mgl_datac_hankel(HADT dat, const char *dir);\r
void MGL_EXPORT mgl_datac_fft_(uintptr_t *dat, const char *dir,int);\r
/// Find correlation between 2 data arrays\r
HADT MGL_EXPORT mgl_datac_correl(HCDT dat1, HCDT dat2, const char *dir);\r
-uintptr_t MGL_EXPORT mgl_datac_correl_(uintptr_t dat1, uintptr_t dat2, const char *dir,int);\r
+uintptr_t MGL_EXPORT mgl_datac_correl_(uintptr_t *dat1, uintptr_t *dat2, const char *dir,int);\r
+/// Calculate one step of diffraction by finite-difference method with parameter q\r
+void MGL_EXPORT mgl_datac_diffr(HADT dat, const char *how, mreal q);\r
+void MGL_EXPORT mgl_datac_diffr_(uintptr_t *d, const char *how, double q,int l);\r
\r
HMDT MGL_EXPORT mgl_datac_real(HCDT dat);\r
uintptr_t MGL_EXPORT mgl_datac_real_(uintptr_t *dat);\r
//-----------------------------------------------------------------------------\r
/// Create HAEX object for expression evaluating\r
HAEX MGL_EXPORT mgl_create_cexpr(const char *expr);\r
+uintptr_t MGL_EXPORT mgl_create_cexpr_(const char *expr, int);\r
/// Delete HAEX object\r
void MGL_EXPORT mgl_delete_cexpr(HAEX ex);\r
+void MGL_EXPORT mgl_delete_cexpr_(uintptr_t *ex);\r
/// Return value of expression for given x,y,z variables\r
dual MGL_EXPORT mgl_cexpr_eval(HAEX ex, dual x, dual y,dual z);\r
+dual MGL_EXPORT mgl_cexpr_eval_(uintptr_t *ex, dual *x, dual *y, dual *z);\r
/// Return value of expression for given variables\r
dual MGL_EXPORT mgl_cexpr_eval_v(HAEX ex, dual *vars);\r
\r
//-----------------------------------------------------------------------------\r
#include "mgl2/config.h"\r
#ifndef SWIG\r
+\r
#include "mgl2/dllexport.h"\r
+#ifdef MGL_SRC\r
#if MGL_HAVE_OMP\r
#include <omp.h>\r
#endif\r
#endif\r
\r
-#define MGL_VER2 2.1 // minor version of MathGL 2.* (like 1.3 for v.2.1.3)\r
+#endif\r
+\r
+#define MGL_VER2 2.2 // minor version of MathGL 2.* (like 1.3 for v.2.1.3)\r
//-----------------------------------------------------------------------------\r
#ifdef WIN32 //_MSC_VER needs this before math.h\r
#define _USE_MATH_DEFINES\r
#endif\r
#endif\r
\r
-#if defined(_MSC_VER) || defined(__BORLANDC__)\r
+#if (defined(_MSC_VER) && (_MSC_VER<1600)) || defined(__BORLANDC__)\r
typedef signed char int8_t;\r
typedef signed short int16_t;\r
typedef signed long int32_t;\r
#endif\r
#endif\r
/// Find length of wchar_t string (bypass standard wcslen bug)\r
+double MGL_EXPORT mgl_hypot(double x, double y);\r
+/// Find length of wchar_t string (bypass standard wcslen bug)\r
size_t MGL_EXPORT mgl_wcslen(const wchar_t *str);\r
/// Get RGB values for given color id or fill by -1 if no one found\r
void MGL_EXPORT mgl_chrrgb(char id, float rgb[3]);\r
const char *mglchr(const char *str, char ch);\r
/// Find any symbol from chr in string excluding {} and return its position or NULL\r
const char *mglchrs(const char *str, const char *chr);\r
-/// Set number of thread for plotting and data handling\r
+/// Set number of thread for plotting and data handling (for pthread version only)\r
void MGL_EXPORT mgl_set_num_thr(int n);\r
+void MGL_EXPORT mgl_set_num_thr_(int *n);\r
void MGL_EXPORT mgl_test_txt(const char *str, ...);\r
void MGL_EXPORT mgl_set_test_mode(int enable);\r
/// Remove spaces at begining and at the end of the string\r
#endif\r
void _mgl_key_up(unsigned char ch,int ,int );\r
HMGL MGL_EXPORT mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p));\r
+\r
+\r
+/// Switch on/off transparency (do not overwrite user settings)\r
+void MGL_EXPORT mgl_glut_toggle_alpha(HMGL gr);\r
+/// Switch on/off lighting (do not overwrite user settings)\r
+void MGL_EXPORT mgl_glut_toggle_light(HMGL gr);\r
+/// Switch off all zooming and rotation\r
+void MGL_EXPORT mgl_glut_toggle_no(HMGL gr);\r
+/// Update picture by calling user drawing function\r
+void MGL_EXPORT mgl_glut_update(HMGL gr);\r
+/// Reload user data and update picture\r
+void MGL_EXPORT mgl_glut_reload(HMGL gr);\r
+/// Show next frame (if one)\r
+void MGL_EXPORT mgl_glut_next_frame(HMGL gr);\r
+/// Show previous frame (if one)\r
+void MGL_EXPORT mgl_glut_prev_frame(HMGL gr);\r
+/// Run slideshow (animation) of frames\r
+void MGL_EXPORT mgl_glut_animation(HMGL gr);\r
+\r
#ifdef __cplusplus\r
}\r
//-----------------------------------------------------------------------------\r
{ gr = mgl_create_graph_glut(draw?mgl_draw_graph:0,title,(void*)draw,0); }\r
mglGLUT(mglDraw *draw=0, const char *title="MathGL") : mglGraph(-1)\r
{ gr = mgl_create_graph_glut(draw?mgl_draw_class:0,title,draw,mgl_reload_class); }\r
+\r
+ inline void ToggleAlpha() ///< Switch on/off transparency (do not overwrite user settings)\r
+ { mgl_glut_toggle_alpha(gr); }\r
+ inline void ToggleLight() ///< Switch on/off lighting (do not overwrite user settings)\r
+ { mgl_glut_toggle_light(gr); }\r
+ inline void ToggleNo() ///< Switch off all zooming and rotation\r
+ { mgl_glut_toggle_no(gr); }\r
+ inline void Update() ///< Update picture by calling user drawing function\r
+ { mgl_glut_update(gr); }\r
+ inline void ReLoad() ///< Reload user data and update picture\r
+ { mgl_glut_reload(gr); }\r
+ inline void NextFrame() ///< Show next frame (if one)\r
+ { mgl_glut_next_frame(gr); }\r
+ inline void PrevFrame() ///< Show previous frame (if one)\r
+ { mgl_glut_prev_frame(gr); }\r
+ inline void Animation() ///< Run slideshow (animation) of frames\r
+ { mgl_glut_animation(gr); }\r
};\r
//-----------------------------------------------------------------------------\r
#endif\r
{ mgl_region(gr, &y1, &y2, pen, opt); }\r
inline void Region(const mglDataA &x, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="")\r
{ mgl_region_xy(gr, &x, &y1, &y2, pen, opt); }\r
+ /// Fill area (draw ribbon) between curves {x1,y1,z1} and {x2,y2,z2}\r
+ inline void Region(const mglDataA &x1, const mglDataA &y1, const mglDataA &z1, const mglDataA &x2, const mglDataA &y2, const mglDataA &z2, const char *pen="", const char *opt="")\r
+ { mgl_region_3d(gr, &x1, &y1, &z1, &x2, &y2, &z2, pen, opt); }\r
+ inline void Region(const mglDataA &x1, const mglDataA &y1, const mglDataA &x2, const mglDataA &y2, const char *pen="", const char *opt="")\r
+ { mgl_region_3d(gr, &x1, &y1, NULL, &x2, &y2, NULL, pen, opt); }\r
/// Draw vertical lines from points {x,y,z} to axis plane\r
inline void Stem(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="")\r
{ mgl_stem_xyz(gr, &x, &y, &z, pen, opt); }\r
void MGL_EXPORT mgl_area(HMGL graph, HCDT y, const char *pen, const char *opt);\r
void MGL_EXPORT mgl_area_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int);\r
\r
+/// Fill area (draw ribbon) between curves {x1,y1,z1} and {x2,y2,z2}\r
+void MGL_EXPORT mgl_region_3d(HMGL graph, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT y2, HCDT z2, const char *pen, const char *opt);\r
+void MGL_EXPORT mgl_region_3d_(uintptr_t *graph, uintptr_t *x1, uintptr_t *y1, uintptr_t *z1, uintptr_t *x2, uintptr_t *y2, uintptr_t *z2, const char *pen, const char *opt,int,int);\r
/// Fill area between curves {x,y1} and {x,y2}\r
void MGL_EXPORT mgl_region_xy(HMGL graph, HCDT x, HCDT y1, HCDT y2, const char *pen, const char *opt);\r
void MGL_EXPORT mgl_region_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int, int);\r
void MGL_EXPORT mgl_cones_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int);\r
/// Draw cones from points {x,z} to axis plane\r
void MGL_EXPORT mgl_cones_xz(HMGL graph, HCDT x, HCDT z, const char *pen, const char *opt);\r
-void MGL_EXPORT mgl_coners_xz_(uintptr_t *graph, uintptr_t *x, uintptr_t *z, const char *pen, const char *opt,int,int);\r
+void MGL_EXPORT mgl_cones_xz_(uintptr_t *graph, uintptr_t *x, uintptr_t *z, const char *pen, const char *opt,int,int);\r
/// Draw cones from points {x,z} with x in x-axis range to axis plane\r
void MGL_EXPORT mgl_cones(HMGL graph, HCDT z, const char *pen, const char *opt);\r
void MGL_EXPORT mgl_cones_(uintptr_t *graph, uintptr_t *z, const char *pen, const char *opt,int,int);\r
inline mglPoint operator^(const mglPoint &a, const mglPoint &b)
{ return mglPoint(a.y*b.z-a.z*b.y, a.z*b.x-a.x*b.z, a.x*b.y-a.y*b.x); }
inline mglPoint operator!(const mglPoint &a)
-{ mreal f=hypot(a.x,a.y); return f==0?mglPoint(0.,1.,0.):mglPoint(-a.y/f, a.x/f, 0); }
+{ mreal f=mgl_hypot(a.x,a.y); return f==0?mglPoint(0.,1.,0.):mglPoint(-a.y/f, a.x/f, 0); }
inline bool operator==(const mglPoint &a, const mglPoint &b)
{ return !memcmp(&a, &b, sizeof(mglPoint)); }
inline bool operator!=(const mglPoint &a, const mglPoint &b)
#include "mgl2/addon.h"
#include "mgl2/data.h"
//-----------------------------------------------------------------------------
-dual MGL_EXPORT mgl_expi(dual a) { return exp(dual(0,1)*a); }
-//-----------------------------------------------------------------------------
void MGL_EXPORT mgl_strcls(char *str)
{
size_t len = strlen(str),i,n;
return fp;
}
//-----------------------------------------------------------------------------
-int MGL_EXPORT mgl_difr_grid(dual *a,int n,dual q,int Border,dual *b,dual *d,int kk)
+void MGL_EXPORT mgl_difr_grid(dual *a,int n,int step,dual q,int Border,dual *tmp,int kk)
{
- // if(n<=0 || q>=0.5) return false;
- dual adt = dual(0.,1.)*q;
-
- memcpy(b,a,n*sizeof(dual));
+ const dual adt = dual(0.,1.)*q;
+ dual *b = tmp, *d = tmp+n;
+ if(step==1) memcpy(b,a,n*sizeof(dual));
+ else for(long i=0;i<n;i++) b[i] = a[i*step];
for(long k=kk;k>0;k--) // 3 iterations
{
-#pragma omp parallel for
+//#pragma omp parallel for
for(long i=1;i<n-1;i++)
- d[i] = a[i] + adt*(b[i-1]+b[i+1]-mreal(2)*b[i])/mreal(k);
+ d[i] = a[i*step] + adt*(b[i-1]+b[i+1]-mreal(2)*b[i])/mreal(k);
memcpy(b,d,n*sizeof(dual));
switch(Border)
{
b[n-1] = b[n-4]+mreal(3)*(b[n-2]-b[n-3]);
break;
case -1: // exponent at border
+ case 4:
b[0] = norm(b[2])<norm(b[1]) ? b[1] : b[1]*b[1]/b[2];
b[n-1] = norm(b[n-3])<norm(b[n-2]) ? b[n-2] : b[n-2]*b[n-2]/b[n-3];
break;
case -2: // gaussian at border
+ case 5:
b[0] = norm(b[2])<norm(b[1]) ? b[3] : pow(b[1]/b[2],3)*b[3];
b[n-1] = norm(b[n-3])<norm(b[n-2]) ? b[n-4] : pow(b[n-2]/b[n-3],3)*b[n-4];
break;
}
}
- memcpy(a,b,n*sizeof(dual));
- return true;
+ if(step==1) memcpy(a,b,n*sizeof(dual));
+ else for(long i=0;i<n;i++) a[i*step] = b[i];
}
//-----------------------------------------------------------------------------
-int MGL_EXPORT mgl_difr_axial(dual *a, int n, dual q, int Border,dual *b, dual *d, int kk, double di)
+void MGL_EXPORT mgl_difr_axial(dual *a,int n,int step,dual q,int Border,dual *tmp,int kk, double di)
{
int ii = di<0 ? -int(floor(di)) : 0;
- dual adt = dual(0.,1.)*q;
register mreal ff= di==floor(di) ? 4. : 2.;
-
- memcpy(b,a,n*sizeof(dual));
+ const dual adt = dual(0.,1.)*q;
+ dual *b = tmp, *d = tmp+n;
+ if(step==1) memcpy(b,a,n*sizeof(dual));
+ else for(long i=0;i<n;i++) b[i] = a[i*step];
for(long k=kk;k>0;k--) // kk iterations
{
d[ii] = a[ii] + adt*(b[ii+1]-b[ii])*(ff/k);
-#pragma omp parallel for
+//#pragma omp parallel for
for(long i=ii+1;i<n-1;i++)
{
register mreal dd = i+di;
dd = 1./(sqrt(dd*dd+1.)+dd); // corrections for "axiality"
register mreal gg = 1+dd*dd;
- d[i] = a[i] + adt*( b[i-1]*((gg-dd)/k) -
+ d[i] = a[i*step] + adt*( b[i-1]*((gg-dd)/k) -
b[i]*(2*gg/k) + b[i+1]*((gg+dd)/k) );
}
memcpy(b,d,n*sizeof(dual));
break;
}
}
- memcpy(a,b,n*sizeof(dual));
- return true;
+ if(step==1) memcpy(a,b,n*sizeof(dual));
+ else for(long i=0;i<n;i++) a[i*step] = b[i];
}
//-----------------------------------------------------------------------------
double MGL_EXPORT mgl_gauss_rnd()
// if no one then let add it\r
long k;\r
#pragma omp critical(glf)\r
- {MGL_PUSH(Glf,g,mutexGlf); k=Glf.size()-1;} return k;\r
+ {k=Glf.size(); MGL_PUSH(Glf,g,mutexGlf);} return k;\r
}\r
//-----------------------------------------------------------------------------\r
// Add points to the buffer\r
// scl&4 -- ???\r
// scl&8 -- bypass palette for enabling alpha\r
if(mgl_isnan(c) || mgl_isnan(a)) return -1;\r
- bool norefr = mgl_isnan(n.x) && mgl_isnan(n.y);\r
+ bool norefr = mgl_isnan(n.x) && mgl_isnan(n.y) && !mgl_isnan(n.z);\r
if(scl>0) ScalePoint(mat,p,n,!(scl&2));\r
if(mgl_isnan(p.x)) return -1;\r
a = (a>=0 && a<=1) ? a : AlphaDef;\r
if(mat->norot) q.sub=-1; // NOTE: temporary -- later should be mglInPlot here\r
long k;\r
#pragma omp critical(pnt)\r
- {MGL_PUSH(Pnt,q,mutexPnt); k=Pnt.size()-1;} return k;\r
+ {k=Pnt.size(); MGL_PUSH(Pnt,q,mutexPnt);} return k;\r
}\r
//-----------------------------------------------------------------------------\r
long mglBase::CopyNtoC(long from, mreal c)\r
if(mgl_isnum(c)) { p.c=c; p.t=0; Txt[long(c)].GetC(c,0,p); }\r
long k;\r
#pragma omp critical(pnt)\r
- {MGL_PUSH(Pnt,p,mutexPnt); k=Pnt.size()-1;} return k;\r
+ {k=Pnt.size(); MGL_PUSH(Pnt,p,mutexPnt);} return k;\r
}\r
//-----------------------------------------------------------------------------\r
long mglBase::CopyProj(long from, mglPoint p, mglPoint n)\r
q.u = n.x; q.v = n.y; q.w = n.z;\r
long k;\r
#pragma omp critical(pnt)\r
- {MGL_PUSH(Pnt,q,mutexPnt); k=Pnt.size()-1;} return k;\r
+ {k=Pnt.size(); MGL_PUSH(Pnt,q,mutexPnt);} return k;\r
}\r
//-----------------------------------------------------------------------------\r
void mglBase::Reserve(long n)\r
if(TernAxis&4) n*=4;\r
#pragma omp critical(pnt)\r
Pnt.reserve(n);\r
+#pragma omp critical(prm)\r
+ Prm.reserve(n);\r
}\r
//-----------------------------------------------------------------------------\r
// Boundaries and scaling\r
-//---------------------------------------------------------------------------\r
+//-----------------------------------------------------------------------------\r
bool mglBase::RecalcCRange()\r
{\r
bool wrong=false;\r
// fill texture itself\r
mreal v=sm?(n-1)/255.:n/256.;\r
if(!sm)\r
-#pragma omp parallel for\r
+//#pragma omp parallel for // remove parallel here due to possible race conditions for v<1\r
for(long i=0;i<256;i++)\r
{\r
register long j = 2*long(v*i); //u-=j;\r
// create new one\r
long k;\r
#pragma omp critical(txt)\r
- {MGL_PUSH(Txt,t,mutexTxt); k=Txt.size()-1;} return k;\r
+ {k=Txt.size(); MGL_PUSH(Txt,t,mutexTxt);} return k;\r
}\r
//-----------------------------------------------------------------------------\r
mreal mglBase::AddTexture(mglColor c)\r
for(long i=0;i<MGL_TEXTURE_COLOURS;i++) t.col[i]=c;\r
long k;\r
#pragma omp critical(txt)\r
- {MGL_PUSH(Txt,t,mutexTxt); k=Txt.size()-1;} return k;\r
+ {k=Txt.size(); MGL_PUSH(Txt,t,mutexTxt);} return k;\r
}\r
//-----------------------------------------------------------------------------\r
// Coloring and palette\r
void MGL_EXPORT mgl_set_mark_size_(uintptr_t *gr, mreal *size) { _GR_->SetMarkSize(*size); }\r
void MGL_EXPORT mgl_set_arrow_size_(uintptr_t *gr, mreal *size) { _GR_->SetArrowSize(*size); }\r
void MGL_EXPORT mgl_set_font_size_(uintptr_t *gr, mreal *size) { _GR_->SetFontSize(*size); }\r
-void MGL_EXPORT mgl_set_font_def_(uintptr_t *gr, char *name, int l)\r
+void MGL_EXPORT mgl_set_font_def_(uintptr_t *gr, const char *name, int l)\r
{ char *s=new char[l+1]; memcpy(s,name,l); s[l]=0;\r
_GR_->SetFontDef(s); delete []s; }\r
void MGL_EXPORT mgl_load_font_(uintptr_t *gr, char *name, char *path, int l,int n)\r
mglPrim a(6); a.n1 = p;\r
a.n2 = int(255*mc.r) + 256*(int(255*mc.g) + 256*int(255*mc.b));\r
mglText txt(text,font);\r
- Ptx.push_back(txt); a.n3 = Ptx.size()-1;\r
+ a.n3 = Ptx.size(); Ptx.push_back(txt);\r
a.s = size; a.w = shift; a.p=ftet;\r
add_prim(a);\r
}\r
pt = q; pp = mglPoint(d,-h*0.4); PostScale(&Bt,pp);\r
pt.x=pt.xx=pp.x; pt.y=pt.yy=pp.y;\r
#pragma omp critical(pnt)\r
- {MGL_PUSH(Pnt,pt,mutexPnt); k1=Pnt.size()-1;}\r
+ {k1=Pnt.size(); MGL_PUSH(Pnt,pt,mutexPnt);}\r
pt = q; pp = mglPoint(w+d,-h*0.4); PostScale(&Bt,pp);\r
pt.x=pt.xx=pp.x; pt.y=pt.yy=pp.y;\r
#pragma omp critical(pnt)\r
- {MGL_PUSH(Pnt,pt,mutexPnt); k2=Pnt.size()-1;}\r
+ {k2=Pnt.size(); MGL_PUSH(Pnt,pt,mutexPnt);}\r
pt = q; pp = mglPoint(d,h*1.2); PostScale(&Bt,pp);\r
pt.x=pt.xx=pp.x; pt.y=pt.yy=pp.y;\r
#pragma omp critical(pnt)\r
- {MGL_PUSH(Pnt,pt,mutexPnt); k3=Pnt.size()-1;}\r
+ {k3=Pnt.size(); MGL_PUSH(Pnt,pt,mutexPnt);}\r
pt = q; pp = mglPoint(w+d,h*1.2); PostScale(&Bt,pp);\r
pt.x=pt.xx=pp.x; pt.y=pt.yy=pp.y;\r
#pragma omp critical(pnt)\r
- {MGL_PUSH(Pnt,pt,mutexPnt); k4=Pnt.size()-1;}\r
+ {k4=Pnt.size(); MGL_PUSH(Pnt,pt,mutexPnt);}\r
line_plot(k1,k2); line_plot(k1,k3);\r
line_plot(k4,k2); line_plot(k4,k3);\r
mreal bl = AddTexture('w');\r
x += B.x-iw/2+dx; y += B.y-ih/2+dy;\r
// draw it\r
long k1=0,k2=0,k3=0,k4=0;\r
- mglPoint p,q=mglPoint(NAN);\r
+ mglPoint p,q=mglPoint(NAN,NAN,NAN);\r
\r
for(i=0;ff[i] && ff[i]!=':';i++) if(strchr(MGL_COLORS,ff[i]))\r
{\r
char col = mglGetStyle(stl,0,&align); align = align&3;\r
if(col==0) col = 'k';\r
mreal y=inY+inH-h;\r
- mglPoint p(inX + inW*align/2.,y,3*Depth),q(NAN);\r
+ mglPoint p(inX + inW*align/2.,y,3*Depth),q(NAN,NAN,NAN);\r
mglMatrix M=B; M.norot=true;\r
if(title) text_plot(AddPnt(&M,p,-1,q,-1,0),title,stl,size);\r
if(box) // draw boungind box\r
mglCanvas *g = dynamic_cast<mglCanvas *>(gr);\r
if(g) g->InPlot(ix*wx,wx*(ix+1-dd),1-wy*(iy+1-dd),1-iy*wy,true);\r
}\r
+void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *m, mreal *d)\r
+{ mgl_gridplot(_GR_,*nx,*ny,*m,*d); }\r
//-----------------------------------------------------------------------------\r
void MGL_EXPORT mgl_stickplot(HMGL gr, int num, int i, double tet, double phi)\r
{ mglCanvas *g = dynamic_cast<mglCanvas *>(gr); if(g) g->StickPlot(num, i, tet, phi); }\r
char *p=new char[n+1]; memcpy(p,pen,n); p[n]=0;\r
char *o=new char[m+1]; memcpy(o,opt,m); o[m]=0;\r
_GR_->Grid(s,p,o); delete []s; delete []p; delete []o; }\r
- void MGL_EXPORT mgl_label_(uintptr_t *gr, const char *dir, const char *text, mreal *pos, const char *opt,int,int l,int m)\r
+void MGL_EXPORT mgl_label_(uintptr_t *gr, const char *dir, const char *text, mreal *pos, const char *opt,int,int l,int m)\r
{ char *s=new char[l+1]; memcpy(s,text,l); s[l]=0;\r
char *o=new char[m+1]; memcpy(o,opt,m); o[m]=0;\r
_GR_->Label(*dir, s, *pos, o); delete []s; delete []o; }\r
}\r
}\r
//-----------------------------------------------------------------------------\r
+dual MGL_EXPORT mgl_expi(dual a) { return exp(dual(0,1)*a); }\r
+//-----------------------------------------------------------------------------\r
MGL_NO_EXPORT void *mgl_csmth_x(void *par)\r
{\r
mglThreadC *t=(mglThreadC *)par;\r
void MGL_EXPORT mgl_datac_put_dat_(uintptr_t *d, uintptr_t *val, int *i, int *j, int *k)\r
{ mgl_datac_put_dat(_DC_,_DA_(val), *i,*j,*k); }\r
//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_difr_grid(dual *a,int n,int step,dual q,int Border,dual *tmp,int kk);\r
+void MGL_EXPORT mgl_difr_axial(dual *a,int n,int step,dual q,int Border,dual *tmp,int kk, double di);\r
+//-----------------------------------------------------------------------------\r
+MGL_NO_EXPORT void *mgl_difr(void *par)\r
+{\r
+ mglThreadC *t=(mglThreadC *)par;\r
+ long n=t->p[0], st=t->p[1], bord=t->p[3], nn=t->n;\r
+ dual *b=t->a, q = *(t->b);\r
+#if !MGL_HAVE_PTHREAD\r
+#pragma omp parallel\r
+#endif\r
+ {\r
+ dual *tmp = new dual[2*n];\r
+ if(t->p[2])\r
+#if !MGL_HAVE_PTHREAD\r
+#pragma omp for\r
+#endif\r
+ for(long i=t->id;i<nn;i+=mglNumThr)\r
+ mgl_difr_axial(b + ((i%st)+n*(i/st)), n,st, q, bord,tmp,3,0);\r
+ else\r
+#if !MGL_HAVE_PTHREAD\r
+#pragma omp for\r
+#endif\r
+ for(long i=t->id;i<nn;i+=mglNumThr)\r
+ mgl_difr_grid(b + ((i%st)+n*(i/st)), n,st, q, bord,tmp,3);\r
+ delete []tmp;\r
+ }\r
+ return 0;\r
+}\r
+void MGL_EXPORT mgl_datac_diffr(HADT d, const char *how, mreal q)\r
+{\r
+ if(!how || *how==0) return;\r
+ long nx=d->nx,ny=d->ny,nz=d->nz,nn=nx*ny*nz,ll=strlen(how);\r
+ long p[4]={0,0,(mglchr(how,'a')||mglchr(how,'r'))?1:0,0};\r
+ dual qq=q;\r
+ for(long i=0;i<ll;i++) if(how[i]>='0' && how[i]<='9') p[3] = how[i]-'0';\r
+ if(mglchr(how,'z') && nz>1)\r
+ {\r
+ p[0]=nz; p[1]=nx*ny;\r
+ mglStartThreadC(mgl_difr,0,nx*ny,0,&qq,0,p);\r
+ }\r
+ if(mglchr(how,'y') && ny>1)\r
+ {\r
+ p[0]=ny; p[1]=nx;\r
+ mglStartThreadC(mgl_difr,0,nx*nz,0,&qq,0,p);\r
+ }\r
+ if((mglchr(how,'x')||mglchr(how,'r')) && nx>1)\r
+ {\r
+ p[0]=nx; p[1]=1;\r
+ mglStartThreadC(mgl_difr,0,ny*nz,0,&qq,0,p);\r
+ }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_diffr_(uintptr_t *d, const char *how, double q,int l)\r
+{ char *s=new char[l+1]; memcpy(s,how,l); s[l]=0;\r
+ mgl_datac_diffr(_DC_,s,q); delete []s; }\r
+//-----------------------------------------------------------------------------\r
mgl_datac_create(d, NX,NY,NZ);\r
long nb = strlen(buf);\r
register long i=0, j=0;\r
+ setlocale(LC_NUMERIC, "C");\r
while(j<nb)\r
{\r
while(buf[j]<=' ' && j<nb) j++;\r
d->a[i] = dual(re,im);\r
i++; if(i>=NX*NY*NZ) break;\r
}\r
+ setlocale(LC_NUMERIC, "");\r
}\r
//-----------------------------------------------------------------------------\r
void MGL_EXPORT mgl_datac_set(HADT d, HCDT a)\r
{\r
const mglDataC *dd = dynamic_cast<const mglDataC*>(d);\r
if(!dd) { mgl_data_save(d,fname,ns); return; }\r
- FILE *fp;\r
- fp = fopen(fname,"w");\r
+ FILE *fp = fopen(fname,"w");\r
+ if(!fp) return;\r
register long i,j,k;\r
long nx=dd->nx, ny=dd->ny, nz=dd->nz;\r
+ setlocale(LC_NUMERIC, "C");\r
if(ns<0 || (ns>=nz && nz>1)) for(k=0;k<nz;k++)\r
{ // save whole data\r
for(i=0;i<ny;i++)\r
else if(ns<ny) for(j=0;j<nx;j++)\r
fprintf(fp,"%g+i%g\t", real(dd->a[j+nx*ns]), imag(dd->a[j+nx*ns]));\r
}\r
+ setlocale(LC_NUMERIC, "");\r
fclose(fp);\r
}\r
void MGL_EXPORT mgl_datac_save_(uintptr_t *d, const char *fname,int *ns,int l)\r
size_t i;\r
dual *b;\r
long kx,ky,kz;\r
- char *fname = new char[256];\r
glob (templ, GLOB_TILDE, NULL, &res);\r
\r
//read first file\r
for(i=0;i<res.gl_pathc;i++)\r
if(mgl_datac_read(&d,res.gl_pathv[i])) break;\r
\r
- if(i>=res.gl_pathc) { delete []fname; return false; }\r
+ if(i>=res.gl_pathc) { globfree (&res); return false; }\r
kx = d.nx; ky = d.ny; kz = d.nz;\r
b = (dual *)malloc(kx*ky*kz*sizeof(dual));\r
memcpy(b,d.a,kx*ky*kz*sizeof(dual));\r
{\r
if(mgl_datac_read(&d,res.gl_pathv[i]))\r
if(!mgl_add_file(kx,ky,kz,b,&d,as_slice))\r
- { delete []fname; free(b); return false; }\r
+ { globfree (&res); free(b); return false; }\r
}\r
dat->Set(b,kx,ky,kz);\r
\r
- globfree (&res);\r
- delete []fname; free(b);\r
+ globfree (&res); free(b);\r
return true;\r
#else\r
return false;\r
#else\r
void MGL_EXPORT mgl_set_num_thr(int) { mglNumThr = 1; }\r
#endif\r
+void MGL_EXPORT mgl_set_num_thr_(int *n) { mgl_set_num_thr(*n); }\r
//-----------------------------------------------------------------------------\r
void MGL_EXPORT mglStartThread(void *(*func)(void *), void (*post)(mglThreadD *,mreal *), long n,\r
mreal *a, const mreal *b, const mreal *c, const long *p,\r
if(at<nz) memcpy(b.a+nx*ny*(at+num), d->a+nx*ny*at,(nz-at)*nx*ny*sizeof(mreal));\r
#pragma omp parallel for\r
for(long i=0;i<num;i++) memcpy(b.a+nx*ny*(at+i),d->a+nx*ny*at,nx*ny*sizeof(mreal));\r
- d->Set(b); nz+=num;\r
+ d->Set(b);\r
}\r
}\r
//-----------------------------------------------------------------------------\r
b.Create(nx,ny,nz-num);\r
if(at>0) memcpy(b.a, d->a,at*nx*ny*sizeof(mreal));\r
memcpy(b.a+nx*ny*at, d->a+nx*ny*(at+num),(nz-at-num)*nx*ny*sizeof(mreal));\r
- d->Set(b); nz-=num;\r
+ d->Set(b);\r
}\r
}\r
//-----------------------------------------------------------------------------\r
mgl_data_create(d, NX,NY,NZ);\r
long nb = strlen(buf);\r
register long i=0, j=0;\r
+ setlocale(LC_NUMERIC, "C");\r
while(j<nb)\r
{\r
while(buf[j]<=' ' && j<nb) j++;\r
d->a[i] = strstr(s,"NAN")?NAN:atof(s);\r
i++; if(i>=NX*NY*NZ) break;\r
}\r
+ setlocale(LC_NUMERIC, "");\r
}\r
//-----------------------------------------------------------------------------\r
void MGL_EXPORT mgl_data_set(HMDT d, HCDT a)\r
//-----------------------------------------------------------------------------\r
void MGL_EXPORT mgl_data_save(HCDT d, const char *fname,long ns)\r
{\r
- FILE *fp;\r
- fp = fopen(fname,"w");\r
+ FILE *fp = fopen(fname,"w");\r
+ if(!fp) return;\r
register long i,j,k;\r
long nx=d->GetNx(), ny=d->GetNy(), nz=d->GetNz();\r
+ setlocale(LC_NUMERIC, "C");\r
if(ns<0 || (ns>=nz && nz>1)) for(k=0;k<nz;k++)\r
{ // save whole data\r
const mglData *dr = dynamic_cast<const mglData *>(d);\r
else if(ns<ny) for(j=0;j<nx;j++)\r
fprintf(fp,"%g\t",d->v(j,ns));\r
}\r
+ setlocale(LC_NUMERIC, "");\r
fclose(fp);\r
}\r
void MGL_EXPORT mgl_data_save_(uintptr_t *d, const char *fname,int *ns,int l)\r
size_t i;\r
mreal *b;\r
long kx,ky,kz;\r
- char *fname = new char[256];\r
glob (templ, GLOB_TILDE, NULL, &res);\r
\r
//read first file\r
for(i=0;i<res.gl_pathc;i++)\r
if(mgl_data_read(&d,res.gl_pathv[i])) break;\r
\r
- if(i>=res.gl_pathc) { delete []fname; return false; }\r
+ if(i>=res.gl_pathc)\r
+ { globfree (&res); return false; }\r
kx = d.nx; ky = d.ny; kz = d.nz;\r
b = (mreal *)malloc(kx*ky*kz*sizeof(mreal));\r
memcpy(b,d.a,kx*ky*kz*sizeof(mreal));\r
{\r
if(mgl_data_read(&d,res.gl_pathv[i]))\r
if(!mgl_add_file(kx,ky,kz,b,&d,as_slice))\r
- { delete []fname; free(b); return false; }\r
+ { globfree (&res); free(b); return false; }\r
}\r
dat->Set(b,kx,ky,kz);\r
\r
- globfree (&res);\r
- delete []fname; free(b);\r
+ globfree (&res); free(b);\r
return true;\r
#else\r
return false;\r
}\r
void MGL_EXPORT mgl_srnd_(int *seed) { mgl_srnd(*seed); }\r
//-----------------------------------------------------------------------------\r
+double MGL_EXPORT mgl_hypot(double x, double y) { return hypot(x,y); }\r
+//-----------------------------------------------------------------------------\r
#if MGL_HAVE_PTHREAD\r
pthread_mutex_t mutexRnd;\r
#endif\r
uintptr_t res = uintptr_t(mgl_create_expr(s));\r
delete []s; return res; }\r
void MGL_EXPORT mgl_delete_expr_(uintptr_t *ex) { mgl_delete_expr((HMEX)ex); }\r
-double MGL_EXPORT mgl_eval_expr_(uintptr_t *ex, mreal *x, mreal *y, mreal *z)\r
+double MGL_EXPORT mgl_expr_eval_(uintptr_t *ex, mreal *x, mreal *y, mreal *z)\r
{ return mgl_expr_eval((HMEX) ex, *x,*y,*z); }\r
-double MGL_EXPORT mgl_diff_expr_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int)\r
+double MGL_EXPORT mgl_expr_diff_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int)\r
{ return mgl_expr_diff((HMEX) ex, *dir,*x,*y,*z); }\r
//-----------------------------------------------------------------------------\r
if(n%2==1) t *= x;\r
return t;\r
}\r
+dual MGL_EXPORT mgl_ipowc_(dual *x,int *n) { return mgl_ipowc(*x,*n); }\r
//-----------------------------------------------------------------------------\r
HAEX MGL_EXPORT mgl_create_cexpr(const char *expr) { return new mglFormulaC(expr); }\r
+uintptr_t MGL_EXPORT mgl_create_cexpr_(const char *expr, int l)\r
+{ char *s=new char[l+1]; memcpy(s,expr,l); s[l]=0;\r
+ uintptr_t res = uintptr_t(mgl_create_cexpr(s));\r
+ delete []s; return res; }\r
void MGL_EXPORT mgl_delete_cexpr(HAEX ex) { delete ex; }\r
+void MGL_EXPORT mgl_delete_cexpr_(uintptr_t *ex) { mgl_delete_cexpr((HAEX)ex); }\r
dual MGL_EXPORT mgl_cexpr_eval(HAEX ex, dual x, dual y,dual z)\r
{ return ex->Calc(x,y,z); }\r
+dual MGL_EXPORT mgl_cexpr_eval_(uintptr_t *ex, dual *x, dual *y, dual *z)\r
+{ return mgl_cexpr_eval((HAEX) ex, *x,*y,*z); }\r
dual MGL_EXPORT mgl_cexpr_eval_v(HAEX ex, dual *var)\r
{ return ex->Calc(var); }\r
//-----------------------------------------------------------------------------\r
else if(!strcmp(k,"dds")) gr->Region(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
else if(!strcmp(k,"ddd")) gr->Region(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
else if(!strcmp(k,"ddds")) gr->Region(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
+ else if(!strcmp(k,"dddd")) gr->Region(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
+ else if(!strcmp(k,"dddds")) gr->Region(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
+ else if(!strcmp(k,"dddddd")) gr->Region(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt);
+ else if(!strcmp(k,"dddddds")) gr->Region(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),opt);
else res = 1; return res;
}
//-----------------------------------------------------------------------------
{"rearrange","Rearrange data dimensions","rearrange Dat mx [my mz]", mgls_rearrange ,3},
{"rect","Draw rectangle","rect x1 y1 x2 y2 ['fmt']|x1 y1 z1 x2 y2 z2 ['fmt']", mgls_rect ,13},
{"refill","Fill data by interpolation of Vdat","refill Dat Xdat Vdat [sl] | Dat Xdat Ydat Vdat [sl] | Dat Xdat Ydat Zdat Vdat", mgls_refill ,3},
- {"region","Draw filled region between 2 curves","region Ydat1 Ydat2 ['fmt' inside]|Xdat Ydat1 Ydat2 ['fmt' inside]", mgls_region ,7},
+ {"region","Draw filled region (ribbon) between 2 curves","region Ydat1 Ydat2 ['fmt']|Xdat Ydat1 Ydat2 ['fmt']||Xdat1 Ydat1 Xdat2 Ydat2 ['fmt']|Xdat1 Ydat1 Zdat1 Xdat2 Ydat2 Zdat2 ['fmt']", mgls_region ,7},
{"resize","Resize data","resize Res Dat mx [my mz]", mgls_resize ,4},
{"return","Return from function","return", 0, 6},
{"rhomb","Draw rhombus","rhomb x1 y1 x2 y2 r ['fmt']|x1 y1 z1 x2 y2 z2 r ['fmt']", mgls_rhomb ,13},
if(!strcmp(fname,"-")) fp = stdout; // allow to write in stdout
else fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt");
if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; }
+ setlocale(LC_NUMERIC, "C");
mgl_printf(fp, gz, "%%!PS-Adobe-3.0 EPSF-3.0\n%%%%BoundingBox: 0 0 %d %d\n", _Gr_->GetWidth(), _Gr_->GetHeight());
mgl_printf(fp, gz, "%%%%Created by MathGL library\n%%%%Title: %s\n",descr ? descr : fname);
mgl_printf(fp, gz, "%%%%CreationDate: %s\n",ctime(&now));
}
mgl_printf(fp, gz, "\nshowpage\n%%%%EOF\n");
if(strcmp(fname,"-")) { if(gz) gzclose((gzFile)fp); else fclose((FILE *)fp); }
+ setlocale(LC_NUMERIC, "");
}
void MGL_EXPORT mgl_write_eps_(uintptr_t *gr, const char *fname,const char *descr,int l,int n)
{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0;
if(!strcmp(fname,"-")) fp = stdout; // allow to write in stdout
else fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt");
if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; }
+ setlocale(LC_NUMERIC, "C");
mgl_printf(fp, gz, "<?xml version=\"1.0\" standalone=\"no\"?>\n");
mgl_printf(fp, gz, "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20000303 Stylable//EN\" \"http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd\">\n");
mgl_printf(fp, gz, "<svg width=\"%d\" height=\"%d\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", _Gr_->GetWidth(), hh);
{ mglPrim &q=gr->GetPrm(i); if(q.type==-1) q.type = 1; }
mgl_printf(fp, gz, "</g></svg>");
if(strcmp(fname,"-")) { if(gz) gzclose((gzFile)fp); else fclose((FILE *)fp); }
+ setlocale(LC_NUMERIC, "");
}
void MGL_EXPORT mgl_write_svg_(uintptr_t *gr, const char *fname,const char *descr,int l,int n)
{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0;
char *d=new char[n+1]; memcpy(d,descr,n); d[n]=0;
mgl_write_svg(_GR_,s,d); delete []s; delete []d; }
//-----------------------------------------------------------------------------
-/// Color names easely parsed by LaTeX
-struct mglSVGName { const char *name; mreal r,g,b; };
-MGL_NO_EXPORT mglSVGName mgl_names[]={{"AliceBlue",.94,.972,1},
-{"Apricot", 0.984, 0.725, 0.51},
-{"Aquamarine", 0, 0.71, 0.745},
-{"Bittersweet", 0.753, 0.31, 0.0902},
-{"Black", 0.133, 0.118, 0.122},
-{"Blue", 0.176, 0.184, 0.573},
-{"BlueGreen", 0, 0.702, 0.722},
-{"BlueViolet", 0.278, 0.224, 0.573},
-{"BrickRed", 0.714, 0.196, 0.11},
-{"Brown", 0.475, 0.145, 0},
-{"BurntOrange", 0.969, 0.573, 0.114},
-{"CadetBlue", 0.455, 0.447, 0.604},
-{"CarnationPink", 0.949, 0.51, 0.706},
-{"Cerulean", 0, 0.635, 0.89},
-{"CornflowerBlue", 0.255, 0.69, 0.894},
-{"Cyan", 0, 0.682, 0.937},
-{"Dandelion", 0.992, 0.737, 0.259},
-{"DarkOrchid", 0.643, 0.325, 0.541},
-{"Emerald", 0, 0.663, 0.616},
-{"ForestGreen", 0, 0.608, 0.333},
-{"Fuchsia", 0.549, 0.212, 0.549},
-{"Goldenrod", 1, 0.875, 0.259},
-{"Gray", 0.58, 0.588, 0.596},
-{"Green", 0, 0.651, 0.31},
-{"GreenYellow", 0.875, 0.902, 0.455},
-{"JungleGreen", 0, 0.663, 0.604},
-{"Lavender", 0.957, 0.62, 0.769},
-{"LimeGreen", 0.553, 0.78, 0.243},
-{"Magenta", 0.925, 0, 0.549},
-{"Mahogany", 0.663, 0.204, 0.122},
-{"Maroon", 0.686, 0.196, 0.208},
-{"Melon", 0.973, 0.62, 0.482},
-{"MidnightBlue", 0, 0.404, 0.584},
-{"Mulberry", 0.663, 0.235, 0.576},
-{"NavyBlue", 0, 0.431, 0.722},
-{"OliveGreen", 0.235, 0.502, 0.192},
-{"Orange", 0.961, 0.506, 0.216},
-{"OrangeRed", 0.929, 0.0745, 0.353},
-{"Orchid", 0.686, 0.447, 0.69},
-{"Peach", 0.969, 0.588, 0.353},
-{"Periwinkle", 0.475, 0.467, 0.722},
-{"PineGreen", 0, 0.545, 0.447},
-{"Plum", 0.573, 0.149, 0.561},
-{"ProcessBlue", 0, 0.69, 0.941},
-{"Purple", 0.6, 0.278, 0.608},
-{"RawSienna", 0.592, 0.251, 0.0235},
-{"Red", 0.929, 0.106, 0.137},
-{"RedOrange", 0.949, 0.376, 0.208},
-{"RedViolet", 0.631, 0.141, 0.42},
-{"Rhodamine", 0.937, 0.333, 0.624},
-{"RoyalBlue", 0, 0.443, 0.737},
-{"RoyalPurple", 0.38, 0.247, 0.6},
-{"RubineRed", 0.929, 0.00392, 0.49},
-{"Salmon", 0.965, 0.573, 0.537},
-{"SeaGreen", 0.247, 0.737, 0.616},
-{"Sepia", 0.404, 0.0941, 0},
-{"SkyBlue", 0.275, 0.773, 0.867},
-{"SpringGreen", 0.776, 0.863, 0.404},
-{"Tan", 0.855, 0.616, 0.463},
-{"TealBlue", 0, 0.682, 0.702},
-{"Thistle", 0.847, 0.514, 0.718},
-{"Turquoise", 0, 0.706, 0.808},
-{"Violet", 0.345, 0.259, 0.608},
-{"VioletRed", 0.937, 0.345, 0.627},
-{"White", 0.6, 0.6, 0.6},
-{"WildStrawberry", 0.933, 0.161, 0.404},
-{"Yellow", 1, 0.949, 0},
-{"YellowGreen", 0.596, 0.8, 0.439},
-{"YellowOrange", 0.98, 0.635, 0.102},
-{"white", 1,1,1},
-{"black", 0,0,0},
-{"red", 1,0,0},
-{"green", 0,1,0},
-{"blue", 0,0,1},
-{"cyan", 0,1,1},
-{"magenta", 1,0,1},
-{"yellow", 1,1,0},
-{"",-1,-1,-1}};
-//-----------------------------------------------------------------------------
-MGL_NO_EXPORT const char *mglColorName(mglColor c) // return closest SVG color
-{
- register long i;
- register mreal d, dm=10;
- const char *name="";
- for(i=0;mgl_names[i].name[0];i++)
- {
- d = fabs(c.r-mgl_names[i].r)+fabs(c.g-mgl_names[i].g)+fabs(c.b-mgl_names[i].b);
- if(d<dm) { dm=d; name=mgl_names[i].name; }
- }
- return name;
-}
-//-----------------------------------------------------------------------------
void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
{
if(gr->GetPrmNum()<1) return;
FILE *fp = fopen(fname,"wt");
if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; }
+ setlocale(LC_NUMERIC, "C");
fprintf(fp, "%% Created by MathGL library\n%% Title: %s\n\n",descr?descr:fname);
+ mreal ms=0.4*gr->mark_size()/100; // provide marks
+ fprintf(fp, "\\providecommand{\\mglp}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1,#2-#4) -- (#1,#2+#4);}\n");
+ fprintf(fp, "\\providecommand{\\mglx}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2+#4) (#1+#4,#2-#4) -- (#1-#4,#2+#4);}\n");
+ fprintf(fp, "\\providecommand{\\mgls}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n");
+ fprintf(fp, "\\providecommand{\\mglS}[4]{\\fill[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n");
+ fprintf(fp, "\\providecommand{\\mgld}[4]{\\draw[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
+ fprintf(fp, "\\providecommand{\\mglD}[4]{\\fill[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
+ fprintf(fp, "\\providecommand{\\mglv}[4]{\\draw[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n");
+ fprintf(fp, "\\providecommand{\\mglV}[4]{\\fill[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n");
+ fprintf(fp, "\\providecommand{\\mglt}[4]{\\draw[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n");
+ fprintf(fp, "\\providecommand{\\mglT}[4]{\\fill[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n");
+ fprintf(fp, "\\providecommand{\\mgll}[4]{\\draw[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
+ fprintf(fp, "\\providecommand{\\mglL}[4]{\\fill[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
+ fprintf(fp, "\\providecommand{\\mglr}[4]{\\draw[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n");
+ fprintf(fp, "\\providecommand{\\mglR}[4]{\\fill[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n");
+ fprintf(fp, "\\providecommand{\\mglR}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) -- (#1-#4,#2+#4) (#1,#2) -- (#1+#4,#2+#4);}\n");
+ fprintf(fp, "\\providecommand{\\mgla}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1-0.6*#4,#2-0.8*#4) -- (#1+0.6*#4,#2+0.8*#4) (#1-0.6*#4,#2+0.8*#4) -- (#1+0.6*#4,#2-0.8*#4);}\n");
+ fprintf(fp, "\\providecommand{\\mglY}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) (#1-#4,#2+#4) -- (#1,#2) (#1+#4,#2+#4) -- (#1,#2);}\n");
+ fprintf(fp, "\\providecommand{\\mglo}[4]{\\draw[#3] (#1, #2) circle (#4);}\n");
+ fprintf(fp, "\\providecommand{\\mglO}[4]{\\fill[#3] (#1, #2) circle (#4);}\n");
+ fprintf(fp, "\\providecommand{\\mglc}[3]{\\draw[#3] (#1, #2) circle (%g);}\n\n", 0.1*ms);
fprintf(fp, "\\begin{tikzpicture}\n");
// write primitives first
mreal wp=-1;
- register long i;
- register int ii,jj,kk;
int st=0;
mglRGBA cp;
- char cname[16];
+ char cname[128];
- for(i=0;i<gr->GetPrmNum();i++)
+ for(long i=0;i<gr->GetPrmNum();i++)
{
const mglPrim &q = gr->GetPrm(i);
if(q.type<0) continue; // q.n1>=0 always
cp.c = _Gr_->GetPrmCol(i);
+ snprintf(cname,128,"color={rgb,255:red,%d;green,%d;blue,%d}",cp.r[0],cp.r[1],cp.r[2]);
- ii = (cp.r[0]+25L)/51;
- jj = (cp.r[1]+25L)/51;
- kk = (cp.r[2]+25L)/51;
- snprintf(cname,16,"mgl_%d",ii+6*(jj+6*kk));
-// cname = mglColorName(cp);
const mglPnt p1=gr->GetPnt(q.n1);
mreal x=p1.x/100,y=p1.y/100,s=q.s/100;
if(q.type==0)
switch(q.n4) // NOTE: no thickness for marks in TeX
{
case 'P':
- fprintf(fp, "\\mglp{%g}{%g}{%s}{%g} \\mgls{%g}{%g}{%s}{%g}\n", x,y,cname,s,x,y,cname,s); break;
+ fprintf(fp, "\\mglp{%.4g}{%.4g}{%s}{%.4g} \\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s); break;
case 'X':
- fprintf(fp, "\\mglx{%g}{%g}{%s}{%g} \\mgls{%g}{%g}{%s}{%g}\n", x,y,cname,s,x,y,cname,s); break;
+ fprintf(fp, "\\mglx{%.4g}{%.4g}{%s}{%.4g} \\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s); break;
case 'C':
- fprintf(fp, "\\mglc{%g}{%g}{%s}{%g} \\mglo{%g}{%g}{%s}{%g}\n", x,y,cname,s,x,y,cname,s); break;
- case '+': fprintf(fp, "\\mglp{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 'x': fprintf(fp, "\\mglx{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 's': fprintf(fp, "\\mgls{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 'S': fprintf(fp, "\\mglS{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 'd': fprintf(fp, "\\mgld{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 'D': fprintf(fp, "\\mglD{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case '^': fprintf(fp, "\\mglt{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 'T': fprintf(fp, "\\mglT{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 'v': fprintf(fp, "\\mglv{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 'V': fprintf(fp, "\\mglV{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case '<': fprintf(fp, "\\mgll{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 'L': fprintf(fp, "\\mglL{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case '>': fprintf(fp, "\\mglr{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 'R': fprintf(fp, "\\mglR{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 'Y': fprintf(fp, "\\mglY{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 'o': fprintf(fp, "\\mglo{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case 'O': fprintf(fp, "\\mglO{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- case '*': fprintf(fp, "\\mgla{%g}{%g}{%s}{%g}\n", x,y,cname,s); break;
- default: fprintf(fp, "\\mglc{%g}{%g}{%s}\n", x,y,cname); break;
+ fprintf(fp, "\\mglc{%.4g}{%.4g}{%s}{%.4g} \\mglo{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s); break;
+ case '+': fprintf(fp, "\\mglp{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 'x': fprintf(fp, "\\mglx{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 's': fprintf(fp, "\\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 'S': fprintf(fp, "\\mglS{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 'd': fprintf(fp, "\\mgld{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 'D': fprintf(fp, "\\mglD{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case '^': fprintf(fp, "\\mglt{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 'T': fprintf(fp, "\\mglT{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 'v': fprintf(fp, "\\mglv{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 'V': fprintf(fp, "\\mglV{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case '<': fprintf(fp, "\\mgll{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 'L': fprintf(fp, "\\mglL{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case '>': fprintf(fp, "\\mglr{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 'R': fprintf(fp, "\\mglR{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 'Y': fprintf(fp, "\\mglY{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 'o': fprintf(fp, "\\mglo{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case 'O': fprintf(fp, "\\mglO{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ case '*': fprintf(fp, "\\mgla{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break;
+ default: fprintf(fp, "\\mglc{%.4g}{%.4g}{%s}\n", x,y,cname); break;
}
}
else if(q.type==2 && cp.r[3])
{
const mglPnt p2=gr->GetPnt(q.n2), p3=gr->GetPnt(q.n3);
- fprintf(fp, "\\fill[%s, fill opacity=%g] (%g,%g) -- (%g,%g) -- (%g,%g) -- cycle;\n", cname,cp.r[3]/255., x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100);
+ if(cp.r[3]<255)
+ fprintf(fp, "\\fill[%s, fill opacity=%.4g] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname,cp.r[3]/255., x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100);
+ else
+ fprintf(fp, "\\fill[%s, fill] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname, x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100);
}
else if(q.type==3 && cp.r[3])
{
const mglPnt p2=gr->GetPnt(q.n2), p3=gr->GetPnt(q.n3), p4=gr->GetPnt(q.n4);
- fprintf(fp, "\\fill[%s, fill opacity=%g] (%g,%g) -- (%g,%g) -- (%g,%g) -- (%g,%g) -- cycle;\n", cname,cp.r[3]/255., x,y, p2.x/100,p2.y/100, p4.x/100,p4.y/100, p3.x/100,p3.y/100);
+ if(cp.r[3]<255)
+ fprintf(fp, "\\fill[%s, fill opacity=%.4g] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname,cp.r[3]/255., x,y, p2.x/100,p2.y/100, p4.x/100,p4.y/100, p3.x/100,p3.y/100);
+ else
+ fprintf(fp, "\\fill[%s, fill] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname, x,y, p2.x/100,p2.y/100, p4.x/100,p4.y/100, p3.x/100,p3.y/100);
+
}
else if(q.type==1) // lines
{
else fprintf(fp,"\\draw[%s,%s] ",cname,w[iw]);
// TODO: add line dashing
wp = q.w>1 ? q.w:1; st = q.n3;
- put_line(gr,fp,false,i,wp,cp.c,st, "(%g,%g)", " -- (%g,%g)", false, 0.01);
+ put_line(gr,fp,false,i,wp,cp.c,st, "(%.4g,%.4g)", " -- (%.4g,%.4g)", false, 0.01);
fprintf(fp, ";\n");
}
else if(q.type==6 && mgl_isnum(q.p)) // text
if((a&3)==0) ss.append(",anchor=base west");
if((a&3)==1) ss.append(",anchor=base");
if((a&3)==2) ss.append(",anchor=base east");
- if(f&MGL_FONT_ITAL) ss.append(",font=\\itshape");
- if(f&MGL_FONT_BOLD) ss.append(",font=\\bfshape");
+// if(f&MGL_FONT_ITAL) ss.append(",font=\\itshape");
+// if(f&MGL_FONT_BOLD) ss.append(",font=\\bfshape");
if(t.text.find('\\')!=std::string::npos || t.text.find('{')!=std::string::npos || t.text.find('_')!=std::string::npos || t.text.find('^')!=std::string::npos)
- fprintf(fp,"\\draw[%s] (%g,%g) node[rotate=%.2g]{$%ls$};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str());
+ fprintf(fp,"\\draw[%s] (%.4g,%.4g) node[rotate=%.2g]{$%ls$};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str());
else
- fprintf(fp,"\\draw[%s] (%g,%g) node[rotate=%.2g]{%ls};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str());
+ fprintf(fp,"\\draw[%s] (%.4g,%.4g) node[rotate=%.2g]{%ls};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str());
}
}
fprintf(fp, "\\end{tikzpicture}\n");
- for(i=0;i<gr->GetPrmNum();i++)
+ for(long i=0;i<gr->GetPrmNum();i++)
{ mglPrim &q=gr->GetPrm(i); if(q.type==-1) q.type = 1; }
fclose(fp);
-
- // provide colors used by figure
- fp=fopen("mglcolors.tex","wt");
- for(ii=0;ii<6;ii++) for(jj=0;jj<6;jj++) for(kk=0;kk<6;kk++)
- fprintf(fp,"\\definecolor{mgl_%d}{RGB}{%d,%d,%d}\n",ii+6*(jj+6*kk),51*ii,51*jj,51*kk);
- mreal ms=0.4*gr->mark_size()/100; // also provide marks
- fprintf(fp, "\\providecommand{\\mglp}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1,#2-#4) -- (#1,#2+#4);}\n");
- fprintf(fp, "\\providecommand{\\mglx}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2+#4) (#1+#4,#2-#4) -- (#1-#4,#2+#4);}\n");
- fprintf(fp, "\\providecommand{\\mgls}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n");
- fprintf(fp, "\\providecommand{\\mglS}[4]{\\fill[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n");
- fprintf(fp, "\\providecommand{\\mgld}[4]{\\draw[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
- fprintf(fp, "\\providecommand{\\mglD}[4]{\\fill[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
- fprintf(fp, "\\providecommand{\\mglv}[4]{\\draw[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n");
- fprintf(fp, "\\providecommand{\\mglV}[4]{\\fill[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n");
- fprintf(fp, "\\providecommand{\\mglt}[4]{\\draw[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n");
- fprintf(fp, "\\providecommand{\\mglT}[4]{\\fill[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n");
- fprintf(fp, "\\providecommand{\\mgll}[4]{\\draw[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
- fprintf(fp, "\\providecommand{\\mglL}[4]{\\fill[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n");
- fprintf(fp, "\\providecommand{\\mglr}[4]{\\draw[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n");
- fprintf(fp, "\\providecommand{\\mglR}[4]{\\fill[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n");
- fprintf(fp, "\\providecommand{\\mglR}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) -- (#1-#4,#2+#4) (#1,#2) -- (#1+#4,#2+#4);}\n");
- fprintf(fp, "\\providecommand{\\mgla}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1-0.6*#4,#2-0.8*#4) -- (#1+0.6*#4,#2+0.8*#4) (#1-0.6*#4,#2+0.8*#4) -- (#1+0.6*#4,#2-0.8*#4);}\n");
- fprintf(fp, "\\providecommand{\\mglY}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) (#1-#4,#2+#4) -- (#1,#2) (#1+#4,#2+#4) -- (#1,#2);}\n");
- fprintf(fp, "\\providecommand{\\mglo}[4]{\\draw[#3] (#1, #2) circle (#4);}\n");
- fprintf(fp, "\\providecommand{\\mglO}[4]{\\fill[#3] (#1, #2) circle (#4);}\n");
- fprintf(fp, "\\providecommand{\\mglc}[3]{\\draw[#3] (#1, #2) circle (%g);}\n\n", 0.1*ms);
- fclose(fp);
+ setlocale(LC_NUMERIC, "");
// provide main file for viewing figure
fp=fopen("mglmain.tex","wt");
- fprintf(fp, "\\documentclass{article}\n\n");
- fprintf(fp, "%% following lines should be placed before \\begin{document}\n");
- fprintf(fp,"\\usepackage{tikz}\n\\input{mglcolors.tex}\n");
- fprintf(fp, "\\begin{document}\n%% start figure itself\n\\input{%s}\\end{document}\n",fname);
- fclose(fp);
+ if(fp)
+ {
+ fprintf(fp, "%% this file just show figure\n");
+ fprintf(fp, "\\documentclass{article}\n\\usepackage{tikz}\n");
+ fprintf(fp, "\\begin{document}\n\\input{%s}\n\\end{document}\n",fname);
+ fclose(fp);
+ }
}
+void MGL_EXPORT mgl_write_tex_(uintptr_t *gr, const char *fname,const char *descr,int l,int n)
+{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0;
+ char *d=new char[n+1]; memcpy(d,descr,n); d[n]=0;
+ mgl_write_tex(_GR_,s,d); delete []s; delete []d; }
//-----------------------------------------------------------------------------
delete []ng;\r
\r
size_t len=strlen(fname),ntxt=gr->GetTxtNum();\r
- char *tname = new char[len+5]; strcpy(tname,fname);\r
FILE *fp=fopen(fname,"wt");\r
+ if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; }\r
// vertices definition\r
+ setlocale(LC_NUMERIC, "C");\r
fprintf(fp,"# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname);\r
for(long i=0;i<gr->GetPntNum();i++)\r
{\r
// else fprintf(fp,"vn %g %g %g\n",pp.u,pp.v,pp.w);\r
}\r
// primitive definition in groups\r
+ char *tname = new char[len+5]; strcpy(tname,fname);\r
tname[len-4]=0; fprintf(fp,"# Primitives Definitions\nmtllib %s.mtl\nusemtl %s\n",tname,tname);\r
for(size_t i=0;i<gr->Grp.size();i++)\r
{\r
if(use_png) mgl_pnga_save(tname,256,256*j,pbuf);\r
else mgl_tga_save(tname,256,256*j,pbuf);\r
free(pbuf); delete []buf; delete []tname;\r
+ setlocale(LC_NUMERIC, "");\r
}\r
void MGL_EXPORT mgl_write_obj_old_(uintptr_t *gr, const char *fname,const char *descr, int *use_png,int l,int n)\r
{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0;\r
{\r
if(gr->GetPrmNum()==0) return; // nothing to do\r
FILE *fp = fopen(fname,"wt");\r
+ if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; }\r
+ setlocale(LC_NUMERIC, "C");\r
fprintf(fp,"solid %s\n",(descr && *descr)?descr:"mathgl");\r
register long i;\r
mglPnt pp;\r
}\r
fprintf(fp,"endsolid %s",(descr && *descr)?descr:"mathgl");\r
fclose(fp);\r
+ setlocale(LC_NUMERIC, "");\r
}\r
void MGL_EXPORT mgl_write_stl_(uintptr_t *gr, const char *fname,const char *descr,int l,int n)\r
{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0;\r
\r
register long i;\r
FILE *fp=fopen(fname,"wt"), *ff; // vertices definition\r
+ if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; }\r
+ setlocale(LC_NUMERIC, "C");\r
fprintf(fp,"# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname);\r
fprintf(fp,"# List of Vertices, with (x,y,z) coordinates.\n");\r
for(i=0;i<gr->GetPntNum();i++)\r
if(q.type==3) fprintf(ff,"%ld %ld %ld\n%ld %ld %ld\n",q.n1+1,q.n2+1,q.n3+1,q.n4+1,q.n2+1,q.n3+1);\r
}\r
fclose(fp); fclose(ff); delete []tname;\r
+ setlocale(LC_NUMERIC, "");\r
}\r
void MGL_EXPORT mgl_write_xyz_(uintptr_t *gr, const char *fname,const char *descr,int l,int n)\r
{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0;\r
if(nf<=0) return; // nothing to do\r
\r
FILE *fp=fopen(fname,"wt");\r
+ if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; }\r
+ setlocale(LC_NUMERIC, "C");\r
// vertices definition\r
if(colored)\r
fprintf(fp,"COFF\n# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname);\r
}\r
}\r
fclose(fp);\r
+ setlocale(LC_NUMERIC, "");\r
}\r
void MGL_EXPORT mgl_write_off_(uintptr_t *gr, const char *fname,const char *descr,int *colored,int l,int n)\r
{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0;\r
std::string res, buf;\r
long i,ll=0,l=(long)Pnt.size();\r
long factor = Width>1?10:10000;\r
+ setlocale(LC_NUMERIC, "C");\r
res = res + mgl_sprintf("{\n\"width\":%d,\t\"height\":%d,\t\"depth\":%d,\t\"plotid\":\"%s\",\t\"npnts\":%ld,\t\"pnts\":[\n",\r
factor*Width, factor*Height, factor*Depth, PlotId.c_str(), l);\r
std::string *tmp=new std::string[l];\r
{\r
const mglPnt &q = Pnt[p.n1];\r
#pragma omp critical\r
- {xy.push_back(mglPoint(q.u,q.v,p.n2)); n2 = xy.size()-1;}\r
+ {n2 = xy.size(); xy.push_back(mglPoint(q.u,q.v,p.n2));}\r
n3 = p.n3; n4 = p.n4;\r
}\r
if(p.type==1 && n1>n2) { n1=p.n2; n2=p.n1; }\r
res = res + mgl_sprintf("]\n]%c\n", i+1<l?',':' ');\r
}\r
res = res + mgl_sprintf("]\n}\n");\r
+ setlocale(LC_NUMERIC, "");\r
return res;\r
}\r
//-----------------------------------------------------------------------------\r
if(Pnt.size()<1 || Prm.size()<1) return true;\r
FILE *fp=fopen(fname,"wt");\r
if(!fp) return true;\r
+ setlocale(LC_NUMERIC, "C");\r
// NOTE: I'll save Ptx. So prim type=6 is useless,and no LaTeX\r
fprintf(fp,"MGLD %lu %lu %lu %lu %d %d\n# %s\n", (unsigned long)Pnt.size(), (unsigned long)Prm.size(), (unsigned long)Txt.size(), (unsigned long)Glf.size(), Width, Height, (descr && *descr) ? descr : fname);\r
fprintf(fp,"# Vertexes: x y z c t ta u v w r g b a\n");\r
}\r
}\r
fclose(fp);\r
+ setlocale(LC_NUMERIC, "");\r
return false;\r
}\r
//-----------------------------------------------------------------------------\r
sscanf(buf+5,"%lu%lu%lu%lu%d%d",&n,&m,&l,&k,&w,&h);\r
if(w<=0 || h<=0) { w=Width; h=Height; }\r
d = long(sqrt(double(w*h)));\r
- if(n<=0 || m<=0 || l<=0) { delete []buf; fclose(fp); return true; }\r
+ if(n==0 || m==0 || l==0) { delete []buf; fclose(fp); return true; }\r
+ setlocale(LC_NUMERIC, "C");\r
if(!add) { Clf(); Txt.clear(); }\r
else { ClfZB(); npnt=Pnt.size(); nglf=Glf.size(); }\r
#if MGL_HAVE_PTHREAD\r
pthread_mutex_unlock(&mutexPrm);\r
pthread_mutex_unlock(&mutexTxt);\r
#endif\r
+ setlocale(LC_NUMERIC, "");\r
delete []buf; fclose(fp); return false;\r
}\r
//-----------------------------------------------------------------------------\r
bool gz = fname[strlen(fname)-1]=='z';\r
void *fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt");\r
if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; }\r
+ setlocale(LC_NUMERIC, "C");\r
mgl_printf(fp, gz, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");\r
mgl_printf(fp, gz, "<!DOCTYPE X3D PUBLIC \"ISO//Web3D//DTD X3D 3.0//EN\" \"http://www.web3d.org/specifications/x3d-3.0.dtd\">\n");\r
mgl_printf(fp, gz, "<X3D profile='Immersive'>\n<head>\n<meta name='filename' content='%s'/>\n",fname);\r
}\r
mgl_printf(fp, gz, "</Scene>\n");\r
if(gz) gzclose((gzFile)fp); else fclose((FILE *)fp);\r
+ setlocale(LC_NUMERIC, "");\r
+ delete []pnt;\r
}\r
void MGL_EXPORT mgl_write_x3d_(uintptr_t *gr, const char *fname,const char *descr,int l,int n)\r
{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0;\r
#endif\r
//-----------------------------------------------------------------------------\r
/// GSL based fitting procedure for formula/arguments specified by string\r
-mreal MGL_NO_EXPORT mgl_fit_base(mglFitData *fd, mreal *ini)\r
+mreal MGL_NO_EXPORT mgl_fit_base(mglFitData &fd, mreal *ini)\r
{\r
#if MGL_HAVE_GSL\r
- register long i,m=fd->m,n=fd->n,iter=0;\r
- if(n<1 || fd==0 || ini==0) return -1;\r
+ register long i,m=fd.m,n=fd.n,iter=0;\r
+ if(n<1 || ini==0) return -1;\r
// setup data\r
- double *x_init = new double[fd->m];\r
+ double *x_init = new double[fd.m];\r
for(i=0;i<m;i++) x_init[i] = ini[i];\r
// setup fitting\r
gsl_matrix *covar = gsl_matrix_alloc(m, m);\r
gsl_multifit_function_fdf f;\r
f.f = mgl_fit__f; f.df = mgl_fit__df;\r
f.fdf = mgl_fit__fdf; f.n = n; f.p = m;\r
- f.params = fd;\r
+ f.params = &fd;\r
gsl_multifit_fdfsolver_set(s, &f, &vx.vector);\r
int status; // start fitting\r
do\r
else in.Fill(0.,0);\r
fd.a = y.a+i*m; fd.x = x.a+(i%x.ny)*m;\r
fd.s = s.a+i*m;\r
- res = mgl_fit_base(&fd,in.a);\r
+ res = mgl_fit_base(fd,in.a);\r
mgl_fill_fit(gr,*fit,in,fd,var,nn,1,1,i);\r
if(ini && ini->nx>=fd.m) memcpy(ini->a,in.a,fd.m*sizeof(mreal));\r
}\r
if(ini && ini->nx>=fd.m) in.Set(ini->a,fd.m);\r
else in.Fill(0.,0);\r
fd.a = z.a+i*m*n; fd.s = s.a+i*m*n;\r
- res = mgl_fit_base(&fd,in.a);\r
+ res = mgl_fit_base(fd,in.a);\r
mgl_fill_fit(gr,*fit,in,fd,var,nn,nn,1,i);\r
if(ini && ini->nx>=fd.m) memcpy(ini->a,in.a,fd.m*sizeof(mreal));\r
}\r
\r
if(ini && ini->nx>=fd.m) in.Set(ini->a,fd.m);\r
else in.Fill(0.,0);\r
- res = mgl_fit_base(&fd,in.a);\r
+ res = mgl_fit_base(fd,in.a);\r
mgl_fill_fit(gr,*fit,in,fd,var,nn,nn,nn,0);\r
if(ini && ini->nx>=fd.m) memcpy(ini->a,in.a,fd.m*sizeof(mreal));\r
\r
int r = ch-'0';
if(ch>='a' && ch<='z') r = 10+ch-'a';
// int r = int(a[0].v);
- if(arg[1][1]==0 && (r>=0 || r<=39))
+ if(arg[1][1]==0 && (r>=0 && r<40)) // TODO: check this
{
if(a[1].type==0)
{
uintptr_t MGL_EXPORT mgl_parser_find_var_(uintptr_t* p, const char *name, int l)
{ char *s=new char[l+1]; memcpy(s,name,l); s[l]=0;
mglVar *v=_PR_->FindVar(s); delete []s; return uintptr_t(v); }
-void MGL_EXPORT mgl_del_var_(uintptr_t* p, const char *name, int l)
+void MGL_EXPORT mgl_parser_del_var_(uintptr_t* p, const char *name, int l)
{ char *s=new char[l+1]; memcpy(s,name,l); s[l]=0;
_PR_->DeleteVar(s); delete []s; }
int MGL_EXPORT mgl_parse_line_(uintptr_t* gr, uintptr_t* p, const char *str, int *pos, int l)
//-----------------------------------------------------------------------------\r
mglPoint mglCanvas::CalcXYZ(int xs, int ys, bool real) const\r
{\r
+ if(xs<0 || ys<0 || xs>=Width || ys>=Height) return mglPoint(NAN,NAN,NAN);\r
mglPoint p, ps(xs,Height-ys,NAN);\r
float zz = Z[3*(xs+Width*(Height-1-ys))];\r
if(zz>-1e20f) { ps.z = zz; real=false; }\r
}\r
}\r
b0 += (ar>1 ? 1:ar)*p.r; // diffuse light\r
- b1 += (ar>1 ? 1:ar)*p.g;\r
- b2 += (ar>1 ? 1:ar)*p.b;\r
+ b1 += (ag>1 ? 1:ag)*p.g;\r
+ b2 += (ab>1 ? 1:ab)*p.b;\r
b0 = b0<1 ? b0 : 1; // normalize components\r
b1 = b1<1 ? b1 : 1;\r
b2 = b2<1 ? b2 : 1;\r
//-----------------------------------------------------------------------------\r
unsigned char **mglCanvas::GetRGBLines(long &w, long &h, unsigned char *&f, bool alpha)\r
{\r
- long d = alpha ? 4:3;\r
unsigned char **p;\r
Finish();\r
p = (unsigned char **)malloc(Height * sizeof(unsigned char *));\r
+ long d = (alpha ? 4:3)*Width;\r
+ unsigned char *gg = (alpha?G4:G);\r
#pragma omp parallel for\r
- for(long i=0;i<Height;i++) p[i] = (alpha?G4:G)+d*Width*i;\r
+ for(long i=0;i<Height;i++) p[i] = gg + d*i;\r
w = Width; h = Height; f = 0;\r
return p;\r
}\r
q.xx=q.x=p.x; q.yy=q.y=p.y; q.zz=q.z=p.z;\r
long k;\r
#pragma omp critical(pnt)\r
- {MGL_PUSH(Pnt,q,mutexPnt); k=Pnt.size()-1;}\r
+ {k=Pnt.size(); MGL_PUSH(Pnt,q,mutexPnt);}\r
return k;\r
}\r
//-----------------------------------------------------------------------------\r
// Region series\r
//\r
//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_region_3d(HMGL gr, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT y2, HCDT z2, const char *pen, const char *opt)\r
+{\r
+ long i,j, n=y1->GetNx(), m, mx, my, mz, pal;\r
+ if(mgl_check_dim1(gr,x1,y1,z1,0,"Region")) return;\r
+ if(mgl_check_dim1(gr,x1,x2,y2,z2,"Region")) return;\r
+ m = x1->GetNy() > y1->GetNy() ? x1->GetNy() : y1->GetNy(); m = z1->GetNy() > m ? z1->GetNy() : m;\r
+ bool zhave = z1 && z2;\r
+ if(x1->GetNy()!=x2->GetNy() || y1->GetNy()!=y2->GetNy())\r
+ { gr->SetWarn(mglWarnDim,"Region"); return; }\r
+ if(zhave && z1->GetNy()!=z2->GetNy())\r
+ { gr->SetWarn(mglWarnDim,"Region"); return; }\r
+\r
+ gr->SaveState(opt);\r
+ static int cgid=1; gr->StartGroup("Region",cgid++);\r
+ mreal c1,c2;\r
+ mglPoint nn=mglPoint(0,0,1);\r
+ long n1,n2,n3,n4;\r
+ mreal zm = gr->AdjustZMin();\r
+// bool inside = (mglchr(pen,'i')); // NOTE: check if 'i' is free (used here for inside flag)\r
+ bool sh = mglchr(pen,'!');\r
+\r
+ gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m);\r
+// long s=gr->AddTexture(pen,1);\r
+ for(j=0;j<m;j++)\r
+ {\r
+ c2=c1=gr->NextColor(pal);\r
+ if(gr->GetNumPal(pal)==2*m && !sh) c2=gr->NextColor(pal);\r
+ mx = j<x1->GetNy() ? j:0;\r
+ my = j<y1->GetNy() ? j:0;\r
+ mz = (zhave && j<z1->GetNy()) ? j:0;\r
+ mreal z0 = zm + (m-1-j)*(gr->Max.z-zm)/m;\r
+\r
+ n1 = gr->AddPnt(mglPoint(x1->v(0,mx),y1->v(0,my),zhave?z1->v(0,mz):z0),c1,nn,-1,11);\r
+ n2 = gr->AddPnt(mglPoint(x2->v(0,mx),y2->v(0,my),zhave?z2->v(0,mz):z0),c2,nn,-1,11);\r
+ for(i=1;i<n;i++)\r
+ {\r
+ if(gr->Stop) return;\r
+ n3=n1; n4=n2;\r
+ if(sh) c2=c1=gr->NextColor(pal,i);\r
+ n1 = gr->AddPnt(mglPoint(x1->v(i,mx),y1->v(i,my),zhave?z1->v(i,mz):z0),c1,nn,-1,11);\r
+ n2 = gr->AddPnt(mglPoint(x2->v(i,mx),y2->v(i,my),zhave?z2->v(i,mz):z0),c2,nn,-1,11);\r
+ gr->quad_plot(n1,n2,n3,n4);\r
+ }\r
+ }\r
+ gr->EndGroup();\r
+}\r
+//-----------------------------------------------------------------------------\r
void MGL_EXPORT mgl_region_xy(HMGL gr, HCDT x, HCDT y1, HCDT y2, const char *pen, const char *opt)\r
{\r
long i,j, n=y1->GetNx(), m=y1->GetNy(), mx, pal;\r
mgl_region_xy(gr,&x,y1,y2,pen,0);\r
}\r
//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_region_3d_(uintptr_t *gr, uintptr_t *x1, uintptr_t *y1, uintptr_t *z1, uintptr_t *x2, uintptr_t *y2, uintptr_t *z2, const char *pen, const char *opt, int l, int lo)\r
+{ char *s=new char[l+1]; memcpy(s,pen,l); s[l]=0;\r
+ char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
+ mgl_region_3d(_GR_, _DA_(x1),_DA_(y1),_DA_(z1),_DA_(x2),_DA_(y2),_DA_(z2),s,o); delete []o; delete []s; }\r
+//-----------------------------------------------------------------------------\r
void MGL_EXPORT mgl_region_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt, int l, int lo)\r
{ char *s=new char[l+1]; memcpy(s,pen,l); s[l]=0;\r
char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
memset(dd,0,n*sizeof(mreal));\r
\r
gr->SetPenPal(pen,&pal);\r
- if(wire) gr->Reserve(4*n*m); else gr->Reserve(4*n*m);\r
+ gr->Reserve(4*n*m);\r
for(long j=0;j<m;j++)\r
{\r
c2=c1=gr->NextColor(pal);\r
memset(dd,0,n*sizeof(mreal));\r
\r
gr->SetPenPal(pen,&pal);\r
- if(wire) gr->Reserve(4*n*m); else gr->Reserve(4*n*m);\r
+ gr->Reserve(4*n*m);\r
for(long j=0;j<m;j++)\r
{\r
c2=c1=gr->NextColor(pal);\r
memset(dd,0,n*sizeof(mreal));\r
\r
gr->SetPenPal(pen,&pal);\r
- if(wire) gr->Reserve(4*n*m); else gr->Reserve(4*n*m);\r
+ gr->Reserve(4*n*m);\r
for(long j=0;j<m;j++)\r
{\r
c2=c1=gr->NextColor(pal);\r
mgl_ohlc_x(gr,&x,open,high,low,close,pen,0);\r
}\r
//-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_ohlc_y_(uintptr_t *gr, uintptr_t *x, uintptr_t *open, uintptr_t *high, uintptr_t *low, uintptr_t *close, const char *pen, const char *opt,int l,int lo)\r
+void MGL_EXPORT mgl_ohlc_x_(uintptr_t *gr, uintptr_t *x, uintptr_t *open, uintptr_t *high, uintptr_t *low, uintptr_t *close, const char *pen, const char *opt,int l,int lo)\r
{ char *s=new char[l+1]; memcpy(s,pen,l); s[l]=0;\r
char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
mgl_ohlc_x(_GR_,_DA_(x),_DA_(open),_DA_(high),_DA_(low),_DA_(close),s,o); delete []o; delete []s; }\r
long ss = gr->AddTexture(sch);\r
long *pos = new long[n*m];\r
bool wire = (mglchr(sch,'#'));\r
- gr->Reserve(n*m*z->GetNz()*(wire?2:1));\r
+ gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));\r
\r
mglPoint p,q,s,xx,yy;\r
for(long k=0;k<z->GetNz();k++)\r
\r
long ss = gr->AddTexture(sch);\r
long *pos = new long[n*m];\r
- gr->Reserve(n*m*z->GetNz());\r
+ bool wire = (mglchr(sch,'#'));\r
+ gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));\r
\r
mglPoint p,s=mglPoint(0,0,1);\r
mreal zz, c;\r
#pragma omp parallel for\r
for(long i=0;i<n*m;i++) gr->mark_plot(pos[i],'.');\r
else mgl_surf_plot(gr,pos,n,m);\r
- if(mglchr(sch,'#') && !gr->Stop)\r
+ if(wire && !gr->Stop)\r
{\r
- gr->Reserve(n*m); gr->SetPenPal("k-");\r
+ gr->SetPenPal("k-");\r
#pragma omp parallel for\r
for(long i=0;i<n*m;i++) pos[i] = gr->CopyNtoC(pos[i],gr->CDef);\r
mgl_mesh_plot(gr,pos,n,m,3);\r
static int cgid=1; gr->StartGroup("SurfC",cgid++);\r
long ss = gr->AddTexture(sch);\r
long *pos = new long[n*m];\r
- gr->Reserve(n*m*z->GetNz());\r
+ bool wire = (mglchr(sch,'#'));\r
+ gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));\r
\r
mglPoint p,q,s,xx,yy;\r
for(long k=0;k<z->GetNz();k++)\r
#pragma omp parallel for\r
for(long i=0;i<n*m;i++) gr->mark_plot(pos[i],'.');\r
else mgl_surf_plot(gr,pos,n,m);\r
- if(mglchr(sch,'#') && !gr->Stop)\r
+ if(wire && !gr->Stop)\r
{\r
- gr->Reserve(n*m); gr->SetPenPal("k-");\r
+ gr->SetPenPal("k-");\r
#pragma omp parallel for\r
for(long i=0;i<n*m;i++) pos[i] = gr->CopyNtoC(pos[i],gr->CDef);\r
mgl_mesh_plot(gr,pos,n,m,3);\r
static int cgid=1; gr->StartGroup("SurfA",cgid++);\r
long ss = gr->AddTexture(sch);\r
long *pos = new long[n*m];\r
- gr->Reserve(n*m*z->GetNz());\r
+ bool wire = (mglchr(sch,'#'));\r
+ gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));\r
\r
mglPoint p,q,s,xx,yy;\r
for(k=0;k<z->GetNz();k++)\r
#pragma omp parallel for\r
for(long i=0;i<n*m;i++) gr->mark_plot(pos[i],'.');\r
else mgl_surf_plot(gr,pos,n,m);\r
- if(mglchr(sch,'#'))\r
+ if(wire && !gr->Stop)\r
{\r
- gr->Reserve(n*m); gr->SetPenPal("k-");\r
+ gr->SetPenPal("k-");\r
#pragma omp parallel for\r
for(long i=0;i<n*m;i++) pos[i] = gr->CopyNtoC(pos[i],gr->CDef);\r
mgl_mesh_plot(gr,pos,n,m,3);\r
mglData ax(phi), ay,az,xx,yy,zz;\r
ay.Set(ax); az.Set(ax); xx.Set(ax); yy.Set(ax); zz.Set(ax);\r
long n=xx.nx, m=xx.ny, l=xx.nz, nn = n*m*l;\r
- if(x->GetNx()*x->GetNy()*x->GetNz()==nn && y->GetNx()*y->GetNy()*y->GetNz()==nn && x->GetNx()*x->GetNy()*x->GetNz()==nn)\r
+ if(x->GetNx()*x->GetNy()*x->GetNz()==nn && y->GetNx()*y->GetNy()*y->GetNz()==nn && z->GetNx()*z->GetNy()*z->GetNz()==nn)\r
{ xx.Set(x); yy.Set(y); zz.Set(z); } // nothing to do\r
else if(x->GetNx()==n && y->GetNx()==m && z->GetNx()==l)\r
#pragma omp parallel for collapse(3)\r
q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);\r
pos = gr->AddPnt(p,c,q); u.c=pos;\r
if(pos<0) continue;\r
- kk.push_back(u); kx2[i1] = kk.size()-1;\r
+ kx2[i1] = kk.size(); kk.push_back(u);\r
}\r
}\r
if(j<m-1)\r
q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);\r
pos = gr->AddPnt(p,c,q); u.c=pos;\r
if(pos<0) continue;\r
- kk.push_back(u); ky2[i1] = kk.size()-1;\r
+ ky2[i1] = kk.size(); kk.push_back(u);\r
}\r
}\r
if(k>0)\r
q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);\r
pos = gr->AddPnt(p,c,q); u.c=pos;\r
if(pos<0) continue;\r
- kk.push_back(u); kz[i1] = kk.size()-1;\r
+ kz[i1] = kk.size(); kk.push_back(u);\r
}\r
}\r
}\r
q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);\r
pos = gr->AddPnt(p,c,q,aa); u.c=pos;\r
if(pos<0) continue;\r
- kk.push_back(u); kx2[i1] = kk.size()-1;\r
+ kx2[i1] = kk.size(); kk.push_back(u);\r
}\r
}\r
if(j<m-1)\r
q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);\r
pos = gr->AddPnt(p,c,q,aa); u.c=pos;\r
if(pos<0) continue;\r
- kk.push_back(u); ky2[i1] = kk.size()-1;\r
+ ky2[i1] = kk.size(); kk.push_back(u);\r
}\r
}\r
if(k>0)\r
q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);\r
pos = gr->AddPnt(p,c,q,aa); u.c=pos;\r
if(pos<0) continue;\r
- kk.push_back(u); kz[i1] = kk.size()-1;\r
+ kz[i1] = kk.size(); kk.push_back(u);\r
}\r
}\r
}\r
q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);\r
pos = gr->AddPnt(p,c,q); u.c=pos;\r
if(pos<0) continue;\r
- kk.push_back(u); kx2[i1] = kk.size()-1;\r
+ kx2[i1] = kk.size(); kk.push_back(u);\r
}\r
}\r
if(j<m-1)\r
q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);\r
pos = gr->AddPnt(p,c,q); u.c=pos;\r
if(pos<0) continue;\r
- kk.push_back(u); ky2[i1] = kk.size()-1;\r
+ ky2[i1] = kk.size(); kk.push_back(u);\r
}\r
}\r
if(k>0)\r
q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);\r
pos = gr->AddPnt(p,c,q); u.c=pos;\r
if(pos<0) continue;\r
- kk.push_back(u); kz[i1] = kk.size()-1;\r
+ kz[i1] = kk.size(); kk.push_back(u);\r
}\r
}\r
}\r
+++ /dev/null
-/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */
-(function() {'use strict';var j=void 0,z=!0,da=this;function ea(a,c){var b=a.split("."),g=da;!(b[0]in g)&&g.execScript&&g.execScript("var "+b[0]);for(var d;b.length&&(d=b.shift());)!b.length&&c!==j?g[d]=c:g=g[d]?g[d]:g[d]={}};var F="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array;function G(a,c){this.index="number"===typeof c?c:0;this.e=0;this.buffer=a instanceof(F?Uint8Array:Array)?a:new (F?Uint8Array:Array)(32768);if(2*this.buffer.length<=this.index)throw Error("invalid index");this.buffer.length<=this.index&&fa(this)}function fa(a){var c=a.buffer,b,g=c.length,d=new (F?Uint8Array:Array)(g<<1);if(F)d.set(c);else for(b=0;b<g;++b)d[b]=c[b];return a.buffer=d}
-G.prototype.b=function(a,c,b){var g=this.buffer,d=this.index,e=this.e,f=g[d],l;b&&1<c&&(a=8<c?(O[a&255]<<24|O[a>>>8&255]<<16|O[a>>>16&255]<<8|O[a>>>24&255])>>32-c:O[a]>>8-c);if(8>c+e)f=f<<c|a,e+=c;else for(l=0;l<c;++l)f=f<<1|a>>c-l-1&1,8===++e&&(e=0,g[d++]=O[f],f=0,d===g.length&&(g=fa(this)));g[d]=f;this.buffer=g;this.e=e;this.index=d};G.prototype.finish=function(){var a=this.buffer,c=this.index,b;0<this.e&&(a[c]<<=8-this.e,a[c]=O[a[c]],c++);F?b=a.subarray(0,c):(a.length=c,b=a);return b};
-var ga=new (F?Uint8Array:Array)(256),P;for(P=0;256>P;++P){for(var R=P,S=R,ha=7,R=R>>>1;R;R>>>=1)S<<=1,S|=R&1,--ha;ga[P]=(S<<ha&255)>>>0}var O=ga;var ia=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,
-2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,
-2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,
-2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,
-3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,
-936918E3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];F&&new Uint32Array(ia);function ja(a){this.buffer=new (F?Uint16Array:Array)(2*a);this.length=0}ja.prototype.getParent=function(a){return 2*((a-2)/4|0)};ja.prototype.push=function(a,c){var b,g,d=this.buffer,e;b=this.length;d[this.length++]=c;for(d[this.length++]=a;0<b;)if(g=this.getParent(b),d[b]>d[g])e=d[b],d[b]=d[g],d[g]=e,e=d[b+1],d[b+1]=d[g+1],d[g+1]=e,b=g;else break;return this.length};
-ja.prototype.pop=function(){var a,c,b=this.buffer,g,d,e;c=b[0];a=b[1];this.length-=2;b[0]=b[this.length];b[1]=b[this.length+1];for(e=0;;){d=2*e+2;if(d>=this.length)break;d+2<this.length&&b[d+2]>b[d]&&(d+=2);if(b[d]>b[e])g=b[e],b[e]=b[d],b[d]=g,g=b[e+1],b[e+1]=b[d+1],b[d+1]=g;else break;e=d}return{index:a,value:c,length:this.length}};function ma(a){var c=a.length,b=0,g=Number.POSITIVE_INFINITY,d,e,f,l,s,k,r,m,h;for(m=0;m<c;++m)a[m]>b&&(b=a[m]),a[m]<g&&(g=a[m]);d=1<<b;e=new (F?Uint32Array:Array)(d);f=1;l=0;for(s=2;f<=b;){for(m=0;m<c;++m)if(a[m]===f){k=0;r=l;for(h=0;h<f;++h)k=k<<1|r&1,r>>=1;for(h=k;h<d;h+=s)e[h]=f<<16|m;++l}++f;l<<=1;s<<=1}};function na(a,c){this.d=oa;this.i=0;this.input=a;this.c=0;c&&(c.lazy&&(this.i=c.lazy),"number"===typeof c.compressionType&&(this.d=c.compressionType),c.outputBuffer&&(this.a=F&&c.outputBuffer instanceof Array?new Uint8Array(c.outputBuffer):c.outputBuffer),"number"===typeof c.outputIndex&&(this.c=c.outputIndex));this.a||(this.a=new (F?Uint8Array:Array)(32768))}var oa=2,pa={NONE:0,h:1,g:oa,n:3},T=[],V;
-for(V=0;288>V;V++)switch(z){case 143>=V:T.push([V+48,8]);break;case 255>=V:T.push([V-144+400,9]);break;case 279>=V:T.push([V-256+0,7]);break;case 287>=V:T.push([V-280+192,8]);break;default:throw"invalid literal: "+V;}
-na.prototype.f=function(){var a,c,b,g,d=this.input;switch(this.d){case 0:b=0;for(g=d.length;b<g;){c=F?d.subarray(b,b+65535):d.slice(b,b+65535);b+=c.length;var e=c,f=b===g,l=j,s=j,k=j,r=j,m=j,h=this.a,n=this.c;if(F){for(h=new Uint8Array(this.a.buffer);h.length<=n+e.length+5;)h=new Uint8Array(h.length<<1);h.set(this.a)}l=f?1:0;h[n++]=l|0;s=e.length;k=~s+65536&65535;h[n++]=s&255;h[n++]=s>>>8&255;h[n++]=k&255;h[n++]=k>>>8&255;if(F)h.set(e,n),n+=e.length,h=h.subarray(0,n);else{r=0;for(m=e.length;r<m;++r)h[n++]=
-e[r];h.length=n}this.c=n;this.a=h}break;case 1:var w=new G(new Uint8Array(this.a.buffer),this.c);w.b(1,1,z);w.b(1,2,z);var q=ra(this,d),u,I,y;u=0;for(I=q.length;u<I;u++)if(y=q[u],G.prototype.b.apply(w,T[y]),256<y)w.b(q[++u],q[++u],z),w.b(q[++u],5),w.b(q[++u],q[++u],z);else if(256===y)break;this.a=w.finish();this.c=this.a.length;break;case oa:var x=new G(new Uint8Array(this.a),this.c),A,i,p,C,B,$=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],Q,Ga,aa,Ha,ka,qa=Array(19),Ia,U,la,D,Ja;A=oa;x.b(1,1,
-z);x.b(A,2,z);i=ra(this,d);Q=sa(this.m,15);Ga=ua(Q);aa=sa(this.l,7);Ha=ua(aa);for(p=286;257<p&&0===Q[p-1];p--);for(C=30;1<C&&0===aa[C-1];C--);var Ka=p,La=C,K=new (F?Uint32Array:Array)(Ka+La),t,L,v,ba,J=new (F?Uint32Array:Array)(316),H,E,M=new (F?Uint8Array:Array)(19);for(t=L=0;t<Ka;t++)K[L++]=Q[t];for(t=0;t<La;t++)K[L++]=aa[t];if(!F){t=0;for(ba=M.length;t<ba;++t)M[t]=0}t=H=0;for(ba=K.length;t<ba;t+=L){for(L=1;t+L<ba&&K[t+L]===K[t];++L);v=L;if(0===K[t])if(3>v)for(;0<v--;)J[H++]=0,M[0]++;else for(;0<
-v;)E=138>v?v:138,E>v-3&&E<v&&(E=v-3),10>=E?(J[H++]=17,J[H++]=E-3,M[17]++):(J[H++]=18,J[H++]=E-11,M[18]++),v-=E;else if(J[H++]=K[t],M[K[t]]++,v--,3>v)for(;0<v--;)J[H++]=K[t],M[K[t]]++;else for(;0<v;)E=6>v?v:6,E>v-3&&E<v&&(E=v-3),J[H++]=16,J[H++]=E-3,M[16]++,v-=E}a=F?J.subarray(0,H):J.slice(0,H);ka=sa(M,7);for(D=0;19>D;D++)qa[D]=ka[$[D]];for(B=19;4<B&&0===qa[B-1];B--);Ia=ua(ka);x.b(p-257,5,z);x.b(C-1,5,z);x.b(B-4,4,z);for(D=0;D<B;D++)x.b(qa[D],3,z);D=0;for(Ja=a.length;D<Ja;D++)if(U=a[D],x.b(Ia[U],ka[U],
-z),16<=U){D++;switch(U){case 16:la=2;break;case 17:la=3;break;case 18:la=7;break;default:throw"invalid code: "+U;}x.b(a[D],la,z)}var Ma=[Ga,Q],Na=[Ha,aa],N,Oa,ca,ta,Pa,Qa,Ra,Sa;Pa=Ma[0];Qa=Ma[1];Ra=Na[0];Sa=Na[1];N=0;for(Oa=i.length;N<Oa;++N)if(ca=i[N],x.b(Pa[ca],Qa[ca],z),256<ca)x.b(i[++N],i[++N],z),ta=i[++N],x.b(Ra[ta],Sa[ta],z),x.b(i[++N],i[++N],z);else if(256===ca)break;this.a=x.finish();this.c=this.a.length;break;default:throw"invalid compression type";}return this.a};
-function va(a,c){this.length=a;this.k=c}
-function wa(){var a=xa;switch(z){case 3===a:return[257,a-3,0];case 4===a:return[258,a-4,0];case 5===a:return[259,a-5,0];case 6===a:return[260,a-6,0];case 7===a:return[261,a-7,0];case 8===a:return[262,a-8,0];case 9===a:return[263,a-9,0];case 10===a:return[264,a-10,0];case 12>=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272,a-
-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:throw"invalid length: "+a;}}var ya=[],xa,za;
-for(xa=3;258>=xa;xa++)za=wa(),ya[xa]=za[2]<<24|za[1]<<16|za[0];var Aa=F?new Uint32Array(ya):ya;
-function ra(a,c){function b(a,c){var b=a.k,d=[],e=0,g;g=Aa[a.length];d[e++]=g&65535;d[e++]=g>>16&255;d[e++]=g>>24;var f;switch(z){case 1===b:f=[0,b-1,0];break;case 2===b:f=[1,b-2,0];break;case 3===b:f=[2,b-3,0];break;case 4===b:f=[3,b-4,0];break;case 6>=b:f=[4,b-5,1];break;case 8>=b:f=[5,b-7,1];break;case 12>=b:f=[6,b-9,2];break;case 16>=b:f=[7,b-13,2];break;case 24>=b:f=[8,b-17,3];break;case 32>=b:f=[9,b-25,3];break;case 48>=b:f=[10,b-33,4];break;case 64>=b:f=[11,b-49,4];break;case 96>=b:f=[12,b-
-65,5];break;case 128>=b:f=[13,b-97,5];break;case 192>=b:f=[14,b-129,6];break;case 256>=b:f=[15,b-193,6];break;case 384>=b:f=[16,b-257,7];break;case 512>=b:f=[17,b-385,7];break;case 768>=b:f=[18,b-513,8];break;case 1024>=b:f=[19,b-769,8];break;case 1536>=b:f=[20,b-1025,9];break;case 2048>=b:f=[21,b-1537,9];break;case 3072>=b:f=[22,b-2049,10];break;case 4096>=b:f=[23,b-3073,10];break;case 6144>=b:f=[24,b-4097,11];break;case 8192>=b:f=[25,b-6145,11];break;case 12288>=b:f=[26,b-8193,12];break;case 16384>=
-b:f=[27,b-12289,12];break;case 24576>=b:f=[28,b-16385,13];break;case 32768>=b:f=[29,b-24577,13];break;default:throw"invalid distance";}g=f;d[e++]=g[0];d[e++]=g[1];d[e++]=g[2];var i,k;i=0;for(k=d.length;i<k;++i)h[n++]=d[i];q[d[0]]++;u[d[3]]++;w=a.length+c-1;m=null}var g,d,e,f,l,s={},k,r,m,h=F?new Uint16Array(2*c.length):[],n=0,w=0,q=new (F?Uint32Array:Array)(286),u=new (F?Uint32Array:Array)(30),I=a.i,y;if(!F){for(e=0;285>=e;)q[e++]=0;for(e=0;29>=e;)u[e++]=0}q[256]=1;g=0;for(d=c.length;g<d;++g){e=l=
-0;for(f=3;e<f&&g+e!==d;++e)l=l<<8|c[g+e];s[l]===j&&(s[l]=[]);k=s[l];if(!(0<w--)){for(;0<k.length&&32768<g-k[0];)k.shift();if(g+3>=d){m&&b(m,-1);e=0;for(f=d-g;e<f;++e)y=c[g+e],h[n++]=y,++q[y];break}if(0<k.length){var x=j,A=j,i=0,p=j,C=j,B=j,$=j,Q=c.length,C=0,$=k.length;a:for(;C<$;C++){x=k[$-C-1];p=3;if(3<i){for(B=i;3<B;B--)if(c[x+B-1]!==c[g+B-1])continue a;p=i}for(;258>p&&g+p<Q&&c[x+p]===c[g+p];)++p;p>i&&(A=x,i=p);if(258===p)break}r=new va(i,g-A);m?m.length<r.length?(y=c[g-1],h[n++]=y,++q[y],b(r,
-0)):b(m,-1):r.length<I?m=r:b(r,0)}else m?b(m,-1):(y=c[g],h[n++]=y,++q[y])}k.push(g)}h[n++]=256;q[256]++;a.m=q;a.l=u;return F?h.subarray(0,n):h}
-function sa(a,c){function b(a){var c=u[a][I[a]];c===m?(b(a+1),b(a+1)):--w[c];++I[a]}var g=a.length,d=new ja(572),e=new (F?Uint8Array:Array)(g),f,l,s,k,r;if(!F)for(k=0;k<g;k++)e[k]=0;for(k=0;k<g;++k)0<a[k]&&d.push(k,a[k]);f=Array(d.length/2);l=new (F?Uint32Array:Array)(d.length/2);if(1===f.length)return e[d.pop().index]=1,e;k=0;for(r=d.length/2;k<r;++k)f[k]=d.pop(),l[k]=f[k].value;var m=l.length,h=new (F?Uint16Array:Array)(c),n=new (F?Uint8Array:Array)(c),w=new (F?Uint8Array:Array)(m),q=Array(c),u=
-Array(c),I=Array(c),y=(1<<c)-m,x=1<<c-1,A,i,p,C,B;h[c-1]=m;for(i=0;i<c;++i)y<x?n[i]=0:(n[i]=1,y-=x),y<<=1,h[c-2-i]=(h[c-1-i]/2|0)+m;h[0]=n[0];q[0]=Array(h[0]);u[0]=Array(h[0]);for(i=1;i<c;++i)h[i]>2*h[i-1]+n[i]&&(h[i]=2*h[i-1]+n[i]),q[i]=Array(h[i]),u[i]=Array(h[i]);for(A=0;A<m;++A)w[A]=c;for(p=0;p<h[c-1];++p)q[c-1][p]=l[p],u[c-1][p]=p;for(A=0;A<c;++A)I[A]=0;1===n[c-1]&&(--w[0],++I[c-1]);for(i=c-2;0<=i;--i){C=A=0;B=I[i+1];for(p=0;p<h[i];p++)C=q[i+1][B]+q[i+1][B+1],C>l[A]?(q[i][p]=C,u[i][p]=m,B+=2):
-(q[i][p]=l[A],u[i][p]=A,++A);I[i]=0;1===n[i]&&b(i)}s=w;k=0;for(r=f.length;k<r;++k)e[f[k].index]=s[k];return e}function ua(a){var c=new (F?Uint16Array:Array)(a.length),b=[],g=[],d=0,e,f,l,s;e=0;for(f=a.length;e<f;e++)b[a[e]]=(b[a[e]]|0)+1;e=1;for(f=16;e<=f;e++)g[e]=d,d+=b[e]|0,d<<=1;e=0;for(f=a.length;e<f;e++){d=g[a[e]];g[a[e]]+=1;l=c[e]=0;for(s=a[e];l<s;l++)c[e]=c[e]<<1|d&1,d>>>=1}return c};var Ba=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];F&&new Uint16Array(Ba);var Ca=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258];F&&new Uint16Array(Ca);var Da=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0];F&&new Uint8Array(Da);var Ea=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577];F&&new Uint16Array(Ea);
-var Fa=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];F&&new Uint8Array(Fa);var Ta=new (F?Uint8Array:Array)(288),W,Ua;W=0;for(Ua=Ta.length;W<Ua;++W)Ta[W]=143>=W?8:255>=W?9:279>=W?7:8;ma(Ta);var Va=new (F?Uint8Array:Array)(30),Wa,Xa;Wa=0;for(Xa=Va.length;Wa<Xa;++Wa)Va[Wa]=5;ma(Va);var Ya=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];F&&new Uint16Array(Ya);var Za=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258];F&&new Uint16Array(Za);var $a=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0];F&&new Uint8Array($a);var ab=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577];F&&new Uint16Array(ab);
-var bb=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];F&&new Uint8Array(bb);var cb=new (F?Uint8Array:Array)(288),X,db;X=0;for(db=cb.length;X<db;++X)cb[X]=143>=X?8:255>=X?9:279>=X?7:8;ma(cb);var eb=new (F?Uint8Array:Array)(30),fb,gb;fb=0;for(gb=eb.length;fb<gb;++fb)eb[fb]=5;ma(eb);function hb(a,c){this.input=a;this.a=new (F?Uint8Array:Array)(32768);this.d=Y.g;var b={},g;if((c||!(c={}))&&"number"===typeof c.compressionType)this.d=c.compressionType;for(g in c)b[g]=c[g];b.outputBuffer=this.a;this.j=new na(this.input,b)}var Y=pa;
-hb.prototype.f=function(){var a,c,b,g,d,e,f,l=0;f=this.a;a=ib;switch(a){case ib:c=Math.LOG2E*Math.log(32768)-8;break;default:throw Error("invalid compression method");}b=c<<4|a;f[l++]=b;switch(a){case ib:switch(this.d){case Y.NONE:d=0;break;case Y.h:d=1;break;case Y.g:d=2;break;default:throw Error("unsupported compression type");}break;default:throw Error("invalid compression method");}g=d<<6|0;f[l++]=g|31-(256*b+g)%31;var s=this.input;if("string"===typeof s){var k=s.split(""),r,m;r=0;for(m=k.length;r<
-m;r++)k[r]=(k[r].charCodeAt(0)&255)>>>0;s=k}for(var h=1,n=0,w=s.length,q,u=0;0<w;){q=1024<w?1024:w;w-=q;do h+=s[u++],n+=h;while(--q);h%=65521;n%=65521}e=(n<<16|h)>>>0;this.j.c=l;f=this.j.f();l=f.length;F&&(f=new Uint8Array(f.buffer),f.length<=l+4&&(this.a=new Uint8Array(f.length+4),this.a.set(f),f=this.a),f=f.subarray(0,l+4));f[l++]=e>>24&255;f[l++]=e>>16&255;f[l++]=e>>8&255;f[l++]=e&255;return f};ea("Zlib.Deflate",hb);ea("Zlib.Deflate.compress",function(a,c){return(new hb(a,c)).f()});ea("Zlib.Deflate.prototype.compress",hb.prototype.f);var jb={NONE:Y.NONE,FIXED:Y.h,DYNAMIC:Y.g},kb,lb,Z,mb;if(Object.keys)kb=Object.keys(jb);else for(lb in kb=[],Z=0,jb)kb[Z++]=lb;Z=0;for(mb=kb.length;Z<mb;++Z)lb=kb[Z],ea("Zlib.Deflate.CompressionType."+lb,jb[lb]);var ib=8;}).call(this);
+++ /dev/null
-/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */
-(function() {'use strict';function k(a){throw a;}var m=void 0,aa=this;function p(a,c){var d=a.split("."),b=aa;!(d[0]in b)&&b.execScript&&b.execScript("var "+d[0]);for(var e;d.length&&(e=d.shift());)!d.length&&c!==m?b[e]=c:b=b[e]?b[e]:b[e]={}};var s="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array;new (s?Uint8Array:Array)(256);var t;for(t=0;256>t;++t)for(var u=t,ba=7,u=u>>>1;u;u>>>=1)--ba;function v(a,c,d){var b,e="number"===typeof c?c:c=0,f="number"===typeof d?d:a.length;b=-1;for(e=f&7;e--;++c)b=b>>>8^w[(b^a[c])&255];for(e=f>>3;e--;c+=8)b=b>>>8^w[(b^a[c])&255],b=b>>>8^w[(b^a[c+1])&255],b=b>>>8^w[(b^a[c+2])&255],b=b>>>8^w[(b^a[c+3])&255],b=b>>>8^w[(b^a[c+4])&255],b=b>>>8^w[(b^a[c+5])&255],b=b>>>8^w[(b^a[c+6])&255],b=b>>>8^w[(b^a[c+7])&255];return(b^4294967295)>>>0}
-var w,x=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,
-2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,
-2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,
-2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,
-3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,
-936918E3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];w=s?new Uint32Array(x):x;function y(){}y.prototype.getName=function(){return this.name};y.prototype.getData=function(){return this.data};y.prototype.G=function(){return this.H};p("Zlib.GunzipMember",y);p("Zlib.GunzipMember.prototype.getName",y.prototype.getName);p("Zlib.GunzipMember.prototype.getData",y.prototype.getData);p("Zlib.GunzipMember.prototype.getMtime",y.prototype.G);function z(a){var c=a.length,d=0,b=Number.POSITIVE_INFINITY,e,f,g,i,l,n,r,h,j;for(h=0;h<c;++h)a[h]>d&&(d=a[h]),a[h]<b&&(b=a[h]);e=1<<d;f=new (s?Uint32Array:Array)(e);g=1;i=0;for(l=2;g<=d;){for(h=0;h<c;++h)if(a[h]===g){n=0;r=i;for(j=0;j<g;++j)n=n<<1|r&1,r>>=1;for(j=n;j<e;j+=l)f[j]=g<<16|h;++i}++g;i<<=1;l<<=1}return[f,d,b]};var B=[],C;for(C=0;288>C;C++)switch(!0){case 143>=C:B.push([C+48,8]);break;case 255>=C:B.push([C-144+400,9]);break;case 279>=C:B.push([C-256+0,7]);break;case 287>=C:B.push([C-280+192,8]);break;default:k("invalid literal: "+C)}
-function ca(){var a=D;switch(!0){case 3===a:return[257,a-3,0];case 4===a:return[258,a-4,0];case 5===a:return[259,a-5,0];case 6===a:return[260,a-6,0];case 7===a:return[261,a-7,0];case 8===a:return[262,a-8,0];case 9===a:return[263,a-9,0];case 10===a:return[264,a-10,0];case 12>=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272,a-
-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:k("invalid length: "+a)}}var E=[],D,G;
-for(D=3;258>=D;D++)G=ca(),E[D]=G[2]<<24|G[1]<<16|G[0];s&&new Uint32Array(E);function H(a,c){this.i=[];this.j=32768;this.d=this.f=this.c=this.n=0;this.input=s?new Uint8Array(a):a;this.o=!1;this.k=I;this.w=!1;if(c||!(c={}))c.index&&(this.c=c.index),c.bufferSize&&(this.j=c.bufferSize),c.bufferType&&(this.k=c.bufferType),c.resize&&(this.w=c.resize);switch(this.k){case J:this.a=32768;this.b=new (s?Uint8Array:Array)(32768+this.j+258);break;case I:this.a=0;this.b=new (s?Uint8Array:Array)(this.j);this.e=this.D;this.q=this.A;this.l=this.C;break;default:k(Error("invalid inflate mode"))}}
-var J=0,I=1;
-H.prototype.g=function(){for(;!this.o;){var a=K(this,3);a&1&&(this.o=!0);a>>>=1;switch(a){case 0:var c=this.input,d=this.c,b=this.b,e=this.a,f=m,g=m,i=m,l=b.length,n=m;this.d=this.f=0;f=c[d++];f===m&&k(Error("invalid uncompressed block header: LEN (first byte)"));g=f;f=c[d++];f===m&&k(Error("invalid uncompressed block header: LEN (second byte)"));g|=f<<8;f=c[d++];f===m&&k(Error("invalid uncompressed block header: NLEN (first byte)"));i=f;f=c[d++];f===m&&k(Error("invalid uncompressed block header: NLEN (second byte)"));i|=
-f<<8;g===~i&&k(Error("invalid uncompressed block header: length verify"));d+g>c.length&&k(Error("input buffer is broken"));switch(this.k){case J:for(;e+g>b.length;){n=l-e;g-=n;if(s)b.set(c.subarray(d,d+n),e),e+=n,d+=n;else for(;n--;)b[e++]=c[d++];this.a=e;b=this.e();e=this.a}break;case I:for(;e+g>b.length;)b=this.e({t:2});break;default:k(Error("invalid inflate mode"))}if(s)b.set(c.subarray(d,d+g),e),e+=g,d+=g;else for(;g--;)b[e++]=c[d++];this.c=d;this.a=e;this.b=b;break;case 1:this.l(da,ea);break;
-case 2:fa(this);break;default:k(Error("unknown BTYPE: "+a))}}return this.q()};
-var L=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],ga=s?new Uint16Array(L):L,ha=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],ia=s?new Uint16Array(ha):ha,ja=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],M=s?new Uint8Array(ja):ja,ka=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],la=s?new Uint16Array(ka):ka,ma=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,
-11,12,12,13,13],O=s?new Uint8Array(ma):ma,P=new (s?Uint8Array:Array)(288),Q,na;Q=0;for(na=P.length;Q<na;++Q)P[Q]=143>=Q?8:255>=Q?9:279>=Q?7:8;var da=z(P),R=new (s?Uint8Array:Array)(30),S,oa;S=0;for(oa=R.length;S<oa;++S)R[S]=5;var ea=z(R);function K(a,c){for(var d=a.f,b=a.d,e=a.input,f=a.c,g;b<c;)g=e[f++],g===m&&k(Error("input buffer is broken")),d|=g<<b,b+=8;g=d&(1<<c)-1;a.f=d>>>c;a.d=b-c;a.c=f;return g}
-function V(a,c){for(var d=a.f,b=a.d,e=a.input,f=a.c,g=c[0],i=c[1],l,n,r;b<i;)l=e[f++],l===m&&k(Error("input buffer is broken")),d|=l<<b,b+=8;n=g[d&(1<<i)-1];r=n>>>16;a.f=d>>r;a.d=b-r;a.c=f;return n&65535}
-function fa(a){function c(a,c,b){var d,e,f,g;for(g=0;g<a;)switch(d=V(this,c),d){case 16:for(f=3+K(this,2);f--;)b[g++]=e;break;case 17:for(f=3+K(this,3);f--;)b[g++]=0;e=0;break;case 18:for(f=11+K(this,7);f--;)b[g++]=0;e=0;break;default:e=b[g++]=d}return b}var d=K(a,5)+257,b=K(a,5)+1,e=K(a,4)+4,f=new (s?Uint8Array:Array)(ga.length),g,i,l,n;for(n=0;n<e;++n)f[ga[n]]=K(a,3);g=z(f);i=new (s?Uint8Array:Array)(d);l=new (s?Uint8Array:Array)(b);a.l(z(c.call(a,d,g,i)),z(c.call(a,b,g,l)))}
-H.prototype.l=function(a,c){var d=this.b,b=this.a;this.r=a;for(var e=d.length-258,f,g,i,l;256!==(f=V(this,a));)if(256>f)b>=e&&(this.a=b,d=this.e(),b=this.a),d[b++]=f;else{g=f-257;l=ia[g];0<M[g]&&(l+=K(this,M[g]));f=V(this,c);i=la[f];0<O[f]&&(i+=K(this,O[f]));b>=e&&(this.a=b,d=this.e(),b=this.a);for(;l--;)d[b]=d[b++-i]}for(;8<=this.d;)this.d-=8,this.c--;this.a=b};
-H.prototype.C=function(a,c){var d=this.b,b=this.a;this.r=a;for(var e=d.length,f,g,i,l;256!==(f=V(this,a));)if(256>f)b>=e&&(d=this.e(),e=d.length),d[b++]=f;else{g=f-257;l=ia[g];0<M[g]&&(l+=K(this,M[g]));f=V(this,c);i=la[f];0<O[f]&&(i+=K(this,O[f]));b+l>e&&(d=this.e(),e=d.length);for(;l--;)d[b]=d[b++-i]}for(;8<=this.d;)this.d-=8,this.c--;this.a=b};
-H.prototype.e=function(){var a=new (s?Uint8Array:Array)(this.a-32768),c=this.a-32768,d,b,e=this.b;if(s)a.set(e.subarray(32768,a.length));else{d=0;for(b=a.length;d<b;++d)a[d]=e[d+32768]}this.i.push(a);this.n+=a.length;if(s)e.set(e.subarray(c,c+32768));else for(d=0;32768>d;++d)e[d]=e[c+d];this.a=32768;return e};
-H.prototype.D=function(a){var c,d=this.input.length/this.c+1|0,b,e,f,g=this.input,i=this.b;a&&("number"===typeof a.t&&(d=a.t),"number"===typeof a.z&&(d+=a.z));2>d?(b=(g.length-this.c)/this.r[2],f=258*(b/2)|0,e=f<i.length?i.length+f:i.length<<1):e=i.length*d;s?(c=new Uint8Array(e),c.set(i)):c=i;return this.b=c};
-H.prototype.q=function(){var a=0,c=this.b,d=this.i,b,e=new (s?Uint8Array:Array)(this.n+(this.a-32768)),f,g,i,l;if(0===d.length)return s?this.b.subarray(32768,this.a):this.b.slice(32768,this.a);f=0;for(g=d.length;f<g;++f){b=d[f];i=0;for(l=b.length;i<l;++i)e[a++]=b[i]}f=32768;for(g=this.a;f<g;++f)e[a++]=c[f];this.i=[];return this.buffer=e};
-H.prototype.A=function(){var a,c=this.a;s?this.w?(a=new Uint8Array(c),a.set(this.b.subarray(0,c))):a=this.b.subarray(0,c):(this.b.length>c&&(this.b.length=c),a=this.b);return this.buffer=a};function W(a){this.input=a;this.c=0;this.m=[];this.s=!1}W.prototype.F=function(){this.s||this.g();return this.m.slice()};
-W.prototype.g=function(){for(var a=this.input.length;this.c<a;){var c=new y,d=m,b=m,e=m,f=m,g=m,i=m,l=m,n=m,r=m,h=this.input,j=this.c;c.u=h[j++];c.v=h[j++];(31!==c.u||139!==c.v)&&k(Error("invalid file signature:"+c.u+","+c.v));c.p=h[j++];switch(c.p){case 8:break;default:k(Error("unknown compression method: "+c.p))}c.h=h[j++];n=h[j++]|h[j++]<<8|h[j++]<<16|h[j++]<<24;c.H=new Date(1E3*n);c.N=h[j++];c.M=h[j++];0<(c.h&4)&&(c.I=h[j++]|h[j++]<<8,j+=c.I);if(0<(c.h&8)){l=[];for(i=0;0<(g=h[j++]);)l[i++]=String.fromCharCode(g);
-c.name=l.join("")}if(0<(c.h&16)){l=[];for(i=0;0<(g=h[j++]);)l[i++]=String.fromCharCode(g);c.J=l.join("")}0<(c.h&2)&&(c.B=v(h,0,j)&65535,c.B!==(h[j++]|h[j++]<<8)&&k(Error("invalid header crc16")));d=h[h.length-4]|h[h.length-3]<<8|h[h.length-2]<<16|h[h.length-1]<<24;h.length-j-4-4<512*d&&(f=d);b=new H(h,{index:j,bufferSize:f});c.data=e=b.g();j=b.c;c.K=r=(h[j++]|h[j++]<<8|h[j++]<<16|h[j++]<<24)>>>0;v(e,m,m)!==r&&k(Error("invalid CRC-32 checksum: 0x"+v(e,m,m).toString(16)+" / 0x"+r.toString(16)));c.L=
-d=(h[j++]|h[j++]<<8|h[j++]<<16|h[j++]<<24)>>>0;(e.length&4294967295)!==d&&k(Error("invalid input size: "+(e.length&4294967295)+" / "+d));this.m.push(c);this.c=j}this.s=!0;var F=this.m,q,N,T=0,U=0,A;q=0;for(N=F.length;q<N;++q)U+=F[q].data.length;if(s){A=new Uint8Array(U);for(q=0;q<N;++q)A.set(F[q].data,T),T+=F[q].data.length}else{A=[];for(q=0;q<N;++q)A[q]=F[q].data;A=Array.prototype.concat.apply([],A)}return A};p("Zlib.Gunzip",W);p("Zlib.Gunzip.prototype.decompress",W.prototype.g);p("Zlib.Gunzip.prototype.getMembers",W.prototype.F);var pa=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];s&&new Uint16Array(pa);var qa=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258];s&&new Uint16Array(qa);var ra=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0];s&&new Uint8Array(ra);var sa=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577];s&&new Uint16Array(sa);
-var ta=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];s&&new Uint8Array(ta);var X=new (s?Uint8Array:Array)(288),Y,ua;Y=0;for(ua=X.length;Y<ua;++Y)X[Y]=143>=Y?8:255>=Y?9:279>=Y?7:8;z(X);var Z=new (s?Uint8Array:Array)(30),$,va;$=0;for(va=Z.length;$<va;++$)Z[$]=5;z(Z);}).call(this);
+++ /dev/null
-/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */
-(function() {'use strict';function i(a){throw a;}var l=void 0,aa=this;function p(a,d){var b=a.split("."),c=aa;!(b[0]in c)&&c.execScript&&c.execScript("var "+b[0]);for(var f;b.length&&(f=b.shift());)!b.length&&d!==l?c[f]=d:c=c[f]?c[f]:c[f]={}};var q="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array;new (q?Uint8Array:Array)(256);var r;for(r=0;256>r;++r)for(var t=r,ba=7,t=t>>>1;t;t>>>=1)--ba;var ca=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,
-2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,
-2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,
-2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,
-3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,
-936918E3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];q&&new Uint32Array(ca);function u(a){var d=a.length,b=0,c=Number.POSITIVE_INFINITY,f,e,g,h,j,k,n,m,s;for(m=0;m<d;++m)a[m]>b&&(b=a[m]),a[m]<c&&(c=a[m]);f=1<<b;e=new (q?Uint32Array:Array)(f);g=1;h=0;for(j=2;g<=b;){for(m=0;m<d;++m)if(a[m]===g){k=0;n=h;for(s=0;s<g;++s)k=k<<1|n&1,n>>=1;for(s=k;s<f;s+=j)e[s]=g<<16|m;++h}++g;h<<=1;j<<=1}return[e,b,c]};var v=[],w;for(w=0;288>w;w++)switch(!0){case 143>=w:v.push([w+48,8]);break;case 255>=w:v.push([w-144+400,9]);break;case 279>=w:v.push([w-256+0,7]);break;case 287>=w:v.push([w-280+192,8]);break;default:i("invalid literal: "+w)}
-function da(){var a=x;switch(!0){case 3===a:return[257,a-3,0];case 4===a:return[258,a-4,0];case 5===a:return[259,a-5,0];case 6===a:return[260,a-6,0];case 7===a:return[261,a-7,0];case 8===a:return[262,a-8,0];case 9===a:return[263,a-9,0];case 10===a:return[264,a-10,0];case 12>=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272,a-
-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:i("invalid length: "+a)}}var y=[],x,z;
-for(x=3;258>=x;x++)z=da(),y[x]=z[2]<<24|z[1]<<16|z[0];q&&new Uint32Array(y);function A(a,d){this.g=[];this.h=32768;this.d=this.f=this.a=this.l=0;this.input=q?new Uint8Array(a):a;this.m=!1;this.i=B;this.r=!1;if(d||!(d={}))d.index&&(this.a=d.index),d.bufferSize&&(this.h=d.bufferSize),d.bufferType&&(this.i=d.bufferType),d.resize&&(this.r=d.resize);switch(this.i){case C:this.b=32768;this.c=new (q?Uint8Array:Array)(32768+this.h+258);break;case B:this.b=0;this.c=new (q?Uint8Array:Array)(this.h);this.e=this.z;this.n=this.v;this.j=this.w;break;default:i(Error("invalid inflate mode"))}}
-var C=0,B=1,D={t:C,s:B};
-A.prototype.k=function(){for(;!this.m;){var a=E(this,3);a&1&&(this.m=!0);a>>>=1;switch(a){case 0:var d=this.input,b=this.a,c=this.c,f=this.b,e=l,g=l,h=l,j=c.length,k=l;this.d=this.f=0;e=d[b++];e===l&&i(Error("invalid uncompressed block header: LEN (first byte)"));g=e;e=d[b++];e===l&&i(Error("invalid uncompressed block header: LEN (second byte)"));g|=e<<8;e=d[b++];e===l&&i(Error("invalid uncompressed block header: NLEN (first byte)"));h=e;e=d[b++];e===l&&i(Error("invalid uncompressed block header: NLEN (second byte)"));h|=
-e<<8;g===~h&&i(Error("invalid uncompressed block header: length verify"));b+g>d.length&&i(Error("input buffer is broken"));switch(this.i){case C:for(;f+g>c.length;){k=j-f;g-=k;if(q)c.set(d.subarray(b,b+k),f),f+=k,b+=k;else for(;k--;)c[f++]=d[b++];this.b=f;c=this.e();f=this.b}break;case B:for(;f+g>c.length;)c=this.e({p:2});break;default:i(Error("invalid inflate mode"))}if(q)c.set(d.subarray(b,b+g),f),f+=g,b+=g;else for(;g--;)c[f++]=d[b++];this.a=b;this.b=f;this.c=c;break;case 1:this.j(ea,fa);break;
-case 2:ga(this);break;default:i(Error("unknown BTYPE: "+a))}}return this.n()};
-var F=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],G=q?new Uint16Array(F):F,H=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],I=q?new Uint16Array(H):H,J=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],K=q?new Uint8Array(J):J,L=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],ha=q?new Uint16Array(L):L,ia=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,
-13,13],M=q?new Uint8Array(ia):ia,N=new (q?Uint8Array:Array)(288),O,ja;O=0;for(ja=N.length;O<ja;++O)N[O]=143>=O?8:255>=O?9:279>=O?7:8;var ea=u(N),P=new (q?Uint8Array:Array)(30),Q,ka;Q=0;for(ka=P.length;Q<ka;++Q)P[Q]=5;var fa=u(P);function E(a,d){for(var b=a.f,c=a.d,f=a.input,e=a.a,g;c<d;)g=f[e++],g===l&&i(Error("input buffer is broken")),b|=g<<c,c+=8;g=b&(1<<d)-1;a.f=b>>>d;a.d=c-d;a.a=e;return g}
-function R(a,d){for(var b=a.f,c=a.d,f=a.input,e=a.a,g=d[0],h=d[1],j,k,n;c<h;)j=f[e++],j===l&&i(Error("input buffer is broken")),b|=j<<c,c+=8;k=g[b&(1<<h)-1];n=k>>>16;a.f=b>>n;a.d=c-n;a.a=e;return k&65535}
-function ga(a){function d(a,b,c){var d,e,f,g;for(g=0;g<a;)switch(d=R(this,b),d){case 16:for(f=3+E(this,2);f--;)c[g++]=e;break;case 17:for(f=3+E(this,3);f--;)c[g++]=0;e=0;break;case 18:for(f=11+E(this,7);f--;)c[g++]=0;e=0;break;default:e=c[g++]=d}return c}var b=E(a,5)+257,c=E(a,5)+1,f=E(a,4)+4,e=new (q?Uint8Array:Array)(G.length),g,h,j,k;for(k=0;k<f;++k)e[G[k]]=E(a,3);g=u(e);h=new (q?Uint8Array:Array)(b);j=new (q?Uint8Array:Array)(c);a.j(u(d.call(a,b,g,h)),u(d.call(a,c,g,j)))}
-A.prototype.j=function(a,d){var b=this.c,c=this.b;this.o=a;for(var f=b.length-258,e,g,h,j;256!==(e=R(this,a));)if(256>e)c>=f&&(this.b=c,b=this.e(),c=this.b),b[c++]=e;else{g=e-257;j=I[g];0<K[g]&&(j+=E(this,K[g]));e=R(this,d);h=ha[e];0<M[e]&&(h+=E(this,M[e]));c>=f&&(this.b=c,b=this.e(),c=this.b);for(;j--;)b[c]=b[c++-h]}for(;8<=this.d;)this.d-=8,this.a--;this.b=c};
-A.prototype.w=function(a,d){var b=this.c,c=this.b;this.o=a;for(var f=b.length,e,g,h,j;256!==(e=R(this,a));)if(256>e)c>=f&&(b=this.e(),f=b.length),b[c++]=e;else{g=e-257;j=I[g];0<K[g]&&(j+=E(this,K[g]));e=R(this,d);h=ha[e];0<M[e]&&(h+=E(this,M[e]));c+j>f&&(b=this.e(),f=b.length);for(;j--;)b[c]=b[c++-h]}for(;8<=this.d;)this.d-=8,this.a--;this.b=c};
-A.prototype.e=function(){var a=new (q?Uint8Array:Array)(this.b-32768),d=this.b-32768,b,c,f=this.c;if(q)a.set(f.subarray(32768,a.length));else{b=0;for(c=a.length;b<c;++b)a[b]=f[b+32768]}this.g.push(a);this.l+=a.length;if(q)f.set(f.subarray(d,d+32768));else for(b=0;32768>b;++b)f[b]=f[d+b];this.b=32768;return f};
-A.prototype.z=function(a){var d,b=this.input.length/this.a+1|0,c,f,e,g=this.input,h=this.c;a&&("number"===typeof a.p&&(b=a.p),"number"===typeof a.u&&(b+=a.u));2>b?(c=(g.length-this.a)/this.o[2],e=258*(c/2)|0,f=e<h.length?h.length+e:h.length<<1):f=h.length*b;q?(d=new Uint8Array(f),d.set(h)):d=h;return this.c=d};
-A.prototype.n=function(){var a=0,d=this.c,b=this.g,c,f=new (q?Uint8Array:Array)(this.l+(this.b-32768)),e,g,h,j;if(0===b.length)return q?this.c.subarray(32768,this.b):this.c.slice(32768,this.b);e=0;for(g=b.length;e<g;++e){c=b[e];h=0;for(j=c.length;h<j;++h)f[a++]=c[h]}e=32768;for(g=this.b;e<g;++e)f[a++]=d[e];this.g=[];return this.buffer=f};
-A.prototype.v=function(){var a,d=this.b;q?this.r?(a=new Uint8Array(d),a.set(this.c.subarray(0,d))):a=this.c.subarray(0,d):(this.c.length>d&&(this.c.length=d),a=this.c);return this.buffer=a};var la=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];q&&new Uint16Array(la);var ma=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258];q&&new Uint16Array(ma);var na=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0];q&&new Uint8Array(na);var oa=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577];q&&new Uint16Array(oa);
-var pa=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];q&&new Uint8Array(pa);var S=new (q?Uint8Array:Array)(288),T,qa;T=0;for(qa=S.length;T<qa;++T)S[T]=143>=T?8:255>=T?9:279>=T?7:8;u(S);var U=new (q?Uint8Array:Array)(30),V,ra;V=0;for(ra=U.length;V<ra;++V)U[V]=5;u(U);function W(a,d){var b,c;this.input=a;this.a=0;if(d||!(d={}))d.index&&(this.a=d.index),d.verify&&(this.A=d.verify);b=a[this.a++];c=a[this.a++];switch(b&15){case sa:this.method=sa;break;default:i(Error("unsupported compression method"))}0!==((b<<8)+c)%31&&i(Error("invalid fcheck flag:"+((b<<8)+c)%31));c&32&&i(Error("fdict flag is not supported"));this.q=new A(a,{index:this.a,bufferSize:d.bufferSize,bufferType:d.bufferType,resize:d.resize})}
-W.prototype.k=function(){var a=this.input,d,b;d=this.q.k();this.a=this.q.a;if(this.A){b=(a[this.a++]<<24|a[this.a++]<<16|a[this.a++]<<8|a[this.a++])>>>0;var c=d;if("string"===typeof c){var f=c.split(""),e,g;e=0;for(g=f.length;e<g;e++)f[e]=(f[e].charCodeAt(0)&255)>>>0;c=f}for(var h=1,j=0,k=c.length,n,m=0;0<k;){n=1024<k?1024:k;k-=n;do h+=c[m++],j+=h;while(--n);h%=65521;j%=65521}b!==(j<<16|h)>>>0&&i(Error("invalid adler-32 checksum"))}return d};p("Zlib.Inflate",W);p("Zlib.Inflate.prototype.decompress",W.prototype.k);var X={ADAPTIVE:D.s,BLOCK:D.t},Y,Z,$,ta;if(Object.keys)Y=Object.keys(X);else for(Z in Y=[],$=0,X)Y[$++]=Z;$=0;for(ta=Y.length;$<ta;++$)Z=Y[$],p("Zlib.Inflate.BufferType."+Z,X[Z]);var sa=8;}).call(this);
@item
I'm thankful to S. Skobelev, C. Mikhailenko, M. Veysman, A. Prokhorov, A. Korotkevich, V. Onuchin, S.M. Plis, R. Kiselev, A. Ivanov, N. Troickiy and V. Lipatov for fruitful comments.
@item
-I'm thankful to sponsors M. Veysman (@uref{http://jiht.ru/en/about/structure.php?set_filter_structure=Y&structure_UF_DEPARTMENT=241&filter=Y&set_filter=Y, IHED RAS}) and A. Prokhorov (@url{www.datadvance.net, $DATADVANCE}).
+I'm thankful to sponsors M. Veysman (@uref{http://jiht.ru/en/about/structure.php?set_filter_structure=Y&structure_UF_DEPARTMENT=241&filter=Y&set_filter=Y, IHED RAS}) and A. Prokhorov (@url{www.datadvance.net, DATADVANCE}).
@end itemize
-Javascript interface was developed with support of @url{www.datadvance.net, $DATADVANCE} company.
+Javascript interface was developed with support of @url{www.datadvance.net, DATADVANCE} company.
@external{}
@item
Я благодарен С. Скобелеву, К. Михайленко, М. Вейсману, A. Прохорову, A. Короткевичу, В. Онучину, С. Плису, Р. Киселеву, A. Иванову, Н. Троицкому and В. Липатову за продуктивные предложения и обсуждения.
@item
-Я благодарен спонсорам М. Вейсману (@url{http://www.jiht.ru/about/structure.php?set_filter_structure=Y&structure_UF_DEPARTMENT=241&filter=Y&set_filter=Y, ОИВТ РАН}) и A. Прохорову (@url{www.datadvance.net, $DATADVANCE}).
+Я благодарен спонсорам М. Вейсману (@url{http://www.jiht.ru/about/structure.php?set_filter_structure=Y&structure_UF_DEPARTMENT=241&filter=Y&set_filter=Y, ОИВТ РАН}) и A. Прохорову (@url{www.datadvance.net, DATADVANCE}).
@end itemize
-Javascript интерфейс был разработан при поддержке компании @url{www.datadvance.net, $DATADVANCE}.
+Javascript интерфейс был разработан при поддержке компании @url{www.datadvance.net, DATADVANCE}.
@external{}
@set VERSION 2.2
@set MINVER .1
-@set MINVER
+@c @set MINVER
@end ifhtml
@strong{About LGPL and GPL licenses.}
-Generally MathGL is GPL library. However, you can use LGPL license for MathGL core if you don't use wrapper widget classes, SWIG-based interfaces and disable GSL features. This can be done by using @code{lgpl} option at build time. According this, I've added the LGPL win32 binaries into @ref{Download} page.
+Generally, MathGL is GPL library. However, you can use LGPL license for MathGL core and widgets if you don't use SWIG-based interfaces and disable GSL features. This can be done by using @code{lgpl} option at build time. According this, I've added the LGPL win32 binaries into @ref{Download} page.
@strong{Latest news}
@itemize
@ifhtml
@html
-<a href="http://www.datadvance.net"><img border="0" align="right" hspace="10" alt="$DATADVANCE" src="../datadvance.png"></a>
+<a href="http://www.datadvance.net"><img border="0" align="right" hspace="10" alt="DATADVANCE" src="../datadvance.png"></a>
@end html
@end ifhtml
-Javascript interface was developed with support of @url{http://www.datadvance.net, $DATADVANCE} company.
+Javascript interface was developed with support of @url{http://www.datadvance.net, DATADVANCE} company.
@external{}
@item
@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.tar.gz,source} file with cmake build system.
@item
-@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}-mingw.i686.7z,Win32 GPL} binaries for MinGW (build for i686)
+@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}-mingw.i686.7z,Win32 GPL} binaries for MinGW (build for i686)
@item
-@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.LGPL-mingw.i686.7z,Win32 LGPL} binaries for MinGW (build for i686, no GSL and HDF5 support)
+@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-mingw.i686.7z,Win32 LGPL} binaries for MinGW (build for i686, no GSL and HDF5 support)
@c @item
-@c @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.LGPL-win64.7z,Win64 LGPL} binaries for MSVS 2010 (no GSL and HDF5 support)
+@c @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-win64.7z,Win64 LGPL} binaries for MSVS 2010 (no GSL and HDF5 support)
@item
-@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.eng.pdf,PDF} documentation in English
+@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.eng.pdf,PDF} documentation in English
@item
-@uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}.7z, UDAV and utilities} with all required DLL files (build for i686)
+@uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}@value{MINVER}.7z, UDAV and utilities} with all required DLL files (build for i686)
@c HTML documentation in English
@c HTML documentation in Russian
@c @item
@end ifhtml
@strong{About LGPL and GPL licenses.}
-Generally MathGL is GPL library. However, you can use LGPL license for MathGL core if you don't use wrapper widget classes, SWIG-based interfaces and disable GSL features. This can be done by using @code{lgpl} option at build time. According this, I've added the LGPL win32 binaries into @ref{Download} page.
+Generally, MathGL is GPL library. However, you can use LGPL license for MathGL core and widgets if you don't use SWIG-based interfaces and disable GSL features. This can be done by using @code{lgpl} option at build time. According this, I've added the LGPL win32 binaries into @ref{Download} page.
@strong{Latest news}
@itemize
@ifhtml
@html
-<a href="http://www.datadvance.net"><img border="0" align="right" hspace="10" alt="$DATADVANCE" src="../datadvance.png"></a>
+<a href="http://www.datadvance.net"><img border="0" align="right" hspace="10" alt="DATADVANCE" src="../datadvance.png"></a>
@end html
@end ifhtml
-Javascript interface was developed with support of @url{http://www.datadvance.net, $DATADVANCE} company.
+Javascript interface was developed with support of @url{http://www.datadvance.net, DATADVANCE} company.
@external{}
@end ifhtml
@strong{About LGPL and GPL licenses.}
-Generally MathGL is GPL library. However, you can use LGPL license for MathGL core if you don't use wrapper widget classes, SWIG-based interfaces and disable GSL features. This can be done by using @code{lgpl} option at build time. According this, I've added the LGPL win32 binaries into @ref{Download} page.
+Generally, MathGL is GPL library. However, you can use LGPL license for MathGL core and widgets if you don't use SWIG-based interfaces and disable GSL features. This can be done by using @code{lgpl} option at build time. According this, I've added the LGPL win32 binaries into @ref{Download} page.
@strong{Latest news}
@itemize
@ifhtml
@html
-<a href="http://www.datadvance.net"><img border="0" align="right" hspace="10" alt="$DATADVANCE" src="../datadvance.png"></a>
+<a href="http://www.datadvance.net"><img border="0" align="right" hspace="10" alt="DATADVANCE" src="../datadvance.png"></a>
@end html
@end ifhtml
-Javascript interface was developed with support of @url{http://www.datadvance.net, $DATADVANCE} company.
+Javascript interface was developed with support of @url{http://www.datadvance.net, DATADVANCE} company.
@external{}
@item
@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.tar.gz,source} file with cmake build system.
@item
-@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}-mingw.i686.7z,Win32 GPL} binaries for MinGW (build for i686)
+@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}-mingw.i686.7z,Win32 GPL} binaries for MinGW (build for i686)
@item
-@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.LGPL-mingw.i686.7z,Win32 LGPL} binaries for MinGW (build for i686, no GSL and HDF5 support)
+@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-mingw.i686.7z,Win32 LGPL} binaries for MinGW (build for i686, no GSL and HDF5 support)
@c @item
-@c @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.LGPL-win64.7z,Win64 LGPL} binaries for MSVS 2010 (no GSL and HDF5 support)
+@c @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-win64.7z,Win64 LGPL} binaries for MSVS 2010 (no GSL and HDF5 support)
@item
-@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.eng.pdf,PDF} documentation in English
+@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.eng.pdf,PDF} documentation in English
@item
-@uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}.7z, UDAV and utilities} with all required DLL files (build for i686)
+@uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}@value{MINVER}.7z, UDAV and utilities} with all required DLL files (build for i686)
@c HTML documentation in English
@c HTML documentation in Russian
@c @item
17. 'perspective' command in UDAV
18. Check octave 3.8
21. Use mglFormulaCalc() for data transformation/filling (much faster but require more memory) + the same for complex
+22. Test mglDataC::Diffraction() + write sample + add rational function???
+24. Use mglStack<T> instead of std::vector<T> due to multi-threading
+25. Get true coordinates in CalcXYZ for curved equations too
+27. Add mglDataVar, mglDataCol, mglDataFunc for handling special (temporary) data + add real(), imag(), conj() + accurate types in MGL + add 'expr'/'complex' in MGL
+
+28. Check if Fortran versions possible for: mgl_data_info, mgl_datas_hdf, mgl_get_fit, mgl_get_mess, mgl_get_plotid
============= DOCUMENTATION =============
2. Extend Refill sample (add 2d)
3. Docs about JS interface
+4. Extend docs about region
+5. Docs about mgl_datac_diffr
+
============= UDAV =============
01. Show plot at creation stage (if option is enabled -- can be long process!!!) + auto axis range or [-1,1] by default
set(udav_src ${udav_src} udav.rc)
endif(WIN32)
+if(MGL_HAVE_HDF5)
+# target_link_libraries(mgl ${HDF5_LIBRARIES})
+ include_directories(${HDF5_INCLUDE_DIR})
+endif(MGL_HAVE_HDF5)
+
if(MGL_HAVE_GSL)
# target_link_libraries(mgl ${GSL_LIB} ${GSL_CBLAS_LIB} )
include_directories(${GSL_INCLUDE_DIR})
void ToggleLight() { _mgl_key_up('f',0,0); }\r
void ToggleNo() { _mgl_key_up('n',0,0); } ///< Switch off all zooming and rotation\r
void Update() { _mgl_key_up(' ',0,0); } ///< Update picture by calling user drawing function\r
- void ReLoad(bool o) { _mgl_key_up(o?']':'[',0,0); } ///< Reload user data and update picture\r
+ void ReLoad() { _mgl_key_up('[',0,0); } ///< Reload user data and update picture\r
void NextFrame() { _mgl_key_up('.',0,0); } ///< Show next frame (if one)\r
void PrevFrame() { _mgl_key_up(',',0,0); } ///< Show previous frame (if one)\r
void Animation() { _mgl_key_up('m',0,0); } ///< Run slideshow (animation) of frames\r
//-----------------------------------------------------------------------------\r
mglCanvasGLUT::mglCanvasGLUT() : mglCanvasGL() {}\r
//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_glut_toggle_alpha(HMGL gr)\r
+{ mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);\r
+ if(g) g->ToggleAlpha(); }\r
+void MGL_EXPORT mgl_glut_toggle_light(HMGL gr)\r
+{ mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);\r
+ if(g) g->ToggleLight(); }\r
+void MGL_EXPORT mgl_glut_toggle_no(HMGL gr)\r
+{ mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);\r
+ if(g) g->ToggleNo(); }\r
+void MGL_EXPORT mgl_glut_update(HMGL gr)\r
+{ mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);\r
+ if(g) g->Update(); }\r
+void MGL_EXPORT mgl_glut_reload(HMGL gr)\r
+{ mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);\r
+ if(g) g->ReLoad(); }\r
+void MGL_EXPORT mgl_glut_next_frame(HMGL gr)\r
+{ mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);\r
+ if(g) g->NextFrame(); }\r
+void MGL_EXPORT mgl_glut_prev_frame(HMGL gr)\r
+{ mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);\r
+ if(g) g->PrevFrame(); }\r
+void MGL_EXPORT mgl_glut_animation(HMGL gr)\r
+{ mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);\r
+ if(g) g->Animation(); }\r
+//-----------------------------------------------------------------------------\r