Version 1.1.4: changed accessibility of classes Tile and TileLayer to allow for derived TileLayers.

This commit is contained in:
ClemensF 2013-01-03 15:33:46 +01:00
parent 2f1020ffc6
commit 452e039349
20 changed files with 98 additions and 102 deletions

View file

@ -16,6 +16,6 @@ using System.Windows;
[assembly: AssemblyCopyright("Copyright © 2012 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.1.3")]
[assembly: AssemblyFileVersion("1.1.3")]
[assembly: AssemblyVersion("1.1.4")]
[assembly: AssemblyFileVersion("1.1.4")]
[assembly: ComVisible(false)]

View file

@ -17,28 +17,27 @@ using System.Windows.Media.Imaging;
namespace MapControl
{
internal partial class Tile
public partial class Tile
{
public readonly Image Image = new Image { Stretch = Stretch.Uniform, Opacity = 0d };
public ImageSource ImageSource
{
get { return Image.Source; }
private set { Image.Source = value; }
}
public void SetImageSource(ImageSource source, bool animateOpacity)
public void SetImageSource(ImageSource image, bool animateOpacity)
{
if (ImageSource == null)
if (Image.Source == null)
{
if (animateOpacity)
{
var bitmap = source as BitmapImage;
var bitmapImage = image as BitmapImage;
if (bitmap != null) // TODO Check if bitmap is downloading somehow, maybe PixelWidth == 0?
if (bitmapImage != null)
{
bitmap.ImageOpened += BitmapImageOpened;
bitmap.ImageFailed += BitmapImageFailed;
bitmapImage.ImageOpened += BitmapImageOpened;
bitmapImage.ImageFailed += BitmapImageFailed;
}
else
{
@ -51,7 +50,7 @@ namespace MapControl
}
}
ImageSource = source;
Image.Source = image;
}
private void BitmapImageOpened(object sender, RoutedEventArgs e)
@ -65,7 +64,7 @@ namespace MapControl
{
((BitmapImage)sender).ImageOpened -= BitmapImageOpened;
((BitmapImage)sender).ImageFailed -= BitmapImageFailed;
ImageSource = null;
Image.Source = null;
}
}
}

View file

@ -5,31 +5,31 @@
using System;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
namespace MapControl
{
internal partial class Tile
public partial class Tile
{
public readonly ImageBrush Brush = new ImageBrush { Opacity = 0d };
public ImageSource ImageSource
{
get { return Brush.ImageSource; }
private set { Brush.ImageSource = value; }
}
public void SetImageSource(ImageSource source, bool animateOpacity)
public void SetImageSource(ImageSource image, bool animateOpacity)
{
if (ImageSource == null)
if (Brush.ImageSource == null)
{
if (animateOpacity)
{
var bitmap = source as BitmapImage;
var bitmapImage = image as BitmapImage;
if (bitmap != null && bitmap.IsDownloading)
if (bitmapImage != null && bitmapImage.IsDownloading)
{
bitmap.DownloadCompleted += BitmapDownloadCompleted;
bitmap.DownloadFailed += BitmapDownloadFailed;
bitmapImage.DownloadCompleted += BitmapDownloadCompleted;
bitmapImage.DownloadFailed += BitmapDownloadFailed;
}
else
{
@ -42,7 +42,7 @@ namespace MapControl
}
}
ImageSource = source;
Brush.ImageSource = image;
}
private void BitmapDownloadCompleted(object sender, EventArgs e)
@ -56,7 +56,7 @@ namespace MapControl
{
((BitmapImage)sender).DownloadCompleted -= BitmapDownloadCompleted;
((BitmapImage)sender).DownloadFailed -= BitmapDownloadFailed;
ImageSource = null;
Brush.ImageSource = null;
}
}
}

View file

@ -11,7 +11,7 @@ using System.Windows.Media.Animation;
namespace MapControl
{
internal partial class Tile
public partial class Tile
{
public readonly int ZoomLevel;
public readonly int X;
@ -35,7 +35,7 @@ namespace MapControl
}
}
DoubleAnimation OpacityAnimation
public DoubleAnimation OpacityAnimation
{
get
{

View file

@ -54,7 +54,7 @@ namespace MapControl
}
index++;
tileLayer.TransformMatrix = tileLayerTransform;
tileLayer.SetTransformMatrix(tileLayerTransform);
tileLayer.UpdateTiles(tileZoomLevel, tileGrid);
}
}
@ -98,15 +98,15 @@ namespace MapControl
ViewportTransform.Matrix = GetTransformMatrix(new Matrix(1d, 0d, 0d, -1d, 180d, 180d), scale);
var tileLayerTransform = GetTileLayerTransformMatrix();
foreach (TileLayer tileLayer in Children)
{
tileLayer.TransformMatrix = tileLayerTransform;
}
if (Math.Sign(mapOrigin.X) == Math.Sign(oldMapOriginX))
{
var tileLayerTransform = GetTileLayerTransformMatrix();
foreach (TileLayer tileLayer in Children)
{
tileLayer.SetTransformMatrix(tileLayerTransform);
}
updateTimer.Start();
}
else
@ -162,7 +162,7 @@ namespace MapControl
foreach (TileLayer tileLayer in Children)
{
tileLayer.TransformMatrix = tileLayerTransform;
tileLayer.SetTransformMatrix(tileLayerTransform);
tileLayer.UpdateTiles(tileZoomLevel, tileGrid);
}
}

View file

