22 #define TACHYON_INTERNAL 1 30 int readpng(
const char *name,
int *xres,
int *yres,
unsigned char **imgdata) {
34 int writepng(
const char *name,
int xres,
int yres,
unsigned char *imgdata) {
48 # define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) 51 int readpng(
const char *name,
int *xres,
int *yres,
unsigned char **imgdata) {
55 png_bytep *row_pointers;
59 png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
60 if (png_ptr == NULL) {
65 info_ptr = png_create_info_struct(png_ptr);
66 if (info_ptr == NULL) {
67 png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
72 if ((ifp = fopen(name,
"rb")) == NULL)
76 if (setjmp(png_jmpbuf(png_ptr))) {
78 png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
85 png_init_io(png_ptr, ifp);
88 png_read_png(png_ptr, info_ptr,
89 PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_PACKING | PNG_TRANSFORM_STRIP_ALPHA,
91 *xres = png_get_image_width(png_ptr, info_ptr);
92 *yres = png_get_image_height(png_ptr, info_ptr);
95 row_pointers = png_get_rows(png_ptr, info_ptr);
97 *imgdata = (
unsigned char *) malloc(3 * (*xres) * (*yres));
98 if ((*imgdata) == NULL) {
102 for (y=0; y<(*yres); y++) {
103 unsigned char *img = &(*imgdata)[(y * (*xres) * 3)];
104 for (x=0; x<(*xres); x++) {
105 img[(x*3) ] = row_pointers[(*yres) - y - 1][x ];
106 img[(x*3) + 1] = row_pointers[(*yres) - y - 1][x + 1];
107 img[(x*3) + 2] = row_pointers[(*yres) - y - 1][x + 2];
112 png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
121 int writepng(
const char *name,
int xres,
int yres,
unsigned char *imgdata) {
125 png_bytep *row_pointers;
130 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
131 if (png_ptr == NULL) {
136 info_ptr = png_create_info_struct(png_ptr);
137 if (info_ptr == NULL) {
138 png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
143 if ((ofp = fopen(name,
"wb")) == NULL) {
144 png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
149 if (setjmp(png_jmpbuf(png_ptr))) {
151 png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
158 png_init_io(png_ptr, ofp);
160 png_set_IHDR(png_ptr, info_ptr, xres, yres,
161 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
162 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
164 png_set_gAMA(png_ptr, info_ptr, 1.0);
166 text_ptr = (png_textp) png_malloc(png_ptr, (png_uint_32)
sizeof(png_text) * 2);
168 text_ptr[0].key =
"Description";
169 text_ptr[0].text =
"A scene rendered by the Tachyon ray tracer";
170 text_ptr[0].compression = PNG_TEXT_COMPRESSION_NONE;
171 #ifdef PNG_iTXt_SUPPORTED 172 text_ptr[0].lang = NULL;
175 text_ptr[1].key =
"Software";
176 text_ptr[1].text =
"Tachyon Parallel/Multiprocessor Ray Tracer";
177 text_ptr[1].compression = PNG_TEXT_COMPRESSION_NONE;
178 #ifdef PNG_iTXt_SUPPORTED 179 text_ptr[1].lang = NULL;
181 png_set_text(png_ptr, info_ptr, text_ptr, 1);
183 row_pointers = png_malloc(png_ptr, yres*
sizeof(png_bytep));
184 for (y=0; y<yres; y++) {
185 row_pointers[yres - y - 1] = (png_bytep) &imgdata[y * xres * 3];
188 png_set_rows(png_ptr, info_ptr, row_pointers);
191 png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
193 png_free(png_ptr, row_pointers);
194 png_free(png_ptr, text_ptr);
197 png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
206 int writepng_alpha(
const char *name,
int xres,
int yres,
unsigned char *imgdata) {
210 png_bytep *row_pointers;
215 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
216 if (png_ptr == NULL) {
221 info_ptr = png_create_info_struct(png_ptr);
222 if (info_ptr == NULL) {
223 png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
228 if ((ofp = fopen(name,
"wb")) == NULL) {
229 png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
234 if (setjmp(png_jmpbuf(png_ptr))) {
236 png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
243 png_init_io(png_ptr, ofp);
251 memset(&sig_bit, 0,
sizeof(sig_bit));
258 png_set_sBIT(png_ptr, info_ptr, &sig_bit);
261 png_set_IHDR(png_ptr, info_ptr, xres, yres,
262 8, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE,
263 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
265 png_set_gAMA(png_ptr, info_ptr, 1.0);
267 text_ptr = (png_textp) png_malloc(png_ptr, (png_uint_32)
sizeof(png_text) * 2);
269 text_ptr[0].key =
"Description";
270 text_ptr[0].text =
"A scene rendered by the Tachyon ray tracer";
271 text_ptr[0].compression = PNG_TEXT_COMPRESSION_NONE;
272 #ifdef PNG_iTXt_SUPPORTED 273 text_ptr[0].lang = NULL;
276 text_ptr[1].key =
"Software";
277 text_ptr[1].text =
"Tachyon Parallel/Multiprocessor Ray Tracer";
278 text_ptr[1].compression = PNG_TEXT_COMPRESSION_NONE;
279 #ifdef PNG_iTXt_SUPPORTED 280 text_ptr[1].lang = NULL;
282 png_set_text(png_ptr, info_ptr, text_ptr, 1);
284 row_pointers = png_malloc(png_ptr, yres*
sizeof(png_bytep));
285 for (y=0; y<yres; y++) {
286 row_pointers[yres - y - 1] = (png_bytep) &imgdata[y * xres * 4];
289 png_set_rows(png_ptr, info_ptr, row_pointers);
295 png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
297 png_free(png_ptr, row_pointers);
298 png_free(png_ptr, text_ptr);
301 png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
int readpng(const char *name, int *xres, int *yres, unsigned char **imgdata)
#define IMAGEUNSUP
the image file is an unsupported format
int writepng(const char *name, int xres, int yres, unsigned char *imgdata)
int writepng_alpha(const char *name, int xres, int yres, unsigned char *imgdata)
#define IMAGEALLOCERR
not enough remaining memory to load this image
Tachyon cross-platform timers, special math function wrappers, and RNGs.
#define IMAGENOERR
no error
Tachyon public API function prototypes and declarations used to drive the ray tracing engine...
#define IMAGEBADFILE
can't find or can't open the file