bug 511516. Add BrowserView API for rendering to a destination canvas.

This commit is contained in:
Roy Frostig 2009-08-22 14:06:51 -04:00
Родитель 44d5916370
Коммит e23f697100
4 изменённых файлов: 81 добавлений и 12 удалений

Просмотреть файл

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