Version 2.13: TileImageLoader evaluates X-VE-Tile-Info HTTP header.

This commit is contained in:
ClemensF 2016-09-29 20:47:31 +02:00
parent 4d2d6c1273
commit ff85d3fee4
18 changed files with 79 additions and 71 deletions

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("© 2016 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("2.12.0")]
[assembly: AssemblyFileVersion("2.12.0")]
[assembly: AssemblyVersion(("2.13.0"))]
[assembly: AssemblyFileVersion(("2.13.0"))]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("© 2016 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("2.12.0")]
[assembly: AssemblyFileVersion("2.12.0")]
[assembly: AssemblyVersion(("2.13.0"))]
[assembly: AssemblyFileVersion(("2.13.0"))]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("© 2016 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("2.12.0")]
[assembly: AssemblyFileVersion("2.12.0")]
[assembly: AssemblyVersion(("2.13.0"))]
[assembly: AssemblyFileVersion(("2.13.0"))]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("© 2016 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("2.12.0")]
[assembly: AssemblyFileVersion("2.12.0")]
[assembly: AssemblyVersion(("2.13.0"))]
[assembly: AssemblyFileVersion(("2.13.0"))]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]

View file

@ -80,5 +80,10 @@ namespace MapControl
viewportTransform.Matrix = transform;
}
private void SetTileLayer(TileLayer tileLayer)
{
TileLayer = tileLayer;
}
}
}

View file

@ -96,5 +96,10 @@ namespace MapControl
viewportTransform.Matrix = transform;
}
private void SetTileLayer(TileLayer tileLayer)
{
SetCurrentValue(TileLayerProperty, tileLayer);
}
}
}

View file

@ -465,13 +465,13 @@ namespace MapControl
oldCollection.CollectionChanged -= TileLayerCollectionChanged;
}
TileLayer = null;
SetTileLayer(null);
ClearTileLayers();
}
if (newTileLayers != null)
{
TileLayer = newTileLayers.FirstOrDefault();
SetTileLayer(newTileLayers.FirstOrDefault());
AddTileLayers(0, newTileLayers);
var newCollection = newTileLayers as INotifyCollectionChanged;
@ -517,7 +517,7 @@ namespace MapControl
if (TileLayer != tileLayer)
{
TileLayer = tileLayer;
SetTileLayer(tileLayer);
}
}

View file

@ -14,8 +14,8 @@ using System.Windows;
[assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("© 2016 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("2.12.0")]
[assembly: AssemblyFileVersion("2.12.0")]
[assembly: AssemblyVersion(("2.13.0"))]
[assembly: AssemblyFileVersion(("2.13.0"))]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]

View file

@ -38,7 +38,7 @@ namespace MapControl
}
else
{
Image.BeginAnimation(Image.OpacityProperty,
Image.BeginAnimation(UIElement.OpacityProperty,
new DoubleAnimation { From = 0d, To = 1d, Duration = FadeDuration });
}
}
@ -58,7 +58,7 @@ namespace MapControl
bitmap.ImageOpened -= BitmapImageOpened;
bitmap.ImageFailed -= BitmapImageFailed;
Image.BeginAnimation(Image.OpacityProperty,
Image.BeginAnimation(UIElement.OpacityProperty,
new DoubleAnimation { From = 0d, To = 1d, Duration = FadeDuration });
}

View file

@ -3,6 +3,7 @@
// Licensed under the Microsoft Public License (Ms-PL)
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
@ -29,7 +30,7 @@ namespace MapControl
}
else
{
Image.BeginAnimation(Image.OpacityProperty,
Image.BeginAnimation(UIElement.OpacityProperty,
new DoubleAnimation(0d, 1d, FadeDuration));
}
}
@ -49,7 +50,7 @@ namespace MapControl
bitmap.DownloadCompleted -= BitmapDownloadCompleted;
bitmap.DownloadFailed -= BitmapDownloadFailed;
Image.BeginAnimation(Image.OpacityProperty,
Image.BeginAnimation(UIElement.OpacityProperty,
new DoubleAnimation(0d, 1d, FadeDuration));
}

