android/experimental/LOAndroid3/res/layout/activity_main.xml | 12 android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java | 3 android/experimental/LOAndroid3/src/java/org/libreoffice/MockTileProvider.java | 5 android/experimental/LOAndroid3/src/java/org/libreoffice/TileProvider.java | 3 android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/DynamicTileLayer.java | 197 +++++++ android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/GeckoLayerClient.java | 8 android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/MultiTileLayer.java | 277 ---------- android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/SingleTileLayer.java | 104 ++- android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/SubTile.java | 22 android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/TileLayer.java | 2 10 files changed, 287 insertions(+), 346 deletions(-)
New commits: commit cd44820c0802cea1e72d765d4765f403a2a66110 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.com> Date: Wed Oct 1 13:53:42 2014 +0200 android: image in TileLayer can be null Change-Id: I4a910eb60f6fe81f97933d1b9e57bac6af4547c9 diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/TileLayer.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/TileLayer.java index 1ee1f1a..28ac487 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/TileLayer.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/TileLayer.java @@ -28,7 +28,7 @@ public abstract class TileLayer extends Layer { private PaintMode mPaintMode; public TileLayer(CairoImage image, PaintMode paintMode) { - super(image.getSize()); + super(image == null ? null : image.getSize()); mPaintMode = paintMode; mImage = image; commit 56163a91947bbc83a8221eea3f06649501b9dcf0 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.com> Date: Wed Oct 1 13:53:11 2014 +0200 android: SubTile - equals and hash Change-Id: I6e8cf220d108cefdf16f9b4553e2d2ecd7a5338c diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/SubTile.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/SubTile.java index 5ab4f0d..27f11fc 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/SubTile.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/SubTile.java @@ -22,4 +22,26 @@ public class SubTile extends SingleTileLayer { public void markForRemoval() { markedForRemoval = true; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + SubTile subTile = (SubTile) o; + + if (x != subTile.x) return false; + if (y != subTile.y) return false; + if (Float.compare(subTile.zoom, zoom) != 0) return false; + + return true; + } + + @Override + public int hashCode() { + int result = x; + result = 31 * result + y; + result = 31 * result + (zoom != +0.0f ? Float.floatToIntBits(zoom) : 0); + return result; + } } commit 7825d334db021113331a409db5e93f556d1ff0c2 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.com> Date: Wed Oct 1 13:52:07 2014 +0200 android: SingleTileLayer - less var. trashing (Fennec update) Change-Id: I8c32f6a43cad6dd3790a3e7dd0b990516a35ebca diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/SingleTileLayer.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/SingleTileLayer.java index cc1988f..0bc2716 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/SingleTileLayer.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/SingleTileLayer.java @@ -23,14 +23,40 @@ public class SingleTileLayer extends TileLayer { private Rect mMask; - public SingleTileLayer(CairoImage image) { this(false, image); } + // To avoid excessive GC, declare some objects here that would otherwise + // be created and destroyed frequently during draw(). + private final RectF mBounds; + private final RectF mTextureBounds; + private final RectF mViewport; + private final Rect mIntBounds; + private final Rect mSubRect; + private final RectF mSubRectF; + private final Region mMaskedBounds; + private final Rect mCropRect; + private final RectF mObjRectF; + private final float[] mCoords; + + public SingleTileLayer(CairoImage image) { + this(false, image); + } public SingleTileLayer(boolean repeat, CairoImage image) { - super(image, repeat ? PaintMode.REPEAT : PaintMode.NORMAL); + this(image, repeat ? TileLayer.PaintMode.REPEAT : TileLayer.PaintMode.NORMAL); } public SingleTileLayer(CairoImage image, TileLayer.PaintMode paintMode) { super(image, paintMode); + + mBounds = new RectF(); + mTextureBounds = new RectF(); + mViewport = new RectF(); + mIntBounds = new Rect(); + mSubRect = new Rect(); + mSubRectF = new RectF(); + mMaskedBounds = new Region(); + mCropRect = new Rect(); + mObjRectF = new RectF(); + mCoords = new float[20]; } /** @@ -47,83 +73,69 @@ public class SingleTileLayer extends TileLayer { if (!initialized()) return; - RectF bounds; - RectF textureBounds; - RectF viewport = context.viewport; + mViewport.set(context.viewport); if (repeats()) { // If we're repeating, we want to adjust the texture bounds so that // the texture repeats the correct number of times when drawn at // the size of the viewport. - bounds = getBounds(context); - textureBounds = new RectF(0.0f, 0.0f, bounds.width(), bounds.height()); - bounds = new RectF(0.0f, 0.0f, viewport.width(), viewport.height()); + mBounds.set(getBounds(context)); + mTextureBounds.set(0.0f, 0.0f, mBounds.width(), mBounds.height()); + mBounds.set(0.0f, 0.0f, mViewport.width(), mViewport.height()); } else if (stretches()) { // If we're stretching, we just want the bounds and texture bounds // to fit to the page. - bounds = new RectF(context.pageRect); - textureBounds = bounds; + mBounds.set(context.pageRect); + mTextureBounds.set(mBounds); } else { - bounds = getBounds(context); - textureBounds = bounds; + mBounds.set(getBounds(context)); + mTextureBounds.set(mBounds); } - Rect intBounds = new Rect(); - bounds.roundOut(intBounds); - Region maskedBounds = new Region(intBounds); + mBounds.roundOut(mIntBounds); + mMaskedBounds.set(mIntBounds); if (mMask != null) { - maskedBounds.op(mMask, Region.Op.DIFFERENCE); - if (maskedBounds.isEmpty()) + mMaskedBounds.op(mMask, Region.Op.DIFFERENCE); + if (mMaskedBounds.isEmpty()) return; } // XXX Possible optimisation here, form this array so we can draw it in // a single call. - RegionIterator i = new RegionIterator(maskedBounds); - for (Rect subRect = new Rect(); i.next(subRect);) { + RegionIterator i = new RegionIterator(mMaskedBounds); + while (i.next(mSubRect)) { // Compensate for rounding errors at the edge of the tile caused by // the roundOut above - RectF subRectF = new RectF(Math.max(bounds.left, (float)subRect.left), - Math.max(bounds.top, (float)subRect.top), - Math.min(bounds.right, (float)subRect.right), - Math.min(bounds.bottom, (float)subRect.bottom)); + mSubRectF.set(Math.max(mBounds.left, (float)mSubRect.left), + Math.max(mBounds.top, (float)mSubRect.top), + Math.min(mBounds.right, (float)mSubRect.right), + Math.min(mBounds.bottom, (float)mSubRect.bottom)); // This is the left/top/right/bottom of the rect, relative to the // bottom-left of the layer, to use for texture coordinates. - int[] cropRect = new int[] { Math.round(subRectF.left - bounds.left), - Math.round(bounds.bottom - subRectF.top), - Math.round(subRectF.right - bounds.left), - Math.round(bounds.bottom - subRectF.bottom) }; - - float left = subRectF.left - viewport.left; - float top = viewport.bottom - subRectF.bottom; - float right = left + subRectF.width(); - float bottom = top + subRectF.height(); - - float[] coords = { - //x, y, z, texture_x, texture_y - left/viewport.width(), bottom/viewport.height(), 0, - cropRect[0]/textureBounds.width(), cropRect[1]/textureBounds.height(), - - left/viewport.width(), top/viewport.height(), 0, - cropRect[0]/textureBounds.width(), cropRect[3]/textureBounds.height(), + mCropRect.set(Math.round(mSubRectF.left - mBounds.left), + Math.round(mBounds.bottom - mSubRectF.top), + Math.round(mSubRectF.right - mBounds.left), + Math.round(mBounds.bottom - mSubRectF.bottom)); - right/viewport.width(), bottom/viewport.height(), 0, - cropRect[2]/textureBounds.width(), cropRect[1]/textureBounds.height(), + mObjRectF.set(mSubRectF.left - mViewport.left, + mViewport.bottom - mSubRectF.bottom, + mSubRectF.right - mViewport.left, + mViewport.bottom - mSubRectF.top); - right/viewport.width(), top/viewport.height(), 0, - cropRect[2]/textureBounds.width(), cropRect[3]/textureBounds.height() - }; + fillRectCoordBuffer(mCoords, mObjRectF, mViewport.width(), mViewport.height(), + mCropRect, mTextureBounds.width(), mTextureBounds.height()); FloatBuffer coordBuffer = context.coordBuffer; int positionHandle = context.positionHandle; int textureHandle = context.textureHandle; + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, getTextureID()); // Make sure we are at position zero in the buffer coordBuffer.position(0); - coordBuffer.put(coords); + coordBuffer.put(mCoords); // Unbind any the current array buffer so we can use client side buffers GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); commit 6fdcd9bceb7be543dad849a6803a9848b466262a Author: Tomaž Vajngerl <tomaz.vajng...@collabora.com> Date: Wed Oct 1 13:51:00 2014 +0200 android: replace MultiTileLayer with new & simpler DynamicTileLayer Change-Id: Idec2246975a65f8ce664642a4ef49415e20ca187 diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/DynamicTileLayer.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/DynamicTileLayer.java new file mode 100644 index 0000000..03da4bf --- /dev/null +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/DynamicTileLayer.java @@ -0,0 +1,197 @@ +package org.mozilla.gecko.gfx; + +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Region; +import android.util.Log; + +import org.libreoffice.TileProvider; +import org.mozilla.gecko.util.FloatUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class DynamicTileLayer extends Layer { + private static final String LOGTAG = DynamicTileLayer.class.getSimpleName(); + + private final List<SubTile> tiles = new CopyOnWriteArrayList<SubTile>(); + private TileProvider tileProvider; + private final FloatSize tileSize; + private RectF currentViewport = new RectF(); + + public DynamicTileLayer() { + this.tileSize = new FloatSize(256, 256); + } + + public DynamicTileLayer(FloatSize tileSize) { + this.tileSize = tileSize; + } + + public void setTileProvider(TileProvider tileProvider) { + this.tileProvider = tileProvider; + } + + public void invalidate() { + for (SubTile layer : tiles) { + layer.invalidate(); + } + } + + @Override + public void beginTransaction() { + super.beginTransaction(); + for (SubTile tile : tiles) { + tile.beginTransaction(); + } + } + + @Override + public void endTransaction() { + for (SubTile tile : tiles) { + tile.endTransaction(); + } + super.endTransaction(); + } + + @Override + public void draw(RenderContext context) { + for (SubTile tile : tiles) { + if (RectF.intersects(tile.getBounds(context), context.viewport)) { + tile.draw(context); + } + } + } + + @Override + protected void performUpdates(RenderContext context) { + super.performUpdates(context); + + refreshTileMetrics(); + + for (SubTile tile : tiles) { + tile.performUpdates(context); + } + } + + @Override + public Region getValidRegion(RenderContext context) { + Region validRegion = new Region(); + for (SubTile tile : tiles) { + validRegion.op(tile.getValidRegion(context), Region.Op.UNION); + } + + return validRegion; + } + + @Override + public void setResolution(float newResolution) { + super.setResolution(newResolution); + for (SubTile tile : tiles) { + tile.setResolution(newResolution); + } + } + + private void refreshTileMetrics() { + for (SubTile tile : tiles) { + tile.beginTransaction(); + + Rect position = tile.getPosition(); + float positionX = tile.x / tile.zoom; + float positionY = tile.y / tile.zoom; + float tileSizeWidth = tileSize.width / tile.zoom; + float tileSizeHeight = tileSize.height / tile.zoom; + position.set((int) positionX, (int) positionY, (int) (positionX + tileSizeWidth + 1), (int) (positionY + tileSizeHeight + 1)); + tile.setPosition(position); + + tile.endTransaction(); + } + } + + private RectF roundToTileSize(RectF input, FloatSize tileSize) { + float minX = ((int)(input.left / tileSize.width)) * tileSize.width; + float minY = ((int)(input.top / tileSize.height)) * tileSize.height; + float maxX = ((int)(input.right / tileSize.width) + 1) * tileSize.width; + float maxY = ((int)(input.bottom / tileSize.height) + 1) * tileSize.height; + return new RectF(minX, minY, maxX, maxY); + } + + private RectF inflate(RectF rect, FloatSize inflateSize) { + RectF newRect = new RectF(rect); + newRect.left -= inflateSize.width; + newRect.left = newRect.left < 0.0f ? 0.0f : newRect.left; + + newRect.top -= inflateSize.height; + newRect.top = newRect.top < 0.0f ? 0.0f : newRect.top; + + newRect.right += inflateSize.width; + newRect.bottom += inflateSize.height; + + return newRect; + } + + public void reevaluateTiles(ImmutableViewportMetrics viewportMetrics) { + RectF newCurrentViewPort = inflate(roundToTileSize(viewportMetrics.getViewport(), tileSize), tileSize); + + if (!currentViewport.equals(newCurrentViewPort)) { + Log.i(LOGTAG, "reevaluateTiles " + currentViewport + " " + newCurrentViewPort); + currentViewport = newCurrentViewPort; + clearMarkedTiles(); + addNewTiles(viewportMetrics); + markTiles(viewportMetrics); + } + } + + private void addNewTiles(ImmutableViewportMetrics viewportMetrics) { + for (float y = currentViewport.top; y < currentViewport.bottom; y += tileSize.height) { + if (y > viewportMetrics.getPageHeight()) { + continue; + } + for (float x = currentViewport.left; x < currentViewport.right; x += tileSize.width) { + if (x > viewportMetrics.getPageWidth()) { + continue; + } + boolean contains = false; + for (SubTile tile : tiles) { + if (tile.x == x && tile.y == y && tile.zoom == viewportMetrics.zoomFactor) { + contains = true; + } + } + if (!contains) { + CairoImage image = tileProvider.createTile(x, y, tileSize, viewportMetrics.zoomFactor); + SubTile tile = new SubTile(image, (int) x, (int) y, viewportMetrics.zoomFactor); + tile.beginTransaction(); + tiles.add(tile); + } + } + } + } + + private void clearMarkedTiles() { + List<SubTile> tilesToRemove = new ArrayList<SubTile>(); + for (SubTile tile : tiles) { + if (tile.markedForRemoval) { + tile.destroy(); + tilesToRemove.add(tile); + } + } + tiles.removeAll(tilesToRemove); + } + + private void markTiles(ImmutableViewportMetrics viewportMetrics) { + for (SubTile tile : tiles) { + if (FloatUtils.fuzzyEquals(tile.zoom, viewportMetrics.zoomFactor)) { + RectF tileRect = new RectF(tile.x, tile.y, tile.x + tileSize.width, tile.y + tileSize.height); + if (!RectF.intersects(currentViewport, tileRect)) { + tile.markForRemoval(); + } + } else { + tile.markForRemoval(); + } + } + } + + public void clearAllTiles() { + tiles.clear(); + } +} diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/GeckoLayerClient.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/GeckoLayerClient.java index 9c3a893..9ae462b 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/GeckoLayerClient.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/GeckoLayerClient.java @@ -62,7 +62,7 @@ public class GeckoLayerClient implements LayerView.Listener { private boolean mRecordDrawTimes; private DrawTimingQueue mDrawTimingQueue; - private MultiTileLayer mRootLayer; + private DynamicTileLayer mRootLayer; /* The viewport that Gecko is currently displaying. */ private ImmutableViewportMetrics mGeckoViewport; @@ -88,7 +88,7 @@ public class GeckoLayerClient implements LayerView.Listener { mLayerController = layerController; - mRootLayer = new MultiTileLayer(); + mRootLayer = new DynamicTileLayer(); view.setListener(this); layerController.setRoot(mRootLayer); diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/MultiTileLayer.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/MultiTileLayer.java deleted file mode 100644 index 7d1306e..0000000 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/MultiTileLayer.java +++ /dev/null @@ -1,273 +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....@gmail.com> -* Arkady Blyakher <rka...@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.Point; -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.Region; - -import org.libreoffice.TileProvider; -import org.mozilla.gecko.util.FloatUtils; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -public class MultiTileLayer extends Layer { - private static final String LOGTAG = "MultiTileLayer"; - - private static int TILE_SIZE = 256; - private final List<SubTile> mTiles = new CopyOnWriteArrayList<SubTile>(); - private TileProvider tileProvider; - private RectF currentViewPort = new RectF(); - - public void invalidate() { - for (SubTile layer : mTiles) { - layer.invalidate(); - } - } - - private void validateTiles() { - // Set tile origins and resolution - Point origin = new Point(); - refreshTileMetrics(origin, getResolution(), false); - } - - @Override - protected void 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. - layer.performUpdates(context); - - RectF layerBounds = layer.getBounds(context); - - if (!RectF.intersects(layerBounds, context.viewport)) { - if (firstDirtyTile == null) { - firstDirtyTile = layer; - } - dirtyTiles++; - } else { - // This tile intersects with the screen and is dirty, - // update it immediately. - screenUpdateDone = true; - layer.performUpdates(context); - } - } - - // 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.performUpdates(context); - dirtyTiles--; - } - - } - - private void refreshTileMetrics(Point origin, float resolution, boolean inTransaction) { - for (SubTile layer : mTiles) { - if (!inTransaction) { - layer.beginTransaction(); - } - - if (origin != null) { - Rect position = layer.getPosition(); - float positionX = origin.x + (layer.x / layer.zoom); - float positionY = origin.y + (layer.y / layer.zoom); - float tileSize = TILE_SIZE / layer.zoom; - position.set((int) positionX, (int) positionY, (int) (positionX + tileSize + 1), (int) (positionY + tileSize + 1)); - layer.setPosition(position); - } - if (resolution >= 0.0f) { - layer.setResolution(resolution); - } - - if (!inTransaction) { - layer.endTransaction(); - } - } - } - - @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(); - } - - private RectF roundToTileSize(RectF input, int tileSize) { - float minX = (Math.round(input.left) / tileSize) * tileSize; - float minY = (Math.round(input.top) / tileSize) * tileSize; - float maxX = ((Math.round(input.right) / tileSize) + 1) * tileSize; - float maxY = ((Math.round(input.bottom) / tileSize) + 1) * tileSize; - return new RectF(minX, minY, maxX, maxY); - } - - private RectF inflate(RectF rect, float inflateSize) { - RectF newRect = new RectF(rect); - newRect.left -= inflateSize; - newRect.left = newRect.left < 0.0f ? 0.0f : newRect.left; - - newRect.top -= inflateSize; - newRect.top = newRect.top < 0.0f ? 0.0f : newRect.top; - - newRect.right += inflateSize; - newRect.bottom += inflateSize; - - return newRect; - } - - @Override - public void draw(RenderContext context) { - for (SubTile layer : mTiles) { - // Avoid work, only draw tiles that intersect with the viewport - RectF layerBounds = layer.getBounds(context); - - if (RectF.intersects(layerBounds, context.viewport)) { - layer.draw(context); - } - } - } - - @Override - public Region getValidRegion(RenderContext context) { - Region validRegion = new Region(); - for (SubTile tile : mTiles) { - validRegion.op(tile.getValidRegion(context), Region.Op.UNION); - } - - return validRegion; - } - - public void setTileProvider(TileProvider tileProvider) { - this.tileProvider = tileProvider; - } - - public void reevaluateTiles(ImmutableViewportMetrics viewportMetrics) { - RectF newCurrentViewPort = inflate(roundToTileSize(viewportMetrics.getViewport(), TILE_SIZE), TILE_SIZE); - - if (currentViewPort != newCurrentViewPort) { - currentViewPort = newCurrentViewPort; - clearMarkedTiles(); - addNewTiles(viewportMetrics); - markTiles(viewportMetrics); - } - } - - private void clearMarkedTiles() { - List<SubTile> tilesToRemove = new ArrayList<SubTile>(); - for(SubTile tile : mTiles) { - if (tile.markedForRemoval) { - tile.destroy(); - tilesToRemove.add(tile); - } - } - mTiles.removeAll(tilesToRemove); - } - - private void addNewTiles(ImmutableViewportMetrics viewportMetrics) { - for (float y = currentViewPort.top; y < currentViewPort.bottom; y += TILE_SIZE) { - if (y > viewportMetrics.getPageHeight()) { - continue; - } - for (float x = currentViewPort.left; x < currentViewPort.right; x += TILE_SIZE) { - if (x > viewportMetrics.getPageWidth()) { - continue; - } - boolean contains = false; - for (SubTile tile : mTiles) { - if (tile.x == x && tile.y == y && tile.zoom == viewportMetrics.zoomFactor) { - contains = true; - } - } - if (!contains) { - CairoImage image = tileProvider.createTile(x, y, new FloatSize(TILE_SIZE, TILE_SIZE), viewportMetrics.zoomFactor); - SubTile tile = new SubTile(image, (int)x, (int)y, viewportMetrics.zoomFactor); - tile.beginTransaction(); - mTiles.add(tile); - } - } - } - } - - private void markTiles(ImmutableViewportMetrics viewportMetrics) { - for (SubTile tile : mTiles) { - if (FloatUtils.fuzzyEquals(tile.zoom, viewportMetrics.zoomFactor)) { - RectF tileRect = new RectF(tile.x, tile.y, tile.x + TILE_SIZE, tile.y + TILE_SIZE); - if (!RectF.intersects(currentViewPort, tileRect)) { - tile.markForRemoval(); - } - } else { - tile.markForRemoval(); - } - } - } - - public void clearAllTiles() { - mTiles.clear(); - } -} - commit 0ed2093513af5140b1be613dad538ac94caf78b0 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.com> Date: Wed Oct 1 13:48:55 2014 +0200 android: remove some unneeded logging in GeckoLayerClient Change-Id: Ib53aae87e7fa510c3783a86a7512c25548457fd4 diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/GeckoLayerClient.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/GeckoLayerClient.java index f2b2793..9c3a893 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/GeckoLayerClient.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/GeckoLayerClient.java @@ -40,7 +40,6 @@ package org.mozilla.gecko.gfx; import android.content.Context; import android.graphics.RectF; -import android.os.SystemClock; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; @@ -120,7 +119,6 @@ public class GeckoLayerClient implements LayerView.Listener { mRootLayer.endTransaction(); } } - Log.i(LOGTAG, "zerdatime " + SystemClock.uptimeMillis() + " - endDrawing"); } protected void updateViewport(boolean onlyUpdatePageSize) { @@ -135,8 +133,6 @@ public class GeckoLayerClient implements LayerView.Listener { mRootLayer.setPosition(RectUtils.round(position)); mRootLayer.setResolution(mGeckoViewport.zoomFactor); - Log.e(LOGTAG, "### updateViewport onlyUpdatePageSize=" + onlyUpdatePageSize + " getTileViewport " + mGeckoViewport); - if (onlyUpdatePageSize) { // Don't adjust page size when zooming unless zoom levels are // approximately equal. commit be1a199669ef4f898c70ba78188e8cf086be74c7 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.com> Date: Wed Oct 1 13:43:29 2014 +0200 android: add tileSize parameter to TileProvider Change-Id: I607dbaa897b17f5b650f10293956c8154da6f43d diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java index 8050863..073876e 100644 --- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java +++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java @@ -8,6 +8,7 @@ import org.libreoffice.kit.LibreOfficeKit; import org.libreoffice.kit.Office; import org.mozilla.gecko.gfx.BufferedCairoImage; import org.mozilla.gecko.gfx.CairoImage; +import org.mozilla.gecko.gfx.FloatSize; import org.mozilla.gecko.gfx.LayerController; import java.nio.ByteBuffer; @@ -131,7 +132,7 @@ public class LOKitTileProvider implements TileProvider { } @Override - public CairoImage createTile(float x, float y, float zoom) { + public CairoImage createTile(float x, float y, FloatSize tileSize, float zoom) { ByteBuffer buffer = ByteBuffer.allocateDirect(TILE_SIZE * TILE_SIZE * 4); Bitmap bitmap = Bitmap.createBitmap(TILE_SIZE, TILE_SIZE, Bitmap.Config.ARGB_8888); diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/MockTileProvider.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/MockTileProvider.java index 2d81d3e..672973c 100644 --- a/android/experimental/LOAndroid3/src/java/org/libreoffice/MockTileProvider.java +++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/MockTileProvider.java @@ -4,6 +4,7 @@ import android.graphics.Bitmap; import org.mozilla.gecko.gfx.BufferedCairoImage; import org.mozilla.gecko.gfx.CairoImage; +import org.mozilla.gecko.gfx.FloatSize; import org.mozilla.gecko.gfx.LayerController; public class MockTileProvider implements TileProvider { @@ -35,7 +36,7 @@ public class MockTileProvider implements TileProvider { @Override public int getPageHeight() { - return 630*5; + return 630 * 5; } @Override @@ -44,7 +45,7 @@ public class MockTileProvider implements TileProvider { } @Override - public CairoImage createTile(float x, float y, float zoom) { + public CairoImage createTile(float x, float y, FloatSize tileSize, float zoom) { int tiles = (int) (getPageWidth() / TILE_SIZE) + 1; int tileNumber = (int) ((y / TILE_SIZE) * tiles + (x / TILE_SIZE)); tileNumber %= 9; diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/TileProvider.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/TileProvider.java index 8373ad8..ada2360 100644 --- a/android/experimental/LOAndroid3/src/java/org/libreoffice/TileProvider.java +++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/TileProvider.java @@ -4,6 +4,7 @@ package org.libreoffice; import android.graphics.Bitmap; import org.mozilla.gecko.gfx.CairoImage; +import org.mozilla.gecko.gfx.FloatSize; public interface TileProvider { int getPageWidth(); @@ -12,7 +13,7 @@ public interface TileProvider { boolean isReady(); - CairoImage createTile(float x, float y, float zoom); + CairoImage createTile(float x, float y, FloatSize tileSize, float zoom); void changePart(int partIndex); diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/MultiTileLayer.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/MultiTileLayer.java index eb1ab5c..7d1306e 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/MultiTileLayer.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/MultiTileLayer.java @@ -56,11 +56,7 @@ public class MultiTileLayer extends Layer { private static int TILE_SIZE = 256; private final List<SubTile> mTiles = new CopyOnWriteArrayList<SubTile>(); private TileProvider tileProvider; - private RectF tileViewPort = new RectF(); - - public MultiTileLayer() { - super(); - } + private RectF currentViewPort = new RectF(); public void invalidate() { for (SubTile layer : mTiles) { @@ -211,10 +207,10 @@ public class MultiTileLayer extends Layer { } public void reevaluateTiles(ImmutableViewportMetrics viewportMetrics) { - RectF newTileViewPort = inflate(roundToTileSize(viewportMetrics.getViewport(), TILE_SIZE), TILE_SIZE); + RectF newCurrentViewPort = inflate(roundToTileSize(viewportMetrics.getViewport(), TILE_SIZE), TILE_SIZE); - if (tileViewPort != newTileViewPort) { - tileViewPort = newTileViewPort; + if (currentViewPort != newCurrentViewPort) { + currentViewPort = newCurrentViewPort; clearMarkedTiles(); addNewTiles(viewportMetrics); markTiles(viewportMetrics); @@ -233,11 +229,11 @@ public class MultiTileLayer extends Layer { } private void addNewTiles(ImmutableViewportMetrics viewportMetrics) { - for (float y = tileViewPort.top; y < tileViewPort.bottom; y += TILE_SIZE) { + for (float y = currentViewPort.top; y < currentViewPort.bottom; y += TILE_SIZE) { if (y > viewportMetrics.getPageHeight()) { continue; } - for (float x = tileViewPort.left; x < tileViewPort.right; x += TILE_SIZE) { + for (float x = currentViewPort.left; x < currentViewPort.right; x += TILE_SIZE) { if (x > viewportMetrics.getPageWidth()) { continue; } @@ -248,7 +244,7 @@ public class MultiTileLayer extends Layer { } } if (!contains) { - CairoImage image = tileProvider.createTile(x, y, viewportMetrics.zoomFactor); + CairoImage image = tileProvider.createTile(x, y, new FloatSize(TILE_SIZE, TILE_SIZE), viewportMetrics.zoomFactor); SubTile tile = new SubTile(image, (int)x, (int)y, viewportMetrics.zoomFactor); tile.beginTransaction(); mTiles.add(tile); @@ -261,7 +257,7 @@ public class MultiTileLayer extends Layer { for (SubTile tile : mTiles) { if (FloatUtils.fuzzyEquals(tile.zoom, viewportMetrics.zoomFactor)) { RectF tileRect = new RectF(tile.x, tile.y, tile.x + TILE_SIZE, tile.y + TILE_SIZE); - if (!RectF.intersects(tileViewPort, tileRect)) { + if (!RectF.intersects(currentViewPort, tileRect)) { tile.markForRemoval(); } } else { commit d3a0b61765c735675a5698e86933b365a6b1d8f6 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.com> Date: Wed Oct 1 13:37:34 2014 +0200 android: remove duplicate progress bar declaration Change-Id: Ie0a463bf5f006ce5d340e085bd6962b728d29c35 diff --git a/android/experimental/LOAndroid3/res/layout/activity_main.xml b/android/experimental/LOAndroid3/res/layout/activity_main.xml index 799f591..9ada4d3 100644 --- a/android/experimental/LOAndroid3/res/layout/activity_main.xml +++ b/android/experimental/LOAndroid3/res/layout/activity_main.xml @@ -44,16 +44,4 @@ android:background="#9FFF" android:choiceMode="singleChoice"/> - <RelativeLayout - android:id="@+id/loadingPanel" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="center" > - - <ProgressBar - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:indeterminate="true" /> - </RelativeLayout> - </android.support.v4.widget.DrawerLayout>
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits