- 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)
{