[Libreoffice-commits] core.git: 5 commits - android/Bootstrap android/experimental

Tomaž Vajngerl tomaz.vajngerl at collabora.com
Thu Dec 11 14:11:30 PST 2014


 android/Bootstrap/src/org/libreoffice/kit/DirectBufferAllocator.java                   |    1 
 android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java                  |   35 -
 android/experimental/LOAndroid3/src/java/org/libreoffice/LOEventFactory.java           |   16 
 android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java              |   42 --
 android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java        |    4 
 android/experimental/LOAndroid3/src/java/org/libreoffice/TileIdentifier.java           |    6 
 android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/ComposedTileLayer.java  |  207 +++++++++
 android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/DynamicTileLayer.java   |  208 ----------
 android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/FixedZoomTileLayer.java |   13 
 android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/GeckoLayerClient.java   |   31 -
 android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/LayerRenderer.java      |    8 
 android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/SubTile.java            |   12 
 12 files changed, 292 insertions(+), 291 deletions(-)

New commits:
commit 842848cb6d6c88fcf2c2b17d5e933458fa5d2ece
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Thu Dec 11 23:05:00 2014 +0100

    fdo#87098 change zoom level tile layer zoom level on load
    
    This patch sets the zoom level to a value that shows the whole
    document width on the tile layer however it does not resize the
    view until next zoom. This still needs to be tracked down.
    
    Change-Id: I16940a2951e1be4b46cbd1870fda45f296aff70a

diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
index 8876c13..2b6c4cd 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
@@ -41,13 +41,9 @@ public class LOKitThread extends Thread {
             return;
         }
 
-        RectF rect = new RectF(0, 0, mTileProvider.getPageWidth(), mTileProvider.getPageHeight());
-        DisplayMetrics displayMetrics = LibreOfficeMainActivity.mAppContext.getResources().getDisplayMetrics();
-        mViewportMetrics = new ImmutableViewportMetrics(displayMetrics);
-        mViewportMetrics = mViewportMetrics.setPageRect(rect, rect);
-
         mLayerClient.setPageRect(0, 0, mTileProvider.getPageWidth(), mTileProvider.getPageHeight());
-        mLayerClient.setViewportMetrics(mLayerClient.getViewportMetrics());
+        mViewportMetrics = mLayerClient.getViewportMetrics();
+        mLayerClient.setViewportMetrics(mViewportMetrics.setZoomFactor(mViewportMetrics.getWidth() / mViewportMetrics.getPageWidth()));
         mLayerClient.forceRedraw();
     }
 
commit 83cd0040fa9bc6e63f800c4ca04c18ccfba06e31
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Thu Dec 11 23:03:00 2014 +0100

    android: remove unneeded logging and comment tile rendering timing
    
    Change-Id: Ia44efb54cbb0a91ea61cef9e7f250b5105c7ff51

