|
|
|
@ -1,16 +1,16 @@ |
|
|
|
|
/* stb_image_write - v0.95 - public domain - http://nothings.org/stb/stb_image_write.h
|
|
|
|
|
/* stb_image_write - v0.96 - public domain - http://nothings.org/stb/stb_image_write.h
|
|
|
|
|
writes out PNG/BMP/TGA images to C stdio - Sean Barrett 2010 |
|
|
|
|
no warranty implied; use at your own risk |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Before including, |
|
|
|
|
Before #including, |
|
|
|
|
|
|
|
|
|
#define STB_IMAGE_WRITE_IMPLEMENTATION |
|
|
|
|
|
|
|
|
|
in the file that you want to have the implementation. |
|
|
|
|
in the file that you want to have the implementation. |
|
|
|
|
|
|
|
|
|
Will probably not work correctly with strict-aliasing optimizations. |
|
|
|
|
|
|
|
|
|
Will probably not work correctly with strict-aliasing optimizations. |
|
|
|
|
|
|
|
|
|
ABOUT: |
|
|
|
|
|
|
|
|
@ -56,6 +56,17 @@ USAGE: |
|
|
|
|
HDR expects linear float data. Since the format is always 32-bit rgb(e) |
|
|
|
|
data, alpha (if provided) is discarded, and for monochrome data it is |
|
|
|
|
replicated across all three channels. |
|
|
|
|
|
|
|
|
|
CREDITS: |
|
|
|
|
|
|
|
|
|
PNG/BMP/TGA |
|
|
|
|
Sean Barrett |
|
|
|
|
HDR |
|
|
|
|
Baldur Karlsson |
|
|
|
|
TGA monochrome: |
|
|
|
|
Jean-Sebastien Guay |
|
|
|
|
Bugfixes: |
|
|
|
|
Chribba@github |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#ifndef INCLUDE_STB_IMAGE_WRITE_H |
|
|
|
@ -68,7 +79,7 @@ extern "C" { |
|
|
|
|
extern int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); |
|
|
|
|
extern int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); |
|
|
|
|
extern int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); |
|
|
|
|
extern int stbi_write_hdr(char const *filename, int w, int h, int comp, const void *data); |
|
|
|
|
extern int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); |
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
|
} |
|
|
|
@ -83,6 +94,7 @@ extern int stbi_write_hdr(char const *filename, int w, int h, int comp, const vo |
|
|
|
|
#include <stdio.h> |
|
|
|
|
#include <string.h> |
|
|
|
|
#include <assert.h> |
|
|
|
|
#include <math.h> |
|
|
|
|
|
|
|
|
|
typedef unsigned int stbiw_uint32; |
|
|
|
|
typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; |
|
|
|
@ -193,7 +205,7 @@ int stbi_write_tga(char const *filename, int x, int y, int comp, const void *dat |
|
|
|
|
|
|
|
|
|
// *************************************************************************************************
|
|
|
|
|
// Radiance RGBE HDR writer
|
|
|
|
|
// originally by Baldur Karlsson
|
|
|
|
|
// by Baldur Karlsson
|
|
|
|
|
#define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) |
|
|
|
|
|
|
|
|
|
void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) |
|
|
|
@ -204,7 +216,7 @@ void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) |
|
|
|
|
if (maxcomp < 1e-32) { |
|
|
|
|
rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; |
|
|
|
|
} else { |
|
|
|
|
maxcomp = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; |
|
|
|
|
float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; |
|
|
|
|
|
|
|
|
|
rgbe[0] = (unsigned char)(linear[0] * maxcomp); |
|
|
|
|
rgbe[1] = (unsigned char)(linear[1] * maxcomp); |
|
|
|
@ -216,6 +228,7 @@ void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) |
|
|
|
|
void stbiw__write_rle_data(FILE *f, int length, unsigned char databyte) |
|
|
|
|
{ |
|
|
|
|
unsigned char lengthbyte = 0x80 | (unsigned char)(length & 0x7f); |
|
|
|
|
assert(length <= 0x7f); |
|
|
|
|
fwrite(&lengthbyte, 1, 1, f); |
|
|
|
|
fwrite(&databyte, 1, 1, f); |
|
|
|
|
} |
|
|
|
@ -223,11 +236,12 @@ void stbiw__write_rle_data(FILE *f, int length, unsigned char databyte) |
|
|
|
|
void stbiw__write_nonrle_data(FILE *f, int length, unsigned char *data) |
|
|
|
|
{ |
|
|
|
|
unsigned char lengthbyte = (unsigned char )(length & 0xff); |
|
|
|
|
assert(length <= 0x7f); |
|
|
|
|
fwrite(&lengthbyte, 1, 1, f); |
|
|
|
|
fwrite(data, length, 1, f); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void stbiw__write_hdr_scanline(FILE *f, int width, int comp, unsigned char *scratch, float *scanline) |
|
|
|
|
void stbiw__write_hdr_scanline(FILE *f, int width, int comp, unsigned char *scratch, const float *scanline) |
|
|
|
|
{ |
|
|
|
|
unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; |
|
|
|
|
unsigned char rgbe[4]; |
|
|
|
@ -324,26 +338,28 @@ void stbiw__write_hdr_scanline(FILE *f, int width, int comp, unsigned char *scra |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int stbi_write_hdr(char const *filename, int x, int y, int comp, const void *data) |
|
|
|
|
int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
FILE *f; |
|
|
|
|
unsigned char *scratch; |
|
|
|
|
if (y <= 0 || x <= 0) return 0; |
|
|
|
|
if (y <= 0 || x <= 0 || data == NULL) return 0; |
|
|
|
|
f = fopen(filename, "wb"); |
|
|
|
|
if (f) { |
|
|
|
|
float *scanline = (float *)data; |
|
|
|
|
/* Each component is stored separately. Allocate scratch space for full output scanline. */ |
|
|
|
|
scratch = (unsigned char *) malloc(x*4); if (!scanline) { fclose(f); return 0; } |
|
|
|
|
fprintf(f, "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"); |
|
|
|
|
fprintf(f, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); |
|
|
|
|
for(i=0; i < y; i++) stbiw__write_hdr_scanline(f, x, comp, scratch, scanline + comp*i*x); |
|
|
|
|
unsigned char *scratch = (unsigned char *) malloc(x*4); |
|
|
|
|
fprintf(f, "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n" ); |
|
|
|
|
fprintf(f, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n" , y, x); |
|
|
|
|
for(i=0; i < y; i++) |
|
|
|
|
stbiw__write_hdr_scanline(f, x, comp, scratch, data + comp*i*x); |
|
|
|
|
free(scratch); |
|
|
|
|
fclose(f); |
|
|
|
|
} |
|
|
|
|
return f != NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////
|
|
|
|
|
// PNG
|
|
|
|
|
|
|
|
|
|
// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size()
|
|
|
|
|
#define stbiw__sbraw(a) ((int *) (a) - 2) |
|
|
|
|
#define stbiw__sbm(a) stbiw__sbraw(a)[0] |
|
|
|
@ -666,6 +682,9 @@ int stbi_write_png(char const *filename, int x, int y, int comp, const void *dat |
|
|
|
|
|
|
|
|
|
/* Revision history
|
|
|
|
|
|
|
|
|
|
0.96 (2015-01-17) |
|
|
|
|
add HDR output |
|
|
|
|
fix monochrome BMP |
|
|
|
|
0.95 (2014-08-17) |
|
|
|
|
add monochrome TGA output |
|
|
|
|
0.94 (2014-05-31) |
|
|
|
|