Kaydet (Commit) a9c434a2 authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl

fdo#85845 android: draw tiles immediately when they are ready

Change-Id: I924a212210703b0f6136ddefacd77d98dc89f42d
üst b861c1cc
...@@ -15,12 +15,14 @@ public class LOEvent { ...@@ -15,12 +15,14 @@ public class LOEvent {
public static final int LOAD = 6; public static final int LOAD = 6;
public static final int CLOSE = 7; public static final int CLOSE = 7;
public static final int REDRAW = 8; public static final int REDRAW = 8;
public static final int TILE_REQUEST = 9;
public int mType; public int mType;
private ImmutableViewportMetrics mViewportMetrics; public ImmutableViewportMetrics mViewportMetrics;
private String mTypeString; public String mTypeString;
private int mPartIndex; public int mPartIndex;
private String mFilename; public String mFilename;
public TileIdentifier mTileId;
public LOEvent(int type) { public LOEvent(int type) {
mType = type; mType = type;
...@@ -31,8 +33,15 @@ public class LOEvent { ...@@ -31,8 +33,15 @@ public class LOEvent {
mTypeString = "Size Changed: " + widthPixels + " " + heightPixels; mTypeString = "Size Changed: " + widthPixels + " " + heightPixels;
} }
public LOEvent(int type, TileIdentifier tileId) {
mType = type;
mTypeString = "Tile Request";
mTileId = tileId;
}
public LOEvent(int type, String filename) { public LOEvent(int type, String filename) {
mType = type; mType = type;
mTypeString = "Filename";
mFilename = filename; mFilename = filename;
} }
...@@ -64,16 +73,4 @@ public class LOEvent { ...@@ -64,16 +73,4 @@ public class LOEvent {
} }
return mTypeString; return mTypeString;
} }
public ImmutableViewportMetrics getViewport() {
return mViewportMetrics;
}
public int getPartIndex() {
return mPartIndex;
}
public String getFilename() {
return mFilename;
}
} }
...@@ -38,4 +38,8 @@ public class LOEventFactory { ...@@ -38,4 +38,8 @@ public class LOEventFactory {
public static LOEvent redraw() { public static LOEvent redraw() {
return new LOEvent(LOEvent.REDRAW); return new LOEvent(LOEvent.REDRAW);
} }
public static LOEvent tileRequest(TileIdentifier tileRequest) {
return new LOEvent(LOEvent.TILE_REQUEST, tileRequest);
}
} }
...@@ -6,7 +6,7 @@ import android.util.DisplayMetrics; ...@@ -6,7 +6,7 @@ import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import org.mozilla.gecko.gfx.GeckoLayerClient; import org.mozilla.gecko.gfx.GeckoLayerClient;
import org.mozilla.gecko.gfx.ImmutableViewportMetrics;; import org.mozilla.gecko.gfx.ImmutableViewportMetrics;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
...@@ -33,16 +33,17 @@ public class LOKitThread extends Thread { ...@@ -33,16 +33,17 @@ public class LOKitThread extends Thread {
DisplayMetrics displayMetrics = LibreOfficeMainActivity.mAppContext.getResources().getDisplayMetrics(); DisplayMetrics displayMetrics = LibreOfficeMainActivity.mAppContext.getResources().getDisplayMetrics();
mViewportMetrics = new ImmutableViewportMetrics(displayMetrics); mViewportMetrics = new ImmutableViewportMetrics(displayMetrics);
mViewportMetrics = mViewportMetrics.setPageRect(rect, rect); mViewportMetrics = mViewportMetrics.setPageRect(rect, rect);
mLayerClient.reevaluateTiles();
GeckoLayerClient layerClient = mApplication.getLayerClient();
layerClient.beginDrawing();
layerClient.reevaluateTiles();
layerClient.endDrawing(mViewportMetrics);
return true; return true;
} }
private void tileRequest(TileIdentifier tileId) {
mLayerClient.beginDrawing();
mLayerClient.addTile(tileId);
mLayerClient.endDrawing(mViewportMetrics);
}
/** Handle the geometry change + draw. */ /** Handle the geometry change + draw. */
private void redraw() { private void redraw() {
if (mLayerClient == null || mTileProvider == null) { if (mLayerClient == null || mTileProvider == null) {
...@@ -114,13 +115,13 @@ public class LOKitThread extends Thread { ...@@ -114,13 +115,13 @@ public class LOKitThread extends Thread {
Log.i(LOGTAG, "processEvent: " + event.getTypeString()); Log.i(LOGTAG, "processEvent: " + event.getTypeString());
switch (event.mType) { switch (event.mType) {
case LOEvent.LOAD: case LOEvent.LOAD:
loadDocument(event.getFilename()); loadDocument(event.mFilename);
break; break;
case LOEvent.CLOSE: case LOEvent.CLOSE:
closeDocument(); closeDocument();
break; break;
case LOEvent.VIEWPORT: case LOEvent.VIEWPORT:
mViewportMetrics = event.getViewport(); mViewportMetrics = event.mViewportMetrics;
draw(); draw();
break; break;
case LOEvent.DRAW: case LOEvent.DRAW:
...@@ -130,7 +131,10 @@ public class LOKitThread extends Thread { ...@@ -130,7 +131,10 @@ public class LOKitThread extends Thread {
redraw(); redraw();
break; break;
case LOEvent.CHANGE_PART: case LOEvent.CHANGE_PART:
changePart(event.getPartIndex()); changePart(event.mPartIndex);
break;
case LOEvent.TILE_REQUEST:
tileRequest(event.mTileId);
break; break;
} }
} }
......
package org.libreoffice;
public class TileIdentifier {
public final int x;
public final int y;
public final float zoom;
public TileIdentifier(int x, int y, float zoom) {
this.x = x;
this.y = y;
this.zoom = zoom;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TileIdentifier that = (TileIdentifier) o;
if (x != that.x) return false;
if (y != that.y) return false;
if (Float.compare(that.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;
}
}
\ No newline at end of file
...@@ -5,6 +5,9 @@ import android.graphics.RectF; ...@@ -5,6 +5,9 @@ import android.graphics.RectF;
import android.graphics.Region; import android.graphics.Region;
import android.util.Log; import android.util.Log;
import org.libreoffice.LOEventFactory;
import org.libreoffice.LOKitShell;
import org.libreoffice.TileIdentifier;
import org.libreoffice.TileProvider; import org.libreoffice.TileProvider;
import org.mozilla.gecko.util.FloatUtils; import org.mozilla.gecko.util.FloatUtils;
...@@ -16,6 +19,7 @@ public class DynamicTileLayer extends Layer { ...@@ -16,6 +19,7 @@ public class DynamicTileLayer extends Layer {
private static final String LOGTAG = DynamicTileLayer.class.getSimpleName(); private static final String LOGTAG = DynamicTileLayer.class.getSimpleName();
private final List<SubTile> tiles = new CopyOnWriteArrayList<SubTile>(); private final List<SubTile> tiles = new CopyOnWriteArrayList<SubTile>();
private TileProvider tileProvider; private TileProvider tileProvider;
private final IntSize tileSize; private final IntSize tileSize;
private RectF currentViewport = new RectF(); private RectF currentViewport = new RectF();
...@@ -33,8 +37,8 @@ public class DynamicTileLayer extends Layer { ...@@ -33,8 +37,8 @@ public class DynamicTileLayer extends Layer {
} }
public void invalidate() { public void invalidate() {
for (SubTile layer : tiles) { for (SubTile tile : tiles) {
layer.invalidate(); tile.invalidate();
} }
} }
...@@ -162,10 +166,7 @@ public class DynamicTileLayer extends Layer { ...@@ -162,10 +166,7 @@ public class DynamicTileLayer extends Layer {
} }
} }
if (!contains) { if (!contains) {
CairoImage image = tileProvider.createTile(x, y, tileSize, viewportMetrics.zoomFactor); LOKitShell.sendEvent(LOEventFactory.tileRequest(new TileIdentifier((int)x, (int)y, viewportMetrics.zoomFactor)));
SubTile tile = new SubTile(image, (int) x, (int) y, viewportMetrics.zoomFactor);
tile.beginTransaction();
tiles.add(tile);
} }
} }
} }
...@@ -199,4 +200,11 @@ public class DynamicTileLayer extends Layer { ...@@ -199,4 +200,11 @@ public class DynamicTileLayer extends Layer {
tiles.clear(); tiles.clear();
currentViewport = new RectF(); 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);
}
} }
...@@ -16,6 +16,7 @@ import android.view.GestureDetector; ...@@ -16,6 +16,7 @@ import android.view.GestureDetector;
import org.libreoffice.LOEvent; import org.libreoffice.LOEvent;
import org.libreoffice.LOEventFactory; import org.libreoffice.LOEventFactory;
import org.libreoffice.LOKitShell; import org.libreoffice.LOKitShell;
import org.libreoffice.TileIdentifier;
import org.libreoffice.TileProvider; import org.libreoffice.TileProvider;
import org.mozilla.gecko.ZoomConstraints; import org.mozilla.gecko.ZoomConstraints;
import org.mozilla.gecko.ui.PanZoomController; import org.mozilla.gecko.ui.PanZoomController;
...@@ -478,6 +479,7 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener { ...@@ -478,6 +479,7 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
public GestureDetector.OnDoubleTapListener getDoubleTapListener() { public GestureDetector.OnDoubleTapListener getDoubleTapListener() {
return mPanZoomController; return mPanZoomController;
} }
private class AdjustRunnable implements Runnable { private class AdjustRunnable implements Runnable {
public void run() { public void run() {
mPendingViewportAdjust = false; mPendingViewportAdjust = false;
...@@ -498,4 +500,8 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener { ...@@ -498,4 +500,8 @@ public class GeckoLayerClient implements PanZoomTarget, LayerView.Listener {
mRootLayer.clearAndReset(); mRootLayer.clearAndReset();
} }
public void addTile(TileIdentifier tileId) {
mRootLayer.addTile(tileId);
}
} }
\ No newline at end of file
...@@ -5,50 +5,18 @@ ...@@ -5,50 +5,18 @@
package org.mozilla.gecko.gfx; package org.mozilla.gecko.gfx;
import org.libreoffice.TileIdentifier;
public class SubTile extends SingleTileLayer { public class SubTile extends SingleTileLayer {
public boolean markedForRemoval = false; public boolean markedForRemoval = false;
public final TileIdentifier id; public final TileIdentifier id;
public SubTile(CairoImage mImage, int x, int y, float zoom) { public SubTile(CairoImage mImage, TileIdentifier id) {
super(mImage); super(mImage);
id = new TileIdentifier(x, y, zoom); this.id = id;
} }
public void markForRemoval() { public void markForRemoval() {
markedForRemoval = true; markedForRemoval = true;
} }
public static class TileIdentifier {
public int x;
public int y;
public float zoom;
public TileIdentifier(int x, int y, float zoom) {
this.x = x;
this.y = y;
this.zoom = zoom;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TileIdentifier that = (TileIdentifier) o;
if (x != that.x) return false;
if (y != that.y) return false;
if (Float.compare(that.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;
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment