nuclear@3: /* nuclear@3: 256-color 3D graphics hack for real-mode DOS. nuclear@3: Copyright (C) 2011 John Tsiombikas nuclear@3: nuclear@3: This program is free software: you can redistribute it and/or modify nuclear@3: it under the terms of the GNU General Public License as published by nuclear@3: the Free Software Foundation, either version 3 of the License, or nuclear@3: (at your option) any later version. nuclear@3: nuclear@3: This program is distributed in the hope that it will be useful, nuclear@3: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@3: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@3: GNU General Public License for more details. nuclear@3: nuclear@3: You should have received a copy of the GNU General Public License nuclear@3: along with this program. If not, see . nuclear@3: */ nuclear@3: nuclear@4: #include nuclear@4: #include nuclear@3: #include nuclear@3: #include "texture.h" nuclear@3: #include "palman.h" nuclear@3: nuclear@4: struct texture *load_texture(const char *fname) nuclear@3: { nuclear@4: int i, num_pixels; nuclear@4: struct texture *tex; nuclear@4: long fpos; nuclear@4: nuclear@4: if(!(tex = malloc(sizeof *tex))) { nuclear@4: return 0; nuclear@4: } nuclear@4: memset(tex, 0, sizeof *tex); nuclear@4: nuclear@4: if(!(tex->file = fopen(fname, "rb"))) { nuclear@4: fprintf(stderr, "failed to open texture: %s\n", fname); nuclear@4: free_texture(tex); nuclear@4: return 0; nuclear@4: } nuclear@4: if(fscanf(tex->file, "P6 %d %d 255 ", &tex->width, &tex->height) != 2) { nuclear@4: fprintf(stderr, "invalid pixmap: %s\n", fname); nuclear@4: free_texture(tex); nuclear@4: return 0; nuclear@4: } nuclear@4: fpos = ftell(tex->file); nuclear@4: nuclear@4: num_pixels = tex->width * tex->height; nuclear@4: for(i=0; ifile); nuclear@4: g = fgetc(tex->file); nuclear@4: b = fgetc(tex->file); nuclear@4: nuclear@4: if(feof(tex->file)) { nuclear@4: fprintf(stderr, "unexpected EOF while reading: %s\n", fname); nuclear@4: free_texture(tex); nuclear@4: return 0; nuclear@4: } nuclear@4: nuclear@4: if(palm_color_index(r, g, b) == -1) { nuclear@4: palm_add_color(r, g, b); nuclear@4: } nuclear@4: } nuclear@4: fseek(tex->file, fpos, SEEK_SET); nuclear@4: return tex; nuclear@4: } nuclear@4: nuclear@4: void free_texture(struct texture *tex) nuclear@4: { nuclear@4: if(tex) { nuclear@4: if(tex->file) { nuclear@4: fclose(tex->file); nuclear@4: } nuclear@4: free(tex->pixels); nuclear@4: free(tex); nuclear@4: } nuclear@4: } nuclear@4: nuclear@4: unsigned char *get_texture_pixels(struct texture *tex) nuclear@4: { nuclear@4: if(!tex->pixels && tex->file) { nuclear@4: int i, num_pixels = tex->width * tex->height; nuclear@4: nuclear@4: if(!(tex->pixels = malloc(num_pixels))) { nuclear@4: return 0; nuclear@4: } nuclear@4: nuclear@4: for(i=0; ifile); nuclear@4: g = fgetc(tex->file); nuclear@4: b = fgetc(tex->file); nuclear@4: nuclear@4: if((base = palm_color_base(r, g, b)) == -1) { nuclear@4: base = 0; nuclear@4: } nuclear@4: tex->pixels[i] = base; nuclear@4: } nuclear@4: nuclear@4: fclose(tex->file); nuclear@4: tex->file = 0; nuclear@4: } nuclear@4: nuclear@4: return tex->pixels; nuclear@3: } nuclear@3: nuclear@3: struct texture *tex_gen_checker(int xsz, int ysz, int ush, int vsh, int c1, int c2) nuclear@3: { nuclear@3: int i, j; nuclear@3: struct texture *tex; nuclear@3: unsigned char *pptr; nuclear@3: nuclear@3: if(!(tex = malloc(sizeof *tex))) { nuclear@3: return 0; nuclear@3: } nuclear@4: memset(tex, 0, sizeof *tex); nuclear@4: nuclear@3: if(!(tex->pixels = malloc(xsz * ysz))) { nuclear@3: free(tex); nuclear@3: return 0; nuclear@3: } nuclear@3: tex->width = xsz; nuclear@3: tex->height = ysz; nuclear@3: nuclear@3: pptr = tex->pixels; nuclear@3: for(i=0; i> vsh) & 1) == ((j >> ush) & 1) ? c1 : c2; nuclear@3: *pptr++ = c; nuclear@3: } nuclear@3: } nuclear@3: return tex; nuclear@3: }