4 #include "../endianness.h"
11 typedef unsigned short WORD;
12 typedef unsigned char BYTE;
58 #endif //tells VCC not to generate min/max macros
72 static unsigned char *
LoadTex(
char *FileName,
int &sizeX,
int &sizeY )
75 unsigned char *data = NULL;
83 VSFileSystem::Read( &info, SIZEOF_BITMAPINFOHEADER, 1, fp );
87 data =
new unsigned char[3*sizeY*sizeX];
90 for (
int i = sizeY-1;
i >= 0;
i--) {
91 int itimes3width = 3*
i*sizeX;
92 for (
int j = 0;
j < sizeX;
j++) {
95 VSFileSystem::Read( data+3*
j+itimes3width,
sizeof (
unsigned char)*3, 1, fp );
96 unsigned char tmp = data[3*
j+itimes3width];
97 data[3*
j+itimes3width] = data[3*
j+itimes3width+2];
98 data[3*
j+itimes3width+2] = tmp;
103 data =
new unsigned char[sizeY*sizeX*3];
104 unsigned char palette[256*3+1];
105 unsigned char *paltemp = palette;
106 for (
int palcount = 0; palcount < 256; palcount++) {
107 VSFileSystem::Read( paltemp,
sizeof (
RGBQUAD), 1, fp );
116 for (
int i = sizeY-1;
i >= 0;
i--)
117 for (
int j = 0;
j < sizeX;
j++) {
118 VSFileSystem::Read( &ctemp,
sizeof (
unsigned char), 1, fp );
119 data[3*(
i*sizeX+
j)+2] = palette[( (
short) ctemp )*3];
120 data[3*(
i*sizeX+
j)+1] = palette[( (
short) ctemp )*3+1];
121 data[3*(
i*sizeX+
j)] = palette[( (
short) ctemp )*3+2];
128 void png_write(
const char *myfile,
unsigned char *data,
unsigned int width,
unsigned int height,
bool alpha,
char bpp )
131 png_structp png_ptr = png_create_write_struct
132 ( PNG_LIBPNG_VER_STRING, (png_voidp) NULL, NULL, NULL );
135 png_infop info_ptr = png_create_info_struct( png_ptr );
137 png_destroy_write_struct( &png_ptr, (png_infopp) NULL );
140 if ( setjmp( png_ptr->jmpbuf ) ) {
141 png_destroy_write_struct( &png_ptr, &info_ptr );
145 png_init_io( png_ptr, fp );
146 png_set_filter( png_ptr, 0, PNG_FILTER_NONE );
147 png_set_compression_level( png_ptr, Z_BEST_COMPRESSION );
150 png_set_compression_mem_level( png_ptr, 8 );
151 png_set_compression_strategy( png_ptr, Z_DEFAULT_STRATEGY );
152 png_set_compression_window_bits( png_ptr, 15 );
153 png_set_compression_method( png_ptr, 8 );
155 png_set_IHDR( png_ptr,
160 alpha ? PNG_COLOR_TYPE_RGB_ALPHA : PNG_COLOR_TYPE_RGB,
162 PNG_COMPRESSION_TYPE_DEFAULT,
163 PNG_FILTER_TYPE_DEFAULT );
165 png_write_info( png_ptr, info_ptr );
166 # if __BYTE_ORDER != __BIG_ENDIAN
168 png_set_swap( png_ptr );
170 int stride = (bpp/8)*(alpha ? 4 : 3);
171 png_byte **row_pointers =
new png_byte*[
height];
172 for (
unsigned int i = 0;
i <
height;
i++)
173 row_pointers[
i] = (png_byte*) &data[stride*
i*
width];
174 png_write_image( png_ptr, row_pointers );
175 png_write_end( png_ptr, info_ptr );
176 png_write_flush( png_ptr );
177 png_destroy_write_struct( &png_ptr, &info_ptr );
181 delete[] row_pointers;
184 int main(
int argc,
char **argv )
188 unsigned char *dat1 = NULL;
191 unsigned char *dat2 = NULL;
195 dat1 =
LoadTex( argv[1], wid1, hei1 );
196 dat2 =
LoadTex( argv[2], wid2, hei2 );
199 dat1 =
LoadTex( argv[1], wid1, hei1 );
202 unsigned char *data = dat1;
205 if (argc > 3 && dat2) {
206 assert( wid1 == wid2 );
207 assert( hei1 == hei2 );
208 data = (
unsigned char*) malloc(
sizeof (
unsigned char)*wid1*hei1*4 );
209 for (
int i = 0;
i < wid1*hei1;
i++) {
210 data[
i*4] = dat1[
i*3];
211 data[
i*4+1] = dat1[
i*3+1];
212 data[
i*4+2] = dat1[
i*3+2];
213 data[
i*4+3] = dat2[
i*3];
216 png_write( argv[out], data, wid1, hei1, dat2 != NULL, 8 );
217 if (argc > 3 && dat2)