Release 1.5.29.
[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 PSRGB rgb_to_grayscale_scale( void )
56 {
57     static const PSRGB scale = {0.3, 0.59, 0.11};
58     /* FIXME configurable */
59     return scale;
60 }
61
62 /**********************************************************************
63  *           PSDRV_CreateColor
64  *
65  * Creates a PostScript colour from a COLORREF.
66  * Result is grey scale if ColorDevice field of ppd is CD_False else an
67  * rgb colour is produced.
68  */
69 void PSDRV_CreateColor( PHYSDEV dev, PSCOLOR *pscolor, COLORREF wincolor )
70 {
71     PSDRV_PDEVICE *physDev = get_psdrv_dev( dev );
72     int ctype = wincolor >> 24;
73     float r, g, b;
74
75     if(ctype != 0 && ctype != 2)
76         FIXME("Colour is %08x\n", wincolor);
77
78     r = (wincolor & 0xff) / 256.0;
79     g = ((wincolor >> 8) & 0xff) / 256.0;
80     b = ((wincolor >> 16) & 0xff) / 256.0;
81
82     if(physDev->pi->ppd->ColorDevice != CD_False) {
83         pscolor->type = PSCOLOR_RGB;
84         pscolor->value.rgb.r = r;
85         pscolor->value.rgb.g = g;
86         pscolor->value.rgb.b = b;
87     } else {
88         PSRGB scale = rgb_to_grayscale_scale();
89         pscolor->type = PSCOLOR_GRAY;
90         pscolor->value.gray.i = r * scale.r + g * scale.g + b * scale.b;
91     }
92     return;
93 }
94
95
96 /***********************************************************************
97  *           PSDRV_SetBkColor
98  */
99 COLORREF PSDRV_SetBkColor( PHYSDEV dev, COLORREF color )
100 {
101     PSDRV_PDEVICE *physDev = get_psdrv_dev( dev );
102     PSDRV_CreateColor(dev, &physDev->bkColor, color);
103     return color;
104 }
105
106
107 /***********************************************************************
108  *           PSDRV_SetTextColor
109  */
110 COLORREF PSDRV_SetTextColor( PHYSDEV dev, COLORREF color )
111 {
112     PSDRV_PDEVICE *physDev = get_psdrv_dev( dev );
113     PSDRV_CreateColor(dev, &physDev->font.color, color);
114     physDev->font.set = FALSE;
115     return color;
116 }