dostunnel
diff src/texture.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/texture.c Fri Mar 15 16:46:41 2013 +0200 1.3 @@ -0,0 +1,136 @@ 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 <stdio.h> 1.23 +#include <string.h> 1.24 +#include <stdlib.h> 1.25 +#include "texture.h" 1.26 +#include "palman.h" 1.27 + 1.28 +struct texture *load_texture(const char *fname) 1.29 +{ 1.30 + long i, num_pixels; 1.31 + struct texture *tex; 1.32 + long fpos; 1.33 + 1.34 + if(!(tex = malloc(sizeof *tex))) { 1.35 + return 0; 1.36 + } 1.37 + memset(tex, 0, sizeof *tex); 1.38 + 1.39 + if(!(tex->file = fopen(fname, "rb"))) { 1.40 + fprintf(stderr, "failed to open texture: %s\n", fname); 1.41 + free_texture(tex); 1.42 + return 0; 1.43 + } 1.44 + if(fscanf(tex->file, "P6 %d %d 255 ", &tex->width, &tex->height) != 2) { 1.45 + fprintf(stderr, "invalid pixmap: %s\n", fname); 1.46 + free_texture(tex); 1.47 + return 0; 1.48 + } 1.49 + fpos = ftell(tex->file); 1.50 + 1.51 + num_pixels = tex->width * tex->height; 1.52 + for(i=0; i<num_pixels; i++) { 1.53 + int r, g, b; 1.54 + 1.55 + r = fgetc(tex->file); 1.56 + g = fgetc(tex->file); 1.57 + b = fgetc(tex->file); 1.58 + 1.59 + if(feof(tex->file)) { 1.60 + fprintf(stderr, "unexpected EOF while reading: %s\n", fname); 1.61 + free_texture(tex); 1.62 + return 0; 1.63 + } 1.64 + 1.65 + if(palm_color_index(r, g, b) == -1) { 1.66 + palm_add_color(r, g, b); 1.67 + } 1.68 + } 1.69 + fseek(tex->file, fpos, SEEK_SET); 1.70 + return tex; 1.71 +} 1.72 + 1.73 +void free_texture(struct texture *tex) 1.74 +{ 1.75 + if(tex) { 1.76 + if(tex->file) { 1.77 + fclose(tex->file); 1.78 + } 1.79 + free(tex->pixels); 1.80 + free(tex); 1.81 + } 1.82 +} 1.83 + 1.84 +unsigned char *get_texture_pixels(struct texture *tex) 1.85 +{ 1.86 + if(!tex->pixels && tex->file) { 1.87 + long i, num_pixels = tex->width * tex->height; 1.88 + 1.89 + if(!(tex->pixels = malloc(num_pixels))) { 1.90 + return 0; 1.91 + } 1.92 + 1.93 + for(i=0; i<num_pixels; i++) { 1.94 + int r, g, b, base; 1.95 + 1.96 + r = fgetc(tex->file); 1.97 + g = fgetc(tex->file); 1.98 + b = fgetc(tex->file); 1.99 + 1.100 + if((base = palm_color_base(r, g, b)) == -1) { 1.101 + base = 0; 1.102 + } 1.103 + tex->pixels[i] = base; 1.104 + } 1.105 + 1.106 + fclose(tex->file); 1.107 + tex->file = 0; 1.108 + } 1.109 + 1.110 + return tex->pixels; 1.111 +} 1.112 + 1.113 +struct texture *tex_gen_checker(int xsz, int ysz, int ush, int vsh, int c1, int c2) 1.114 +{ 1.115 + int i, j; 1.116 + struct texture *tex; 1.117 + unsigned char *pptr; 1.118 + 1.119 + if(!(tex = malloc(sizeof *tex))) { 1.120 + return 0; 1.121 + } 1.122 + memset(tex, 0, sizeof *tex); 1.123 + 1.124 + if(!(tex->pixels = malloc(xsz * ysz))) { 1.125 + free(tex); 1.126 + return 0; 1.127 + } 1.128 + tex->width = xsz; 1.129 + tex->height = ysz; 1.130 + 1.131 + pptr = tex->pixels; 1.132 + for(i=0; i<ysz; i++) { 1.133 + for(j=0; j<xsz; j++) { 1.134 + int c = ((i >> vsh) & 1) == ((j >> ush) & 1) ? c1 : c2; 1.135 + *pptr++ = c; 1.136 + } 1.137 + } 1.138 + return tex; 1.139 +}