Fixed a couple of WINAPI issues with 16-bit spec files (thanks to
[wine] / dlls / wineps / color.c
1 /*
2  *      PostScript colour functions
3  *
4  *      Copyright 1998  Huw D M Davies
5  *
6  */
7
8 #include "psdrv.h"
9 #include "debugtools.h"
10
11 DEFAULT_DEBUG_CHANNEL(psdrv)
12
13 /**********************************************************************
14  *           PSDRV_CmpColor
15  *
16  * Return TRUE if col1 == col2
17  */ 
18 BOOL PSDRV_CmpColor(PSCOLOR *col1, PSCOLOR *col2)
19 {
20     if(col1->type != col2->type)
21         return FALSE;
22
23     switch(col1->type) {
24     case PSCOLOR_GRAY:
25         if(col1->value.gray.i == col2->value.gray.i)
26             return TRUE;
27         break;
28     case PSCOLOR_RGB:
29         if( col1->value.rgb.r == col2->value.rgb.r &&
30             col1->value.rgb.g == col2->value.rgb.g &&
31             col1->value.rgb.b == col2->value.rgb.b )
32             return TRUE;
33         break;
34     default:
35         ERR("Unknown colour type %d\n", col1->type);
36     }
37     return FALSE;
38 }
39
40
41 /**********************************************************************
42  *           PSDRV_CopyColor
43  *
44  * Copies col2 into col1. Return FALSE on error.
45  */ 
46 BOOL PSDRV_CopyColor(PSCOLOR *col1, PSCOLOR *col2)
47 {
48
49     switch(col2->type) {
50     case PSCOLOR_GRAY:
51         col1->value.gray.i = col2->value.gray.i;
52         break;
53
54     case PSCOLOR_RGB:
55         col1->value.rgb.r = col2->value.rgb.r;
56         col1->value.rgb.g = col2->value.rgb.g;
57         col1->value.rgb.b = col2->value.rgb.b;
58         break;
59
60     default:
61         ERR("Unknown colour type %d\n", col1->type);
62         return FALSE;
63     }
64
65     col1->type = col2->type;
66     return TRUE;
67 }
68
69
70 /**********************************************************************
71  *           PSDRV_CreateColor
72  *
73  * Creates a PostScript colour from a COLORREF.
74  * Result is grey scale if ColorDevice field of ppd is FALSE else an
75  * rgb colour is produced.
76  */
77 void PSDRV_CreateColor( PSDRV_PDEVICE *physDev, PSCOLOR *pscolor,
78                      COLORREF wincolor )
79 {
80     int ctype = wincolor >> 24;
81     float r, g, b;
82
83     if(ctype != 0 && ctype != 2)
84         FIXME("Colour is %08lx\n", wincolor);
85
86     r = (wincolor & 0xff) / 256.0;
87     g = ((wincolor >> 8) & 0xff) / 256.0;
88     b = ((wincolor >> 16) & 0xff) / 256.0;
89
90     if(physDev->pi->ppd->ColorDevice) {
91         pscolor->type = PSCOLOR_RGB;
92         pscolor->value.rgb.r = r;
93         pscolor->value.rgb.g = g;
94         pscolor->value.rgb.b = b;
95     } else {
96         pscolor->type = PSCOLOR_GRAY;
97         /* FIXME configurable */
98         pscolor->value.gray.i = r * 0.3 + g * 0.59 + b * 0.11;
99     }
100     return;
101 }
102
103
104 /***********************************************************************
105  *           PSDRV_SetBkColor
106  */
107 COLORREF PSDRV_SetBkColor( DC *dc, COLORREF color )
108 {
109     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
110     COLORREF oldColor;
111
112     oldColor = dc->w.backgroundColor;
113     dc->w.backgroundColor = color;
114
115     PSDRV_CreateColor(physDev, &physDev->bkColor, color);
116
117     return oldColor;
118 }
119
120
121 /***********************************************************************
122  *           PSDRV_SetTextColor
123  */
124 COLORREF PSDRV_SetTextColor( DC *dc, COLORREF color )
125 {
126     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
127     COLORREF oldColor;
128
129     oldColor = dc->w.textColor;
130     dc->w.textColor = color;
131
132     PSDRV_CreateColor(physDev, &physDev->font.color, color);
133     physDev->font.set = FALSE;
134     return oldColor;
135 }
136