comctl32/rebar: Don't try to access band data before it's needed.
[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 /**********************************************************************
28  *           PSDRV_CopyColor
29  *
30  * Copies col2 into col1. Return FALSE on error.
31  */
32 BOOL PSDRV_CopyColor(PSCOLOR *col1, PSCOLOR *col2)
33 {
34
35     switch(col2->type) {
36     case PSCOLOR_GRAY:
37         col1->value.gray.i = col2->value.gray.i;
38         break;
39
40     case PSCOLOR_RGB:
41         col1->value.rgb.r = col2->value.rgb.r;
42         col1->value.rgb.g = col2->value.rgb.g;
43         col1->value.rgb.b = col2->value.rgb.b;
44         break;
45
46     default:
47         ERR("Unknown colour type %d\n", col1->type);
48         return FALSE;
49     }
50
51     col1->type = col2->type;
52     return TRUE;
53 }
54
55
56 /**********************************************************************
57  *           PSDRV_CreateColor
58  *
59  * Creates a PostScript colour from a COLORREF.
60  * Result is grey scale if ColorDevice field of ppd is CD_False else an
61  * rgb colour is produced.
62  */
63 void PSDRV_CreateColor( PSDRV_PDEVICE *physDev, PSCOLOR *pscolor,
64                      COLORREF wincolor )
65 {
66     int ctype = wincolor >> 24;
67     float r, g, b;
68
69     if(ctype != 0 && ctype != 2)
70         FIXME("Colour is %08x\n", wincolor);
71
72     r = (wincolor & 0xff) / 256.0;
73     g = ((wincolor >> 8) & 0xff) / 256.0;
74     b = ((wincolor >> 16) & 0xff) / 256.0;
75
76     if(physDev->pi->ppd->ColorDevice != CD_False) {
77         pscolor->type = PSCOLOR_RGB;
78         pscolor->value.rgb.r = r;
79         pscolor->value.rgb.g = g;
80         pscolor->value.rgb.b = b;
81     } else {
82         pscolor->type = PSCOLOR_GRAY;
83         /* FIXME configurable */
84         pscolor->value.gray.i = r * 0.3 + g * 0.59 + b * 0.11;
85     }
86     return;
87 }
88
89
90 /***********************************************************************
91  *           PSDRV_SetBkColor
92  */
93 COLORREF CDECL PSDRV_SetBkColor( PSDRV_PDEVICE *physDev, COLORREF color )
94 {
95     PSDRV_CreateColor(physDev, &physDev->bkColor, color);
96     return color;
97 }
98
99
100 /***********************************************************************
101  *           PSDRV_SetTextColor
102  */
103 COLORREF CDECL PSDRV_SetTextColor( PSDRV_PDEVICE *physDev, COLORREF color )
104 {
105     PSDRV_CreateColor(physDev, &physDev->font.color, color);
106     physDev->font.set = FALSE;
107     return color;
108 }