deepstone
diff src/palman.c @ 1:0b7f840afe4a
palette management
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Mon, 21 Nov 2011 08:35:58 +0200 |
parents | |
children | c3e0bccd673e |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/palman.c Mon Nov 21 08:35:58 2011 +0200 1.3 @@ -0,0 +1,110 @@ 1.4 +/* 1.5 +256-color 3D graphics hack for real-mode DOS. 1.6 +Copyright (C) 2011 John Tsiombikas <nuclear@member.fsf.org> 1.7 + 1.8 +This program is free software: you can redistribute it and/or modify 1.9 +it under the terms of the GNU General Public License as published by 1.10 +the Free Software Foundation, either version 3 of the License, or 1.11 +(at your option) any later version. 1.12 + 1.13 +This program is distributed in the hope that it will be useful, 1.14 +but WITHOUT ANY WARRANTY; without even the implied warranty of 1.15 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1.16 +GNU General Public License for more details. 1.17 + 1.18 +You should have received a copy of the GNU General Public License 1.19 +along with this program. If not, see <http://www.gnu.org/licenses/>. 1.20 +*/ 1.21 + 1.22 +#include <string.h> 1.23 +#include "palman.h" 1.24 + 1.25 +#define MAX_COLORS 256 1.26 +static struct palm_color colors[MAX_COLORS]; 1.27 +static int base_index[MAX_COLORS]; 1.28 + 1.29 +static struct palm_color pal[MAX_COLORS]; 1.30 +static unsigned int ncol, pcol; 1.31 +static int range; 1.32 + 1.33 +void palm_clear(void) 1.34 +{ 1.35 + ncol = 0; 1.36 +} 1.37 + 1.38 +int palm_add_color(unsigned char r, unsigned char g, unsigned char b) 1.39 +{ 1.40 + if(ncol >= MAX_COLORS) { 1.41 + return -1; 1.42 + } 1.43 + colors[ncol].r = r; 1.44 + colors[ncol].g = g; 1.45 + colors[ncol].b = b; 1.46 + ncol++; 1.47 + return 0; 1.48 +} 1.49 + 1.50 +/* TODO: build an octree */ 1.51 +int palm_build(void) 1.52 +{ 1.53 + int i, j; 1.54 + 1.55 + /* gradient range for each color */ 1.56 + range = MAX_COLORS / ncol; 1.57 + 1.58 + if(range == 1) { 1.59 + memcpy(pal, colors, ncol * sizeof *pal); 1.60 + return 0; 1.61 + } 1.62 + pcol = 0; 1.63 + 1.64 + for(i=0; i<ncol; i++) { 1.65 + unsigned int r, g, b, dr, dg, db; 1.66 + 1.67 + base_index[i] = pcol; 1.68 + 1.69 + dr = (colors[i].r << 8) / (range - 1); 1.70 + dg = (colors[i].g << 8) / (range - 1); 1.71 + db = (colors[i].b << 8) / (range - 1); 1.72 + 1.73 + r = g = b = 0; 1.74 + for(j=0; j<range; j++) { 1.75 + pal[pcol].r = (unsigned char)(r >> 8); 1.76 + pal[pcol].g = (unsigned char)(g >> 8); 1.77 + pal[pcol].b = (unsigned char)(b >> 8); 1.78 + pcol++; 1.79 + r += dr; 1.80 + g += dg; 1.81 + b += db; 1.82 + } 1.83 + } 1.84 + return pcol; 1.85 +} 1.86 + 1.87 +struct palm_color *palm_palette(void) 1.88 +{ 1.89 + return pal; 1.90 +} 1.91 + 1.92 +int palm_palette_size(void) 1.93 +{ 1.94 + return pcol; 1.95 +} 1.96 + 1.97 + 1.98 +int palm_color_base(unsigned char r, unsigned char g, unsigned char b) 1.99 +{ 1.100 + int i; 1.101 + 1.102 + for(i=0; i<pcol; i++) { 1.103 + if(colors[i].r == r && colors[i].g == g && colors[i].b == b) { 1.104 + return base_index[i]; 1.105 + } 1.106 + } 1.107 + return -1; 1.108 +} 1.109 + 1.110 +int palm_color_range(void) 1.111 +{ 1.112 + return range; 1.113 +}