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