dostunnel
diff src/palman.c @ 0:c525cfbfd4a2
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Fri, 15 Mar 2013 16:46:41 +0200 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/palman.c Fri Mar 15 16:46:41 2013 +0200 1.3 @@ -0,0 +1,124 @@ 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 +int palm_color_index(unsigned char r, unsigned char g, unsigned char b) 1.51 +{ 1.52 + int i; 1.53 + 1.54 + for(i=0; i<ncol; i++) { 1.55 + if(colors[i].r == r && colors[i].g == g && colors[i].b == b) { 1.56 + return i; 1.57 + } 1.58 + } 1.59 + return -1; 1.60 +} 1.61 + 1.62 +/* TODO: build an octree */ 1.63 +int palm_build(void) 1.64 +{ 1.65 + int i, j; 1.66 + 1.67 + if(!ncol) { 1.68 + return -1; 1.69 + } 1.70 + 1.71 + /* gradient range for each color */ 1.72 + range = MAX_COLORS / ncol; 1.73 + 1.74 + if(range <= 1) { 1.75 + memcpy(pal, colors, ncol * sizeof *pal); 1.76 + return 0; 1.77 + } 1.78 + pcol = 0; 1.79 + 1.80 + for(i=0; i<ncol; i++) { 1.81 + unsigned short r, g, b, dr, dg, db; 1.82 + 1.83 + base_index[i] = pcol; 1.84 + 1.85 + dr = ((unsigned short)colors[i].r << 8) / (range - 1); 1.86 + dg = ((unsigned short)colors[i].g << 8) / (range - 1); 1.87 + db = ((unsigned short)colors[i].b << 8) / (range - 1); 1.88 + 1.89 + r = g = b = 0; 1.90 + for(j=0; j<range; j++) { 1.91 + pal[pcol].r = (unsigned char)(r >> 8); 1.92 + pal[pcol].g = (unsigned char)(g >> 8); 1.93 + pal[pcol].b = (unsigned char)(b >> 8); 1.94 + pcol++; 1.95 + r += dr; 1.96 + g += dg; 1.97 + b += db; 1.98 + } 1.99 + } 1.100 + return pcol; 1.101 +} 1.102 + 1.103 +struct palm_color *palm_palette(void) 1.104 +{ 1.105 + return pal; 1.106 +} 1.107 + 1.108 +int palm_palette_size(void) 1.109 +{ 1.110 + return pcol; 1.111 +} 1.112 + 1.113 + 1.114 +int palm_color_base(unsigned char r, unsigned char g, unsigned char b) 1.115 +{ 1.116 + int c; 1.117 + 1.118 + if((c = palm_color_index(r, g, b)) == -1) { 1.119 + return -1; 1.120 + } 1.121 + return base_index[c]; 1.122 +} 1.123 + 1.124 +int palm_color_range(void) 1.125 +{ 1.126 + return range; 1.127 +}