wined3d: Optimize render states in the stateblock.
[wine] / dlls / wineps.drv / color.c
1 /*
2  *      PostScript colour functions
3  *
4  *      Copyright 1998  Huw D M Davies
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "psdrv.h"
22 #include "wine/debug.h"
23
24 WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
25
26 /**********************************************************************
27  *           PSDRV_CmpColor
28  *
29  * Return TRUE if col1 == col2
30  */
31 BOOL PSDRV_CmpColor(PSCOLOR *col1, PSCOLOR *col2)
32 {
33     if(col1->type != col2->type)
34         return FALSE;
35
36     switch(col1->type) {
37     case PSCOLOR_GRAY:
38         if(col1->value.gray.i == col2->value.gray.i)
39             return TRUE;
40         break;
41     case PSCOLOR_RGB:
42         if( col1->value.rgb.r == col2->value.rgb.r &&
43             col1->value.rgb.g == col2->value.rgb.g &&
44             col1->value.rgb.b == col2->value.rgb.b )
45             return TRUE;
46         break;
47     default:
48         ERR("Unknown colour type %d\n", col1->type);
49     }
50     return FALSE;
51 }
52
53
54 /**********************************************************************
55  *           PSDRV_CopyColor
56  *
57  * Copies col2 into col1. Return FALSE on error.
58  */
59 BOOL PSDRV_CopyColor(PSCOLOR *col1, PSCOLOR *col2)
60 {
61
62     switch(col2->type) {
63     case PSCOLOR_GRAY:
64         col1->value.gray.i = col2->value.gray.i;
65         break;
66
67     case PSCOLOR_RGB:
68         col1->value.rgb.r = col2->value.rgb.r;
69         col1->value.rgb.g = col2->value.rgb.g;
70         col1->value.rgb.b = col2->value.rgb.b;
71         break;
72
73     default:
74         ERR("Unknown colour type %d\n", col1->type);
75         return FALSE;
76     }
77
78     col1->type = col2->type;
79     return TRUE;
80 }
81
82
83 /**********************************************************************
84  *           PSDRV_CreateColor
85  *
86  * Creates a PostScript colour from a COLORREF.
87  * Result is grey scale if ColorDevice field of ppd is CD_False else an
88  * rgb colour is produced.
89  */
90 void PSDRV_CreateColor( PSDRV_PDEVICE *physDev, PSCOLOR *pscolor,
91                      COLORREF wincolor )
92 {
93     int ctype = wincolor >> 24;
94     float r, g, b;
95
96     if(ctype != 0 && ctype != 2)
97         FIXME("Colour is %08x\n", wincolor);
98
99     r = (wincolor & 0xff) / 256.0;
100     g = ((wincolor >> 8) & 0xff) / 256.0;
101     b = ((wincolor >> 16) & 0xff) / 256.0;
102
103     if(physDev->pi->ppd->ColorDevice != CD_False) {
104         pscolor->type = PSCOLOR_RGB;
105         pscolor->value.rgb.r = r;
106         pscolor->value.rgb.g = g;
107         pscolor->value.rgb.b = b;
108     } else {
109         pscolor->type = PSCOLOR_GRAY;
110         /* FIXME configurable */
111         pscolor->value.gray.i = r * 0.3 + g * 0.59 + b * 0.11;
112     }
113     return;
114 }
115
116
117 /***********************************************************************
118  *           PSDRV_SetBkColor
119  */
120 COLORREF PSDRV_SetBkColor( PSDRV_PDEVICE *physDev, COLORREF color )
121 {
122     PSDRV_CreateColor(physDev, &physDev->bkColor, color);
123     return color;
124 }
125
126
127 /***********************************************************************
128  *           PSDRV_SetTextColor
129  */
130 COLORREF PSDRV_SetTextColor( PSDRV_PDEVICE *physDev, COLORREF color )
131 {
132     PSDRV_CreateColor(physDev, &physDev->font.color, color);
133     physDev->font.set = FALSE;
134     return color;
135 }