Hi Piers,

Thanks. I’ve applied this to trunk – finally. Sorry for the delay.

Dan.

On 23 March 2010 17:34, Piers Haken <pie...@hotmail.com> wrote:
> This patch fixes import-jpeg. There’s a bug in the parsing of the JPEG
> header – it was blindly searching for section headers in the file without
> following the file structure. If the pattern of the section header happens
> to appear wthin a section’s data then the image size is reported
> incorrectly.
>
>
>
> Piers.
>
>
>
>
>
> diff -r -u swfmill-0.3.0.orig\src\swft\swft_import_jpeg.cpp
> swfmill-0.3.0\src\swft\swft_import_jpeg.cpp
>
> --- swfmill-0.3.0.orig\src\swft\swft_import_jpeg.cpp     Sun Nov 29 17:18:54
> 2009
>
> +++ swfmill-0.3.0\src\swft\swft_import_jpeg.cpp           Mon Mar 22
> 16:35:11 2010
>
> @@ -23,6 +23,66 @@
>
>                return r;
>
> }
>
> +bool getJpegDimensions (FILE * infile, int &image_width, int &image_height)
>
> +{
>
> +             image_width = image_height = 0;
>
> +
>
> +             if (fgetc(infile) != 0xFF || fgetc(infile) != 0xD8 )
>
> +                             return false;
>
> +
>
> +             while (!feof (infile))
>
> +             {
>
> +                             if (fgetc (infile) != 0xff)
>
> +                                             return false;
>
> +
>
> +                             int marker;
>
> +                             do
>
> +                                             marker = fgetc (infile);
>
> +                             while (marker == 0xff);
>
> +
>
> +                             switch (marker)
>
> +                             {
>
> +                                             case 0xC0:
>
> +                                             case 0xC1:
>
> +                                             case 0xC2:
>
> +                                             case 0xC3:
>
> +                                             case 0xC5:
>
> +                                             case 0xC6:
>
> +                                             case 0xC7:
>
> +                                             case 0xC9:
>
> +                                             case 0xCA:
>
> +                                             case 0xCB:
>
> +                                             case 0xCD:
>
> +                                             case 0xCE:
>
> +                                             case 0xCF:
>
> +                                                             {
>
> +
> int length = getJpegWord (infile);
>
> +
> fgetc (infile);
>
> +
> image_height = getJpegWord (infile);
>
> +
> image_width = getJpegWord (infile);
>
> +
> fgetc (infile);
>
> +
>
> +
>                                                                 return true;
>
> +                                                             }
>
> +                                             case 0xDA:
>
> +                                             case 0xD9:
>
> +                                                             return false;
>
> +                                             default:
>
> +                                                             {
>
> +
> int length = getJpegWord (infile);
>
> +
>
> +
> if (length < 2)
>
> +
> return false;
>
> +
>
> +
> fseek (infile, length - 2, SEEK_CUR);
>
> +                                                             }
>
> +                                                             break;
>
> +                             }
>
> +             }
>
> +
>
> +             return false;
>
> +}
>
> +
>
> void swft_import_jpeg( xmlXPathParserContextPtr ctx, int nargs ) {
>
>                xsltTransformContextPtr tctx;
>
>                unsigned char *filename;
>
> @@ -155,9 +215,10 @@
>
>
>
>                 // figure width/height
>
>                int width=-1, height=-1;
>
> +             /*
>
>                while( !feof( fp ) ) { // could do a && width==-1 here, but
> that captures preview imgs...
>
>                                if( fgetc(fp) == 0xff ) {
>
> -                                              if( fgetc(fp) == 0xc0 ) {
>
> +                                             if( (fgetc(fp) &0xf0) == 0xc0
> ) {
>
>                                                                //
> StartOfFrame
>
>                                                                // skip
> length and precision (UGLY, eh?)
>
>                                                                fgetc(fp);
> fgetc(fp); fgetc(fp);
>
> @@ -168,14 +229,24 @@
>
>                                                }
>
>                                }
>
>                }
>
> +             */
>
> +
>
> +             unsigned char *jpegdata = NULL;
>
> +             unsigned char *data = NULL;
>
> +
>
> +             if (!getJpegDimensions (fp, width, height))
>
> +             {
>
> +                             fprintf(stderr,"WARNING: could not extract
> dimensions for jpeg %s\n", filename );
>
> +                             goto fail;
>
> +             }
>
> +
>
> +
>
>                snprintf(tmp,TMP_STRLEN,"%i", width);
>
>                xmlSetProp( node, (const xmlChar *)"width", (const xmlChar
> *)&tmp );
>
>                snprintf(tmp,TMP_STRLEN,"%i", height);
>
>                xmlSetProp( node, (const xmlChar *)"height", (const xmlChar
> *)&tmp );
>
>
>
>                 // add data
>
> -              unsigned char *jpegdata = NULL;
>
> -              unsigned char *data = NULL;
>
>                int data_size, mask_size;
>
>                int size, ofs;
>
>                struct stat filestat;
>
> @@ -252,4 +323,3 @@
>
>                if( data ) delete data;
>
>                if( jpegdata ) delete jpegdata;
>
> }
>
> -
>
> _______________________________________________
> swfmill mailing list
> swfmill@osflash.org
> http://osflash.org/mailman/listinfo/swfmill_osflash.org
>
>
_______________________________________________
swfmill mailing list
swfmill@osflash.org
http://osflash.org/mailman/listinfo/swfmill_osflash.org

Reply via email to