mirror of
https://github.com/The-Powder-Toy/The-Powder-Toy.git
synced 2025-09-01 04:01:56 +02:00
Fix renderer, add image decode/code methods
This commit is contained in:
@@ -48,6 +48,10 @@ extern unsigned int fire_alpha[CELL*3][CELL*3];
|
|||||||
extern pixel *fire_bg;
|
extern pixel *fire_bg;
|
||||||
extern pixel *pers_bg;
|
extern pixel *pers_bg;
|
||||||
|
|
||||||
|
void *ptif_pack(pixel *src, int w, int h, int *result_size);
|
||||||
|
|
||||||
|
pixel *ptif_unpack(void *datain, int size, int *w, int *h);
|
||||||
|
|
||||||
pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f);
|
pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f);
|
||||||
|
|
||||||
void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch);
|
void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch);
|
||||||
|
105
src/graphics.c
105
src/graphics.c
@@ -33,6 +33,111 @@ unsigned int fire_alpha[CELL*3][CELL*3];
|
|||||||
pixel *fire_bg;
|
pixel *fire_bg;
|
||||||
pixel *pers_bg;
|
pixel *pers_bg;
|
||||||
|
|
||||||
|
void *ptif_pack(pixel *src, int w, int h, int *result_size){
|
||||||
|
int i = 0, datalen = (w*h)*3, cx = 0, cy = 0;
|
||||||
|
unsigned char *red_chan = calloc(1, w*h);
|
||||||
|
unsigned char *green_chan = calloc(1, w*h);
|
||||||
|
unsigned char *blue_chan = calloc(1, w*h);
|
||||||
|
unsigned char *data = malloc(((w*h)*3)+8);
|
||||||
|
unsigned char *result = malloc(((w*h)*3)+8);
|
||||||
|
|
||||||
|
for(cx = 0; cx<w; cx++){
|
||||||
|
for(cy = 0; cy<h; cy++){
|
||||||
|
red_chan[w*(cy)+(cx)] = PIXR(src[w*(cy)+(cx)]);
|
||||||
|
green_chan[w*(cy)+(cx)] = PIXG(src[w*(cy)+(cx)]);
|
||||||
|
blue_chan[w*(cy)+(cx)] = PIXB(src[w*(cy)+(cx)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(data, red_chan, w*h);
|
||||||
|
memcpy(data+(w*h), green_chan, w*h);
|
||||||
|
memcpy(data+((w*h)*2), blue_chan, w*h);
|
||||||
|
free(red_chan);
|
||||||
|
free(green_chan);
|
||||||
|
free(blue_chan);
|
||||||
|
|
||||||
|
result[0] = 'P';
|
||||||
|
result[1] = 'T';
|
||||||
|
result[2] = 'i';
|
||||||
|
result[3] = 1;
|
||||||
|
result[4] = w;
|
||||||
|
result[5] = w>>8;
|
||||||
|
result[6] = h;
|
||||||
|
result[7] = h>>8;
|
||||||
|
|
||||||
|
i -= 8;
|
||||||
|
|
||||||
|
if(BZ2_bzBuffToBuffCompress((char *)(result+8), (unsigned *)&i, (char *)data, datalen, 9, 0, 0) != BZ_OK){
|
||||||
|
free(data);
|
||||||
|
free(result);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*result_size = i+8;
|
||||||
|
free(data);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
pixel *ptif_unpack(void *datain, int size, int *w, int *h){
|
||||||
|
int width, height, i, cx, cy;
|
||||||
|
unsigned char *red_chan;
|
||||||
|
unsigned char *green_chan;
|
||||||
|
unsigned char *blue_chan;
|
||||||
|
unsigned char *data = datain;
|
||||||
|
unsigned char *undata;
|
||||||
|
pixel *result;
|
||||||
|
if(size<16){
|
||||||
|
printf("Image empty\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if(!(data[0]=='P' && data[1]=='T' && data[2]=='i')){
|
||||||
|
printf("Image header invalid\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
width = data[4]|(data[5]<<8);
|
||||||
|
height = data[6]|(data[7]<<8);
|
||||||
|
|
||||||
|
undata = calloc(1, (width*height)*3);
|
||||||
|
red_chan = calloc(1, width*height);
|
||||||
|
green_chan = calloc(1, width*height);
|
||||||
|
blue_chan = calloc(1, width*height);
|
||||||
|
result = calloc(width*height, PIXELSIZE);
|
||||||
|
|
||||||
|
if (BZ2_bzBuffToBuffDecompress((char *)undata, (unsigned *)&i, (char *)(data+8), size-8, 0, 0)){
|
||||||
|
printf("Decompression failure\n");
|
||||||
|
free(red_chan);
|
||||||
|
free(green_chan);
|
||||||
|
free(blue_chan);
|
||||||
|
free(undata);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if(i != (width*height)*3){
|
||||||
|
printf("Result buffer size mismatch\n");
|
||||||
|
free(red_chan);
|
||||||
|
free(green_chan);
|
||||||
|
free(blue_chan);
|
||||||
|
free(undata);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memcpy(red_chan, undata, width*height);
|
||||||
|
memcpy(green_chan, undata+(width*height), width*height);
|
||||||
|
memcpy(blue_chan, undata+((width*height)*2), width*height);
|
||||||
|
|
||||||
|
for(cx = 0; cx<width; cx++){
|
||||||
|
for(cy = 0; cy<height; cy++){
|
||||||
|
result[width*(cy)+(cx)] = PIXRGB(red_chan[width*(cy)+(cx)], green_chan[width*(cy)+(cx)], blue_chan[width*(cy)+(cx)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*w = width;
|
||||||
|
*h = height;
|
||||||
|
free(red_chan);
|
||||||
|
free(green_chan);
|
||||||
|
free(blue_chan);
|
||||||
|
free(undata);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f)
|
pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f)
|
||||||
{
|
{
|
||||||
int i,j,x,y,w,h,r,g,b,c;
|
int i,j,x,y,w,h,r,g,b,c;
|
||||||
|
43
src/main.c
43
src/main.c
@@ -1322,6 +1322,7 @@ int main(int argc, char *argv[])
|
|||||||
parts[NPART-1].life = -1;
|
parts[NPART-1].life = -1;
|
||||||
pfree = 0;
|
pfree = 0;
|
||||||
|
|
||||||
|
decorations = calloc((XRES+BARSIZE)*YRES, PIXELSIZE);
|
||||||
pers_bg = calloc((XRES+BARSIZE)*YRES, PIXELSIZE);
|
pers_bg = calloc((XRES+BARSIZE)*YRES, PIXELSIZE);
|
||||||
fire_bg = calloc(XRES*YRES, PIXELSIZE);
|
fire_bg = calloc(XRES*YRES, PIXELSIZE);
|
||||||
|
|
||||||
@@ -1345,21 +1346,35 @@ int main(int argc, char *argv[])
|
|||||||
//return 0;
|
//return 0;
|
||||||
info_box(vid_buf, "Save file invalid or from newer version");
|
info_box(vid_buf, "Save file invalid or from newer version");
|
||||||
}
|
}
|
||||||
|
|
||||||
f=fopen(argv[2],"wb");
|
if(!strncmp(argv[3], "pti", 3)){
|
||||||
fprintf(f,"P6\n%d %d\n255\n",XRES,YRES);
|
char * datares = NULL, *scaled_buf;
|
||||||
for (j=0; j<YRES; j++)
|
int res = 0, sw, sh;
|
||||||
{
|
scaled_buf = rescale_img(vid_buf, XRES, YRES, &sw, &sh, 4);
|
||||||
for (i=0; i<XRES; i++)
|
datares = ptif_pack(scaled_buf, sw, sh, &res);
|
||||||
{
|
if(datares!=NULL){
|
||||||
c[0] = PIXR(vid_buf[i]);
|
f=fopen(argv[2], "wb");
|
||||||
c[1] = PIXG(vid_buf[i]);
|
fwrite(datares, res, 1, f);
|
||||||
c[2] = PIXB(vid_buf[i]);
|
fclose(f);
|
||||||
fwrite(c,3,1,f);
|
free(datares);
|
||||||
}
|
}
|
||||||
vid_buf+=XRES+BARSIZE;
|
free(scaled_buf);
|
||||||
|
} else {
|
||||||
|
f=fopen(argv[2],"wb");
|
||||||
|
fprintf(f,"P6\n%d %d\n255\n",XRES,YRES);
|
||||||
|
for (j=0; j<YRES; j++)
|
||||||
|
{
|
||||||
|
for (i=0; i<XRES; i++)
|
||||||
|
{
|
||||||
|
c[0] = PIXR(vid_buf[i]);
|
||||||
|
c[1] = PIXG(vid_buf[i]);
|
||||||
|
c[2] = PIXB(vid_buf[i]);
|
||||||
|
fwrite(c,3,1,f);
|
||||||
|
}
|
||||||
|
vid_buf+=XRES+BARSIZE;
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
}
|
}
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -1481,7 +1496,7 @@ int main(int argc, char *argv[])
|
|||||||
pygood = 0;
|
pygood = 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
printf("python console disabled at compile time.");
|
printf("python console disabled at compile time.\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MT
|
#ifdef MT
|
||||||
|
Reference in New Issue
Block a user