Part of the swftools package.
- Copyright (c) 2002 Matthias Kramm <kramm@quiss.org>
+ Copyright (c) 2002,2003 Matthias Kramm <kramm@quiss.org>
+
+ 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 */
- This file is distributed under the GPL, see file COPYING for details
-
-*/
-
#include <stdio.h>
#include <math.h>
#include <fcntl.h>
t = swf->firstTag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR);
rgb.r = rgb.g = rgb.b = rgb.a = 0x00;
- rgb.g = 0xff;
+ //rgb.g = 0xff; <--- handy for testing alpha conversion
swf_SetRGB(t, &rgb);
return t;
c = data[10]; // compression mode (0)
f = data[11]; // filter mode (0)
i = data[12]; // interlace mode (0)
+
+ if(VERBOSE(2)) printf("image mode:%d\n", b);
+ if(VERBOSE(2)) printf("bpp: %d\n", a);
+ if(VERBOSE(2)) printf("compression: %d\n", c);
+ if(VERBOSE(2)) printf("filter: %d\n", f);
+ if(VERBOSE(2)) printf("interlace: %d\n", i);
- if(b!=2 && b!=3 && b!=6) {
+ if(b!=0 && b!=2 && b!=3 && b!=6) {
fprintf(stderr, "Image mode %d not supported!\n", b);
exit(1);
}
lastr = dest[1];
lastg = dest[2];
lastb = dest[3];
- upperlastr = old[0];
+ upperlasta = old[0];
upperlastr = old[1];
upperlastg = old[2];
upperlastb = old[3];
if(!png_read_header(fi, &header))
return 0;
- if(header.mode == 3) bypp = 1;
+ if(header.mode == 3 || header.mode == 0) bypp = 1;
else
if(header.mode == 2) bypp = 3;
else
}
free(data2);
}
- else {
- RGBA*rgba = (RGBA*)malloc(palettelen*sizeof(RGBA));
+ else if(header.mode == 0 || header.mode == 3) {
+ RGBA*rgba;
int swf_width = BYTES_PER_SCANLINE(header.width);
U8*data2 = malloc(swf_width*header.height);
U8*tmpline = malloc(header.width);
int i,x,y;
int pos=0;
- if(!palette) {
- fprintf(stderr, "Error: No palette found!\n");
- exit(1);
- }
- /* 24->32 bit conversion */
- for(i=0;i<palettelen;i++) {
- rgba[i].r = palette[i*3+0];
- rgba[i].g = palette[i*3+1];
- rgba[i].b = palette[i*3+2];
- if(alphapalette && i<alphapalettelen) {
- rgba[i].a = alphapalette[i];
- if(alphapalette[i] == 0) {
- /* if the color is fully transparent, it doesn't matter
- what it's rgb values are. furthermore, all Flash
- players up to Flash 5 can't deal with anything beyond
- one transparent color with value (00,00,00,00). */
- rgba[i].r = rgba[i].g = rgba[i].b = 0;
+ if(header.mode == 3) { // palette or grayscale?
+ rgba = (RGBA*)malloc(palettelen*sizeof(RGBA));
+ if(!palette) {
+ fprintf(stderr, "Error: No palette found!\n");
+ exit(1);
+ }
+ /* 24->32 bit conversion */
+ for(i=0;i<palettelen;i++) {
+ rgba[i].r = palette[i*3+0];
+ rgba[i].g = palette[i*3+1];
+ rgba[i].b = palette[i*3+2];
+ if(alphapalette && i<alphapalettelen) {
+ rgba[i].a = alphapalette[i];
+ if(alphapalette[i] == 0) {
+ /* if the color is fully transparent, it doesn't matter
+ what it's rgb values are. furthermore, all Flash
+ players up to Flash 5 can't deal with anything beyond
+ one transparent color with value (00,00,00,00). */
+ rgba[i].r = rgba[i].g = rgba[i].b = 0;
+ }
+ } else {
+ rgba[i].a = 255;
}
- } else {
- rgba[i].a = 255;
+ }
+ } else {
+ palettelen = 256;
+ rgba = (RGBA*)malloc(palettelen*sizeof(RGBA));
+ for(i=0;i<256;i++) {
+ rgba[i].r = i;
+ rgba[i].g = i;
+ rgba[i].b = i;
}
}