[mathgl] 01/05: Imported Upstream version 2.2.1+svn921

Dimitrios Eftaxiopoulos eftaxiop-guest at moszumanska.debian.org
Sun Feb 23 19:14:20 UTC 2014


This is an automated email from the git hooks/post-receive script.

eftaxiop-guest pushed a commit to branch master
in repository mathgl.

commit e62725c4be271e8151fe01a398660d9f06016ea1
Author: Dimitrios Eftaxiopoulos <eftaxi12 at otenet.gr>
Date:   Sun Feb 23 18:48:45 2014 +0200

    Imported Upstream version 2.2.1+svn921
---
 AUTHORS                  |   3 +-
 CMakeLists.txt           |  10 +-
 ChangeLog.txt            |  10 ++
 README                   |  61 ++----------
 clean-svn                |   3 +
 examples/full_test.cpp   |   7 +-
 include/mgl2/addon.h     |   4 +-
 include/mgl2/base.h      |   2 +-
 include/mgl2/canvas_cf.h |   4 +-
 include/mgl2/data_cf.h   |   6 +-
 include/mgl2/datac.h     |   2 +
 include/mgl2/datac_cf.h  |  18 +++-
 include/mgl2/define.h    |  13 ++-
 include/mgl2/glut.h      |  36 +++++++
 include/mgl2/mgl.h       |   5 +
 include/mgl2/plot.h      |   3 +
 include/mgl2/prim.h      |   2 +-
 include/mgl2/type.h      |   2 +-
 src/addon.cpp            |  39 ++++----
 src/base.cpp             |  20 ++--
 src/base_cf.cpp          |   2 +-
 src/canvas.cpp           |  14 +--
 src/canvas_cf.cpp        |   4 +-
 src/complex.cpp          |  59 ++++++++++++
 src/complex_io.cpp       |  16 ++--
 src/data.cpp             |   5 +-
 src/data_io.cpp          |  17 ++--
 src/eval.cpp             |   6 +-
 src/evalc.cpp            |   8 ++
 src/exec.cpp             |   6 +-
 src/export_2d.cpp        | 243 +++++++++++++++--------------------------------
 src/export_3d.cpp        |  27 +++++-
 src/fit.cpp              |  16 ++--
 src/parser.cpp           |   4 +-
 src/pixel.cpp            |  12 ++-
 src/plot.cpp             |  60 +++++++++++-
 src/surf.cpp             |  23 +++--
 src/vect.cpp             |   2 +-
 src/volume.cpp           |  18 ++--
 texinfo/deflate.min.js   |  32 -------
 texinfo/gunzip.min.js    |  29 ------
 texinfo/inflate.min.js   |  26 -----
 texinfo/overview_en.texi |   4 +-
 texinfo/overview_ru.texi |   4 +-
 texinfo/version.texi     |   2 +-
 texinfo/web_en.texi      |  16 ++--
 texinfo/web_fr.texi      |   6 +-
 texinfo/web_ru.texi      |  16 ++--
 todo.txt                 |   9 ++
 udav/CMakeLists.txt      |   5 +
 widgets/glut.cpp         |  27 +++++-
 51 files changed, 517 insertions(+), 451 deletions(-)

diff --git a/AUTHORS b/AUTHORS
index 90a6e84..7c587e5 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -3,6 +3,7 @@ Author of MathGL:
 Alexey Balakin <balakin at appl.sci-nnov.ru>
 
 Some extensions was written by:
-Dmitriy Kulagin	- autoconf/automake script
+Dmitriy Kulagin	- cmake script
+Mikhail Vidassov - U3D/PDF/OBJ export
 Mikhail Barg	- Pascal/Delphi interface
 Sergey Plis	- Forth interface
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index dc5ef40..2611170 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -89,11 +89,11 @@ MGL_DEPENDENT_OPTION(enable-hdf4 "Enable hdf4 support" OFF "NOT enable-lgpl" ON
 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)
diff --git a/ChangeLog.txt b/ChangeLog.txt
index 29624cb..efab471 100644
--- a/ChangeLog.txt
+++ b/ChangeLog.txt
@@ -1,3 +1,13 @@
+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.
diff --git a/README b/README
index d6385c3..38176b9 100644
--- a/README
+++ b/README
@@ -1,63 +1,22 @@
 MathGL is a free library of fast C++ routines for the plotting of the data 
-varied in one or more dimensions. MathGL has more than 40 general types 
+varied in one or more dimensions. MathGL has more than 50 general types 
 of graphics for 1d, 2d and 3d data arrays. It can export graphics to bitmap 
-and vector (EPS or SVG) files. It has OpenGL interface and can be used from 
+and vector (EPS, SVG etc) files. It has OpenGL interface and can be used from 
 console programs. It has functions for data handling and script MGL language 
 for simplification of data plotting. Also it has several types of transparency 
 and smoothed lightning, vector fonts and TeX-like symbol parsing, arbitrary 
 curvilinear coordinate system and many over useful things. Finally it is 
-platform independent and free (under GPL v.2.0 license).
-
-MathGL can plot a wide range of graphics. It includes:
-  * one-dimensional plots (Plot(), Area(), Bars(), Step(), Stem(), Torus(), 
-    Chart(), Error(), Tube(), Mark(), Text()), 
-  * two-dimensional plots (Mesh(), Surf(), Dens(), Cont(), ContF(), 
-    Boxs(), Axial(), Belt()),
-  * three-dimensional plots (Dens3(), Cont3(), ContF3(), Surf3(), 
-    CloudQ(), CloudP()).
-  * dual data plots: vector plot Vect() and VectC(), flow chart Flow(), 
-    mapping chart Map(), surface or isosurface transpared (SurfA(), Surf3A()) 
-	or colored (SurfC(), Surf3C()) by other data 
-  * and so on. See class mglGraph for detail.
-
-In fact, I created functions for drawing of all scientific plots that I know.
-The list of plots is enlarging, so if you need some special type of plot then 
-write me e-mail (balakin at appl.sci-nnov.ru) and it will appear in new version.
-
-I tried to make plots as well-looking as possible: surface can be transparent 
-and highlighted by several (up to 10) light sources. Most of drawing functions 
-have 2 variants: simple one for the fast plotting of data, complex one for 
-specifying of the exact position of plot (including parametric representation). 
-Resulting image can be saved in bitmap (with the help of mglGraphZB, mglGraphGL) 
-PNG, JPEG, TIFF format or in vector EPS or SVG format (with the help of 
-mglGraphPS).
-
-All text are drawn by vector font, that allows high scalability and portability. 
-Text may contain commands for: some of TeX-like symbols, changing index (upper 
-or lower indexes) and style of font inside text string (see mglFont). Texts of 
-ticks are rotated with axis rotation. It is possible to create a legend of plot 
-and put text in arbitrary position of plot.
-
-Special class mglData is used for data incapsulation. Except safe creation and 
-deletion of data arrays it includes functions for data processing (smoothing, 
-differentiating, integrating, interpolating and so on) and reading of data 
-files with automatic size determination. Class mglData can handle arrays with 
-up to three dimensions (arrays which depend up to 3 independent indexes 
-a[i,j,k]). Using an array with higher number of dimensions is not reasonable 
-because I do not know how it can be plotted. Data filling and modifying may be 
-fulfilled manually or by textual formulas.
-
-Class mglFormula allows the fast evaluation of a textual mathematical 
-expression. It is based on string precompilation to tree-like code at creation 
-of class instance. At evaluation stage code performs only fast tree-walk and 
-returns the value of the expression. Except changing data values, textual 
-formulas are used for drawing in \emph{arbitrary} curvilinear coordinates. 
-A set of such curvilinear coordinates is limited only by user imagination 
-but not a fixed list like polar, parabolic, spherical and so on.
-
+platform independent and free (under GPL v.2.0 or later license).
 Installation instructions are provided in the manual (don't worry, it
 is straightforward).
 
+About LGPL and GPL licenses.
+Generally, MathGL is GPL library. However, you can use LGPL license for MathGL 
+core and widget libraries if you don't use SWIG-based interfaces and disable GSL 
+and HDF features. This can be done by using 'enable-lgpl' option at build time.
+However, I ask you to put the information of used MathGL version and link to 
+MathGL website into "About" section of yours program.
+
 CONTACTS
 --------
 MathGL was written by Alexey Balakin. You can contact me at 
diff --git a/clean-svn b/clean-svn
new file mode 100755
index 0000000..f0ba47a
--- /dev/null
+++ b/clean-svn
@@ -0,0 +1,3 @@
+find . -name '.svn' -print0 | xargs -0 rm -rf
+find . -name '*~' -print0 | xargs -0 rm -f
+rm ./clean-svn
diff --git a/examples/full_test.cpp b/examples/full_test.cpp
index 54aafa0..2032ad7 100644
--- a/examples/full_test.cpp
+++ b/examples/full_test.cpp
@@ -71,7 +71,12 @@ void test(mglGraph *gr)
 {
 	mglParse par;
 	setlocale(LC_CTYPE, "");
-	par.Execute(gr,"box\r\n\r\naxis");
+	par.Execute(gr,"new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)'\n\
+					new y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)'\n\
+					new z 50 40 '0.8*cos(pi*(y+1)/2)'\nlight on\n\
+					title 'parametric form':rotate 50 60:box\n\
+					surf x y z ''\nwrite '1.tex'");
+//	par.Execute(gr,"light on:addlegend 'r' 'r':legend");
 }
 //-----------------------------------------------------------------------------
 #if !defined(_MSC_VER) && !defined(__BORLANDC__)
diff --git a/include/mgl2/addon.h b/include/mgl2/addon.h
index fdab4c3..8423ca0 100644
--- a/include/mgl2/addon.h
+++ b/include/mgl2/addon.h
@@ -24,9 +24,9 @@
 #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
diff --git a/include/mgl2/base.h b/include/mgl2/base.h
index 84c24b6..452e2c8 100644
--- a/include/mgl2/base.h
+++ b/include/mgl2/base.h
@@ -47,7 +47,7 @@ struct MGL_EXPORT mglMatrix
 	mreal b[9];
 	mreal x,y,z,pf;
 	bool norot;	// flag to disable pnts rotation
-	mglMatrix()	{	clear();	}
+	mglMatrix()	{	memset(this,0,sizeof(mglMatrix));	clear();	}
 	void Rotate(mreal tetz,mreal tetx,mreal tety);
 	void RotateN(mreal Tet,mreal x,mreal y,mreal z);
 	inline void clear()	{	x=y=z=pf=0;	memset(b,0,9*sizeof(mreal));	b[0]=b[4]=b[8]=1;	norot=false;	}
diff --git a/include/mgl2/canvas_cf.h b/include/mgl2/canvas_cf.h
index 04dd4f0..de04e43 100644
--- a/include/mgl2/canvas_cf.h
+++ b/include/mgl2/canvas_cf.h
@@ -93,7 +93,7 @@ void MGL_EXPORT mgl_axis_grid(HMGL gr, const char *dir,const char *pen, const ch
 void MGL_EXPORT mgl_axis_grid_(uintptr_t *gr, const char *dir,const char *pen, const char *opt,int,int,int);
 /// Print the label text for axis dir.
 void MGL_EXPORT mgl_label(HMGL gr, char dir, const char *text, double pos, const char *opt);
-void MGL_EXPORT mgl_label_(uintptr_t *gr, const char *dir, const char *text, const char *opt,int,int,int);
+void MGL_EXPORT mgl_label_(uintptr_t *gr, const char *dir, const char *text, mreal *pos, const char *opt,int,int,int);
 void MGL_EXPORT mgl_labelw(HMGL gr, char dir, const wchar_t *text, double pos, const char *opt);
 
 /// Draw colorbar at edge of axis
@@ -326,7 +326,7 @@ void MGL_EXPORT mgl_columnplot(HMGL gr, int num, int ind, double d);
 void MGL_EXPORT mgl_columnplot_(uintptr_t *gr, int *num, int *i, mreal *d);
 /// Put further plotting in matrix cell of previous subplot/inplot.
 void MGL_EXPORT mgl_gridplot(HMGL gr, int nx, int ny, int m, double d);
-void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *i, mreal *d);
+void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *m, mreal *d);
 /// Put further plotting in cell of stick rotated on angles tet, phi.
 void MGL_EXPORT mgl_stickplot(HMGL gr, int num, int ind, double tet, double phi);
 void MGL_EXPORT mgl_stickplot_(uintptr_t *gr, int *num, int *i, mreal *tet, mreal *phi);
diff --git a/include/mgl2/data_cf.h b/include/mgl2/data_cf.h
index 48a249a..224ef76 100644
--- a/include/mgl2/data_cf.h
+++ b/include/mgl2/data_cf.h
@@ -332,7 +332,7 @@ void MGL_EXPORT mgl_data_fill_sample(HMDT dat, const char *how);
 void MGL_EXPORT mgl_data_fill_sample_(uintptr_t *dat, const char *how,int);
 /// Find correlation between 2 data arrays
 HMDT MGL_EXPORT mgl_data_correl(HCDT dat1, HCDT dat2, const char *dir);
-uintptr_t MGL_EXPORT mgl_data_correl_(uintptr_t dat1, uintptr_t dat2, const char *dir,int);
+uintptr_t MGL_EXPORT mgl_data_correl_(uintptr_t *dat1, uintptr_t *dat2, const char *dir,int);
 
 /// Allocate and prepare data for Fourier transform by nthr threads
 MGL_EXPORT void *mgl_fft_alloc(long n, void **space, long nthr);
@@ -461,12 +461,12 @@ void MGL_EXPORT mgl_delete_expr(HMEX ex);
 void MGL_EXPORT mgl_delete_expr_(uintptr_t *ex);
 /// Return value of expression for given x,y,z variables
 double MGL_EXPORT mgl_expr_eval(HMEX ex, double x, double y,double z);
-double MGL_EXPORT mgl_eval_expr_(uintptr_t *ex, mreal *x, mreal *y, mreal *z);
+double MGL_EXPORT mgl_expr_eval_(uintptr_t *ex, mreal *x, mreal *y, mreal *z);
 /// Return value of expression for given variables
 double MGL_EXPORT mgl_expr_eval_v(HMEX ex, mreal *vars);
 /// Return value of expression differentiation over variable dir for given x,y,z variables
 double MGL_EXPORT mgl_expr_diff(HMEX ex, char dir, double x, double y,double z);
-double MGL_EXPORT mgl_diff_expr_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int);
+double MGL_EXPORT mgl_expr_diff_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int);
 /// Return value of expression differentiation over variable dir for given variables
 double MGL_EXPORT mgl_expr_diff_v(HMEX ex, char dir, mreal *vars);
 
diff --git a/include/mgl2/datac.h b/include/mgl2/datac.h
index ad0ee16..c3d94e9 100644
--- a/include/mgl2/datac.h
+++ b/include/mgl2/datac.h
@@ -293,6 +293,8 @@ public:
 	inline void Hankel(const char *dir)	{	mgl_datac_hankel(this,dir);	}
 	/// Fourier transform
 	inline void FFT(const char *dir)	{	mgl_datac_fft(this,dir);	}
+	/// Calculate one step of diffraction by finite-difference method with parameter q
+	inline void Diffraction(const char *how, mreal q)	{	mgl_datac_diffr(this,how,q);	}
 
 	/// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]
 	inline dual Spline(mreal x,mreal y=0,mreal z=0) const
diff --git a/include/mgl2/datac_cf.h b/include/mgl2/datac_cf.h
index e5557a7..b932e43 100644
--- a/include/mgl2/datac_cf.h
+++ b/include/mgl2/datac_cf.h
@@ -44,6 +44,7 @@ void MGL_EXPORT mgl_srnd(long seed);
 double MGL_EXPORT mgl_rnd();
 /// Get integer power of x
 dual MGL_EXPORT mgl_ipowc(dual x,int n);
+dual MGL_EXPORT mgl_ipowc_(dual *x,int *n);
 /// Get exp(i*a)
 dual MGL_EXPORT mgl_expi(dual a);
 
@@ -84,9 +85,10 @@ void MGL_EXPORT mgl_datac_set_vector(HADT dat, gsl_vector *v);
 void MGL_EXPORT mgl_datac_set_matrix(HADT dat, gsl_matrix *m);
 /// Set value of data element [i,j,k]
 void MGL_EXPORT mgl_datac_set_value(HADT dat, dual v, long i, long j, long k);
-void MGL_EXPORT mgl_datac_set_value_(uintptr_t *d, mreal *v, int *i, int *j, int *k);
+void MGL_EXPORT mgl_datac_set_value_(uintptr_t *d, dual *v, int *i, int *j, int *k);
 /// Get value of data element [i,j,k]
 dual MGL_EXPORT mgl_datac_get_value(HCDT dat, long i, long j, long k);
+dual MGL_EXPORT mgl_datac_get_value_(uintptr_t *d, int *i, int *j, int *k);
 /// Allocate memory and scanf the data from the string
 void MGL_EXPORT mgl_datac_set_values(HADT dat, const char *val, long nx, long ny, long nz);
 void MGL_EXPORT mgl_datac_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l);
@@ -117,7 +119,7 @@ int MGL_EXPORT mgl_datac_read_range(HADT d, const char *templ, double from, doub
 int MGL_EXPORT mgl_datac_read_range_(uintptr_t *d, const char *fname, mreal *from, mreal *to, mreal *step, int *as_slice,int l);
 /// Read data from tab-separated text files with auto determining size which filenames are satisfied to template (like "t_*.dat")
 int MGL_EXPORT mgl_datac_read_all(HADT dat, const char *templ, int as_slice);
-int MGL_EXPORT mgl_data_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l);
+int MGL_EXPORT mgl_datac_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l);
 /// Save whole data array (for ns=-1) or only ns-th slice to text file
 void MGL_EXPORT mgl_datac_save(HCDT dat, const char *fname,long ns);
 void MGL_EXPORT mgl_datac_save_(uintptr_t *dat, const char *fname,int *ns,int);
@@ -140,7 +142,7 @@ void MGL_EXPORT mgl_datac_set_id(HADT d, const char *id);
 void MGL_EXPORT mgl_datac_set_id_(uintptr_t *dat, const char *id,int l);
 /// Equidistantly fill the data to range [x1,x2] in direction dir
 void MGL_EXPORT mgl_datac_fill(HADT dat, dual x1,dual x2,char dir);
-void MGL_EXPORT mgl_datac_fill_(uintptr_t *dat, mreal *x1,mreal *x2,const char *dir,int);
+void MGL_EXPORT mgl_datac_fill_(uintptr_t *dat, dual *x1,dual *x2,const char *dir,int);
 /// Modify the data by specified formula assuming x,y,z in range [r1,r2]
 void MGL_EXPORT mgl_datac_fill_eq(HMGL gr, HADT dat, const char *eq, HCDT vdat, HCDT wdat,const char *opt);
 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);
@@ -200,7 +202,7 @@ void MGL_EXPORT mgl_datac_mirror(HADT dat, const char *dir);
 void MGL_EXPORT mgl_datac_mirror_(uintptr_t *dat, const char *dir,int);
 /// Crop the data
 void MGL_EXPORT mgl_datac_crop(HADT dat, long n1, long n2, char dir);
-void MGL_EXPORT mgl_data_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int);
+void MGL_EXPORT mgl_datac_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int);
 
 /// Apply Hankel transform
 void MGL_EXPORT mgl_datac_hankel(HADT dat, const char *dir);
@@ -210,7 +212,10 @@ void MGL_EXPORT mgl_datac_fft(HADT dat, const char *dir);
 void MGL_EXPORT mgl_datac_fft_(uintptr_t *dat, const char *dir,int);
 /// Find correlation between 2 data arrays
 HADT MGL_EXPORT mgl_datac_correl(HCDT dat1, HCDT dat2, const char *dir);
-uintptr_t MGL_EXPORT mgl_datac_correl_(uintptr_t dat1, uintptr_t dat2, const char *dir,int);
+uintptr_t MGL_EXPORT mgl_datac_correl_(uintptr_t *dat1, uintptr_t *dat2, const char *dir,int);
+/// Calculate one step of diffraction by finite-difference method with parameter q
+void MGL_EXPORT mgl_datac_diffr(HADT dat, const char *how, mreal q);
+void MGL_EXPORT mgl_datac_diffr_(uintptr_t *d, const char *how, double q,int l);
 
 HMDT MGL_EXPORT mgl_datac_real(HCDT dat);
 uintptr_t MGL_EXPORT mgl_datac_real_(uintptr_t *dat);
@@ -237,10 +242,13 @@ dual MGL_EXPORT mgl_datac_spline_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z
 //-----------------------------------------------------------------------------
 /// Create HAEX object for expression evaluating
 HAEX MGL_EXPORT mgl_create_cexpr(const char *expr);
+uintptr_t MGL_EXPORT mgl_create_cexpr_(const char *expr, int);
 /// Delete HAEX object
 void MGL_EXPORT mgl_delete_cexpr(HAEX ex);
+void MGL_EXPORT mgl_delete_cexpr_(uintptr_t *ex);
 /// Return value of expression for given x,y,z variables
 dual MGL_EXPORT mgl_cexpr_eval(HAEX ex, dual x, dual y,dual z);
+dual MGL_EXPORT mgl_cexpr_eval_(uintptr_t *ex, dual *x, dual *y, dual *z);
 /// Return value of expression for given variables
 dual MGL_EXPORT mgl_cexpr_eval_v(HAEX ex, dual *vars);
 
diff --git a/include/mgl2/define.h b/include/mgl2/define.h
index e3b1233..3a6d439 100644
--- a/include/mgl2/define.h
+++ b/include/mgl2/define.h
@@ -22,13 +22,17 @@
 //-----------------------------------------------------------------------------
 #include "mgl2/config.h"
 #ifndef SWIG
+
 #include "mgl2/dllexport.h"
+#ifdef MGL_SRC
 #if MGL_HAVE_OMP
 #include <omp.h>
 #endif
 #endif
 
-#define MGL_VER2 	2.1	// minor version of MathGL 2.* (like 1.3 for v.2.1.3)
+#endif
+
+#define MGL_VER2 	2.2	// minor version of MathGL 2.* (like 1.3 for v.2.1.3)
 //-----------------------------------------------------------------------------
 #ifdef WIN32 //_MSC_VER needs this before math.h
 #define	_USE_MATH_DEFINES
@@ -51,7 +55,7 @@
 #endif
 #endif
 
-#if defined(_MSC_VER) || defined(__BORLANDC__)
+#if (defined(_MSC_VER) && (_MSC_VER<1600)) || defined(__BORLANDC__)
 typedef signed char int8_t;
 typedef signed short int16_t;
 typedef signed long int32_t;
@@ -241,6 +245,8 @@ typedef float _Complex dual;
 #endif
 #endif
 /// Find length of wchar_t string (bypass standard wcslen bug)
+double MGL_EXPORT mgl_hypot(double x, double y);
+/// Find length of wchar_t string (bypass standard wcslen bug)
 size_t MGL_EXPORT mgl_wcslen(const wchar_t *str);
 /// Get RGB values for given color id or fill by -1 if no one found
 void MGL_EXPORT mgl_chrrgb(char id, float rgb[3]);
@@ -250,8 +256,9 @@ long MGL_EXPORT mgl_have_color(const char *stl);
 const char *mglchr(const char *str, char ch);
 /// Find any symbol from chr in string excluding {} and return its position or NULL
 const char *mglchrs(const char *str, const char *chr);
-/// Set number of thread for plotting and data handling
+/// Set number of thread for plotting and data handling (for pthread version only)
 void MGL_EXPORT mgl_set_num_thr(int n);
+void MGL_EXPORT mgl_set_num_thr_(int *n);
 void MGL_EXPORT mgl_test_txt(const char *str, ...);
 void MGL_EXPORT mgl_set_test_mode(int enable);
 /// Remove spaces at begining and at the end of the string
diff --git a/include/mgl2/glut.h b/include/mgl2/glut.h
index 1bd8227..6e360d5 100644
--- a/include/mgl2/glut.h
+++ b/include/mgl2/glut.h
@@ -27,6 +27,25 @@ extern "C" {
 #endif
 void _mgl_key_up(unsigned char ch,int ,int );
 HMGL MGL_EXPORT mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p));
+
+
+/// Switch on/off transparency (do not overwrite user settings)
+void MGL_EXPORT mgl_glut_toggle_alpha(HMGL gr);
+/// Switch on/off lighting (do not overwrite user settings)
+void MGL_EXPORT mgl_glut_toggle_light(HMGL gr);
+/// Switch off all zooming and rotation
+void MGL_EXPORT mgl_glut_toggle_no(HMGL gr);
+/// Update picture by calling user drawing function
+void MGL_EXPORT mgl_glut_update(HMGL gr);
+/// Reload user data and update picture
+void MGL_EXPORT mgl_glut_reload(HMGL gr);
+/// Show next frame (if one)
+void MGL_EXPORT mgl_glut_next_frame(HMGL gr);
+/// Show previous frame (if one)
+void MGL_EXPORT mgl_glut_prev_frame(HMGL gr);
+/// Run slideshow (animation) of frames
+void MGL_EXPORT mgl_glut_animation(HMGL gr);
+
 #ifdef __cplusplus
 }
 //-----------------------------------------------------------------------------
