/*
 *	PostScript pen handling
 *
 *	Copyright 1998  Huw D M Davies
 *
 */

#include "pen.h"
#include "psdrv.h"
#include "debugtools.h"

DEFAULT_DEBUG_CHANNEL(psdrv)

static char PEN_dash[]       = "50 30";     /* -----   -----   -----  */
static char PEN_dot[]        = "20";      /* --  --  --  --  --  -- */
static char PEN_dashdot[]    = "40 30 20 30";  /* ----   --   ----   --  */
static char PEN_dashdotdot[] = "40 20 20 20 20 20"; /* ----  --  --  ----  */
static char PEN_alternate[]  = "1";

/***********************************************************************
 *           PSDRV_PEN_SelectObject
 */
extern HPEN PSDRV_PEN_SelectObject( DC * dc, HPEN hpen, PENOBJ * pen )
{
    HPEN prevpen = dc->w.hPen;
    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;

    TRACE("hpen = %08x colour = %08lx\n", hpen, pen->logpen.lopnColor);
    dc->w.hPen = hpen;

    physDev->pen.width = XLSTODS(dc, pen->logpen.lopnWidth.x);
    if(physDev->pen.width < 0)
        physDev->pen.width = -physDev->pen.width;

    PSDRV_CreateColor(physDev, &physDev->pen.color, pen->logpen.lopnColor);

    if(physDev->pen.width > 1) { /* dashes only for 0 or 1 pixel pens */
        physDev->pen.dash = NULL;
    } else {
        switch(pen->logpen.lopnStyle & PS_STYLE_MASK) {
	case PS_DASH:
	    physDev->pen.dash = PEN_dash;
	    break;

	case PS_DOT:
	    physDev->pen.dash = PEN_dot;
	    break;

	case PS_DASHDOT:
	    physDev->pen.dash = PEN_dashdot;
	    break;

	case PS_DASHDOTDOT:
            physDev->pen.dash = PEN_dashdotdot;
	    break;

	case PS_ALTERNATE:
            physDev->pen.dash = PEN_alternate;
	    break;

	default:
            physDev->pen.dash = NULL;
	    break;
	}
    }

    physDev->pen.set = FALSE;
    return prevpen;
}


/**********************************************************************
 *
 *	PSDRV_SetPen
 *
 */
BOOL PSDRV_SetPen(DC *dc)
{
    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;

    PSDRV_WriteSetColor(dc, &physDev->pen.color);

    if(!physDev->pen.set) {
        PSDRV_WriteSetPen(dc);
	physDev->pen.set = TRUE;
    }

    return TRUE;
}


