OSDN Git Service

delete "/ 20" for TWIPS
[flapp/flapp.git] / loader.js
index a9d6ef5..934c58a 100644 (file)
--- a/loader.js
+++ b/loader.js
@@ -1,9 +1,10 @@
 (function(global) {
-    var FlappLoader = function() {
+    var FlappLoader = function(flapp) {
+       this.flapp = flapp;
     }
     FlappLoader.prototype = {
-       fromURL: function(url, flapp, dict, movieClip) {
-           this.flapp = flapp;
+       fromURL: function(url, dict, movieClip) {
+           console.debug("FlappLoader.prototype.fromURL("+url+",flapp,dict,movieClip");
            var xhr = new XMLHttpRequest();
            var ibit = new FlappIBit();
            var loader = this;
             xhr.send(null);
        },
        parse: function(ibit, dict, movieClip) {
+           // console.debug("FlappLoader.prototype.parse");
            if (ibit.len() < 20) { // 20 is minumum size for swf header, maybe.
                return ;
            }
            if (this.header === null) {
-               console.log(FlappSWFHeader);
                this.header = FlappSWFHeader.load(ibit);
-               this.flapp.header = this.header;
+               console.debug(this.header);
+               flapp.setHeader(this.header);
            }
-           headPos = ibit.getBytePos();
-           if (ibit.hasNext(2) === false) {
-               return ;
-           }
-           tal = ibit.ui16(); // tag and length
-           code = tal >>> 6;
-           length = tal & 0x3f;
-           if (length === 0x3f) {
-               if (ibit.hasNext(4) === false) {
-                   ibit.setPos(headPos);
-                   return ;
+           var jpegTables = null;
+           while (ibit.a(), ibit.hasNext(2)) {
+               var headPos = ibit.getBytePos();
+               var tag_and_length = ibit.ui16(); // tag and length
+               var code = tag_and_length >>> 6;
+               var length = tag_and_length & 0x3f;
+               if (length === 0x3f) {
+                   if (ibit.hasNext(4) === false) {
+                       ibit.setPos(headPos, 0);
+                       break;
+                   }
+                   length = ibit.ui32();
                }
-               length = ibit.ui32();
-           }
-           if (ibit.hasNext(length) === false) {
-               ibit.setPos(headPos);
-               return ;
+               if (ibit.hasNext(length) === false) {
+                   ibit.setPos(headPos, 0);
+                   break;
+               }
+               var startOfContent = ibit.getBytePos();
+               var tag = new FlappSWFTag.load(code, length, ibit);
+//             console.debug(tag);
+               switch (code) {
+               case 1: // ShowFrame
+                   movieClip.appendControlTag(tag);
+                   break;
+               case 2: // DefineShape
+               case 22: // DefineShape2
+               case 32: // DefineShape3
+                   dict.set(tag.id, tag);
+                   break;
+               case 6: // DefineBits(JPEG)
+                   var jpeg = FlappBitmap.toJpeg(tag.jpegData, jpegTables);
+                   var image = new Image();
+                   image.src = "data:image/jpeg;base64,"+btoa(jpeg);
+                   tag.image = image;
+                   dict.set(tag.id, tag);
+                   break;
+               case 8: // JPEGTables
+                   jpegTables = tag;
+                   break;
+               case 9: // SetBackgroundColor
+                   // set canvas background
+                   break;
+               case 12: // DoAction
+                   movieClip.appendControlTag(tag);
+                   break;
+               case 26: // PlaceObject2
+                   movieClip.appendControlTag(tag);
+                   break;
+               default:
+                   console.warn("Unknown swf tag code:"+code);
+                   break;
+               }
+               ibit.setPos(startOfContent + length, 0);
            }
-           console.log(code);
        }
     };
     global.FlappLoader = FlappLoader;