@@ -39,6 +58,23 @@ public:
 	{	gr = mgl_create_graph_glut(draw?mgl_draw_graph:0,title,(void*)draw,0);	}
 	mglGLUT(mglDraw *draw=0, const char *title="MathGL") : mglGraph(-1)
 	{	gr = mgl_create_graph_glut(draw?mgl_draw_class:0,title,draw,mgl_reload_class);	}
+
+	inline void ToggleAlpha()	///< Switch on/off transparency (do not overwrite user settings)
+	{	mgl_glut_toggle_alpha(gr);	}
+	inline void ToggleLight()	///< Switch on/off lighting (do not overwrite user settings)
+	{	mgl_glut_toggle_light(gr);	}
+	inline void ToggleNo()		///< Switch off all zooming and rotation
+	{	mgl_glut_toggle_no(gr);	}
+	inline void Update()		///< Update picture by calling user drawing function
+	{	mgl_glut_update(gr);	}
+	inline void ReLoad()		///< Reload user data and update picture
+	{	mgl_glut_reload(gr);	}
+	inline void NextFrame()		///< Show next frame (if one)
+	{	mgl_glut_next_frame(gr);	}
+	inline void PrevFrame()		///< Show previous frame (if one)
+	{	mgl_glut_prev_frame(gr);	}
+	inline void Animation()		///< Run slideshow (animation) of frames
+	{	mgl_glut_animation(gr);	}
 };
 //-----------------------------------------------------------------------------
 #endif
diff --git a/include/mgl2/mgl.h b/include/mgl2/mgl.h
index 672e6fe..8266c96 100644
--- a/include/mgl2/mgl.h
+++ b/include/mgl2/mgl.h
@@ -626,6 +626,11 @@ public:
 	{	mgl_region(gr, &y1, &y2, pen, opt);	}
 	inline void Region(const mglDataA &x, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="")
 	{	mgl_region_xy(gr, &x, &y1, &y2, pen, opt);	}
+	/// Fill area (draw ribbon) between curves {x1,y1,z1} and {x2,y2,z2}
+	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="")
+	{	mgl_region_3d(gr, &x1, &y1, &z1, &x2, &y2, &z2, pen, opt);	}
+	inline void Region(const mglDataA &x1, const mglDataA &y1, const mglDataA &x2, const mglDataA &y2, const char *pen="", const char *opt="")
+	{	mgl_region_3d(gr, &x1, &y1, NULL, &x2, &y2, NULL, pen, opt);	}
 	/// Draw vertical lines from points {x,y,z} to axis plane
 	inline void Stem(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="")
 	{	mgl_stem_xyz(gr, &x, &y, &z, pen, opt);	}
diff --git a/include/mgl2/plot.h b/include/mgl2/plot.h
index b2d59ec..2494ae2 100644
--- a/include/mgl2/plot.h
+++ b/include/mgl2/plot.h
@@ -83,6 +83,9 @@ void MGL_EXPORT mgl_area_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const
 void MGL_EXPORT mgl_area(HMGL graph, HCDT y, const char *pen, const char *opt);
 void MGL_EXPORT mgl_area_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int);
 
+/// Fill area (draw ribbon) between curves {x1,y1,z1} and {x2,y2,z2}
+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);
+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);
 /// Fill area between curves {x,y1} and {x,y2}
 void MGL_EXPORT mgl_region_xy(HMGL graph, HCDT x, HCDT y1, HCDT y2, const char *pen, const char *opt);
 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);
diff --git a/include/mgl2/prim.h b/include/mgl2/prim.h
index 1cc88cb..404f1ce 100644
--- a/include/mgl2/prim.h
+++ b/include/mgl2/prim.h
@@ -77,7 +77,7 @@ void MGL_EXPORT mgl_cones_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pe
 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);
 /// Draw cones from points {x,z} to axis plane
 void MGL_EXPORT mgl_cones_xz(HMGL graph, HCDT x, HCDT z, const char *pen, const char *opt);
-void MGL_EXPORT mgl_coners_xz_(uintptr_t *graph, uintptr_t *x, uintptr_t *z, const char *pen, const char *opt,int,int);
+void MGL_EXPORT mgl_cones_xz_(uintptr_t *graph, uintptr_t *x, uintptr_t *z, const char *pen, const char *opt,int,int);
 /// Draw cones from points {x,z} with x in x-axis range to axis plane
 void MGL_EXPORT mgl_cones(HMGL graph, HCDT z,	const char *pen, const char *opt);
 void MGL_EXPORT mgl_cones_(uintptr_t *graph, uintptr_t *z,	const char *pen, const char *opt,int,int);
diff --git a/include/mgl2/type.h b/include/mgl2/type.h
index 85eaa8c..6fa165c 100644
--- a/include/mgl2/type.h
+++ b/include/mgl2/type.h
@@ -72,7 +72,7 @@ inline mglPoint operator|(const mglPoint &a, const mglPoint &b)
 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)
diff --git a/src/addon.cpp b/src/addon.cpp
index 00d8f0a..c30ccb4 100644
--- a/src/addon.cpp
+++ b/src/addon.cpp
@@ -28,8 +28,6 @@
 #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;
@@ -166,17 +164,17 @@ MGL_EXPORT FILE *mgl_next_data(const char *fname,int p)
 	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)
 		{
@@ -193,36 +191,39 @@ int MGL_EXPORT mgl_difr_grid(dual *a,int n,dual q,int Border,dual *b,dual *d,int
 				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));
@@ -246,8 +247,8 @@ int MGL_EXPORT mgl_difr_axial(dual *a, int n, dual q, int Border,dual *b, 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()
diff --git a/src/base.cpp b/src/base.cpp
index 6ce08bb..df7c74b 100644
--- a/src/base.cpp
+++ b/src/base.cpp
@@ -223,7 +223,7 @@ long mglBase::AddGlyph(int s, long j)
 	// if no one then let add it
 	long k;
 #pragma omp critical(glf)
-	{MGL_PUSH(Glf,g,mutexGlf);	k=Glf.size()-1;}	return k;
+	{k=Glf.size();	MGL_PUSH(Glf,g,mutexGlf);}	return k;
 }
 //-----------------------------------------------------------------------------
 //		Add points to the buffer
@@ -236,7 +236,7 @@ long mglBase::AddPnt(const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mrea
 	// scl&4 -- ???
 	// scl&8 -- bypass palette for enabling alpha
 	if(mgl_isnan(c) || mgl_isnan(a))	return -1;
-	bool norefr = mgl_isnan(n.x) && mgl_isnan(n.y);
+	bool norefr = mgl_isnan(n.x) && mgl_isnan(n.y) && !mgl_isnan(n.z);
 	if(scl>0)	ScalePoint(mat,p,n,!(scl&2));
 	if(mgl_isnan(p.x))	return -1;
 	a = (a>=0 && a<=1) ? a : AlphaDef;
@@ -274,7 +274,7 @@ long mglBase::AddPnt(const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mrea
 	if(mat->norot)	q.sub=-1;	// NOTE: temporary -- later should be mglInPlot here
 	long k;
 #pragma omp critical(pnt)
-	{MGL_PUSH(Pnt,q,mutexPnt);	k=Pnt.size()-1;}	return k;
+	{k=Pnt.size();	MGL_PUSH(Pnt,q,mutexPnt);}	return k;
 }
 //-----------------------------------------------------------------------------
 long mglBase::CopyNtoC(long from, mreal c)
@@ -284,7 +284,7 @@ long mglBase::CopyNtoC(long from, mreal c)
 	if(mgl_isnum(c))	{	p.c=c;	p.t=0;	Txt[long(c)].GetC(c,0,p);	}
 	long k;
 #pragma omp critical(pnt)
-	{MGL_PUSH(Pnt,p,mutexPnt);	k=Pnt.size()-1;}	return k;
+	{k=Pnt.size();	MGL_PUSH(Pnt,p,mutexPnt);}	return k;
 }
 //-----------------------------------------------------------------------------
 long mglBase::CopyProj(long from, mglPoint p, mglPoint n)
@@ -295,7 +295,7 @@ long mglBase::CopyProj(long from, mglPoint p, mglPoint n)
 	q.u = n.x;		q.v = n.y;		q.w = n.z;
 	long k;
 #pragma omp critical(pnt)
-	{MGL_PUSH(Pnt,q,mutexPnt);	k=Pnt.size()-1;}	return k;
+	{k=Pnt.size();	MGL_PUSH(Pnt,q,mutexPnt);}	return k;
 }
 //-----------------------------------------------------------------------------
 void mglBase::Reserve(long n)
@@ -303,10 +303,12 @@ void mglBase::Reserve(long n)
 	if(TernAxis&4)	n*=4;
 #pragma omp critical(pnt)
 	Pnt.reserve(n);
+#pragma omp critical(prm)
+	Prm.reserve(n);
 }
 //-----------------------------------------------------------------------------
 //		Boundaries and scaling
-//---------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 bool mglBase::RecalcCRange()
 {
 	bool wrong=false;
@@ -861,7 +863,7 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha)
 	// fill texture itself
 	mreal v=sm?(n-1)/255.:n/256.;
 	if(!sm)
-#pragma omp parallel for
+//#pragma omp parallel for	// remove parallel here due to possible race conditions for v<1
 		for(long i=0;i<256;i++)
 		{
 			register long j = 2*long(v*i);	//u-=j;
@@ -920,7 +922,7 @@ long mglBase::AddTexture(const char *cols, int smooth)
 	// create new one
 	long k;
 #pragma omp critical(txt)
-	{MGL_PUSH(Txt,t,mutexTxt);	k=Txt.size()-1;}	return k;
+	{k=Txt.size();	MGL_PUSH(Txt,t,mutexTxt);}	return k;
 }
 //-----------------------------------------------------------------------------
 mreal mglBase::AddTexture(mglColor c)
@@ -936,7 +938,7 @@ mreal mglBase::AddTexture(mglColor c)
 	for(long i=0;i<MGL_TEXTURE_COLOURS;i++)	t.col[i]=c;
 	long k;
 #pragma omp critical(txt)
-	{MGL_PUSH(Txt,t,mutexTxt);	k=Txt.size()-1;}	return k;
+	{k=Txt.size();	MGL_PUSH(Txt,t,mutexTxt);}	return k;
 }
 //-----------------------------------------------------------------------------
 //		Coloring and palette
diff --git a/src/base_cf.cpp b/src/base_cf.cpp
index 9d591e3..a453de2 100644
--- a/src/base_cf.cpp
+++ b/src/base_cf.cpp
@@ -182,7 +182,7 @@ void MGL_EXPORT mgl_set_rotated_text_(uintptr_t *gr, int *rotated)	{	_GR_->SetRo
 void MGL_EXPORT mgl_set_mark_size_(uintptr_t *gr, mreal *size)		{	_GR_->SetMarkSize(*size);	}
 void MGL_EXPORT mgl_set_arrow_size_(uintptr_t *gr, mreal *size)	{	_GR_->SetArrowSize(*size);	}
 void MGL_EXPORT mgl_set_font_size_(uintptr_t *gr, mreal *size)		{	_GR_->SetFontSize(*size);	}
-void MGL_EXPORT mgl_set_font_def_(uintptr_t *gr, char *name, int l)
+void MGL_EXPORT mgl_set_font_def_(uintptr_t *gr, const char *name, int l)
 {	char *s=new char[l+1];		memcpy(s,name,l);	s[l]=0;
 	_GR_->SetFontDef(s);	delete []s;	}
 void MGL_EXPORT mgl_load_font_(uintptr_t *gr, char *name, char *path, int l,int n)
diff --git a/src/canvas.cpp b/src/canvas.cpp
index b58e2b7..bbe7fb2 100644
--- a/src/canvas.cpp
+++ b/src/canvas.cpp
@@ -436,7 +436,7 @@ pthread_mutex_lock(&mutexPtx);
 			mglPrim a(6);	a.n1 = p;
 			a.n2 = int(255*mc.r) + 256*(int(255*mc.g) + 256*int(255*mc.b));
 			mglText txt(text,font);
-			Ptx.push_back(txt);	a.n3 = Ptx.size()-1;
+			a.n3 = Ptx.size();	Ptx.push_back(txt);
 			a.s = size;	a.w = shift;	a.p=ftet;
 			add_prim(a);
 		}
