diff options
Diffstat (limited to 'android/experimental/LOAndroid2/app/src/main/java/org/mozilla/gecko/gfx/MultiTileLayer.java')
-rw-r--r-- | android/experimental/LOAndroid2/app/src/main/java/org/mozilla/gecko/gfx/MultiTileLayer.java | 250 |
1 files changed, 0 insertions, 250 deletions
diff --git a/android/experimental/LOAndroid2/app/src/main/java/org/mozilla/gecko/gfx/MultiTileLayer.java b/android/experimental/LOAndroid2/app/src/main/java/org/mozilla/gecko/gfx/MultiTileLayer.java deleted file mode 100644 index a958a54eb303..000000000000 --- a/android/experimental/LOAndroid2/app/src/main/java/org/mozilla/gecko/gfx/MultiTileLayer.java +++ /dev/null @@ -1,250 +0,0 @@ -/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- -* ***** BEGIN LICENSE BLOCK ***** -* Version: MPL 1.1/GPL 2.0/LGPL 2.1 -* -* The contents of this file are subject to the Mozilla Public License Version -* 1.1 (the "License"); you may not use this file except in compliance with -* the License. You may obtain a copy of the License at -* http://www.mozilla.org/MPL/ -* -* Software distributed under the License is distributed on an "AS IS" basis, -* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -* for the specific language governing rights and limitations under the -* License. -* -* The Original Code is Mozilla Android code. -* -* The Initial Developer of the Original Code is Mozilla Foundation. -* Portions created by the Initial Developer are Copyright (C) 2011-2012 -* the Initial Developer. All Rights Reserved. -* -* Contributor(s): -* Chris Lord <chrislord.net@gmail.com> -* Arkady Blyakher <rkadyb@mit.edu> -* -* Alternatively, the contents of this file may be used under the terms of -* either the GNU General Public License Version 2 or later (the "GPL"), or -* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -* in which case the provisions of the GPL or the LGPL are applicable instead -* of those above. If you wish to allow use of your version of this file only -* under the terms of either the GPL or the LGPL, and not to allow others to -* use your version of this file under the terms of the MPL, indicate your -* decision by deleting the provisions above and replace them with the notice -* and other provisions required by the GPL or the LGPL. If you do not delete -* the provisions above, a recipient may use your version of this file under -* the terms of any one of the MPL, the GPL or the LGPL. -* -* ***** END LICENSE BLOCK ***** */ - -package org.mozilla.gecko.gfx; - -import android.graphics.Bitmap; -import android.graphics.Point; -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.Region; -import android.util.Log; - -import org.libreoffice.LOKitShell; - -import java.nio.Buffer; -import java.nio.ByteBuffer; -import java.util.ArrayList; - -/** - * Encapsulates the logic needed to draw a layer made of multiple tiles. - * <p/> - * TODO: Support repeating. - */ -public class MultiTileLayer extends Layer { - private static final String LOGTAG = "GeckoMultiTileLayer"; - - private final ArrayList<SubTile> mTiles; - private IntSize mTileSize; - private IntSize mSize; - - public MultiTileLayer(IntSize tileSize) { - super(); - mTileSize = tileSize; - mTiles = new ArrayList<SubTile>(); - mSize = new IntSize(0,0); - } - - public void invalidate(Rect dirtyRect) { - if (!inTransaction()) { - throw new RuntimeException("invalidate() is only valid inside a transaction"); - } - - for (SubTile layer : mTiles) { - IntSize tileSize = layer.getSize(); - Rect tileRect = new Rect(layer.x, layer.y, layer.x + tileSize.width, layer.y + tileSize.height); - - if (tileRect.intersect(dirtyRect)) { - tileRect.offset(-layer.x, -layer.y); - layer.invalidate(tileRect); - } - } - } - - public void invalidate() { - for (SubTile layer : mTiles) { - layer.invalidate(); - } - } - - public void setSize(IntSize size) { - mSize = size; - } - - @Override - public IntSize getSize() { - return mSize; - } - - private void validateTiles() { - Log.i(LOGTAG, "validateTiles()"); - - // Set tile origins and resolution - refreshTileMetrics(getOrigin(), getResolution(), false); - } - - @Override - protected boolean performUpdates(RenderContext context) { - super.performUpdates(context); - - validateTiles(); - - // Iterate over the tiles and decide which ones we'll be drawing - int dirtyTiles = 0; - boolean screenUpdateDone = false; - SubTile firstDirtyTile = null; - for (SubTile layer : mTiles) { - // First do a non-texture update to make sure coordinates are - // up-to-date. - boolean invalid = layer.getSkipTextureUpdate(); - layer.setSkipTextureUpdate(true); - layer.performUpdates(context); - - RectF layerBounds = layer.getBounds(context, new FloatSize(layer.getSize())); - boolean isDirty = layer.isDirty(); - - if (isDirty) { - if (!RectF.intersects(layerBounds, context.viewport)) { - if (firstDirtyTile == null) - firstDirtyTile = layer; - dirtyTiles++; - invalid = true; - } else { - // This tile intersects with the screen and is dirty, - // update it immediately. - layer.setSkipTextureUpdate(false); - screenUpdateDone = true; - layer.performUpdates(context); - invalid = false; - } - } - - // We use the SkipTextureUpdate flag as a marker of a tile's - // validity. This is required, as sometimes layers are drawn - // without updating first, and we mustn't draw tiles that have - // been marked as invalid that we haven't updated. - layer.setSkipTextureUpdate(invalid); - } - - // Now if no tiles that intersect with the screen were updated, update - // a single tile that doesn't (if there are any). This has the effect - // of spreading out non-critical texture upload over time, and smoothing - // upload-related hitches. - if (!screenUpdateDone && firstDirtyTile != null) { - firstDirtyTile.setSkipTextureUpdate(false); - firstDirtyTile.performUpdates(context); - dirtyTiles--; - } - - return (dirtyTiles == 0); - } - - private void refreshTileMetrics(Point origin, float resolution, boolean inTransaction) { - IntSize size = getSize(); - for (SubTile layer : mTiles) { - if (!inTransaction) { - layer.beginTransaction(); - } - - if (origin != null) { - layer.setOrigin(new Point(origin.x + layer.x, origin.y + layer.y)); - } - if (resolution >= 0.0f) { - layer.setResolution(resolution); - } - - if (!inTransaction) { - layer.endTransaction(); - } - } - } - - @Override - public void setOrigin(Point newOrigin) { - super.setOrigin(newOrigin); - refreshTileMetrics(newOrigin, -1, true); - } - - @Override - public void setResolution(float newResolution) { - super.setResolution(newResolution); - refreshTileMetrics(null, newResolution, true); - } - - @Override - public void beginTransaction() { - super.beginTransaction(); - - for (SubTile layer : mTiles) { - layer.beginTransaction(); - } - } - - @Override - public void endTransaction() { - for (SubTile layer : mTiles) { - layer.endTransaction(); - } - - super.endTransaction(); - } - - @Override - public void draw(RenderContext context) { - for (SubTile layer : mTiles) { - // We use the SkipTextureUpdate flag as a validity flag. If it's false, - // the contents of this tile are invalid and we shouldn't draw it. - if (layer.getSkipTextureUpdate()) - continue; - - // Avoid work, only draw tiles that intersect with the viewport - RectF layerBounds = layer.getBounds(context, new FloatSize(layer.getSize())); - if (RectF.intersects(layerBounds, context.viewport)) - layer.draw(context); - } - } - - @Override - public Region getValidRegion(RenderContext context) { - Region validRegion = new Region(); - for (SubTile tile : mTiles) { - if (tile.getSkipTextureUpdate()) - continue; - validRegion.op(tile.getValidRegion(context), Region.Op.UNION); - } - - return validRegion; - } - - public void addTile(Bitmap bitmap, int x, int y) { - SubTile tile = new SubTile(new BufferedCairoImage(bitmap), x,y); - tile.beginTransaction(); - mTiles.add(tile); - } -} - |