OSDN Git Service

各 style 毎の minX, maxX, minY, maxY を記録した
authorYoshihiro Yamazaki <yoya@awm.jp>
Wed, 26 Dec 2012 10:41:44 +0000 (19:41 +0900)
committerYoshihiro Yamazaki <yoya@awm.jp>
Wed, 26 Dec 2012 10:41:44 +0000 (19:41 +0900)
src/swf/shaperecords.js

index 5175eea..d5673b4 100644 (file)
@@ -28,6 +28,7 @@ FlappSWFShapeRecords.load = function(code, ibit, fillStyles, lineStyles, numFill
     var edgeTypeArray = [];
     var edges = [currentX, currentY];
     var first6bits;
+    var minX, minY, maxX, maxY;
     while (first6bits = ibit.ub(6)) {
         if (first6bits & 0x20) { // Edge (1XXXXX)
             var numBits = first6bits & 0x0F;
@@ -51,6 +52,10 @@ FlappSWFShapeRecords.load = function(code, ibit, fillStyles, lineStyles, numFill
                 edges.push(x, y);
                 currentX = x;
                 currentY = y;
+               if (minX > x) minX = x;
+               if (maxX < x) maxX = x;
+               if (minY > y) minY = y;
+               if (maxY < y) maxY = y;
             } else { // Curved Edge (10XXXX)
                 var controlDeltaX = ibit.sb(numBits + 2);
                 var controlDeltaY = ibit.sb(numBits + 2);
@@ -65,12 +70,22 @@ FlappSWFShapeRecords.load = function(code, ibit, fillStyles, lineStyles, numFill
                     anchorX, anchorY);
                 currentX = anchorX;
                 currentY = anchorY;
+               if (minX > controlX) minX = controlX;
+               if (maxX < controlX) maxX = controlX;
+               if (minY > controlY) minY = controlY;
+               if (maxY < controlY) maxY = controlY;
+               if (minX > anchorX) minX = anchorX;
+               if (maxX < anchorX) maxX = anchorX;
+               if (minY > anchorY) minY = anchorY;
+               if (maxY < anchorY) maxY = anchorY;
+
             }
         } else if (first6bits) { // Change (0XXXXX != 000000)
             if (edgeTypeArray.length > 0) {
                 shapeRecords.push(
                     {fillStyle0:fillStyle0, fillStyle1:fillStyle1, lineStyle:lineStyle,
-                    edgeTypes:edgeTypeArray.join(''),edges:edges}
+                    edgeTypes:edgeTypeArray.join(''),edges:edges,
+                    minX:minX, maxX: maxX, minY:minY, maxY:maxY}
                 );
             }
            var stateNewStyles  = first6bits & 0x10;
@@ -126,12 +141,15 @@ FlappSWFShapeRecords.load = function(code, ibit, fillStyles, lineStyles, numFill
             }
             edgeTypeArray = [];
             edges = [currentX, currentY];
+           minX = maxX = currentX;
+           minY = maxY = currentY;
         }
     }
     if (edgeTypeArray.length > 0) {
         shapeRecords.push(
             {fillStyle0:fillStyle0, fillStyle1:fillStyle1, lineStyle:lineStyle,
-            edgeTypes:edgeTypeArray.join(''), edges:edges}
+            edgeTypes:edgeTypeArray.join(''), edges:edges,
+            minX:minX, maxX: maxX, minY:minY, maxY:maxY }
         );
     }
     return shapeRecords;
@@ -160,7 +178,9 @@ FlappSWFShapeRecords.convertEdges = function(shapeRecords) {
            }
            fillEdges[fillStyle0].push({types:edgeTypes,
                                        edges:edgesArray,
-                                       prev:null, next:null});
+                                       prev:null, next:null,
+                                       minX:record.minX, maxX:record.maxX,
+                                       minY:record.minY, maxY:record.maxY});
        }
        if (fillStyle1) {
            var rl2 = l2; // reverse l2
@@ -174,7 +194,9 @@ FlappSWFShapeRecords.convertEdges = function(shapeRecords) {
            }
            fillEdges[fillStyle1].push({types:edgeTypes.split('').reverse().join(''),
                                        edges:edgesArray,
-                                       prev:null, next:null});
+                                       prev:null, next:null,
+                                       minX:record.minX, maxX:record.maxX,
+                                       minY:record.minY, maxY:record.maxY});
        }
        if (lineStyle) {
            edgesArray = new Int32Array(l2);
@@ -185,9 +207,61 @@ FlappSWFShapeRecords.convertEdges = function(shapeRecords) {
                fillEdges[lineStyle] = [];
            }
            lineEdges[lineStyle].push({types:edgeTypes,
-                                      edges:edgesArray});
+                                      edges:edgesArray,
+                                      minX:record.minX, maxX:record.maxX,
+                                      minY:record.minY, maxY:record.maxY});
        }
     }
+    // max, min, X, Y
+    var minX, maxX, minY, maxY;
+    var minX2, maxX2, minY2, maxY2;
+    var edgesInfoList, edgesInfo0, edgesInfo;
+    for (var style in fillEdges) {
+       edgesInfoList = fillEdges[style];
+       edgesInfo0 = edgesInfoList[0];
+       minX = edgesInfo0.minX;
+       maxX = edgesInfo0.maxX;
+       minY = edgesInfo0.minY;
+       maxY = edgesInfo0.maxY;
+       for (i = 0, l = edgesInfoList.length ; i < l ; i++) {
+           edgesInfo = edgesInfoList[i];
+           minX2 = edgesInfo.minX;
+           maxX2 = edgesInfo.maxX;
+           minY2 = edgesInfo.minY;
+           maxY2 = edgesInfo.maxY;
+           if (minX > minX2) minX = minX2;
+           if (maxX < maxX2) maxX = maxX2;
+           if (minY > minY2) minX = minY2;
+           if (maxY < maxY2) maxX = maxY2;
+       }
+       edgesInfoList.minX = minX;
+       edgesInfoList.maxX = maxX;
+       edgesInfoList.minY = minY;
+       edgesInfoList.maxY = maxY;
+    }
+    for (var style in lineEdges) {
+       edgesInfoList = lineEdges[style];
+       edgesInfo0 = edgesInfoList[0];
+       minX = edgesInfo0.minX;
+       maxX = edgesInfo0.maxX;
+       minY = edgesInfo0.minY;
+       maxY = edgesInfo0.maxY;
+       for (i = 0, l = edgesInfoList.length ; i < l ; i++) {
+           edgesInfo = edgesInfoList[i];
+           minX2 = edgesInfo.minX;
+           maxX2 = edgesInfo.maxX;
+           minY2 = edgesInfo.minY;
+           maxY2 = edgesInfo.maxY;
+           if (minX > minX2) minX = minX2;
+           if (maxX < maxX2) maxX = maxX2;
+           if (minY > minY2) minX = minY2;
+           if (maxY < maxY2) maxX = maxY2;
+       }       
+       edgesInfoList.minX = minX;
+       edgesInfoList.maxX = maxX;
+       edgesInfoList.minY = minY;
+       edgesInfoList.maxY = maxY;
+    }
     return {fillEdges:fillEdges, lineEdges:lineEdges};
 }