File xstereograph-2.1-strings.patch of Package xstereograph

--- src/bd_help.h
+++ src/bd_help.h
@@ -1,100 +1,93 @@
-char bd_help[]="\
-The depthmap builder is a powerful tool allowing to build a depthmap
-by assigning to each point of coordinates (x,y) in a rectangle 
-x1 <= x <= x2, y1 <= y <= y2, a luminosity value in the rangle 0..255.
-The width and height in pixels of the desired resulting image should
-be specified in the relevant entries.
-
-The luminosity is calculated mathematically as a result of the position 
-of all objects present in the scene, and depends linearly on the value 
-of the third coordinate z, which is viewed as perpendicular to the Oxy 
-screen plane. The user should thus also specify the lower and upper 
-values of z. If several objects have parts sharing the same values of
-(x,y), only those parts corresponding to the upper layer (z maximal)
-are represented. 
-
-The user should enter a C procedure defining the objects to be built,
-as for the provided examples in the mathfiles/ directory. This
-procedure is then embedded in suitable C code to produce a .pgm file
-(portable gray bitmap). The pnmtotiff utility is finally used to
-convert this image into the tif format required by SIS. As a
-consequence, the depthmap builder will only work if you have 
-pnmtotiff or a similar utility installed on your system.
-
-Several position and drawing primitives can be used, in any combination
-position primitives -- drawing primitives, 
-position primitives -- drawing primitives,
-position primitives -- drawing primitives...
-
-
-Position primitives:
-
-1. rotation_angles(double a, double b, double c);
-
-Rotates an object by an angle a with respect to 0xy, b with respect to
-0xz and c with respect to 0yz. All angles in degrees.
-Default values: a=0, b=0, c=0.
-
-2. scale(double h);
-Sets an homothety factor equal to h. All three coordinates x,y,z are 
-multiplied by h.
-Default value: h=1.
-
-3. translation(double a, double b, double c);
-
-Translates coordinates (x,y,z) by (a,b,c).
-Default values: (a,b,c)=(0,0,0).
-
-
-Drawing primitives:
-
-0. max(double x, double y);  min(double x, double y);
-
-standard max and min functions.
-
-1. mesh(point *p, int i, int j, int k);
-
-Here \"point\" is the predefined type  double[3], and p is an
-array of points, e.g.  point p[15], representing 15 points
-as triples of coordinates (x,y,z). The above mesh primitive 
-draws the 3D-triangle whose vertices are p[i], p[j], p[k].
-
-2. build(BFunction bfunct);
-
-where BFunction is the predefined void function type
-typedef void (*BFunction)();
-
-bfunct() is used to define the object, e.g. as a collection of 
-triangular meshes, and build(bfunct) makes the actual drawing.
-
-3. graph(PFunction pfunct, double u1, double u2, int nu,
-                           double v1, double v2, int nv);
-
-where PFunction is the predefined function type
-typedef void  (*PFunction)(point p, double u, double v);
-
-pfunct(p,u,v) assigns to parameters (u,v) a point
-       p={x(u,v),y(u,v),z(u,v)}. 
-The procedure  graph(pfunct, u1,u2,nu, v1,v2,nv); draws the 
-graph for u1 <= u <= u2, v1 <= v <= v2, by using a subdvision
-in nu subintervals for u and nv subintervals for v.
-
-4. light(ZFunction zfunct);
-
-with predefined function type
-typedef double (*ZFunction)(double x, double y);
-
-The function zfunct prescribes the depth as  z=zfunct(x,y), and
-light(zfunct) assigns the luminosity accordingly. 
-NOTE: The position primitives have no effect on the light procedure.
-
-
-Check examples in the /mathfiles directory to see how all this works.
+char bd_help[]="\
+The depthmap builder is a powerful tool allowing to build a depthmap\n\
+by assigning to each point of coordinates (x,y) in a rectangle \n\
+x1 <= x <= x2, y1 <= y <= y2, a luminosity value in the rangle 0..255.\n\
+The width and height in pixels of the desired resulting image should\n\
+be specified in the relevant entries.\n\
+\n\
+The luminosity is calculated mathematically as a result of the position \n\
+of all objects present in the scene, and depends linearly on the value \n\
+of the third coordinate z, which is viewed as perpendicular to the Oxy \n\
+screen plane. The user should thus also specify the lower and upper \n\
+values of z. If several objects have parts sharing the same values of\n\
+(x,y), only those parts corresponding to the upper layer (z maximal)\n\
+are represented. \n\
+\n\
+The user should enter a C procedure defining the objects to be built,\n\
+as for the provided examples in the mathfiles/ directory. This\n\
+procedure is then embedded in suitable C code to produce a .pgm file\n\
+(portable gray bitmap). The pnmtotiff utility is finally used to\n\
+convert this image into the tif format required by SIS. As a\n\
+consequence, the depthmap builder will only work if you have \n\
+pnmtotiff or a similar utility installed on your system.\n\
+\n\
+Several position and drawing primitives can be used, in any combination\n\
+position primitives -- drawing primitives, \n\
+position primitives -- drawing primitives,\n\
+position primitives -- drawing primitives...\n\
+\n\
+\n\
+Position primitives:\n\
+\n\
+1. rotation_angles(double a, double b, double c);\n\
+\n\
+Rotates an object by an angle a with respect to 0xy, b with respect to\n\
+0xz and c with respect to 0yz. All angles in degrees.\n\
+Default values: a=0, b=0, c=0.\n\
+\n\
+2. scale(double h);\n\
+Sets an homothety factor equal to h. All three coordinates x,y,z are \n\
+multiplied by h.\n\
+Default value: h=1.\n\
+\n\
+3. translation(double a, double b, double c);\n\
+\n\
+Translates coordinates (x,y,z) by (a,b,c).\n\
+Default values: (a,b,c)=(0,0,0).\n\
+\n\
+\n\
+Drawing primitives:\n\
+\n\
+0. max(double x, double y);  min(double x, double y);\n\
+\n\
+standard max and min functions.\n\
+\n\
+1. mesh(point *p, int i, int j, int k);\n\
+\n\
+Here \"point\" is the predefined type  double[3], and p is an\n\
+array of points, e.g.  point p[15], representing 15 points\n\
+as triples of coordinates (x,y,z). The above mesh primitive \n\
+draws the 3D-triangle whose vertices are p[i], p[j], p[k].\n\
+\n\
+2. build(BFunction bfunct);\n\
+\n\
+where BFunction is the predefined void function type\n\
+typedef void (*BFunction)();\n\
+\n\
+bfunct() is used to define the object, e.g. as a collection of \n\
+triangular meshes, and build(bfunct) makes the actual drawing.\n\
+\n\
+3. graph(PFunction pfunct, double u1, double u2, int nu,\n\
+                           double v1, double v2, int nv);\n\
+\n\
+where PFunction is the predefined function type\n\
+typedef void  (*PFunction)(point p, double u, double v);\n\
+\n\
+pfunct(p,u,v) assigns to parameters (u,v) a point\n\
+       p={x(u,v),y(u,v),z(u,v)}. \n\
+The procedure  graph(pfunct, u1,u2,nu, v1,v2,nv); draws the \n\
+graph for u1 <= u <= u2, v1 <= v <= v2, by using a subdvision\n\
+in nu subintervals for u and nv subintervals for v.\n\
+\n\
+4. light(ZFunction zfunct);\n\
+\n\
+with predefined function type\n\
+typedef double (*ZFunction)(double x, double y);\n\
+\n\
+The function zfunct prescribes the depth as  z=zfunct(x,y), and\n\
+light(zfunct) assigns the luminosity accordingly. \n\
+NOTE: The position primitives have no effect on the light procedure.\n\
+\n\
+\n\
+Check examples in the /mathfiles directory to see how all this works.\n\
 ";