diff --git a/android/Bootstrap/src/org/libreoffice/kit/DirectBufferAllocator.java b/android/Bootstrap/src/org/libreoffice/kit/DirectBufferAllocator.java
index f509030..590adae 100644
--- a/android/Bootstrap/src/org/libreoffice/kit/DirectBufferAllocator.java
+++ b/android/Bootstrap/src/org/libreoffice/kit/DirectBufferAllocator.java
@@ -27,7 +27,6 @@ public final class DirectBufferAllocator {
     private static native void freeDirectBufferNative(ByteBuffer aBuffer);
 
     public static ByteBuffer allocate(int size) {
-        Log.i(LOGTAG, "Allocating size: " + size);
         return allocateVM(size);
     }
 
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
index 425b7cb..8876c13 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
@@ -103,7 +103,6 @@ public class LOKitThread extends Thread {
     }
 
     private void processEvent(LOEvent event) {
-        Log.i(LOGTAG, "processEvent: " + event.getTypeString());
         switch (event.mType) {
             case LOEvent.LOAD:
                 loadDocument(event.mFilename);
@@ -124,7 +123,6 @@ public class LOKitThread extends Thread {
     }
 
     public void queueEvent(LOEvent event) {
-        Log.i(LOGTAG, "Event: " + event.getTypeString());
         mEventQueue.add(event);
     }
 
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java
index 81de8ba..b61c6ca 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java
@@ -190,11 +190,11 @@ public class LOKitTileProvider implements TileProvider {
             float twipHeight = mTileHeight / zoom;
             long start = System.currentTimeMillis() - objectCreationTime;
 
-            Log.i(LOGTAG, "paintTile >> @" + start + " (" + tileSize.width + " " + tileSize.height + " " + (int) twipX + " " + (int) twipY + " " + (int) twipWidth + " " + (int) twipHeight + ")");
+            //Log.i(LOGTAG, "paintTile >> @" + start + " (" + tileSize.width + " " + tileSize.height + " " + (int) twipX + " " + (int) twipY + " " + (int) twipWidth + " " + (int) twipHeight + ")");
             mDocument.paintTile(buffer, tileSize.width, tileSize.height, (int) twipX, (int) twipY, (int) twipWidth, (int) twipHeight);
 
             long stop = System.currentTimeMillis() - objectCreationTime;
-            Log.i(LOGTAG, "paintTile << @" + stop + " elapsed: " + (stop - start));
+            //Log.i(LOGTAG, "paintTile << @" + stop + " elapsed: " + (stop - start));
         } else {
             Log.e(LOGTAG, "Document is null!!");
         }
commit 6721736e8fd9786df3322a693c9de57b2779dc2e
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Tue Dec 9 14:27:13 2014 +0100

    android: Remove unneeded LOEvents
    
    Change-Id: I057db0c3e254a9e9c90dace5551d6de51aff21c1

diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java
index 091a5a13..ade57c7 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java
@@ -1,26 +1,20 @@
 package org.libreoffice;
 
-import android.graphics.Rect;
-
 import org.mozilla.gecko.gfx.ComposedTileLayer;
-import org.mozilla.gecko.gfx.ImmutableViewportMetrics;
 import org.mozilla.gecko.gfx.IntSize;
 
 public class LOEvent {
 
     public static final int SIZE_CHANGED = 1;
     public static final int TILE_SIZE = 2;
-    public static final int VIEWPORT = 3;
-    public static final int DRAW = 4;
-    public static final int CHANGE_PART = 5;
-    public static final int LOAD = 6;
-    public static final int CLOSE = 7;
-    public static final int REDRAW = 8;
-    public static final int TILE_REQUEST = 9;
+    public static final int CHANGE_PART = 3;
+    public static final int LOAD = 4;
+    public static final int CLOSE = 5;
+    public static final int REDRAW = 6;
+    public static final int TILE_REQUEST = 7;
 
     public final int mType;
 
-    public ImmutableViewportMetrics mViewportMetrics;
     public String mTypeString;
     public int mPartIndex;
     public String mFilename;
@@ -54,17 +48,6 @@ public class LOEvent {
         mTypeString = "Tile size";
     }
 
-    public LOEvent(int type, ImmutableViewportMetrics viewportMetrics) {
-        mType = type;
-        mTypeString = "Viewport";
-        mViewportMetrics = viewportMetrics;
-    }
-
-    public LOEvent(int type, Rect rect) {
-        mType = type;
-        mTypeString = "Draw";
-    }
-
     public LOEvent(int type, int partIndex) {
         mType = type;
         mPartIndex = partIndex;
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEventFactory.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEventFactory.java
index 867d0e4..a437203 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEventFactory.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEventFactory.java
@@ -1,17 +1,10 @@
 package org.libreoffice;
 
-import android.graphics.Rect;
-
 import org.mozilla.gecko.gfx.ComposedTileLayer;
-import org.mozilla.gecko.gfx.ImmutableViewportMetrics;
 import org.mozilla.gecko.gfx.IntSize;
 
 
 public class LOEventFactory {
-    public static LOEvent draw(Rect rect) {
-        return new LOEvent(LOEvent.DRAW, rect);
-    }
-
     public static LOEvent sizeChanged(int widthPixels, int heightPixels) {
         return new LOEvent(LOEvent.SIZE_CHANGED, widthPixels, heightPixels);
     }
@@ -20,10 +13,6 @@ public class LOEventFactory {
         return new LOEvent(LOEvent.TILE_SIZE, tileSize);
     }
 
-    public static LOEvent viewport(ImmutableViewportMetrics viewportMetrics) {
-        return new LOEvent(LOEvent.VIEWPORT, viewportMetrics);
-    }
-
     public static LOEvent changePart(int part) {
         return new LOEvent(LOEvent.CHANGE_PART, part);
     }
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
index c9b9304..425b7cb 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
@@ -111,13 +111,6 @@ public class LOKitThread extends Thread {
             case LOEvent.CLOSE:
                 closeDocument();
                 break;
-            case LOEvent.VIEWPORT:
-                mViewportMetrics = event.mViewportMetrics;
-                draw();
-                break;
-            case LOEvent.DRAW:
-                draw();
-                break;
             case LOEvent.SIZE_CHANGED:
                 redraw();
                 break;
commit 7c42247d78f59f99c2616445cb667cbe80e7314b
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Tue Dec 9 14:05:58 2014 +0100

    android: add FixedZoomTileLayer as a low-res layer
    
    Change-Id: I20d6fb3117ac46c8de63708a122253444bca1671

diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/FixedZoomTileLayer.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/FixedZoomTileLayer.java
new file mode 100644
index 0000000..a625868
--- /dev/null
+++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/FixedZoomTileLayer.java
@@ -0,0 +1,13 @@
+package org.mozilla.gecko.gfx;
+
+public class FixedZoomTileLayer extends ComposedTileLayer {
+    @Override
+    protected float getZoom(ImmutableViewportMetrics viewportMetrics) {
+        return 0.5f;
+    }
+
+    @Override
+    public void addTile(SubTile tile) {
+
+    }
+}
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 9d25e45..6efd62d 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
@@ -33,6 +33,7 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
     private boolean mRecordDrawTimes;
     private final DrawTimingQueue mDrawTimingQueue;
 
+    private ComposedTileLayer mLowResLayer;
     private ComposedTileLayer mRootLayer;
 
     /* The Gecko viewport as per the UI thread. Must be touched only on the UI thread.
@@ -111,6 +112,8 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
         mGeckoIsReady = true;
 
         mRootLayer = new DynamicTileLayer();
+        mLowResLayer = new FixedZoomTileLayer();
+
         mLayerRenderer = new LayerRenderer(mView);
 
         mView.setListener(this);
@@ -139,6 +142,10 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
         return mGeckoIsReady ? mRootLayer : null;
     }
 
+    Layer getLowResLayer() {
+        return mGeckoIsReady ? mLowResLayer : null;
+    }
+
     public LayerView getView() {
         return mView;
     }
@@ -281,8 +288,8 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
     }
 
     public void beginDrawing() {
+        mLowResLayer.beginTransaction();
         mRootLayer.beginTransaction();
-
     }
 
     public void endDrawing(ImmutableViewportMetrics viewportMetrics) {
@@ -290,8 +297,10 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
             try {
                 mNewGeckoViewport = viewportMetrics;
                 updateViewport(true);
+                mLowResLayer.invalidate();
                 mRootLayer.invalidate();
             } finally {
+                mLowResLayer.endTransaction();
                 mRootLayer.endTransaction();
             }
         }
@@ -309,6 +318,9 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
         mRootLayer.setPosition(RectUtils.round(position));
         mRootLayer.setResolution(mGeckoViewport.zoomFactor);
 
+        mLowResLayer.setPosition(RectUtils.round(position));
+        mLowResLayer.setResolution(mGeckoViewport.zoomFactor);
+
         if (onlyUpdatePageSize) {
             // Don't adjust page size when zooming unless zoom levels are
             // approximately equal.
@@ -471,10 +483,12 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
 
     /* Root Layer Access */
     public void reevaluateTiles() {
+        mLowResLayer.reevaluateTiles(getViewportMetrics());
         mRootLayer.reevaluateTiles(getViewportMetrics());
     }
 
     public void clearAndResetlayers() {
+        mLowResLayer.clearAndReset();
         mRootLayer.clearAndReset();
     }
 }
\ No newline at end of file
diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/LayerRenderer.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/LayerRenderer.java
index feb9c09..64d3a5d 100644
--- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/LayerRenderer.java
+++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/LayerRenderer.java
@@ -497,6 +497,7 @@ public class LayerRenderer implements GLSurfaceView.Renderer {
             mUpdated = true;
 
             Layer rootLayer = mView.getLayerClient().getRoot();
+            Layer lowResLayer = mView.getLayerClient().getLowResLayer();
 
             if (!mPageContext.fuzzyEquals(mLastPageContext)) {
                 // the viewport or page changed, so show the scrollbars again
@@ -514,6 +515,7 @@ public class LayerRenderer implements GLSurfaceView.Renderer {
 
             /* Update layers. */
             if (rootLayer != null) mUpdated &= rootLayer.update(mPageContext);  // called on compositor thread
+            if (lowResLayer != null) mUpdated &= lowResLayer.update(mPageContext);  // called on compositor thread
             mUpdated &= mBackgroundLayer.update(mScreenContext);    // called on compositor thread
             mUpdated &= mShadowLayer.update(mPageContext);  // called on compositor thread
             mUpdated &= mScreenshotLayer.update(mPageContext);   // called on compositor thread
@@ -609,6 +611,12 @@ public class LayerRenderer implements GLSurfaceView.Renderer {
 
         // Draws the layer the client added to us.
         void drawRootLayer() {
+            Layer lowResLayer = mView.getLayerClient().getLowResLayer();
+            if (lowResLayer == null) {
+                return;
+            }
+            lowResLayer.draw(mPageContext);
+
             Layer rootLayer = mView.getLayerClient().getRoot();
             if (rootLayer == null) {
                 return;
commit 42070ee22821a34e0d64718f4ff813984bdcc409
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Tue Dec 9 13:59:58 2014 +0100

    android: split DynamicTileLayer, reevaluate tiles directly
    
    Split DynamicTileLayer and move most of the implementation into
    ComposedTileLayer except viewport zoom value.
    
    Reevaluate tiles directly in UI thread instead a special call to
    LO thread.
    
    Change-Id: I9a4ce499cf35315cd386956484c2df6d5a5f20cc

diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java
index ad8ed0a..091a5a13 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEvent.java
@@ -2,6 +2,7 @@ package org.libreoffice;
 
 import android.graphics.Rect;
 
+import org.mozilla.gecko.gfx.ComposedTileLayer;
 import org.mozilla.gecko.gfx.ImmutableViewportMetrics;
 import org.mozilla.gecko.gfx.IntSize;
 
@@ -17,12 +18,14 @@ public class LOEvent {
     public static final int REDRAW = 8;
     public static final int TILE_REQUEST = 9;
 
-    public int mType;
+    public final int mType;
+
     public ImmutableViewportMetrics mViewportMetrics;
     public String mTypeString;
     public int mPartIndex;
     public String mFilename;
     public TileIdentifier mTileId;
+    public ComposedTileLayer mComposedTileLayer;
 
     public LOEvent(int type) {
         mType = type;
@@ -33,9 +36,10 @@ public class LOEvent {
         mTypeString = "Size Changed: " + widthPixels + " " + heightPixels;
     }
 
-    public LOEvent(int type, TileIdentifier tileId) {
+    public LOEvent(int type, ComposedTileLayer composedTileLayer, TileIdentifier tileId) {
         mType = type;
         mTypeString = "Tile Request";
+        mComposedTileLayer = composedTileLayer;
         mTileId = tileId;
     }
 
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEventFactory.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEventFactory.java
index ffd440c..867d0e4 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEventFactory.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOEventFactory.java
@@ -2,6 +2,7 @@ package org.libreoffice;
 
 import android.graphics.Rect;
 
+import org.mozilla.gecko.gfx.ComposedTileLayer;
 import org.mozilla.gecko.gfx.ImmutableViewportMetrics;
 import org.mozilla.gecko.gfx.IntSize;
 
@@ -39,7 +40,7 @@ public class LOEventFactory {
         return new LOEvent(LOEvent.REDRAW);
     }
 
-    public static LOEvent tileRequest(TileIdentifier tileRequest) {
-        return new LOEvent(LOEvent.TILE_REQUEST, tileRequest);
+    public static LOEvent tileRequest(ComposedTileLayer composedTileLayer, TileIdentifier tileRequest) {
+        return new LOEvent(LOEvent.TILE_REQUEST, composedTileLayer, tileRequest);
     }
 }
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
index 1b233f0..c9b9304 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
@@ -5,8 +5,11 @@ import android.graphics.RectF;
 import android.util.DisplayMetrics;
 import android.util.Log;
 
+import org.mozilla.gecko.gfx.CairoImage;
+import org.mozilla.gecko.gfx.ComposedTileLayer;
 import org.mozilla.gecko.gfx.GeckoLayerClient;
 import org.mozilla.gecko.gfx.ImmutableViewportMetrics;
+import org.mozilla.gecko.gfx.SubTile;
 
 import java.util.concurrent.LinkedBlockingQueue;
 
@@ -23,22 +26,11 @@ public class LOKitThread extends Thread {
         TileProviderFactory.initialize();
     }
 
-    private void draw() {
-        if (mTileProvider == null || mApplication == null) {
-            // called too early...
-            return;
-        }
-
-        RectF rect = new RectF(0, 0, mTileProvider.getPageWidth(), mTileProvider.getPageHeight());
-        DisplayMetrics displayMetrics = LibreOfficeMainActivity.mAppContext.getResources().getDisplayMetrics();
-        mViewportMetrics = new ImmutableViewportMetrics(displayMetrics);
-        mViewportMetrics = mViewportMetrics.setPageRect(rect, rect);
-        mLayerClient.reevaluateTiles();
-    }
-
-    private void tileRequest(TileIdentifier tileId) {
+    private void tileRequest(ComposedTileLayer composedTileLayer, TileIdentifier tileId) {
         mLayerClient.beginDrawing();
-        mLayerClient.addTile(tileId);
+        CairoImage image = mTileProvider.createTile(tileId.x, tileId.y, tileId.size, tileId.zoom);
+        SubTile tile = new SubTile(image, tileId);
+        composedTileLayer.addTile(tile);
         mLayerClient.endDrawing(mViewportMetrics);
     }
 
@@ -49,14 +41,17 @@ public class LOKitThread extends Thread {
             return;
         }
 
-        draw();
+        RectF rect = new RectF(0, 0, mTileProvider.getPageWidth(), mTileProvider.getPageHeight());
+        DisplayMetrics displayMetrics = LibreOfficeMainActivity.mAppContext.getResources().getDisplayMetrics();
+        mViewportMetrics = new ImmutableViewportMetrics(displayMetrics);
+        mViewportMetrics = mViewportMetrics.setPageRect(rect, rect);
 
         mLayerClient.setPageRect(0, 0, mTileProvider.getPageWidth(), mTileProvider.getPageHeight());
         mLayerClient.setViewportMetrics(mLayerClient.getViewportMetrics());
         mLayerClient.forceRedraw();
     }
 
-    /** Invalidate everything + handle the geometry change + draw. */
+    /** Invalidate everything + handle the geometry change */
     private void refresh() {
         Bitmap bitmap = mTileProvider.thumbnail(1000);
         if (bitmap != null) {
@@ -84,8 +79,6 @@ public class LOKitThread extends Thread {
         mTileProvider = TileProviderFactory.create(mLayerClient, filename);
         boolean isReady = mTileProvider.isReady();
         if (isReady) {
-            mLayerClient.setTileProvider(mTileProvider);
-
             LOKitShell.showProgressSpinner();
             refresh();
             LOKitShell.hideProgressSpinner();
@@ -132,7 +125,7 @@ public class LOKitThread extends Thread {
                 changePart(event.mPartIndex);
                 break;
             case LOEvent.TILE_REQUEST:
-                tileRequest(event.mTileId);
+                tileRequest(event.mComposedTileLayer, event.mTileId);
                 break;
         }
     }
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/TileIdentifier.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/TileIdentifier.java
index 050ff1c..f617b70 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/TileIdentifier.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/TileIdentifier.java
@@ -1,14 +1,18 @@
 package org.libreoffice;
 
+import org.mozilla.gecko.gfx.IntSize;
+
 public class TileIdentifier {
     public final int x;
     public final int y;
     public final float zoom;
+    public final IntSize size;
 
-    public TileIdentifier(int x, int y, float zoom) {
+    public TileIdentifier(int x, int y, float zoom, IntSize size) {
         this.x = x;
         this.y = y;
         this.zoom = zoom;
+        this.size = size;
     }
 
     @Override
diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/ComposedTileLayer.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/ComposedTileLayer.java
new file mode 100644
index 0000000..9594285
--- /dev/null
+++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/ComposedTileLayer.java
@@ -0,0 +1,207 @@
+package org.mozilla.gecko.gfx;
+
+import android.graphics.RectF;
+import android.graphics.Region;
+import android.util.Log;
+
+import org.libreoffice.LOEventFactory;
+import org.libreoffice.LOKitShell;
+import org.libreoffice.TileIdentifier;
+import org.mozilla.gecko.util.FloatUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+public abstract class ComposedTileLayer extends Layer {
+    private static final String LOGTAG = ComposedTileLayer.class.getSimpleName();
+
+    protected final List<SubTile> tiles = new CopyOnWriteArrayList<SubTile>();
+
+    protected final IntSize tileSize;
+    protected RectF currentViewport = new RectF();
+    protected float currentZoom;
+
+    public ComposedTileLayer() {
+        this.tileSize = new IntSize(256, 256);
+    }
+
+    public ComposedTileLayer(IntSize tileSize) {
+        this.tileSize = tileSize;
+    }
+
+    public void invalidate() {
+        for (SubTile tile : tiles) {
+            tile.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);
+
+        for (SubTile tile : tiles) {
+            tile.beginTransaction();
+            tile.refreshTileMetrics();
+            tile.endTransaction();
+            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 RectF roundToTileSize(RectF input, IntSize 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, IntSize 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;
+    }
+
+    private RectF normalizeRect(RectF rect, float factor) {
+        RectF normalizedRect = new RectF(
+                rect.left / factor,
+                rect.top / factor,
+                rect.right / factor,
+                rect.bottom / factor);
+
+        return normalizedRect;
+    }
+
+    public void reevaluateTiles(ImmutableViewportMetrics viewportMetrics) {
+        RectF newCurrentViewPort = inflate(roundToTileSize(viewportMetrics.getViewport(), tileSize), tileSize);
+        float newZoom = viewportMetrics.zoomFactor;
+
+        if (!currentViewport.equals(newCurrentViewPort) || currentZoom != newZoom) {
+            currentViewport = newCurrentViewPort;
+            currentZoom = newZoom;
+
+            RectF normalizedRect = normalizeRect(currentViewport, currentZoom);
+            RectF normalizedPageRect = normalizeRect(viewportMetrics.getPageRect(), currentZoom);
+
+            Log.i(LOGTAG, "reevaluateTiles " + normalizedRect + " " + normalizedPageRect);
+
+            clearMarkedTiles();
+            addNewTiles(viewportMetrics);
+            markTiles(viewportMetrics);
+        }
+    }
+
+    private void addNewTiles(ImmutableViewportMetrics viewportMetrics) {
+        float zoom = getZoom(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.id.x == x && tile.id.y == y && tile.id.zoom == zoom) {
+                        contains = true;
+                    }
+                }
+                if (!contains) {
+                    LOKitShell.sendEvent(LOEventFactory.tileRequest(this, new TileIdentifier((int) x, (int) y, zoom, tileSize)));
+                }
+            }
+        }
+    }
+
+    protected abstract float getZoom(ImmutableViewportMetrics viewportMetrics);
+
+    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) {
+        float zoom = getZoom(viewportMetrics);
+        for (SubTile tile : tiles) {
+            if (FloatUtils.fuzzyEquals(tile.id.zoom, zoom)) {
+                RectF tileRect = new RectF(tile.id.x, tile.id.y, tile.id.x + tileSize.width, tile.id.y + tileSize.height);
+                if (!RectF.intersects(currentViewport, tileRect)) {
+                    tile.markForRemoval();
+                    Log.i(LOGTAG, "Mark for remove - " + currentViewport + " " + tileRect);
+                }
+            } else {
+                Log.i(LOGTAG, "Mark for remove - " + tile.id.zoom + " " + zoom);
+                tile.markForRemoval();
+            }
+        }
+    }
+
+    public void clearAndReset() {
+        tiles.clear();
+        currentViewport = new RectF();
+    }
+
+    public void addTile(SubTile tile) {
+        tile.beginTransaction();
+        tiles.add(tile);
+    }
+}
\ No newline at end of file
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
index 276ba94..ec3e39a 100644
--- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/DynamicTileLayer.java
+++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/DynamicTileLayer.java
@@ -1,210 +1,8 @@
 package org.mozilla.gecko.gfx;
 
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.Region;
-import android.util.Log;
-
-import org.libreoffice.LOEventFactory;
-import org.libreoffice.LOKitShell;
-import org.libreoffice.TileIdentifier;
-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 IntSize tileSize;
-    private RectF currentViewport = new RectF();
-
-    public DynamicTileLayer() {
-        this.tileSize = new IntSize(256, 256);
-    }
-
-    public DynamicTileLayer(IntSize tileSize) {
-        this.tileSize = tileSize;
-    }
-
-    public void setTileProvider(TileProvider tileProvider) {
-        this.tileProvider = tileProvider;
-    }
-
-    public void invalidate() {
-        for (SubTile tile : tiles) {
-            tile.invalidate();
-        }
-    }
-
+public class DynamicTileLayer extends ComposedTileLayer {
     @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.id.x / tile.id.zoom;
-            float positionY = tile.id.y / tile.id.zoom;
-            float tileSizeWidth = tileSize.width / tile.id.zoom;
-            float tileSizeHeight = tileSize.height / tile.id.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, IntSize 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, IntSize 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) {
-        if (tileProvider == null) {
-            return;
-        }
-
-        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.id.x == x && tile.id.y == y && tile.id.zoom == viewportMetrics.zoomFactor) {
-                        contains = true;
-                    }
-                }
-                if (!contains) {
-                    LOKitShell.sendEvent(LOEventFactory.tileRequest(new TileIdentifier((int)x, (int)y, viewportMetrics.zoomFactor)));
-                }
-            }
-        }
-    }
-
-    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.id.zoom, viewportMetrics.zoomFactor)) {
-                RectF tileRect = new RectF(tile.id.x, tile.id.y, tile.id.x + tileSize.width, tile.id.y + tileSize.height);
-                if (!RectF.intersects(currentViewport, tileRect)) {
-                    tile.markForRemoval();
-                }
-            } else {
-                tile.markForRemoval();
-            }
-        }
-    }
-
-    public void clearAndReset() {
-        tiles.clear();
-        currentViewport = new RectF();
-    }
-
-    public void addTile(TileIdentifier tileId) {
-        CairoImage image = tileProvider.createTile(tileId.x, tileId.y, tileSize, tileId.zoom);
-        SubTile tile = new SubTile(image, tileId);
-        tile.beginTransaction();
-        tiles.add(tile);
+    protected float getZoom(ImmutableViewportMetrics viewportMetrics) {
+        return viewportMetrics.zoomFactor;
     }
 }
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 d195249..9d25e45 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
@@ -15,8 +15,6 @@ import android.util.Log;
 import org.libreoffice.LOEvent;
 import org.libreoffice.LOEventFactory;
 import org.libreoffice.LOKitShell;
-import org.libreoffice.TileIdentifier;
-import org.libreoffice.TileProvider;
 import org.mozilla.gecko.ZoomConstraints;
 import org.mozilla.gecko.util.FloatUtils;
 
@@ -35,7 +33,7 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
     private boolean mRecordDrawTimes;
     private final DrawTimingQueue mDrawTimingQueue;
 
-    private DynamicTileLayer mRootLayer;
+    private ComposedTileLayer mRootLayer;
 
     /* The Gecko viewport as per the UI thread. Must be touched only on the UI thread.
      * If any events being sent to Gecko that are relative to the Gecko viewport position,
@@ -228,7 +226,7 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
             mDrawTimingQueue.add(displayPort);
         }
 
-        LOKitShell.sendEvent(LOEventFactory.viewport(clampedMetrics));
+        reevaluateTiles();
     }
 
     /**
@@ -472,10 +470,6 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
     }
 
     /* Root Layer Access */
-    public void setTileProvider(TileProvider tileProvider) {
-        mRootLayer.setTileProvider(tileProvider);
-    }
-
     public void reevaluateTiles() {
         mRootLayer.reevaluateTiles(getViewportMetrics());
     }
@@ -483,9 +477,4 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
     public void clearAndResetlayers() {
         mRootLayer.clearAndReset();
     }
-
-    public void addTile(TileIdentifier tileId) {
-        mRootLayer.addTile(tileId);
-    }
-
 }
\ No newline at end of file
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 3c90501..d76bc54 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
@@ -5,6 +5,8 @@
 
 package org.mozilla.gecko.gfx;
 
+import android.graphics.Rect;
+
 import org.libreoffice.TileIdentifier;
 
 public class SubTile extends SingleTileLayer {
@@ -16,6 +18,16 @@ public class SubTile extends SingleTileLayer {
         this.id = id;
     }
 
+    public void refreshTileMetrics() {
+        Rect position = getPosition();
+        float positionX = id.x / id.zoom;
+        float positionY = id.y / id.zoom;
+        float tileSizeWidth = id.size.width / id.zoom;
+        float tileSizeHeight = id.size.height / id.zoom;
+        position.set((int) positionX, (int) positionY, (int) (positionX + tileSizeWidth), (int) (positionY + tileSizeHeight));
+        setPosition(position);
+    }
+
     public void markForRemoval() {
         markedForRemoval = true;
     }


More information about the Libreoffice-commits mailing list