Imported Upstream version 2~rc2+svn361
authorDimitrios Eftaxiopoulos <eftaxi12@otenet.gr>
Sun, 11 Mar 2012 07:16:56 +0000 (09:16 +0200)
committerDimitrios Eftaxiopoulos <eftaxi12@otenet.gr>
Sun, 11 Mar 2012 07:16:56 +0000 (09:16 +0200)
13 files changed:
examples/full_test.cpp
include/mgl/canvas_cf.h
include/mgl/mgl.h
src/axis.cpp
src/crust.cpp
src/export.cpp
src/export_2d.cpp
src/export_3d.cpp
texinfo/core_en.texi
texinfo/data_en.texi
texinfo/overview_en.texi
widgets/glut.cpp
widgets/qt.cpp

index 1419ad7a4a4c94960885e0dc6ccd2ffbc718037c..385ee8821fa0f4cd4f4ce7274b99b9589534732b 100644 (file)
@@ -49,27 +49,27 @@ void smgl_combined(mglGraph *gr);
 void save(mglGraph *gr,const char *name,const char *suf);\r
 void test(mglGraph *gr)\r
 {\r
-       mglData a(256,2);       a.Fill(-1,1);\r
-       gr->SubPlot(2,10,0,NULL,0.2);   gr->Dens(a,"kw");               gr->Puts(0.07, 0.92, "kw", "A");\r
-       gr->SubPlot(2,10,1,NULL,0.2);   gr->Dens(a,"wk");               gr->Puts(0.57, 0.92, "wk", "A");\r
-       gr->SubPlot(2,10,2,NULL,0.2);   gr->Dens(a,"kHCcw");    gr->Puts(0.07, 0.82, "kHCcw", "A");\r
-       gr->SubPlot(2,10,3,NULL,0.2);   gr->Dens(a,"kBbcw");    gr->Puts(0.57, 0.82, "kBbcw", "A");\r
-       gr->SubPlot(2,10,4,NULL,0.2);   gr->Dens(a,"kRryw");    gr->Puts(0.07, 0.72, "kRryw", "A");\r
-       gr->SubPlot(2,10,5,NULL,0.2);   gr->Dens(a,"kGgew");    gr->Puts(0.57, 0.72, "kGgew", "A");\r
-       gr->SubPlot(2,10,6,NULL,0.2);   gr->Dens(a,"BbwrR");    gr->Puts(0.07, 0.62, "BbwrR", "A");\r
-       gr->SubPlot(2,10,7,NULL,0.2);   gr->Dens(a,"BbwgG");    gr->Puts(0.57, 0.62, "BbwgG", "A");\r
-       gr->SubPlot(2,10,8,NULL,0.2);   gr->Dens(a,"GgwmM");    gr->Puts(0.07, 0.52, "GgwmM", "A");\r
-       gr->SubPlot(2,10,9,NULL,0.2);   gr->Dens(a,"UuwqR");    gr->Puts(0.57, 0.52, "UuwqR", "A");\r
-       gr->SubPlot(2,10,10,NULL,0.2);  gr->Dens(a,"QqwcC");    gr->Puts(0.07, 0.42, "QqwcC", "A");\r
-       gr->SubPlot(2,10,11,NULL,0.2);  gr->Dens(a,"CcwyY");    gr->Puts(0.57, 0.42, "CcwyY", "A");\r
-       gr->SubPlot(2,10,12,NULL,0.2);  gr->Dens(a,"bcwyr");    gr->Puts(0.07, 0.32, "bcwyr", "A");\r
-       gr->SubPlot(2,10,13,NULL,0.2);  gr->Dens(a,"bwr");              gr->Puts(0.57, 0.32, "bwr", "A");\r
-       gr->SubPlot(2,10,14,NULL,0.2);  gr->Dens(a,"BbcyrR");   gr->Puts(0.07, 0.22, "BbcyrR", "A");\r
-       gr->SubPlot(2,10,15,NULL,0.2);  gr->Dens(a,"UbcyqR");   gr->Puts(0.57, 0.22, "UbcyqR", "A");\r
-       gr->SubPlot(2,10,16,NULL,0.2);  gr->Dens(a,"BbcwyrR");  gr->Puts(0.07, 0.12, "BbcwyrR", "A");\r
-       gr->SubPlot(2,10,17,NULL,0.2);  gr->Dens(a,"bcyr");             gr->Puts(0.57, 0.12, "bcyr", "A");\r
-       gr->SubPlot(2,10,18,NULL,0.2);  gr->Dens(a,"BbcyrR|");  gr->Puts(0.07, 0.02, "BbcyrR|", "A");\r
-       gr->SubPlot(2,10,19,NULL,0.2);  gr->Dens(a,"bgr");              gr->Puts(0.57, 0.02, "bgr", "A");\r
+       float q[] = {0,1,2,3, 4,5,6,7, 0,2,4,6, 1,3,5,7, 0,4,1,5, 2,6,3,7};\r
+       float xc[] = {-1,1,-1,1,-1,1,-1,1}, yc[] = {-1,-1,1,1,-1,-1,1,1}, zc[] = {-1,-1,-1,-1,1,1,1,1};\r
+       mglData qq(6,4,q), xx(8,xc), yy(8,yc), zz(8,zc);\r
+       gr->Light(true);        //gr->Alpha(true);\r
+       gr->SubPlot(2,1,0);     gr->Title("QuadPlot sample");   gr->Rotate(50,60);\r
+       gr->QuadPlot(qq,xx,yy,zz,"yr");\r
+       gr->QuadPlot(qq,xx,yy,zz,"k#");\r
+\r
+       float t[] = {0,1,2, 0,1,3, 0,2,3, 1,2,3};\r
+       float xt[] = {-1,1,0,0}, yt[] = {-1,-1,1,0}, zt[] = {-1,-1,-1,1};\r
+       mglData tt(4,3,t), uu(4,xt), vv(4,yt), ww(4,zt);\r
+       gr->SubPlot(2,1,1);     gr->Title("TriPlot_sample");    gr->Rotate(50,60);\r
+       gr->TriPlot(tt,uu,vv,ww,"b");\r
+       gr->TriPlot(tt,uu,vv,ww,"k#");\r
+\r
+       gr->WriteXYZ("test.xyz");\r
+       gr->WriteSTL("test.stl");\r
+       gr->WriteOFF("test.off");\r
+       gr->WriteTEX("test.tex");\r
+       gr->WriteOBJ("test.obj");\r
+       gr->WriteOBJ("test1.obj","",true);\r
        return;\r
 \r
        mglParse par;\r
@@ -1762,6 +1762,31 @@ void smgl_ternary(mglGraph *gr)  // flag #
        gr->Label('y',"C",1);   gr->Label('z',"Z",1);\r
 }\r
 //-----------------------------------------------------------------------------\r
+const char *mmgl_triplot="list q 0 1 2 3 | 4 5 6 7 | 0 2 4 6 | 1 3 5 7 | 0 4 1 5 | 2 6 3 7\n"\r
+"list xq -1 1 -1 1 -1 1 -1 1\nlist yq -1 -1 1 1 -1 -1 1 1\nlist zq -1 -1 -1 -1 1 1 1 1\nlight on\n"\r
+"subplot 2 1 0:title 'QuadPlot sample':rotate 50 60\n"\r
+"quadplot q xq yq zq 'yr'\nquadplot q xq yq zq '#k'\n"\r
+"list t 0 1 2 | 0 1 3 | 0 2 3 | 1 2 3\n"\r
+"list xq -1 1 0 0\nlist yq -1 -1 1 0\nlist zq -1 -1 -1 1\n"\r
+"subplot 2 1 1:title 'TriPlot sample':rotate 50 60\n"\r
+"triplot t xt yt zt 'b'\ntriplot t xt yt zt '#k'\n";\r
+void smgl_triplot(mglGraph *gr)\r
+{\r
+       float q[] = {0,1,2,3, 4,5,6,7, 0,2,4,6, 1,3,5,7, 0,4,1,5, 2,6,3,7};\r
+       float xc[] = {-1,1,-1,1,-1,1,-1,1}, yc[] = {-1,-1,1,1,-1,-1,1,1}, zc[] = {-1,-1,-1,-1,1,1,1,1};\r
+       mglData qq(6,4,q), xx(8,xc), yy(8,yc), zz(8,zc);\r
+       gr->Light(true);        //gr->Alpha(true);\r
+       gr->SubPlot(2,1,0);     gr->Title("QuadPlot sample");   gr->Rotate(50,60);\r
+       gr->QuadPlot(qq,xx,yy,zz,"yr");\r
+       gr->QuadPlot(qq,xx,yy,zz,"k#");\r
+\r
+       float t[] = {0,1,2, 0,1,3, 0,2,3, 1,2,3};\r
+       float xt[] = {-1,1,0,0}, yt[] = {-1,-1,1,0}, zt[] = {-1,-1,-1,1};\r
+       mglData tt(4,3,t), uu(4,xt), vv(4,yt), ww(4,zt);\r
+       gr->SubPlot(2,1,1);     gr->Title("TriPlot sample");    gr->Rotate(50,60);\r
+       gr->TriPlot(tt,uu,vv,ww,"b");\r
+       gr->TriPlot(tt,uu,vv,ww,"k#");\r
+}\r
 //-----------------------------------------------------------------------------\r
 //-----------------------------------------------------------------------------\r
 //-----------------------------------------------------------------------------\r
@@ -2051,6 +2076,7 @@ mglSample samp[] = {
        {"tiles", smgl_tiles},\r
        {"torus", smgl_torus},\r
        {"traj", smgl_traj},\r
+       {"triplot", smgl_triplot},\r
        {"tube", smgl_tube},\r
        {"type0", smgl_type0},\r
        {"type1", smgl_type1},\r
index 50e3159a113463dab6fb56b9d00de0f5d0865681..6f2a6dbc79718cab058385bcb1729fc2363be5e8 100644 (file)
@@ -81,7 +81,7 @@ void mgl_write_svg(HMGL gr, const char *fname,const char *descr);
 void mgl_write_tex(HMGL gr, const char *fname,const char *descr);\r
 void mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png);\r
 void mgl_write_stl(HMGL gr, const char *fname,const char *descr);\r
-void mgl_write_off(HMGL gr, const char *fname,const char *descr);\r
+void mgl_write_off(HMGL gr, const char *fname,const char *descr, int colored);\r
 void mgl_write_xyz(HMGL gr, const char *fname,const char *descr);\r
 void mgl_write_wrl(HMGL gr, const char *fname,const char *descr);\r
 void mgl_write_x3d(HMGL gr, const char *fname,const char *descr);\r
@@ -192,7 +192,7 @@ void mgl_start_gif_(uintptr_t *graph, const char *fname,int *ms,int l);
 void mgl_close_gif_(uintptr_t *graph);\r
 void mgl_write_obj_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld);\r
 void mgl_write_stl_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld);\r
-void mgl_write_off_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld);\r
+void mgl_write_off_(uintptr_t *graph, const char *fname,const char *descr,int *colored,int lf,int ld);\r
 void mgl_write_xyz_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld);\r
 void mgl_write_wrl_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld);\r
 void mgl_write_x3d_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld);\r
index e013ae23f9d959f26b47fafa9a758ebade050277..b6daa422ce8003cba6abe81b935aefaf7062d598 100644 (file)
@@ -302,8 +302,8 @@ public:
        inline void WriteSTL(const char *fname,const char *descr="")\r
        {       mgl_write_stl(gr, fname, descr);        }\r
        /// Write the frame in file using OFF format\r
-       inline void WriteOFF(const char *fname,const char *descr="")\r
-       {       mgl_write_off(gr, fname, descr);        }\r
+       inline void WriteOFF(const char *fname,const char *descr="", bool colored=false)\r
+       {       mgl_write_off(gr, fname, descr,colored);        }\r
        /// Write the frame in file using STL format (faces only)\r
        inline void WriteWRL(const char *fname,const char *descr="")\r
        {       mgl_write_wrl(gr, fname, descr);        }\r
index b0247fb5856806c8a7fbe1620b9d36cacaf1a7e5..4e783a8b37883589d675e607a0161e14f7b6e448 100644 (file)
 #define islog(a, b) (((a)>0 && (b)>10*(a)) || ((b)<0 && (a)<10*(b)))
 #define sign(a)        ((a)<0 ? -1:1)
 //-----------------------------------------------------------------------------
-/*#ifdef WIN32 // NOTE: this is not thread safe!
-inline struct tm* localtime_r (const time_t *clock, struct tm *result)
+inline struct tm* mgl_localtime_r (const time_t *clock, struct tm *result)
 {      if (!clock || !result) return NULL;
        memcpy(result,localtime(clock),sizeof(*result));
        return result;  }
-#endif*/
 //-----------------------------------------------------------------------------
 long mgl_have_color(const char *stl)
 {
@@ -218,8 +216,8 @@ void mglCanvas::SetTickTime(char dir, float d, const char *t)
        UpdateAxis();
 
        time_t tt;      tm t1,t2;
-       tt=aa.v1;       localtime_r(&tt,&t1);
-       tt=aa.v2;       localtime_r(&tt,&t2);
+       tt=aa.v1;       mgl_localtime_r(&tt,&t1);
+       tt=aa.v2;       mgl_localtime_r(&tt,&t2);
        if(aa.v1<aa.v2) // adjust periodic values
        {
                if(abs(t1.tm_year-t2.tm_year)==1)       t2.tm_yday += 365;
@@ -275,7 +273,7 @@ void mglCanvas::SetTickTime(char dir, float d, const char *t)
        {       v1 = aa.v1;             v0 = v0 - aa.dv*floor((v0-aa.v2)/aa.dv+1e-3);   }
        if(v0+aa.dv!=v0 && v1+aa.dv!=v1)        for(v=v0;v<=v1;v+=aa.dv)
        {
-               time_t tt = v;  tm tp;          localtime_r(&tt,&tp);
+               time_t tt = v;  tm tp;          mgl_localtime_r(&tt,&tp);
                wcsftime(buf,64,aa.t,&tp);      aa.AddLabel(buf,v);
        }
 }
index 42cafcb0d729abd5f091a6b8219c91531922fedf..c8242e20023078bd3dc45452924c883c0dbb0c51 100644 (file)
@@ -34,9 +34,10 @@ void mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const
        long ss=gr->AddTexture(sch);\r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("TriPlot",cgid++);\r
-       mglPoint p1,p2,p3,q;\r
+       mglPoint p1,p2,p3,q=mglPoint(NAN,NAN);\r
 \r
        register long i,k1,k2,k3;\r
+       bool wire = sch && strchr(sch,'#');\r
        long nc = a->GetNx();\r
        if(nc!=n && nc>=m)      // colors per triangle\r
        {\r
@@ -50,7 +51,7 @@ void mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const
                        p2 = mglPoint(x->v(k2), y->v(k2), z->v(k2));\r
                        k3 = long(nums->v(2,i)+0.5);\r
                        p3 = mglPoint(x->v(k3), y->v(k3), z->v(k3));\r
-                       q = (p2-p1) ^ (p3-p1);\r
+                       if(!wire)       q = (p2-p1) ^ (p3-p1);\r
                        k1 = gr->AddPnt(p1,gr->GetC(ss,a->v(k1)),q);\r
                        k2 = gr->AddPnt(p2,gr->GetC(ss,a->v(k2)),q);\r
                        k3 = gr->AddPnt(p3,gr->GetC(ss,a->v(k3)),q);\r
@@ -68,7 +69,9 @@ void mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const
                        k1 = long(nums->v(0,i)+0.5);\r
                        k2 = long(nums->v(1,i)+0.5);\r
                        k3 = long(nums->v(2,i)+0.5);\r
-                       q = mglPoint(x->v(k2)-x->v(k1), y->v(k2)-y->v(k1), z->v(k2)-z->v(k1)) ^ mglPoint(x->v(k3)-x->v(k1), y->v(k3)-y->v(k1), z->v(k3)-z->v(k1));\r
+                       if(!wire)\r
+                               q = mglPoint(x->v(k2)-x->v(k1), y->v(k2)-y->v(k1), z->v(k2)-z->v(k1)) ^\r
+                                       mglPoint(x->v(k3)-x->v(k1), y->v(k3)-y->v(k1), z->v(k3)-z->v(k1));\r
                        // try be sure that in the same direction ... but it is so slow :(\r
                        if(pp[k1]*q<0) q*=-1;   pp[k1] += q;\r
                        if(pp[k2]*q<0) q*=-1;   pp[k2] += q;\r
@@ -86,7 +89,12 @@ void mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const
                        k1 = long(nums->v(0,i)+0.5);\r
                        k2 = long(nums->v(1,i)+0.5);\r
                        k3 = long(nums->v(2,i)+0.5);\r
-                       gr->trig_plot(kk[k1],kk[k2],kk[k3]);\r
+                       if(wire)\r
+                       {\r
+                               gr->line_plot(kk[k1],kk[k2]);   gr->line_plot(kk[k1],kk[k3]);\r
+                               gr->line_plot(kk[k3],kk[k2]);\r
+                       }\r
+                       else    gr->trig_plot(kk[k1],kk[k2],kk[k3]);\r
                }\r
                delete []kk;    delete []pp;\r
        }\r
@@ -132,10 +140,11 @@ void mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const
        long ss=gr->AddTexture(sch);\r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("QuadPlot",cgid++);\r
-       mglPoint p1,p2,p3,p4,q;\r
+       mglPoint p1,p2,p3,p4,q=mglPoint(NAN,NAN);\r
 \r
        register long i,k1,k2,k3,k4;\r
        long nc = a->GetNx();\r
+       bool wire = sch && strchr(sch,'#');\r
        if(nc!=n && nc>=m)      // colors per triangle\r
        {\r
                gr->Reserve(m*4);\r
@@ -150,7 +159,7 @@ void mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const
                        p3 = mglPoint(x->v(k3), y->v(k3), z->v(k3));\r
                        k4 = floor(nums->v(3,i)+0.5);\r
                        p4 = mglPoint(x->v(k4), y->v(k4), z->v(k4));\r
-                       q = (p2-p1) ^ (p3-p1);\r
+                       if(!wire)       q = (p2-p1) ^ (p3-p1);\r
                        k1 = gr->AddPnt(p1,gr->GetC(ss,a->v(k1)),q);\r
                        k2 = gr->AddPnt(p2,gr->GetC(ss,a->v(k2)),q);\r
                        k3 = gr->AddPnt(p3,gr->GetC(ss,a->v(k3)),q);\r
@@ -175,10 +184,14 @@ void mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const
                        k4 = floor(nums->v(3,i)+0.5);\r
                        p4 = mglPoint(x->v(k4), y->v(k4), z->v(k4));\r
 \r
-                       q = (p2-p1) ^ (p3-p1);  if(pp[k1]*q<0) q*=-1;   pp[k1] += q;\r
-                       q = (p2-p4) ^ (p3-p4);  if(pp[k2]*q<0) q*=-1;   pp[k2] += q;\r
-                       q = (p1-p2) ^ (p4-p2);  if(pp[k3]*q<0) q*=-1;   pp[k3] += q;\r
-                       q = (p1-p4) ^ (p4-p3);  if(pp[k4]*q<0) q*=-1;   pp[k4] += q;\r
+                       if(wire)        pp[k1]=pp[k2]=pp[k3]=pp[k4]=mglPoint(NAN,NAN);\r
+                       else\r
+                       {\r
+                               q = (p2-p1) ^ (p3-p1);  if(pp[k1]*q<0) q*=-1;   pp[k1] += q;\r
+                               q = (p2-p4) ^ (p3-p4);  if(pp[k2]*q<0) q*=-1;   pp[k2] += q;\r
+                               q = (p1-p2) ^ (p4-p2);  if(pp[k3]*q<0) q*=-1;   pp[k3] += q;\r
+                               q = (p1-p4) ^ (p4-p3);  if(pp[k4]*q<0) q*=-1;   pp[k4] += q;\r
+                       }\r
                }\r
                for(i=0;i<n;i++)        // add points\r
                {\r
@@ -193,7 +206,12 @@ void mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const
                        k2 = floor(nums->v(1,i)+0.5);\r
                        k3 = floor(nums->v(2,i)+0.5);\r
                        k4 = floor(nums->v(3,i)+0.5);\r
-                       gr->quad_plot(kk[k1],kk[k2],kk[k3],kk[k4]);\r
+                       if(wire)\r
+                       {\r
+                               gr->line_plot(kk[k1],kk[k2]);   gr->line_plot(kk[k1],kk[k3]);\r
+                               gr->line_plot(kk[k4],kk[k2]);   gr->line_plot(kk[k4],kk[k3]);\r
+                       }\r
+                       else    gr->quad_plot(kk[k1],kk[k2],kk[k3],kk[k4]);\r
                }\r
                delete []kk;    delete []pp;\r
        }\r
index 1e9eac22641e49fcc33244552702f9fae215a2e9..c68d9c15b814203d32daa194df716c18a8263e98 100644 (file)
@@ -198,7 +198,7 @@ int mgl_bps_save(const char *fname, int w, int h, unsigned char **p)
 
        void *fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt");
        mgl_printf(fp, gz, "%%!PS-Adobe-3.0 EPSF-3.0\n%%%%BoundingBox: 0 0 %d %d\n",w,h);
-       mgl_printf(fp, gz, "%%%%Creator: MathGL library\n%%%%Title: %s\n", fname);
+       mgl_printf(fp, gz, "%%%%Created by MathGL library\n%%%%Title: %s\n", fname);
        mgl_printf(fp, gz, "%%%%CreationDate: %s\n",ctime(&now));
        mgl_printf(fp, gz, "%d %d 8 [1 0 0 1 0 0] {currentfile %d string readhexstring pop} false 3 colorimage\n",
                        w,h,1+w*h/40);
index bec579ceebd6ed2ffd454ee66e555818a0c7e62f..f94884c39423a29089e5dbd34486cfd0cc5ca14f 100644 (file)
@@ -58,7 +58,7 @@ bool mgl_is_same(HMGL gr, const mglPrim &pr,float wp,mglColor cp,int st)
        return (cp==c);
 }
 //-----------------------------------------------------------------------------
