- implementation of SetDeviceClipping
- coordinate system origin fix

diff --git a/graphics/psdrv/Makefile.in b/graphics/psdrv/Makefile.in
index 5bd5ed1..f55dbcd 100644
--- a/graphics/psdrv/Makefile.in
+++ b/graphics/psdrv/Makefile.in
@@ -10,6 +10,7 @@
 	bitblt.c \
 	bitmap.c \
 	brush.c \
+	clipping.c \
 	color.c \
 	driver.c \
 	escape.c \
diff --git a/graphics/psdrv/clipping.c b/graphics/psdrv/clipping.c
new file mode 100644
index 0000000..091b3bd
--- /dev/null
+++ b/graphics/psdrv/clipping.c
@@ -0,0 +1,51 @@
+/*
+ *	PostScript clipping functions
+ *
+ *	Copyright 1999  Luc Tourangau 
+ *
+ */
+
+#include "gdi.h"
+#include "psdrv.h"
+#include "region.h"
+#include "debugtools.h"
+
+DEFAULT_DEBUG_CHANNEL(psdrv)
+
+/***********************************************************************
+ *           PSDRV_SetDeviceClipping
+ */
+VOID PSDRV_SetDeviceClipping( DC *dc )
+{
+    CHAR szArrayName[] = "clippath";
+    RGNOBJ *obj = (RGNOBJ *)GDI_GetObjPtr(dc->w.hGCClipRgn, REGION_MAGIC);
+    if (!obj)
+    {
+        ERR_(psdrv)("Rgn is 0. Please report this.\n");
+	return;
+    }
+
+    TRACE_(psdrv)("dc=%p", dc);
+    
+    if (obj->rgn->numRects > 0)
+    {
+        INT i;
+        RECT *pRect = obj->rgn->rects;
+
+        PSDRV_WriteArrayDef(dc, szArrayName, obj->rgn->numRects * 4);
+
+        for (i = 0; i < obj->rgn->numRects; i++, pRect++)
+        {
+            PSDRV_WriteArrayPut(dc, szArrayName, i * 4,
+                                pRect->left);
+            PSDRV_WriteArrayPut(dc, szArrayName, i * 4 + 1,
+                                pRect->top);
+            PSDRV_WriteArrayPut(dc, szArrayName, i * 4 + 2, 
+                                pRect->right - pRect->left);
+            PSDRV_WriteArrayPut(dc, szArrayName, i * 4 + 3, 
+                                pRect->bottom - pRect->top);
+        }
+    }
+    
+    PSDRV_WriteRectClip(dc, szArrayName);
+}
diff --git a/graphics/psdrv/init.c b/graphics/psdrv/init.c
index b02e372..cf6bf28 100644
--- a/graphics/psdrv/init.c
+++ b/graphics/psdrv/init.c
@@ -149,10 +149,9 @@
 /* dmDriverVersion */	0x001,
 /* dmSize */		sizeof(DEVMODEA),
 /* dmDriverExtra */	0,
-/* dmFields */		DM_ORIENTATION | DM_PAPERSIZE | DM_PAPERLENGTH |
-			DM_PAPERWIDTH | DM_SCALE | DM_COPIES | 
-			DM_DEFAULTSOURCE | DM_COLOR | DM_DUPLEX | 
-			DM_YRESOLUTION | DM_TTOPTION,
+/* dmFields */		DM_ORIENTATION | DM_PAPERSIZE | DM_SCALE | 
+			DM_COPIES | DM_DEFAULTSOURCE | DM_COLOR | 
+			DM_DUPLEX | DM_YRESOLUTION | DM_TTOPTION,
    { /* u1 */
      { /* s1 */
 /* dmOrientation */	DMORIENT_PORTRAIT,
diff --git a/graphics/psdrv/ps.c b/graphics/psdrv/ps.c
index 3a5d275..01394d4 100644
--- a/graphics/psdrv/ps.c
+++ b/graphics/psdrv/ps.c
@@ -161,12 +161,24 @@
 static char pseoclip[] =
 "eoclip\n";
 
+static char psrectclip[] =
+"%s rectclip\n"; 
+
 static char pshatch[] =
 "hatch\n";
 
 static char psrotate[] = /* ang */
 "%.1f rotate\n";
 
+static char psarrayget[] = 
+"%s %d get\n";
+
+static char psarrayput[] = 
+"%s %d %ld put\n";
+
+static char psarraydef[] = 
+"/%s %d array def\n";
+
 char *PSDRV_ANSIVector[256] = {
 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0x00 */
 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
@@ -552,9 +564,6 @@
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
     char buf[256];
 
-    if(PSDRV_CmpColor(&physDev->inkColor, color))
-        return TRUE;
-
     PSDRV_CopyColor(&physDev->inkColor, color);
     switch(color->type) {
     case PSCOLOR_RGB:
@@ -880,6 +889,38 @@
     return TRUE;
 }
 
+BOOL PSDRV_WriteArrayGet(DC *dc, CHAR *pszArrayName, INT nIndex)
+{
+    char buf[100];
+
+    sprintf(buf, psarrayget, pszArrayName, nIndex);
+    return PSDRV_WriteSpool(dc, buf, strlen(buf));
+}
+
+BOOL PSDRV_WriteArrayPut(DC *dc, CHAR *pszArrayName, INT nIndex, LONG lObject)
+{
+    char buf[100];
+
+    sprintf(buf, psarrayput, pszArrayName, nIndex, lObject);
+    return PSDRV_WriteSpool(dc, buf, strlen(buf));
+}
+
+BOOL PSDRV_WriteArrayDef(DC *dc, CHAR *pszArrayName, INT nSize)
+{
+    char buf[100];
+
+    sprintf(buf, psarraydef, pszArrayName, nSize);
+    return PSDRV_WriteSpool(dc, buf, strlen(buf));
+}
+
+BOOL PSDRV_WriteRectClip(DC *dc, CHAR *pszArrayName)
+{
+    char buf[100];
+
+    sprintf(buf, psrectclip, pszArrayName);
+    return PSDRV_WriteSpool(dc, buf, strlen(buf));
+}
+
 
 BOOL PSDRV_WritePatternDict(DC *dc, BITMAP *bm, BYTE *bits)
 {