зеркало из https://github.com/mozilla/gecko-dev.git
bug 511516. Add BrowserView API for rendering to a destination canvas.
This commit is contained in:
Родитель
44d5916370
Коммит
e23f697100
|
@ -509,6 +509,37 @@ BrowserView.prototype = {
|
||||||
this.setZoomLevel(bvs.zoomLevel + zoomDelta);
|
this.setZoomLevel(bvs.zoomLevel + zoomDelta);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render a rectangle within the browser viewport to the destination canvas
|
||||||
|
* under the given scale.
|
||||||
|
*
|
||||||
|
* @param destCanvas The destination canvas into which the image is rendered.
|
||||||
|
* @param destWidth Destination width
|
||||||
|
* @param destHeight Destination height
|
||||||
|
* @param srcRect [optional] The source rectangle in BrowserView coordinates.
|
||||||
|
* This defaults to the visible rect rooted at the x,y of the critical rect.
|
||||||
|
*/
|
||||||
|
renderToCanvas: function renderToCanvas(destCanvas, destWidth, destHeight, srcRect) {
|
||||||
|
let bvs = this._browserViewportState;
|
||||||
|
if (!bvs) {
|
||||||
|
throw "Browser viewport state null in call to renderToCanvas (probably no browser set on BrowserView).";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!srcRect) {
|
||||||
|
let vr = this.getVisibleRect();
|
||||||
|
let cr = BrowserView.Util.visibleRectToCriticalRect(vr, bvs);
|
||||||
|
vr.x = cr.left;
|
||||||
|
vr.y = cr.top;
|
||||||
|
srcRect = vr;
|
||||||
|
}
|
||||||
|
|
||||||
|
let scalex = (destWidth / srcRect.width) || 1;
|
||||||
|
let scaley = (destHeight / srcRect.height) || 1;
|
||||||
|
|
||||||
|
srcRect.restrictTo(bvs.viewportRect);
|
||||||
|
this._tileManager.renderRectToCanvas(srcRect, destCanvas, scalex, scaley);
|
||||||
|
},
|
||||||
|
|
||||||
viewportToBrowser: function viewportToBrowser(x) {
|
viewportToBrowser: function viewportToBrowser(x) {
|
||||||
let bvs = this._browserViewportState;
|
let bvs = this._browserViewportState;
|
||||||
|
|
||||||
|
|
|
@ -305,6 +305,46 @@ TileManager.prototype = {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
renderRectToCanvas: function renderRectToCanvas(srcRect, destCanvas, scalex, scaley) {
|
||||||
|
let tc = this._tileCache;
|
||||||
|
let ctx = destCanvas.getContext("2d");
|
||||||
|
|
||||||
|
let completed = (function breakableLoop() {
|
||||||
|
BEGIN_FOREACH_IN_RECT(srcRect, tc, tile)
|
||||||
|
|
||||||
|
if (tile.isDirty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let dx = Math.round(scalex * (tile.boundRect.left - srcRect.left));
|
||||||
|
let dy = Math.round(scaley * (tile.boundRect.top - srcRect.top));
|
||||||
|
|
||||||
|
ctx.drawImage(tile._canvas, dx, dy,
|
||||||
|
Math.round(scalex * kTileWidth),
|
||||||
|
Math.round(scaley * kTileHeight));
|
||||||
|
|
||||||
|
END_FOREACH_IN_RECT
|
||||||
|
|
||||||
|
return true;
|
||||||
|
})();
|
||||||
|
|
||||||
|
if (!completed) {
|
||||||
|
let bv = this._browserView;
|
||||||
|
|
||||||
|
bv.viewportToBrowserRect(srcRect);
|
||||||
|
|
||||||
|
ctx.save();
|
||||||
|
|
||||||
|
bv.browserToViewportCanvasContext(ctx);
|
||||||
|
ctx.scale(scalex, scaley);
|
||||||
|
ctx.drawWindow(bv._contentWindow,
|
||||||
|
0, 0, srcRect.width, srcRect.height,
|
||||||
|
"white",
|
||||||
|
(ctx.DRAWWINDOW_DO_NOT_FLUSH | ctx.DRAWWINDOW_DRAW_CARET));
|
||||||
|
|
||||||
|
ctx.restore();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_renderTile: function _renderTile(tile) {
|
_renderTile: function _renderTile(tile) {
|
||||||
if (tile.isDirty())
|
if (tile.isDirty())
|
||||||
tile.render(this._browserView);
|
tile.render(this._browserView);
|
||||||
|
|
|
@ -2431,8 +2431,7 @@ Tab.prototype = {
|
||||||
if (!this._browser)
|
if (!this._browser)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// XXX draw from the tiles in to the source
|
let browserView = (Browser.selectedBrowser == this._browser) ? Browser._browserView : null;
|
||||||
let srcCanvas = (Browser.selectedBrowser == this._browser) ? document.getElementById("browser-canvas") : null;
|
this._chromeTab.updateThumbnail(this._browser, browserView);
|
||||||
this._chromeTab.updateThumbnail(this._browser, srcCanvas);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -27,20 +27,19 @@
|
||||||
|
|
||||||
<method name="updateThumbnail">
|
<method name="updateThumbnail">
|
||||||
<parameter name="browser"/>
|
<parameter name="browser"/>
|
||||||
<parameter name="srcCanvas"/>
|
<parameter name="browserView"/>
|
||||||
<body>
|
<body>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
const tabWidth = 106;
|
const tabWidth = 106;
|
||||||
const tabHeight = 64;
|
const tabHeight = 64;
|
||||||
let canvas = document.getAnonymousElementByAttribute(this, "anonid", "canvas");
|
|
||||||
|
|
||||||
|
let destCanvas = document.getAnonymousElementByAttribute(this, "anonid", "canvas");
|
||||||
|
|
||||||
|
if (browserView) {
|
||||||
|
browserView.renderToCanvas(destCanvas, tabWidth, tabHeight);
|
||||||
|
} else {
|
||||||
let domWin = browser.contentWindow;
|
let domWin = browser.contentWindow;
|
||||||
let ctx = canvas.getContext("2d");
|
let ctx = destCanvas.getContext("2d");
|
||||||
|
|
||||||
if (srcCanvas) {
|
|
||||||
ctx.drawImage(srcCanvas, 0, -tabHeight, tabWidth, tabHeight*3)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
let width = domWin.innerWidth;
|
let width = domWin.innerWidth;
|
||||||
let height = domWin.innerHeight;
|
let height = domWin.innerHeight;
|
||||||
ctx.clearRect(0, 0, tabWidth, tabHeight);
|
ctx.clearRect(0, 0, tabWidth, tabHeight);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче