[mathgl/f19: 1/2] * Update to 2.1.2 from branch master b35340c1ebb

mycae mycae at fedoraproject.org
Tue Apr 23 19:51:54 UTC 2013


commit 19f69c35b1b760750da213696daf789717870b94
Author: D Haley <mycae gmx com>
Date:   Tue Apr 23 20:41:16 2013 +0100

    * Update to 2.1.2 from branch master b35340c1ebb

 .gitignore                                   |    1 +
 mathgl-2.1.2-examples.patch                  |   41 ++
 mathgl-2.1.2-stlerror.patch                  |  722 ++++++++++++++++++++++++++
 mathgl-2.1.2-udav_desktop.patch              |   14 +
 mathgl-disable-lib-installdir.patch          |   12 +
 mathgl-fix-overflow.patch                    |   40 ++
 mathgl-fltk-skip-fluid.patch                 |   11 +
 mathgl-no-hdf4-and-hdf5-simultaneously.patch |   12 +
 mathgl.spec                                  |  391 +++++++++++----
 sources                                      |    2 +-
 10 files changed, 1147 insertions(+), 99 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index fa4c684..824e8d5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ mathgl-1.10.2.1.tgz
 /mathgl-1.11.0.1.tgz
 /mathgl-1.11.2.tar.gz
 /mathgl-1.11.3.tar.gz
+/mathgl-2.1.2.tar.gz
diff --git a/mathgl-2.1.2-examples.patch b/mathgl-2.1.2-examples.patch
new file mode 100644
index 0000000..19f0201
--- /dev/null
+++ b/mathgl-2.1.2-examples.patch
@@ -0,0 +1,41 @@
+diff -urp mathgl-2.1.2/examples/CMakeLists.txt mathgl-2.1.2-examples/examples/CMakeLists.txt
+--- mathgl-2.1.2/examples/CMakeLists.txt	2013-01-28 18:34:13.000000000 +0700
++++ mathgl-2.1.2-examples/examples/CMakeLists.txt	2013-04-18 11:02:02.069110414 +0700
+@@ -4,22 +4,26 @@ endif(MGL_HAVE_GSL)
+ 
+ add_executable(mgl_example wnd_samples.cpp full_test.cpp samples.cpp)
+ target_link_libraries(mgl_example mgl)
++SET(MGL_INSTALL_EXAMPLES_LIST mgl_example)
+ 
+ if(MGL_HAVE_FLTK)
+ 	include_directories(${FLTK_INCLUDE_DIR})
+ 	add_executable(mgl_fltk_example wnd_samples.cpp fltk_example.cpp)
+ 	target_link_libraries(mgl_fltk_example mgl-fltk)
++	SET(MGL_INSTALL_EXAMPLES_LIST ${MGL_INSTALL_EXAMPLES_LIST} mgl_fltk_example)
+ endif(MGL_HAVE_FLTK)
+ 
+ if(MGL_HAVE_GLUT)
+ 	add_executable(mgl_glut_example wnd_samples.cpp glut_example.cpp)
+ 	target_link_libraries(mgl_glut_example mgl-glut)
++	SET(MGL_INSTALL_EXAMPLES_LIST ${MGL_INSTALL_EXAMPLES_LIST} mgl_glut_example)
+ endif(MGL_HAVE_GLUT)
+ 
+ if(MGL_HAVE_WX)
+ 	include(${wxWidgets_USE_FILE})
+ 	add_executable(mgl_wx_example wnd_samples.cpp wx_example.cpp)
+ 	target_link_libraries(mgl_wx_example mgl-wx)
++	SET(MGL_INSTALL_EXAMPLES_LIST ${MGL_INSTALL_EXAMPLES_LIST} mgl_wx_example)
+ endif(MGL_HAVE_WX)
+ 
+ if(MGL_HAVE_QT)
+@@ -27,4 +31,10 @@ if(MGL_HAVE_QT)
+ 	qt_wrap_cpp(mgl_qt_example MGL_MOC_EX_FILES ../include/mgl2/qt.h)
+ 	add_executable(mgl_qt_example wnd_samples.cpp qt_example.cpp ${MGL_MOC_EX_FILES})
+ 	target_link_libraries(mgl_qt_example mgl-qt)
++	SET(MGL_INSTALL_EXAMPLES_LIST ${MGL_INSTALL_EXAMPLES_LIST} mgl_qt_example)
+ endif(MGL_HAVE_QT)
++
++install(
++	TARGETS ${MGL_INSTALL_EXAMPLES_LIST}
++	RUNTIME DESTINATION bin
++)
diff --git a/mathgl-2.1.2-stlerror.patch b/mathgl-2.1.2-stlerror.patch
new file mode 100644
index 0000000..92150f0
--- /dev/null
+++ b/mathgl-2.1.2-stlerror.patch
@@ -0,0 +1,722 @@
+diff -urp mathgl-2.1.2/include/mgl2/canvas.h mathgl-2.1.2-stlerror/include/mgl2/canvas.h
+--- mathgl-2.1.2/include/mgl2/canvas.h	2013-01-28 18:33:59.000000000 +0700
++++ mathgl-2.1.2-stlerror/include/mgl2/canvas.h	2013-04-23 09:33:14.801413395 +0700
+@@ -373,15 +373,15 @@ protected:
+ 	mreal text_plot(long p,const wchar_t *text,const char *fnt,mreal size=-1,mreal sh=0,mreal  col=-('k'), bool rot=true);
+ 
+ 	void add_prim(mglPrim &a);	///< add primitive to list
+-	void mark_draw(long p, char type, mreal size, mglDrawReg *d);
+-	void arrow_draw(long p1, long p2, char st, mreal size, mglDrawReg *d);
+-	virtual void line_draw(long p1, long p2, mglDrawReg *d);
+-	virtual void trig_draw(long p1, long p2, long p3, bool anorm, mglDrawReg *d);
+-	virtual void quad_draw(long p1, long p2, long p3, long p4, mglDrawReg *d);
+-	virtual void pnt_draw(long p, mglDrawReg *d);
++    void mark_draw(const mglPnt &p, char type, mreal size, mglDrawReg *d);
++    void arrow_draw(const mglPnt &p1, const mglPnt &p2, char st, mreal size, mglDrawReg *d);
++    virtual void line_draw(const mglPnt &p1, const mglPnt &p2, mglDrawReg *d);
++    virtual void trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, bool anorm, mglDrawReg *d);
++    virtual void quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4, mglDrawReg *d);
++    virtual void pnt_draw(const mglPnt &p, mglDrawReg *d);
+ 	void arrow_draw(long n1, long n2, char st, float ll);
+-	void arrow_plot_3d(long p1, long p2, char st, float ll);
+-	void glyph_draw(const mglPrim *P, mglDrawReg *d);
++    void arrow_plot_3d(long n1, long n2, char st, float ll);
++    void glyph_draw(const mglPrim &P, mglDrawReg *d);
+ 	bool IsSame(const mglPrim &pr,mreal wp,mglColor cp,int st);
+ 
+ 	// restore normalized coordinates from screen ones
+@@ -425,7 +425,7 @@ private:
+ 	/// Combine colors in 2 plane.
+ 	void combine(unsigned char *c1, const unsigned char *c2);
+ 	/// Fast drawing of line between 2 points
+-	void fast_draw(long p1, long p2, mglDrawReg *d);
++    void fast_draw(const mglPnt &p1, const mglPnt &p2, mglDrawReg *d);
+ 
+ 	/// Additionally scale points p for positioning in image
+ 	void PostScale(mglPoint &p) const;
+diff -urp mathgl-2.1.2/include/mgl2/opengl.h mathgl-2.1.2-stlerror/include/mgl2/opengl.h
+--- mathgl-2.1.2/include/mgl2/opengl.h	2013-01-28 18:33:59.000000000 +0700
++++ mathgl-2.1.2-stlerror/include/mgl2/opengl.h	2013-04-23 09:34:13.701604344 +0700
+@@ -45,10 +45,15 @@ public:
+ 	void Clf(mglColor Back=WC);
+ 
+ protected:
+-	void line_draw(long p1, long p2, mglDrawReg *d);
+-	void trig_draw(long p1, long p2, long p3, bool anorm, mglDrawReg *d);
+-	void quad_draw(long p1, long p2, long p3, long p4, mglDrawReg *d);
+-	void pnt_draw(long p, mglDrawReg *d);
++    // provide fastest variant for usual points (not glyphs or marks)
++    void line_draw(long n1, long n2);
++    void trig_draw(long n1, long n2, long n3);
++    void quad_draw(long n1, long n2, long n3, long n4);
++    // variant for glyphs or marks
++    void line_draw(const mglPnt &p1, const mglPnt &p2, mglDrawReg *d);
++    void trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, bool anorm, mglDrawReg *d);
++    void quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4, mglDrawReg *d);
++    void pnt_draw(const mglPnt &p, mglDrawReg *d);
+ 
+ 	unsigned char **GetRGBLines(long &w, long &h, unsigned char *&f, bool solid=true);
+ 	void LightScale();
+diff -urp mathgl-2.1.2/src/canvas.cpp mathgl-2.1.2-stlerror/src/canvas.cpp
+--- mathgl-2.1.2/src/canvas.cpp	2013-01-28 18:34:04.000000000 +0700
++++ mathgl-2.1.2-stlerror/src/canvas.cpp	2013-04-23 09:57:19.486537407 +0700
+@@ -301,7 +301,7 @@ mreal mglCanvas::GetOrgZ(char dir) const
+ //-----------------------------------------------------------------------------
+ //	Put primitives
+ //-----------------------------------------------------------------------------
+-#define MGL_MARK_PLOT	if(Quality&4)	mark_draw(p,type,size,&d);else	\
++#define MGL_MARK_PLOT   if(Quality&4)   mark_draw(Pnt[p],type,size,&d);else \
+ 						{	mglPrim a;	a.w = pw;	a.s = size;	\
+ 							a.n1 = p;	a.n4 = type;	add_prim(a);	}
+ void mglCanvas::mark_plot(long p, char type, mreal size)
+@@ -322,13 +322,14 @@ void mglCanvas::mark_plot(long p, char t
+ 	else	{	MGL_MARK_PLOT	}
+ }
+ //-----------------------------------------------------------------------------
+-#define MGL_LINE_PLOT	if(Quality&4)	line_draw(p1,p2,&dd);else	\
++#define MGL_LINE_PLOT   if(Quality&4)   line_draw(Pnt[p1],Pnt[p2],&dd);else \
+ 						{	mglPrim a(1);	a.n3=PDef;	a.s = pPos;	\
+ 							a.n1 = p1;	a.n2 = p2;	a.w = pw;	add_prim(a);	}
+ void mglCanvas::line_plot(long p1, long p2)
+ {
+ 	if(PDef==0)	return;
+ 	if(p1<0 || p2<0 || mgl_isnan(Pnt[p1].x) || mgl_isnan(Pnt[p2].x))	return;
++    if(p1>p2)   {   long kk=p1; p1=p2;  p2=kk;  }   // rearrange start/end for proper dashing
+ 	long pp1=p1,pp2=p2;
+ 	mreal pw = fabs(PenWidth)*sqrt(font_factor/400), d;
+ 	d = hypot(Pnt[p1].x-Pnt[p2].x, Pnt[p1].y-Pnt[p2].y);
+@@ -344,7 +345,7 @@ void mglCanvas::line_plot(long p1, long
+ 	pPos = fmod(pPos+d/pw/1.5, 16);
+ }
+ //-----------------------------------------------------------------------------
+-#define MGL_TRIG_PLOT	if(Quality&4)	trig_draw(p1,p2,p3,true,&d);else	\
++#define MGL_TRIG_PLOT   if(Quality&4)   trig_draw(Pnt[p1],Pnt[p2],Pnt[p3],true,&d);else \
+ 						{	mglPrim a(2);	a.n1 = p1;	a.n2 = p2;	\
+ 							a.n3 = p3;	add_prim(a);}
+ void mglCanvas::trig_plot(long p1, long p2, long p3)
+@@ -358,7 +359,7 @@ void mglCanvas::trig_plot(long p1, long
+ 	else	{	MGL_TRIG_PLOT	}
+ }
+ //-----------------------------------------------------------------------------
+-#define MGL_QUAD_PLOT	if(Quality&4)	quad_draw(p1,p2,p3,p4,&d);else	\
++#define MGL_QUAD_PLOT   if(Quality&4)   quad_draw(Pnt[p1],Pnt[p2],Pnt[p3],Pnt[p4],&d);else  \
+ 						{	mglPrim a(3);	a.n1 = p1;	a.n2 = p2;	\
+ 							a.n3 = p3;	a.n4 = p4;	add_prim(a);	}
+ void mglCanvas::quad_plot(long p1, long p2, long p3, long p4)
+@@ -480,7 +481,7 @@ void mglCanvas::Glyph(mreal x, mreal y,
+ 	d.PDef = s;		d.pPos = a.s;
+ 	d.ObjId=ObjId;	d.PenWidth=a.w;
+ 	
+-	if(Quality&4)	glyph_draw(&a,&d);
++	if(Quality&4)   glyph_draw(a,&d);
+ 	else	add_prim(a);
+ }
+ //-----------------------------------------------------------------------------
+@@ -708,6 +709,7 @@ void mglCanvas::AddLight(int n, mglPoint
+ //-----------------------------------------------------------------------------
+ void mglCanvas::arrow_plot(long n1, long n2, char st)
+ {
++    if(n1<0 || n2<0 || !strchr("AVKSDTIO",st))  return;
+ 	float ll = PenWidth*ArrowSize*0.35*font_factor;
+ 	if((Quality&3)==3)
+ 		arrow_plot_3d(n1, n2, st, ll);
+diff -urp mathgl-2.1.2/src/opengl.cpp mathgl-2.1.2-stlerror/src/opengl.cpp
+--- mathgl-2.1.2/src/opengl.cpp	2013-01-28 18:34:04.000000000 +0700
++++ mathgl-2.1.2-stlerror/src/opengl.cpp	2013-04-23 11:09:18.381161728 +0700
+@@ -41,11 +41,11 @@ void mglCanvasGL::Finish(bool fast)
+ 			p=Prm[i];	PDef=p.n3;	pPos=p.s;	PenWidth=p.w;
+ 			switch(p.type)
+ 			{
+-			case 0:	mark_draw(p.n1,p.n4,p.s,0);	break;
+-			case 1:	line_draw(p.n1,p.n2,0);		break;
+-			case 2:	trig_draw(p.n1,p.n2,p.n3,true,0);	break;
+-			case 3:	quad_draw(p.n1,p.n2,p.n3,p.n4,0);	break;
+-			case 4:	glyph_draw(&p,0);	break;
++            case 0: mark_draw(Pnt[p.n1],p.n4,p.s,0);    break;
++            case 1: line_draw(p.n1,p.n2);   break;
++            case 2: trig_draw(p.n1,p.n2,p.n3);  break;
++            case 3: quad_draw(p.n1,p.n2,p.n3,p.n4); break;
++            case 4: glyph_draw(p,0);    break;
+ 			}
+ 		}
+ 		PDef=pdef;	pPos=ss;	PenWidth=ww;
+@@ -231,26 +231,24 @@ unsigned char **mglCanvasGL::GetRGBLines
+ 	return p;
+ }
+ //-----------------------------------------------------------------------------
+-void mglCanvasGL::trig_draw(long k1, long k2, long k3, bool, mglDrawReg *)
++void mglCanvasGL::quad_draw(long k1, long k2, long k3, long k4)
+ {
+-	if(k1<0 || k2<0 || k3<0)	return;
+-	glBegin(GL_TRIANGLES);
+-	glArrayElement(k1);	glArrayElement(k2);	glArrayElement(k3);
++    glBegin(GL_QUADS);
++    glArrayElement(k1); glArrayElement(k2);
++    glArrayElement(k4); glArrayElement(k3);
+ 	glEnd();
+ }
+ //-----------------------------------------------------------------------------
+-void mglCanvasGL::quad_draw(long k1, long k2, long k3, long k4, mglDrawReg *)
++void mglCanvasGL::trig_draw(long k1, long k2, long k3)
+ {
+-	if(k1<0 || k2<0 || k3<0 || k4<0)	return;
+-	glBegin(GL_QUADS);
+-	glArrayElement(k1);	glArrayElement(k2);
+-	glArrayElement(k4);	glArrayElement(k3);
++    glBegin(GL_TRIANGLES);
++    glArrayElement(k1); glArrayElement(k2); glArrayElement(k3);
+ 	glEnd();
+ }
+ //-----------------------------------------------------------------------------
+-void mglCanvasGL::line_draw(long k1, long k2, mglDrawReg *)
++void mglCanvasGL::line_draw(long k1, long k2)
+ {
+-	if(k1<0 || k2<0 || PDef==0)	return;
++	if(PDef==0) return;
+ /*	unsigned pdef = PDef*0x10001;
+ 	pdef = pdef << (int(100*pPos+0.5)%16);
+ 	set_pen(pdef&0xffff,PenWidth);*/
+@@ -260,12 +258,39 @@ void mglCanvasGL::line_draw(long k1, lon
+ 	glEnd();
+ }
+ //-----------------------------------------------------------------------------
+-void mglCanvasGL::pnt_draw(long k1, mglDrawReg *)
++void mglCanvasGL::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4, mglDrawReg *)
++{
++    glBegin(GL_QUADS);
++    glNormal3f(p1.u,p1.v,p1.w); glColor4f(p1.r,p1.g,p1.b,p1.a); glVertex3f(p1.x,p1.y,p1.z);
++    glNormal3f(p2.u,p2.v,p2.w); glColor4f(p2.r,p2.g,p2.b,p2.a); glVertex3f(p2.x,p2.y,p2.z);
++    glNormal3f(p3.u,p3.v,p3.w); glColor4f(p3.r,p3.g,p3.b,p3.a); glVertex3f(p3.x,p3.y,p3.z);
++    glNormal3f(p4.u,p4.v,p4.w); glColor4f(p4.r,p4.g,p4.b,p4.a); glVertex3f(p4.x,p4.y,p4.z);
++    glEnd();
++}
++//-----------------------------------------------------------------------------
++void mglCanvasGL::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, bool, mglDrawReg *)
++{
++    glBegin(GL_TRIANGLES);
++    glNormal3f(p1.u,p1.v,p1.w); glColor4f(p1.r,p1.g,p1.b,p1.a); glVertex3f(p1.x,p1.y,p1.z);
++    glNormal3f(p2.u,p2.v,p2.w); glColor4f(p2.r,p2.g,p2.b,p2.a); glVertex3f(p2.x,p2.y,p2.z);
++    glNormal3f(p3.u,p3.v,p3.w); glColor4f(p3.r,p3.g,p3.b,p3.a); glVertex3f(p3.x,p3.y,p3.z);
++    glEnd();
++}
++//-----------------------------------------------------------------------------
++void mglCanvasGL::line_draw(const mglPnt &p1, const mglPnt &p2, mglDrawReg *)
++{
++    if(PDef==0) return;
++    set_pen(PDef,PenWidth);
++    glBegin(GL_LINES);
++    glColor4f(p1.r,p1.g,p1.b,p1.a); glVertex3f(p1.x,p1.y,p1.z);
++    glColor4f(p2.r,p2.g,p2.b,p2.a); glVertex3f(p2.x,p2.y,p2.z);
++    glEnd();
++}
++//-----------------------------------------------------------------------------
++void mglCanvasGL::pnt_draw(const mglPnt &p1, mglDrawReg *)
+ {
+-	if(k1<0)	return;
+ 	glBegin(GL_POINTS);
+-	glArrayElement(k1);
++	glColor4f(p1.r,p1.g,p1.b,p1.a); glVertex3f(p1.x,p1.y,p1.z);
+ 	glEnd();
+ }
+ //-----------------------------------------------------------------------------
+-
+diff -urp mathgl-2.1.2/src/pixel.cpp mathgl-2.1.2-stlerror/src/pixel.cpp
+--- mathgl-2.1.2/src/pixel.cpp	2013-01-28 18:34:04.000000000 +0700
++++ mathgl-2.1.2-stlerror/src/pixel.cpp	2013-04-23 10:34:47.308501443 +0700
+@@ -304,11 +304,11 @@ void mglCanvas::pxl_primdr(size_t id, si
+ 		d.ObjId = p.id;	d.PenWidth=p.w;
+ 		switch(p.type)
+ 		{
+-		case 0:	mark_draw(p.n1,p.n4,p.s,&d);	break;
+-		case 1:	line_draw(p.n1,p.n2,&d);		break;
+-		case 2:	trig_draw(p.n1,p.n2,p.n3,true,&d);	break;
+-		case 3:	quad_draw(p.n1,p.n2,p.n3,p.n4,&d);	break;
+-		case 4:	glyph_draw(&p,&d);	break;
++        case 0: mark_draw(Pnt[p.n1],p.n4,p.s,&d);   break;
++        case 1: line_draw(Pnt[p.n1],Pnt[p.n2],&d);      break;
++        case 2: trig_draw(Pnt[p.n1],Pnt[p.n2],Pnt[p.n3],true,&d);   break;
++        case 3: quad_draw(Pnt[p.n1],Pnt[p.n2],Pnt[p.n3],Pnt[p.n4],&d);  break;
++        case 4: glyph_draw(p,&d);   break;
+ 		}
+ 	}
+ }
+@@ -586,17 +586,16 @@ unsigned char **mglCanvas::GetRGBLines(l
+ /* Bilinear interpolation r(u,v) = r0 + (r1-r0)*u + (r2-r0)*v + (r3+r0-r1-r2)*u*v
+ 	is used (where r is one of {x,y,z,R,G,B,A}. Variables u,v are determined
+ 	for each point (x,y) and selected one pair which 0<u<1 and 0<v<1.*/
+-void mglCanvas::quad_draw(long k1, long k2, long k3, long k4, mglDrawReg *d)
++void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4, mglDrawReg *d)
+ {
+ 	if(!(Quality&3))
+ 	{
+-		fast_draw(k1,k2,d);	fast_draw(k1,k3,d);
+-		fast_draw(k4,k2,d);	fast_draw(k4,k3,d);	return;
++        fast_draw(p1,p2,d); fast_draw(p1,p3,d);
++        fast_draw(p4,p2,d); fast_draw(p4,p3,d); return;
+ 	}
+ 	unsigned char r[4];
+ 	long y1,x1,y2,x2;
+ 	float dd,dsx,dsy;
+-	const mglPnt &p1=Pnt[k1], &p2=Pnt[k2], &p3=Pnt[k3], &p4=Pnt[k4];
+ 	mglPnt d1=p2-p1, d2=p3-p1, d3=p4+p1-p2-p3, p;
+ 
+ 	x1 = long(fmin(fmin(p1.x,p2.x),fmin(p3.x,p4.x)));	// bounding box
+@@ -612,7 +611,7 @@ void mglCanvas::quad_draw(long k1, long
+ 	dsy = 4*(d2.y*d3.x - d2.x*d3.y)*d1.x;
+ 
+ 	if((d1.x==0 && d1.y==0) || (d2.x==0 && d2.y==0) || !(Quality&2))
+-	{	trig_draw(k1,k2,k4,true,d);	trig_draw(k1,k3,k4,true,d);	return;	}
++	{   trig_draw(p1,p2,p4,true,d); trig_draw(p1,p3,p4,true,d); return; }
+ 
+ 	mglPoint n1 = mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z);
+ 	mglPoint n2 = mglPoint(p2.x-p4.x,p2.y-p4.y,p2.z-p4.z)^mglPoint(p3.x-p4.x,p3.y-p4.y,p3.z-p4.z);
+@@ -657,17 +656,16 @@ void mglCanvas::quad_draw(long k1, long
+ /* Linear interpolation r(u,v) = r0 + (r1-r0)*u + (r2-r0)*v is used, where r is
+ 	one of {x,y,z,R,G,B,A}. Variables u,v are determined for each point (x,y).
+ 	Point plotted is u>0 and v>0 and u+v<1.*/
+-void mglCanvas::trig_draw(long k1, long k2, long k3, bool anorm, mglDrawReg *d)
++void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, bool anorm, mglDrawReg *d)
+ {
+ 	if(!(Quality&3))
+ 	{
+-		fast_draw(k1,k2,d);	fast_draw(k1,k3,d);
+-		fast_draw(k2,k3,d);	return;
++        fast_draw(p1,p2,d); fast_draw(p1,p3,d);
++        fast_draw(p2,p3,d); return;
+ 	}
+ 	unsigned char r[4];
+ 	long y1,x1,y2,x2;
+ 	float dxu,dxv,dyu,dyv;
+-	const mglPnt &p1=Pnt[k1], &p2=Pnt[k2], &p3=Pnt[k3];
+ 	mglPnt d1=p2-p1, d2=p3-p1, p;
+ 
+ 	dxu = d2.x*d1.y - d1.x*d2.y;
+@@ -704,10 +702,9 @@ void mglCanvas::trig_draw(long k1, long
+ 	}
+ }
+ //-----------------------------------------------------------------------------
+-void mglCanvas::line_draw(long k1, long k2, mglDrawReg *dr)
++void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, mglDrawReg *dr)
+ {
+-	if(k1>k2)	{	long kk=k1;	k1=k2;	k2=kk;	}	// rearrange start/end for proper dashing
+-	if(!(Quality&3))	{	fast_draw(k1,k2,dr);	return;	}
++	if(!(Quality&3))    {   fast_draw(p1,p2,dr);    return; }
+ 	unsigned char r[4];
+ 	long y1,x1,y2,x2;
+ 
+@@ -715,7 +712,6 @@ void mglCanvas::line_draw(long k1, long
+ 	float dz = Width>2 ? 1 : 1e-5*Width;		// provide additional height to be well visible on the surfaces
+ 
+ 	if(dr->ObjId==HighId)	{	pw *= 2;	dpw=2;	}
+-	const mglPnt &p1=Pnt[k1], &p2=Pnt[k2];
+ 	mglPnt d=p2-p1, p;
+ 	bool hor = fabs(d.x)>fabs(d.y);
+ 
+@@ -777,9 +773,8 @@ void mglCanvas::line_draw(long k1, long
+ 	set(aa,MGL_ENABLE_ALPHA);
+ }
+ //-----------------------------------------------------------------------------
+-void mglCanvas::fast_draw(long k1, long k2, mglDrawReg *dr)
++void mglCanvas::fast_draw(const mglPnt &p1, const mglPnt &p2, mglDrawReg *dr)
+ {
+-	const mglPnt &p1=Pnt[k1], &p2=Pnt[k2];
+ 	mglPnt d=p2-p1;
+ 	unsigned char r[4];	col2int(p1,r,dr->ObjId);
+ 	long y1,x1,y2,x2;
+@@ -807,12 +802,11 @@ void mglCanvas::fast_draw(long k1, long
+ 	}
+ }
+ //-----------------------------------------------------------------------------
+-void mglCanvas::pnt_draw(long k, mglDrawReg *dr)
++void mglCanvas::pnt_draw(const mglPnt &p, mglDrawReg *dr)
+ {
+ 	register long i,j,s,x,y;
+ 	register float v,pw=3*dr->PenWidth,dpw=3;
+ 	if(dr->ObjId==HighId)	{	pw *= 2;	dpw=2;	}
+-	const mglPnt &p=Pnt[k];
+ 	unsigned char cs[4], cc;
+ 	col2int(p,cs,dr->ObjId);	cc = cs[3];
+ 	if(cc==0)	return;
+@@ -829,21 +823,17 @@ void mglCanvas::pnt_draw(long k, mglDraw
+ 	}
+ }
+ //-----------------------------------------------------------------------------
+-void mglCanvas::mark_draw(long k, char type, mreal size, mglDrawReg *d)
++void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
+ {
+-	const mglPnt &q=Pnt[k];
+ 	unsigned char cs[4];	col2int(q,cs,d->ObjId);	cs[3] = size>0 ? 255 : 255*q.t;
+-	mglPnt p=q;
++	mglPnt p0=q,p1=q,p2=q,p3=q;
+ 	mreal ss=fabs(size);
+ 	register long i,j;
+-#if MGL_HAVE_PTHREAD
+-	pthread_mutex_lock(&mutexPnt);
+-#endif
+-	size_t pos = Pnt.size(), qos=pos;
++
+ 	if(type=='.' || ss==0)
+ 	{
+ 		if(d)	d->PenWidth = ss?ss:sqrt(font_factor/400);
+-		pnt_draw(k,d);
++		pnt_draw(q,d);
+ 	}
+ 	else
+ 	{
+@@ -856,107 +846,100 @@ void mglCanvas::mark_draw(long k, char t
+ 		switch(type)
+ 		{
+ 		case 'P':
+-			p.x = q.x-ss;	p.y = q.y-ss;	Pnt.push_back(p);
+-			p.x = q.x+ss;	p.y = q.y-ss;	Pnt.push_back(p);	line_draw(pos,pos+1,d);
+-			p.x = q.x+ss;	p.y = q.y+ss;	Pnt.push_back(p);	line_draw(pos+1,pos+2,d);
+-			p.x = q.x-ss;	p.y = q.y+ss;	Pnt.push_back(p);	line_draw(pos+2,pos+3,d);
+-			line_draw(pos+3,pos,d);	qos+=4;
++            p0.x = q.x-ss;  p0.y = q.y-ss;  p1.x = q.x+ss;  p1.y = q.y-ss;
++            p2.x = q.x+ss;  p2.y = q.y+ss;  p3.x = q.x-ss;  p3.y = q.y+ss;
++            line_draw(p0,p1,d); line_draw(p1,p2,d);
++            line_draw(p2,p3,d); line_draw(p3,p0,d);
+ 		case '+':
+-			p.x = q.x-ss;	p.y = q.y;		Pnt.push_back(p);
+-			p.x = q.x+ss;	p.y = q.y;		Pnt.push_back(p);	line_draw(qos,qos+1,d);
+-			p.x = q.x;	p.y = q.y-ss;		Pnt.push_back(p);
+-			p.x = q.x;	p.y = q.y+ss;		Pnt.push_back(p);	line_draw(qos+2,qos+3,d);
++            p0.x = q.x-ss;  p0.y = q.y; p1.x = q.x+ss;  p1.y = q.y; line_draw(p0,p1,d);
++            p2.x = q.x; p2.y = q.y-ss;  p3.x = q.x; p3.y = q.y+ss;  line_draw(p2,p3,d);
+ 			break;
+ 		case 'X':
+-			p.x = q.x-ss;	p.y = q.y-ss;	Pnt.push_back(p);
+-			p.x = q.x+ss;	p.y = q.y-ss;	Pnt.push_back(p);	line_draw(pos,pos+1,d);
+-			p.x = q.x+ss;	p.y = q.y+ss;	Pnt.push_back(p);	line_draw(pos+1,pos+2,d);
+-			p.x = q.x-ss;	p.y = q.y+ss;	Pnt.push_back(p);	line_draw(pos+2,pos+3,d);
+-			line_draw(pos+3,pos,d);	qos+=4;
++            p0.x = q.x-ss;  p0.y = q.y-ss;  p1.x = q.x+ss;  p1.y = q.y-ss;
++            p2.x = q.x+ss;  p2.y = q.y+ss;  p3.x = q.x-ss;  p3.y = q.y+ss;
++            line_draw(p0,p1,d); line_draw(p1,p2,d);
++            line_draw(p2,p3,d); line_draw(p3,p0,d);
+ 		case 'x':
+-			p.x = q.x-ss;	p.y = q.y-ss;	Pnt.push_back(p);
+-			p.x = q.x+ss;	p.y = q.y+ss;	Pnt.push_back(p);	line_draw(qos,qos+1,d);
+-			p.x = q.x+ss;	p.y = q.y-ss;	Pnt.push_back(p);
+-			p.x = q.x-ss;	p.y = q.y+ss;	Pnt.push_back(p);	line_draw(qos+2,qos+3,d);
++            p0.x = q.x-ss;  p0.y = q.y-ss;  p1.x = q.x+ss;  p1.y = q.y+ss;  line_draw(p0,p1,d);
++            p2.x = q.x+ss;  p2.y = q.y-ss;  p3.x = q.x-ss;  p3.y = q.y+ss;  line_draw(p2,p3,d);
+ 			break;
+ 		case 'S':
+-			p.x = q.x-ss;	p.y = q.y-ss;	Pnt.push_back(p);
+-			p.x = q.x-ss;	p.y = q.y+ss;	Pnt.push_back(p);
+-			p.x= q.x+ss;	p.y= q.y+ss;	Pnt.push_back(p);
+-			p.x = q.x+ss;	p.y = q.y-ss;	Pnt.push_back(p);
+-			quad_draw(pos,pos+1,pos+3,pos+2,d);	qos+=4;
++            p0.x = q.x-ss;  p0.y = q.y-ss;  p1.x = q.x-ss;  p1.y = q.y+ss;
++            p2.x= q.x+ss;   p2.y= q.y+ss;   p3.x = q.x+ss;  p3.y = q.y-ss;
++            quad_draw(p0,p1,p3,p2,d);
+ 		case 's':
+-			p.x = q.x-ss;	p.y = q.y-ss;	Pnt.push_back(p);
+-			p.x = q.x+ss;	p.y = q.y-ss;	Pnt.push_back(p);	line_draw(qos,qos+1,d);
+-			p.x = q.x+ss;	p.y = q.y+ss;	Pnt.push_back(p);	line_draw(qos+1,qos+2,d);
+-			p.x = q.x-ss;	p.y = q.y+ss;	Pnt.push_back(p);	line_draw(qos+2,qos+3,d);
+-			line_draw(qos+3,qos,d);	break;
++            p0.x = q.x-ss;  p0.y = q.y-ss;  p1.x = q.x+ss;  p1.y = q.y-ss;
++            p2.x = q.x+ss;  p2.y = q.y+ss;  p3.x = q.x-ss;  p3.y = q.y+ss;
++            line_draw(p0,p1,d); line_draw(p1,p2,d);
++            line_draw(p2,p3,d); line_draw(p3,p0,d);
++            break;
+ 		case 'D':
+-			p.x = q.x;	p.y = q.y-ss;		Pnt.push_back(p);
+-			p.x = q.x+ss;	p.y = q.y;		Pnt.push_back(p);
+-			p.x= q.x;	p.y= q.y+ss;		Pnt.push_back(p);
+-			p.x = q.x-ss;	p.y = q.y;		Pnt.push_back(p);
+-			quad_draw(pos,pos+1,pos+3,pos+2,d);	qos+=4;
++            p0.x = q.x; p0.y = q.y-ss;  p1.x = q.x+ss;  p1.y = q.y;
++            p2.x= q.x;  p2.y= q.y+ss;   p3.x = q.x-ss;  p3.y = q.y;
++            quad_draw(p0,p1,p3,p2,d);
+ 		case 'd':
+-			p.x = q.x;	p.y = q.y-ss;		Pnt.push_back(p);
+-			p.x = q.x+ss;	p.y = q.y;		Pnt.push_back(p);	line_draw(qos,qos+1,d);
+-			p.x = q.x;	p.y = q.y+ss;		Pnt.push_back(p);	line_draw(qos+1,qos+2,d);
+-			p.x = q.x-ss;	p.y = q.y;		Pnt.push_back(p);	line_draw(qos+2,qos+3,d);
+-			line_draw(qos+3,qos,d);	break;
++            p0.x = q.x; p0.y = q.y-ss;  p1.x = q.x+ss;  p1.y = q.y;
++            p2.x = q.x; p2.y = q.y+ss;  p3.x = q.x-ss;  p3.y = q.y;
++            line_draw(p0,p1,d); line_draw(p1,p2,d);
++            line_draw(p2,p3,d); line_draw(p3,p0,d);
++            break;
+ 		case 'Y':
+-			p.x = q.x;	p.y = q.y;			Pnt.push_back(p);
+-			p.x = q.x;	p.y = q.y-ss;		Pnt.push_back(p);	line_draw(pos,pos+1,d);
+-			p.x = q.x-0.8*ss;	p.y = q.y+0.6*ss;	Pnt.push_back(p);	line_draw(pos,pos+2,d);
+-			p.x = q.x+0.8*ss;	p.y = q.y+0.6*ss;	Pnt.push_back(p);	line_draw(pos,pos+3,d);
++            p1.x = q.x; p1.y = q.y-ss;  line_draw(q,p1,d);
++            p2.x = q.x-0.8*ss;  p2.y = q.y+0.6*ss;  line_draw(q,p2,d);
++            p3.x = q.x+0.8*ss;  p3.y = q.y+0.6*ss;  line_draw(q,p3,d);
+ 			break;
+ 		case '*':
+-			p.x = q.x-ss;		p.y = q.y;	Pnt.push_back(p);
+-			p.x = q.x+ss;		p.y = q.y;	Pnt.push_back(p);	line_draw(pos,pos+1,d);
+-			p.x = q.x-0.6*ss;	p.y = q.y-0.8*ss;	Pnt.push_back(p);
+-			p.x = q.x+0.6*ss;	p.y = q.y+0.8*ss;	Pnt.push_back(p);	line_draw(pos+2,pos+3,d);
+-			p.x = q.x-0.6*ss;	p.y = q.y+0.8*ss;	Pnt.push_back(p);
+-			p.x = q.x+0.6*ss;	p.y = q.y-0.8*ss;	Pnt.push_back(p);	line_draw(pos+4,pos+5,d);
++            p0.x = q.x-ss;      p0.y = q.y;
++            p1.x = q.x+ss;      p1.y = q.y; line_draw(p0,p1,d);
++            p0.x = q.x-0.6*ss;  p0.y = q.y-0.8*ss;
++            p1.x = q.x+0.6*ss;  p1.y = q.y+0.8*ss;  line_draw(p0,p1,d);
++            p0.x = q.x-0.6*ss;  p0.y = q.y+0.8*ss;
++            p1.x = q.x+0.6*ss;  p1.y = q.y-0.8*ss;  line_draw(p0,p1,d);
+ 			break;
+ 		case 'T':
+-			p.x = q.x-ss;	p.y = q.y-ss/2;	Pnt.push_back(p);
+-			p.x = q.x+ss;	p.y = q.y-ss/2;	Pnt.push_back(p);
+-			p.x= q.x;		p.y= q.y+ss;	Pnt.push_back(p);
+-			trig_draw(pos,pos+1,pos+2,false,d);	qos+=3;
++            p0.x = q.x-ss;  p0.y = q.y-ss/2;
++            p1.x = q.x+ss;  p1.y = q.y-ss/2;
++            p2.x= q.x;      p2.y= q.y+ss;
++            trig_draw(p0,p1,p2,false,d);
+ 		case '^':
+-			p.x = q.x-ss;	p.y = q.y-ss/2;	Pnt.push_back(p);
+-			p.x = q.x+ss;	p.y = q.y-ss/2;	Pnt.push_back(p);	line_draw(qos,qos+1,d);
+-			p.x= q.x;		p.y= q.y+ss;	Pnt.push_back(p);	line_draw(qos+1,qos+2,d);
+-			line_draw(qos+2,qos,d);		break;
++            p0.x = q.x-ss;  p0.y = q.y-ss/2;
++            p1.x = q.x+ss;  p1.y = q.y-ss/2;
++            p2.x= q.x;      p2.y= q.y+ss;
++            line_draw(p0,p1,d); line_draw(p1,p2,d);
++            line_draw(p2,p0,d); break;
+ 		case 'V':
+-			p.x = q.x-ss;	p.y = q.y+ss/2;	Pnt.push_back(p);
+-			p.x = q.x+ss;	p.y = q.y+ss/2;	Pnt.push_back(p);
+-			p.x= q.x;		p.y= q.y-ss;	Pnt.push_back(p);
+-			trig_draw(pos,pos+1,pos+2,false,d);	qos+=3;
++            p0.x = q.x-ss;  p0.y = q.y+ss/2;
++            p1.x = q.x+ss;  p1.y = q.y+ss/2;
++            p2.x= q.x;      p2.y= q.y-ss;
++            trig_draw(p0,p1,p2,false,d);
+ 		case 'v':
+-			p.x = q.x-ss;	p.y = q.y+ss/2;	Pnt.push_back(p);
+-			p.x = q.x+ss;	p.y = q.y+ss/2;	Pnt.push_back(p);	line_draw(qos,qos+1,d);
+-			p.x= q.x;		p.y= q.y-ss;	Pnt.push_back(p);	line_draw(qos+1,qos+2,d);
+-			line_draw(qos+2,qos,d);		break;
++            p0.x = q.x-ss;  p0.y = q.y+ss/2;
++            p1.x = q.x+ss;  p1.y = q.y+ss/2;
++            p2.x= q.x;      p2.y= q.y-ss;
++            line_draw(p0,p1,d); line_draw(p1,p2,d);
++            line_draw(p2,p0,d); break;
+ 		case 'L':
+-			p.x = q.x+ss/2;	p.y = q.y+ss;	Pnt.push_back(p);
+-			p.x = q.x+ss/2;	p.y = q.y-ss;	Pnt.push_back(p);
+-			p.x= q.x-ss;	p.y= q.y;		Pnt.push_back(p);
+-			trig_draw(pos,pos+1,pos+2,false,d);	qos+=3;
++            p0.x = q.x+ss/2;    p0.y = q.y+ss;
++            p1.x = q.x+ss/2;    p1.y = q.y-ss;
++            p2.x= q.x-ss;       p2.y= q.y;
++            trig_draw(p0,p1,p2,false,d);
+ 		case '<':
+-			p.x = q.x+ss/2;	p.y = q.y+ss;	Pnt.push_back(p);
+-			p.x = q.x+ss/2;	p.y = q.y-ss;	Pnt.push_back(p);	line_draw(qos,qos+1,d);
+-			p.x= q.x-ss;	p.y= q.y;		Pnt.push_back(p);	line_draw(qos+1,qos+2,d);
+-			line_draw(qos+2,qos,d);		break;
++            p0.x = q.x+ss/2;    p0.y = q.y+ss;
++            p1.x = q.x+ss/2;    p1.y = q.y-ss;
++            p2.x= q.x-ss;       p2.y= q.y;
++            line_draw(p0,p1,d); line_draw(p1,p2,d);
++            line_draw(p2,p0,d); break;
+ 		case 'R':
+-			p.x = q.x-ss/2;	p.y = q.y+ss;	Pnt.push_back(p);
+-			p.x = q.x-ss/2;	p.y = q.y-ss;	Pnt.push_back(p);
+-			p.x= q.x+ss;	p.y= q.y;		Pnt.push_back(p);
+-			trig_draw(pos,pos+1,pos+2,false,d);	qos+=3;
++            p0.x = q.x-ss/2;    p0.y = q.y+ss;
++            p1.x = q.x-ss/2;    p1.y = q.y-ss;
++            p2.x= q.x+ss;       p2.y= q.y;
++            trig_draw(p0,p1,p2,false,d);
+ 		case '>':
+-			p.x = q.x-ss/2;	p.y = q.y+ss;	Pnt.push_back(p);
+-			p.x = q.x-ss/2;	p.y = q.y-ss;	Pnt.push_back(p);	line_draw(qos,qos+1,d);
+-			p.x= q.x+ss;	p.y= q.y;		Pnt.push_back(p);	line_draw(qos+1,qos+2,d);
+-			line_draw(qos+2,qos,d);		break;
++            p0.x = q.x-ss/2;    p0.y = q.y+ss;
++            p1.x = q.x-ss/2;    p1.y = q.y-ss;
++            p2.x= q.x+ss;       p2.y= q.y;
++            line_draw(p0,p1,d); line_draw(p1,p2,d);
++            line_draw(p2,p0,d); break;
+ 		case 'O':
+ 			for(j=long(-ss);j<=long(ss);j++)	for(i=long(-ss);i<=long(ss);i++)
+ 			{
+@@ -967,24 +950,20 @@ void mglCanvas::mark_draw(long k, char t
+ 		case 'o':
+ 			for(i=0;i<=20;i++)
+ 			{
+-				p.x = q.x+ss*cos(i*M_PI/10);	p.y = q.y+ss*sin(i*M_PI/10);	Pnt.push_back(p);
+-				if(i>0)	line_draw(pos+i-1,pos+i,d);
++                p0 = p1;    p1.x = q.x+ss*cos(i*M_PI/10);   p1.y = q.y+ss*sin(i*M_PI/10);
++                if(i>0) line_draw(p0,p1,d);
+ 			}
+ 			break;
+ 		case 'C':
+-			pnt_draw(k,d);
++			pnt_draw(q,d);
+ 			for(i=0;i<=20;i++)
+ 			{
+-				p.x = q.x+ss*cos(i*M_PI/10);	p.y = q.y+ss*sin(i*M_PI/10);	Pnt.push_back(p);
+-				if(i>0)	line_draw(pos+i-1,pos+i,d);
++                p0 = p1;    p1.x = q.x+ss*cos(i*M_PI/10);   p1.y = q.y+ss*sin(i*M_PI/10);
++                if(i>0) line_draw(p0,p1,d);
+ 			}
+ 			break;
+ 		}
+-		Pnt.erase(Pnt.begin()+pos,Pnt.end());
+ 	}
+-#if MGL_HAVE_PTHREAD
+-	pthread_mutex_unlock(&mutexPnt);
+-#endif
+ }
+ //-----------------------------------------------------------------------------
+ // scale direction for new view/zoom
+@@ -1009,31 +988,31 @@ float mglCanvas::GetGlyphPhi(const mglPn
+ 	return phi;
+ }
+ //-----------------------------------------------------------------------------
+-void mglCanvas::glyph_draw(const mglPrim *P, mglDrawReg *d)
++void mglCanvas::glyph_draw(const mglPrim &P, mglDrawReg *d)
+ {
+-	float phi = GetGlyphPhi(Pnt[P->n2],P->w);
++	float phi = GetGlyphPhi(Pnt[P.n2],P.w);
+ 	if(mgl_isnan(phi))	return;
+ 
+-	mglPnt p=Pnt[P->n1];
+-	mreal pf=sqrt((Bp.b[0]*Bp.b[0]+Bp.b[1]*Bp.b[1]+Bp.b[3]*Bp.b[3]+Bp.b[4]*Bp.b[4])/2), f = P->p*pf;
++    mglPnt p=Pnt[P.n1];
++    mreal pf=sqrt((Bp.b[0]*Bp.b[0]+Bp.b[1]*Bp.b[1]+Bp.b[3]*Bp.b[3]+Bp.b[4]*Bp.b[4])/2), f = P.p*pf;
+ #if MGL_HAVE_PTHREAD
+ 	pthread_mutex_lock(&mutexPnt);
+ #endif
+ 	Push();		B.clear();
+-	B.b[0] = B.b[4] = B.b[8] = P->s;
++	B.b[0] = B.b[4] = B.b[8] = P.s;
+ 	RotateN(phi,0,0,1);
+ 	B.x=p.x;	B.y=p.y;	B.z=p.z;	B.pf = 1;
+ 	p.u *= pf;	p.v *= pf;
+ 
+-	const mglGlyph &g = Glf[P->n4];
+-	if(P->n3&8)
++    const mglGlyph &g = Glf[P.n4];
++    if(P.n3&8)
+ 	{
+-		if(!(P->n3&4))	glyph_line(p,f,true, d);
++		if(!(P.n3&4))   glyph_line(p,f,true, d);
+ 		glyph_line(p,f,false, d);
+ 	}
+ 	else
+ 	{
+-		if(!(P->n3&4))	glyph_fill(p,f,g, d);
++		if(!(P.n3&4))   glyph_fill(p,f,g, d);
+ 		glyph_wire(p,f,g, d);
+ 	}
+ 	Pop();
+@@ -1045,27 +1024,27 @@ void mglCanvas::glyph_draw(const mglPrim
+ void mglCanvas::glyph_fill(const mglPnt &pp, mreal f, const mglGlyph &g, mglDrawReg *d)
+ {
+ 	if(!g.trig || g.nt<=0)	return;
+-	long ik,ii,pos=Pnt.size();
+-	mglPnt p=pp;	p.u=p.v=NAN;
+-	mglPoint p1,p2,p3;
++    long ik,ii;
++    mglPnt q0=pp, q1=pp, q2=pp;
++    q0.u=q0.v=q1.u=q1.v=q2.u=q2.v=NAN;
++    mglPoint p1,p2,p3;
+ 	for(ik=0;ik<g.nt;ik++)
+ 	{
+ 		ii = 6*ik;	p1 = mglPoint(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);	PostScale(p1);
+ 		ii+=2;		p2 = mglPoint(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);	PostScale(p2);
+ 		ii+=2;		p3 = mglPoint(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);	PostScale(p3);
+-		p.x = p1.x;	p.y = p1.y;	p.z = p1.z;	Pnt.push_back(p);
+-		p.x = p2.x;	p.y = p2.y;	p.z = p2.z;	Pnt.push_back(p);
+-		p.x = p3.x;	p.y = p3.y;	p.z = p3.z;	Pnt.push_back(p);
+-		ii = Pnt.size()-3;	trig_draw(ii,ii+1,ii+2,false,d);
++        q0.x = p1.x;    q0.y = p1.y;    q0.z = p1.z;
++        q1.x = p2.x;    q1.y = p2.y;    q1.z = p2.z;
++        q2.x = p3.x;    q2.y = p3.y;    q2.z = p3.z;
++        trig_draw(q0,q1,q2,false,d);
+ 	}
+-	Pnt.erase(Pnt.begin()+pos,Pnt.end());
+ }
+ //-----------------------------------------------------------------------------
+ void mglCanvas::glyph_wire(const mglPnt &pp, mreal f, const mglGlyph &g, mglDrawReg *d)
+ {
+ 	if(!g.line || g.nl<=0)	return;
+-	long ik,ii,il=0,pos=Pnt.size();
+-	mglPnt p=pp;	p.u=p.v=NAN;
++    long ik,ii,il=0;
++    mglPnt q0=pp, q1=pp;    q0.u=q0.v=q1.u=q1.v=NAN;
+ 	if(d)	{	d->PDef = 0xffff;	d->PenWidth=0.75;	}
+ 	mglPoint p1,p2;
+ 	for(ik=0;ik<g.nl;ik++)
+@@ -1084,19 +1063,18 @@ void mglCanvas::glyph_wire(const mglPnt
+ 			p2 = mglPoint(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);
+ 		}
+ 		PostScale(p1);	PostScale(p2);
+-		p.x = p1.x;	p.y = p1.y;	p.z = p1.z;	Pnt.push_back(p);
+-		p.x = p2.x;	p.y = p2.y;	p.z = p2.z;	Pnt.push_back(p);
+-		ii = Pnt.size()-2;	line_draw(ii,ii+1,d);
++        q0.x = p1.x;    q0.y = p1.y;    q0.z = p1.z;
++        q1.x = p2.x;    q1.y = p2.y;    q1.z = p2.z;
++        line_draw(q0,q1,d);
+ 	}
+-	Pnt.erase(Pnt.begin()+pos,Pnt.end());
+ }
+ //-----------------------------------------------------------------------------
+ void mglCanvas::glyph_line(const mglPnt &pp, mreal f, bool solid, mglDrawReg *d)
+ {
+-	mglPnt p=pp;	p.u=p.v=NAN;
++    mglPnt q0=pp,q1=pp,q2=pp,q3=pp;
++    q0.u=q0.v=q1.u=q1.v=q2.u=q2.v=q3.u=q3.v=NAN;
+ 	if(d)	{	d->PDef = 0xffff;	d->PenWidth=1;	}
+ 	mglPoint p1,p2,p3,p4;
+-	long pos=Pnt.size();
+ 
+ 	mreal dy = 0.004;
+ 	p1 = mglPoint(pp.u,pp.v-dy,0);	PostScale(p1);
+@@ -1104,18 +1082,17 @@ void mglCanvas::glyph_line(const mglPnt
+ 	p3 = mglPoint(fabs(f)+pp.u,pp.v+dy,0);	PostScale(p3);
+ 	p4 = mglPoint(fabs(f)+pp.u,pp.v-dy,0);	PostScale(p4);
+ 
+-	p.x = p1.x;	p.y = p1.y;	p.z = p1.z;	Pnt.push_back(p);
+-	p.x = p2.x;	p.y = p2.y;	p.z = p2.z;	Pnt.push_back(p);
+-	p.x = p3.x;	p.y = p3.y;	p.z = p3.z;	Pnt.push_back(p);
+-	p.x = p4.x;	p.y = p4.y;	p.z = p4.z;	Pnt.push_back(p);
++    q0.x = p1.x;    q0.y = p1.y;    q0.z = p1.z;
++    q1.x = p2.x;    q1.y = p2.y;    q1.z = p2.z;
++    q2.x = p3.x;    q2.y = p3.y;    q2.z = p3.z;
++    q3.x = p4.x;    q3.y = p4.y;    q3.z = p4.z;
+ 
+-	if(solid)	quad_draw(pos,pos+1,pos+3,pos+2,d);
++	if(solid)   quad_draw(q0,q1,q3,q2,d);
+ 	else
+ 	{
+-		line_draw(pos,pos+1,d);	line_draw(pos+2,pos+1,d);
+-		line_draw(pos,pos+3,d);	line_draw(pos+2,pos+3,d);
++        line_draw(q0,q1,d); line_draw(q2,q1,d);
++        line_draw(q0,q3,d); line_draw(q2,q3,d);
+ 	}
+-	Pnt.erase(Pnt.begin()+pos,Pnt.end());
+ }
+ //-----------------------------------------------------------------------------
+ long mglCanvas::setPp(mglPnt &q, const mglPoint &p)
+@@ -1127,7 +1104,6 @@ long mglCanvas::setPp(mglPnt &q, const m
+ //-----------------------------------------------------------------------------
+ void mglCanvas::arrow_draw(long n1, long n2, char st, float ll)
+ {
+-	if(n1<0 || n2<0 || !strchr("AVKSDTIO",st))	return;
+ 	const mglPnt &p1=Pnt[n1], &p2=Pnt[n2];
+ 	mglPnt q=p1; 	//q.u=q.v=q.w=0;
+ 	
+@@ -1178,7 +1154,6 @@ void mglCanvas::arrow_draw(long n1, long
+ //-----------------------------------------------------------------------------
+ void mglCanvas::arrow_plot_3d(long n1, long n2, char st, float ll)
+ {
+-	if(n1<0 || n2<0 || !strchr("AVKSDTIO",st))	return;
+ 	const mglPnt &p1=Pnt[n1], &p2=Pnt[n2];
+ 	mglPnt q=p1; 	//q.u=q.v=q.w=0;
+ 	
diff --git a/mathgl-2.1.2-udav_desktop.patch b/mathgl-2.1.2-udav_desktop.patch
new file mode 100644
index 0000000..fd28f8f
--- /dev/null
+++ b/mathgl-2.1.2-udav_desktop.patch
@@ -0,0 +1,14 @@
+diff -urp mathgl-2.1.2/udav/udav.desktop mathgl-2.1.2-udav_desktop/udav/udav.desktop
+--- mathgl-2.1.2/udav/udav.desktop	2013-01-28 18:34:09.000000000 +0700
++++ mathgl-2.1.2-udav_desktop/udav/udav.desktop	2013-04-15 14:55:03.841048763 +0700
+@@ -1,9 +1,8 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Version=1.0
+ Type=Application
+ Terminal=false
+-Icon=udav.png
++Icon=udav
+ Name=UDAV
+ Exec=udav
+ Comment=Data handling and plotting tool
diff --git a/mathgl-disable-lib-installdir.patch b/mathgl-disable-lib-installdir.patch
new file mode 100644
index 0000000..480d87f
--- /dev/null
+++ b/mathgl-disable-lib-installdir.patch
@@ -0,0 +1,12 @@
+diff -r 2e857844b18d CMakeLists.txt
+--- CMakeLists.txt	Sun Apr 14 13:42:40 2013 +0100
++++ CMakeLists.txt	Sun Apr 14 13:43:36 2013 +0100
+@@ -13,7 +13,7 @@
+ 
+ include(CMakeDependentOption)
+ 
+-set(MGL_LIB_INSTALL_DIR "lib" CACHE STRING "Set library install directory")
++#set(MGL_LIB_INSTALL_DIR "lib" CACHE STRING "Set library install directory")
+ 
+ option(enable-double "Enable double precision in MathGL library" ON)
+ option(enable-simple "Slightly increase drawing speed but disable mglDataA class")
diff --git a/mathgl-fix-overflow.patch b/mathgl-fix-overflow.patch
new file mode 100644
index 0000000..0d4176f
--- /dev/null
+++ b/mathgl-fix-overflow.patch
@@ -0,0 +1,40 @@
+diff -r 9ad9a88a8e91 include/mgl2/base.h
+--- include/mgl2/base.h	Sun Apr 14 22:38:31 2013 +0100
++++ include/mgl2/base.h	Sun Apr 14 22:42:46 2013 +0100
+@@ -161,11 +161,14 @@
+ 	{	Create(a.nt, a.nl);	memcpy(trig, a.trig, 6*nt*sizeof(short));
+ 		memcpy(line, a.line, 2*nl*sizeof(short));	return *this;	}
+ };
++
++const int MGL_TEXTURE_COLOURS=512;
++
+ //-----------------------------------------------------------------------------
+ /// Structure for texture (color scheme + palette) representation
+ struct MGL_EXPORT mglTexture
+ {
+-	mglColor col[512];	///< Colors itself
++	mglColor col[MGL_TEXTURE_COLOURS];	///< Colors itself
+ 	long n;				///< Number of initial colors along u
+ 
+ 	char Sch[260];		///< Color scheme used
+@@ -179,6 +182,7 @@
+ 	void Set(const char *cols, int smooth=0,mreal alpha=1);
+ 	void Set(HCDT val, const char *cols);
+ 	void GetC(mreal u,mreal v,mglPnt &p) const;
++	size_t GetNumColours() { return MGL_TEXTURE_COLOURS;}
+ 	mglColor GetC(mreal u,mreal v=0) const;
+ 	inline bool IsSame(const mglTexture &t) const
+ 	{	return n==t.n && !memcmp(col,t.col,512*sizeof(mglColor));	}
+diff -r 9ad9a88a8e91 src/base.cpp
+--- src/base.cpp	Sun Apr 14 22:38:31 2013 +0100
++++ src/base.cpp	Sun Apr 14 22:42:46 2013 +0100
+@@ -882,7 +882,8 @@
+ 			return i+j/255.;
+ 	// add new texture
+ 	mglTexture t;
+-	for(i=0;i<514;i++)	t.col[i]=c;
++	size_t maxColours=t.GetNumColours();
++	for(i=0;i<maxColours;i++)	t.col[i]=c;
+ 	MGL_PUSH(Txt,t,mutexTxt);	return Txt.size()-1;
+ }
+ //-----------------------------------------------------------------------------
diff --git a/mathgl-fltk-skip-fluid.patch b/mathgl-fltk-skip-fluid.patch
new file mode 100644
index 0000000..15b9a11
--- /dev/null
+++ b/mathgl-fltk-skip-fluid.patch
@@ -0,0 +1,11 @@
+diff -r 58c850552b42 CMakeLists.txt
+--- CMakeLists.txt	Sun Apr 14 13:20:15 2013 +0100
++++ CMakeLists.txt	Sun Apr 14 13:20:22 2013 +0100
+@@ -235,6 +235,7 @@
+ 
+ if((enable-all-widgets OR enable-fltk) AND (NOT enable-lgpl) )
+ 	set(MGL_HAVE_FLTK 1)
++	set(FLTK_SKIP_FLUID 1)
+ 	include(FindFLTK)
+ 	if(NOT FLTK_FOUND)
+ 		message(SEND_ERROR "Couldn't find FLTK library.")
diff --git a/mathgl-no-hdf4-and-hdf5-simultaneously.patch b/mathgl-no-hdf4-and-hdf5-simultaneously.patch
new file mode 100644
index 0000000..7359e42
--- /dev/null
+++ b/mathgl-no-hdf4-and-hdf5-simultaneously.patch
@@ -0,0 +1,12 @@
+diff -r 9f8feb3b9d86 CMakeLists.txt
+--- CMakeLists.txt	Sun Apr 14 12:07:59 2013 +0100
++++ CMakeLists.txt	Sun Apr 14 12:09:15 2013 +0100
+@@ -121,7 +121,7 @@
+ 	set(MGL_HAVE_PTHREAD 0)
+ endif(enable-all OR enable-pthread)
+ 
+-if((enable-all OR enable-hdf4) AND (NOT enable-lgpl) )
++if((enable-hdf4 AND (NOT enable-all) ) AND (NOT enable-lgpl) AND (NOT enable-hdf5))
+ 	set(MGL_HAVE_HDF4 1)
+ 	find_library(HDF4_LIB df)
+ 	find_library(HDF4MF_LIB mfhdf)
diff --git a/mathgl.spec b/mathgl.spec
index 92b5984..dd29da5 100644
--- a/mathgl.spec
+++ b/mathgl.spec
@@ -1,34 +1,54 @@
-Name: mathgl
-Version: 1.11.3
-Release: 3%{?dist}
-Summary: Cross-platform library for making high-quality scientific graphics
-Summary(de): Plattformübergreifende Bibliothek für hochwertige wissenschaftliche Graphiken
-Summary(ru): MathGL - это библиотека для осуществления высококачественной визуализации данных
-License: GPLv2+
-Group: Development/Libraries
-Url: http://mathgl.sourceforge.net
-Source0: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
-
-#Fltk uses /usr/include/FL
-Patch0: %{name}-%{version}-fltk.patch
-#libpng 1.5 no longer include Z_BEST_COMPRESSION, and thus we need to
-# include zlib directly
-Patch1: %{name}-%{version}-zlib.patch
-
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Name:          mathgl
+Version:       2.1.2
+Release:       7%{?dist}
+Summary:       Cross-platform library for making high-quality scientific graphics
+Summary(de):   Plattformübergreifende Bibliothek für hochwertige wissenschaftliche Graphiken
+Summary(ru):   Библиотека для осуществления высококачественной визуализации данных
+License:       GPLv2+
+Group:         Development/Libraries
+Url:           http://mathgl.sourceforge.net
+Source0:       http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
+
+#Mathgl's enable all tries to use hdf4 and 5 at the same time
+Patch0:        mathgl-no-hdf4-and-hdf5-simultaneously.patch
+
+#CMake looks for "FLUID" - the fltk UI designer. 
+#This is not needed - instruct cmake to skip it at build time
+Patch1:        mathgl-fltk-skip-fluid.patch
+
+#Mathgl hardcodes the libdir as lib, then puts it in a var. 
+# we will simply pass it as an arg to cmake.
+Patch2:        mathgl-disable-lib-installdir.patch
+
+#Fix segfault due to overflow when initalising textures
+Patch3:        mathgl-fix-overflow.patch
+
+# Fix udav.desktop: Encoding and Icon keys
+Patch4:        mathgl-2.1.2-udav_desktop.patch
+
+# Install binaries for generation examples of illustrations
+Patch5:        mathgl-2.1.2-examples.patch
+
+# Fix for pics generation segfaults (from upstream)
+Patch6:        mathgl-2.1.2-stlerror.patch
+
+BuildRoot:     %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+Requires:      %{name}-common = %{version}-%{release}
 
 # mandatory packages
-BuildRequires: gsl-devel libpng-devel libtool-ltdl-devel libtool 
-BuildRequires: swig 
+BuildRequires: gsl-devel libpng-devel
+BuildRequires: desktop-file-utils
+BuildRequires: cmake
 
 # optional packages
 BuildRequires: freeglut-devel hdf-devel hdf5-static libjpeg-devel libtiff-devel fltk-devel qt4-devel
 BuildRequires: wxGTK-devel giflib-devel 
+BuildRequires: libharu-devel
+BuildRequires: swig octave-devel
+BuildRequires: libXmu-devel
+BuildRequires: python2-devel numpy
 
-#For autoreconf (required for patches, libtool)
-BuildRequires:	autoconf
-BuildRequires:	automake
-BuildRequires:	libtool
 
 Requires(post): info
 Requires(preun): info
@@ -40,137 +60,314 @@ arrays, as well as  window and console modes and for easy embedding
 into other programs. Mathgl integrates into fltk, qt and
 opengl applications
 
+%description -l ru
+Mathgl - это кроссплатформенная библиотека для подготовки высококачественных
+научных иллюстраций. Библиотека обладает возможностью работы с большими
+массивами данных, быстрой отрисовки, при этом работая как в консольном, так и
+оконном режимах, легко интегрируясь в другие приложения. Mathgl может быть
+использована в FLTK, Qt и OpenGL приложениях.
+
 %package devel
-Summary: Libraries and header files for %{name} library
-Group: Development/Libraries
-Requires: %{name} = %{version}-%{release}
-Requires: gsl-devel
+Summary:       Libraries and header files for %{name} library
+Summary(ru):   Библиотеки и файлы заголовков для %{name}
+Group:         Development/Libraries
+Requires:      %{name} = %{version}-%{release}
+Requires:      gsl-devel
 
 %description devel
 The %{name}-devel package contains libraries and header files for
-developing applications that use %{name}.
+developing applications that use serial version of %{name}.
 
 %description devel -l ru
-Пакет %{name}-devel содержит библиотеки и файлы заголовков необходимые 
-для разработки приложений с использованием %{name}.
+Пакет %{name}-devel содержит библиотеки и файлы заголовков, необходимые
+для разработки приложений с использованием однопоточной версии %{name}.
 
 %package doc
-Group:		Documentation
-Summary:	HTML documentation and tutorial for the %{name} applications
-
-BuildArch:	noarch
-BuildRequires:	texi2html texinfo-tex	
-
+Group:         Documentation
+Summary:       HTML documentation and tutorial for the %{name} applications
+BuildArch:     noarch
+BuildRequires: texi2html texinfo-tex
 
 %description doc
-This package contains the documentation in the HTML format of the %{name}
+This package contains the documentation in the HTML and PDF format of the %{name}
 package.
 
+%package -n udav
+Summary:       Viewer and editor for mathgl graphs
+Summary(ru):   Редактор и средство визуализации для MathGL
+Group:         Applications/Engineering
+Requires:      %{name} = %{version}-%{release}
+
+%description -n udav
+UDAV is cross-platform program for interactive data array visualization
+using the MathGL library. UDAV works as a front-end to the mathgl
+scripting engine, allowing for the generation of a wide variety of
+scientific graph styles.
+
+%description -n udav -l ru
+UDAV - это кроссплатформенное приложение для интерактивной визуализации массивов
+данных с применением библиотеки MathGL. UDAV, как GUI для MathGL, может быть
+использован для формирования различного вида научных иллюстраций.
+
+%package common
+Summary:       Common files for %{name}
+Group:         Applications/Engineering
+BuildArch:     noarch
+Requires:      %{name} = %{version}-%{release}
+
+%description common
+%{summary}.
+
+%package examples
+Summary:       Example illustration generators for %{name}
+Group:         Applications/Engineering
+Requires:      %{name} = %{version}-%{release}
+
+%description examples
+Binaries for generation examples of illustrations that could be 
+prepared by %{name}.
+
+%package openmpi
+Summary:       OpenMPI version of %{name} library
+Group:         Applications/Engineering
+BuildRequires: openmpi-devel
+Requires:      openmpi
+Requires:      %{name}-common = %{version}-%{release}
+
+%description openmpi
+%{summary}.
+
+%package openmpi-devel
+Summary:       Devel files for OpenMPI version of %{name} library
+Group:         Applications/Engineering
+Requires:      %{name}-openmpi%{_isa} = %{version}-%{release}
+
+%description openmpi-devel
+%{summary}.
+
+%package mpich2
+Summary:       MPICH2 version of %{name} library
+Group:         Applications/Engineering
+BuildRequires: mpich2-devel
+Requires:      mpich2
+Requires:      %{name}-common = %{version}-%{release}
+
+%description mpich2
+%{summary}.
+
+%package mpich2-devel
+Summary:       Devel files for MPICH2 version of %{name} library
+Group:         Applications/Engineering
+Requires:      %{name}-mpich2%{_isa} = %{version}-%{release}
+
+%description mpich2-devel
+%{summary}.
+
 %prep
 %setup -q
 
 
 #convert EOL encodings, maintaining timestames
-for file in AUTHORS ChangeLog.txt README COPYRIGHT; do
-	sed 's/\r//' $file > $file.new && \
-	touch -r $file $file.new && \
-	mv $file.new $file
+for file in AUTHORS ChangeLog.txt README ; do
+    sed 's/\r//' $file > $file.new && \
+    touch -r $file $file.new && \
+    mv $file.new $file
 done
 
-%patch0 -p1
+%patch0 
 %patch1 
+%patch2 
+%patch3
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
 
+# Fix hardcoded paths
+sed -i s,/usr/local/share/doc/mathgl/,%{_docdir}/%{name}/, udav/udav_wnd.h
+sed -i s,/usr/local/share/udav/,%{_datadir}/udav/, udav/udav_wnd.cpp
 
 %build
-#configure looks for * not *-qt4
-QMAKE=/usr/bin/qmake-qt4
-LUPDATE=/usr/bin/lupdate-qt4
-LRELEASE=/usr/bin/lrelease-qt4
-
-export LDFLAGS="-L/usr/lib64/hdf/ -L/usr/lib/hdf"
-%configure	--disable-static \
-		--enable-shared \
-		--enable-all 
-
-sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
-sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
-
-export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`/widgets/.libs/:`pwd`/mgl/.libs
 
-make %{?_smp_mflags} 
+%define building() \
+BUILD_MPI="-Denable-mpi=on -Denable-doc=off" %buildcommon
+
+%define building_serial() \
+BUILD_MPI="-Denable-mpi=off -Denable-doc=on" %buildcommon
+
+%define buildcommon() \
+mkdir -p %{_target_platform}_$MPI_COMPILER_NAME; \
+pushd %{_target_platform}_$MPI_COMPILER_NAME; \
+%{cmake} \\\
+    -DMGL_LIB_INSTALL_DIR=%{_libdir} \\\
+    -Denable-all=on \\\
+    -Denable-hdf4=off \\\
+    -Denable-all-swig=on \\\
+    -Denable-all-widgets=on \\\
+    $BUILD_MPI \\\
+    ..; \
+popd; \
+make %{?_smp_mflags} -C %{_target_platform}_$MPI_COMPILER_NAME
+
+# serial
+MPI_COMPILER_NAME=serial %building_serial
+
+# MPI vars
+export CC=mpicc
+export CXX=mpicxx
+
+# OpenMPI
+%{_openmpi_load}
+MPI_COMPILER_NAME=openmpi %building
+%{_openmpi_unload}
+
+# MPICH2
+%{_mpich2_load}
+MPI_COMPILER_NAME=mpich2 %building
+%{_mpich2_unload}
 
 %install
-rm -rf $RPM_BUILD_ROOT
-make install DESTDIR=$RPM_BUILD_ROOT INSTALL="install -p"
+rm -rf %{buildroot}
 
-#Trash the .la files that get generated anyway (faulty configure? Doesn't appear up without --disable-ltdtl-install)
-rm -f $RPM_BUILD_ROOT/%{_libdir}/*.la
+# MPI install libs only
+%define installing() \
+make install DESTDIR=%{buildroot}%{_libdir}/$MPI_COMPILER_NAME -C %{_target_platform}_$MPI_COMPILER_NAME INSTALL="install -p"; \
+mkdir -p %{buildroot}%{_libdir}/$MPI_COMPILER_NAME/lib/ \
+mv %{buildroot}%{_libdir}/$MPI_COMPILER_NAME/%{_libdir}/libmgl* %{buildroot}%{_libdir}/$MPI_COMPILER_NAME/lib/; \
+mkdir -p %{buildroot}%{_includedir}/$MPI_COMPILER/mgl2; \
+mv %{buildroot}%{_libdir}/$MPI_COMPILER_NAME/%{_includedir}/mgl2/* %{buildroot}%{_includedir}/$MPI_COMPILER/mgl2/; \
+rm -f %{buildroot}%{_libdir}/$MPI_COMPILER_NAME/lib/*.a; \
+rm -r %{buildroot}%{_libdir}/$MPI_COMPILER_NAME/usr
 
-pushd .
-#Lets build a "docs" dir to maintain the dir relationships needed for html files
-mkdir -p  texinfo/docs
-cd texinfo/docs/
-cp -pr ../mathgl_en.html .
-cp -pr ../png/ .
+# Serial
+make install DESTDIR=%{buildroot} -C %{_target_platform}_serial INSTALL="install -p"
 
-#remove zero length faux PNG file
-rm -f png/all.png
+# OpenMPI
+%{_openmpi_load}
+MPI_COMPILER_NAME=openmpi %installing
+%{_openmpi_unload}
 
-popd
+# MPICH2
+%{_mpich2_load}
+MPI_COMPILER_NAME=mpich2 %installing
+%{_mpich2_unload}
 
-#remove installed docs, which we are installing via doc macro
-rm -rf $RPM_BUILD_ROOT/%{_docdir}/%{name}
+#Remove symlink to .so file in python dir. Let python find libs normally
+unlink %{buildroot}/%{python_sitelib}/_mathgl.so
 
-#remove misplaced info "dir" file
-rm -f $RPM_BUILD_ROOT/%{_infodir}/dir
+#Remove static libraries generated by cmake
+rm %{buildroot}/%{_libdir}/*.a
 
-pushd $RPM_BUILD_ROOT/%{_infodir}
+#Remove the binary mgl.cgi. Im not convinced about it (eg mem leak in main), and that its really needed
+rm %{buildroot}/%{_bindir}/mgl.cgi
 
-#move to _en info files
-for i in mathgl_en.info*;
-do
-	mv $i `echo $i | sed s/mathgl_en/mathgl/`
-done
+# Check .desktop file
+desktop-file-validate %{buildroot}%{_datadir}/applications/udav.desktop
 
-rm mgl_*.info*
+# Maintain l18n for udav
+%find_lang udav --with-qt
 
-popd
+%post -p /sbin/ldconfig
 
-%post 
-/sbin/ldconfig
-/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
+%post common
+/sbin/install-info %{_infodir}/%{name}_en.info %{_infodir}/dir || :
 
-%preun
+%preun common
 if [ $1 = 0 ] ; then
-	/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
+    /sbin/install-info --delete %{_infodir}/%{name}_en.info %{_infodir}/dir || :
 fi
 
 %postun -p /sbin/ldconfig
 
 %clean
-rm -rf $RPM_BUILD_ROOT
+rm -rf %{buildroot}
 
 
 %files
 %defattr(-,root,root,-)
-%doc AUTHORS ChangeLog.txt README COPYING COPYRIGHT NEWS TODO
+%doc AUTHORS ChangeLog.txt README COPYING  README_V2
 %{_libdir}/*.so.*
 %{_bindir}/mgl*
-%{_datadir}/%{name}/
-%{_infodir}/%{name}.*.gz
-%{_infodir}/%{name}_ru.*.gz
-
+%exclude %{_bindir}/mgl_*example
+%{_mandir}/man1/mglconv.1.gz
+%{_mandir}/man1/mglview.1.gz
 
 %files devel
 %defattr(-,root,root,-)
-%{_includedir}/mgl/
 %{_libdir}/*.so
+%{_includedir}/mgl2/
+
+%files -n udav -f udav.lang
+%{_bindir}/udav
+%{_mandir}/man1/udav.1.gz
+%{_datadir}/applications/udav.desktop
+%dir %{_datadir}/udav/
+%{_datadir}/pixmaps/*.png
 
 %files doc
 %defattr(-,root,root,-)
-%doc texinfo/docs/*
+%doc %{_docdir}/%{name}
+
+%files common
+%defattr(-,root,root,-)
+%{python_sitelib}/*
+%{_datadir}/%{name}/
+%{_infodir}/%{name}*.gz
+%{_mandir}/man5/mgl.5.gz
+
+%files examples
+%defattr(-,root,root,-)
+%{_bindir}/mgl_*example
+
+%files openmpi
+%defattr(-,root,root,-)
+%doc COPYING
+%{_libdir}/openmpi/lib/*.so.*
+
+%files openmpi-devel
+%defattr(-,root,root,-)
+%{_libdir}/openmpi/lib/*.so
+%{_includedir}/openmpi-%{_arch}/mgl2/
+
+%files mpich2
+%doc COPYING
+%defattr(-,root,root,-)
+%{_libdir}/mpich2/lib/*.so.*
+
+%files mpich2-devel
+%defattr(-,root,root,-)
+%{_libdir}/mpich2/lib/*.so
+%{_includedir}/mpich2-%{_arch}/mgl2/
 
 %changelog
+* Thu Apr 23 2013 Dmitrij S. Kryzhevich <krege at land.ru> - 2.1.2-7
+- Modify patch to fix pics generation.
+
+* Mon Apr 22 2013 Dmitrij S. Kryzhevich <krege at land.ru> - 2.1.2-6
+- Add patch to fix pics generation.
+
+* Thu Apr 18 2013 Dmitrij S. Kryzhevich <krege at land.ru> - 2.1.2-5
+- Install binaries used for generation of examples of illustrations.
+
+* Wed Apr 17 2013 Dmitrij S. Kryzhevich <krege at land.ru> - 2.1.2-4
+- Disable some .png generation for -doc.
+
+* Mon Apr 15 2013 Dmitrij S. Kryzhevich <krege at land.ru> - 2.1.2-3
+- MPI suport for MathGL library: add -common subpackage.
+- MPI enabled for MathGL library: add OpenMPI and MPICH2 support.
+- Reformat spec for better reading (spaces vs tabs, aligning).
+
+* Mon Apr 15 2013 Dmitrij S. Kryzhevich <krege at land.ru> - 2.1.2-2
+- Fix spec for better cmake use.
+- Make vars in spec to be in one style.
+- Add some Russian translation.
+- .info is installed. Remove copying.
+- Make udav sub-package to be with name "udav".
+- Maintain traslation for udav.
+
+* Sun Apr 14 2013 <mycae(a!)gmx.com> 2.1.2-1
+- Update to upstream 2.1.2
+- New upstream has entirely different build system
+
 * Thu Feb 14 2013 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 1.11.3-3
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
 
@@ -333,5 +530,3 @@ rm -rf $RPM_BUILD_ROOT
 
 * Fri Feb 29 2008 Nik <niktr at mail.ru>
 - initial build of version 1.5
-
-
diff --git a/sources b/sources
index 7e88698..026ae59 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-afd6fc8e9347af7bd222c6941c2d813a  mathgl-1.11.3.tar.gz
+47eea09ab905789ad28a2ded1149e4c7  mathgl-2.1.2.tar.gz


More information about the scm-commits mailing list