View file

@ -179,14 +179,7 @@ namespace MapControl
}
}
if (image != null)
{
dispatcher.BeginInvoke(new Action<Tile, ImageSource>((t, i) => t.SetImage(i)), tile, image);
}
else
{
tile.SetImage(null);
}
dispatcher.BeginInvoke(new Action<Tile, ImageSource>((t, i) => t.SetImage(i)), tile, image);
}
Interlocked.Decrement(ref taskCount);
@ -245,16 +238,19 @@ namespace MapControl
using (var response = (HttpWebResponse)request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
using (var memoryStream = new MemoryStream())
if (response.Headers["X-VE-Tile-Info"] != "no-tile") // set by Bing Maps
{
responseStream.CopyTo(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
image = ImageLoader.FromStream(memoryStream);
if (cacheKey != null)
using (var responseStream = response.GetResponseStream())
using (var memoryStream = new MemoryStream())
{
SetCachedImage(cacheKey, memoryStream, GetExpiration(response.Headers));
responseStream.CopyTo(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
image = ImageLoader.FromStream(memoryStream);
if (cacheKey != null)
{
SetCachedImage(cacheKey, memoryStream, GetExpiration(response.Headers));
}
}
}
}

View file

@ -9,7 +9,6 @@ using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using MapControl.Caching;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI.Core;
@ -61,13 +60,11 @@ namespace MapControl
{
public readonly Tile Tile;
public readonly Uri Uri;
public readonly BitmapSource Image;
public PendingTile(Tile tile, Uri uri)
{
Tile = tile;
Uri = uri;
Image = new BitmapImage();
}
}
@ -140,22 +137,18 @@ namespace MapControl
private async Task LoadPendingTiles(TileSource tileSource, string sourceName)
{
PendingTile pendingTile;
var cache = Cache;
if (cache == null || sourceName == null)
while (pendingTiles.TryDequeue(out pendingTile))
{
while (pendingTiles.TryDequeue(out pendingTile))
var tile = pendingTile.Tile;
var uri = pendingTile.Uri;
if (Cache == null || sourceName == null)
{
await DownloadImage(pendingTile.Tile, pendingTile.Image, pendingTile.Uri, null);
await DownloadImage(tile, uri, null);
}
}
else
{
while (pendingTiles.TryDequeue(out pendingTile))
else
{
var tile = pendingTile.Tile;
var image = pendingTile.Image;
var uri = pendingTile.Uri;
var extension = Path.GetExtension(uri.LocalPath);
if (string.IsNullOrEmpty(extension) || extension == ".jpeg")
@ -164,12 +157,12 @@ namespace MapControl
}
var cacheKey = string.Format(@"{0}\{1}\{2}\{3}{4}", sourceName, tile.ZoomLevel, tile.XIndex, tile.Y, extension);
var cacheItem = await cache.GetAsync(cacheKey);
var cacheItem = await Cache.GetAsync(cacheKey);
var loaded = false;
if (cacheItem == null || cacheItem.Expiration <= DateTime.UtcNow)
{
loaded = await DownloadImage(tile, image, uri, cacheKey);
loaded = await DownloadImage(tile, uri, cacheKey);
}
if (!loaded && cacheItem != null && cacheItem.Buffer != null)
@ -180,7 +173,7 @@ namespace MapControl
await stream.FlushAsync();
stream.Seek(0);
await LoadImageFromStream(tile, image, stream);
await LoadImageFromStream(tile, stream);
}
}
}
@ -189,7 +182,7 @@ namespace MapControl
Interlocked.Decrement(ref taskCount);
}
private async Task<bool> DownloadImage(Tile tile, BitmapSource image, Uri uri, string cacheKey)
private async Task<bool> DownloadImage(Tile tile, Uri uri, string cacheKey)
{
try
{
@ -198,7 +191,7 @@ namespace MapControl
{
if (response.IsSuccessStatusCode)
{
return await LoadImageFromHttpResponse(response, tile, image, cacheKey);
return await LoadImageFromHttpResponse(response, tile, cacheKey);
}
Debug.WriteLine("{0}: {1} {2}", uri, (int)response.StatusCode, response.ReasonPhrase);
@ -212,8 +205,16 @@ namespace MapControl
return false;
}
private async Task<bool> LoadImageFromHttpResponse(HttpResponseMessage response, Tile tile, BitmapSource image, string cacheKey)
private async Task<bool> LoadImageFromHttpResponse(HttpResponseMessage response, Tile tile, string cacheKey)
{
string tileInfo;
if (response.Headers.TryGetValue("X-VE-Tile-Info", out tileInfo) && tileInfo == "no-tile") // set by Bing Maps
{
tile.SetImage(null);
return true;
}
using (var stream = new InMemoryRandomAccessStream())
{
using (var content = response.Content)
@ -224,10 +225,9 @@ namespace MapControl
await stream.FlushAsync();
stream.Seek(0);
var loaded = await LoadImageFromStream(tile, image, stream);
IImageCache cache;
var loaded = await LoadImageFromStream(tile, stream);
if (loaded && cacheKey != null && (cache = Cache) != null)
if (loaded && cacheKey != null)
{
var buffer = new Windows.Storage.Streams.Buffer((uint)stream.Size);
@ -246,23 +246,24 @@ namespace MapControl
}
}
await cache.SetAsync(cacheKey, buffer, DateTime.UtcNow.Add(expiration));
await Cache.SetAsync(cacheKey, buffer, DateTime.UtcNow.Add(expiration));
}
return loaded;
}
}
private async Task<bool> LoadImageFromStream(Tile tile, BitmapSource image, IRandomAccessStream stream)
private async Task<bool> LoadImageFromStream(Tile tile, IRandomAccessStream stream)
{
var completion = new TaskCompletionSource<bool>();
var action = image.Dispatcher.RunAsync(
var action = tile.Image.Dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
async () =>
{
try
{
var image = new BitmapImage();
await image.SetSourceAsync(stream);
tile.SetImage(image, true, false);
completion.SetResult(true);

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("© 2016 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("2.12.0")]
[assembly: AssemblyFileVersion("2.12.0")]
[assembly: AssemblyVersion(("2.13.0"))]
[assembly: AssemblyFileVersion(("2.13.0"))]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("© 2016 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("2.12.0")]
[assembly: AssemblyFileVersion("2.12.0")]
[assembly: AssemblyVersion(("2.13.0"))]
[assembly: AssemblyFileVersion(("2.13.0"))]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("© 2016 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("2.12.0")]
[assembly: AssemblyFileVersion("2.12.0")]
[assembly: AssemblyVersion(("2.13.0"))]
[assembly: AssemblyFileVersion(("2.13.0"))]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("© 2016 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("2.12.0")]
[assembly: AssemblyFileVersion("2.12.0")]
[assembly: AssemblyVersion(("2.13.0"))]
[assembly: AssemblyFileVersion(("2.13.0"))]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]

View file

@ -8,7 +8,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCopyright("© 2016 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("2.12.0")]
[assembly: AssemblyFileVersion("2.12.0")]
[assembly: AssemblyVersion(("2.13.0"))]
[assembly: AssemblyFileVersion(("2.13.0"))]
[assembly: AssemblyConfiguration("")]
[assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("© 2016 Clemens Fischer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("2.12.0")]
[assembly: AssemblyFileVersion("2.12.0")]
[assembly: AssemblyVersion(("2.13.0"))]
[assembly: AssemblyFileVersion(("2.13.0"))]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]