summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.com>2014-09-28 22:30:38 +0200
committerTomaž Vajngerl <tomaz.vajngerl@collabora.com>2014-09-28 22:32:49 +0200
commit27953d41222ba0410769b381525c59f4395301e3 (patch)
tree490a1a7413c9426b2e7e1e5260c44ee58b5c6629
parent295f3c12dfc76b6faa438074bc77f8ac8ecadf06 (diff)
android: minimize the rounding error, clean-up MultiTileLayer
Change-Id: Ib167acf5914596b69ee240255aaab173a0570038
-rw-r--r--android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java11
-rw-r--r--android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java6
-rw-r--r--android/experimental/LOAndroid3/src/java/org/mozilla/gecko/gfx/MultiTileLayer.java54
3 files changed, 23 insertions, 48 deletions
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
index f808f57b4bbe..ba7102e2b5e1 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
@@ -28,10 +28,7 @@ public class LOKitThread extends Thread {
}
private boolean draw() throws InterruptedException {
- int pageWidth = mTileProvider.getPageWidth();
- int pageHeight = mTileProvider.getPageHeight();
-
- RectF rect = new RectF(0, 0, pageWidth, pageHeight);
+ 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);
@@ -72,6 +69,8 @@ public class LOKitThread extends Thread {
boolean isReady = mTileProvider.isReady();
if (isReady) {
updateCheckbardImage();
+ RectF rect = new RectF(0, 0, mTileProvider.getPageWidth(), mTileProvider.getPageHeight());
+ mController.setPageRect(rect, rect);
mController.setForceRedraw();
}
return isReady;
@@ -79,13 +78,9 @@ public class LOKitThread extends Thread {
private void updateCheckbardImage() {
if (!mCheckboardImageSet) {
- Log.i(LOGTAG, "Generate thumbnail!");
Bitmap bitmap = mTileProvider.thumbnail();
- Log.i(LOGTAG, "Done generate thumbnail!");
if (bitmap != null) {
- Log.i(LOGTAG, "Setting checkboard image!");
mApplication.getLayerController().getView().changeCheckerboardBitmap(bitmap, mTileProvider.getPageWidth(), mTileProvider.getPageHeight());
- Log.i(LOGTAG, "Done setting checkboard image!!");
mCheckboardImageSet = true;
}
}
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java
index 5b1b718cd309..77a833e1a916 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitTileProvider.java
@@ -112,7 +112,11 @@ public class LOKitTileProvider implements TileProvider {
Bitmap bitmap = Bitmap.createBitmap(TILE_SIZE, TILE_SIZE, Bitmap.Config.ARGB_8888);
if (mDocument != null) {
- mDocument.paintTile(buffer, TILE_SIZE, TILE_SIZE, Math.round(pixelToTwip(x, mDPI)/zoom), Math.round(pixelToTwip(y, mDPI)/ zoom), Math.round(mTileWidth / zoom), Math.round(mTileHeight/zoom));
+ float twipX = pixelToTwip(x, mDPI) / zoom;
+ float twipY = pixelToTwip(y, mDPI) / zoom;
+ float twipWidth = mTileWidth / zoom;
+ float twipHeight = mTileHeight / zoom;
+ mDocument.paintTile(buffer, TILE_SIZE, TILE_SIZE, (int) twipX, (int) twipY, (int)twipWidth, (int)twipHeight);
} else {
Log.e(LOGTAG, "Document is null!!");
}
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 c4a445d6f67a..14a08e26a3c6 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
@@ -42,7 +42,6 @@ import android.graphics.Point;
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;
@@ -51,23 +50,16 @@ import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
-/**
- * Encapsulates the logic needed to draw a layer made of multiple tiles.
- */
public class MultiTileLayer extends Layer {
private static final String LOGTAG = "MultiTileLayer";
private static int TILE_SIZE = 256;
- private final List<SubTile> mTiles;
+ private final List<SubTile> mTiles = new CopyOnWriteArrayList<SubTile>();
private TileProvider tileProvider;
- private float currentZoomFactor;
private RectF tileViewPort = new RectF();
- private boolean shouldRefreshZoom = true;
- private RectF currentPageRect = new RectF();
public MultiTileLayer() {
super();
- mTiles = new CopyOnWriteArrayList<SubTile>();
}
public void invalidate() {
@@ -131,10 +123,10 @@ public class MultiTileLayer extends Layer {
if (origin != null) {
Rect position = layer.getPosition();
- int positionX = origin.x + Math.round(layer.x / layer.zoom);
- int positionY = origin.y + Math.round(layer.y / layer.zoom);
- int tileSize = Math.round(256.0f / layer.zoom);
- position.set(positionX, positionY, positionX + tileSize, positionY + tileSize);
+ 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) {
@@ -170,10 +162,6 @@ public class MultiTileLayer extends Layer {
super.endTransaction();
}
- private RectF normlizeRect(RectF rect, FloatSize pageSize) {
- return new RectF(rect.left / pageSize.width, rect.top / pageSize.height, rect.right / pageSize.width, rect.bottom / pageSize.height);
- }
-
private RectF roundToTileSize(RectF input, int tileSize) {
float minX = (Math.round(input.left) / tileSize) * tileSize;
float minY = (Math.round(input.top) / tileSize) * tileSize;
@@ -198,12 +186,6 @@ public class MultiTileLayer extends Layer {
@Override
public void draw(RenderContext context) {
- if (tileProvider == null) {
- return;
- }
-
- currentPageRect = context.pageRect;
-
for (SubTile layer : mTiles) {
// Avoid work, only draw tiles that intersect with the viewport
RectF layerBounds = layer.getBounds(context);
@@ -229,19 +211,13 @@ public class MultiTileLayer extends Layer {
}
public void reevaluateTiles(ImmutableViewportMetrics viewportMetrics) {
- if (currentZoomFactor != viewportMetrics.zoomFactor) {
- currentZoomFactor = viewportMetrics.zoomFactor;
- }
-
RectF newTileViewPort = inflate(roundToTileSize(viewportMetrics.getViewport(), TILE_SIZE), TILE_SIZE);
- Log.i(LOGTAG, "reevaluateTiles ( " + viewportMetrics + " )");
-
if (tileViewPort != newTileViewPort) {
tileViewPort = newTileViewPort;
cleanTiles();
- addNewTiles();
- markTiles();
+ addNewTiles(viewportMetrics);
+ markTiles(viewportMetrics);
}
}
@@ -256,24 +232,24 @@ public class MultiTileLayer extends Layer {
mTiles.removeAll(tilesToRemove);
}
- private void addNewTiles() {
+ private void addNewTiles(ImmutableViewportMetrics viewportMetrics) {
for (float y = tileViewPort.top; y < tileViewPort.bottom; y += TILE_SIZE) {
- if (y > currentPageRect.height()) {
+ if (y > viewportMetrics.getPageHeight()) {
continue;
}
for (float x = tileViewPort.left; x < tileViewPort.right; x += TILE_SIZE) {
- if (x > currentPageRect.width()) {
+ if (x > viewportMetrics.getPageWidth()) {
continue;
}
boolean contains = false;
for (SubTile tile : mTiles) {
- if (tile.x == x && tile.y == y) {
+ if (tile.x == x && tile.y == y && tile.zoom == viewportMetrics.zoomFactor) {
contains = true;
}
}
if (!contains) {
- CairoImage image = tileProvider.createTile(x, y, currentZoomFactor);
- SubTile tile = new SubTile(image, (int)x, (int)y, currentZoomFactor);
+ CairoImage image = tileProvider.createTile(x, y, viewportMetrics.zoomFactor);
+ SubTile tile = new SubTile(image, (int)x, (int)y, viewportMetrics.zoomFactor);
tile.beginTransaction();
mTiles.add(tile);
}
@@ -281,9 +257,9 @@ public class MultiTileLayer extends Layer {
}
}
- private void markTiles() {
+ private void markTiles(ImmutableViewportMetrics viewportMetrics) {
for (SubTile tile : mTiles) {
- if (FloatUtils.fuzzyEquals(tile.zoom, currentZoomFactor)) {
+ 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)) {
tile.markForRemoval();