-void put_line(HMGL gr, void *fp, bool gz, long i, float wp, mglColor cp,int st, const char *ifmt, const char *nfmt, bool neg)
+void put_line(HMGL gr, void *fp, bool gz, long i, float wp, mglColor cp,int st, const char *ifmt, const char *nfmt, bool neg, float fc)
 {
        const mglPnt pp = gr->GetPnt(gr->GetPrm(i).n1);
        float x0=pp.x, y0=pp.y;
@@ -92,7 +92,7 @@ void put_line(HMGL gr, void *fp, bool gz, long i, float wp, mglColor cp,int st,
                mglPrim &q = gr->GetPrm(j);
                if(q.type==-2)  q.type = 1;
        }
-       mgl_printf(fp, gz, ifmt,x0,neg?_Gr_->GetHeight()-y0:y0);        ok=true;
+       mgl_printf(fp, gz, ifmt,fc*x0,(neg?_Gr_->GetHeight()-y0:y0)*fc);        ok=true;
        long m=1;
        while(ok)
        {
@@ -107,14 +107,14 @@ void put_line(HMGL gr, void *fp, bool gz, long i, float wp, mglColor cp,int st,
                                if(p1.x==x0 && p1.y==y0)
                                {
                                        k=j;    q.type = -1;    x0 = p2.x;      y0=p2.y;
-                                       mgl_printf(fp, gz, nfmt,x0,neg?_Gr_->GetHeight()-y0:y0);
+                                       mgl_printf(fp, gz, nfmt,fc*x0,(neg?_Gr_->GetHeight()-y0:y0)*fc);
                                        if(m>10)        {       m=0;    mgl_printf(fp, gz, "\n");       }
                                        ok=true;        m++;
                                }
                                else if(p2.x==x0 && p2.y==y0)
                                {
                                        k=j;    q.type = -1;    x0 = p1.x;      y0=p1.y;
-                                       mgl_printf(fp, gz, nfmt,x0,neg?_Gr_->GetHeight()-y0:y0);
+                                       (fp, gz, nfmt,fc*x0,(neg?_Gr_->GetHeight()-y0:y0)*fc);
                                        if(m>10)        {       m=0;    mgl_printf(fp, gz, "\n");       }
                                        ok=true;        m++;
                                }
@@ -191,7 +191,7 @@ void mgl_write_eps(HMGL gr, const char *fname,const char *descr)
        void *fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt");
        if(!fp)         {       gr->SetWarn(mglWarnOpen,fname); return; }
        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, "%%%%Creator: MathGL library\n%%%%Title: %s\n",descr ? descr : fname);
+       mgl_printf(fp, gz, "%%%%Created by MathGL library\n%%%%Title: %s\n",descr ? descr : fname);
        mgl_printf(fp, gz, "%%%%CreationDate: %s\n",ctime(&now));
        mgl_printf(fp, gz, "/lw {setlinewidth} def\n/rgb {setrgbcolor} def\n");
        mgl_printf(fp, gz, "/np {newpath} def\n/cp {closepath} def\n");
@@ -322,7 +322,7 @@ void mgl_write_eps(HMGL gr, const char *fname,const char *descr)
                {
                        sprintf(str,"%.2g lw %.2g %.2g %.2g rgb ", q.w>1 ? q.w:1., cp.r,cp.g,cp.b);
                        wp = q.w>1  ? q.w:1;    st = q.n3;
-                       put_line(gr,fp,gz,i,wp,cp,st, "np %g %g mt ", "%g %g ll ", false);
+                       put_line(gr,fp,gz,i,wp,cp,st, "np %g %g mt ", "%g %g ll ", false, 1);
                        const char *sd = mgl_get_dash(q.n3,q.w);
                        if(sd && sd[0]) mgl_printf(fp, gz, "%s [%s] %g sd dr\n",str,sd,q.w*q.s);
                        else                    mgl_printf(fp, gz, "%s d0 dr\n",str);
@@ -373,7 +373,7 @@ void mgl_write_svg(HMGL gr, const char *fname,const char *descr)
        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);
 
-       mgl_printf(fp, gz, "<!--Creator: MathGL library-->\n");
+       mgl_printf(fp, gz, "<!--Created by MathGL library-->\n");
        mgl_printf(fp, gz, "<!--Title: %s-->\n<!--CreationDate: %s-->\n\n",descr?descr:fname,ctime(&now));
 
        // write definition for all glyphs
@@ -468,7 +468,7 @@ void mgl_write_svg(HMGL gr, const char *fname,const char *descr)
                        }
                        if(q.w>1)       mgl_printf(fp, gz, " stroke-width=\"%g\"", q.w);
                        wp = q.w>1  ? q.w:1;    st = q.n3;
-                       put_line(gr,fp,gz,i,wp,cp,st, "><path d=\" M %g %g", " L %g %g", true);
+                       put_line(gr,fp,gz,i,wp,cp,st, "><path d=\" M %g %g", " L %g %g", true, 1);
                        mgl_printf(fp, gz, "\"/> </g>\n");
                }
                else if(q.type==4)
