Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* Copyright (C) 1992, 1993, 1998 Aladdin Enterprises.  All rights reserved.
2
 
3
  This software is provided AS-IS with no warranty, either express or
4
  implied.
5
 
6
  This software is distributed under license and may not be copied,
7
  modified or distributed except as expressly authorized under the terms
8
  of the license contained in the file LICENSE in this distribution.
9
 
10
  For more information about licensing, please refer to
11
  http://www.ghostscript.com/licensing/. For information on
12
  commercial licensing, go to http://www.artifex.com/licensing/ or
13
  contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14
  San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15
*/
16
 
17
/* $Id: gdevpccm.c,v 1.7 2004/09/20 22:14:59 dan Exp $ */
18
/* Support routines for PC color mapping */
19
#include "gx.h"
20
#include "gsmatrix.h"		/* for gxdevice.h */
21
#include "gxdevice.h"
22
#include "gdevpccm.h"		/* interface */
23
 
24
/* Color mapping routines for EGA/VGA-style color. */
25
 
26
/* ------ EGA/VGA (4-bit) color mapping ------ */
27
 
28
/*
29
 * Colors are 4 bits: 8=intensity (always set except black), 4=R, 2=G, 1=B.
30
 * Note: We only use eight colors.  The halftoning logic requires that we
31
 * have the same number for shades for each component.
32
 */
33
gx_color_index
34
pc_4bit_map_rgb_color(gx_device * dev, const gx_color_value cv[])
35
{
36
    gx_color_index r, g, color;
37
 
38
    r = (cv[0] > (gx_max_color_value/2));
39
    g = (cv[1] > (gx_max_color_value/2));
40
    color = (cv[2] > (gx_max_color_value/2));
41
    color += (r << 2) + (g << 1);
42
    if (color > 0)		/* If the color is not black */
43
	color += 8;		/* Turn on intensity bit */
44
    return color;
45
}
46
 
47
int
48
pc_4bit_map_color_rgb(gx_device * dev, gx_color_index color,
49
		      gx_color_value prgb[3])
50
{
51
#define icolor (int)color
52
    prgb[0] = (icolor & 4 ? gx_max_color_value : 0);
53
    prgb[1] = (icolor & 2 ? gx_max_color_value : 0);
54
    prgb[2] = (icolor & 1 ? gx_max_color_value : 0);
55
    return 0;
56
#undef icolor
57
}
58
 
59
/* ------ SVGA 8-bit color mapping ------ */
60
/*
61
 * For 8-bit color, we use a 6x6x6 "cube".  This only provides 216
62
 * different colors.  The halftoning logic assumes that we have the same
63
 * number of shades of each color.  Thus asymetric cubes like 8x8x4 or
64
 * 7x7x5 do not work properly.
65
 */
66
 
67
gx_color_index
68
pc_8bit_map_rgb_color(gx_device * dev, const gx_color_value cv[])
69
{
70
    gx_color_value r, g, b;
71
    uint rv, gv;
72
    r = cv[0]; g = cv[1]; b = cv[2];
73
    rv = r / (gx_max_color_value / 6 + 1);
74
    gv = g / (gx_max_color_value / 6 + 1);
75
 
76
    return (gx_color_index)
77
	 (rv * 6 + gv) * 6 + b / (gx_max_color_value / 6 + 1);
78
}
79
int
80
pc_8bit_map_color_rgb(gx_device * dev, gx_color_index color,
81
		      gx_color_value prgb[3])
82
{
83
    static const gx_color_value ramp6[6] =
84
    {0,
85
     gx_max_color_value / 5,
86
     2 * gx_max_color_value / 5,
87
     3 * gx_max_color_value / 5,
88
     gx_max_color_value - (gx_max_color_value / 5),
89
     gx_max_color_value
90
    };
91
 
92
#define icolor (uint)color
93
    if (icolor >= 216) {
94
	prgb[0] = prgb[1] = prgb[2] = 0;
95
    } else {
96
	prgb[0] = ramp6[icolor / 36];
97
	prgb[1] = ramp6[(icolor / 6) % 6];
98
	prgb[2] = ramp6[icolor % 6];
99
    }
100
#undef icolor
101
    return 0;
102
}
103
 
104
/* Write a palette on a file. */
105
int
106
pc_write_palette(gx_device * dev, uint max_index, FILE * file)
107
{
108
    uint i, c;
109
    gx_color_value rgb[3];
110
 
111
    for (i = 0; i < max_index; i++) {
112
	(*dev_proc(dev, map_color_rgb)) (dev, (gx_color_index) i, rgb);
113
	for (c = 0; c < 3; c++) {
114
	    byte b = rgb[c] >> (gx_color_value_bits - 8);
115
 
116
	    fputc(b, file);
117
	}
118
    }
119
    return 0;
120
}