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 +}