Added an unknown VxD error code.
[wine] / dlls / wineps / pen.c
1 /*
2  *      PostScript pen handling
3  *
4  *      Copyright 1998  Huw D M Davies
5  *
6  */
7
8 #include "pen.h"
9 #include "psdrv.h"
10 #include "debugtools.h"
11
12 DEFAULT_DEBUG_CHANNEL(psdrv);
13
14 static char PEN_dash[]       = "50 30";     /* -----   -----   -----  */
15 static char PEN_dot[]        = "20";      /* --  --  --  --  --  -- */
16 static char PEN_dashdot[]    = "40 30 20 30";  /* ----   --   ----   --  */
17 static char PEN_dashdotdot[] = "40 20 20 20 20 20"; /* ----  --  --  ----  */
18 static char PEN_alternate[]  = "1";
19
20 /***********************************************************************
21  *           PSDRV_PEN_SelectObject
22  */
23 extern HPEN PSDRV_PEN_SelectObject( DC * dc, HPEN hpen, PENOBJ * pen )
24 {
25     HPEN prevpen = dc->hPen;
26     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
27
28     TRACE("hpen = %08x colour = %08lx\n", hpen, pen->logpen.lopnColor);
29     dc->hPen = hpen;
30
31     physDev->pen.width = INTERNAL_XWSTODS(dc, pen->logpen.lopnWidth.x);
32     if(physDev->pen.width < 0)
33         physDev->pen.width = -physDev->pen.width;
34
35     PSDRV_CreateColor(physDev, &physDev->pen.color, pen->logpen.lopnColor);
36     physDev->pen.style = pen->logpen.lopnStyle & PS_STYLE_MASK;
37  
38     switch(physDev->pen.style) {
39     case PS_DASH:
40         physDev->pen.dash = PEN_dash;
41         break;
42
43     case PS_DOT:
44         physDev->pen.dash = PEN_dot;
45         break;
46
47     case PS_DASHDOT:
48         physDev->pen.dash = PEN_dashdot;
49         break;
50
51     case PS_DASHDOTDOT:
52         physDev->pen.dash = PEN_dashdotdot;
53         break;
54
55     case PS_ALTERNATE:
56         physDev->pen.dash = PEN_alternate;
57         break;
58
59     default:
60         physDev->pen.dash = NULL;
61     }       
62
63     if ((physDev->pen.width > 1) && (physDev->pen.dash != NULL)) {
64         physDev->pen.style = PS_SOLID;
65          physDev->pen.dash = NULL;
66     } 
67
68     physDev->pen.set = FALSE;
69     return prevpen;
70 }
71
72
73 /**********************************************************************
74  *
75  *      PSDRV_SetPen
76  *
77  */
78 BOOL PSDRV_SetPen(DC *dc)
79 {
80     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
81
82     if (physDev->pen.style != PS_NULL) {
83         PSDRV_WriteSetColor(dc, &physDev->pen.color);
84         
85         if(!physDev->pen.set) {
86             PSDRV_WriteSetPen(dc);
87             physDev->pen.set = TRUE;
88         }    
89     }
90
91     return TRUE;
92 }