[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