[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