swfmill 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. data/.document +5 -0
  2. data/.gitignore +23 -0
  3. data/.swfmill +240 -0
  4. data/LICENSE +340 -0
  5. data/README.rdoc +37 -0
  6. data/Rakefile +59 -0
  7. data/VERSION +1 -0
  8. data/ext/.gitignore +5 -0
  9. data/ext/extconf.rb +86 -0
  10. data/ext/swfmill/.gitignore +27 -0
  11. data/ext/swfmill/AUTHORS +9 -0
  12. data/ext/swfmill/COPYING +340 -0
  13. data/ext/swfmill/Makefile.am +14 -0
  14. data/ext/swfmill/Makefile.in +635 -0
  15. data/ext/swfmill/NEWS +189 -0
  16. data/ext/swfmill/README +170 -0
  17. data/ext/swfmill/TODO +33 -0
  18. data/ext/swfmill/aclocal.m4 +7712 -0
  19. data/ext/swfmill/autogen.sh +7 -0
  20. data/ext/swfmill/compile +142 -0
  21. data/ext/swfmill/config.guess +1516 -0
  22. data/ext/swfmill/config.sub +1626 -0
  23. data/ext/swfmill/configure +21868 -0
  24. data/ext/swfmill/configure.ac +55 -0
  25. data/ext/swfmill/depcomp +589 -0
  26. data/ext/swfmill/install-sh +519 -0
  27. data/ext/swfmill/ltmain.sh +6964 -0
  28. data/ext/swfmill/missing +367 -0
  29. data/ext/swfmill/src/Geom.cpp +107 -0
  30. data/ext/swfmill/src/Geom.h +100 -0
  31. data/ext/swfmill/src/Makefile.am +86 -0
  32. data/ext/swfmill/src/Makefile.in +1025 -0
  33. data/ext/swfmill/src/SWF.h +11941 -0
  34. data/ext/swfmill/src/SWFAction.cpp +41 -0
  35. data/ext/swfmill/src/SWFAction.h +19 -0
  36. data/ext/swfmill/src/SWFBasic.h +7 -0
  37. data/ext/swfmill/src/SWFFile.cpp +406 -0
  38. data/ext/swfmill/src/SWFFile.h +34 -0
  39. data/ext/swfmill/src/SWFFilter.cpp +25 -0
  40. data/ext/swfmill/src/SWFFilter.h +15 -0
  41. data/ext/swfmill/src/SWFGlyphList.cpp +262 -0
  42. data/ext/swfmill/src/SWFGlyphList.h +34 -0
  43. data/ext/swfmill/src/SWFIdItem.h +85 -0
  44. data/ext/swfmill/src/SWFIdItems.h +16 -0
  45. data/ext/swfmill/src/SWFItem.cpp +235 -0
  46. data/ext/swfmill/src/SWFItem.h +60 -0
  47. data/ext/swfmill/src/SWFList.h +179 -0
  48. data/ext/swfmill/src/SWFReader.cpp +352 -0
  49. data/ext/swfmill/src/SWFReader.h +73 -0
  50. data/ext/swfmill/src/SWFShapeItem.cpp +220 -0
  51. data/ext/swfmill/src/SWFShapeItem.h +45 -0
  52. data/ext/swfmill/src/SWFShapeMaker.cpp +401 -0
  53. data/ext/swfmill/src/SWFShapeMaker.h +128 -0
  54. data/ext/swfmill/src/SWFTag.cpp +49 -0
  55. data/ext/swfmill/src/SWFTag.h +20 -0
  56. data/ext/swfmill/src/SWFTrait.cpp +35 -0
  57. data/ext/swfmill/src/SWFTrait.h +22 -0
  58. data/ext/swfmill/src/SWFWriter.cpp +312 -0
  59. data/ext/swfmill/src/SWFWriter.h +84 -0
  60. data/ext/swfmill/src/base64.c +110 -0
  61. data/ext/swfmill/src/base64.h +15 -0
  62. data/ext/swfmill/src/codegen/Makefile.am +15 -0
  63. data/ext/swfmill/src/codegen/Makefile.in +346 -0
  64. data/ext/swfmill/src/codegen/basic.xsl +45 -0
  65. data/ext/swfmill/src/codegen/basics.xsl +235 -0
  66. data/ext/swfmill/src/codegen/dumper.xsl +109 -0
  67. data/ext/swfmill/src/codegen/header.xsl +131 -0
  68. data/ext/swfmill/src/codegen/mk.xsl +26 -0
  69. data/ext/swfmill/src/codegen/parser.xsl +196 -0
  70. data/ext/swfmill/src/codegen/parsexml.xsl +312 -0
  71. data/ext/swfmill/src/codegen/size.xsl +189 -0
  72. data/ext/swfmill/src/codegen/source.xml +2197 -0
  73. data/ext/swfmill/src/codegen/writer.xsl +190 -0
  74. data/ext/swfmill/src/codegen/writexml.xsl +138 -0
  75. data/ext/swfmill/src/swfmill.cpp +482 -0
  76. data/ext/swfmill/src/swft/Makefile.am +55 -0
  77. data/ext/swfmill/src/swft/Makefile.in +717 -0
  78. data/ext/swfmill/src/swft/Parser.cpp +76 -0
  79. data/ext/swfmill/src/swft/Parser.h +37 -0
  80. data/ext/swfmill/src/swft/SVGAttributeParser.cpp +78 -0
  81. data/ext/swfmill/src/swft/SVGAttributeParser.h +35 -0
  82. data/ext/swfmill/src/swft/SVGColor.cpp +116 -0
  83. data/ext/swfmill/src/swft/SVGColor.h +37 -0
  84. data/ext/swfmill/src/swft/SVGColors.h +167 -0
  85. data/ext/swfmill/src/swft/SVGGradient.cpp +258 -0
  86. data/ext/swfmill/src/swft/SVGGradient.h +81 -0
  87. data/ext/swfmill/src/swft/SVGPathParser.cpp +155 -0
  88. data/ext/swfmill/src/swft/SVGPathParser.h +126 -0
  89. data/ext/swfmill/src/swft/SVGPointsParser.cpp +51 -0
  90. data/ext/swfmill/src/swft/SVGPointsParser.h +25 -0
  91. data/ext/swfmill/src/swft/SVGStyle.cpp +181 -0
  92. data/ext/swfmill/src/swft/SVGStyle.h +80 -0
  93. data/ext/swfmill/src/swft/SVGTransformParser.cpp +72 -0
  94. data/ext/swfmill/src/swft/SVGTransformParser.h +32 -0
  95. data/ext/swfmill/src/swft/readpng.c +305 -0
  96. data/ext/swfmill/src/swft/readpng.h +92 -0
  97. data/ext/swfmill/src/swft/swft.cpp +251 -0
  98. data/ext/swfmill/src/swft/swft.h +64 -0
  99. data/ext/swfmill/src/swft/swft_document.cpp +57 -0
  100. data/ext/swfmill/src/swft/swft_import.cpp +38 -0
  101. data/ext/swfmill/src/swft/swft_import_binary.cpp +82 -0
  102. data/ext/swfmill/src/swft/swft_import_jpeg.cpp +255 -0
  103. data/ext/swfmill/src/swft/swft_import_mp3.cpp +268 -0
  104. data/ext/swfmill/src/swft/swft_import_png.cpp +231 -0
  105. data/ext/swfmill/src/swft/swft_import_ttf.cpp +519 -0
  106. data/ext/swfmill/src/swft/swft_import_wav.cpp +255 -0
  107. data/ext/swfmill/src/swft/swft_path.cpp +178 -0
  108. data/ext/swfmill/src/xslt/Makefile.am +51 -0
  109. data/ext/swfmill/src/xslt/Makefile.in +536 -0
  110. data/ext/swfmill/src/xslt/README +19 -0
  111. data/ext/swfmill/src/xslt/assemble.xsl +38 -0
  112. data/ext/swfmill/src/xslt/simple-deprecated.xslt +62 -0
  113. data/ext/swfmill/src/xslt/simple-elements.xslt +627 -0
  114. data/ext/swfmill/src/xslt/simple-import.xslt +565 -0
  115. data/ext/swfmill/src/xslt/simple-svg.xslt +383 -0
  116. data/ext/swfmill/src/xslt/simple-tools.xslt +255 -0
  117. data/ext/swfmill/src/xslt/simple.cpp +1686 -0
  118. data/ext/swfmill/src/xslt/simple.xml +7 -0
  119. data/ext/swfmill/src/xslt/xslt.h +7 -0
  120. data/ext/swfmill/test/Makefile.am +1 -0
  121. data/ext/swfmill/test/Makefile.in +490 -0
  122. data/ext/swfmill/test/xml/Makefile.am +20 -0
  123. data/ext/swfmill/test/xml/Makefile.in +353 -0
  124. data/ext/swfmill/test/xml/test-xml +21 -0
  125. data/ext/swfmill_ext.cc +375 -0
  126. data/lib/swfmill.rb +30 -0
  127. data/spec/data/swfmill-banner1.swf +0 -0
  128. data/spec/spec.opts +1 -0
  129. data/spec/spec_helper.rb +14 -0
  130. data/spec/swfmill_spec.rb +125 -0
  131. metadata +206 -0