-
-
-
-
-
-
-
--- src/help.h
+++ src/help.h
@@ -1,41 +1,41 @@
-char sis_help[] = "\
-Xstereograph/Magic-eye is a user friendly X-frontend to Stereograph,
-a fancy SIS generator (SIS = Single  Image  Stereogram) written by
-Fabian Januszewski. In a few words, a SIS generator produces 
-plane images which can be interpreted and look like 3D images.
-
-How does Stereograph operates? Well, as follows. Starting from 
-two images,
-* a depth image, providing information on the shape 
-  and distance of the \"magic object\" to be displayed,
-* a texture, giving the output its superficial appearance,
-Stereograph combines them into a single output image (performing
-clever anti-aliasing and anti-artifact procedures along the way).
-
-As a result, a 3-D stereogram is generated. In such a stereogram, 
-the \"magic\" object is somehow hidden, although you can see it with
-bare eyes after your eyes reach a suitable position and focus.
-
-The \"Select\" buttons are used to select the depth image and texture, 
-respectively. The \"Randomize\" buttons provide random selections from
-the distributed sis/depth_maps and sis/textures. If no depth image has 
-been selected, magic-eye implicitly provides a random selection as well. 
-If no texture has been selected (\"Selection\" then indicates \"Texture: -\"),
-magic-eye uses a chaotic distribution of 8bit color pixels, through
-the option -C of Stereograph, in place of the texture image.
-
-It is also possible to produce stereograms from user built depth_map and 
-texture images, rather than from the distributed demo files. 
-
-Note: these files must be in .PNG, .PPM or .TGA format (use e.g. povray 
-to produce such files). The depth_map should only use gray scale colors.
-
-Credits: Xstereograph is written using the simple X library libsx by  
-Dominic Giampaolo -- which does indeed provide very easy access
-to programming under X11.
-
-Man page: More details on the technical aspects of SIS stereograms
-operation can be obtained from the stereograph manual page, as
-displayed by the \"Man page\" option from the \"About\" button.
+char sis_help[] = "\
+Xstereograph/Magic-eye is a user friendly X-frontend to Stereograph,\n\
+a fancy SIS generator (SIS = Single  Image  Stereogram) written by\n\
+Fabian Januszewski. In a few words, a SIS generator produces \n\
+plane images which can be interpreted and look like 3D images.\n\
+\n\
+How does Stereograph operates? Well, as follows. Starting from \n\
+two images,\n\
+* a depth image, providing information on the shape \n\
+  and distance of the \"magic object\" to be displayed,\n\
+* a texture, giving the output its superficial appearance,\n\
+Stereograph combines them into a single output image (performing\n\
+clever anti-aliasing and anti-artifact procedures along the way).\n\
+\n\
+As a result, a 3-D stereogram is generated. In such a stereogram, \n\
+the \"magic\" object is somehow hidden, although you can see it with\n\
+bare eyes after your eyes reach a suitable position and focus.\n\
+\n\
+The \"Select\" buttons are used to select the depth image and texture, \n\
+respectively. The \"Randomize\" buttons provide random selections from\n\
+the distributed sis/depth_maps and sis/textures. If no depth image has \n\
+been selected, magic-eye implicitly provides a random selection as well. \n\
+If no texture has been selected (\"Selection\" then indicates \"Texture: -\"),\n\
+magic-eye uses a chaotic distribution of 8bit color pixels, through\n\
+the option -C of Stereograph, in place of the texture image.\n\
+\n\
+It is also possible to produce stereograms from user built depth_map and \n\
+texture images, rather than from the distributed demo files. \n\
+\n\
+Note: these files must be in .PNG, .PPM or .TGA format (use e.g. povray \n\
+to produce such files). The depth_map should only use gray scale colors.\n\
+\n\
+Credits: Xstereograph is written using the simple X library libsx by  \n\
+Dominic Giampaolo -- which does indeed provide very easy access\n\
+to programming under X11.\n\
+\n\
+Man page: More details on the technical aspects of SIS stereograms\n\
+operation can be obtained from the stereograph manual page, as\n\
+displayed by the \"Man page\" option from the \"About\" button.\n\
 ";
 
--- src/xstereograph.c
+++ src/xstereograph.c
@@ -328,259 +328,259 @@
 
 /* Building sis-depth.c program */
 fprintf(fd, "\
-#include <stdlib.h>
-#include <stdio.h>
-#include <math.h>
-
-#define PI 3.14159265358979
-#define COLORDEPTH %d
-#define COLOREXTEN %d
-#define WIDTH  %s
-#define HEIGHT %s
-
-typedef double point[3];
-
-typedef void (*BFunction)();
-typedef double (*ZFunction)(double x, double y);
-typedef void  (*PFunction)(point p, double x, double y);
-
-const double CONV_RAD=M_PI/180;
-int do_init = 1;
-short int pixel_color[WIDTH][HEIGHT];
-double x_1=%s, x_2=%s, y_1=%s, y_2=%s, z_1=%s, z_2=%s;
-double ratio_x, ratio_y, ratio_z;
-double m_rot[12]={1,0,0,0,0,1,0,0,0,0,1,0};
-
-double max(double x, double y)
-{
-   if(x>=y) return x; else return y;
-}
-
-double min(double x, double y)
-{
-   if(x>=y) return x; else return y;
-}
-
-void do_init_image()
-{
-int i,j;
-
-   if (do_init)
-     {
-     for(j=0; j<HEIGHT; j++) for(i=0; i<WIDTH; i++) pixel_color[i][j] = 0;
-     ratio_x = (x_2-x_1)/(double)WIDTH;
-     ratio_y = (y_2-y_1)/(double)HEIGHT;
-     if(ratio_x==0 || ratio_y==0) exit(1);
-     ratio_z = z_2-z_1;
-     if(ratio_z<=0) exit(1); else ratio_z = ((double)COLOREXTEN)/ratio_z;
-     do_init = 0;
-     }
-}
-
-void translation(double a, double b, double c)
-{
-   m_rot[3] = a;   
-   m_rot[7] = b;   
-   m_rot[11] = c;   
-}
-
-void scale(double a)
-{
-int i;
-
-   for (i=0; i<=11; i++) m_rot[i] *= a;   
-}
-
-void rotation_angles(double theta, double phi, double psi)
-{
-double ca,cb,cc, sa,sb,sc;
-
-   ca=theta*CONV_RAD;
-   cb=phi*CONV_RAD;
-   cc=psi*CONV_RAD;
-
-   sa=sin(ca); ca=cos(ca);
-   sb=sin(cb); cb=cos(cb);
-   sc=sin(cc); cc=cos(cc);
-
-   m_rot[0] = ca*cb;
-   m_rot[1] = -sa*cc-ca*sb*sc;
-   m_rot[2] = sa*sc-ca*sb*cc;
-
-   m_rot[4] = sa*cb;
-   m_rot[5] = ca*cc-sa*sb*sc;
-   m_rot[6] = -ca*sc-sa*sb*cc;
-
-   m_rot[8] = sb;
-   m_rot[9] = cb*sc;
-   m_rot[10]= cb*cc;
-
-}
-
-void rotate(point p, point q)
-{
-int i,j;
-   for(i=0; i<=2; i++)
-     {
-     j=4*i;
-     q[i] = m_rot[j]*p[0]+m_rot[j+1]*p[1]+m_rot[j+2]*p[2]+m_rot[j+3];
-     }
-}
-
-void setpoint(point p, point q)
-{
-int i;
-
-   for(i=0; i<=2; i++) p[i] = q[i];
-}
-
-void mesh(point *p, int h, int i, int j)
-{
-point a[3];
-double ca,cb,cc,cd, delta, s,t, adds,addt, x, y, z, z0,z1,z2;
-int u1, u2, v1, v2;
-int k,l,m;
-
-   do_init_image();
-   rotate(p[h],a[0]);
-   rotate(p[i],a[1]);
-   rotate(p[j],a[2]);
-
-   u1=WIDTH; u2=-1;
-   v1=HEIGHT; v2=-1;
-
-   for(k=0; k<=2; k++)
-     {
-     l=(int)((a[k][0]-x_1)/ratio_x);
-     if(l<u1) u1=l;
-     if(l>u2) u2=l;
-     l=(int)((y_2-a[k][1])/ratio_y);
-     if(l<v1) v1=l;
-     if(l>v2) v2=l;
-     }
-
-    if(u1<0) u1=0;
-    if(u2>=WIDTH) u2=WIDTH-1;
-    if(v1<0) v1=0;
-    if(v2>=HEIGHT) v2=HEIGHT-1;
-    if(u1>u2 || v1>v2) return;
-
-    z0 = a[0][2];
-    z1 = a[1][2]-z0;
-    z2 = a[2][2]-z0;
-
-    z0 = (z0-z_1)*ratio_z;
-    z1 = z1*ratio_z;
-    z2 = z2*ratio_z;
-
-    delta = (a[1][0]-a[0][0])*(a[2][1]-a[0][1]) 
-                      - (a[1][1]-a[0][1])*(a[2][0]-a[0][0]);
-    if (fabs(delta)<1E-5) return;
-    
-    delta=1/delta;
-    ca = (a[2][1]-a[0][1])*delta;
-    cb = (a[0][0]-a[2][0])*delta;
-    cc = (a[0][1]-a[1][1])*delta;
-    cd = (a[1][0]-a[0][0])*delta;
-    adds = ca*ratio_x;
-    addt = cc*ratio_x;
-
-    for(l=v1; l<=v2; l++) 
-      {
-      x = x_1 + u1*ratio_x - a[0][0];
-      y = y_2 - l*ratio_y - a[0][1];
-      s = ca*x + cb*y;
-      t = cc*x + cd*y;
-      for(k=u1; k<=u2; k++)
-	{
-        if (s>=-0.0001 && t>=-0.0001 && s+t<=1.0001)
-	  {
-          m = (int) (z0 + s*z1 + t*z2);
-          if (m<0) m=0;
-          if (m>COLOREXTEN) m=COLOREXTEN;
-          if (m>pixel_color[k][l]) pixel_color[k][l] = m;
-	  }
-        s = s + adds;
-        t = t + addt;
-        }
-      }
-}
-
-void build(BFunction bfunct)
-{
-   do_init_image();
-   bfunct();
-}
-
-void light(ZFunction zfunct)
-{
-int i, j;
-int k;
-double x,y;
-
-   do_init_image();
-
-   for(j=0; j<HEIGHT; j++) 
-   {
-     y = y_2-ratio_y*j;
-     for(i=0; i<WIDTH; i++)
-     {
-        x = ratio_x*i+x_1;
-        k = (int)((zfunct(x,y)-z_1)*ratio_z);
-        if (k<0) k=0;
-        if (k>COLOREXTEN) k=COLOREXTEN;
-        if (k>pixel_color[i][j]) pixel_color[i][j] = k;
-     }
-   }
-}
-
-void graph(PFunction pfunct, double xi, double xs, int nx, 
-                             double yi, double ys, int ny)
-{
-int i, j, l;
-double hx,hy;
-point p[4];
-
-   if(nx<=0 || ny<=0) return;
-
-   do_init_image();
-
-   hx = (xs-xi)/nx;
-   hy = (ys-yi)/ny;
-
-   for(j=0; j<ny; j++) 
-     {
-     for(l=0; l<=1; l++)
-         pfunct(p[l],xi,yi+(j+l)*hy);
-
-     for(i=1; i<=nx; i++)
-         {
-         setpoint(p[2],p[0]); setpoint(p[3],p[1]); 
-         for(l=0; l<=1; l++)
-            pfunct(p[l], xi+i*hx,yi+(j+l)*hy);
-         mesh(p,0,1,2); mesh(p,1,2,3);
-         }
-     }
-}
-
-int main(int argc, char **argv)
-{
-int i, j;
-
-   %s
-
-   printf(\"P6\\n# CREATOR: sis\\n\");
-   printf(\" %%d %%d %%d\\n\", WIDTH, HEIGHT, COLORDEPTH);
-
-   for(j=0; j<HEIGHT; j++) for(i=0; i<WIDTH; i++)
-     {
-     int k=pixel_color[i][j]/3;
-     int l=pixel_color[i][j] - 3*k;
-     int m=0;
-     if (l==2) {l=1; m=1;}
-     printf(\"%%c%%c%%c\", k, k+l, k+m);
-     }
-}
+#include <stdlib.h>\n\
+#include <stdio.h>\n\
+#include <math.h>\n\
+\n\
+#define PI 3.14159265358979\n\
+#define COLORDEPTH %d\n\
+#define COLOREXTEN %d\n\
+#define WIDTH  %s\n\
+#define HEIGHT %s\n\
+\n\
+typedef double point[3];\n\
+\n\
+typedef void (*BFunction)();\n\
+typedef double (*ZFunction)(double x, double y);\n\
+typedef void  (*PFunction)(point p, double x, double y);\n\
+\n\
+const double CONV_RAD=M_PI/180;\n\
+int do_init = 1;\n\
+short int pixel_color[WIDTH][HEIGHT];\n\
+double x_1=%s, x_2=%s, y_1=%s, y_2=%s, z_1=%s, z_2=%s;\n\
+double ratio_x, ratio_y, ratio_z;\n\
+double m_rot[12]={1,0,0,0,0,1,0,0,0,0,1,0};\n\
+\n\
+double max(double x, double y)\n\
+{\n\
+   if(x>=y) return x; else return y;\n\
+}\n\
+\n\
+double min(double x, double y)\n\
+{\n\
+   if(x>=y) return x; else return y;\n\
+}\n\
+\n\
+void do_init_image()\n\
+{\n\
+int i,j;\n\
+\n\
+   if (do_init)\n\
+     {\n\
+     for(j=0; j<HEIGHT; j++) for(i=0; i<WIDTH; i++) pixel_color[i][j] = 0;\n\
+     ratio_x = (x_2-x_1)/(double)WIDTH;\n\
+     ratio_y = (y_2-y_1)/(double)HEIGHT;\n\
+     if(ratio_x==0 || ratio_y==0) exit(1);\n\
+     ratio_z = z_2-z_1;\n\
+     if(ratio_z<=0) exit(1); else ratio_z = ((double)COLOREXTEN)/ratio_z;\n\
+     do_init = 0;\n\
+     }\n\
+}\n\
+\n\
+void translation(double a, double b, double c)\n\
+{\n\
+   m_rot[3] = a;   \n\
+   m_rot[7] = b;   \n\
+   m_rot[11] = c;   \n\
+}\n\
+\n\
+void scale(double a)\n\
+{\n\
+int i;\n\
+\n\
+   for (i=0; i<=11; i++) m_rot[i] *= a;   \n\
+}\n\
+\n\
+void rotation_angles(double theta, double phi, double psi)\n\
+{\n\
+double ca,cb,cc, sa,sb,sc;\n\
+\n\
+   ca=theta*CONV_RAD;\n\
+   cb=phi*CONV_RAD;\n\
+   cc=psi*CONV_RAD;\n\
+\n\
+   sa=sin(ca); ca=cos(ca);\n\
+   sb=sin(cb); cb=cos(cb);\n\
+   sc=sin(cc); cc=cos(cc);\n\
+\n\
+   m_rot[0] = ca*cb;\n\
+   m_rot[1] = -sa*cc-ca*sb*sc;\n\
+   m_rot[2] = sa*sc-ca*sb*cc;\n\
+\n\
+   m_rot[4] = sa*cb;\n\
+   m_rot[5] = ca*cc-sa*sb*sc;\n\
+   m_rot[6] = -ca*sc-sa*sb*cc;\n\
+\n\
+   m_rot[8] = sb;\n\
+   m_rot[9] = cb*sc;\n\
+   m_rot[10]= cb*cc;\n\
+\n\
+}\n\
+\n\
+void rotate(point p, point q)\n\
+{\n\
+int i,j;\n\
+   for(i=0; i<=2; i++)\n\
+     {\n\
+     j=4*i;\n\
+     q[i] = m_rot[j]*p[0]+m_rot[j+1]*p[1]+m_rot[j+2]*p[2]+m_rot[j+3];\n\
+     }\n\
+}\n\
+\n\
+void setpoint(point p, point q)\n\
+{\n\
+int i;\n\
+\n\
+   for(i=0; i<=2; i++) p[i] = q[i];\n\
+}\n\
+\n\
+void mesh(point *p, int h, int i, int j)\n\
+{\n\
+point a[3];\n\
+double ca,cb,cc,cd, delta, s,t, adds,addt, x, y, z, z0,z1,z2;\n\
+int u1, u2, v1, v2;\n\
+int k,l,m;\n\
+\n\
+   do_init_image();\n\
+   rotate(p[h],a[0]);\n\
+   rotate(p[i],a[1]);\n\
+   rotate(p[j],a[2]);\n\
+\n\
+   u1=WIDTH; u2=-1;\n\
+   v1=HEIGHT; v2=-1;\n\
+\n\
+   for(k=0; k<=2; k++)\n\
+     {\n\
+     l=(int)((a[k][0]-x_1)/ratio_x);\n\
+     if(l<u1) u1=l;\n\
+     if(l>u2) u2=l;\n\
+     l=(int)((y_2-a[k][1])/ratio_y);\n\
+     if(l<v1) v1=l;\n\
+     if(l>v2) v2=l;\n\
+     }\n\
+\n\
+    if(u1<0) u1=0;\n\
+    if(u2>=WIDTH) u2=WIDTH-1;\n\
+    if(v1<0) v1=0;\n\
+    if(v2>=HEIGHT) v2=HEIGHT-1;\n\
+    if(u1>u2 || v1>v2) return;\n\
+\n\
+    z0 = a[0][2];\n\
+    z1 = a[1][2]-z0;\n\
+    z2 = a[2][2]-z0;\n\
+\n\
+    z0 = (z0-z_1)*ratio_z;\n\
+    z1 = z1*ratio_z;\n\
+    z2 = z2*ratio_z;\n\
+\n\
+    delta = (a[1][0]-a[0][0])*(a[2][1]-a[0][1]) \n\
+                      - (a[1][1]-a[0][1])*(a[2][0]-a[0][0]);\n\
+    if (fabs(delta)<1E-5) return;\n\
+    \n\
+    delta=1/delta;\n\
+    ca = (a[2][1]-a[0][1])*delta;\n\
+    cb = (a[0][0]-a[2][0])*delta;\n\
+    cc = (a[0][1]-a[1][1])*delta;\n\
+    cd = (a[1][0]-a[0][0])*delta;\n\
+    adds = ca*ratio_x;\n\
+    addt = cc*ratio_x;\n\
+\n\
+    for(l=v1; l<=v2; l++) \n\
+      {\n\
+      x = x_1 + u1*ratio_x - a[0][0];\n\
+      y = y_2 - l*ratio_y - a[0][1];\n\
+      s = ca*x + cb*y;\n\
+      t = cc*x + cd*y;\n\
+      for(k=u1; k<=u2; k++)\n\
+	{\n\
+        if (s>=-0.0001 && t>=-0.0001 && s+t<=1.0001)\n\
+	  {\n\
+          m = (int) (z0 + s*z1 + t*z2);\n\
+          if (m<0) m=0;\n\
+          if (m>COLOREXTEN) m=COLOREXTEN;\n\
+          if (m>pixel_color[k][l]) pixel_color[k][l] = m;\n\
+	  }\n\
+        s = s + adds;\n\
+        t = t + addt;\n\
+        }\n\
+      }\n\
+}\n\
+\n\
+void build(BFunction bfunct)\n\
+{\n\
+   do_init_image();\n\
+   bfunct();\n\
+}\n\
+\n\
+void light(ZFunction zfunct)\n\
+{\n\
+int i, j;\n\
+int k;\n\
+double x,y;\n\
+\n\
+   do_init_image();\n\
+\n\
+   for(j=0; j<HEIGHT; j++) \n\
+   {\n\
+     y = y_2-ratio_y*j;\n\
+     for(i=0; i<WIDTH; i++)\n\
+     {\n\
+        x = ratio_x*i+x_1;\n\
+        k = (int)((zfunct(x,y)-z_1)*ratio_z);\n\
+        if (k<0) k=0;\n\
+        if (k>COLOREXTEN) k=COLOREXTEN;\n\
+        if (k>pixel_color[i][j]) pixel_color[i][j] = k;\n\
+     }\n\
+   }\n\
+}\n\
+\n\
+void graph(PFunction pfunct, double xi, double xs, int nx, \n\
+                             double yi, double ys, int ny)\n\
+{\n\
+int i, j, l;\n\
+double hx,hy;\n\
+point p[4];\n\
+\n\
+   if(nx<=0 || ny<=0) return;\n\
+\n\
+   do_init_image();\n\
+\n\
+   hx = (xs-xi)/nx;\n\
+   hy = (ys-yi)/ny;\n\
+\n\
+   for(j=0; j<ny; j++) \n\
+     {\n\
+     for(l=0; l<=1; l++)\n\
+         pfunct(p[l],xi,yi+(j+l)*hy);\n\
+\n\
+     for(i=1; i<=nx; i++)\n\
+         {\n\
+         setpoint(p[2],p[0]); setpoint(p[3],p[1]); \n\
+         for(l=0; l<=1; l++)\n\
+            pfunct(p[l], xi+i*hx,yi+(j+l)*hy);\n\
+         mesh(p,0,1,2); mesh(p,1,2,3);\n\
+         }\n\
+     }\n\
+}\n\
+\n\
+int main(int argc, char **argv)\n\
+{\n\
+int i, j;\n\
+\n\
+   %s\n\
+\n\
+   printf(\"P6\\n# CREATOR: sis\\n\");\n\
+   printf(\" %%d %%d %%d\\n\", WIDTH, HEIGHT, COLORDEPTH);\n\
+\n\
+   for(j=0; j<HEIGHT; j++) for(i=0; i<WIDTH; i++)\n\
+     {\n\
+     int k=pixel_color[i][j]/3;\n\
+     int l=pixel_color[i][j] - 3*k;\n\
+     int m=0;\n\
+     if (l==2) {l=1; m=1;}\n\
+     printf(\"%%c%%c%%c\", k, k+l, k+m);\n\
+     }\n\
+}\n\
 ",
 COLORDEPTH,
 COLOREXTEN,
openSUSE Build Service is sponsored by