@@ -510,157 +510,235 @@ void mgl_write_svg_(uintptr_t *gr, const char *fname,const char *descr,int l,int
 /// Color names easely parsed by LaTeX
 struct mglSVGName      {       const char *name;       float r,g,b;    };
 mglSVGName mgl_names[]={{"AliceBlue",.94,.972,1},
-{"AntiqueWhite",.98,.92,.844},
-{"Aqua",0,1,1},
-{"Aquamarine",.498,1,.83},
-{"Azure",.94,1,1},
-{"Beige",.96,.96,.864},
-{"Bisque",1,.894,.77},
-{"Black",0,0,0},
-{"BlanchedAlmond",1,.92,.804},
-{"Blue",0,0,1},
-{"BlueViolet",.54,.17,.888},
-{"Brown,.648",.165,.165},
-{"BurlyWood",.87,.72,.53},
-{"CadetBlue",.372,.62,.628},
-{"Chartreuse",.498,1,0},
-{"Chocolate",.824,.41,.116},
-{"Coral",1,.498,.312},
-{"CornflowerBlue",.392,.585,.93},
-{"Cornsilk",1,.972,.864},
-{"Crimson",.864,.08,.235},
-{"Cyan",0,1,1},
-{"DarkBlue",0,0,.545},
-{"DarkCyan",0,.545,.545},
-{"DarkGoldenrod",.72,.525,.044},
-{"DarkGray",.664,.664,.664},
-{"DarkGreen",0,.392,0},
-{"DarkGrey",.664,.664,.664},
-{"DarkKhaki",.74,.716,.42},
-{"DarkMagenta",.545,0,.545},
-{"DarkOliveGreen",.332,.42,.185},
-{"DarkOrange",1,.55,0},
-{"DarkOrchid",.6,.196,.8},
-{"DarkRed",.545,0,0},
-{"DarkSalmon",.912,.59,.48},
-{"DarkSeaGreen",.56,.736,.56},
-{"DarkSlateBlue",.284,.24,.545},
-{"DarkSlateGray",.185,.31,.31},
-{"DarkSlateGrey",.185,.31,.31},
-{"DarkTurquoise",0,.808,.82},
-{"DarkViolet",.58,0,.828},
-{"DeepPink",1,.08,.576},
-{"DeepSkyBlue",0,.75,1},
-{"DimGray",.41,.41,.41},
-{"DimGrey",.41,.41,.41},
-{"DodgerBlue",.116,.565,1},
-{"FireBrick",.698,.132,.132},
-{"FloralWhite",1,.98,.94},
-{"ForestGreen",.132,.545,.132},
-{"Fuchsia",1,0,1},
-{"Gainsboro",.864,.864,.864},
-{"GhostWhite",.972,.972,1},
-{"Gold",1,.844,0},
-{"Goldenrod",.855,.648,.125},
-{"Gray",.5,.5,.5},
-{"Green",0,.5,0},
-{"GreenYellow",.68,1,.185},
-{"Grey",.5,.5,.5},
-{"Honeydew",.94,1,.94},
-{"HotPink",1,.41,.705},
-{"IndianRed",.804,.36,.36},
-{"Indigo",.294,0,.51},
-{"Ivory",1,1,.94},
-{"Khaki",.94,.9,.55},
-{"Lavender",.9,.9,.98},
-{"LavenderBlush",1,.94,.96},
-{"LawnGreen",.488,.99,0},
-{"LemonChiffon",1,.98,.804},
-{"LightBlue",.68,.848,.9},
-{"LightCoral",.94,.5,.5},
-{"LightCyan",.88,1,1},
-{"LightGoldenrod",.933,.867,.51},
-{"LightGoldenrodYellow",.98,.98,.824},
-{"LightGray",.828,.828,.828},
-{"LightGreen",.565,.932,.565},
-{"LightGrey",.828,.828,.828},
-{"LightPink",1,.712,.756},
-{"LightSalmon",1,.628,.48},
-{"LightSeaGreen",.125,.698,.668},
-{"LightSkyBlue",.53,.808,.98},
-{"LightSlateBlue",.518,.44,1},
-{"LightSlateGray",.468,.532,.6},
-{"LightSlateGrey",.468,.532,.6},
-{"LightSteelBlue",.69,.77,.87},
-{"LightYellow",1,1,.88},
-{"Lime",0,1,0},
-{"LimeGreen",.196,.804,.196},
-{"Linen",.98,.94,.9},
-{"Magenta",1,0,1},
-{"Maroon",.5,0,0},
-{"MediumAquamarine",.4,.804,.668},
-{"MediumBlue",0,0,.804},
-{"MediumOrchid",.73,.332,.828},
-{"MediumPurple",.576,.44,.86},
-{"MediumSeaGreen",.235,.7,.444},
-{"MediumSlateBlue",.484,.408,.932},
-{"MediumSpringGreen",0,.98,.604},
-{"MediumTurquoise",.284,.82,.8},
-{"MediumVioletRed",.78,.084,.52},
-{"MidnightBlue",.098,.098,.44},
-{"MintCream",.96,1,.98},
-{"MistyRose",1,.894,.884},
-{"Moccasin",1,.894,.71},
-{"NavajoWhite",1,.87,.68},
-{"Navy",0,0,.5},
-{"NavyBlue",0,0,.5},
-{"OldLace",.992,.96,.9},
-{"Olive",.5,.5,0},
-{"OliveDrab",.42,.556,.136},
-{"Orange",1,.648,0},
-{"OrangeRed",1,.27,0},
-{"Orchid",.855,.44,.84},
-{"PaleGoldenrod",.932,.91,.668},
-{"PaleGreen",.596,.985,.596},
-{"PaleTurquoise",.688,.932,.932},
-{"PaleVioletRed",.86,.44,.576},
-{"PapayaWhip",1,.936,.835},
-{"PeachPuff",1,.855,.725},
-{"Peru",.804,.52,.248},
-{"Pink",1,.752,.796},
-{"Plum",.868,.628,.868},
-{"PowderBlue",.69,.88,.9},
-{"Purple",.5,0,.5},
-{"Red",1,0,0},
-{"RosyBrown",.736,.56,.56},
-{"RoyalBlue",.255,.41,.884},
-{"SaddleBrown",.545,.27,.075},
-{"Salmon",.98,.5,.448},
-{"SandyBrown",.956,.644,.376},
-{"SeaGreen",.18,.545,.34},
-{"Seashell",1,.96,.932},
-{"Sienna",.628,.32,.176},
-{"Silver",.752,.752,.752},
-{"SkyBlue",.53,.808,.92},
-{"SlateBlue",.415,.352,.804},
-{"SlateGray",.44,.5,.565},
-{"SlateGrey",.44,.5,.565},
-{"Snow",1,.98,.98},
-{"SpringGreen",0,1,.498},
-{"SteelBlue",.275,.51,.705},
-{"Tan",.824,.705,.55},
-{"Teal",0,.5,.5},
-{"Thistle",.848,.75,.848},
-{"Tomato",1,.39,.28},
-{"Turquoise",.25,.88,.815},
-{"Violet",.932,.51,.932},
-{"VioletRed",.816,.125,.565},
-{"Wheat",.96,.87,.7},
-{"White",1,1,1},
-{"WhiteSmoke",.96,.96,.96},
-{"Yellow",1,1,0},
-{"YellowGreen",.604,.804,.196},
+{"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}};
+/*mglSVGName mgl_names[]={{"AliceBlue",.94,.972,1},
+ * {"AntiqueWhite",.98,.92,.844},
+ * {"Aqua",0,1,1},
+ * {"Aquamarine",.498,1,.83},
+ * {"Azure",.94,1,1},
+ * {"Beige",.96,.96,.864},
+ * {"Bisque",1,.894,.77},
+ * {"Black",0,0,0},
+ * {"BlanchedAlmond",1,.92,.804},
+ * {"Blue",0,0,1},
+ * {"BlueViolet",.54,.17,.888},
+ * {"Brown,.648",.165,.165},
+ * {"BurlyWood",.87,.72,.53},
+ * {"CadetBlue",.372,.62,.628},
+ * {"Chartreuse",.498,1,0},
+ * {"Chocolate",.824,.41,.116},
+ * {"Coral",1,.498,.312},
+ * {"CornflowerBlue",.392,.585,.93},
+ * {"Cornsilk",1,.972,.864},
+ * {"Crimson",.864,.08,.235},
+ * {"Cyan",0,1,1},
+ * {"DarkBlue",0,0,.545},
+ * {"DarkCyan",0,.545,.545},
+ * {"DarkGoldenrod",.72,.525,.044},
+ * {"DarkGray",.664,.664,.664},
+ * {"DarkGreen",0,.392,0},
+ * {"DarkGrey",.664,.664,.664},
+ * {"DarkKhaki",.74,.716,.42},
+ * {"DarkMagenta",.545,0,.545},
+ * {"DarkOliveGreen",.332,.42,.185},
+ * {"DarkOrange",1,.55,0},
+ * {"DarkOrchid",.6,.196,.8},
+ * {"DarkRed",.545,0,0},
+ * {"DarkSalmon",.912,.59,.48},
+ * {"DarkSeaGreen",.56,.736,.56},
+ * {"DarkSlateBlue",.284,.24,.545},
+ * {"DarkSlateGray",.185,.31,.31},
+ * {"DarkSlateGrey",.185,.31,.31},
+ * {"DarkTurquoise",0,.808,.82},
+ * {"DarkViolet",.58,0,.828},
+ * {"DeepPink",1,.08,.576},
+ * {"DeepSkyBlue",0,.75,1},
+ * {"DimGray",.41,.41,.41},
+ * {"DimGrey",.41,.41,.41},
+ * {"DodgerBlue",.116,.565,1},
+ * {"FireBrick",.698,.132,.132},
+ * {"FloralWhite",1,.98,.94},
+ * {"ForestGreen",.132,.545,.132},
+ * {"Fuchsia",1,0,1},
+ * {"Gainsboro",.864,.864,.864},
+ * {"GhostWhite",.972,.972,1},
+ * {"Gold",1,.844,0},
+ * {"Goldenrod",.855,.648,.125},
+ * {"Gray",.5,.5,.5},
+ * {"Green",0,.5,0},
+ * {"GreenYellow",.68,1,.185},
+ * {"Grey",.5,.5,.5},
+ * {"Honeydew",.94,1,.94},
+ * {"HotPink",1,.41,.705},
+ * {"IndianRed",.804,.36,.36},
+ * {"Indigo",.294,0,.51},
+ * {"Ivory",1,1,.94},
+ * {"Khaki",.94,.9,.55},
+ * {"Lavender",.9,.9,.98},
+ * {"LavenderBlush",1,.94,.96},
+ * {"LawnGreen",.488,.99,0},
+ * {"LemonChiffon",1,.98,.804},
+ * {"LightBlue",.68,.848,.9},
+ * {"LightCoral",.94,.5,.5},
+ * {"LightCyan",.88,1,1},
+ * {"LightGoldenrod",.933,.867,.51},
+ * {"LightGoldenrodYellow",.98,.98,.824},
+ * {"LightGray",.828,.828,.828},
+ * {"LightGreen",.565,.932,.565},
+ * {"LightGrey",.828,.828,.828},
+ * {"LightPink",1,.712,.756},
+ * {"LightSalmon",1,.628,.48},
+ * {"LightSeaGreen",.125,.698,.668},
+ * {"LightSkyBlue",.53,.808,.98},
+ * {"LightSlateBlue",.518,.44,1},
+ * {"LightSlateGray",.468,.532,.6},
+ * {"LightSlateGrey",.468,.532,.6},
+ * {"LightSteelBlue",.69,.77,.87},
+ * {"LightYellow",1,1,.88},
+ * {"Lime",0,1,0},
+ * {"LimeGreen",.196,.804,.196},
+ * {"Linen",.98,.94,.9},
+ * {"Magenta",1,0,1},
+ * {"Maroon",.5,0,0},
+ * {"MediumAquamarine",.4,.804,.668},
+ * {"MediumBlue",0,0,.804},
+ * {"MediumOrchid",.73,.332,.828},
+ * {"MediumPurple",.576,.44,.86},
+ * {"MediumSeaGreen",.235,.7,.444},
+ * {"MediumSlateBlue",.484,.408,.932},
+ * {"MediumSpringGreen",0,.98,.604},
+ * {"MediumTurquoise",.284,.82,.8},
+ * {"MediumVioletRed",.78,.084,.52},
+ * {"MidnightBlue",.098,.098,.44},
+ * {"MintCream",.96,1,.98},
+ * {"MistyRose",1,.894,.884},
+ * {"Moccasin",1,.894,.71},
+ * {"NavajoWhite",1,.87,.68},
+ * {"Navy",0,0,.5},
+ * {"NavyBlue",0,0,.5},
+ * {"OldLace",.992,.96,.9},
+ * {"Olive",.5,.5,0},
+ * {"OliveDrab",.42,.556,.136},
+ * {"Orange",1,.648,0},
+ * {"OrangeRed",1,.27,0},
+ * {"Orchid",.855,.44,.84},
+ * {"PaleGoldenrod",.932,.91,.668},
+ * {"PaleGreen",.596,.985,.596},
+ * {"PaleTurquoise",.688,.932,.932},
+ * {"PaleVioletRed",.86,.44,.576},
+ * {"PapayaWhip",1,.936,.835},
+ * {"PeachPuff",1,.855,.725},
+ * {"Peru",.804,.52,.248},
+ * {"Pink",1,.752,.796},
+ * {"Plum",.868,.628,.868},
+ * {"PowderBlue",.69,.88,.9},
+ * {"Purple",.5,0,.5},
+ * {"Red",1,0,0},
+ * {"RosyBrown",.736,.56,.56},
+ * {"RoyalBlue",.255,.41,.884},
+ * {"SaddleBrown",.545,.27,.075},
+ * {"Salmon",.98,.5,.448},
+ * {"SandyBrown",.956,.644,.376},
+ * {"SeaGreen",.18,.545,.34},
+ * {"Seashell",1,.96,.932},
+ * {"Sienna",.628,.32,.176},
+ * {"Silver",.752,.752,.752},
+ * {"SkyBlue",.53,.808,.92},
+ * {"SlateBlue",.415,.352,.804},
+ * {"SlateGray",.44,.5,.565},
+ * {"SlateGrey",.44,.5,.565},
+ * {"Snow",1,.98,.98},
+ * {"SpringGreen",0,1,.498},
+ * {"SteelBlue",.275,.51,.705},
+ * {"Tan",.824,.705,.55},
+ * {"Teal",0,.5,.5},
+ * {"Thistle",.848,.75,.848},
+ * {"Tomato",1,.39,.28},
+ * {"Turquoise",.25,.88,.815},
+ * {"Violet",.932,.51,.932},
+ * {"VioletRed",.816,.125,.565},
+ * {"Wheat",.96,.87,.7},
+ * {"White",1,1,1},
+ * {"WhiteSmoke",.96,.96,.96},
+ * {"Yellow",1,1,0},
+ * {"YellowGreen",.604,.804,.196},
+ * {"",-1,-1,-1}};*/
 //-----------------------------------------------------------------------------
 const char *mglColorName(mglColor c)   // return closest SVG color
 {
@@ -679,18 +757,23 @@ void mgl_write_tex(HMGL gr, const char *fname,const char *descr)
 {
        if(gr->GetPrmNum()<1)   return;
        _Gr_->Finish();
-       FILE *fp = fopen(fname,"wt");
+       FILE *fp=fopen("mglcolors.tex","wt");
+       register int ii,jj,kk;  // save colors which can be required at output
+       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);
+       fclose(fp);
+       fp = fopen(fname,"wt");
        if(!fp)         {       gr->SetWarn(mglWarnOpen,fname); return; }
-       fprintf(fp, "%% Creator: MathGL library\n%% Title: %s\n\\begin{tikzpicture}\n",descr?descr:fname);
-       fprintf(fp, "\\providecommand{mgl1}{%g}\n",0.4*gr->mark_size());
-       fprintf(fp, "\\providecommand{mgl2}{%g}\n",0.2*gr->mark_size());
+       fprintf(fp, "%% Created by MathGL library\n%% Title: %s\n",descr?descr:fname);
+       fprintf(fp, "\\input{mglcolors.tex}\n\\begin{tikzpicture}\n");
+       float ms=0.4*gr->mark_size()/100;
 
        // write primitives
        float wp=-1;
        register unsigned long i;
        int st=0;
        mglColor cp;
-       const char *cname;
+       char cname[16];
 
        // add mark definition if present
        bool m_p=false,m_x=false,m_d=false,m_v=false,m_t=false,
@@ -714,34 +797,40 @@ void mgl_write_tex(HMGL gr, const char *fname,const char *descr)
        }
        if(m_P) {       m_p=true;       m_s=true;       }
        if(m_X) {       m_x=true;       m_s=true;       }
-       if(m_p) fprintf(fp, "\\providecommand{mglp}[3]{\\draw[#3] (#1-\\mgl1, #2) -- (#1+\\mgl1,#2) (#1,#2-\\mgl1) -- (#1,#2+\\mgl1);}\n");
-       if(m_x) fprintf(fp, "\\providecommand{mglx}[3]{\\draw[#3] (#1-\\mgl1, #2-\\mgl1) -- (#1+\\mgl1,#2+\\mgl1) (#1+\\mgl1,#2-\\mgl1) -- (#1-\\mgl1,#2+\\mgl1);}\n");
-       if(m_s) fprintf(fp, "\\providecommand{mgls}[3]{\\draw[#3] (#1-\\mgl1, #2-\\mgl1) -- (#1+\\mgl1,#2-\\mgl1) -- (#1+\\mgl1,#2+\\mgl1) -- (#1-\\mgl1,#2+\\mgl1) -- cycle;}\n");
-       if(m_S) fprintf(fp, "\\providecommand{mglS}[3]{\\fill[#3] (#1-\\mgl1, #2-\\mgl1) -- (#1+\\mgl1,#2-\\mgl1) -- (#1+\\mgl1,#2+\\mgl1) -- (#1-\\mgl1,#2+\\mgl1) -- cycle;}\n");
-       if(m_d) fprintf(fp, "\\providecommand{mgld}[3]{\\draw[#3] (#1, #2-\\mgl1) -- (#1+\\mgl1,#2) -- (#1,#2+\\mgl1) -- (#1-\\mgl1,#2) -- cycle;}\n");
-       if(m_D) fprintf(fp, "\\providecommand{mglD}[3]{\\fill[#3] (#1, #2-\\mgl1) -- (#1+\\mgl1,#2) -- (#1,#2+\\mgl1) -- (#1-\\mgl1,#2) -- cycle;}\n");
-       if(m_v) fprintf(fp, "\\providecommand{mglv}[3]{\\draw[#3] (#1-\\mgl1, #2+\\mgl2) -- (#1+\\mgl1,#2+\\mgl2) -- (#1,#2-\\mgl1) -- cycle;}\n");
-       if(m_V) fprintf(fp, "\\providecommand{mglV}[3]{\\fill[#3] (#1-\\mgl1, #2+\\mgl2) -- (#1+\\mgl1,#2+\\mgl2) -- (#1,#2-\\mgl1) -- cycle;}\n");
-       if(m_t) fprintf(fp, "\\providecommand{mglt}[3]{\\draw[#3] (#1-\\mgl1, #2-\\mgl2) -- (#1+\\mgl1,#2-\\mgl2) -- (#1,#2+\\mgl1) -- cycle;}\n");
-       if(m_T) fprintf(fp, "\\providecommand{mglT}[3]{\\fill[#3] (#1-\\mgl1, #2-\\mgl2) -- (#1+\\mgl1,#2-\\mgl2) -- (#1,#2+\\mgl1) -- cycle;}\n");
-       if(m_l) fprintf(fp, "\\providecommand{mgll}[3]{\\draw[#3] (#1+\\mgl2, #2-\\mgl1) -- (#1+\\mgl2,#2+\\mgl1) -- (#1-\\mgl1,#2) -- cycle;}\n");
-       if(m_L) fprintf(fp, "\\providecommand{mglL}[3]{\\fill[#3] (#1+\\mgl2, #2-\\mgl1) -- (#1+\\mgl2,#2+\\mgl1) -- (#1-\\mgl1,#2) -- cycle;}\n");
-       if(m_r) fprintf(fp, "\\providecommand{mglr}[3]{\\draw[#3] (#1-\\mgl2, #2-\\mgl1) -- (#1-\\mgl2,#2+\\mgl1) -- (#1+\\mgl1,#2) -- cycle;}\n");
-       if(m_R) fprintf(fp, "\\providecommand{mglR}[3]{\\fill[#3] (#1-\\mgl2, #2-\\mgl1) -- (#1-\\mgl2,#2+\\mgl1) -- (#1+\\mgl1,#2) -- cycle;}\n");
-       if(m_Y) fprintf(fp, "\\providecommand{mglR}[3]{\\draw[#3] (#1, #2-\\mgl1) -- (#1,#2) -- (#1-\\mgl1,#2+\\mgl1) (#1,#2) -- (#1+\\mgl1,#2+\\mgl1);}\n");
-       if(m_a) fprintf(fp, "\\providecommand{mgla}[3]{\\draw[#3] (#1-\\mgl1, #2) -- (#1+\\mgl1,#2) (#1-0.6*\\mgl1,#2-0.8*\\mgl1) -- (#1+0.6*\\mgl1,#2+0.8*\\mgl1) (#1-0.6*\\mgl1,#2+0.8*\\mgl1) -- (#1+0.6*\\mgl1,#2-0.8*\\mgl1);}\n");
-       if(m_o) fprintf(fp, "\\providecommand{mglo}[3]{\\draw[#3] (#1, #2) circle (\\mgl1);}\n");
-       if(m_O) fprintf(fp, "\\providecommand{mglO}[3]{\\fill[#3] (#1, #2) circle (\\mgl1);}\n");
+       if(m_p) fprintf(fp, "\\providecommand{\\mglp}[3]{\\draw[#3] (#1-%g, #2) -- (#1+%g,#2) (#1,#2-%g) -- (#1,#2+%g);}\n",ms,ms,ms,ms);
+       if(m_x) fprintf(fp, "\\providecommand{\\mglx}[3]{\\draw[#3] (#1-%g, #2-%g) -- (#1+%g,#2+%g) (#1+%g,#2-%g) -- (#1-%g,#2+%g);}\n", ms,ms,ms,ms, ms,ms,ms,ms);
+       if(m_s) fprintf(fp, "\\providecommand{\\mgls}[3]{\\draw[#3] (#1-%g, #2-%g) -- (#1+%g,#2-%g) -- (#1+%g,#2+%g) -- (#1-%g,#2+%g) -- cycle;}\n", ms,ms,ms,ms, ms,ms,ms,ms);
+       if(m_S) fprintf(fp, "\\providecommand{\\mglS}[3]{\\fill[#3] (#1-%g, #2-%g) -- (#1+%g,#2-%g) -- (#1+%g,#2+%g) -- (#1-%g,#2+%g) -- cycle;}\n", ms,ms,ms,ms, ms,ms,ms,ms);
+       if(m_d) fprintf(fp, "\\providecommand{\\mgld}[3]{\\draw[#3] (#1, #2-%g) -- (#1+%g,#2) -- (#1,#2+%g) -- (#1-%g,#2) -- cycle;}\n", ms,ms,ms,ms);
+       if(m_D) fprintf(fp, "\\providecommand{\\mglD}[3]{\\fill[#3] (#1, #2-%g) -- (#1+%g,#2) -- (#1,#2+%g) -- (#1-%g,#2) -- cycle;}\n", ms,ms,ms,ms);
+       if(m_v) fprintf(fp, "\\providecommand{\\mglv}[3]{\\draw[#3] (#1-%g, #2+%g) -- (#1+%g,#2+%g) -- (#1,#2-%g) -- cycle;}\n", ms,ms/2,ms,ms/2, ms);
+       if(m_V) fprintf(fp, "\\providecommand{\\mglV}[3]{\\fill[#3] (#1-%g, #2+%g) -- (#1+%g,#2+%g) -- (#1,#2-%g) -- cycle;}\n", ms,ms/2,ms,ms/2, ms);
+       if(m_t) fprintf(fp, "\\providecommand{\\mglt}[3]{\\draw[#3] (#1-%g, #2-%g) -- (#1+%g,#2-%g) -- (#1,#2+%g) -- cycle;}\n", ms,ms/2,ms,ms/2, ms);
+       if(m_T) fprintf(fp, "\\providecommand{\\mglT}[3]{\\fill[#3] (#1-%g, #2-%g) -- (#1+%g,#2-%g) -- (#1,#2+%g) -- cycle;}\n", ms,ms/2,ms,ms/2, ms);
+       if(m_l) fprintf(fp, "\\providecommand{\\mgll}[3]{\\draw[#3] (#1+%g, #2-%g) -- (#1+%g,#2+%g) -- (#1-%g,#2) -- cycle;}\n", ms/2,ms,ms/2,ms, ms);
+       if(m_L) fprintf(fp, "\\providecommand{\\mglL}[3]{\\fill[#3] (#1+%g, #2-%g) -- (#1+%g,#2+%g) -- (#1-%g,#2) -- cycle;}\n", ms/2,ms,ms/2,ms, ms);
+       if(m_r) fprintf(fp, "\\providecommand{\\mglr}[3]{\\draw[#3] (#1-%g, #2-%g) -- (#1-%g,#2+%g) -- (#1+%g,#2) -- cycle;}\n", ms/2,ms,ms/2,ms, ms);
+       if(m_R) fprintf(fp, "\\providecommand{\\mglR}[3]{\\fill[#3] (#1-%g, #2-%g) -- (#1-%g,#2+%g) -- (#1+%g,#2) -- cycle;}\n", ms/2,ms,ms/2,ms, ms);
+       if(m_Y) fprintf(fp, "\\providecommand{\\mglR}[3]{\\draw[#3] (#1, #2-%g) -- (#1,#2) -- (#1-%g,#2+%g) (#1,#2) -- (#1+%g,#2+%g);}\n", ms,ms,ms,ms, ms);
+       if(m_a) fprintf(fp, "\\providecommand{\\mgla}[3]{\\draw[#3] (#1-%g, #2) -- (#1+%g,#2) (#1-0.6*%g,#2-0.8*%g) -- (#1+0.6*%g,#2+0.8*%g) (#1-0.6*%g,#2+0.8*%g) -- (#1+0.6*%g,#2-0.8*%g);}\n", ms,ms,ms,ms, ms,ms,ms,ms, ms,ms);
+       if(m_o) fprintf(fp, "\\providecommand{\\mglo}[3]{\\draw[#3] (#1, #2) circle (%g);}\n", ms);
+       if(m_O) fprintf(fp, "\\providecommand{\\mglO}[3]{\\fill[#3] (#1, #2) circle (%g);}\n", ms);
        // dots command is provided in any case
-       fprintf(fp, "\\providecommand{mglc}[3]{\\draw[#3] (#1, #2) circle (0.1*\\mgl1);}\n\n");
+       fprintf(fp, "\\providecommand{\\mglc}[3]{\\draw[#3] (#1, #2) circle (%g);}\n\n", 0.1*ms);
 
        for(i=0;i<gr->GetPrmNum();i++)
        {
                const mglPrim &q = gr->GetPrm(i);
                if(q.type<0)    continue;       // q.n1>=0 always
-               cp = _Gr_->GetColor(q); cname = mglColorName(cp);
+               cp = _Gr_->GetColor(q);
+
+               ii = (cp.r*255+25)/51;
+               jj = (cp.g*255+25)/51;
+               kk = (cp.b*255+25)/51;
+               sprintf(cname,"mgl_%d",ii+6*(jj+6*kk));
+//             cname = mglColorName(cp);
                const mglPnt p1=gr->GetPnt(q.n1);
-               float x=p1.x,y=p1.y,s=0.4*gr->FontFactor()*q.s;
+               float x=p1.x/100,y=p1.y/100,s=0.4*gr->FontFactor()*q.s/100;
                if(q.type==0)
                {
                        if(!strchr("xsSoO",q.n4))       s *= 1.1;
@@ -778,12 +867,12 @@ void mgl_write_tex(HMGL gr, const char *fname,const char *descr)
                else if(q.type==2 && cp.a>0)
                {
                        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.a, x,y, p2.x,p2.y, p3.x,p3.y);
+                       fprintf(fp, "\\fill[%s, fill opacity=%g] (%g,%g) -- (%g,%g) -- (%g,%g) -- cycle;\n", cname,cp.a, x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100);
                }
                else if(q.type==3 && cp.a>0)
                {
                        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.a, x,y, p2.x,p2.y, p3.x,p3.y, p4.x,p4.y);
+                       fprintf(fp, "\\fill[%s, fill opacity=%g] (%g,%g) -- (%g,%g) -- (%g,%g) -- (%g,%g) -- cycle;\n", cname,cp.a, 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
                {
@@ -794,7 +883,7 @@ void 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,st, "(%g,%g)", " -- (%g,%g)", false);
+                       put_line(gr,fp,false,i,wp,cp,st, "(%g,%g)", " -- (%g,%g)", false, 0.01);
                        fprintf(fp, ";\n");
                }
                else if(q.type==6)      // text
@@ -806,10 +895,10 @@ void mgl_write_tex(HMGL gr, const char *fname,const char *descr)
                        if((a&3)==2)    ss.append(",west");     if((a&3)==0)    ss.append(",east");
                        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)
-                               fprintf(fp,"\\draw[%s] (%g,%g) node[rotate=%.2g] $%ls$;\n", ss.c_str(),x,y, ftet, t.text.c_str());
+                       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,y, ftet, t.text.c_str());
                        else
-                               fprintf(fp,"\\draw[%s] (%g,%g) node[rotate=%.2g] %ls;\n", ss.c_str(),x,y, ftet, t.text.c_str());
+                               fprintf(fp,"\\draw[%s] (%g,%g) node[rotate=%.2g]{%ls};\n", ss.c_str(),x,y, ftet, t.text.c_str());
                }
        }
        fprintf(fp, "\\end{tikzpicture}\n");
index e81317f3632683c79593011485aa23b22d46e248..f9268146a322722270736d22e942b2381e0ee9cd 100644 (file)
@@ -26,7 +26,7 @@
 #define _GR_   ((mglCanvas *)(*gr))\r
 #define _Gr_   ((mglCanvas *)(gr))\r
 int mgl_tga_save(const char *fname, int w, int h, unsigned char **p);\r
-int mgl_png_save(const char *fname, int w, int h, unsigned char **p);\r
+int mgl_pnga_save(const char *fname, int w, int h, unsigned char **p);\r
 void mgl_printf(void *fp, bool gz, const char *str, ...);\r
 //-----------------------------------------------------------------------------\r
 void mglTexture::GetRGBA(unsigned char *f)\r
@@ -40,9 +40,9 @@ void mglTexture::GetRGBA(unsigned char *f)
                {\r
                        i0 = 4*(j+256*i);\r
                        c = c1 + (c2-c1)*(j/255.);\r
-                       f[i0]   = int(255*c.b);\r
+                       f[i0]   = int(255*c.r);\r
                        f[i0+1] = int(255*c.g);\r
-                       f[i0+2] = int(255*c.r);\r
+                       f[i0+2] = int(255*c.b);\r
                        f[i0+3] = int(255*c.a);\r
                }\r
        }\r
