3 Little example for rfxswf's lossless bitmap functions.
\r
4 This program gives swf cgi output of three zlib compressed
\r
5 images: 8 bit indexed, 16 and 32 bit
\r
7 Part of the swftools package.
\r
9 Copyright (c) 2001 Rainer Böhme <rfxswf@reflex-studio.de>
\r
11 This file is distributed under the GPL, see file COPYING for details
\r
15 // There's no makefile so try to compile like this on linux/gcc:
\r
16 // cc zlibtest.c ../rfxswf.c -funsigned-char -o zlibtest -lm -ljpeg -lz; cp zlibtest /home/www/cgi-bin/zlibtest
\r
21 #include "../rfxswf.h"
\r
30 int main ( int argc, char ** argv)
\r
40 int ls; // line style
\r
41 int fs; // fill style
\r
43 int dx = 256; // bitmap size
\r
45 int bps8, bps16, bps32; // bytes per scanline
\r
52 // create test texture
\r
54 bps8 = BYTES_PER_SCANLINE(dx*sizeof(U8));
\r
55 bps16 = BYTES_PER_SCANLINE(dx*sizeof(U16));
\r
56 bps32 = BYTES_PER_SCANLINE(dx*sizeof(U32));
\r
58 pal = malloc(256*sizeof(RGBA));
\r
60 bitmap8 = malloc(bps8*dy);
\r
61 bitmap16 = malloc(bps16*dy);
\r
62 bitmap32 = malloc(bps32*dy);
\r
64 if ((bitmap8) && (pal) && (bitmap16))
\r
68 bitmap8[y*bps8+x] = (y/16)*16+(x/16);
\r
71 { pal[x].r = (x&0xf)*16;
\r
72 pal[x].g = (x*2)&0xff;
\r
74 pal[x].a = (x==0xff)?0:0xff;
\r
79 bitmap16[y*(bps16>>1)+x] = ((x&0xf0)==(y&0xf0))?0xffff:(x&0x0f)<(y&0xf)?BM16_RED|BM16_GREEN:BM16_BLUE;
\r
83 { bitmap32[y*(bps32>>2)+x].r = /*((x&0x10)==(y&0x10))?*/((x&4)==(y&4))?y:x;
\r
84 bitmap32[y*(bps32>>2)+x].g = x;
\r
85 bitmap32[y*(bps32>>2)+x].b = y;
\r
90 // put texture into flash movie
\r
92 memset(&swf,0x00,sizeof(SWF));
\r
94 swf.FileVersion = 4;
\r
95 swf.FrameRate = 0x1800;
\r
96 swf.MovieSize.xmax = 20*WIDTH;
\r
97 swf.MovieSize.ymax = 20*HEIGHT;
\r
99 swf.FirstTag = InsertTag(NULL,ST_SETBACKGROUNDCOLOR);
\r
107 t = InsertTag(t,ST_DEFINEBITSLOSSLESS);
\r
110 SetLosslessBits(t,dx,dy,bitmap32,BMF_32BIT);
\r
112 t = InsertTag(t,ST_DEFINEBITSLOSSLESS2);
\r
114 /* be careful with ST_DEFINEBITSLOSSLESS2, because
\r
115 the Flash player produces great bugs if you use too many
\r
116 alpha colors in your palette. The only sensible result that
\r
117 can be archeived is setting one color to r=0,b=0,g=0,a=0 to
\r
118 make transparent parts in sprites. That's the cause why alpha
\r
119 handling is implemented in lossless routines of rfxswf.
\r
122 SetU16(t,ID_BITS+1);
\r
123 SetLosslessBitsIndexed(t,dx,dy,bitmap8,pal,256);
\r
125 t = InsertTag(t,ST_DEFINEBITSLOSSLESS);
\r
127 SetU16(t,ID_BITS+2);
\r
128 SetLosslessBits(t,dx,dy,bitmap16,BMF_16BIT);
\r
130 /* By the way: ST_DEFINELOSSLESS2 produces stange output on
\r
131 16 and 32 bits image data, too.... it seems that the
\r
132 ming developers deal with the same problem.
\r
137 t = InsertTag(t,ST_DEFINESHAPE);
\r
140 rgb.b = rgb.g = rgb.r = 0x00;
\r
141 ls = ShapeAddLineStyle(s,10,&rgb);
\r
143 GetMatrix(NULL,&m);
\r
144 m.sx = (6*WIDTH/dx)<<16;
\r
145 m.sy = (6*HEIGHT/dy)<<16;
\r
147 fs = ShapeAddBitmapFillStyle(s,&m,ID_BITS+((i+(i/3))%3),0);
\r
149 SetU16(t,ID_SHAPE+i); // ID
\r
158 SetShapeStyles(t,s);
\r
159 ShapeCountBits(s,NULL,NULL);
\r
162 ShapeSetAll(t,s,0,0,ls,fs,0);
\r
164 ShapeSetLine(t,s,6*WIDTH,0);
\r
165 ShapeSetLine(t,s,0,6*HEIGHT);
\r
166 ShapeSetLine(t,s,-6*WIDTH,0);
\r
167 ShapeSetLine(t,s,0,-6*HEIGHT);
\r
170 GetMatrix(NULL,&m);
\r
171 m.tx = (i%3) * (6*WIDTH+60);
\r
172 m.ty = (i/3) * (6*HEIGHT+60);
\r
174 t = InsertTag(t,ST_PLACEOBJECT2);
\r
175 ObjectPlace(t,ID_SHAPE+i,1+i,&m,NULL,NULL);
\r
178 t = InsertTag(t,ST_SHOWFRAME);
\r
180 t = InsertTag(t,ST_END);
\r