X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswfbits.c;h=df8c1c96fe73821730024a8eede25d2d8050ebdf;hb=6feed80959ad2c11f0427bf0e5a30aab8abd7083;hp=c8cb96b04267e9856ada51cba5a097ee448db214;hpb=e7bed7f61bd80b6044a696f78b4372351ccb2988;p=swftools.git diff --git a/lib/modules/swfbits.c b/lib/modules/swfbits.c index c8cb96b..df8c1c9 100644 --- a/lib/modules/swfbits.c +++ b/lib/modules/swfbits.c @@ -7,9 +7,19 @@ Copyright (c) 2000, 2001 Rainer Böhme - This file is distributed under the GPL, see file COPYING for details + This program 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 2 of the License, or + (at your option) any later version. -*/ + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define OUTBUFFER_SIZE 0x8000 @@ -128,6 +138,26 @@ void swf_SetJPEGBits2(TAG * tag,U16 width,U16 height,RGBA* bitmap, int quality) swf_SetJPEGBitsFinish(jpeg); } +void swf_GetJPEGSize(char * fname, int*width, int*height) +{ struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + FILE * fi; + *width = 0; + *height = 0; + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + if ((fi=fopen(fname,"rb"))==NULL) { + fprintf(stderr, "rfxswf: file open error\n"); + return; + } + jpeg_stdio_src(&cinfo, fi); + jpeg_read_header(&cinfo, TRUE); + *width = cinfo.image_width; + *height = cinfo.image_height; + jpeg_destroy_decompress(&cinfo); + fclose(fi); +} + int swf_SetJPEGBits(TAG * t,char * fname,int quality) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; @@ -184,9 +214,8 @@ int swf_SetJPEGBits(TAG * t,char * fname,int quality) int y = js[x*3+0]; int u = js[x*3+1]; int v = js[x*3+1]; - // untested: js[x*3+0] = y + ((360*(v-128))>>8); - js[x*3+1] = y - ((88*(u-128)-183*(v-128))>>8); + js[x*3+1] = y - ((88*(u-128)+183*(v-128))>>8); js[x*3+2] = y + ((455 * (u-128))>>8); } } @@ -225,29 +254,60 @@ int swf_SetJPEGBits(TAG * t,char * fname,int quality) #ifdef HAVE_ZLIB -int RFXSWF_deflate_wraper(TAG * t,z_stream * zs,U8 * data,boolean finish) -{ while (1) - { int status = deflate(zs,Z_SYNC_FLUSH); +int RFXSWF_deflate_wraper(TAG * t,z_stream * zs,boolean finish) +{ + U8*data=malloc(OUTBUFFER_SIZE); + zs->next_out = data; + zs->avail_out = OUTBUFFER_SIZE; + while (1) + { int status = deflate(zs,Z_NO_FLUSH); + + if (status!=Z_OK) + { +#ifdef DEBUG_RFXSWF + fprintf(stderr,"rfxswf: zlib compression error (%i)\n",status); +#endif + free(data); + return status; + } - if (zs->avail_out == 0) - { swf_SetBlock(t,data,zs->next_out-data); + if (zs->next_out!=data) + { swf_SetBlock(t,data,zs->next_out - data); zs->next_out = data; zs->avail_out = OUTBUFFER_SIZE; } if (zs->avail_in==0) - { if (finish) deflate(zs,Z_FINISH); break; - } + } - if (status!=Z_OK) + if(!finish) { + free(data); + return 0; + } + + while(1) { + int status = deflate(zs,Z_FINISH); + if (status!=Z_OK && status!=Z_STREAM_END) { #ifdef DEBUG_RFXSWF fprintf(stderr,"rfxswf: zlib compression error (%i)\n",status); #endif + free(data); return status; } + + if (zs->next_out!=data) + { + swf_SetBlock(t,data,zs->next_out - data); + zs->next_out = data; + zs->avail_out = OUTBUFFER_SIZE; + } + + if(status == Z_STREAM_END) + break; } + free(data); return 0; } @@ -255,7 +315,6 @@ int RFXSWF_deflate_wraper(TAG * t,z_stream * zs,U8 * data,boolean finish) int swf_SetLosslessBits(TAG * t,U16 width,U16 height,void * bitmap,U8 bitmap_flags) { int res = 0; int bps; - U8 * data; switch (bitmap_flags) { case BMF_8BIT: @@ -270,12 +329,11 @@ int swf_SetLosslessBits(TAG * t,U16 width,U16 height,void * bitmap,U8 bitmap_fla fprintf(stderr, "rfxswf: unknown bitmap type %d\n", bitmap_flags); return -1; } - + swf_SetU8(t,bitmap_flags); swf_SetU16(t,width); swf_SetU16(t,height); - if ((data=malloc(OUTBUFFER_SIZE))) { z_stream zs; memset(&zs,0x00,sizeof(z_stream)); @@ -285,17 +343,23 @@ int swf_SetLosslessBits(TAG * t,U16 width,U16 height,void * bitmap,U8 bitmap_fla if (deflateInit(&zs,Z_DEFAULT_COMPRESSION)==Z_OK) { zs.avail_in = bps*height; zs.next_in = bitmap; - zs.next_out = data; - zs.avail_out = OUTBUFFER_SIZE; - - if (RFXSWF_deflate_wraper(t,&zs,data,TRUE)<0) res = -3; - if (zs.next_out>data) swf_SetBlock(t,data,zs.next_out-data); + if (RFXSWF_deflate_wraper(t,&zs,TRUE)<0) res = -3; deflateEnd(&zs); } else res = -3; // zlib error - free(data); - } else res = -2; // memory error + } + + while(t->len < 64) { /* actually, 63 and above is o.k., but let's stay on the safe side */ + + /* Flash players up to MX crash or do strange things if they encounter a + DefineLossless Tag with a payload of less than 63 bytes. They also + substitute the whole bitmap by a red rectangle. + + This loop fills up the tag with zeroes so that this doesn't happen. + */ + swf_SetU8(t, 0); + } return res; } @@ -303,7 +367,6 @@ int swf_SetLosslessBits(TAG * t,U16 width,U16 height,void * bitmap,U8 bitmap_fla int swf_SetLosslessBitsIndexed(TAG * t,U16 width,U16 height,U8 * bitmap,RGBA * palette,U16 ncolors) { RGBA * pal = palette; int bps = BYTES_PER_SCANLINE(width); - U8 * data; int res = 0; if (!pal) // create default palette for grayscale images @@ -323,7 +386,6 @@ int swf_SetLosslessBitsIndexed(TAG * t,U16 width,U16 height,U8 * bitmap,RGBA * p swf_SetU16(t,height); swf_SetU8(t,ncolors-1); // number of pal entries - if ((data=malloc(OUTBUFFER_SIZE))) { z_stream zs; memset(&zs,0x00,sizeof(z_stream)); @@ -368,29 +430,35 @@ int swf_SetLosslessBitsIndexed(TAG * t,U16 width,U16 height,U8 * bitmap,RGBA * p } zs.next_in = zpal; - zs.next_out = data; - zs.avail_out = OUTBUFFER_SIZE; - if (RFXSWF_deflate_wraper(t,&zs,data,FALSE)<0) res = -3; + if (RFXSWF_deflate_wraper(t,&zs,FALSE)<0) res = -3; // compress bitmap zs.next_in = bitmap; zs.avail_in = (bps*height*sizeof(U8)); - if (RFXSWF_deflate_wraper(t,&zs,data,TRUE)<0) res = -3; + if (RFXSWF_deflate_wraper(t,&zs,TRUE)<0) res = -3; deflateEnd(&zs); - if (zs.next_out>data) swf_SetBlock(t,data,zs.next_out-data); - free(zpal); } else res = -2; // memory error } else res = -3; // zlib error - free(data); - } else res = -2; + } if (!palette) free(pal); + while(t->len < 64) { /* actually, 63 and above is o.k., but let's stay on the safe side */ + + /* Flash players up to MX crash or do strange things if they encounter a + DefineLossless(2) Tag with a payload of less than 63 bytes. They also + substitute the whole bitmap by a red rectangle. + + This loop fills up the tag with zeroes so that this doesn't happen. + */ + swf_SetU8(t, 0); + } + return res; }