@@ -51,7 +51,8 @@ void mglTexture::GetRGBA(unsigned char *f)
 void mgl_obj_prim(const mglPrim &q, const mglPnt &p, FILE *fp, float size)\r
 {\r
        char type = q.n4;       float ss=size*0.35;\r
-       register long i=q.n1,j;\r
+       register long i=q.n1+1,j;\r
+       register long n1=q.n1+1,n2=q.n2+1,n3=q.n3+1,n4=q.n4+1;\r
        switch(q.type)\r
        {\r
                case 0:\r
@@ -60,26 +61,26 @@ void mgl_obj_prim(const mglPrim &q, const mglPnt &p, FILE *fp, float size)
                        else    switch(type)\r
                        {\r
                        case 'P':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z);\r
                                fprintf(fp,"l -4/%ld -3/%ld\n", i,i);\r
                                fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                                fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                                fprintf(fp,"l -1/%ld -4/%ld\n", i,i);\r
                        case '+':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y+ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
                                fprintf(fp,"l -4/%ld -3/%ld\n", i,i);\r
                                fprintf(fp,"l -2/%ld -1/%ld\n", i,i);   break;\r
                        case 'X':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z);\r
                                fprintf(fp,"l -4/%ld -3/%ld\n", i,i);\r
                                fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                                fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
@@ -87,127 +88,129 @@ void mgl_obj_prim(const mglPrim &q, const mglPnt &p, FILE *fp, float size)
                                fprintf(fp,"l -1/%ld -3/%ld\n", i,i);\r
                                fprintf(fp,"l -2/%ld -4/%ld\n", i,i);   break;\r
                        case 'x':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z);\r
                                fprintf(fp,"l -1/%ld -3/%ld\n", i,i);\r
                                fprintf(fp,"l -2/%ld -4/%ld\n", i,i);   break;\r
                        case 'S':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z);\r
                                fprintf(fp,"f -4/%ld -3/%ld -2/%ld -1/%ld\n",i,i,i,i);  break;\r
                        case 's':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z);\r
                                fprintf(fp,"l -4/%ld -3/%ld\n", i,i);\r
                                fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                                fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                                fprintf(fp,"l -1/%ld -4/%ld\n", i,i);   break;\r
                        case 'D':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y+ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
                                fprintf(fp,"f -4/%ld -3/%ld -2/%ld -1/%ld\n",i,i,i,i);  break;\r
                        case 'd':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y+ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
                                fprintf(fp,"l -4/%ld -3/%ld\n", i,i);\r
                                fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                                fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                                fprintf(fp,"l -1/%ld -4/%ld\n", i,i);   break;\r
                        case 'Y':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+0.8*ss,p.y+0.6*ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-0.8*ss,p.y+0.6*ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+0.8*ss,p.y+0.6*ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-0.8*ss,p.y+0.6*ss,p.z);\r
                                fprintf(fp,"l -3/%ld %ld/%ld\n", i,i,i);\r
                                fprintf(fp,"l -2/%ld %ld/%ld\n", i,i,i);\r
                                fprintf(fp,"l -1/%ld %ld/%ld\n", i,i,i);        break;\r
                        case '*':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
                                fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+0.6*ss,p.y+0.8*ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-0.6*ss,p.y-0.8*ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+0.6*ss,p.y+0.8*ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-0.6*ss,p.y-0.8*ss,p.z);\r
                                fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+0.6*ss,p.y-0.8*ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-0.6*ss,p.y+0.8*ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+0.6*ss,p.y-0.8*ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-0.6*ss,p.y+0.8*ss,p.z);\r
                                fprintf(fp,"l -2/%ld -1/%ld\n", i,i);           break;\r
                        case 'T':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss/2,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss/2,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss/2,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss/2,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
                                fprintf(fp,"f -3/%ld -2/%ld -1/%ld\n", i,i,i);  break;\r
                        case '^':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss/2,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss/2,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss/2,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss/2,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
                                fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                                fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                                fprintf(fp,"l -1/%ld -3/%ld\n", i,i);   break;\r
                        case 'V':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss/2,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss/2,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss/2,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss/2,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z);\r
                                fprintf(fp,"f -3/%ld -2/%ld -1/%ld\n", i,i,i);  break;\r
                        case 'v':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss/2,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss/2,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss/2,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss/2,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z);\r
                                fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                                fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                                fprintf(fp,"l -1/%ld -3/%ld\n", i,i);   break;\r
                        case 'L':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss/2,p.y+ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss/2,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss/2,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss/2,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
                                fprintf(fp,"f -3/%ld -2/%ld -1/%ld\n", i,i,i);  break;\r
                        case '<':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss/2,p.y+ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss/2,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss/2,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss/2,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
                                fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                                fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                                fprintf(fp,"l -1/%ld -3/%ld\n", i,i);   break;\r
                        case 'R':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss/2,p.y+ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss/2,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
                                fprintf(fp,"f -3/%ld -2/%ld -1/%ld\n", i,i,i);  break;\r
                        case '>':\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss/2,p.y+ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss/2,p.y-ss,p.z);\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y+ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y-ss,p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
                                fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                                fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                                fprintf(fp,"l -1/%ld -3/%ld\n", i,i);   break;\r
                        case 'O':\r
                                for(long j=0;j<=20;j++)\r
-                                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z);\r
+                                       fprintf(fp,"v %g %g %g\n",p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z);\r
                                for(long j=0;j<20;j++)\r
                                        fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", j-21,i, j-20,i, i,i);\r
                                break;\r
                        case 'C':       fprintf(fp,"p %ld\n", i);\r
                        case 'o':\r
                                for(long j=0;j<=20;j++)\r
-                                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z);\r
+                                       fprintf(fp,"v %g %g %g\n",p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z);\r
                                for(long j=0;j<20;j++)\r
                                        fprintf(fp,"l %ld/%ld %ld/%ld\n", j-21,i, j-20,i);\r
                                break;\r
                        }\r
                        break;\r
-               case 1: fprintf(fp,"l %ld/%ld %ld/%ld\n", q.n1,q.n1, q.n2,q.n2);        break;\r
+               case 1: fprintf(fp,"l %ld/%ld %ld/%ld\n", n1,n1, n2,n2);        break;\r
                case 2: fprintf(fp,"f %ld/%ld/%ld %ld/%ld/%ld %ld/%ld/%ld\n",\r
-                       q.n1,q.n1,q.n1, q.n2,q.n2,q.n2, q.n3,q.n3,q.n3);        break;\r
-               case 3: fprintf(fp,"f %ld/%ld/%ld %ld/%ld/%ld %ld/%ld/%ld %ld/%ld/%ld\n",\r
-                       q.n1,q.n1,q.n1, q.n2,q.n2,q.n2, q.n3,q.n3,q.n3, q.n4,q.n4,q.n4);        break;\r
+                       n1,n1,n1, n2,n2,n2, n3,n3,n3);  break;\r
+               case 3: fprintf(fp,"f %ld/%ld/%ld %ld/%ld/%ld %ld/%ld/%ld\n",\r
+                       n1,n1,n1, n2,n2,n2, n3,n3,n3);\r
+                       fprintf(fp,"f %ld/%ld/%ld %ld/%ld/%ld %ld/%ld/%ld\n",\r
+                               n2,n2,n2, n3,n3,n3, n4,n4,n4);break;\r
                case 4: break;  // TODO: add glyphs export later\r
        }\r
 }\r
@@ -233,16 +236,17 @@ void mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png)
        char *tname = new char[len+1];  strcpy(tname,fname);\r
        FILE *fp=fopen(fname,"wt");\r
        // vertices definition\r
-       fprintf(fp,"# Creator: MathGL library\n# Title: %s\n",descr ? descr : fname);\r
+       fprintf(fp,"# Created by MathGL library\n# Title: %s\n",descr ? descr : fname);\r
        for(i=0;i<gr->GetPntNum();i++)\r
        {\r
                mglPnt pp = gr->GetPnt(i);\r
-               fprintf(fp,"v %.2g %.2g %.2g\n",pp.x,pp.y,pp.z);\r
-               fprintf(fp,"vt %.2g %.2g\n",256*pp.t,256*pp.c);\r
-               fprintf(fp,"vn %.2g %.2g %.2g\n",pp.u,pp.v,pp.w);\r
+               fprintf(fp,"v %g %g %g\n",pp.x,pp.y,pp.z);\r
+               fprintf(fp,"vt %g %g\n",256*pp.t,256*pp.c);\r
+               if(isnan(pp.u)) fprintf(fp,"vn 0 0 0\n");\r
+               else fprintf(fp,"vn %g %g %g\n",pp.u,pp.v,pp.w);\r
        }\r
        // primitive definition in groups\r
-       tname[len-4]=0; fprintf(fp,"# Primitives Definitions\nusemtl %s\n",tname);\r
+       tname[len-4]=0; fprintf(fp,"# Primitives Definitions\nusemtl %s.mtl\n",tname);\r
        std::vector<long> p;\r
        mglPrim q;\r
        for(i=0;i<gr->Grp.size();i++)\r
@@ -256,13 +260,13 @@ void mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png)
                gr->Grp[i].p.clear();   // we don't need indexes anymore\r
        }\r
        // try to save "ungrouped" primitives\r
-       fprintf(fp,"g ungrouped\n");\r
+/*     fprintf(fp,"g ungrouped\n");    // I think this can be omitted\r
        for(i=0;i<gr->GetPrmNum();i++)\r
        {\r
                const mglPrim q=gr->GetPrm(p[j]);       m = q.id-m1;\r
                if(m<0 || m>=m2-m1+1)\r
                        mgl_obj_prim(q, gr->GetPnt(q.n1), fp, q.s*gr->FontFactor());\r
-       }\r
+       }*/\r
        fclose(fp);\r
        // prepare MTL file\r
        tname[len-4]='.';       tname[len-3]='m';       tname[len-2]='t';       tname[len-1]='l';\r
@@ -280,11 +284,11 @@ void mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png)
        fclose(fp);\r
        // prepare texture file (TGA or PNG)\r
        j=gr->GetTxtNum();\r
-       unsigned char *buf = new unsigned char[256*256*j];\r
+       unsigned char *buf = new unsigned char[4*256*256*j];\r
        unsigned char **pbuf= (unsigned char **)malloc(256*j*sizeof(unsigned char *));\r
-       for(i=0;i<256*j;i++)    pbuf[i] = buf+256*i;\r
-       for(i=0;i<j;i++)        gr->GetTxt(i).GetRGBA(buf+i*256*256);\r
-       if(use_png)     mgl_png_save(tname,256,256*j,pbuf);\r
+       for(i=0;i<256*j;i++)    pbuf[i] = buf+4*256*i;\r
+       for(i=0;i<j;i++)        gr->GetTxt(i).GetRGBA(buf+i*256*256*4);\r
+       if(use_png)     mgl_pnga_save(tname,256,256*j,pbuf);\r
        else            mgl_tga_save(tname,256,256*j,pbuf);\r
        free(pbuf);     delete []buf;   delete []tname;\r
 }\r
@@ -298,36 +302,45 @@ void mgl_write_stl(HMGL gr, const char *fname,const char *descr)
        if(gr->GetPrmNum()<=0)  return; // nothing to do\r
        FILE *fp = fopen(fname,"wt");\r
        fprintf(fp,"solid %s",descr?descr:"mathgl");\r
-       register long i,j;\r
+       register long i;\r
        mglPnt pp;\r
        for(i=0;i<gr->GetPrmNum();i++)\r
        {\r
-               const mglPrim &q=gr->GetPrm(i); j = q.n1;\r
+               const mglPrim &q=gr->GetPrm(i);\r
                if(q.type==2)   //      triangles\r
                {\r
-                       pp = gr->GetPnt(j);\r
+                       pp = gr->GetPnt(q.n1);\r
                        fprintf(fp,"facet normal %.2g %.2g %.2g\nouter loop\n",pp.u,pp.v,pp.w);\r
-                       fprintf(fp,"vertex %.2g %.2g %.2g\n",pp.x,pp.y,pp.z);\r
+                       fprintf(fp,"vertex %g %g %g\n",pp.x,pp.y,pp.z);\r
                        pp = gr->GetPnt(q.n2);\r
-                       fprintf(fp,"vertex %.2g %.2g %.2g\n",pp.x,pp.y,pp.z);\r
+                       fprintf(fp,"vertex %g %g %g\n",pp.x,pp.y,pp.z);\r
                        pp = gr->GetPnt(q.n3);\r
-                       fprintf(fp,"vertex %.2g %.2g %.2g\n",pp.x,pp.y,pp.z);\r
+                       fprintf(fp,"vertex %g %g %g\n",pp.x,pp.y,pp.z);\r
                        fprintf(fp,"endloop\nendfacet\n");\r
                }\r
                if(q.type==3)   //      quadrangles\r
                {\r
-                       pp = gr->GetPnt(j);\r
+                       pp = gr->GetPnt(q.n1);\r
                        fprintf(fp,"facet normal %.2g %.2g %.2g\nouter loop\n",pp.u,pp.v,pp.w);\r
-                       fprintf(fp,"vertex %.2g %.2g %.2g\n",pp.x,pp.y,pp.z);\r
+                       fprintf(fp,"vertex %g %g %g\n",pp.x,pp.y,pp.z);\r
                        pp = gr->GetPnt(q.n2);\r
-                       fprintf(fp,"vertex %.2g %.2g %.2g\n",pp.x,pp.y,pp.z);\r
+                       fprintf(fp,"vertex %g %g %g\n",pp.x,pp.y,pp.z);\r
                        pp = gr->GetPnt(q.n3);\r
-                       fprintf(fp,"vertex %.2g %.2g %.2g\n",pp.x,pp.y,pp.z);\r
+                       fprintf(fp,"vertex %g %g %g\n",pp.x,pp.y,pp.z);\r
+                       fprintf(fp,"endloop\nendfacet\n");\r
+                       pp = gr->GetPnt(q.n1);\r
+                       fprintf(fp,"facet normal %.2g %.2g %.2g\nouter loop\n",pp.u,pp.v,pp.w);\r
                        pp = gr->GetPnt(q.n4);\r
-                       fprintf(fp,"vertex %.2g %.2g %.2g\n",pp.x,pp.y,pp.z);\r
+                       fprintf(fp,"vertex %g %g %g\n",pp.x,pp.y,pp.z);\r
+                       pp = gr->GetPnt(q.n2);\r
+                       fprintf(fp,"vertex %g %g %g\n",pp.x,pp.y,pp.z);\r
+                       pp = gr->GetPnt(q.n3);\r
+                       fprintf(fp,"vertex %g %g %g\n",pp.x,pp.y,pp.z);\r
                        fprintf(fp,"endloop\nendfacet\n");\r
                }\r
        }\r
