4608b6a57537eba2f899d6266626dcfbbb70e256
[swftools.git] / lib / example / zlibtest.c
1 /* zlibtest.c\r
2 \r
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
6 \r
7    Part of the swftools package.\r
8 \r
9    Copyright (c) 2001 Rainer Böhme <rfxswf@reflex-studio.de>\r
10  \r
11    This file is distributed under the GPL, see file COPYING for details \r
12 \r
13 */\r
14 \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
17 \r
18 #include <stdio.h>\r
19 #include <math.h>\r
20 #include <zlib.h>     \r
21 #include "../rfxswf.h"\r
22 \r
23 #define WIDTH           256\r
24 #define HEIGHT          256\r
25 \r
26 #define ID_BITS         1\r
27 #define ID_SHAPE        16\r
28 \r
29 \r
30 int main ( int argc, char ** argv)\r
31 { SWF swf;\r
32   LPTAG t;\r
33   RGBA rgb;\r
34   LPSHAPE s;\r
35   MATRIX m;\r
36   SRECT r;\r
37   LPJPEGBITS jpeg;\r
38   int i;\r
39   \r
40   int ls; // line style\r
41   int fs; // fill style\r
42 \r
43   int dx = 256; // bitmap size\r
44   int dy = 256;\r
45   int bps8, bps16, bps32;    // bytes per scanline\r
46 \r
47   U8 * bitmap8;\r
48   U16 * bitmap16;\r
49   RGBA * bitmap32;\r
50   RGBA * pal;\r
51 \r
52   // create test texture\r
53 \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
57   \r
58   pal = malloc(256*sizeof(RGBA));\r
59 \r
60   bitmap8 = malloc(bps8*dy);\r
61   bitmap16 = malloc(bps16*dy);\r
62   bitmap32 = malloc(bps32*dy);\r
63   \r
64   if ((bitmap8) && (pal) && (bitmap16))\r
65   { int x,y;\r
66     for (y=0;y<dy;y++)\r
67       for (x=0;x<dx;x++)\r
68         bitmap8[y*bps8+x] = (y/16)*16+(x/16);\r
69 \r
70     for (x=0;x<256;x++)\r
71     { pal[x].r = (x&0xf)*16;\r
72       pal[x].g = (x*2)&0xff;\r
73       pal[x].b = x&0xf0;\r
74       pal[x].a = (x==0xff)?0:0xff;\r
75     }\r
76 \r
77     for (y=0;y<dy;y++)\r
78       for (x=0;x<dx;x++)\r
79         bitmap16[y*(bps16>>1)+x] = ((x&0xf0)==(y&0xf0))?0xffff:(x&0x0f)<(y&0xf)?BM16_RED|BM16_GREEN:BM16_BLUE;\r
80 \r
81     for (y=0;y<dy;y++)\r
82       for (x=0;x<dx;x++)\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
86         }\r
87 \r
88   } \r
89   \r
90   // put texture into flash movie\r
91 \r
92   memset(&swf,0x00,sizeof(SWF));\r
93 \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
98 \r
99   swf.FirstTag = InsertTag(NULL,ST_SETBACKGROUNDCOLOR);\r
100   t = swf.FirstTag;\r
101 \r
102     rgb.r = 0xff;\r
103     rgb.b = 0xff;\r
104     rgb.g = 0xff;\r
105     SetRGB(t,&rgb);\r
106 \r
107   t = InsertTag(t,ST_DEFINEBITSLOSSLESS);\r
108 \r
109     SetU16(t,ID_BITS);\r
110     SetLosslessBits(t,dx,dy,bitmap32,BMF_32BIT);\r
111     \r
112   t = InsertTag(t,ST_DEFINEBITSLOSSLESS2);\r
113 \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
120     */\r
121 \r
122     SetU16(t,ID_BITS+1);\r
123     SetLosslessBitsIndexed(t,dx,dy,bitmap8,pal,256);\r
124     \r
125   t = InsertTag(t,ST_DEFINEBITSLOSSLESS);\r
126 \r
127     SetU16(t,ID_BITS+2);\r
128     SetLosslessBits(t,dx,dy,bitmap16,BMF_16BIT);\r
129 \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
133   */\r
134 \r
135   for (i=0;i<9;i++)\r
136   {\r
137     t = InsertTag(t,ST_DEFINESHAPE);\r
138     \r
139     NewShape(&s);\r
140     rgb.b = rgb.g = rgb.r = 0x00;\r
141     ls = ShapeAddLineStyle(s,10,&rgb);  \r
142 \r
143     GetMatrix(NULL,&m);\r
144     m.sx = (6*WIDTH/dx)<<16;\r
145     m.sy = (6*HEIGHT/dy)<<16;\r
146 \r
147     fs = ShapeAddBitmapFillStyle(s,&m,ID_BITS+((i+(i/3))%3),0);\r
148     \r
149     SetU16(t,ID_SHAPE+i);   // ID   \r
150 \r
151     r.xmin = 0;\r
152     r.ymin = 0;\r
153     r.xmax = 6*WIDTH;\r
154     r.ymax = 6*HEIGHT;\r
155 \r
156     SetRect(t,&r);\r
157 \r
158     SetShapeStyles(t,s);\r
159     ShapeCountBits(s,NULL,NULL);\r
160     SetShapeBits(t,s);\r
161 \r
162     ShapeSetAll(t,s,0,0,ls,fs,0);\r
163 \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
168     ShapeSetEnd(t);\r
169 \r
170     GetMatrix(NULL,&m);\r
171     m.tx = (i%3) * (6*WIDTH+60);\r
172     m.ty = (i/3) * (6*HEIGHT+60);\r
173 \r
174   t = InsertTag(t,ST_PLACEOBJECT2);\r
175     ObjectPlace(t,ID_SHAPE+i,1+i,&m,NULL,NULL);\r
176   }\r
177 \r
178   t = InsertTag(t,ST_SHOWFRAME);\r
179 \r
180   t = InsertTag(t,ST_END);\r
181 \r
182   WriteCGI(&swf);\r
183   FreeTags(&swf);\r
184 \r
185   free(pal);\r
186   free(bitmap8);\r
187   free(bitmap16);\r
188   free(bitmap32);  \r
189   return 0;\r
190 }\r