Currently we get mono color in postscript output of "smooth" style
3D drawings.

That's caused by "GSetForeground" before "GDrawPoint".
"GSetForeground" can only set gray scale.

Luckily the all four usage of "GDrawPoint" are all for the purpose
of generating "smooth" style image.  So this change will not break
anywhere else.

So I decode color and use "setrgbcolor" for it and remove
"installGC" from "drawpoint.ps" because that's responsible for
setting the grey color.

- Qian

--
You received this message because you are subscribed to the Google Groups "FriCAS - 
computer algebra system" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to fricas-devel+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/fricas-devel/32851d37-cad8-4a06-a69f-aa5090c07325%40gmail.com.
diff --git a/src/graph/Gdraws/Gfun.c b/src/graph/Gdraws/Gfun.c
index a4a3bb01..6fd0116d 100644
--- a/src/graph/Gdraws/Gfun.c
+++ b/src/graph/Gdraws/Gfun.c
@@ -425,6 +425,7 @@ int
 GDrawPoint(
            Window wid,          /* window id */
            GC gc,               /* graphics context */
+           int color,           /* color is represented as 0xRRGGBB */
            int x0, int y0, int dFlag)
 {
   int s = 0;
@@ -444,8 +445,14 @@ GDrawPoint(
       }
 
       psData[drawpointps].flag = yes;     /* sets procedure flag */
-      fprintf(fp, "\t%s\t%d\t%d\t%d\t%d\tpsDrawPoint\n",
-              PSfindGC(gc), x0, y0, x0 + 1, y0 + 1);
+
+      float r = ((color & 0xFF0000) >> 16) / 255.0;
+      float g = ((color & 0x00FF00) >> 8) / 255.0;
+      float b = (color & 0x0000FF) / 255.0;
+      fprintf(fp, "\t%f\t%f\t%f\tsetrgbcolor\n", r, g, b);
+      fprintf(fp, "\t%d\t%d\t%d\t%d\tpsDrawPoint\n",
+              x0, y0, x0 + 1, y0 + 1);
+
       s = fclose(fp);
     }
     break;
diff --git a/src/graph/Gdraws/ps_files/drawpoint.ps b/src/graph/Gdraws/ps_files/drawpoint.ps
index 1850f08a..1981e1ad 100644
--- a/src/graph/Gdraws/ps_files/drawpoint.ps
+++ b/src/graph/Gdraws/ps_files/drawpoint.ps
@@ -3,7 +3,7 @@
                 newpath
                 yVal moveto
                 yVal lineto
-                begin installGC stroke end       %%fills with foreground color
+                stroke
                 grestore }
         def
 
diff --git a/src/graph/include/Gfun.H1 b/src/graph/include/Gfun.H1
index b3993d99..702ce7be 100644
--- a/src/graph/include/Gfun.H1
+++ b/src/graph/include/Gfun.H1
@@ -5,7 +5,7 @@ extern int GDrawImageString(GC, Window, int, int, char *, int, int);
 extern int GDrawArc(GC, Window, int, int, unsigned int, unsigned int, int, int, int);
 extern int GDrawLine(GC, Window, int, int, int, int, int);
 extern int GDrawLines(GC, Window, XPoint *, int, int, int);
-extern int GDrawPoint(Window, GC, int, int, int);
+extern int GDrawPoint(Window, GC, int, int, int, int);
 extern int GDrawString(GC, Window, int, int, char *, int, int);
 extern int GFillArc(GC, Window, int, int, unsigned int, unsigned int, int, int, int);
 extern int PSGlobalInit(void);
diff --git a/src/graph/view3D/smoothShade3d.c b/src/graph/view3D/smoothShade3d.c
index 51761863..7e80157a 100644
--- a/src/graph/view3D/smoothShade3d.c
+++ b/src/graph/view3D/smoothShade3d.c
@@ -133,7 +133,7 @@ drawPhongSpan(triple pt,float N[3],int dFlag)
       put_cBuffer_axes(xpixel,'0');
       put_zBuffer(xpixel,zC);
       /* if mono (bw dsply) do black and white semi-random dithering */
-      if (mono || (dFlag == PSoption) || viewport->monoOn) {
+      if (mono || viewport->monoOn) {
         if (get_random() < 100.0*exp((double)-1.3*(pi_sq*(col-.2)*(col-.2))))  {
           put_cBuffer_indx(xpixel,black);
         } else {
@@ -649,8 +649,8 @@ scanLines(int dFlag)
             else pixColor = boxInline;
             if (i >=0 && i<vwInfo.width) XPutPixel(imageX,i,0,pixColor);
           } else {
-            GSetForeground(GC9991, psBlack, dFlag );
-            GDrawPoint(viewport->viewWindow, GC9991, i,scanline,dFlag);
+            GDrawPoint(viewport->viewWindow, GC9991,
+                       (int) psBlack, i, scanline, dFlag);
           }
         }
       }
@@ -662,8 +662,8 @@ scanLines(int dFlag)
             else pixColor = clipBoxInline;
             if (i >=0 && i<vwInfo.width) XPutPixel(imageX,i,0,pixColor);
           } else {
-            GSetForeground(GC9991, psBlack, dFlag );
-            GDrawPoint(viewport->viewWindow, GC9991, i,scanline,dFlag);
+            GDrawPoint(viewport->viewWindow, GC9991,
+                       (int) psBlack, i, scanline, dFlag);
           }
         }
       }
@@ -675,8 +675,8 @@ scanLines(int dFlag)
             else pixColor = monoColor(axesColor);
             if (i >=0 && i<vwInfo.width)  XPutPixel(imageX,i,0,pixColor);
           } else {
-            GSetForeground(GC9991,psBlack,dFlag);
-            GDrawPoint(viewport->viewWindow, GC9991, i,scanline,dFlag);
+            GDrawPoint(viewport->viewWindow, GC9991,
+                       (int) psBlack, i, scanline, dFlag);
           }
         } /* if buffer slot is an axes point */
         tempA = get_cBuffer_axes(i);
@@ -689,8 +689,8 @@ scanLines(int dFlag)
           if (i >=0 && i<vwInfo.width) XPutPixel(imageX,i,0,pixColor);
         }
         else {
-          GSetForeground(GC9991,(float)get_cBuffer_indx(i),dFlag);
-          GDrawPoint(viewport->viewWindow, GC9991, i,scanline,dFlag);
+          GDrawPoint(viewport->viewWindow, GC9991,
+                     get_cBuffer_indx(i), i, scanline, dFlag);
         }
       }
     } /* for each pixel in scanline */

Reply via email to