Fixed error handling in DGA_IDirectDraw2Impl_GetCaps().
[wine] / graphics / psdrv / 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 "debug.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->w.hPen;
26     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
27
28     TRACE(psdrv, "hpen = %08x colour = %08lx\n", hpen, pen->logpen.lopnColor);
29     dc->w.hPen = hpen;
30
31     physDev->pen.width = XLSTODS(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
37     if(physDev->pen.width > 1) { /* dashes only for 0 or 1 pixel pens */
38         physDev->pen.dash = NULL;
39     } else {
40         switch(pen->logpen.lopnStyle & PS_STYLE_MASK) {
41         case PS_DASH:
42             physDev->pen.dash = PEN_dash;
43             break;
44
45         case PS_DOT:
46             physDev->pen.dash = PEN_dot;
47             break;
48
49         case PS_DASHDOT:
50             physDev->pen.dash = PEN_dashdot;
51             break;
52
53         case PS_DASHDOTDOT:
54             physDev->pen.dash = PEN_dashdotdot;
55             break;
56
57         case PS_ALTERNATE:
58             physDev->pen.dash = PEN_alternate;
59             break;
60
61         default:
62             physDev->pen.dash = NULL;
63             break;
64         }
65     }
66
67     physDev->pen.set = FALSE;
68     return prevpen;
69 }
70
71
72 /**********************************************************************
73  *
74  *      PSDRV_SetPen
75  *
76  */
77 BOOL PSDRV_SetPen(DC *dc)
78 {
79     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
80
81     PSDRV_WriteSetColor(dc, &physDev->pen.color);
82
83     if(!physDev->pen.set) {
84         PSDRV_WriteSetPen(dc);
85         physDev->pen.set = TRUE;
86     }
87
88     return TRUE;
89 }
90
91