@@ -0,0 +1,49 @@
1
+ #include <SWFTag.h>
2
+ #include "SWF.h"
3
+ #include <cstring>
4
+
5
+ namespace SWF {
6
+
7
+ Tag *Tag::get( Reader *r, int end, Context *ctx ) {
8
+ uint16_t h = r->getWord();
9
+ int type = h>>6;
10
+ int len = h&0x3F;
11
+ if( len == 0x3F ) { // long size
12
+ len = r->getInt();
13
+ }
14
+
15
+ // sanity check
16
+ if( len > 100000000 ) {
17
+ fprintf(stderr,"ridiculous tag size: %i, ignoring.\n", len );
18
+ // r->setEOF();
19
+ return NULL;
20
+ }
21
+
22
+ Tag *ret = getByType( type );
23
+
24
+ if( !ret ) {
25
+ ret = new UnknownTag;
26
+ }
27
+
28
+ ret->setType( type );
29
+ ret->setLength( len );
30
+ ret->parse( r, r->getPosition()+len, ctx );
31
+
32
+ return ret;
33
+ }
34
+
35
+ void Tag::writeHeader( Writer *w, Context *ctx, size_t len ) {
36
+ // printf("write tag %02X, len %i, recorded %i(+header, 2 or 6), position %i\n", type, len, this->len, w->getPosition() );
37
+ // shouldnt this be 0x3f - macromedia flash seems to use long length for > 1F...
38
+ len -= (len >= SWF_LONG_TAG + 6) ? 6 : 2;
39
+ uint16_t h = type<<6;
40
+ if( len >= SWF_LONG_TAG ) {
41
+ h |= 0x3F;
42
+ w->putWord(h);
43
+ w->putInt(len);
44
+ } else {
45
+ h |= len;
46
+ w->putWord(h);
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,20 @@
1
+ #ifndef SWF_TAG_H
2
+ #define SWF_TAG_H
3
+
4
+ #include <SWFIdItem.h>
5
+
6
+ namespace SWF {
7
+
8
+ #define SWF_LONG_TAG 8
9
+ class Tag : public IdItem<Tag> {
10
+ protected:
11
+ int getHeaderSize( int size ) { return (size/8)>=SWF_LONG_TAG ? (6*8) : (2*8); }
12
+ void writeHeader( Writer *w, Context *ctx, size_t len );
13
+
14
+ // static stuff
15
+ public:
16
+ static Tag* get( Reader *r, int end, Context *ctx );
17
+ };
18
+
19
+ }
20
+ #endif
@@ -0,0 +1,35 @@
1
+ #include <SWFAction.h>
2
+ #include "SWF.h"
3
+ #include <cstring>
4
+
5
+ namespace SWF {
6
+
7
+ Trait *Trait::get( Reader *r, int end, Context *ctx ) {
8
+ int type = r->getNBitInt( 4 );
9
+ int len = end - r->getPosition();
10
+
11
+ Trait* ret = getByType( type );
12
+
13
+ if( !ret ) {
14
+ ret = handleError( type );
15
+ }
16
+
17
+ if( ret ) {
18
+ ret->setType( type );
19
+ ret->setLength( len );
20
+ ret->parse( r, end, ctx );
21
+ }
22
+
23
+ return ret;
24
+ }
25
+
26
+ void Trait::writeHeader( Writer *w, Context *ctx, size_t len ) {
27
+ w->putNBitInt( type, 4 );
28
+ }
29
+
30
+ Trait* Trait::handleError( int type ) {
31
+ fprintf(stderr,"WARNING: unknown trait type 0x%02X\n", type );
32
+ return NULL;
33
+ }
34
+
35
+ }
@@ -0,0 +1,22 @@
1
+ #ifndef SWF_TRAIT_H
2
+ #define SWF_TRAIT_H
3
+
4
+ #include <SWFIdItem.h>
5
+
6
+ namespace SWF {
7
+
8
+ class Trait : public IdItem<Trait> {
9
+ protected:
10
+ int getHeaderSize( int size ) { return 4; }
11
+ void writeHeader( Writer *w, Context *ctx, size_t len );
12
+
13
+ // static stuff
14
+ public:
15
+ static Trait* get( Reader *r, int end, Context *ctx );
16
+
17
+ protected:
18
+ static Trait* handleError( int type );
19
+ };
20
+
21
+ }
22
+ #endif
@@ -0,0 +1,312 @@
1
+ #include "SWFWriter.h"
2
+ #include <cstring>
3
+ #include <cstdlib>
4
+
5
+ namespace SWF {
6
+
7
+ Writer::Writer( unsigned char *d, size_t l ) {
8
+ data = d;
9
+ length = l;
10
+ pos = 0;
11
+ buf = bits = 0;
12
+ err = 0;
13
+ }
14
+
15
+ Writer::Writer( size_t l ) {
16
+ data = new unsigned char[l];
17
+ length = l;
18
+ pos = 0;
19
+ buf = bits = 0;
20
+ err = 0;
21
+ }
22
+
23
+ void Writer::putData( void *src, size_t len ) {
24
+ byteAlign();
25
+ if( !assure( len ) ) return;
26
+ memcpy( &data[pos], src, len );
27
+ pos += len;
28
+ }
29
+
30
+ void Writer::putByte( uint8_t value ) {
31
+ byteAlign();
32
+ writeByte(value);
33
+ }
34
+
35
+ void Writer::putWord( uint16_t value ) {
36
+ byteAlign();
37
+ if( !assure( 2 ) ) return;
38
+ // FIXME x86-centric?
39
+ data[pos++] = value&0xFF;
40
+ data[pos++] = value>>8;
41
+ }
42
+
43
+ void Writer::putInt( uint32_t value ) {
44
+ byteAlign();
45
+ if( !assure( 4 ) ) return;
46
+ // FIXME x86-centric?
47
+ data[pos++] = value&0xFF;
48
+ data[pos++] = (value>>8)&0xFF;
49
+ data[pos++] = (value>>16)&0xFF;
50
+ data[pos++] = (value>>24)&0xFF;
51
+ }
52
+
53
+ void Writer::putInt64( uint64_t value ) {
54
+ byteAlign();
55
+ if( !assure( 8 ) ) return;
56
+
57
+ putInt( value >> 32 );
58
+ putInt( value & 0xffffffff );
59
+ }
60
+
61
+ void Writer::putU30( uint32_t value ) {
62
+ byteAlign();
63
+
64
+ int bytes = 1;
65
+ uint32_t limit = 0x80;
66
+ for(; value > limit - 1; limit *= 0x80) {
67
+ bytes++;
68
+ }
69
+
70
+ if( !assure( bytes ) ) return;
71
+ // FIXME x86-centric?
72
+
73
+ for(; bytes > 0; bytes--) {
74
+ data[pos] = value & 0x7F;
75
+
76
+ if(bytes > 1) {
77
+ value = value >> 7;
78
+ data[pos] |= 0x80;
79
+ }
80
+ pos++;
81
+ }
82
+ }
83
+
84
+ void Writer::putS24( int value ) {
85
+ byteAlign();
86
+ if( !assure( 3 ) ) return;
87
+ // FIXME x86-centric?
88
+ value = (unsigned int)value;
89
+ data[pos++] = value&0xFF;
90
+ data[pos++] = (value>>8)&0xFF;
91
+ data[pos++] = (value>>16)&0xFF;
92
+ }
93
+
94
+ void Writer::putEncodedU32(unsigned int value) {
95
+ for (size_t i = 0; i < 5; ++i) {
96
+ if (value < 0x80) {
97
+ data[pos++] = value;
98
+ return;
99
+ }
100
+ data[pos++] = (value & 0x7f) | 0x80;
101
+ value >>= 7;
102
+ }
103
+ }
104
+
105
+ void Writer::putFloat( float v ) {
106
+ /*
107
+ byteAlign();
108
+ if( !assure( 4 ) ) return;
109
+
110
+ // FIXME x86-centric?
111
+ int value = *((int*)&v);
112
+ data[pos++] = value&0xFF;
113
+ data[pos++] = (value>>8)&0xFF;
114
+ data[pos++] = (value>>16)&0xFF;
115
+ data[pos++] = (value>>24)&0xFF;
116
+ */
117
+ union {
118
+ float f;
119
+ uint32_t ul;
120
+ } u;
121
+ u.f = v;
122
+ putInt(u.ul);
123
+ }
124
+
125
+ void Writer::putDouble( double v ) {
126
+ union {
127
+ double d;
128
+ uint64_t ull;
129
+ } u;
130
+ u.d = v;
131
+ putInt64(u.ull);
132
+ }
133
+
134
+ void Writer::putDouble2( double v ) {
135
+ union {
136
+ double d;
137
+ char c[8];
138
+ } u;
139
+ u.d = v;
140
+ for( int i=0; i < 8; i++ ) {
141
+ data[pos++] = u.c[i];
142
+ }
143
+ }
144
+
145
+ void Writer::putHalf( float v ) {
146
+ union {
147
+ float f;
148
+ uint32_t ul;
149
+ } u;
150
+ u.f = v;
151
+
152
+ int sign = u.ul >> 31;
153
+ int exp = (u.ul >> 23) & 0xFF;
154
+ int man = (u.ul & 0x007FFFFF);
155
+
156
+ if( exp == 0 ) {
157
+ man = 0;
158
+ } else if( exp == 0xFF ) {
159
+ exp = 0x1F;
160
+ if( man != 0 ) {
161
+ man = 1;
162
+ }
163
+ } else {
164
+ exp -= 127;
165
+ if( exp < -14 ) {
166
+ if( exp >= -24 ) {
167
+ man = (man | 0x800000) >> (-exp - 14 + 13);
168
+ } else {
169
+ man = 0;
170
+ }
171
+ exp = 0;
172
+ } else if( exp > 15 ) {
173
+ exp = 0x1F;
174
+ man = 0;
175
+ } else {
176
+ exp += 15;
177
+ man >>= 13;
178
+ }
179
+ }
180
+
181
+ putWord((sign << 15) | (exp << 10) | man);
182
+ }
183
+
184
+ void Writer::putFixed( double value, int bytesize, int exp ) {
185
+ /* putFixed/getFixed are deprecated: they implicitly to byteAlign */
186
+
187
+ if( !assure( bytesize ) ) return;
188
+
189
+ value *= ((double)(1<<exp));
190
+ uint64_t v = (uint64_t)value;
191
+ for( int i=0; i<bytesize; i++ ) {
192
+ data[pos++] = v>>(8*i);
193
+ }
194
+ }
195
+
196
+ void Writer::putString( const char *value ) {
197
+ byteAlign();
198
+ int len = strlen(value);
199
+ if( !assure( len+1 ) ) return;
200
+ memcpy( &data[pos], value, len+1 );
201
+ pos += len+1;
202
+ }
203
+
204
+ void Writer::putPString( const char *value ) {
205
+ byteAlign();
206
+ int len = strlen(value);
207
+ if( !assure( len+1 ) ) return;
208
+ putByte(len);
209
+ memcpy( &data[pos], value, len );
210
+ pos += len;
211
+ }
212
+
213
+ void Writer::putPStringU30( const char *value ) {
214
+ byteAlign();
215
+ int len = strlen(value);
216
+ if( !assure( len+1 ) ) return;
217
+ putU30(len);
218
+ memcpy( &data[pos], value, len );
219
+ pos += len;
220
+ }
221
+
222
+ void Writer::putNBitInt( int64_t value, int n, bool is_signed ) {
223
+ // FIXME: unefficient, maybe incorrect!
224
+ if( !assure( ((n+bits)/8)+1 ) ) return;
225
+
226
+ if( is_signed ) {
227
+ uint64_t *v = (uint64_t*)&value;
228
+ uint64_t sign = (1<<(n-1));
229
+ if( *v & sign ) {
230
+ value = (*v&(sign-1)) | (1<<(n-1));
231
+ }
232
+ }
233
+
234
+ // sanity check
235
+ if( !is_signed || value >= 0 ) {
236
+ if( value >= (uint64_t)1<<(n+(is_signed?2:1) ) ) {
237
+ fprintf(stderr,"WARNING: (%ssigned) value %i is too big to be represented in %i bits (max %i)\n", is_signed?"":"un", value, n, 1<<(n+(is_signed?1:0) ) );
238
+ }
239
+ } else {
240
+ if( value < ((uint64_t)-1)<<(n+(is_signed?2:1) ) ) {
241
+ fprintf(stderr,"WARNING: (%ssigned) value %i is too small to be represented in %i bits (max %i)\n", is_signed?"":"un", value, n, 1<<(n+(is_signed?1:0) ) );
242
+ }
243
+ }
244
+
245
+ if( n==(8-bits) ) {
246
+ writeByte( buf | value );
247
+ buf = bits = 0;
248
+ return;
249
+ }
250
+
251
+ if( n > (8-bits) ) {
252
+ int bs = n-(8-bits);
253
+ writeByte( buf | value>>bs );
254
+ n-=(8-bits);
255
+
256
+ while( n>=8 ) {
257
+ bs-=8;
258
+ writeByte( value >> bs );
259
+ n-=8;
260
+ }
261
+
262
+ if( n>0 ) {
263
+ bits = n;
264
+ buf = value << (8-bits);
265
+ } else {
266
+ bits = buf = 0;
267
+ }
268
+ return;
269
+ }
270
+
271
+ // n < (8-bits)
272
+ bits += n;
273
+ buf |= value << (8-bits);
274
+ return;
275
+ }
276
+
277
+ void Writer::putNBitFixed( double v, int n, int m, bool is_signed ) {
278
+ v *= ((double)(1<<m));
279
+ putNBitInt( (int64_t)v, n, is_signed );
280
+ }
281
+
282
+ void Writer::putNBitFixed2( double v, int n, int m, bool is_signed ) {
283
+ if( n%8 != 0 ) {
284
+ fprintf(stderr,"WARNING: fixedpoint2 needs a size that is divisible by 8");
285
+ return;
286
+ }
287
+ putFixed( v, n / 8, m );
288
+ }
289
+
290
+ void Writer::writeByte( uint8_t value ) {
291
+ data[pos++] = value;
292
+ }
293
+
294
+ void Writer::dump( int len, int ofs ) {
295
+ const unsigned char *d = &data[pos+ofs];
296
+
297
+ int i=0;
298
+ printf("DumpingWriter %i - %i\n", pos+ofs, pos+ofs+len );
299
+ while( i<len ) {
300
+ for( int n=0; n<4 && i<len; n++ ) {
301
+ for( int b=7; b>=0; b-- ) {
302
+ printf( d[i] & (1<<b) ? "1" : "0" );
303
+ }
304
+ printf(" 0x%02X %03i ", d[i], d[i] );
305
+ printf(" ");
306
+ i++;
307
+ }
308
+ printf("\n");
309
+ }
310
+ }
311
+
312
+ }
@@ -0,0 +1,84 @@
1
+ #ifndef SWF_Writer_H
2
+ #define SWF_Writer_H
3
+
4
+ #include <cstdio>
5
+ #include <stdint.h>
6
+ #include "SWFBasic.h"
7
+
8
+ namespace SWF {
9
+
10
+ #define SWFW_OK 0
11
+ #define SWFW_ERROR 1
12
+ #define SWFW_FULL 2
13
+
14
+ class Writer {
15
+ public:
16
+ Writer( unsigned char *data, size_t length );
17
+ Writer( size_t length );
18
+
19
+ // these implicitly do byteAlign()
20
+ void putData( void *src, size_t length );
21
+ void putByte(uint8_t);
22
+ void putWord(uint16_t);
23
+ void putInt(uint32_t);
24
+ void putInt64(uint64_t);
25
+ void putU30(uint32_t);
26
+ void putS24(int);
27
+ void putFloat(float);
28
+ void putDouble(double);
29
+ void putDouble2(double);
30
+ void putHalf(float);
31
+ void putFixed( double v, int bytesize, int decimals );
32
+ void putString( const char * );
33
+ void putPString( const char * );
34
+ void putPStringU30( const char * );
35
+ void putEncodedU32(unsigned int);
36
+
37
+ // this one cares about the current bit position
38
+ void putNBitInt( int64_t v, int n, bool is_signed = false );
39
+ void putNBitFixed( double v, int n, int m, bool is_signed = false );
40
+ void putNBitFixed2( double v, int n, int m, bool is_signed = false );
41
+
42
+ // set bit position to next byte.
43
+ void byteAlign() {
44
+ if( bits ) writeByte( buf );
45
+ buf = 0; bits=0;
46
+ }
47
+
48
+ int getError() { return err; }
49
+
50
+ void dump( int n, int ofs ); // dumps n bytes from current position to stdout
51
+ bool assure( int l, int before=-1 ) {
52
+ int b = (before==-1?length:before);
53
+ if( pos+l > b ) {
54
+ fprintf(stderr,"Write buffer full (%i+%i >= %i)\n", pos, l, b );
55
+ err = SWFW_FULL;
56
+ return false;
57
+ }
58
+ return true;
59
+ }
60
+
61
+ size_t getLength() { return length; }
62
+ unsigned char *getData() { return data; }
63
+ int getPosition() { return pos; }
64
+ int getBits() { return bits; }
65
+ int getBitPosition() { return (pos*8)+( bits ); }
66
+
67
+ protected:
68
+ void writeByte( uint8_t value );
69
+
70
+ // the uncompressed swf data and our position within
71
+ unsigned char *data;
72
+ int pos, length;
73
+
74
+ // buf is the current byte when in "NBit mode"
75
+ // bits is the number of bits represented in buf.
76
+ uint8_t buf, bits;
77
+
78
+ int err;
79
+
80
+ bool write( void *dst, size_t n );
81
+ };
82
+
83
+ }
84
+ #endif