/*
 *	PostScript clipping functions
 *
 *	Copyright 1999  Luc Tourangau 
 *
 */

#include "gdi.h"
#include "psdrv.h"
#include "debugtools.h"
#include "winbase.h"

DEFAULT_DEBUG_CHANNEL(psdrv)

/***********************************************************************
 *           PSDRV_SetDeviceClipping
 */
VOID PSDRV_SetDeviceClipping( DC *dc )
{
    CHAR szArrayName[] = "clippath";
    DWORD size;
    RGNDATA *rgndata;

    TRACE("hdc=%04x\n", dc->hSelf);

    if (dc->w.hGCClipRgn == 0) {
        ERR("Rgn is 0. Please report this.\n");
	return;
    }

    size = GetRegionData(dc->w.hGCClipRgn, 0, NULL);
    if(!size) {
        ERR("Invalid region\n");
	return;
    }

    rgndata = HeapAlloc( GetProcessHeap(), 0, size );
    if(!rgndata) {
        ERR("Can't allocate buffer\n");
	return;
    }

    GetRegionData(dc->w.hGCClipRgn, size, rgndata);

    if (rgndata->rdh.nCount > 0)
    {
        INT i;
        RECT *pRect = (RECT *)rgndata->Buffer;

        PSDRV_WriteArrayDef(dc, szArrayName, rgndata->rdh.nCount * 4);

        for (i = 0; i < rgndata->rdh.nCount; 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);
    HeapFree( GetProcessHeap(), 0, rgndata );
    return;
}
