[Libreoffice-commits] core.git: Branch 'feature/droid_calcimpress3' - 7 commits - android/experimental
Tomaž Vajngerl
tomaz.vajngerl at collabora.com
Wed Oct 1 04:54:16 PDT 2014
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.vajngerl at 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.vajngerl at 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.vajngerl at 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.vajngerl at 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.net at gmail.com>
-* Arkady Blyakher <rkadyb at 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.vajngerl at 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.vajngerl at 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.vajngerl at 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>
More information about the Libreoffice-commits
mailing list