/* * gentexture.c * * Generate normal map stuff * * Copyright (c) 2008 Thomas White * * This file is part of Thrust3D - a silly game * * Thrust3D is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Thrust3D is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Thrust3D. If not, see . * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include int main(int argc, char *argv[]) { FILE *fh; png_bytep header; png_structp png_ptr; png_infop info_ptr; png_infop end_info; unsigned int width; unsigned int height; unsigned int bit_depth; unsigned int channels; png_bytep *row_pointers; unsigned int x; unsigned int y; uint8_t *texels; char *filename; char *outfilename; filename = argv[1]; outfilename = argv[2]; /* Open file */ fh = fopen(filename, "rb"); if ( !fh ) { fprintf(stderr, "Couldn't open texture file '%s'\n", filename); return 1; } /* Check it's actually a PNG file */ header = malloc(8); fread(header, 1, 8, fh); if ( png_sig_cmp(header, 0, 8)) { fprintf(stderr, "Texture file '%s' is not a PNG file.\n", filename); free(header); fclose(fh); return 1; } free(header); png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if ( !png_ptr ) { fprintf(stderr, "Couldn't create PNG read structure.\n"); fclose(fh); return 1; } info_ptr = png_create_info_struct(png_ptr); if ( !info_ptr ) { png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); fprintf(stderr, "Couldn't create PNG info structure.\n"); fclose(fh); return 1; } end_info = png_create_info_struct(png_ptr); if ( !end_info ) { png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); printf("Couldn't create PNG end info structure.\n"); fclose(fh); return 1; } if ( setjmp(png_jmpbuf(png_ptr)) ) { png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); fclose(fh); fprintf(stderr, "PNG read failed.\n"); return 1; } png_init_io(png_ptr, fh); png_set_sig_bytes(png_ptr, 8); /* Read! */ png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL); width = png_get_image_width(png_ptr, info_ptr); height = png_get_image_height(png_ptr, info_ptr); bit_depth = png_get_bit_depth(png_ptr, info_ptr); channels = png_get_channels(png_ptr, info_ptr); if ( bit_depth != 8 ) { fprintf(stderr, "Texture image '%s' doesn't have 8 bits per channel per pixel.\n", filename); png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); fclose(fh); return 1; } if ( channels != 4 ) { fprintf(stderr, "Texture image '%s' doesn't have 4 channels.\n", filename); png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); fclose(fh); return 1; } /* Get image data */ row_pointers = png_get_rows(png_ptr, info_ptr); texels = malloc(4*width*height); for ( y=0; y