@@ -457,19 +457,19 @@ pthread_mutex_lock(&mutexPtx);
 			pt = q;	pp = mglPoint(d,-h*0.4);		PostScale(&Bt,pp);
 			pt.x=pt.xx=pp.x;	pt.y=pt.yy=pp.y;
 #pragma omp critical(pnt)
-			{MGL_PUSH(Pnt,pt,mutexPnt);	k1=Pnt.size()-1;}
+			{k1=Pnt.size();	MGL_PUSH(Pnt,pt,mutexPnt);}
 			pt = q;	pp = mglPoint(w+d,-h*0.4);		PostScale(&Bt,pp);
 			pt.x=pt.xx=pp.x;	pt.y=pt.yy=pp.y;
 #pragma omp critical(pnt)
-			{MGL_PUSH(Pnt,pt,mutexPnt);	k2=Pnt.size()-1;}
+			{k2=Pnt.size();	MGL_PUSH(Pnt,pt,mutexPnt);}
 			pt = q;	pp = mglPoint(d,h*1.2);			PostScale(&Bt,pp);
 			pt.x=pt.xx=pp.x;	pt.y=pt.yy=pp.y;
 #pragma omp critical(pnt)
-			{MGL_PUSH(Pnt,pt,mutexPnt);	k3=Pnt.size()-1;}
+			{k3=Pnt.size();	MGL_PUSH(Pnt,pt,mutexPnt);}
 			pt = q;	pp = mglPoint(w+d,h*1.2);		PostScale(&Bt,pp);
 			pt.x=pt.xx=pp.x;	pt.y=pt.yy=pp.y;
 #pragma omp critical(pnt)
-			{MGL_PUSH(Pnt,pt,mutexPnt);	k4=Pnt.size()-1;}
+			{k4=Pnt.size();	MGL_PUSH(Pnt,pt,mutexPnt);}
 			line_plot(k1,k2);	line_plot(k1,k3);
 			line_plot(k4,k2);	line_plot(k4,k3);
 			mreal bl = AddTexture('w');
@@ -786,7 +786,7 @@ void mglCanvas::Legend(const std::vector<mglText> &leg, mreal x, mreal y, const
 	x += B.x-iw/2+dx;	y += B.y-ih/2+dy;
 	// draw it
 	long k1=0,k2=0,k3=0,k4=0;
-	mglPoint p,q=mglPoint(NAN);
+	mglPoint p,q=mglPoint(NAN,NAN,NAN);
 
 	for(i=0;ff[i] && ff[i]!=':';i++)	if(strchr(MGL_COLORS,ff[i]))
 	{
@@ -937,7 +937,7 @@ void mglCanvas::Title(const wchar_t *title,const char *stl,mreal size)
 	char col = mglGetStyle(stl,0,&align);	align = align&3;
 	if(col==0)	col = 'k';
 	mreal y=inY+inH-h;
-	mglPoint p(inX + inW*align/2.,y,3*Depth),q(NAN);
+	mglPoint p(inX + inW*align/2.,y,3*Depth),q(NAN,NAN,NAN);
 	mglMatrix M=B;	M.norot=true;
 	if(title)	text_plot(AddPnt(&M,p,-1,q,-1,0),title,stl,size);
 	if(box)	//	draw boungind box
diff --git a/src/canvas_cf.cpp b/src/canvas_cf.cpp
index 4255a31..7cc3a29 100644
--- a/src/canvas_cf.cpp
+++ b/src/canvas_cf.cpp
@@ -149,6 +149,8 @@ void MGL_EXPORT mgl_gridplot(HMGL gr, int nx, int ny, int i, double dd)
 	mglCanvas *g = dynamic_cast<mglCanvas *>(gr);
 	if(g)	g->InPlot(ix*wx,wx*(ix+1-dd),1-wy*(iy+1-dd),1-iy*wy,true);
 }
+void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *m, mreal *d)
+{	mgl_gridplot(_GR_,*nx,*ny,*m,*d);	}
 //-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_stickplot(HMGL gr, int num, int i, double tet, double phi)
 {	mglCanvas *g = dynamic_cast<mglCanvas *>(gr);	if(g)	g->StickPlot(num, i, tet, phi);	}
@@ -371,7 +373,7 @@ void MGL_EXPORT mgl_axis_grid_(uintptr_t *gr, const char *dir,const char *pen, c
 	char *p=new char[n+1];	memcpy(p,pen,n);	p[n]=0;
 	char *o=new char[m+1];	memcpy(o,opt,m);	o[m]=0;
 	_GR_->Grid(s,p,o);	delete []s;	delete []p;	delete []o;	}
-	void MGL_EXPORT mgl_label_(uintptr_t *gr, const char *dir, const char *text, mreal *pos, const char *opt,int,int l,int m)
+void MGL_EXPORT mgl_label_(uintptr_t *gr, const char *dir, const char *text, mreal *pos, const char *opt,int,int l,int m)
 {	char *s=new char[l+1];	memcpy(s,text,l);	s[l]=0;
 	char *o=new char[m+1];	memcpy(o,opt,m);	o[m]=0;
 	_GR_->Label(*dir, s, *pos, o);	delete []s;	delete []o;	}
diff --git a/src/complex.cpp b/src/complex.cpp
index 3049be1..bc86319 100644
--- a/src/complex.cpp
+++ b/src/complex.cpp
@@ -85,6 +85,8 @@ void MGL_EXPORT mglStartThreadV(void *(*func)(void *), long n, dual *a, const vo
 	}
 }
 //-----------------------------------------------------------------------------
+dual MGL_EXPORT mgl_expi(dual a)	{	return exp(dual(0,1)*a);	}
+//-----------------------------------------------------------------------------
 MGL_NO_EXPORT void *mgl_csmth_x(void *par)
 {
 	mglThreadC *t=(mglThreadC *)par;
@@ -1064,3 +1066,60 @@ void MGL_EXPORT mgl_datac_put_val_(uintptr_t *d, dual *val, int *i, int *j, int
 void MGL_EXPORT mgl_datac_put_dat_(uintptr_t *d, uintptr_t *val, int *i, int *j, int *k)
 {	mgl_datac_put_dat(_DC_,_DA_(val), *i,*j,*k);	}
 //-----------------------------------------------------------------------------
+void MGL_EXPORT mgl_difr_grid(dual *a,int n,int step,dual q,int Border,dual *tmp,int kk);
+void MGL_EXPORT mgl_difr_axial(dual *a,int n,int step,dual q,int Border,dual *tmp,int kk, double di);
+//-----------------------------------------------------------------------------
+MGL_NO_EXPORT void *mgl_difr(void *par)
+{
+	mglThreadC *t=(mglThreadC *)par;
+	long n=t->p[0], st=t->p[1], bord=t->p[3], nn=t->n;
+	dual *b=t->a, q = *(t->b);
+#if !MGL_HAVE_PTHREAD
+#pragma omp parallel
+#endif
+	{
+		dual *tmp = new dual[2*n];
+		if(t->p[2])
+#if !MGL_HAVE_PTHREAD
+#pragma omp for
+#endif
+			for(long i=t->id;i<nn;i+=mglNumThr)
+				mgl_difr_axial(b + ((i%st)+n*(i/st)), n,st, q, bord,tmp,3,0);
+		else
+#if !MGL_HAVE_PTHREAD
+#pragma omp for
+#endif
+			for(long i=t->id;i<nn;i+=mglNumThr)
+				mgl_difr_grid(b + ((i%st)+n*(i/st)), n,st, q, bord,tmp,3);
+		delete []tmp;
+	}
+	return 0;
+}
+void MGL_EXPORT mgl_datac_diffr(HADT d, const char *how, mreal q)
+{
+	if(!how || *how==0)	return;
+	long nx=d->nx,ny=d->ny,nz=d->nz,nn=nx*ny*nz,ll=strlen(how);
+	long p[4]={0,0,(mglchr(how,'a')||mglchr(how,'r'))?1:0,0};
+	dual qq=q;
+	for(long i=0;i<ll;i++)	if(how[i]>='0' && how[i]<='9')	p[3] = how[i]-'0';
+	if(mglchr(how,'z') && nz>1)
+	{
+		p[0]=nz;	p[1]=nx*ny;
+		mglStartThreadC(mgl_difr,0,nx*ny,0,&qq,0,p);
+	}
+	if(mglchr(how,'y') && ny>1)
+	{
+		p[0]=ny;	p[1]=nx;
+		mglStartThreadC(mgl_difr,0,nx*nz,0,&qq,0,p);
+	}
+	if((mglchr(how,'x')||mglchr(how,'r')) && nx>1)
+	{
+		p[0]=nx;	p[1]=1;
+		mglStartThreadC(mgl_difr,0,ny*nz,0,&qq,0,p);
+	}
+}
+//-----------------------------------------------------------------------------
+void MGL_EXPORT mgl_datac_diffr_(uintptr_t *d, const char *how, double q,int l)
+{	char *s=new char[l+1];	memcpy(s,how,l);	s[l]=0;
+	mgl_datac_diffr(_DC_,s,q);	delete []s;	}
+//-----------------------------------------------------------------------------
diff --git a/src/complex_io.cpp b/src/complex_io.cpp
index 0922d2f..6591c36 100644
--- a/src/complex_io.cpp
+++ b/src/complex_io.cpp
@@ -56,6 +56,7 @@ void mglFromStr(HADT d,char *buf,long NX,long NY,long NZ)	// TODO: add multithre
 	mgl_datac_create(d, NX,NY,NZ);
 	long nb = strlen(buf);
 	register long i=0, j=0;
+	setlocale(LC_NUMERIC, "C");
 	while(j<nb)
 	{
 		while(buf[j]<=' ' && j<nb)	j++;
@@ -86,6 +87,7 @@ void mglFromStr(HADT d,char *buf,long NX,long NY,long NZ)	// TODO: add multithre
 		d->a[i] = dual(re,im);
 		i++;	if(i>=NX*NY*NZ)	break;
 	}
+	setlocale(LC_NUMERIC, "");
 }
 //-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_datac_set(HADT d, HCDT a)
@@ -188,10 +190,11 @@ void MGL_EXPORT mgl_datac_save(HCDT d, const char *fname,long ns)
 {
 	const mglDataC *dd = dynamic_cast<const mglDataC*>(d);
 	if(!dd)	{	mgl_data_save(d,fname,ns);	return;	}
-	FILE *fp;
-	fp = fopen(fname,"w");
+	FILE *fp = fopen(fname,"w");
+	if(!fp)	return;
 	register long i,j,k;
 	long nx=dd->nx, ny=dd->ny, nz=dd->nz;
+	setlocale(LC_NUMERIC, "C");
 	if(ns<0 || (ns>=nz && nz>1))	for(k=0;k<nz;k++)
 	{	// save whole data
 		for(i=0;i<ny;i++)
@@ -211,6 +214,7 @@ void MGL_EXPORT mgl_datac_save(HCDT d, const char *fname,long ns)
 		else if(ns<ny)	for(j=0;j<nx;j++)
 			fprintf(fp,"%g+i%g\t", real(dd->a[j+nx*ns]), imag(dd->a[j+nx*ns]));
 	}
+	setlocale(LC_NUMERIC, "");
 	fclose(fp);
 }
 void MGL_EXPORT mgl_datac_save_(uintptr_t *d, const char *fname,int *ns,int l)
@@ -677,14 +681,13 @@ int MGL_EXPORT mgl_datac_read_all(HADT dat, const char *templ, int as_slice)
 	size_t i;
 	dual *b;
 	long kx,ky,kz;
-	char *fname = new char[256];
 	glob (templ, GLOB_TILDE, NULL, &res);
 
 	//read first file
 	for(i=0;i<res.gl_pathc;i++)
 		if(mgl_datac_read(&d,res.gl_pathv[i]))	break;
 
-	if(i>=res.gl_pathc)	{	delete []fname;	return false;	}
+	if(i>=res.gl_pathc)	{	globfree (&res);	return false;	}
 	kx = d.nx;	ky = d.ny;	kz = d.nz;
 	b = (dual *)malloc(kx*ky*kz*sizeof(dual));
 	memcpy(b,d.a,kx*ky*kz*sizeof(dual));
@@ -693,12 +696,11 @@ int MGL_EXPORT mgl_datac_read_all(HADT dat, const char *templ, int as_slice)
 	{
 		if(mgl_datac_read(&d,res.gl_pathv[i]))
 			if(!mgl_add_file(kx,ky,kz,b,&d,as_slice))
-			{	delete []fname;	free(b);	return false;	}
+			{	globfree (&res);	free(b);	return false;	}
 	}
 	dat->Set(b,kx,ky,kz);
 
-	globfree (&res);
-	delete []fname;	free(b);
+	globfree (&res);	free(b);
 	return true;
 #else
 	return false;
diff --git a/src/data.cpp b/src/data.cpp
index f960ee3..3481a07 100644
--- a/src/data.cpp
+++ b/src/data.cpp
@@ -52,6 +52,7 @@ void MGL_EXPORT mgl_set_num_thr(int n)
 #else
 void MGL_EXPORT mgl_set_num_thr(int)	{	mglNumThr = 1;	}
 #endif
+void MGL_EXPORT mgl_set_num_thr_(int *n)	{	mgl_set_num_thr(*n);	}
 //-----------------------------------------------------------------------------
 void MGL_EXPORT mglStartThread(void *(*func)(void *), void (*post)(mglThreadD *,mreal *), long n,
 					mreal *a, const mreal *b, const mreal *c, const long *p,
@@ -1408,7 +1409,7 @@ void MGL_EXPORT mgl_data_insert(HMDT d, char dir, long at, long num)
 		if(at<nz)	memcpy(b.a+nx*ny*(at+num), d->a+nx*ny*at,(nz-at)*nx*ny*sizeof(mreal));
 #pragma omp parallel for
 		for(long i=0;i<num;i++)	memcpy(b.a+nx*ny*(at+i),d->a+nx*ny*at,nx*ny*sizeof(mreal));
-		d->Set(b);	nz+=num;
+		d->Set(b);
 	}
 }
 //-----------------------------------------------------------------------------
