Chromium Code Reviews| Index: Source/core/inspector/InspectorOverlayPage.html |
| diff --git a/Source/core/inspector/InspectorOverlayPage.html b/Source/core/inspector/InspectorOverlayPage.html |
| index e80b661c48dbf5ded29b0a21f7f3973a3498e804..b4b0776241538377876c270d5af33dcde7e15ebb 100644 |
| --- a/Source/core/inspector/InspectorOverlayPage.html |
| +++ b/Source/core/inspector/InspectorOverlayPage.html |
| @@ -156,9 +156,6 @@ const lightGridColor = "rgba(0,0,0,0.2)"; |
| const darkGridColor = "rgba(0,0,0,0.7)"; |
| const transparentColor = "rgba(0, 0, 0, 0)"; |
| const gridBackgroundColor = "rgba(255, 255, 255, 0.8)"; |
| -// CSS shapes |
| -const shapeHighlightColor = "rgba(96, 82, 127, 0.8)"; |
| -const shapeMarginHighlightColor = "rgba(96, 82, 127, 0.6)"; |
| function drawPausedInDebuggerMessage(message) |
| { |
| @@ -302,61 +299,6 @@ function _drawGrid(rulerAtRight, rulerAtBottom) |
| context.restore(); |
| } |
| -function quadToPath(quad) |
| -{ |
| - context.beginPath(); |
| - context.moveTo(quad[0].x, quad[0].y); |
| - context.lineTo(quad[1].x, quad[1].y); |
| - context.lineTo(quad[2].x, quad[2].y); |
| - context.lineTo(quad[3].x, quad[3].y); |
| - context.closePath(); |
| - return context; |
| -} |
| - |
| -function drawOutlinedQuad(quad, fillColor, outlineColor) |
| -{ |
| - context.save(); |
| - context.lineWidth = 2; |
| - quadToPath(quad).clip(); |
| - context.fillStyle = fillColor; |
| - context.fill(); |
| - if (outlineColor) { |
| - context.strokeStyle = outlineColor; |
| - context.stroke(); |
| - } |
| - context.restore(); |
| -} |
| - |
| -function drawOutlinedQuadWithClip(quad, clipQuad, fillColor) |
| -{ |
| - context.fillStyle = fillColor; |
| - context.save(); |
| - context.lineWidth = 0; |
| - quadToPath(quad).fill(); |
| - context.globalCompositeOperation = "destination-out"; |
| - context.fillStyle = "red"; |
| - quadToPath(clipQuad).fill(); |
| - context.restore(); |
| -} |
| - |
| -function drawUnderlyingQuad(quad, fillColor) |
| -{ |
| - context.save(); |
| - context.lineWidth = 2; |
| - context.globalCompositeOperation = "destination-over"; |
| - context.fillStyle = fillColor; |
| - quadToPath(quad).fill(); |
| - context.restore(); |
| -} |
| - |
| -function quadEquals(quad1, quad2) |
| -{ |
| - return quad1[0].x === quad2[0].x && quad1[0].y === quad2[0].y && |
| - quad1[1].x === quad2[1].x && quad1[1].y === quad2[1].y && |
| - quad1[2].x === quad2[2].x && quad1[2].y === quad2[2].y && |
| - quad1[3].x === quad2[3].x && quad1[3].y === quad2[3].y; |
| -} |
| - |
| function drawViewSize(drawViewSizeWithGrid) |
| { |
| var drawGridBoolean = drawViewSizeWithGrid === "true"; |
| @@ -407,12 +349,8 @@ function reset(resetData) |
| window._gridPainted = false; |
| } |
| -function _drawElementTitle(highlight) |
| +function _drawElementTitle(elementInfo, bounds) |
| { |
| - var elementInfo = highlight.elementInfo; |
| - if (!highlight.elementInfo) |
| - return; |
| - |
| document.getElementById("tag-name").textContent = elementInfo.tagName; |
| document.getElementById("node-id").textContent = elementInfo.idValue ? "#" + elementInfo.idValue : ""; |
| var className = elementInfo.className; |
| @@ -423,14 +361,12 @@ function _drawElementTitle(highlight) |
| document.getElementById("node-height").textContent = elementInfo.nodeHeight; |
| var elementTitle = document.getElementById("element-title"); |
| - var marginQuad = highlight.quads[0]; |
| - |
| var titleWidth = elementTitle.offsetWidth + 6; |
| var titleHeight = elementTitle.offsetHeight + 4; |
| - var anchorTop = Math.min(marginQuad[0].y, marginQuad[1].y, marginQuad[2].y, marginQuad[3].y); |
| - var anchorBottom = Math.max(marginQuad[0].y, marginQuad[1].y, marginQuad[2].y, marginQuad[3].y); |
| - var anchorLeft = Math.min(marginQuad[0].x, marginQuad[1].x, marginQuad[2].x, marginQuad[3].x); |
| + var anchorTop = bounds.minY; |
| + var anchorBottom = bounds.maxY; |
| + var anchorLeft = bounds.minX; |
| const arrowHeight = 7; |
| var renderArrowUp = false; |
| @@ -486,7 +422,7 @@ function _drawElementTitle(highlight) |
| elementTitle.style.left = (boxX + 3) + "px"; |
| } |
| -function _drawRulers(highlight, rulerAtRight, rulerAtBottom) |
| +function _drawRulers(bounds, rulerAtRight, rulerAtBottom) |
| { |
| context.save(); |
| var width = canvasWidth; |
| @@ -494,80 +430,85 @@ function _drawRulers(highlight, rulerAtRight, rulerAtBottom) |
| context.strokeStyle = "rgba(128, 128, 128, 0.3)"; |
| context.lineWidth = 1; |
| context.translate(0.5, 0.5); |
| - var leftmostXForY = {}; |
| - var rightmostXForY = {}; |
| - var topmostYForX = {}; |
| - var bottommostYForX = {}; |
| - |
| - for (var i = 0; i < highlight.quads.length; ++i) { |
| - var quad = highlight.quads[i]; |
| - for (var j = 0; j < quad.length; ++j) { |
| - var x = quad[j].x; |
| - var y = quad[j].y; |
| - leftmostXForY[Math.round(y)] = Math.min(leftmostXForY[y] || Number.MAX_VALUE, Math.round(quad[j].x)); |
| - rightmostXForY[Math.round(y)] = Math.max(rightmostXForY[y] || Number.MIN_VALUE, Math.round(quad[j].x)); |
| - topmostYForX[Math.round(x)] = Math.min(topmostYForX[x] || Number.MAX_VALUE, Math.round(quad[j].y)); |
| - bottommostYForX[Math.round(x)] = Math.max(bottommostYForX[x] || Number.MIN_VALUE, Math.round(quad[j].y)); |
| - } |
| - } |
| if (rulerAtRight) { |
| - for (var y in rightmostXForY) { |
| + for (var y in bounds.rightmostXForY) { |
| context.beginPath(); |
| context.moveTo(width, y); |
| - context.lineTo(rightmostXForY[y], y); |
| + context.lineTo(bounds.rightmostXForY[y], y); |
| context.stroke(); |
| } |
| } else { |
| - for (var y in leftmostXForY) { |
| + for (var y in bounds.leftmostXForY) { |
| context.beginPath(); |
| context.moveTo(0, y); |
| - context.lineTo(leftmostXForY[y], y); |
| + context.lineTo(bounds.leftmostXForY[y], y); |
| context.stroke(); |
| } |
| } |
| if (rulerAtBottom) { |
| - for (var x in bottommostYForX) { |
| + for (var x in bounds.bottommostYForX) { |
| context.beginPath(); |
| context.moveTo(x, height); |
| - context.lineTo(x, topmostYForX[x]); |
| + context.lineTo(x, bounds.topmostYForX[x]); |
| context.stroke(); |
| } |
| } else { |
| - for (var x in topmostYForX) { |
| + for (var x in bounds.topmostYForX) { |
| context.beginPath(); |
| context.moveTo(x, 0); |
| - context.lineTo(x, topmostYForX[x]); |
| + context.lineTo(x, bounds.topmostYForX[x]); |
| context.stroke(); |
| } |
| } |
| context.restore(); |
| } |
| -// CSS shapes |
| -function drawPath(commands, fillColor) |
| + |
| +function drawPath(commands, fillColor, outlineColor, bounds) |
| { |
| + var commandsIndex = 0; |
| + function extractPoints(count) |
| + { |
| + var points = []; |
| + |
| + for (var i = 0; i < count; ++i) { |
| + var x = Math.round(commands[commandsIndex++] * pageScaleFactor); |
| + bounds.maxX = Math.max(bounds.maxX, x); |
| + bounds.minX = Math.min(bounds.minX, x); |
| + |
| + var y = Math.round(commands[commandsIndex++] * pageScaleFactor); |
| + bounds.maxY = Math.max(bounds.maxY, y); |
| + bounds.minY = Math.min(bounds.minY, y); |
| + |
| + bounds.leftmostXForY[y] = Math.min(bounds.leftmostXForY[y] || Number.MAX_VALUE, x); |
| + bounds.rightmostXForY[y] = Math.max(bounds.rightmostXForY[y] || Number.MIN_VALUE, x); |
| + bounds.topmostYForX[x] = Math.min(bounds.topmostYForX[x] || Number.MAX_VALUE, y); |
| + bounds.bottommostYForX[x] = Math.max(bounds.bottommostYForX[x] || Number.MIN_VALUE, y); |
| + |
| + points.push(x, y); |
| + } |
| + return points; |
| + } |
| + |
| context.save(); |
| context.beginPath(); |
| - var commandsIndex = 0; |
| var commandsLength = commands.length; |
| while (commandsIndex < commandsLength) { |
| switch (commands[commandsIndex++]) { |
| case "M": |
| - context.moveTo(commands[commandsIndex++], commands[commandsIndex++]); |
| + context.moveTo.apply(context, extractPoints(1)); |
| break; |
| case "L": |
| - context.lineTo(commands[commandsIndex++], commands[commandsIndex++]); |
| + context.lineTo.apply(context, extractPoints(1)); |
| break; |
| case "C": |
| - context.bezierCurveTo(commands[commandsIndex++], commands[commandsIndex++], commands[commandsIndex++], |
| - commands[commandsIndex++], commands[commandsIndex++], commands[commandsIndex++]); |
| + context.bezierCurveTo.apply(context, extractPoints(3)); |
| break; |
| case "Q": |
| - context.quadraticCurveTo(commands[commandsIndex++], commands[commandsIndex++], commands[commandsIndex++], |
| - commands[commandsIndex++]); |
| + context.quadraticCurveTo.apply(context, extractPoints(4)); |
|
dgozman
2014/07/29 11:00:41
extractPoints(2)
|
| break; |
| case "Z": |
| context.closePath(); |
| @@ -575,107 +516,58 @@ function drawPath(commands, fillColor) |
| } |
| } |
| context.closePath(); |
| + context.lineWidth = 0; |
| context.fillStyle = fillColor; |
| context.fill(); |
| - context.restore(); |
| -} |
| - |
| -function drawShapeHighlight(shapeInfo) |
| -{ |
| - if (shapeInfo.marginShape) |
| - drawPath(shapeInfo.marginShape, shapeMarginHighlightColor); |
| - else |
| - drawOutlinedQuad(shapeInfo.bounds, shapeHighlightColor, shapeHighlightColor); |
| + if (outlineColor) { |
| + context.lineWidth = 2; |
| + context.strokeStyle = outlineColor; |
| + context.stroke(); |
| + } |
| - if (shapeInfo.shape) |
| - drawPath(shapeInfo.shape, shapeHighlightColor); |
| - else |
| - drawOutlinedQuad(shapeInfo.bounds, shapeHighlightColor, shapeHighlightColor); |
| + context.restore(); |
| } |
| -function drawNodeHighlight(highlight) |
| +function drawHighlight(highlight) |
| { |
| - { |
| - for (var i = 0; i < highlight.quads.length; ++i) { |
| - var quad = highlight.quads[i]; |
| - for (var j = 0; j < quad.length; ++j) { |
| - quad[j].x = Math.round(quad[j].x * pageScaleFactor); |
| - quad[j].y = Math.round(quad[j].y * pageScaleFactor); |
| - } |
| - } |
| - } |
| - |
| - if (!highlight.quads.length) { |
| - if (highlight.showRulers) |
| - _drawGrid(false, false); |
| - return; |
| - } |
| - |
| context.save(); |
| - var quads = highlight.quads.slice(); |
| - var eventTargetQuad = quads.length >= 5 ? quads.pop() : null; |
| - var contentQuad = quads.pop(); |
| - var paddingQuad = quads.pop(); |
| - var borderQuad = quads.pop(); |
| - var marginQuad = quads.pop(); |
| - |
| - var hasContent = contentQuad && highlight.contentColor !== transparentColor || highlight.contentOutlineColor !== transparentColor; |
| - var hasPadding = paddingQuad && highlight.paddingColor !== transparentColor; |
| - var hasBorder = borderQuad && highlight.borderColor !== transparentColor; |
| - var hasMargin = marginQuad && highlight.marginColor !== transparentColor; |
| - var hasEventTarget = eventTargetQuad && highlight.eventTargetColor !== transparentColor; |
| - |
| - var clipQuad; |
| - if (hasMargin && (!hasBorder || !quadEquals(marginQuad, borderQuad))) { |
| - drawOutlinedQuadWithClip(marginQuad, borderQuad, highlight.marginColor); |
| - clipQuad = borderQuad; |
| - } |
| - if (hasBorder && (!hasPadding || !quadEquals(borderQuad, paddingQuad))) { |
| - drawOutlinedQuadWithClip(borderQuad, paddingQuad, highlight.borderColor); |
| - clipQuad = paddingQuad; |
| - } |
| - if (hasPadding && (!hasContent || !quadEquals(paddingQuad, contentQuad))) { |
| - drawOutlinedQuadWithClip(paddingQuad, contentQuad, highlight.paddingColor); |
| - clipQuad = contentQuad; |
| - } |
| - if (hasContent) |
| - drawOutlinedQuad(contentQuad, highlight.contentColor, highlight.contentOutlineColor); |
| - if (hasEventTarget) |
| - drawUnderlyingQuad(eventTargetQuad, highlight.eventTargetColor); |
| - |
| - var width = canvasWidth; |
| - var height = canvasHeight; |
| - var minX = Number.MAX_VALUE, minY = Number.MAX_VALUE, maxX = Number.MIN_VALUE; maxY = Number.MIN_VALUE; |
| - for (var i = 0; i < highlight.quads.length; ++i) { |
| - var quad = highlight.quads[i]; |
| - for (var j = 0; j < quad.length; ++j) { |
| - minX = Math.min(minX, quad[j].x); |
| - maxX = Math.max(maxX, quad[j].x); |
| - minY = Math.min(minY, quad[j].y); |
| - maxY = Math.max(maxY, quad[j].y); |
| + var bounds = { |
| + minX: Number.MAX_VALUE, |
| + minY: Number.MAX_VALUE, |
| + maxX: Number.MIN_VALUE, |
| + maxY: Number.MIN_VALUE, |
| + leftmostXForY: {}, |
| + rightmostXForY: {}, |
| + topmostYForX: {}, |
| + bottommostYForX: {} |
| + }; |
| + |
| + for (var paths = highlight.paths.slice(); paths.length;) { |
| + var path = paths.pop(); |
| + drawPath(path.path, path.fillColor, path.outlineColor, bounds); |
| + if (paths.length) { |
| + context.save(); |
| + context.globalCompositeOperation = "destination-out"; |
| + drawPath(paths[paths.length - 1].path, "red", null, bounds); |
| + context.restore(); |
| } |
| } |
| - var rulerAtRight = highlight.showRulers && minX < 20 && maxX + 20 < width; |
| - var rulerAtBottom = highlight.showRulers && minY < 20 && maxY + 20 < height; |
| + var rulerAtRight = highlight.paths.length && highlight.showRulers && bounds.minX < 20 && bounds.maxX + 20 < canvasWidth; |
| + var rulerAtBottom = highlight.paths.length && highlight.showRulers && bounds.minY < 20 && bounds.maxY + 20 < canvasHeight; |
| if (highlight.showRulers) |
| _drawGrid(rulerAtRight, rulerAtBottom); |
| - if (highlight.showExtensionLines) |
| - _drawRulers(highlight, rulerAtRight, rulerAtBottom); |
| - if (highlight.elementInfo && highlight.elementInfo.shapeOutsideInfo) |
| - drawShapeHighlight(highlight.elementInfo.shapeOutsideInfo); |
| - _drawElementTitle(highlight); |
| - context.restore(); |
| -} |
| + if (highlight.paths.length) { |
| + if (highlight.showExtensionLines) |
| + _drawRulers(bounds, rulerAtRight, rulerAtBottom); |
| -function drawQuadHighlight(highlight) |
| -{ |
| - context.save(); |
| - drawOutlinedQuad(highlight.quads[0], highlight.contentColor, highlight.contentOutlineColor); |
| + if (highlight.elementInfo) |
| + _drawElementTitle(highlight.elementInfo, bounds); |
| + } |
| context.restore(); |
| } |