OSDN Git Service

DefineSprite parser
[flapp/flapp.git] / src / loader.js
1 goog.provide('FlappLoader');
2 goog.require('FlappIBit');
3 goog.require('FlappSWFHeader')
4 goog.require('FlappSWFTag')
5 goog.require('FlappBitmap')
6
7 goog.scope(function() {
8
9 /**
10  * @constructor
11  */
12 FlappLoader = function(flapp) {
13     this.flapp = flapp;
14 };
15
16 FlappLoader.prototype = {
17     fromURL: function(url, dict, movieClip) {
18         console.debug("FlappLoader.prototype.fromURL("+url+",flapp,dict,movieClip");
19         var xhr = new XMLHttpRequest();
20         var ibit = new FlappIBit();
21         var loader = this;
22         this.header = null;
23         xhr.onreadystatechange = function() {
24             if (xhr.readyState > 1) {
25                 if (xhr.status == 200) {
26                     if (xhr.responseText) {
27                         ibit.input(xhr.responseText);
28                         loader.parse(ibit, dict, movieClip);
29                     }
30                 }
31             }
32         };
33         xhr.open('GET', url);
34         // xhr.responseType = 'arraybuffer';
35         xhr.overrideMimeType('text/plain; charset=x-user-defined');
36         xhr.send(null);
37     },
38     parse: function(ibit, dict, movieClip) {
39         // console.debug("FlappLoader.prototype.parse");
40         if (ibit.len() < 20) { // 20 is minumum size for swf header, maybe.
41             return ;
42         }
43         if (this.header === null) {
44             this.header = FlappSWFHeader.load(ibit);
45             console.debug(this.header);
46             this.flapp.setHeader(this.header);
47         }
48         var jpegTables = null;
49         while (ibit.a(), ibit.hasNext(2)) {
50             var headPos = ibit.getBytePos();
51             var tag_and_length = ibit.ui16(); // tag and length
52             var code = tag_and_length >>> 6;
53             var length = tag_and_length & 0x3f;
54             if (length === 0x3f) {
55                 if (ibit.hasNext(4) === false) {
56                     ibit.setPos(headPos, 0);
57                     break;
58                 }
59                 length = ibit.ui32();
60             }
61             if (ibit.hasNext(length) === false) {
62                 ibit.setPos(headPos, 0);
63                 break;
64             }
65             var startOfContent = ibit.getBytePos();
66             var tag = FlappSWFTag.load(code, length, ibit);
67 //              console.debug(tag);
68             switch (code) {
69             case 1: // ShowFrame
70                 movieClip.appendControlTag(tag);
71                 break;
72             case 2: // DefineShape
73             case 22: // DefineShape2
74             case 32: // DefineShape3
75                 dict.set(tag.id, tag);
76                 break;
77             case 6: // DefineBits(JPEG)
78                 var jpeg = FlappBitmap.toJpeg(tag.jpegData, jpegTables);
79                 var image = new Image();
80                 image.src = "data:image/jpeg;base64," + goog.global.btoa(jpeg);
81                 tag.image = image;
82                 dict.set(tag.id, tag);
83                 break;
84             case 8: // JPEGTables
85                 jpegTables = tag;
86                 break;
87             case 9: // SetBackgroundColor
88                 // set canvas background
89                 break;
90             case 12: // DoAction
91                 movieClip.appendControlTag(tag);
92                 break;
93             case 26: // PlaceObject2
94                 movieClip.appendControlTag(tag);
95                 break;
96             case 39: // DefineSprite
97                 dict.set(tag.id, tag);
98                 break;
99             default:
100                 console.warn("Unknown swf tag code:"+code);
101                 break;
102             }
103             ibit.setPos(startOfContent + length, 0);
104         }
105     }
106 };
107
108 });