@@ -1447,7 +1448,7 @@ void MGL_EXPORT mgl_data_delete(HMDT d, char dir, long at, long num)
 		b.Create(nx,ny,nz-num);
 		if(at>0)	memcpy(b.a, d->a,at*nx*ny*sizeof(mreal));
 		memcpy(b.a+nx*ny*at, d->a+nx*ny*(at+num),(nz-at-num)*nx*ny*sizeof(mreal));
-		d->Set(b);	nz-=num;
+		d->Set(b);
 	}
 }
 //-----------------------------------------------------------------------------
diff --git a/src/data_io.cpp b/src/data_io.cpp
index 49805a4..215c924 100644
--- a/src/data_io.cpp
+++ b/src/data_io.cpp
@@ -63,6 +63,7 @@ void mglFromStr(HMDT d,char *buf,long NX,long NY,long NZ)	// TODO: add multithre
 	mgl_data_create(d, NX,NY,NZ);
 	long nb = strlen(buf);
 	register long i=0, j=0;
+	setlocale(LC_NUMERIC, "C");
 	while(j<nb)
 	{
 		while(buf[j]<=' ' && j<nb)	j++;
@@ -87,6 +88,7 @@ void mglFromStr(HMDT d,char *buf,long NX,long NY,long NZ)	// TODO: add multithre
 		d->a[i] = strstr(s,"NAN")?NAN:atof(s);
 		i++;	if(i>=NX*NY*NZ)	break;
 	}
+	setlocale(LC_NUMERIC, "");
 }
 //-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_data_set(HMDT d, HCDT a)
@@ -253,10 +255,11 @@ void MGL_EXPORT mgl_data_set_id_(uintptr_t *d, const char *eq,int l)
 //-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_data_save(HCDT d, const char *fname,long ns)
 {
-	FILE *fp;
-	fp = fopen(fname,"w");
+	FILE *fp = fopen(fname,"w");
+	if(!fp)	return;
 	register long i,j,k;
 	long nx=d->GetNx(), ny=d->GetNy(), nz=d->GetNz();
+	setlocale(LC_NUMERIC, "C");
 	if(ns<0 || (ns>=nz && nz>1))	for(k=0;k<nz;k++)
 	{	// save whole data
 		const mglData *dr = dynamic_cast<const mglData *>(d);
@@ -280,6 +283,7 @@ void MGL_EXPORT mgl_data_save(HCDT d, const char *fname,long ns)
 		else if(ns<ny)	for(j=0;j<nx;j++)
 			fprintf(fp,"%g\t",d->v(j,ns));
 	}
+	setlocale(LC_NUMERIC, "");
 	fclose(fp);
 }
 void MGL_EXPORT mgl_data_save_(uintptr_t *d, const char *fname,int *ns,int l)
@@ -1137,14 +1141,14 @@ int MGL_EXPORT mgl_data_read_all(HMDT dat, const char *templ, int as_slice)
 	size_t i;
 	mreal *b;
 	long kx,ky,kz;
-	char *fname = new char[256];
 	glob (templ, GLOB_TILDE, NULL, &res);
 
 	//read first file
 	for(i=0;i<res.gl_pathc;i++)
 		if(mgl_data_read(&d,res.gl_pathv[i]))	break;
 
-	if(i>=res.gl_pathc)	{	delete []fname;	return false;	}
+	if(i>=res.gl_pathc)
+	{	globfree (&res);	return false;	}
 	kx = d.nx;	ky = d.ny;	kz = d.nz;
 	b = (mreal *)malloc(kx*ky*kz*sizeof(mreal));
 	memcpy(b,d.a,kx*ky*kz*sizeof(mreal));
@@ -1153,12 +1157,11 @@ int MGL_EXPORT mgl_data_read_all(HMDT dat, const char *templ, int as_slice)
 	{
 		if(mgl_data_read(&d,res.gl_pathv[i]))
 			if(!mgl_add_file(kx,ky,kz,b,&d,as_slice))
-			{	delete []fname;	free(b);	return false;	}
+			{	globfree (&res);	free(b);	return false;	}
 	}
 	dat->Set(b,kx,ky,kz);
 
-	globfree (&res);
-	delete []fname;	free(b);
+	globfree (&res);	free(b);
 	return true;
 #else
 	return false;
diff --git a/src/eval.cpp b/src/eval.cpp
index 1b0085b..944b5b6 100644
--- a/src/eval.cpp
+++ b/src/eval.cpp
@@ -148,6 +148,8 @@ void MGL_EXPORT mgl_srnd(long seed)
 }
 void MGL_EXPORT mgl_srnd_(int *seed)	{	mgl_srnd(*seed);	}
 //-----------------------------------------------------------------------------
+double MGL_EXPORT mgl_hypot(double x, double y)	{	return hypot(x,y);	}
+//-----------------------------------------------------------------------------
 #if MGL_HAVE_PTHREAD
 pthread_mutex_t mutexRnd;
 #endif
@@ -729,8 +731,8 @@ uintptr_t MGL_EXPORT mgl_create_expr_(const char *expr, int l)
 	uintptr_t res = uintptr_t(mgl_create_expr(s));
 	delete []s;	return res;	}
 void MGL_EXPORT mgl_delete_expr_(uintptr_t *ex)	{	mgl_delete_expr((HMEX)ex);	}
-double MGL_EXPORT mgl_eval_expr_(uintptr_t *ex, mreal *x, mreal *y, mreal *z)
+double MGL_EXPORT mgl_expr_eval_(uintptr_t *ex, mreal *x, mreal *y, mreal *z)
 {	return mgl_expr_eval((HMEX) ex, *x,*y,*z);		}
-double MGL_EXPORT mgl_diff_expr_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int)
+double MGL_EXPORT mgl_expr_diff_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int)
 {	return mgl_expr_diff((HMEX) ex, *dir,*x,*y,*z);	}
 //-----------------------------------------------------------------------------
diff --git a/src/evalc.cpp b/src/evalc.cpp
index ed49840..8834f3a 100644
--- a/src/evalc.cpp
+++ b/src/evalc.cpp
@@ -272,11 +272,19 @@ dual MGL_EXPORT mgl_ipowc(dual x,int n)
 	if(n%2==1)	t *= x;
 	return t;
 }
+dual MGL_EXPORT mgl_ipowc_(dual *x,int *n)	{	return mgl_ipowc(*x,*n);	}
 //-----------------------------------------------------------------------------
 HAEX MGL_EXPORT mgl_create_cexpr(const char *expr)	{	return new mglFormulaC(expr);	}
+uintptr_t MGL_EXPORT mgl_create_cexpr_(const char *expr, int l)
+{	char *s=new char[l+1];	memcpy(s,expr,l);	s[l]=0;
+	uintptr_t res = uintptr_t(mgl_create_cexpr(s));
+	delete []s;	return res;	}
 void MGL_EXPORT mgl_delete_cexpr(HAEX ex)	{	delete ex;	}
+void MGL_EXPORT mgl_delete_cexpr_(uintptr_t *ex)	{	mgl_delete_cexpr((HAEX)ex);	}
 dual MGL_EXPORT mgl_cexpr_eval(HAEX ex, dual x, dual y,dual z)
 {	return ex->Calc(x,y,z);	}
+dual MGL_EXPORT mgl_cexpr_eval_(uintptr_t *ex, dual *x, dual *y, dual *z)
+{	return mgl_cexpr_eval((HAEX) ex, *x,*y,*z);		}
 dual MGL_EXPORT mgl_cexpr_eval_v(HAEX ex, dual *var)
 {	return ex->Calc(var);	}
 //-----------------------------------------------------------------------------
diff --git a/src/exec.cpp b/src/exec.cpp
index d407648..18f6355 100644
--- a/src/exec.cpp
+++ b/src/exec.cpp
@@ -2289,6 +2289,10 @@ int MGL_NO_EXPORT mgls_region(mglGraph *gr, long , mglArg *a, const char *k, con
 	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;
 }
 //-----------------------------------------------------------------------------
@@ -2812,7 +2816,7 @@ mglCommand mgls_base_cmd[] = {
 	{"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},
diff --git a/src/export_2d.cpp b/src/export_2d.cpp
index 82fca1f..5ac2eec 100644
--- a/src/export_2d.cpp
+++ b/src/export_2d.cpp
@@ -181,6 +181,7 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
 	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));
@@ -340,6 +341,7 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
 	}
 	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;
@@ -359,6 +361,7 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
 	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);
@@ -498,106 +501,13 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
 	{	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;
@@ -605,28 +515,44 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
 
 	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)
@@ -636,41 +562,48 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
 			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
 		{
@@ -681,7 +614,7 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
 			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
@@ -693,52 +626,32 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
 			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;	}
 //-----------------------------------------------------------------------------
diff --git a/src/export_3d.cpp b/src/export_3d.cpp
index 2006616..4d0ac83 100644
--- a/src/export_3d.cpp
+++ b/src/export_3d.cpp
@@ -301,9 +301,10 @@ void MGL_EXPORT mgl_write_obj_old(HMGL gr, const char *fname,const char *descr,
 	delete []ng;
 
 	size_t len=strlen(fname),ntxt=gr->GetTxtNum();
-	char *tname = new char[len+5];	strcpy(tname,fname);
 	FILE *fp=fopen(fname,"wt");
+	if(!fp)		{	gr->SetWarn(mglWarnOpen,fname);	return;	}
 	// vertices definition
+	setlocale(LC_NUMERIC, "C");
 	fprintf(fp,"# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname);
 	for(long i=0;i<gr->GetPntNum();i++)
 	{
@@ -314,6 +315,7 @@ void MGL_EXPORT mgl_write_obj_old(HMGL gr, const char *fname,const char *descr,
 //		else fprintf(fp,"vn %g %g %g\n",pp.u,pp.v,pp.w);
 	}
 	// primitive definition in groups
+	char *tname = new char[len+5];	strcpy(tname,fname);
 	tname[len-4]=0;	fprintf(fp,"# Primitives Definitions\nmtllib %s.mtl\nusemtl %s\n",tname,tname);
 	for(size_t i=0;i<gr->Grp.size();i++)
 	{
@@ -351,6 +353,7 @@ void MGL_EXPORT mgl_write_obj_old(HMGL gr, const char *fname,const char *descr,
 	if(use_png)	mgl_pnga_save(tname,256,256*j,pbuf);
 	else		mgl_tga_save(tname,256,256*j,pbuf);
 	free(pbuf);	delete []buf;	delete []tname;
+	setlocale(LC_NUMERIC, "");
 }
 void MGL_EXPORT mgl_write_obj_old_(uintptr_t *gr, const char *fname,const char *descr, int *use_png,int l,int n)
 {	char *s=new char[l+1];	memcpy(s,fname,l);	s[l]=0;
@@ -361,6 +364,8 @@ void MGL_EXPORT mgl_write_stl(HMGL gr, const char *fname,const char *descr)
 {
 	if(gr->GetPrmNum()==0)	return;	// nothing to do
 	FILE *fp = fopen(fname,"wt");
+	if(!fp)		{	gr->SetWarn(mglWarnOpen,fname);	return;	}
+	setlocale(LC_NUMERIC, "C");
 	fprintf(fp,"solid %s\n",(descr && *descr)?descr:"mathgl");
 	register long i;
 	mglPnt pp;
@@ -401,6 +406,7 @@ void MGL_EXPORT mgl_write_stl(HMGL gr, const char *fname,const char *descr)
 	}
 	fprintf(fp,"endsolid %s",(descr && *descr)?descr:"mathgl");
 	fclose(fp);
+	setlocale(LC_NUMERIC, "");
 }
 void MGL_EXPORT mgl_write_stl_(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;
@@ -413,6 +419,8 @@ void MGL_EXPORT mgl_write_xyz(HMGL gr, const char *fname,const char *descr)
 
 	register long i;
 	FILE *fp=fopen(fname,"wt"), *ff;	// vertices definition
+	if(!fp)		{	gr->SetWarn(mglWarnOpen,fname);	return;	}
+	setlocale(LC_NUMERIC, "C");
 	fprintf(fp,"# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname);
 	fprintf(fp,"# List of Vertices, with (x,y,z) coordinates.\n");
 	for(i=0;i<gr->GetPntNum();i++)
@@ -439,6 +447,7 @@ void MGL_EXPORT mgl_write_xyz(HMGL gr, const char *fname,const char *descr)
 		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);
 	}
 	fclose(fp);	fclose(ff);	delete []tname;
+	setlocale(LC_NUMERIC, "");
 }
 void MGL_EXPORT mgl_write_xyz_(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;
@@ -456,6 +465,8 @@ void MGL_EXPORT mgl_write_off(HMGL gr, const char *fname,const char *descr, int
 	if(nf<=0)	return;	// nothing to do
 
 	FILE *fp=fopen(fname,"wt");
+	if(!fp)		{	gr->SetWarn(mglWarnOpen,fname);	return;	}
+	setlocale(LC_NUMERIC, "C");
 	// vertices definition
 	if(colored)
 		fprintf(fp,"COFF\n# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname);
@@ -500,6 +511,7 @@ void MGL_EXPORT mgl_write_off(HMGL gr, const char *fname,const char *descr, int
 		}
 	}
 	fclose(fp);
+	setlocale(LC_NUMERIC, "");
 }
 void MGL_EXPORT mgl_write_off_(uintptr_t *gr, const char *fname,const char *descr,int *colored,int l,int n)
 {	char *s=new char[l+1];	memcpy(s,fname,l);	s[l]=0;
@@ -533,6 +545,7 @@ std::string mglCanvas::GetJSON()
 	std::string res, buf;
 	long i,ll=0,l=(long)Pnt.size();
 	long factor = Width>1?10:10000;
+	setlocale(LC_NUMERIC, "C");
 	res = res + mgl_sprintf("{\n\"width\":%d,\t\"height\":%d,\t\"depth\":%d,\t\"plotid\":\"%s\",\t\"npnts\":%ld,\t\"pnts\":[\n",
 			factor*Width, factor*Height, factor*Depth, PlotId.c_str(), l);
 	std::string *tmp=new std::string[l];
@@ -568,7 +581,7 @@ std::string mglCanvas::GetJSON()
 		{
 			const mglPnt &q = Pnt[p.n1];
 #pragma omp critical
-			{xy.push_back(mglPoint(q.u,q.v,p.n2));	n2 = xy.size()-1;}
+			{n2 = xy.size();	xy.push_back(mglPoint(q.u,q.v,p.n2));}
 			n3 = p.n3;	n4 = p.n4;
 		}
 		if(p.type==1 && n1>n2)	{	n1=p.n2;	n2=p.n1;	}
@@ -608,6 +621,7 @@ std::string mglCanvas::GetJSON()
 		res = res + mgl_sprintf("]\n]%c\n", i+1<l?',':' ');
 	}
 	res = res + mgl_sprintf("]\n}\n");
+	setlocale(LC_NUMERIC, "");
 	return res;
 }
 //-----------------------------------------------------------------------------
@@ -630,6 +644,7 @@ bool mglCanvas::ExportMGLD(const char *fname, const char *descr)
 	if(Pnt.size()<1 || Prm.size()<1)	return true;
 	FILE *fp=fopen(fname,"wt");
 	if(!fp)	return true;
+	setlocale(LC_NUMERIC, "C");
 	// NOTE: I'll save Ptx. So prim type=6 is useless,and no LaTeX
 	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);
 	fprintf(fp,"# Vertexes: x y z c t ta u v w r g b a\n");
@@ -667,6 +682,7 @@ bool mglCanvas::ExportMGLD(const char *fname, const char *descr)
 		}
 	}
 	fclose(fp);
+	setlocale(LC_NUMERIC, "");
 	return false;
 }
 //-----------------------------------------------------------------------------
@@ -689,7 +705,8 @@ bool mglCanvas::ImportMGLD(const char *fname, bool add)
 	sscanf(buf+5,"%lu%lu%lu%lu%d%d",&n,&m,&l,&k,&w,&h);
 	if(w<=0 || h<=0)	{	w=Width;	h=Height;	}
 	d = long(sqrt(double(w*h)));
-	if(n<=0 || m<=0 || l<=0)	{	delete []buf;	fclose(fp);	return true;	}
+	if(n==0 || m==0 || l==0)	{	delete []buf;	fclose(fp);	return true;	}
+	setlocale(LC_NUMERIC, "C");
 	if(!add)	{	Clf();	Txt.clear();	}
 	else	{	ClfZB();	npnt=Pnt.size();	nglf=Glf.size();	}
 #if MGL_HAVE_PTHREAD
@@ -757,6 +774,7 @@ bool mglCanvas::ImportMGLD(const char *fname, bool add)
 	pthread_mutex_unlock(&mutexPrm);
 	pthread_mutex_unlock(&mutexTxt);
 #endif
+	setlocale(LC_NUMERIC, "");
 	delete []buf;	fclose(fp);	return false;
 }
 //-----------------------------------------------------------------------------
@@ -1146,6 +1164,7 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr)
 	bool gz = fname[strlen(fname)-1]=='z';
 	void *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\" encoding=\"UTF-8\"?>\n");
 	mgl_printf(fp, gz, "<!DOCTYPE X3D PUBLIC \"ISO//Web3D//DTD X3D 3.0//EN\" \"http://www.web3d.org/specifications/x3d-3.0.dtd\">\n");
 	mgl_printf(fp, gz, "<X3D profile='Immersive'>\n<head>\n<meta name='filename' content='%s'/>\n",fname);
@@ -1299,6 +1318,8 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr)
 	}
 	mgl_printf(fp, gz, "</Scene>\n");
 	if(gz)	gzclose((gzFile)fp);	else	fclose((FILE *)fp);
+	setlocale(LC_NUMERIC, "");
+	delete []pnt;
 }
 void MGL_EXPORT mgl_write_x3d_(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;
diff --git a/src/fit.cpp b/src/fit.cpp
index bce38a3..e5f4f82 100644
--- a/src/fit.cpp
+++ b/src/fit.cpp
@@ -112,13 +112,13 @@ int MGL_NO_EXPORT mgl_fit__fdf (const gsl_vector * x, void *data, gsl_vector * f
 #endif
 //-----------------------------------------------------------------------------
 /// GSL based fitting procedure for formula/arguments specified by string
-mreal MGL_NO_EXPORT mgl_fit_base(mglFitData *fd, mreal *ini)
+mreal MGL_NO_EXPORT mgl_fit_base(mglFitData &fd, mreal *ini)
 {
 #if MGL_HAVE_GSL
-	register long i,m=fd->m,n=fd->n,iter=0;
-	if(n<1 || fd==0 || ini==0)	return -1;
+	register long i,m=fd.m,n=fd.n,iter=0;
+	if(n<1 || ini==0)	return -1;
 	// setup data
-	double *x_init = new double[fd->m];
+	double *x_init = new double[fd.m];
 	for(i=0;i<m;i++)	x_init[i] = ini[i];
 	// setup fitting
 	gsl_matrix *covar = gsl_matrix_alloc(m, m);
@@ -128,7 +128,7 @@ mreal MGL_NO_EXPORT mgl_fit_base(mglFitData *fd, mreal *ini)
 	gsl_multifit_function_fdf f;
 	f.f = mgl_fit__f;		f.df = mgl_fit__df;
 	f.fdf = mgl_fit__fdf;	f.n = n;	f.p = m;
-	f.params = fd;
+	f.params = &fd;
 	gsl_multifit_fdfsolver_set(s, &f, &vx.vector);
 	int status;	// start fitting
 	do
@@ -280,7 +280,7 @@ HMDT MGL_EXPORT mgl_fit_xys(HMGL gr, HCDT xx, HCDT yy, HCDT ss, const char *eq,
 		else in.Fill(0.,0);
 		fd.a = y.a+i*m;		fd.x = x.a+(i%x.ny)*m;
 		fd.s = s.a+i*m;
-		res = mgl_fit_base(&fd,in.a);
+		res = mgl_fit_base(fd,in.a);
 		mgl_fill_fit(gr,*fit,in,fd,var,nn,1,1,i);
 		if(ini && ini->nx>=fd.m)	memcpy(ini->a,in.a,fd.m*sizeof(mreal));
 	}
@@ -323,7 +323,7 @@ HMDT MGL_EXPORT mgl_fit_xyzs(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT ss, const
 		if(ini && ini->nx>=fd.m)	in.Set(ini->a,fd.m);
 		else in.Fill(0.,0);
 		fd.a = z.a+i*m*n;		fd.s = s.a+i*m*n;
-		res = mgl_fit_base(&fd,in.a);
+		res = mgl_fit_base(fd,in.a);
 		mgl_fill_fit(gr,*fit,in,fd,var,nn,nn,1,i);
 		if(ini && ini->nx>=fd.m)	memcpy(ini->a,in.a,fd.m*sizeof(mreal));
 	}
@@ -365,7 +365,7 @@ HMDT MGL_EXPORT mgl_fit_xyzas(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT aa, HCDT
 
 	if(ini && ini->nx>=fd.m)	in.Set(ini->a,fd.m);
 	else in.Fill(0.,0);
-	res = mgl_fit_base(&fd,in.a);
+	res = mgl_fit_base(fd,in.a);
 	mgl_fill_fit(gr,*fit,in,fd,var,nn,nn,nn,0);
 	if(ini && ini->nx>=fd.m)	memcpy(ini->a,in.a,fd.m*sizeof(mreal));
 
diff --git a/src/parser.cpp b/src/parser.cpp
index 8d47126..2b61cda 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -648,7 +648,7 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
 			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)
 				{
@@ -978,7 +978,7 @@ uintptr_t MGL_EXPORT mgl_parser_add_var_(uintptr_t* p, const char *name, int l)
 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)
diff --git a/src/pixel.cpp b/src/pixel.cpp
index e5f96ae..f300239 100644
--- a/src/pixel.cpp
+++ b/src/pixel.cpp
@@ -171,6 +171,7 @@ mglPoint mglCanvas::RestorePnt(mglPoint ps, bool norm) const
 //-----------------------------------------------------------------------------
 mglPoint mglCanvas::CalcXYZ(int xs, int ys, bool real) const
 {
+	if(xs<0 || ys<0 || xs>=Width || ys>=Height)	return mglPoint(NAN,NAN,NAN);
 	mglPoint p, ps(xs,Height-ys,NAN);
 	float zz = Z[3*(xs+Width*(Height-1-ys))];
 	if(zz>-1e20f)	{	ps.z = zz;	real=false;	}
@@ -664,8 +665,8 @@ unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id)
 			}
 		}
 		b0 += (ar>1 ? 1:ar)*p.r;	// diffuse light
-		b1 += (ar>1 ? 1:ar)*p.g;
-		b2 += (ar>1 ? 1:ar)*p.b;
+		b1 += (ag>1 ? 1:ag)*p.g;
+		b2 += (ab>1 ? 1:ab)*p.b;
 		b0 = b0<1 ? b0 : 1;			// normalize components
 		b1 = b1<1 ? b1 : 1;
 		b2 = b2<1 ? b2 : 1;
@@ -714,12 +715,13 @@ void mglCanvas::combine(unsigned char *c1, const unsigned char *c2)
 //-----------------------------------------------------------------------------
 unsigned char **mglCanvas::GetRGBLines(long &w, long &h, unsigned char *&f, bool alpha)
 {
-	long d = alpha ? 4:3;
 	unsigned char **p;
 	Finish();
 	p = (unsigned char **)malloc(Height * sizeof(unsigned char *));
+	long d = (alpha ? 4:3)*Width;
+	unsigned char *gg = (alpha?G4:G);
 #pragma omp parallel for
-	for(long i=0;i<Height;i++)	p[i] = (alpha?G4:G)+d*Width*i;
+	for(long i=0;i<Height;i++)	p[i] = gg + d*i;
 	w = Width;	h = Height;		f = 0;
 	return p;
 }
@@ -1837,7 +1839,7 @@ long mglCanvas::setPp(mglPnt &q, const mglPoint &p)
 	q.xx=q.x=p.x;	q.yy=q.y=p.y;	q.zz=q.z=p.z;
 	long k;
 #pragma omp critical(pnt)
-	{MGL_PUSH(Pnt,q,mutexPnt);	k=Pnt.size()-1;}
+	{k=Pnt.size();	MGL_PUSH(Pnt,q,mutexPnt);}
 	return k;
 }
 //-----------------------------------------------------------------------------
