OSDN Git Service

- ibit に配列を渡す処理を忘れてたので入れた。
authorYoshihiro Yamazaki <yoya@awm.jp>
Tue, 4 Dec 2012 14:09:15 +0000 (23:09 +0900)
committerYoshihiro Yamazaki <yoya@awm.jp>
Tue, 4 Dec 2012 14:09:15 +0000 (23:09 +0900)
- offset が 2つ(markerの分)多かった。
- default の marker で seek を忘れてたので入れた。
- DQT が無いのに jpegTables が無い時に console.error (定義を console.js に追加)
- DQT, DHT が複数ある場合に対処。(最後のだけ見れば良いかと思ったら違ったので)

console.js
src/bitmap.js

index 7cb3a0f..f116359 100644 (file)
@@ -13,3 +13,10 @@ console.log = function(var_args) {
 console.debug = function(var_args) {
   return void 0;
 }
+
+/**
+* @param {...*} var_args
+*/
+console.error = function(var_args) {
+  return void 0;
+}
index 745a41e..db442ea 100644 (file)
@@ -1,5 +1,6 @@
 goog.provide('FlappBitmap');
 goog.require('FlappIBit');
+goog.require('FlappString');
 
 goog.scope(function() {
 
@@ -13,22 +14,28 @@ FlappBitmap = function() {
 FlappBitmap.jpegChunkOffsets = function(jpegData) {
     var offsetTable = {};
     var ibit = new FlappIBit();
+    ibit.inputArray(jpegData);
     while (ibit.hasNext(2)) {
-        var marker = ibit.ui16be();
         var offset = ibit.getBytePos();
+        var marker = ibit.ui16be();
         var length;
+       console.log(marker);
         switch (marker) {
         case 0xFFD8: // SOI
         case 0xFFD9: // EOI
             break;
         case 0xFFDA: // SOS + [RST] + EOI
             length = ibit.len() - offset;
-            offsetTable[marker] = [offset, length]
+            offsetTable[marker] = [[offset, length]];
             break;
         default:
-            length = ibit.ui16be() + 2;
-            offsetTable[marker] = [offset, length]
-
+            length = 2 + ibit.ui16be();;
+           ibit.seek(length - 4, 0);
+           if (marker in offsetTable) {
+               offsetTable[marker].push([offset, length]);
+           } else {
+               offsetTable[marker] = [[offset, length]];
+           }
             break;
         }
     }
@@ -39,6 +46,10 @@ FlappBitmap.toJpeg = function(swfJpeg, jpegTables) {
     var offsetTable = FlappBitmap.jpegChunkOffsets(swfJpeg);
     var hasDQT = (0xFFDB in offsetTable);
     if (hasDQT === false) {
+       if (jpegTables === null) {
+           console.error("swfJpeg has no DQT and jpegTables is null.");
+           return ""; // TODO: return dummy small image
+       }
         var offsetTable2 = FlappBitmap.jpegChunkOffsets(jpegTables);
     }
     var jpegArray = [0xFF, 0xD8]; // SOI
@@ -46,21 +57,22 @@ FlappBitmap.toJpeg = function(swfJpeg, jpegTables) {
     var jpegOrder = [0xFFE0, 0xFFC0, 0xFFDB, 0xFFC4, 0xFFDA];
     for (var i = 0, l = jpegOrder.length; i < l ; i++) {
         var marker = jpegOrder[i];
-        var swfJpegOffset = (marker in offsetTable);
-        if (swfJpegOffset) {
-            var entry = offsetTable[marker];
-        } else {
-            var entry = offsetTable2[marker];
-        }
-        var offset = entry[0];
-        var enfoffset = offset + entry[1];
-        for (var j = offset; j < enfoffset ; j++) {
-            if (swfJpegOffset) {
-                jpegArray.join(swfJpeg[j]);
-            } else {
-                jpegArray.join(jpegTables[j]);
+       var table, jpeg;
+       if (marker in offsetTable) {
+           table = offsetTable;
+            jpeg = swfJpeg;
+       } else {
+           table = offsetTable2;
+           jpeg = jpegTables;
+       }
+       var chunkOffsets = table[marker];
+        for (var j = 0, jl= chunkOffsets.length; j < jl ; j++) {
+            var offset = chunkOffsets[j][0];
+            var endoffset = offset + chunkOffsets[j][1];
+            for (var k = offset; k < endoffset ; k++) {
+                jpegArray.push(jpeg[k]);
             }
-        }
+       }
     }
     return FlappString.ArrayToString(jpegArray);
 };