2 * Copyright (C) 2000, Matias Atria
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 void mdvi_set_color(DviContext *dvi, Ulong fg, Ulong bg)
25 if(dvi->curr_fg != fg || dvi->curr_bg != bg) {
26 DEBUG((DBG_DEVICE, "setting color to (%lu,%lu)\n", fg, bg));
27 if(dvi->device.set_color)
28 dvi->device.set_color(dvi->device.device_data, fg, bg);
34 void mdvi_push_color(DviContext *dvi, Ulong fg, Ulong bg)
36 if(dvi->color_top == dvi->color_size) {
37 dvi->color_size += 32;
38 dvi->color_stack = mdvi_realloc(dvi->color_stack,
39 dvi->color_size * sizeof(DviColorPair));
41 dvi->color_stack[dvi->color_top].fg = dvi->curr_fg;
42 dvi->color_stack[dvi->color_top].bg = dvi->curr_bg;
44 mdvi_set_color(dvi, fg, bg);
47 void mdvi_pop_color(DviContext *dvi)
51 if(dvi->color_top == 0)
54 fg = dvi->color_stack[dvi->color_top].fg;
55 bg = dvi->color_stack[dvi->color_top].bg;
56 mdvi_set_color(dvi, fg, bg);
59 void mdvi_reset_color(DviContext *dvi)
62 mdvi_set_color(dvi, dvi->params.fg, dvi->params.bg);
65 /* cache for color tables, to avoid creating them for every glyph */
77 static ColorCache color_cache[CCSIZE];
78 static int cc_entries;
80 #define GAMMA_DIFF 0.005
83 /* create a color table */
84 Ulong *get_color_table(DviDevice *dev,
85 int nlevels, Ulong fg, Ulong bg, double gamma, int density)
87 ColorCache *cc, *tofree;
92 lohits = color_cache[0].hits;
93 tofree = &color_cache[0];
94 /* look in the cache and see if we have one that matches this request */
95 for(cc = &color_cache[0]; cc < &color_cache[cc_entries]; cc++) {
96 if(cc->hits < lohits) {
100 if(cc->fg == fg && cc->bg == bg && cc->density == density &&
101 cc->nlevels == nlevels && fabs(cc->gamma - gamma) <= GAMMA_DIFF)
105 if(cc < &color_cache[cc_entries]) {
110 DEBUG((DBG_DEVICE, "Adding color table to cache (fg=%lu, bg=%lu, n=%d)\n",
113 /* no entry was found in the cache, create a new one */
114 if(cc_entries < CCSIZE) {
115 cc = &color_cache[cc_entries++];
119 mdvi_free(cc->pixels);
121 pixels = xnalloc(Ulong, nlevels);
122 status = dev->alloc_colors(dev->device_data,
123 pixels, nlevels, fg, bg, gamma, density);
131 cc->density = density;
132 cc->nlevels = nlevels;