Bug 523988 - Dirty Tiles show up when trying to zoom during a page load [r=mfinkle]

This commit is contained in:
Benjamin Stover 2009-12-08 09:44:57 -08:00
Родитель 1a5c97365a
Коммит 635cb33b18
2 изменённых файлов: 37 добавлений и 3 удалений

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

@ -778,10 +778,14 @@ BrowserView.prototype = {
BrowserView.Util.getBrowserDOMWindowUtils(this._browser).clearMozAfterPaintEvents(); BrowserView.Util.getBrowserDOMWindowUtils(this._browser).clearMozAfterPaintEvents();
} }
let vr = this.getVisibleRect();
this._tileManager.viewportChangeHandler(bvs.viewportRect, this._tileManager.viewportChangeHandler(bvs.viewportRect,
BrowserView.Util.visibleRectToCriticalRect(this.getVisibleRect(), bvs), BrowserView.Util.visibleRectToCriticalRect(vr, bvs),
viewportSizeChanged, viewportSizeChanged,
dirtyAll); dirtyAll);
let rects = vr.subtract(bvs.viewportRect);
this._tileManager.clearRects(rects);
} }
}, },

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

@ -236,6 +236,28 @@ TileManager.prototype = {
} }
}, },
/**
* Erase everything in these rects. Useful for tiles that are outside of the viewport rect but
* still visible.
*/
clearRects: function clearRects(rects) {
let criticalIsDirty = false;
let criticalRect = this._criticalRect;
let tc = this._tileCache;
let crawler = this._crawler;
for (let i = rects.length - 1; i >= 0; --i) {
let rect = rects[i];
BEGIN_FOREACH_IN_RECT(rect, tc, tile)
tile.clear(rect);
END_FOREACH_IN_RECT
}
if (criticalIsDirty && doCriticalRender)
this.criticalRectPaint();
},
dirtyRects: function dirtyRects(rects, doCriticalRender) { dirtyRects: function dirtyRects(rects, doCriticalRender) {
let criticalIsDirty = false; let criticalIsDirty = false;
let criticalRect = this._criticalRect; let criticalRect = this._criticalRect;
@ -252,8 +274,7 @@ TileManager.prototype = {
else else
criticalIsDirty = true; criticalIsDirty = true;
let intersection = tile.boundRect.intersect(rects[i]); tile.markDirty(rects[i]);
tile.markDirty(intersection);
if (crawler) if (crawler)
crawler.enqueue(tile.i, tile.j); crawler.enqueue(tile.i, tile.j);
@ -775,6 +796,15 @@ TileManager.Tile.prototype = {
isDirty: function isDirty() { return this._dirtyTileCanvas; }, isDirty: function isDirty() { return this._dirtyTileCanvas; },
/** Clear region in rect. */
clear: function clear(rect) {
let boundRect = this.boundRect;
let region = rect.intersect(boundRect).expandToIntegers().translate(-boundRect.left, -boundRect.top);
let ctx = this._canvas.getContext("2d");
ctx.fillStyle = "white";
ctx.fillRect(region.left, region.top, region.right - region.left, region.bottom - region.top);
},
/** /**
* This will mark dirty at least everything in dirtyRect (which must be * This will mark dirty at least everything in dirtyRect (which must be
* specified in canvas coordinates). If dirtyRect is not given then * specified in canvas coordinates). If dirtyRect is not given then