+       fprintf(fp,"endsolid %s",descr?descr:"mathgl");\r
+       fclose(fp);\r
 }\r
 void mgl_write_stl_(uintptr_t *gr, const char *fname,const char *descr,int l,int n)\r
 {      char *s=new char[l+1];  memcpy(s,fname,l);      s[l]=0;\r
@@ -340,12 +353,12 @@ void mgl_write_xyz(HMGL gr, const char *fname,const char *descr)
 \r
        register long i;\r
        FILE *fp=fopen(fname,"wt"), *ff;        // vertices definition\r
-       fprintf(fp,"# Creator: MathGL library\n# Title: %s\n",descr ? descr : fname);\r
+       fprintf(fp,"# Created by MathGL library\n# Title: %s\n",descr ? descr : fname);\r
        fprintf(fp,"# List of Vertices, with (x,y,z) coordinates.\n");\r
        for(i=0;i<gr->GetPntNum();i++)\r
        {\r
                mglPnt pp = gr->GetPnt(i);\r
-               fprintf(fp,"%.2g %.2g %.2g\n",pp.x,pp.y,pp.z);\r
+               fprintf(fp,"%g %g %g\n",pp.x,pp.y,pp.z);\r
        }\r
        fclose(fp);\r
 \r
@@ -354,16 +367,16 @@ void mgl_write_xyz(HMGL gr, const char *fname,const char *descr)
        char *tname = new char[len+2];  strcpy(tname,fname);    tname[len+1]=tname[len]=0;\r
        tname[len]='l'; fp = fopen(tname,"wt");\r
        tname[len]='f'; ff = fopen(tname,"wt");\r
-       fprintf(fp,"# Creator: MathGL library\n# Title: %s\n",descr ? descr : fname);\r
+       fprintf(fp,"# Created by MathGL library\n# Title: %s\n",descr ? descr : fname);\r
        fprintf(fp,"# Indices of vertices to connect for lines\n");\r
-       fprintf(ff,"# Creator: MathGL library\n# Title: %s\n",descr ? descr : fname);\r
+       fprintf(ff,"# Created by MathGL library\n# Title: %s\n",descr ? descr : fname);\r
        fprintf(ff,"# Indices of vertices to connect for faces\n");\r
        for(i=0;i<gr->GetPrmNum();i++)\r
        {\r
                const mglPrim q=gr->GetPrm(i);\r
                if(q.type==1)   fprintf(fp,"%ld %ld\n",q.n1+1,q.n2+1);\r
                if(q.type==2)   fprintf(ff,"%ld %ld %ld\n",q.n1+1,q.n2+1,q.n3+1);\r
-               if(q.type==3)   fprintf(ff,"%ld %ld %ld %ld\n",q.n1+1,q.n2+1,q.n3+1,q.n4+1);\r
+               if(q.type==3)   fprintf(ff,"%ld %ld %ld\n%ld %ld %ld\n",q.n1+1,q.n2+1,q.n3+1,q.n4+1,q.n2+1,q.n3+1);\r
        }\r
        fclose(fp);     fclose(ff);     delete []tname;\r
 }\r
@@ -372,7 +385,7 @@ void mgl_write_xyz_(uintptr_t *gr, const char *fname,const char *descr,int l,int
        char *d=new char[n+1];  memcpy(d,descr,n);      d[n]=0;\r
        mgl_write_xyz(_GR_,s,d);        delete []s;             delete []d;     }\r
 //-----------------------------------------------------------------------------\r
-void mgl_write_off(HMGL gr, const char *fname,const char *descr)\r
+void mgl_write_off(HMGL gr, const char *fname,const char *descr, int colored)\r
 {\r
        register long i,nf=0;\r
        for(i=0;i<gr->GetPrmNum();i++)  // find number of faces\r
@@ -384,26 +397,50 @@ void mgl_write_off(HMGL gr, const char *fname,const char *descr)
 \r
        FILE *fp=fopen(fname,"wt");\r
        // vertices definition\r
-       fprintf(fp,"cOFF\n# Creator: MathGL library\n# Title: %s\n",descr ? descr : fname);\r
+       if(colored)\r
+               fprintf(fp,"COFF\n# Created by MathGL library\n# Title: %s\n",descr ? descr : fname);\r
+       else\r
+               fprintf(fp,"OFF\n# Created by MathGL library\n# Title: %s\n",descr ? descr : fname);\r
        fprintf(fp,"# List of Vertices, with (x,y,z,r,g,b,a) coordinates.\n");\r
        fprintf(fp,"%ld %ld 0\n",gr->GetPntNum(), nf);\r
        for(i=0;i<gr->GetPntNum();i++)\r
        {\r
                mglPnt pp = gr->GetPnt(i);\r
-               fprintf(fp,"%.2g %.2g %.2g %.2g %.2g %.2g %.2g\n", pp.x, pp.y, pp.z, pp.r, pp.g, pp.b, pp.a);\r
+               if(colored)\r
+                       fprintf(fp,"%g %g %g %g %g %g %g\n", pp.x, pp.y, pp.z, pp.r, pp.g, pp.b, pp.a);\r
+               else    fprintf(fp,"%g %g %g\n", pp.x, pp.y, pp.z);\r
        }\r
        for(i=0;i<gr->GetPrmNum();i++)\r
        {\r
                const mglPrim q=gr->GetPrm(i);\r
-               if(q.type==2)   fprintf(fp,"3 %ld %ld %ld\n",q.n1,q.n2,q.n3);\r
-               if(q.type==3)   fprintf(fp,"4 %ld %ld %ld %ld\n",q.n1,q.n2,q.n3,q.n4);\r
+               mglPnt p1=gr->GetPnt(q.n1), p2, p3, p4;\r
+               if(colored)\r
+               {\r
+                       if(q.type==2)\r
+                               fprintf(fp,"3 %ld %ld %ld\n",q.n1,q.n2,q.n3);\r
+                       if(q.type==3)\r
+                               fprintf(fp,"4 %ld %ld %ld %ld\n",q.n1,q.n2,q.n4,q.n3);\r
+               }\r
+               else\r
+               {\r
+                       if(q.type==2)\r
+                       {\r
+                               p2=gr->GetPnt(q.n2);    p3=gr->GetPnt(q.n3);\r
+                               fprintf(fp,"3 %ld %ld %ld %.2g %.2g %.2g %.2g\n",q.n1,q.n2,q.n3, (p1.r+p2.r+p3.r)/3, (p1.g+p2.g+p3.g)/3, (p1.b+p2.b+p3.b)/3, (p1.a+p2.a+p3.a)/3);\r
+                       }\r
+                       if(q.type==3)\r
+                       {\r
+                               p2=gr->GetPnt(q.n2);    p3=gr->GetPnt(q.n3);    p4=gr->GetPnt(q.n4);\r
+                               fprintf(fp,"4 %ld %ld %ld %ld %.2g %.2g %.2g %.2g\n",q.n1,q.n2,q.n4,q.n3, (p1.r+p2.r+p3.r+p4.r)/4, (p1.g+p2.g+p3.g+p4.g)/4, (p1.b+p2.b+p3.b+p4.b)/4, (p1.a+p2.a+p3.a+p4.a)/4);\r
+                       }\r
+               }\r
        }\r
        fclose(fp);\r
 }\r
-void mgl_write_off_(uintptr_t *gr, const char *fname,const char *descr,int l,int n)\r
+void mgl_write_off_(uintptr_t *gr, const char *fname,const char *descr,int *colored,int l,int n)\r
 {      char *s=new char[l+1];  memcpy(s,fname,l);      s[l]=0;\r
        char *d=new char[n+1];  memcpy(d,descr,n);      d[n]=0;\r
-       mgl_write_off(_GR_,s,d);        delete []s;             delete []d;     }\r
+       mgl_write_off(_GR_,s,d,*colored);       delete []s;             delete []d;     }\r
 //-----------------------------------------------------------------------------\r
 void mgl_write_idtf(HMGL gr, const char *fname,const char *descr)\r
 {      /*_Gr_->WriteIDTF(fname,descr);*/       }       // TODO: Add idtf support later\r
@@ -423,13 +460,13 @@ bool mglCanvas::ExportMGLD(const char *fname, const char *descr)
        for(i=0;i<Pnt.size();i++)\r
        {\r
                const mglPnt &q=Pnt[i];\r
-               fprintf(fp,"%.2g %.2g %.2g %.2g %.2g %.2g %.2g %.2g %.2g %.2g %.2g %.2g\n", q.x, q.y, q.z, q.c, q.t, q.u, q.v, q.w, q.r, q.g, q.b, q.a);\r
+               fprintf(fp,"%g %g %g %g %g %g %g %g %g %g %g %g\n", q.x, q.y, q.z, q.c, q.t, q.u, q.v, q.w, q.r, q.g, q.b, q.a);\r
        }\r
        fprintf(fp,"# Primitives: type n1 n2 n3 n4 id s w p\n");\r
        for(i=0;i<Prm.size();i++)\r
        {\r
                const mglPrim &q=Prm[i];\r
-               fprintf(fp,"%d %ld %ld %ld %ld %d %.2g %.2g %.2g\n", q.type, q.n1, q.n2, q.n3, q.n4, q.id, q.s, q.w, q.p);\r
+               fprintf(fp,"%d %ld %ld %ld %ld %d %g %g %g\n", q.type, q.n1, q.n2, q.n3, q.n4, q.id, q.s, q.w, q.p);\r
        }\r
        fclose(fp);\r
        return false;\r
@@ -488,26 +525,26 @@ void mgl_import_mgld_(uintptr_t *gr, const char *fname, int *add, int l)
                else    switch(type)    // TODO: save mark by PATCH\r
                {\r
                case 'P':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z);\r
                        fprintf(fp,"l -4/%ld -3/%ld\n", i,i);\r
                        fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                        fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                        fprintf(fp,"l -1/%ld -4/%ld\n", i,i);\r
                case '+':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y+ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
                        fprintf(fp,"l -4/%ld -3/%ld\n", i,i);\r
                        fprintf(fp,"l -2/%ld -1/%ld\n", i,i);   break;\r
                case 'X':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z);\r
                        fprintf(fp,"l -4/%ld -3/%ld\n", i,i);\r
                        fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                        fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
