From 8d0e1cd6e996de69db6890441e506a8df509991c Mon Sep 17 00:00:00 2001 From: Greg Knisely Date: Thu, 23 Apr 2026 11:12:30 -0400 Subject: [PATCH 1/6] fixed a crash when readTile() returns null if no tile found in the db. --- .../tiling/source/mbtiles/MBTilesBitmapTileDataSource.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java index c5be6b74c..07ecac64b 100644 --- a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java +++ b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java @@ -109,6 +109,11 @@ public void query(MapTile tile, ITileDataSink sink) { try { byte[] bytes = readTile(tile.tileX, tile.tileY, tile.zoomLevel); + if (bytes == null) { + sink.completed(res); + return; + } + if (mTransparentColor != null || mAlpha != null) { android.graphics.Bitmap androidBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); if (mTransparentColor != null) From 0e025a352163d788c7f46bf639b1a5d9f3f46c13 Mon Sep 17 00:00:00 2001 From: Greg Knisely Date: Thu, 23 Apr 2026 11:15:13 -0400 Subject: [PATCH 2/6] added logic to allow over zooming to a level --- .../mbtiles/MBTilesBitmapTileSource.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileSource.java b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileSource.java index 90c177ec0..3156321b2 100644 --- a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileSource.java +++ b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileSource.java @@ -40,4 +40,30 @@ public MBTilesBitmapTileSource(String path) { public MBTilesBitmapTileSource(String path, Integer alpha, Integer transparentColor) { super(new MBTilesBitmapTileDataSource(path, alpha, transparentColor)); } + + /** + * Create a tile source for MBTiles raster databases. + * + * @param path the path to the MBTiles database. + * @param overZoom allow over zooming to this level. + */ + public MBTilesBitmapTileSource(String path, int overZoom) { + this(path, null, null, overZoom); + } + + /** + * Create a tile source for MBTiles raster databases. + * + * @param path the path to the MBTiles database. + * @param alpha an optional alpha value [0-255] to make the tiles transparent. + * @param transparentColor an optional color that will be made transparent in the bitmap. + * @param overZoom allow over zooming to this level. + */ + public MBTilesBitmapTileSource(String path, Integer alpha, Integer transparentColor, int overZoom) { + super(new MBTilesBitmapTileDataSource(path, alpha, transparentColor)); + MBTilesTileDataSource ds = getDataSource(); + mZoomMin = ds.getMinZoom(); + mZoomMax = ds.getMaxZoom(); + mOverZoom = overZoom; + } } From a920dd6a8660710f513e5eeaf52fd8377bc9ca17 Mon Sep 17 00:00:00 2001 From: Greg Knisely Date: Thu, 23 Apr 2026 12:02:50 -0400 Subject: [PATCH 3/6] mTile is null when a tile gets recycled before setTileImage() is called --- vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java index 14cbcdc15..65bd397ec 100644 --- a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java @@ -55,7 +55,7 @@ protected boolean loadTile(MapTile tile) { @Override public void setTileImage(Bitmap bitmap) { - if (isCanceled() || !mTile.state(LOADING)) { + if (mTile == null || isCanceled() || !mTile.state(LOADING)) { bitmap.recycle(); return; } From bb4f0f08f3185ad1a5fed948eb72baa15894defe Mon Sep 17 00:00:00 2001 From: Greg Knisely Date: Thu, 23 Apr 2026 13:00:45 -0400 Subject: [PATCH 4/6] just moved to if check --- .../mbtiles/MBTilesBitmapTileDataSource.java | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java index 07ecac64b..fa829b125 100644 --- a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java +++ b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java @@ -108,26 +108,22 @@ public void query(MapTile tile, ITileDataSink sink) { QueryResult res = QueryResult.FAILED; try { byte[] bytes = readTile(tile.tileX, tile.tileY, tile.zoomLevel); - if (bytes == null) { - sink.completed(res); - return; - } - - if (mTransparentColor != null || mAlpha != null) { - android.graphics.Bitmap androidBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); - if (mTransparentColor != null) - androidBitmap = processTransparentColor(androidBitmap, mTransparentColor); - if (mAlpha != null) - androidBitmap = processAlpha(androidBitmap, mAlpha); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - androidBitmap.compress(android.graphics.Bitmap.CompressFormat.PNG, 100, bos); - bytes = bos.toByteArray(); - } - - Bitmap bitmap = CanvasAdapter.decodeBitmap(new ByteArrayInputStream(bytes)); - sink.setTileImage(bitmap); - res = QueryResult.SUCCESS; + if (mTransparentColor != null || mAlpha != null) { + android.graphics.Bitmap androidBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); + if (mTransparentColor != null) + androidBitmap = processTransparentColor(androidBitmap, mTransparentColor); + if (mAlpha != null) + androidBitmap = processAlpha(androidBitmap, mAlpha); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + androidBitmap.compress(android.graphics.Bitmap.CompressFormat.PNG, 100, bos); + bytes = bos.toByteArray(); + } + + Bitmap bitmap = CanvasAdapter.decodeBitmap(new ByteArrayInputStream(bytes)); + sink.setTileImage(bitmap); + res = QueryResult.SUCCESS; + } } catch (Throwable t) { log.severe(t.toString()); } finally { From 3a4cd40af35aa9d00bbd611423e2a8561fcf5d59 Mon Sep 17 00:00:00 2001 From: Greg Knisely Date: Thu, 23 Apr 2026 13:18:56 -0400 Subject: [PATCH 5/6] should be not equal --- .../tiling/source/mbtiles/MBTilesBitmapTileDataSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java index fa829b125..1dbb7aacb 100644 --- a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java +++ b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java @@ -108,7 +108,7 @@ public void query(MapTile tile, ITileDataSink sink) { QueryResult res = QueryResult.FAILED; try { byte[] bytes = readTile(tile.tileX, tile.tileY, tile.zoomLevel); - if (bytes == null) { + if (bytes != null) { if (mTransparentColor != null || mAlpha != null) { android.graphics.Bitmap androidBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); if (mTransparentColor != null) From e19d9db49a8e037157a714cd90e9898aa19f30eb Mon Sep 17 00:00:00 2001 From: Greg Knisely Date: Fri, 24 Apr 2026 08:37:29 -0400 Subject: [PATCH 6/6] fixed indentation --- .../tiling/source/mbtiles/MBTilesBitmapTileDataSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java index 1dbb7aacb..f9deca3c2 100644 --- a/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java +++ b/vtm-android/src/org/oscim/android/tiling/source/mbtiles/MBTilesBitmapTileDataSource.java @@ -123,7 +123,7 @@ public void query(MapTile tile, ITileDataSink sink) { Bitmap bitmap = CanvasAdapter.decodeBitmap(new ByteArrayInputStream(bytes)); sink.setTileImage(bitmap); res = QueryResult.SUCCESS; - } + } } catch (Throwable t) { log.severe(t.toString()); } finally {