diff --git a/src/plot.cpp b/src/plot.cpp
index 387a0a9..c9ee24a 100644
--- a/src/plot.cpp
+++ b/src/plot.cpp
@@ -602,6 +602,53 @@ void MGL_EXPORT mgl_area_(uintptr_t *gr, uintptr_t *y, const char *pen, const ch
 //	Region series
 //
 //-----------------------------------------------------------------------------
+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)
+{
+	long i,j, n=y1->GetNx(), m, mx, my, mz, pal;
+	if(mgl_check_dim1(gr,x1,y1,z1,0,"Region"))	return;
+	if(mgl_check_dim1(gr,x1,x2,y2,z2,"Region"))	return;
+	m = x1->GetNy() > y1->GetNy() ? x1->GetNy() : y1->GetNy();	m = z1->GetNy() > m ? z1->GetNy() : m;
+	bool zhave = z1 && z2;
+	if(x1->GetNy()!=x2->GetNy() || y1->GetNy()!=y2->GetNy())
+	{	gr->SetWarn(mglWarnDim,"Region");	return;	}
+	if(zhave && z1->GetNy()!=z2->GetNy())
+	{	gr->SetWarn(mglWarnDim,"Region");	return;	}
+
+	gr->SaveState(opt);
+	static int cgid=1;	gr->StartGroup("Region",cgid++);
+	mreal c1,c2;
+	mglPoint nn=mglPoint(0,0,1);
+	long n1,n2,n3,n4;
+	mreal zm = gr->AdjustZMin();
+//	bool inside = (mglchr(pen,'i'));	// NOTE: check if 'i' is free (used here for inside flag)
+	bool sh = mglchr(pen,'!');
+
+	gr->SetPenPal(pen,&pal);	gr->Reserve(2*n*m);
+//	long s=gr->AddTexture(pen,1);
+	for(j=0;j<m;j++)
+	{
+		c2=c1=gr->NextColor(pal);
+		if(gr->GetNumPal(pal)==2*m && !sh)	c2=gr->NextColor(pal);
+		mx = j<x1->GetNy() ? j:0;
+		my = j<y1->GetNy() ? j:0;
+		mz = (zhave && j<z1->GetNy()) ? j:0;
+		mreal z0 = zm + (m-1-j)*(gr->Max.z-zm)/m;
+
+		n1 = gr->AddPnt(mglPoint(x1->v(0,mx),y1->v(0,my),zhave?z1->v(0,mz):z0),c1,nn,-1,11);
+		n2 = gr->AddPnt(mglPoint(x2->v(0,mx),y2->v(0,my),zhave?z2->v(0,mz):z0),c2,nn,-1,11);
+		for(i=1;i<n;i++)
+		{
+			if(gr->Stop)	return;
+			n3=n1;	n4=n2;
+			if(sh)	c2=c1=gr->NextColor(pal,i);
+			n1 = gr->AddPnt(mglPoint(x1->v(i,mx),y1->v(i,my),zhave?z1->v(i,mz):z0),c1,nn,-1,11);
+			n2 = gr->AddPnt(mglPoint(x2->v(i,mx),y2->v(i,my),zhave?z2->v(i,mz):z0),c2,nn,-1,11);
+			gr->quad_plot(n1,n2,n3,n4);
+		}
+	}
+	gr->EndGroup();
+}
+//-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_region_xy(HMGL gr, HCDT x, HCDT y1, HCDT y2, const char *pen, const char *opt)
 {
 	long i,j, n=y1->GetNx(), m=y1->GetNy(), mx, pal;
@@ -652,6 +699,11 @@ void MGL_EXPORT mgl_region(HMGL gr, HCDT y1, HCDT y2, const char *pen, const cha
 	mgl_region_xy(gr,&x,y1,y2,pen,0);
 }
 //-----------------------------------------------------------------------------
+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)
+{	char *s=new char[l+1];	memcpy(s,pen,l);	s[l]=0;
+	char *o=new char[lo+1];	memcpy(o,opt,lo);	o[lo]=0;
+	mgl_region_3d(_GR_, _DA_(x1),_DA_(y1),_DA_(z1),_DA_(x2),_DA_(y2),_DA_(z2),s,o);	delete []o;	delete []s;	}
+//-----------------------------------------------------------------------------
 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)
 {	char *s=new char[l+1];	memcpy(s,pen,l);	s[l]=0;
 	char *o=new char[lo+1];	memcpy(o,opt,lo);	o[lo]=0;
@@ -880,7 +932,7 @@ void MGL_EXPORT mgl_bars_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
 	memset(dd,0,n*sizeof(mreal));
 
 	gr->SetPenPal(pen,&pal);
-	if(wire)	gr->Reserve(4*n*m);	else	gr->Reserve(4*n*m);
+	gr->Reserve(4*n*m);
 	for(long j=0;j<m;j++)
 	{
 		c2=c1=gr->NextColor(pal);
@@ -948,7 +1000,7 @@ void MGL_EXPORT mgl_bars_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char
 	memset(dd,0,n*sizeof(mreal));
 
 	gr->SetPenPal(pen,&pal);
-	if(wire)	gr->Reserve(4*n*m);	else	gr->Reserve(4*n*m);
+	gr->Reserve(4*n*m);
 	for(long j=0;j<m;j++)
 	{
 		c2=c1=gr->NextColor(pal);
@@ -1037,7 +1089,7 @@ void MGL_EXPORT mgl_barh_yx(HMGL gr, HCDT y, HCDT v, const char *pen, const char
 	memset(dd,0,n*sizeof(mreal));
 
 	gr->SetPenPal(pen,&pal);
-	if(wire)	gr->Reserve(4*n*m);	else	gr->Reserve(4*n*m);
+	gr->Reserve(4*n*m);
 	for(long j=0;j<m;j++)
 	{
 		c2=c1=gr->NextColor(pal);
@@ -1153,7 +1205,7 @@ void MGL_EXPORT mgl_ohlc(HMGL gr, HCDT open, HCDT high, HCDT low, HCDT close, co
 	mgl_ohlc_x(gr,&x,open,high,low,close,pen,0);
 }
 //-----------------------------------------------------------------------------
-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)
+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)
 {	char *s=new char[l+1];	memcpy(s,pen,l);	s[l]=0;
 	char *o=new char[lo+1];	memcpy(o,opt,lo);	o[lo]=0;
 	mgl_ohlc_x(_GR_,_DA_(x),_DA_(open),_DA_(high),_DA_(low),_DA_(close),s,o);	delete []o;	delete []s;	}
diff --git a/src/surf.cpp b/src/surf.cpp
index edbd4b4..f847657 100644
--- a/src/surf.cpp
+++ b/src/surf.cpp
@@ -291,7 +291,7 @@ void MGL_EXPORT mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
 	long ss = gr->AddTexture(sch);
 	long *pos = new long[n*m];
 	bool wire = (mglchr(sch,'#'));
-	gr->Reserve(n*m*z->GetNz()*(wire?2:1));
+	gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));
 
 	mglPoint p,q,s,xx,yy;
 	for(long k=0;k<z->GetNz();k++)
@@ -432,7 +432,8 @@ void MGL_EXPORT mgl_dens_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
 
 	long ss = gr->AddTexture(sch);
 	long *pos = new long[n*m];
-	gr->Reserve(n*m*z->GetNz());
+	bool wire = (mglchr(sch,'#'));
+	gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));
 
 	mglPoint p,s=mglPoint(0,0,1);
 	mreal zz, c;
@@ -453,9 +454,9 @@ void MGL_EXPORT mgl_dens_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
 #pragma omp parallel for
 			for(long i=0;i<n*m;i++)	gr->mark_plot(pos[i],'.');
 		else	mgl_surf_plot(gr,pos,n,m);
-		if(mglchr(sch,'#') && !gr->Stop)
+		if(wire && !gr->Stop)
 		{
-			gr->Reserve(n*m);	gr->SetPenPal("k-");
+			gr->SetPenPal("k-");
 #pragma omp parallel for
 			for(long i=0;i<n*m;i++)	pos[i] = gr->CopyNtoC(pos[i],gr->CDef);
 			mgl_mesh_plot(gr,pos,n,m,3);
@@ -516,7 +517,8 @@ void MGL_EXPORT mgl_surfc_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char
 	static int cgid=1;	gr->StartGroup("SurfC",cgid++);
 	long ss = gr->AddTexture(sch);
 	long *pos = new long[n*m];
-	gr->Reserve(n*m*z->GetNz());
+	bool wire = (mglchr(sch,'#'));
+	gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));
 
 	mglPoint p,q,s,xx,yy;
 	for(long k=0;k<z->GetNz();k++)
@@ -535,9 +537,9 @@ void MGL_EXPORT mgl_surfc_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char
 #pragma omp parallel for
 			for(long i=0;i<n*m;i++)	gr->mark_plot(pos[i],'.');
 		else	mgl_surf_plot(gr,pos,n,m);
-		if(mglchr(sch,'#') && !gr->Stop)
+		if(wire && !gr->Stop)
 		{
-			gr->Reserve(n*m);	gr->SetPenPal("k-");
+			gr->SetPenPal("k-");
 #pragma omp parallel for
 			for(long i=0;i<n*m;i++)	pos[i] = gr->CopyNtoC(pos[i],gr->CDef);
 			mgl_mesh_plot(gr,pos,n,m,3);
@@ -578,7 +580,8 @@ void MGL_EXPORT mgl_surfa_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char
 	static int cgid=1;	gr->StartGroup("SurfA",cgid++);
 	long ss = gr->AddTexture(sch);
 	long *pos = new long[n*m];
-	gr->Reserve(n*m*z->GetNz());
+	bool wire = (mglchr(sch,'#'));
+	gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));
 
 	mglPoint p,q,s,xx,yy;
 	for(k=0;k<z->GetNz();k++)
@@ -597,9 +600,9 @@ void MGL_EXPORT mgl_surfa_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char
 #pragma omp parallel for
 			for(long i=0;i<n*m;i++)	gr->mark_plot(pos[i],'.');
 		else	mgl_surf_plot(gr,pos,n,m);
-		if(mglchr(sch,'#'))
+		if(wire && !gr->Stop)
 		{
-			gr->Reserve(n*m);	gr->SetPenPal("k-");
+			gr->SetPenPal("k-");
 #pragma omp parallel for
 			for(long i=0;i<n*m;i++)	pos[i] = gr->CopyNtoC(pos[i],gr->CDef);
 			mgl_mesh_plot(gr,pos,n,m,3);
diff --git a/src/vect.cpp b/src/vect.cpp
index 89ad9fe..4644562 100644
--- a/src/vect.cpp
+++ b/src/vect.cpp
@@ -1021,7 +1021,7 @@ void MGL_EXPORT mgl_grad_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT phi, const ch
 	mglData ax(phi), ay,az,xx,yy,zz;
 	ay.Set(ax);	az.Set(ax);	xx.Set(ax);	yy.Set(ax);	zz.Set(ax);
 	long n=xx.nx, m=xx.ny, l=xx.nz, nn = n*m*l;
-	if(x->GetNx()*x->GetNy()*x->GetNz()==nn && y->GetNx()*y->GetNy()*y->GetNz()==nn && x->GetNx()*x->GetNy()*x->GetNz()==nn)
+	if(x->GetNx()*x->GetNy()*x->GetNz()==nn && y->GetNx()*y->GetNy()*y->GetNz()==nn && z->GetNx()*z->GetNy()*z->GetNz()==nn)
 	{	xx.Set(x);	yy.Set(y);	zz.Set(z);	}	// nothing to do
 	else if(x->GetNx()==n && y->GetNx()==m && z->GetNx()==l)
 #pragma omp parallel for collapse(3)
diff --git a/src/volume.cpp b/src/volume.cpp
index 910eb3e..2a83031 100644
--- a/src/volume.cpp
+++ b/src/volume.cpp
@@ -285,7 +285,7 @@ void MGL_EXPORT mgl_surf3_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, H
 					q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);
 					pos = gr->AddPnt(p,c,q);	u.c=pos;
 					if(pos<0)	continue;
