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;
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);
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;
}
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;
}
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
}
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);
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};
}