| var round = Math.round; | 
| export function subPixelOptimizeLine(outputShape, inputShape, style) { | 
|     if (!inputShape) { | 
|         return; | 
|     } | 
|     var x1 = inputShape.x1; | 
|     var x2 = inputShape.x2; | 
|     var y1 = inputShape.y1; | 
|     var y2 = inputShape.y2; | 
|     outputShape.x1 = x1; | 
|     outputShape.x2 = x2; | 
|     outputShape.y1 = y1; | 
|     outputShape.y2 = y2; | 
|     var lineWidth = style && style.lineWidth; | 
|     if (!lineWidth) { | 
|         return outputShape; | 
|     } | 
|     if (round(x1 * 2) === round(x2 * 2)) { | 
|         outputShape.x1 = outputShape.x2 = subPixelOptimize(x1, lineWidth, true); | 
|     } | 
|     if (round(y1 * 2) === round(y2 * 2)) { | 
|         outputShape.y1 = outputShape.y2 = subPixelOptimize(y1, lineWidth, true); | 
|     } | 
|     return outputShape; | 
| } | 
| export function subPixelOptimizeRect(outputShape, inputShape, style) { | 
|     if (!inputShape) { | 
|         return; | 
|     } | 
|     var originX = inputShape.x; | 
|     var originY = inputShape.y; | 
|     var originWidth = inputShape.width; | 
|     var originHeight = inputShape.height; | 
|     outputShape.x = originX; | 
|     outputShape.y = originY; | 
|     outputShape.width = originWidth; | 
|     outputShape.height = originHeight; | 
|     var lineWidth = style && style.lineWidth; | 
|     if (!lineWidth) { | 
|         return outputShape; | 
|     } | 
|     outputShape.x = subPixelOptimize(originX, lineWidth, true); | 
|     outputShape.y = subPixelOptimize(originY, lineWidth, true); | 
|     outputShape.width = Math.max(subPixelOptimize(originX + originWidth, lineWidth, false) - outputShape.x, originWidth === 0 ? 0 : 1); | 
|     outputShape.height = Math.max(subPixelOptimize(originY + originHeight, lineWidth, false) - outputShape.y, originHeight === 0 ? 0 : 1); | 
|     return outputShape; | 
| } | 
| export function subPixelOptimize(position, lineWidth, positiveOrNegative) { | 
|     if (!lineWidth) { | 
|         return position; | 
|     } | 
|     var doubledPosition = round(position * 2); | 
|     return (doubledPosition + round(lineWidth)) % 2 === 0 | 
|         ? doubledPosition / 2 | 
|         : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2; | 
| } |