@ -87,16 +87,31 @@ namespace MapControl
var newTiles = (List<Tile>)newTilesList;
var imageTileSource = tileLayer.TileSource as ImageTileSource;
if (imageTileSource == null)
if (imageTileSource != null)
{
if (Cache == null || string.IsNullOrWhiteSpace(tileLayer.SourceName))
if (imageTileSource.CanLoadAsync)
{
foreach (var tile in newTiles)
{
pendingTiles.Enqueue(tile);
tileLayer.Dispatcher.BeginInvoke(
(Action<Tile, ImageSource>)((t, i) => t.SetImageSource(i, true)),
DispatcherPriority.Background, tile,
imageTileSource.LoadImage(tile.XIndex, tile.Y, tile.ZoomLevel));
}
}
else
{
foreach (var tile in newTiles)
{
tileLayer.Dispatcher.BeginInvoke(
(Action<Tile, ImageTileSource>)((t, i) => t.SetImageSource(i.LoadImage(t.XIndex, t.Y, t.ZoomLevel), true)),
DispatcherPriority.Background, tile, imageTileSource);
}
}
}
else
{
if (Cache != null && !string.IsNullOrWhiteSpace(tileLayer.SourceName))
{
var outdatedTiles = new List<Tile>(newTiles.Count);
@ -127,6 +142,13 @@ namespace MapControl
pendingTiles.Enqueue(tile);
}
}
else
{
foreach (var tile in newTiles)
{
pendingTiles.Enqueue(tile);
}
}
while (downloadThreadCount < Math.Min(pendingTiles.Count, tileLayer.MaxParallelDownloads))
{
@ -135,26 +157,6 @@ namespace MapControl
ThreadPool.QueueUserWorkItem(DownloadTiles);
}
}
else if (imageTileSource.CanLoadAsync)
{
foreach (var tile in newTiles)
{
tileLayer.Dispatcher.BeginInvoke(
(Action<Tile, ImageSource>)((t, s) => t.SetImageSource(s, true)),
DispatcherPriority.Background,
tile, imageTileSource.LoadImage(tile.XIndex, tile.Y, tile.ZoomLevel));
}
}
else
{
foreach (var tile in newTiles)
{
tileLayer.Dispatcher.BeginInvoke(
(Action<Tile>)(t => t.SetImageSource(imageTileSource.LoadImage(t.XIndex, t.Y, t.ZoomLevel), true)),
DispatcherPriority.Background,
tile);
}
}
}
private void DownloadTiles(object o)
@ -181,17 +183,17 @@ namespace MapControl
private bool CreateTileImage(Tile tile, byte[] buffer)
{
var bitmap = new BitmapImage();
var image = new BitmapImage();
try
{
using (var stream = new MemoryStream(buffer, 8, buffer.Length - 8, false))
{
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = stream;
bitmap.EndInit();
bitmap.Freeze();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = stream;
image.EndInit();
image.Freeze();
}
}
catch (Exception ex)
@ -201,9 +203,8 @@ namespace MapControl
}
tileLayer.Dispatcher.BeginInvoke(
(Action<Tile>)(t => t.SetImageSource(bitmap, true)),
DispatcherPriority.Background,
tile);
(Action<Tile, ImageSource>)((t, i) => t.SetImageSource(i, true)),
DispatcherPriority.Background, tile, image);
return true;
}

View file

@ -19,12 +19,12 @@ namespace MapControl
RenderTransform = transform;
}
private Panel TileContainer
protected Panel TileContainer
{
get { return Parent as Panel; }
}
private void RenderTiles()
protected void RenderTiles()
{
Children.Clear();
foreach (var tile in tiles)

View file

@ -15,12 +15,12 @@ namespace MapControl
VisualEdgeMode = EdgeMode.Aliased;
}
private ContainerVisual TileContainer
protected ContainerVisual TileContainer
{
get { return Parent as ContainerVisual; }
}
private void RenderTiles()
protected void RenderTiles()
{
//System.Diagnostics.Trace.TraceInformation("{0} Tiles: {1}", tiles.Count, string.Join(", ", tiles.Select(t => t.ZoomLevel.ToString())));

View file

@ -76,13 +76,12 @@ namespace MapControl
set { TileSource = new TileSource(value); }
}
internal Matrix TransformMatrix
internal void SetTransformMatrix(Matrix transformMatrix)
{
get { return transform.Matrix; }
set { transform.Matrix = value; }
transform.Matrix = transformMatrix;
}
internal void UpdateTiles(int zoomLevel, Int32Rect grid)
protected internal virtual void UpdateTiles(int zoomLevel, Int32Rect grid)
{
this.grid = grid;
this.zoomLevel = zoomLevel;
@ -97,14 +96,14 @@ namespace MapControl
}
}
internal void ClearTiles()
protected internal virtual void ClearTiles()
{
tileImageLoader.CancelGetTiles();
tiles.Clear();
RenderTiles();
}
private void SelectTiles()
protected void SelectTiles()
{
var maxZoomLevel = Math.Min(zoomLevel, MaxZoomLevel);
var minZoomLevel = maxZoomLevel;
@ -151,6 +150,5 @@ namespace MapControl
tiles = newTiles;
}
}
}

View file

@ -9,6 +9,6 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCopyright("Copyright © 2012 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.1.3")]
[assembly: AssemblyFileVersion("1.1.3")]
[assembly: AssemblyVersion("1.1.4")]
[assembly: AssemblyFileVersion("1.1.4")]
[assembly: ComVisible(false)]