-					kk.push_back(u);	kx2[i1] = kk.size()-1;
+					kx2[i1] = kk.size();	kk.push_back(u);
 				}
 			}
 			if(j<m-1)
@@ -301,7 +301,7 @@ void MGL_EXPORT mgl_surf3_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, H
 					q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);
 					pos = gr->AddPnt(p,c,q);	u.c=pos;
 					if(pos<0)	continue;
-					kk.push_back(u);	ky2[i1] = kk.size()-1;
+					ky2[i1] = kk.size();	kk.push_back(u);
 				}
 			}
 			if(k>0)
@@ -317,7 +317,7 @@ void MGL_EXPORT mgl_surf3_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, H
 					q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);
 					pos = gr->AddPnt(p,c,q);	u.c=pos;
 					if(pos<0)	continue;
-					kk.push_back(u);	kz[i1] = kk.size()-1;
+					kz[i1] = kk.size();	kk.push_back(u);
 				}
 			}
 		}
@@ -436,7 +436,7 @@ void MGL_EXPORT mgl_surf3a_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z,
 					q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);
 					pos = gr->AddPnt(p,c,q,aa);	u.c=pos;
 					if(pos<0)	continue;
-					kk.push_back(u);	kx2[i1] = kk.size()-1;
+					kx2[i1] = kk.size();	kk.push_back(u);
 				}
 			}
 			if(j<m-1)
@@ -453,7 +453,7 @@ void MGL_EXPORT mgl_surf3a_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z,
 					q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);
 					pos = gr->AddPnt(p,c,q,aa);	u.c=pos;
 					if(pos<0)	continue;
-					kk.push_back(u);	ky2[i1] = kk.size()-1;
+					ky2[i1] = kk.size();	kk.push_back(u);
 				}
 			}
 			if(k>0)
@@ -470,7 +470,7 @@ void MGL_EXPORT mgl_surf3a_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z,
 					q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);
 					pos = gr->AddPnt(p,c,q,aa);	u.c=pos;
 					if(pos<0)	continue;
-					kk.push_back(u);	kz[i1] = kk.size()-1;
+					kz[i1] = kk.size();	kk.push_back(u);
 				}
 			}
 		}
@@ -603,7 +603,7 @@ void MGL_EXPORT mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z,
 					q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);
 					pos = gr->AddPnt(p,c,q);	u.c=pos;
 					if(pos<0)	continue;
-					kk.push_back(u);	kx2[i1] = kk.size()-1;
+					kx2[i1] = kk.size();	kk.push_back(u);
 				}
 			}
 			if(j<m-1)
@@ -620,7 +620,7 @@ void MGL_EXPORT mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z,
 					q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);
 					pos = gr->AddPnt(p,c,q);	u.c=pos;
 					if(pos<0)	continue;
-					kk.push_back(u);	ky2[i1] = kk.size()-1;
+					ky2[i1] = kk.size();	kk.push_back(u);
 				}
 			}
 			if(k>0)
@@ -637,7 +637,7 @@ void MGL_EXPORT mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z,
 					q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l);
 					pos = gr->AddPnt(p,c,q);	u.c=pos;
 					if(pos<0)	continue;
-					kk.push_back(u);	kz[i1] = kk.size()-1;
+					kz[i1] = kk.size();	kk.push_back(u);
 				}
 			}
 		}
diff --git a/texinfo/deflate.min.js b/texinfo/deflate.min.js
deleted file mode 100644
index a6e4153..0000000
--- a/texinfo/deflate.min.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/** @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.leng [...]
-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,997 [...]
-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,165865827 [...]
-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,205379037 [...]
-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,7332399 [...]
-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,365470383 [...]
-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 [...]
-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: [...]
-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.len [...]
-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 [...]
-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]++;e [...]
-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. [...]
-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:retu [...]
-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>= [...]
-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];brea [...]
-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 [...]
-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,++ [...]
-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=A [...]
-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][ [...]
-(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 [...]
-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 [...]
-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 [...]
-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;fo [...]
-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 [...]
diff --git a/texinfo/gunzip.min.js b/texinfo/gunzip.min.js
deleted file mode 100644
index 9842bc4..0000000
--- a/texinfo/gunzip.min.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/** @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= [...]
-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,1172266 [...]
-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,165865827 [...]
-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,205379037 [...]
-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,7332399 [...]
-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,365470383 [...]
-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("Z [...]
-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:retu [...]
-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 [...]
-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 bloc [...]
-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, [...]
-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, [...]
-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++]);) [...]
-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( [...]
-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 [...]
-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);
diff --git a/texinfo/inflate.min.js b/texinfo/inflate.min.js
deleted file mode 100644
index a5dee75..0000000
--- a/texinfo/inflate.min.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/** @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,1246341 [...]
-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,165865827 [...]
-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,205379037 [...]
-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,7332399 [...]
-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,365470383 [...]
-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= [...]
-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:retu [...]
-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 [...]
-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 bloc [...]
-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, [...]
-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, [...]
-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  [...]
-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("un [...]
-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. [...]
diff --git a/texinfo/overview_en.texi b/texinfo/overview_en.texi
index ac5d43b..ca0e512 100644
--- a/texinfo/overview_en.texi
+++ b/texinfo/overview_en.texi
@@ -224,9 +224,9 @@ I'm thankful to D. Eftaxiopoulos, V. Lipatov and S.M. Plis for making binary pac
 @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{}
diff --git a/texinfo/overview_ru.texi b/texinfo/overview_ru.texi
index 795aa9a..8d86cba 100644
--- a/texinfo/overview_ru.texi
+++ b/texinfo/overview_ru.texi
@@ -227,10 +227,10 @@ MathGL also provide another simple tool @code{mgl.cgi} which parse MGL script fr
 @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{}
diff --git a/texinfo/version.texi b/texinfo/version.texi
index 467aa27..a53255e 100644
--- a/texinfo/version.texi
+++ b/texinfo/version.texi
@@ -1,3 +1,3 @@
 @set VERSION 2.2
 @set MINVER .1
- at set MINVER 
+ at c @set MINVER 
diff --git a/texinfo/web_en.texi b/texinfo/web_en.texi
index c4619ff..51f5b64 100644
--- a/texinfo/web_en.texi
+++ b/texinfo/web_en.texi
@@ -48,7 +48,7 @@ Email: <input type=text name=email> <input type=submit name="sub" value="Subscri
 @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
@@ -62,10 +62,10 @@ There is detailed @ref{News, news list}. Sourceforge project page @uref{http://s
 
 @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{}
 
@@ -516,15 +516,15 @@ You may download current version of MathGL for following configurations:
 @item
 @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.tar.gz,source} file with cmake build system.
 @item
- at uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}-mingw.i686.7z,Win32 GPL} binaries for MinGW (build for i686)
+ at uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}-mingw.i686.7z,Win32 GPL} binaries for MinGW (build for i686)
 @item
- at 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)
+ at 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
- at c @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.LGPL-win64.7z,Win64 LGPL} binaries for MSVS 2010 (no GSL and HDF5 support)
+ at 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
- at uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.eng.pdf,PDF} documentation in English
+ at uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.eng.pdf,PDF} documentation in English
 @item
- at uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}.7z, UDAV and utilities} with all required DLL files (build for i686)
+ at 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
diff --git a/texinfo/web_fr.texi b/texinfo/web_fr.texi
index bcf7f7e..a0829e7 100644
--- a/texinfo/web_fr.texi
+++ b/texinfo/web_fr.texi
@@ -123,7 +123,7 @@ Email: <input type=text name=email> <input type=submit name="sub" value="Subscri
 @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
@@ -136,10 +136,10 @@ There is detailed @ref{News, news list}. Sourceforge project page @uref{http://s
 
 @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{}
 
diff --git a/texinfo/web_ru.texi b/texinfo/web_ru.texi
index c4619ff..51f5b64 100644
--- a/texinfo/web_ru.texi
+++ b/texinfo/web_ru.texi
@@ -48,7 +48,7 @@ Email: <input type=text name=email> <input type=submit name="sub" value="Subscri
 @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
@@ -62,10 +62,10 @@ There is detailed @ref{News, news list}. Sourceforge project page @uref{http://s
 
 @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{}
 
@@ -516,15 +516,15 @@ You may download current version of MathGL for following configurations:
 @item
 @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.tar.gz,source} file with cmake build system.
 @item
- at uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}-mingw.i686.7z,Win32 GPL} binaries for MinGW (build for i686)
+ at uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}-mingw.i686.7z,Win32 GPL} binaries for MinGW (build for i686)
 @item
- at 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)
+ at 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
- at c @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.LGPL-win64.7z,Win64 LGPL} binaries for MSVS 2010 (no GSL and HDF5 support)
+ at 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
- at uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.eng.pdf,PDF} documentation in English
+ at uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.eng.pdf,PDF} documentation in English
 @item
- at uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}.7z, UDAV and utilities} with all required DLL files (build for i686)
+ at 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
diff --git a/todo.txt b/todo.txt
index 2f52f0b..d3da54c 100644
--- a/todo.txt
+++ b/todo.txt
@@ -24,7 +24,13 @@
 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 =============
 
@@ -36,6 +42,9 @@ C. Translate to Russian everything
 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
diff --git a/udav/CMakeLists.txt b/udav/CMakeLists.txt
index c151103..67e8920 100644
--- a/udav/CMakeLists.txt
+++ b/udav/CMakeLists.txt
@@ -16,6 +16,11 @@ if(WIN32)
 	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})
diff --git a/widgets/glut.cpp b/widgets/glut.cpp
index 56d285d..2e18075 100644
--- a/widgets/glut.cpp
+++ b/widgets/glut.cpp
@@ -65,7 +65,7 @@ public:
 	void ToggleLight()	{	_mgl_key_up('f',0,0);	}
 	void ToggleNo()		{	_mgl_key_up('n',0,0);	}	///< Switch off all zooming and rotation
 	void Update()		{	_mgl_key_up(' ',0,0);	}	///< Update picture by calling user drawing function
-	void ReLoad(bool o)	{	_mgl_key_up(o?']':'[',0,0);	}	///< Reload user data and update picture
+	void ReLoad()		{	_mgl_key_up('[',0,0);	}	///< Reload user data and update picture
 	void NextFrame()	{	_mgl_key_up('.',0,0);	}	///< Show next frame (if one)
 	void PrevFrame()	{	_mgl_key_up(',',0,0);	}	///< Show previous frame (if one)
 	void Animation()	{	_mgl_key_up('m',0,0);	}	///< Run slideshow (animation) of frames
@@ -243,3 +243,28 @@ HMGL MGL_EXPORT mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char
 //-----------------------------------------------------------------------------
 mglCanvasGLUT::mglCanvasGLUT() : mglCanvasGL()	{}
 //-----------------------------------------------------------------------------
+void MGL_EXPORT mgl_glut_toggle_alpha(HMGL gr)
+{	mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);
+	if(g)	g->ToggleAlpha();	}
+void MGL_EXPORT mgl_glut_toggle_light(HMGL gr)
+{	mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);
+	if(g)	g->ToggleLight();	}
+void MGL_EXPORT mgl_glut_toggle_no(HMGL gr)
+{	mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);
+	if(g)	g->ToggleNo();	}
+void MGL_EXPORT mgl_glut_update(HMGL gr)
+{	mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);
+	if(g)	g->Update();	}
+void MGL_EXPORT mgl_glut_reload(HMGL gr)
+{	mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);
+	if(g)	g->ReLoad();	}
+void MGL_EXPORT mgl_glut_next_frame(HMGL gr)
+{	mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);
+	if(g)	g->NextFrame();	}
+void MGL_EXPORT mgl_glut_prev_frame(HMGL gr)
+{	mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);
+	if(g)	g->PrevFrame();	}
+void MGL_EXPORT mgl_glut_animation(HMGL gr)
+{	mglCanvasGLUT *g = dynamic_cast<mglCanvasGLUT*>(gr);
+	if(g)	g->Animation();	}
+//-----------------------------------------------------------------------------

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/mathgl.git



More information about the debian-science-commits mailing list