@@ -515,117 +552,117 @@ void mgl_import_mgld_(uintptr_t *gr, const char *fname, int *add, int l)
                        fprintf(fp,"l -1/%ld -3/%ld\n", i,i);\r
                        fprintf(fp,"l -2/%ld -4/%ld\n", i,i);   break;\r
                case 'x':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z);\r
                        fprintf(fp,"l -1/%ld -3/%ld\n", i,i);\r
                        fprintf(fp,"l -2/%ld -4/%ld\n", i,i);   break;\r
                case 'S':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z);\r
                        fprintf(fp,"f -4/%ld -3/%ld -2/%ld -1/%ld\n",i,i,i,i);  break;\r
                case 's':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z);\r
                        fprintf(fp,"l -4/%ld -3/%ld\n", i,i);\r
                        fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                        fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                        fprintf(fp,"l -1/%ld -4/%ld\n", i,i);   break;\r
                case 'D':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y+ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
                        fprintf(fp,"f -4/%ld -3/%ld -2/%ld -1/%ld\n",i,i,i,i);  break;\r
                case 'd':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y+ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
                        fprintf(fp,"l -4/%ld -3/%ld\n", i,i);\r
                        fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                        fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                        fprintf(fp,"l -1/%ld -4/%ld\n", i,i);   break;\r
                case 'Y':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+0.8*ss,p.y+0.6*ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-0.8*ss,p.y+0.6*ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+0.8*ss,p.y+0.6*ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-0.8*ss,p.y+0.6*ss,p.z);\r
                        fprintf(fp,"l -3/%ld %ld/%ld\n", i,i,i);\r
                        fprintf(fp,"l -2/%ld %ld/%ld\n", i,i,i);\r
                        fprintf(fp,"l -1/%ld %ld/%ld\n", i,i,i);        break;\r
                case '*':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
                        fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+0.6*ss,p.y+0.8*ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-0.6*ss,p.y-0.8*ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+0.6*ss,p.y+0.8*ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-0.6*ss,p.y-0.8*ss,p.z);\r
                        fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+0.6*ss,p.y-0.8*ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-0.6*ss,p.y+0.8*ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+0.6*ss,p.y-0.8*ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-0.6*ss,p.y+0.8*ss,p.z);\r
                        fprintf(fp,"l -2/%ld -1/%ld\n", i,i);           break;\r
                case 'T':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss/2,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss/2,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss/2,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss/2,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
                        fprintf(fp,"f -3/%ld -2/%ld -1/%ld\n", i,i,i);  break;\r
                case '^':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y-ss/2,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y-ss/2,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss/2,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss/2,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z);\r
                        fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                        fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                        fprintf(fp,"l -1/%ld -3/%ld\n", i,i);   break;\r
                case 'V':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss/2,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss/2,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss/2,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss/2,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z);\r
                        fprintf(fp,"f -3/%ld -2/%ld -1/%ld\n", i,i,i);  break;\r
                case 'v':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y+ss/2,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y+ss/2,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss/2,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss/2,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z);\r
                        fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                        fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                        fprintf(fp,"l -1/%ld -3/%ld\n", i,i);   break;\r
                case 'L':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss/2,p.y+ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss/2,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss/2,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss/2,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
                        fprintf(fp,"f -3/%ld -2/%ld -1/%ld\n", i,i,i);  break;\r
                case '<':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss/2,p.y+ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss/2,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss,p.y,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss/2,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss/2,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z);\r
                        fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                        fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                        fprintf(fp,"l -1/%ld -3/%ld\n", i,i);   break;\r
                case 'R':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss/2,p.y+ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss/2,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
                        fprintf(fp,"f -3/%ld -2/%ld -1/%ld\n", i,i,i);  break;\r
                case '>':\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss/2,p.y+ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x-ss/2,p.y-ss,p.z);\r
-                       fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss,p.y,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y+ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y-ss,p.z);\r
+                       fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z);\r
                        fprintf(fp,"l -3/%ld -2/%ld\n", i,i);\r
                        fprintf(fp,"l -2/%ld -1/%ld\n", i,i);\r
                        fprintf(fp,"l -1/%ld -3/%ld\n", i,i);   break;\r
                case 'O':\r
                        for(long j=0;j<=20;j++)\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z);\r
                        for(long j=0;j<20;j++)\r
                                fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", j-21,i, j-20,i, i,i);\r
                        break;\r
                case 'C':       fprintf(fp,"p %ld\n", i);\r
                case 'o':\r
                        for(long j=0;j<=20;j++)\r
-                               fprintf(fp,"v %.2g %.2g %.2g\n",p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z);\r
+                               fprintf(fp,"v %g %g %g\n",p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z);\r
                        for(long j=0;j<20;j++)\r
                                fprintf(fp,"l %ld/%ld %ld/%ld\n", j-21,i, j-20,i);\r
                        break;\r
@@ -646,14 +683,14 @@ void mglCanvas::WriteXGL(const char *fname,const char *descr)
        FILE *fp=fopen(fname,"wt");\r
        if(!fp) return true;\r
        fprintf(fp,"<WORLD>\n<NAME>%s</NAME>\n", descr?descr:fname);\r
-       fprintf(fp,"<BACKGROUND><BACKCOLOR>%.2g, %.2g, %.2g</BACKCOLOR></BACKGROUND>\n", BDef[0]/255., BDef[1]/255., BDef[2]/255.);\r
-       fprintf(fp,"<LIGHTING>\n<AMBIENT>%.2g, %.2g, %.2g</AMBIENT>\n",AmbBr, AmbBr, AmbBr);\r
+       fprintf(fp,"<BACKGROUND><BACKCOLOR>%g, %g, %g</BACKCOLOR></BACKGROUND>\n", BDef[0]/255., BDef[1]/255., BDef[2]/255.);\r
+       fprintf(fp,"<LIGHTING>\n<AMBIENT>%g, %g, %g</AMBIENT>\n",AmbBr, AmbBr, AmbBr);\r
        register unsigned long i,j;\r
        if(get(MGL_ENABLE_LIGHT))       for(i=0;i<10;i++)\r
                if(light[i].n && isnan(light[i].r.x))\r
                {\r
-                       fprintf(fp, "<DIRECTIONALLIGHT>\n<DIRECTION>%.2g, %.2g, %.2g</DIRECTION>\n", light[i].d.x, light[i].d.y, light[i].d.z);\r
-                       fprintf(fp, "<SPECULAR>%.2g, %.2g, %.2g</SPECULAR>\n</DIRECTIONALLIGHT>\n", light[i].c.r, light[i].c.g, light[i].c.b);\r
+                       fprintf(fp, "<DIRECTIONALLIGHT>\n<DIRECTION>%g, %g, %g</DIRECTION>\n", light[i].d.x, light[i].d.y, light[i].d.z);\r
+                       fprintf(fp, "<SPECULAR>%g, %g, %g</SPECULAR>\n</DIRECTIONALLIGHT>\n", light[i].c.r, light[i].c.g, light[i].c.b);\r
                }\r
        fprintf(fp,"</LIGHTING>");\r
 \r
@@ -689,8 +726,8 @@ void mglCanvas::WriteXGL(const char *fname,const char *descr)
                for(j=0;j<GetPntNum();j++)      if(pg[j])       // write Pnt for this object\r
                {\r
                        const mglPnt s=Pnt[j];\r
-                       fprintf(fp,"<P ID=\"%u\">%.2g, %.2g, %.2g</P>\n",j, s.x, s.y, s.z);\r
-                       fprintf(fp,"<N ID=\"%u\">%.2g, %.2g, %.2g</N>\n",j, s.x, s.y, s.z);\r
+                       fprintf(fp,"<P ID=\"%u\">%g, %g, %g</P>\n",j, s.x, s.y, s.z);\r
+                       fprintf(fp,"<N ID=\"%u\">%g, %g, %g</N>\n",j, s.x, s.y, s.z);\r
                }\r
                // TODO: add line styles\r
                for(j=0;j<p.size();j++) // now write primitives itself\r
index 75bca66f057777044082325e06b8b3e14f29f9de..796f0ee9d0b4543ba8a8b73cb483ab02836ca12e 100644 (file)
@@ -954,17 +954,17 @@ Exports current frame to XYZ/XYZL/XYZF files using vector representation (see @u
 @end deftypefn
 
 @deftypefn {Method on @code{mglGraph}} @code{void} WriteSTL (@code{const char *}fname, @code{const char *}descr=@code{""})
-@deftypefnx {C function} @code{void} mgl_write_obj (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr)
+@deftypefnx {C function} @code{void} mgl_write_stl (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr)
 Exports current frame to STL file using vector representation (see @url{http://en.wikipedia.org/wiki/STL_(file_format), STL format} for details). Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name).
 @end deftypefn
 
-@deftypefn {Method on @code{mglGraph}} @code{void} WriteOFF (@code{const char *}fname, @code{const char *}descr=@code{""})
-@deftypefnx {C function} @code{void} mgl_write_obj (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr)
+@deftypefn {Method on @code{mglGraph}} @code{void} WriteOFF (@code{const char *}fname, @code{const char *}descr=@code{""}, @code{bool} colored=@code{false})
+@deftypefnx {C function} @code{void} mgl_write_off (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr, @code{bool} colored)
 Exports current frame to OFF file using vector representation (see @url{http://people.sc.fsu.edu/~jburkardt/data/off/off.html, OFF format} for details). Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name).
 @end deftypefn
 
 @deftypefn {Method on @code{mglGraph}} @code{void} WriteX3D (@code{const char *}fname, @code{const char *}descr=@code{""})
-@deftypefnx {C function} @code{void} mgl_write_obj (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr)
+@deftypefnx {C function} @code{void} mgl_write_x3d (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr)
 Exports current frame to OBJ/MTL file using vector representation (see @url{http://en.wikipedia.org/wiki/X3d, X3D format} for details). Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name).
 @end deftypefn
 
index a0f3a025b759e767c633123594d9b4b753e7082f..a70d8336e828ec6df446aa2a91c008214b978b49 100644 (file)
@@ -984,7 +984,6 @@ Give first (for @code{.a}, i.e. @code{dat->a[0]}).
 @node Operators, Global functions, Data information, Data processing
 @section Operators
 
-@anchor{copy}
 @deftypefn {MGL command} {} copy @sc{dat} dat2 ['eq'='']
 @ifclear UDAV
 @deftypefnx {Method on @code{mglData}} @code{void} operator= (@code{const mglData &}d)
index 31ff2ad15f24a221f9c82d35e6ef297e29ec6b8a..d896ede59eb8003951cfe81092b7b1c98a674257 100644 (file)
@@ -136,6 +136,14 @@ This is enough for a compilation of console program or with external (non-MathGL
 * mglGraph class is single plotter class instead of mglGraphZB, mglGraphPS and so on.
 * Text style and text color positions are swapped. I.e. text style @samp{r:C} give red centered text, but not roman dark cyan text as for v.1.*.
 * ColumnPlot() indexing is reverted.
+* Move most of arguments of plotting functions into the string parameter and/or options.
+* ``Bright'' colors (like @{b8@}) can be used in color schemes and line styles.
+* Intensively use pthread internally for parallelization of drawing and data processing.
+* Add tick labels rotation and skipping. Add ticks in time/date format.
+* New kinds of plots (Tape(), Label(), ...). Extend existing plots. New primitives (Circle(), Ellipse(), Rhomb(), ...).
+* Improve MGL scripts. Add 'ask' command and allow string concatenation from different lines.
+* Export to LaTeX and to 3D formats (OBJ, OFF, STL, X3D).
+
 
 @c ------------------------------------------------------------------
 @node  Utilities, Thanks, Changes from v.1, Overview
index 5d72434624b85406db66080c42601e9103fd2077..888898c8ddcc04b724fc6a5ebd3e9c4920b53920 100644 (file)
@@ -195,3 +195,15 @@ HMGL mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char *title, voi
 //-----------------------------------------------------------------------------\r
 mglCanvasGLUT::mglCanvasGLUT() : mglCanvasGL() {}\r
 //-----------------------------------------------------------------------------\r
+#ifdef HAVE_FLTK\r
+HMGL mgl_create_graph_fltk(int (*)(HMGL gr, void *p), const char *, void *)\r
+{      return NULL;    }\r
+int mgl_fltk_run(){return 0;}\r
+#endif\r
+//-----------------------------------------------------------------------------\r
+#ifdef HAVE_QT\r
+HMGL mgl_create_graph_qt(int (*)(HMGL gr, void *p), const char *, void *)\r
+{      return NULL;    }\r
+int mgl_qt_run(){return 0;}\r
+#endif\r
+//-----------------------------------------------------------------------------\r
index d9580d7b1247426db91d49bbec2ca496f8113351..35d405a0b5a1fa576cc6230237266fe6f08b3026 100644 (file)
@@ -400,7 +400,7 @@ void QMathGL::exportOFF(QString fname)
        else
        {
                setlocale(LC_ALL, "C");
-               mgl_write_off(gr,setExtension(fname,"svg").toAscii(), appName.toAscii());
+               mgl_write_off(gr,setExtension(fname,"svg").toAscii(), appName.toAscii(),0);
                setlocale(LC_ALL, "");
        }
 }