2 * PostScript clipping functions
4 * Copyright 1999 Luc Tourangau
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "wine/debug.h"
25 WINE_DEFAULT_DEBUG_CHANNEL(psdrv
);
27 /***********************************************************************
30 void PSDRV_AddClip( PHYSDEV dev
, HRGN hrgn
)
32 CHAR szArrayName
[] = "clippath";
35 DWORD i
, size
= GetRegionData(hrgn
, 0, NULL
);
38 if (!(data
= HeapAlloc( GetProcessHeap(), 0, size
))) return;
39 GetRegionData( hrgn
, size
, data
);
40 rect
= (RECT
*)data
->Buffer
;
42 switch (data
->rdh
.nCount
)
45 /* set an empty clip path. */
46 PSDRV_WriteRectClip(dev
, 0, 0, 0, 0);
49 /* optimize when it is a simple region */
50 PSDRV_WriteRectClip(dev
, rect
->left
, rect
->top
,
51 rect
->right
- rect
->left
, rect
->bottom
- rect
->top
);
54 PSDRV_WriteArrayDef(dev
, szArrayName
, data
->rdh
.nCount
* 4);
55 for (i
= 0; i
< data
->rdh
.nCount
; i
++, rect
++)
57 PSDRV_WriteArrayPut(dev
, szArrayName
, i
* 4, rect
->left
);
58 PSDRV_WriteArrayPut(dev
, szArrayName
, i
* 4 + 1, rect
->top
);
59 PSDRV_WriteArrayPut(dev
, szArrayName
, i
* 4 + 2, rect
->right
- rect
->left
);
60 PSDRV_WriteArrayPut(dev
, szArrayName
, i
* 4 + 3, rect
->bottom
- rect
->top
);
62 PSDRV_WriteRectClip2(dev
, szArrayName
);
65 HeapFree( GetProcessHeap(), 0, data
);
68 /***********************************************************************
71 * The idea here is that every graphics operation should bracket
72 * output in PSDRV_SetClip/ResetClip calls. The clip path outside
73 * these calls will be empty; the reason for this is that it is
74 * impossible in PostScript to cleanly make the clip path larger than
75 * the current one. Also Photoshop assumes that despite having set a
76 * small clip area in the printer dc that it can still write raw
77 * PostScript to the driver and expect this code not to be clipped.
79 void PSDRV_SetClip( PHYSDEV dev
)
81 PSDRV_PDEVICE
*physDev
= get_psdrv_dev( dev
);
84 TRACE("hdc=%p\n", dev
->hdc
);
86 if(physDev
->pathdepth
) {
87 TRACE("inside a path, so not clipping\n");
91 hrgn
= CreateRectRgn(0, 0, 0, 0);
92 if (GetRandomRgn(dev
->hdc
, hrgn
, 3) == 1) /* clip && meta */
94 PSDRV_WriteGSave(dev
);
95 PSDRV_AddClip( dev
, hrgn
);
101 /***********************************************************************
104 void PSDRV_ResetClip( PHYSDEV dev
)
106 PSDRV_PDEVICE
*physDev
= get_psdrv_dev( dev
);
109 if (physDev
->pathdepth
) return;
111 hrgn
= CreateRectRgn(0, 0, 0, 0);
112 if (GetRandomRgn(dev
->hdc
, hrgn
, 3) == 1) /* clip && meta */
113 PSDRV_WriteGRestore(dev
);