-/* zlibtest.c\r
-\r
- Little example for rfxswf's lossless bitmap functions.\r
- This program gives swf cgi output of three zlib compressed\r
- images: 8 bit indexed, 16 and 32 bit\r
-\r
- Part of the swftools package.\r
-\r
- Copyright (c) 2001 Rainer Böhme <rfxswf@reflex-studio.de>\r
- \r
- This file is distributed under the GPL, see file COPYING for details \r
-\r
-*/\r
-\r
-// There's no makefile so try to compile like this on linux/gcc:\r
-// cc zlibtest.c ../rfxswf.c -funsigned-char -o zlibtest -lm -ljpeg -lz; cp zlibtest /home/www/cgi-bin/zlibtest\r
-\r
-#include <stdio.h>\r
-#include <math.h>\r
-#include <zlib.h> \r
-#include "../rfxswf.h"\r
-\r
-#define WIDTH 256\r
-#define HEIGHT 256\r
-\r
-#define ID_BITS 1\r
-#define ID_SHAPE 16\r
-\r
-\r
-int main ( int argc, char ** argv)\r
-{ SWF swf;\r
- LPTAG t;\r
- RGBA rgb;\r
- LPSHAPE s;\r
- MATRIX m;\r
- SRECT r;\r
- LPJPEGBITS jpeg;\r
- int i;\r
- \r
- int ls; // line style\r
- int fs; // fill style\r
-\r
- int dx = 256; // bitmap size\r
- int dy = 256;\r
- int bps8, bps16, bps32; // bytes per scanline\r
-\r
- U8 * bitmap8;\r
- U16 * bitmap16;\r
- RGBA * bitmap32;\r
- RGBA * pal;\r
-\r
- // create test texture\r
-\r
- bps8 = BYTES_PER_SCANLINE(dx*sizeof(U8));\r
- bps16 = BYTES_PER_SCANLINE(dx*sizeof(U16));\r
- bps32 = BYTES_PER_SCANLINE(dx*sizeof(U32));\r
- \r
- pal = malloc(256*sizeof(RGBA));\r
-\r
- bitmap8 = malloc(bps8*dy);\r
- bitmap16 = malloc(bps16*dy);\r
- bitmap32 = malloc(bps32*dy);\r
- \r
- if ((bitmap8) && (pal) && (bitmap16))\r
- { int x,y;\r
- for (y=0;y<dy;y++)\r
- for (x=0;x<dx;x++)\r
- bitmap8[y*bps8+x] = (y/16)*16+(x/16);\r
-\r
- for (x=0;x<256;x++)\r
- { pal[x].r = (x&0xf)*16;\r
- pal[x].g = (x*2)&0xff;\r
- pal[x].b = x&0xf0;\r
- pal[x].a = (x==0xff)?0:0xff;\r
- }\r
-\r
- for (y=0;y<dy;y++)\r
- for (x=0;x<dx;x++)\r
- bitmap16[y*(bps16>>1)+x] = ((x&0xf0)==(y&0xf0))?0xffff:(x&0x0f)<(y&0xf)?BM16_RED|BM16_GREEN:BM16_BLUE;\r
-\r
- for (y=0;y<dy;y++)\r
- for (x=0;x<dx;x++)\r
- { bitmap32[y*(bps32>>2)+x].r = /*((x&0x10)==(y&0x10))?*/((x&4)==(y&4))?y:x;\r
- bitmap32[y*(bps32>>2)+x].g = x;\r
- bitmap32[y*(bps32>>2)+x].b = y;\r
- }\r
-\r
- } \r
- \r
- // put texture into flash movie\r
-\r
- memset(&swf,0x00,sizeof(SWF));\r
-\r
- swf.FileVersion = 4;\r
- swf.FrameRate = 0x1800;\r
- swf.MovieSize.xmax = 20*WIDTH;\r
- swf.MovieSize.ymax = 20*HEIGHT;\r
-\r
- swf.FirstTag = InsertTag(NULL,ST_SETBACKGROUNDCOLOR);\r
- t = swf.FirstTag;\r
-\r
- rgb.r = 0xff;\r
- rgb.b = 0xff;\r
- rgb.g = 0xff;\r
- SetRGB(t,&rgb);\r
-\r
- t = InsertTag(t,ST_DEFINEBITSLOSSLESS);\r
-\r
- SetU16(t,ID_BITS);\r
- SetLosslessBits(t,dx,dy,bitmap32,BMF_32BIT);\r
- \r
- t = InsertTag(t,ST_DEFINEBITSLOSSLESS2);\r
-\r
- /* be careful with ST_DEFINEBITSLOSSLESS2, because\r
- the Flash player produces great bugs if you use too many\r
- alpha colors in your palette. The only sensible result that\r
- can be archeived is setting one color to r=0,b=0,g=0,a=0 to\r
- make transparent parts in sprites. That's the cause why alpha\r
- handling is implemented in lossless routines of rfxswf.\r
- */\r
-\r
- SetU16(t,ID_BITS+1);\r
- SetLosslessBitsIndexed(t,dx,dy,bitmap8,pal,256);\r
- \r
- t = InsertTag(t,ST_DEFINEBITSLOSSLESS);\r
-\r
- SetU16(t,ID_BITS+2);\r
- SetLosslessBits(t,dx,dy,bitmap16,BMF_16BIT);\r
-\r
- /* By the way: ST_DEFINELOSSLESS2 produces stange output on\r
- 16 and 32 bits image data, too.... it seems that the\r
- ming developers deal with the same problem.\r
- */\r
-\r
- for (i=0;i<9;i++)\r
- {\r
- t = InsertTag(t,ST_DEFINESHAPE);\r
- \r
- NewShape(&s);\r
- rgb.b = rgb.g = rgb.r = 0x00;\r
- ls = ShapeAddLineStyle(s,10,&rgb); \r
-\r
- GetMatrix(NULL,&m);\r
- m.sx = (6*WIDTH/dx)<<16;\r
- m.sy = (6*HEIGHT/dy)<<16;\r
-\r
- fs = ShapeAddBitmapFillStyle(s,&m,ID_BITS+((i+(i/3))%3),0);\r
- \r
- SetU16(t,ID_SHAPE+i); // ID \r
-\r
- r.xmin = 0;\r
- r.ymin = 0;\r
- r.xmax = 6*WIDTH;\r
- r.ymax = 6*HEIGHT;\r
-\r
- SetRect(t,&r);\r
-\r
- SetShapeStyles(t,s);\r
- ShapeCountBits(s,NULL,NULL);\r
- SetShapeBits(t,s);\r
-\r
- ShapeSetAll(t,s,0,0,ls,fs,0);\r
-\r
- ShapeSetLine(t,s,6*WIDTH,0);\r
- ShapeSetLine(t,s,0,6*HEIGHT);\r
- ShapeSetLine(t,s,-6*WIDTH,0);\r
- ShapeSetLine(t,s,0,-6*HEIGHT);\r
- ShapeSetEnd(t);\r
-\r
- GetMatrix(NULL,&m);\r
- m.tx = (i%3) * (6*WIDTH+60);\r
- m.ty = (i/3) * (6*HEIGHT+60);\r
-\r
- t = InsertTag(t,ST_PLACEOBJECT2);\r
- ObjectPlace(t,ID_SHAPE+i,1+i,&m,NULL,NULL);\r
- }\r
-\r
- t = InsertTag(t,ST_SHOWFRAME);\r
-\r
- t = InsertTag(t,ST_END);\r
-\r
- WriteCGI(&swf);\r
- FreeTags(&swf);\r
-\r
- free(pal);\r
- free(bitmap8);\r
- free(bitmap16);\r
- free(bitmap32); \r
- return 0;\r
-}\r
+/* zlibtest.c
+
+ Little example for rfxswf's lossless bitmap functions.
+ This program creates a swf with three zlib compressed
+ images: 8 bit indexed, 16 and 32 bit
+
+ Part of the swftools package.
+
+ Copyright (c) 2001 Rainer Böhme <rfxswf@reflex-studio.de>
+
+ This file is distributed under the GPL, see file COPYING for details
+
+*/
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <math.h>
+#include "../rfxswf.h"
+
+#define WIDTH 256
+#define HEIGHT 256
+
+#define ID_BITS 1
+#define ID_SHAPE 16
+
+
+int main ( int argc, char ** argv)
+{ SWF swf;
+ LPTAG t;
+ RGBA rgb;
+ LPSHAPE s;
+ MATRIX m;
+ SRECT r;
+ LPJPEGBITS jpeg;
+ int i,f;
+
+ int ls; // line style
+ int fs; // fill style
+
+ int dx = 256; // bitmap size
+ int dy = 256;
+ int bps8, bps16, bps32; // bytes per scanline
+
+ U8 * bitmap8;
+ U16 * bitmap16;
+ RGBA * bitmap32;
+ RGBA * pal;
+
+ // create test texture
+
+ bps8 = BYTES_PER_SCANLINE(dx*sizeof(U8));
+ bps16 = BYTES_PER_SCANLINE(dx*sizeof(U16));
+ bps32 = BYTES_PER_SCANLINE(dx*sizeof(U32));
+
+ pal = malloc(256*sizeof(RGBA));
+
+ bitmap8 = malloc(bps8*dy);
+ bitmap16 = malloc(bps16*dy);
+ bitmap32 = malloc(bps32*dy);
+
+ if ((bitmap8) && (pal) && (bitmap16))
+ { int x,y;
+ for (y=0;y<dy;y++)
+ for (x=0;x<dx;x++)
+ bitmap8[y*bps8+x] = (y/16)*16+(x/16);
+
+ for (x=0;x<256;x++)
+ { pal[x].r = (x&0xf)*16;
+ pal[x].g = (x*2)&0xff;
+ pal[x].b = x&0xf0;
+ pal[x].a = (x==0xff)?0:0xff;
+ }
+
+ for (y=0;y<dy;y++)
+ for (x=0;x<dx;x++)
+ bitmap16[y*(bps16>>1)+x] = ((x&0xf0)==(y&0xf0))?0xffff:(x&0x0f)<(y&0xf)?BM16_RED|BM16_GREEN:BM16_BLUE;
+
+ for (y=0;y<dy;y++)
+ for (x=0;x<dx;x++)
+ { bitmap32[y*(bps32>>2)+x].r = /*((x&0x10)==(y&0x10))?*/((x&4)==(y&4))?y:x;
+ bitmap32[y*(bps32>>2)+x].g = x;
+ bitmap32[y*(bps32>>2)+x].b = y;
+ }
+
+ }
+
+ // put texture into flash movie
+
+ memset(&swf,0x00,sizeof(SWF));
+
+ swf.fileVersion = 4;
+ swf.frameRate = 0x1800;
+ swf.movieSize.xmax = 20*WIDTH;
+ swf.movieSize.ymax = 20*HEIGHT;
+
+ swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR);
+ t = swf.firstTag;
+
+ rgb.r = 0xff;
+ rgb.b = 0xff;
+ rgb.g = 0xff;
+ swf_SetRGB(t,&rgb);
+
+ t = swf_InsertTag(t,ST_DEFINEBITSLOSSLESS);
+
+ swf_SetU16(t,ID_BITS);
+ swf_SetLosslessBits(t,dx,dy,bitmap32,BMF_32BIT);
+
+ t = swf_InsertTag(t,ST_DEFINEBITSLOSSLESS2);
+
+ /* be careful with ST_DEFINEBITSLOSSLESS2, because
+ the Flash player produces great bugs if you use too many
+ alpha colors in your palette. The only sensible result that
+ can be archeived is setting one color to r=0,b=0,g=0,a=0 to
+ make transparent parts in sprites. That's the cause why alpha
+ handling is implemented in lossless routines of rfxswf.
+ */
+
+ swf_SetU16(t,ID_BITS+1);
+ swf_SetLosslessBitsIndexed(t,dx,dy,bitmap8,pal,256);
+
+ t = swf_InsertTag(t,ST_DEFINEBITSLOSSLESS);
+
+ swf_SetU16(t,ID_BITS+2);
+ swf_SetLosslessBits(t,dx,dy,bitmap16,BMF_16BIT);
+
+ /* By the way: ST_DEFINELOSSLESS2 produces stange output on
+ 16 and 32 bits image data, too.... it seems that the
+ ming developers deal with the same problem.
+ */
+
+ for (i=0;i<9;i++)
+ {
+ t = swf_InsertTag(t,ST_DEFINESHAPE);
+
+ swf_ShapeNew(&s);
+ rgb.b = rgb.g = rgb.r = 0x00;
+ ls = swf_ShapeAddLineStyle(s,10,&rgb);
+
+ swf_GetMatrix(NULL,&m);
+ m.sx = (6*WIDTH/dx)<<16;
+ m.sy = (6*HEIGHT/dy)<<16;
+
+ fs = swf_ShapeAddBitmapFillStyle(s,&m,ID_BITS+((i+(i/3))%3),0);
+
+ swf_SetU16(t,ID_SHAPE+i); // ID
+
+ r.xmin = 0;
+ r.ymin = 0;
+ r.xmax = 6*WIDTH;
+ r.ymax = 6*HEIGHT;
+
+ swf_SetRect(t,&r);
+
+ swf_SetShapeStyles(t,s);
+ swf_ShapeCountBits(s,NULL,NULL);
+ swf_SetShapeBits(t,s);
+
+ swf_ShapeSetAll(t,s,0,0,ls,fs,0);
+
+ swf_ShapeSetLine(t,s,6*WIDTH,0);
+ swf_ShapeSetLine(t,s,0,6*HEIGHT);
+ swf_ShapeSetLine(t,s,-6*WIDTH,0);
+ swf_ShapeSetLine(t,s,0,-6*HEIGHT);
+ swf_ShapeSetEnd(t);
+
+ swf_GetMatrix(NULL,&m);
+ m.tx = (i%3) * (6*WIDTH+60);
+ m.ty = (i/3) * (6*HEIGHT+60);
+
+ t = swf_InsertTag(t,ST_PLACEOBJECT2);
+ swf_ObjectPlace(t,ID_SHAPE+i,1+i,&m,NULL,NULL);
+ }
+
+ t = swf_InsertTag(t,ST_SHOWFRAME);
+
+ t = swf_InsertTag(t,ST_END);
+
+// swf_WriteCGI(&swf);
+
+ f = open("zlibtest.swf",O_RDWR|O_CREAT|O_TRUNC,0644);
+ if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n");
+ close(f);
+
+ swf_FreeTags(&swf);
+
+#ifdef __NT__
+ system("start ..\\zlibtest.swf");
+#endif
+
+ free(pal);
+ free(bitmap8);
+ free(bitmap16);
+ free(bitmap32);
+ return 0;
+}