Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1310)

Unified Diff: Source/devtools/front_end/timeline/Layers3DView.js

Issue 661753002: DevTools: draw realistic chrome on top of viewport in layers3dview (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: fixed sandwich menu color Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/devtools/front_end/Images/chromeRight.png ('k') | Source/devtools/front_end/timelinePanel.css » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/devtools/front_end/timeline/Layers3DView.js
diff --git a/Source/devtools/front_end/timeline/Layers3DView.js b/Source/devtools/front_end/timeline/Layers3DView.js
index 863080a655b15ce736f2f6c13b727fa84d9650d9..65dc11b3bd05458f91a3be283dcc6a62ff4e0c9b 100644
--- a/Source/devtools/front_end/timeline/Layers3DView.js
+++ b/Source/devtools/front_end/timeline/Layers3DView.js
@@ -58,6 +58,8 @@ WebInspector.Layers3DView = function()
this._layerTree = null;
this._textureManager = new WebInspector.LayerTextureManager();
this._textureManager.addEventListener(WebInspector.LayerTextureManager.Events.TextureUpdated, this._update, this);
+ /** @type Array.<!WebGLTexture|undefined> */
+ this._chromeTextures = [];
WebInspector.settings.showPaintRects.addChangeListener(this._update, this);
}
@@ -87,6 +89,15 @@ WebInspector.Layers3DView.Events = {
}
/**
+ * @enum {number}
+ */
+WebInspector.Layers3DView.ChromeTexture = {
+ Left: 0,
+ Middle: 1,
+ Right: 2
+}
+
+/**
* @enum {string}
*/
WebInspector.Layers3DView.ScrollRectTitles = {
@@ -124,11 +135,13 @@ WebInspector.Layers3DView.BackgroundColor = [0, 0, 0, 0];
WebInspector.Layers3DView.HoveredBorderColor = [0, 0, 255, 1];
WebInspector.Layers3DView.SelectedBorderColor = [0, 255, 0, 1];
WebInspector.Layers3DView.BorderColor = [0, 0, 0, 1];
+WebInspector.Layers3DView.ViewportBorderColor = [160, 160, 160, 1];
WebInspector.Layers3DView.ScrollRectBackgroundColor = [178, 0, 0, 0.4];
WebInspector.Layers3DView.SelectedScrollRectBackgroundColor = [178, 0, 0, 0.6];
WebInspector.Layers3DView.ScrollRectBorderColor = [178, 0, 0, 1];
WebInspector.Layers3DView.BorderWidth = 1;
WebInspector.Layers3DView.SelectedBorderWidth = 2;
+WebInspector.Layers3DView.ViewportBorderWidth = 3;
WebInspector.Layers3DView.LayerSpacing = 20;
WebInspector.Layers3DView.ScrollRectSpacing = 4;
@@ -158,15 +171,18 @@ WebInspector.Layers3DView.prototype = {
*/
showImageForLayer: function(layer, imageURL)
{
- this._textureManager.createTexture(onTextureCreated.bind(this), imageURL);
+ if (imageURL)
+ this._textureManager.createTexture(onTextureCreated.bind(this), imageURL);
+ else
+ onTextureCreated.call(this, null);
/**
* @this {WebInspector.Layers3DView}
- * @param {!WebGLTexture} texture
+ * @param {?WebGLTexture} texture
*/
function onTextureCreated(texture)
{
- this._layerTexture = {layerId: layer.id(), texture: texture};
+ this._layerTexture = texture ? {layerId: layer.id(), texture: texture} : null;
this._update();
}
},
@@ -300,7 +316,7 @@ WebInspector.Layers3DView.prototype = {
this._pMatrix = new WebKitCSSMatrix().scale(1, -1, -1).translate(-1, -1, 0)
.scale(2 / this._canvasElement.width, 2 / this._canvasElement.height, 1 / 1000000).multiply(projectionMatrix);
this._gl.uniformMatrix4fv(this._shaderProgram.pMatrixUniform, false, this._arrayFromMatrix(this._pMatrix));
- this._textureScale = Math.min(1, Math.max(projectionMatrix.m11, projectionMatrix.m22));
+ this._scale = Math.max(projectionMatrix.m11, projectionMatrix.m22);
},
_initWhiteTexture: function()
@@ -311,6 +327,22 @@ WebInspector.Layers3DView.prototype = {
this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA, 1, 1, 0, this._gl.RGBA, this._gl.UNSIGNED_BYTE, whitePixel);
},
+ _initChromeTextures: function()
+ {
+ /**
+ * @this {WebInspector.Layers3DView}
+ * @param {!WebInspector.Layers3DView.ChromeTexture} index
+ * @param {?WebGLTexture} value
+ */
+ function saveChromeTexture(index, value)
+ {
+ this._chromeTextures[index] = value || undefined;
+ }
+ this._textureManager.createTexture(saveChromeTexture.bind(this, WebInspector.Layers3DView.ChromeTexture.Left), "Images/chromeLeft.png");
+ this._textureManager.createTexture(saveChromeTexture.bind(this, WebInspector.Layers3DView.ChromeTexture.Middle), "Images/chromeMiddle.png");
+ this._textureManager.createTexture(saveChromeTexture.bind(this, WebInspector.Layers3DView.ChromeTexture.Right), "Images/chromeRight.png");
+ },
+
_initGLIfNecessary: function()
{
if (this._gl)
@@ -318,6 +350,7 @@ WebInspector.Layers3DView.prototype = {
this._gl = this._initGL(this._canvasElement);
this._initShaders();
this._initWhiteTexture();
+ this._initChromeTextures();
this._textureManager.setContext(this._gl);
return this._gl;
},
@@ -459,18 +492,6 @@ WebInspector.Layers3DView.prototype = {
}
},
- _calculateViewportRect: function()
- {
- var rect = new WebInspector.Layers3DView.Rectangle(null);
- var viewport = this._layerTree.viewportSize();
- var depth = (this._maxDepth + 1) * WebInspector.Layers3DView.LayerSpacing;
- var vertices = [0, 0, depth, viewport.width, 0, depth, viewport.width, viewport.height, depth, 0, viewport.height, depth];
- rect.vertices = vertices;
- rect.borderColor = [0, 0, 0, 1];
- rect.lineWidth = 3;
- this._rects.push(rect);
- },
-
_calculateRects: function()
{
this._rects = [];
@@ -486,9 +507,6 @@ WebInspector.Layers3DView.prototype = {
else
this._layerTree.forEachLayer(this._calculateLayerTileRects.bind(this));
}
-
- if (this._layerTree.viewportSize() && this._showViewportSetting.get())
- this._calculateViewportRect();
},
/**
@@ -521,14 +539,13 @@ WebInspector.Layers3DView.prototype = {
/**
* @param {!Array.<number>} vertices
- * @param {boolean} isBorder
+ * @param {number} mode
* @param {!Array.<number>=} color
* @param {!Object=} texture
*/
- _drawRectangle: function(vertices, isBorder, color, texture)
+ _drawRectangle: function(vertices, mode, color, texture)
{
var gl = this._gl;
- var glMode = isBorder ? gl.LINE_LOOP : gl.TRIANGLE_FAN;
var white = [255, 255, 255, 1];
this._setVertexAttribute(this._shaderProgram.vertexPositionAttribute, vertices, 3);
this._setVertexAttribute(this._shaderProgram.textureCoordAttribute, [0, 1, 1, 1, 1, 0, 0, 0], 2);
@@ -543,8 +560,49 @@ WebInspector.Layers3DView.prototype = {
gl.bindTexture(gl.TEXTURE_2D, this._whiteTexture);
}
- var numberOfVertices = 4;
- gl.drawArrays(glMode, 0, numberOfVertices);
+ var numberOfVertices = vertices.length / 3;
+ gl.drawArrays(mode, 0, numberOfVertices);
+ },
+
+ /**
+ * @param {!Array.<number>} vertices
+ * @param {!WebGLTexture} texture
+ */
+ _drawTexture: function(vertices, texture)
+ {
+ this._drawRectangle(vertices, this._gl.TRIANGLE_FAN, undefined, texture);
+ },
+
+ _drawViewportAndChrome: function()
+ {
+ var viewport = this._layerTree.viewportSize();
+ if (!viewport)
+ return;
+
+ var drawChrome = this._showChromeSetting.get() && this._chromeTextures.length >= 3 && this._chromeTextures.indexOf(undefined) < 0;
+ var z = (this._maxDepth + 1) * WebInspector.Layers3DView.LayerSpacing;
+ var borderWidth = Math.round(WebInspector.Layers3DView.ViewportBorderWidth * this._scale);
+ var vertices = [viewport.width, 0, z, viewport.width, viewport.height, z, 0, viewport.height, z, 0, 0, z];
+ this._gl.lineWidth(borderWidth);
+ this._drawRectangle(vertices, drawChrome ? this._gl.LINE_STRIP : this._gl.LINE_LOOP, WebInspector.Layers3DView.ViewportBorderColor);
+
+ if (!drawChrome)
+ return;
+
+ var borderAdjustment = WebInspector.Layers3DView.ViewportBorderWidth / 2;
+ var viewportWidth = this._layerTree.viewportSize().width + 2 * borderAdjustment;
+ var chromeHeight = this._chromeTextures[0].image.naturalHeight;
+ var middleFragmentWidth = viewportWidth - this._chromeTextures[0].image.naturalWidth - this._chromeTextures[2].image.naturalWidth;
+ var x = -borderAdjustment;
+ var y = -chromeHeight;
+ for (var i = 0; i < this._chromeTextures.length; ++i) {
+ var width = i === WebInspector.Layers3DView.ChromeTexture.Middle ? middleFragmentWidth : this._chromeTextures[i].image.naturalWidth;
+ if (width < 0 || x + width > viewportWidth)
+ break;
+ vertices = [x, y, z, x + width, y, z, x + width, y + chromeHeight, z, x, y + chromeHeight, z];
+ this._drawTexture(vertices, /** @type {!WebGLTexture} */ (this._chromeTextures[i]));
+ x += width;
+ }
},
/**
@@ -554,12 +612,12 @@ WebInspector.Layers3DView.prototype = {
{
var vertices = rect.vertices;
if (rect.texture)
- this._drawRectangle(vertices, false, undefined, rect.texture);
+ this._drawTexture(vertices, rect.texture);
else if (rect.fillColor)
- this._drawRectangle(vertices, false, rect.fillColor);
+ this._drawRectangle(vertices, this._gl.TRIANGLE_FAN, rect.fillColor);
this._gl.lineWidth(rect.lineWidth);
if (rect.borderColor)
- this._drawRectangle(vertices, true, rect.borderColor);
+ this._drawRectangle(vertices, this._gl.LINE_LOOP, rect.borderColor);
},
_update: function()
@@ -580,12 +638,13 @@ WebInspector.Layers3DView.prototype = {
this._initProjectionMatrix();
this._calculateDepths();
- this._textureManager.setScale(this._textureScale);
+ this._textureManager.setScale(Math.min(1, this._scale));
gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
this._calculateRects();
this._rects.forEach(this._drawViewRect.bind(this));
+ this._drawViewportAndChrome();
},
/**
@@ -641,7 +700,7 @@ WebInspector.Layers3DView.prototype = {
{
this._panelStatusBarElement = this.element.createChild("div", "panel-status-bar");
this._panelStatusBarElement.appendChild(this._transformController.controlPanelElement());
- this._showViewportSetting = this._createVisibilitySetting("Viewport", "showViewport", true, this._panelStatusBarElement);
+ this._showChromeSetting = this._createVisibilitySetting("Chrome", "showChrome", true, this._panelStatusBarElement);
this._showSlowScrollRectsSetting = this._createVisibilitySetting("Slow scroll rects", "showSlowScrollRects", true, this._panelStatusBarElement);
this._showPaintsSetting = this._createVisibilitySetting("Paints", "showPaints", true, this._panelStatusBarElement);
},
@@ -816,12 +875,13 @@ WebInspector.LayerTextureManager.prototype = {
*/
function onGotImage(imageURL)
{
- this.createTexture(onTextureCreated.bind(this), imageURL);
+ if (imageURL)
+ this.createTexture(onTextureCreated.bind(this), imageURL);
}
/**
* @this {WebInspector.LayerTextureManager}
- * @param {!WebGLTexture} texture
+ * @param {?WebGLTexture} texture
*/
function onTextureCreated(texture)
{
@@ -831,13 +891,14 @@ WebInspector.LayerTextureManager.prototype = {
},
/**
- * @param {!function(!WebGLTexture)} textureCreatedCallback
- * @param {string=} imageURL
+ * @param {function(?WebGLTexture)} textureCreatedCallback
+ * @param {string} imageURL
*/
createTexture: function(textureCreatedCallback, imageURL)
{
var image = new Image();
image.addEventListener("load", onImageLoaded.bind(this), false);
+ image.addEventListener("error", onImageError, false);
image.src = imageURL;
/**
@@ -847,6 +908,11 @@ WebInspector.LayerTextureManager.prototype = {
{
textureCreatedCallback(this._createTextureForImage(image));
}
+
+ function onImageError()
+ {
+ textureCreatedCallback(null);
+ }
},
/**
« no previous file with comments | « Source/devtools/front_end/Images/chromeRight.png ('k') | Source/devtools/front_end/timelinePanel.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698