Files
MicrosoftIris/UIX/Microsoft/Iris/Drawing/UriImage.cs
T

126 lines
4.6 KiB
C#
Raw Normal View History

2022-03-03 08:14:05 -06:00
// Decompiled with JetBrains decompiler
// Type: Microsoft.Iris.Drawing.UriImage
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
// Assembly location: C:\Program Files\Zune\UIX.dll
using Microsoft.Iris.Data;
using Microsoft.Iris.Render;
using Microsoft.Iris.Render.Extensions;
using Microsoft.Iris.Session;
namespace Microsoft.Iris.Drawing
{
public sealed class UriImage : UIImage
2022-03-03 08:14:05 -06:00
{
private ImageCacheKey _cacheKey;
private Resource _resource;
2022-03-03 08:14:05 -06:00
public UriImage()
: base(Inset.Zero, Size.Zero, false, false)
{
}
public UriImage(Resource resource, string identifier, Inset nineGrid, Size maximumSize, bool flippable)
: this(identifier, nineGrid, maximumSize, flippable, false)
{
_resource = resource;
}
2022-03-03 08:14:05 -06:00
public UriImage(string source, Inset nineGrid, Size maximumSize, bool flippable)
: this(source, nineGrid, maximumSize, flippable, false)
{
}
public UriImage(string source, Inset nineGrid, Size maximumSize, bool flippable, bool antialiasEdges)
2022-03-03 08:14:05 -06:00
: base(nineGrid, maximumSize, flippable, antialiasEdges)
{
Source = source;
}
private ResourceImageItem FetchOrBuildItem()
{
ResourceImageItem resourceImageItem = GetResourceFromCache();
if (resourceImageItem == null)
{
var renderSession = UISession.Default.RenderSession;
var size = ClampSize(_maximumSize);
if (_resource != null)
resourceImageItem = new ResourceImageItem(renderSession, _resource, size, Source, IsFlipped, _antialiasEdges);
else
resourceImageItem = new ResourceImageItem(renderSession, Source, size, IsFlipped, _antialiasEdges);
2022-03-03 08:14:05 -06:00
resourceImageItem.LoadCompleteHandler += new ContentLoadCompleteHandler(OnLoadComplete);
2022-03-03 08:14:05 -06:00
ScavengeImageCache.Instance.Add(_cacheKey, resourceImageItem);
SetStatus(resourceImageItem.Status);
_contentSize = new Size(0, 0);
}
else if (resourceImageItem.Resource.Status == ResourceStatus.NeedsAcquire || resourceImageItem.Resource.Status == ResourceStatus.Acquiring)
resourceImageItem.LoadCompleteHandler += new ContentLoadCompleteHandler(OnLoadComplete);
return resourceImageItem;
}
private ResourceImageItem GetResourceFromCache()
{
Size maxSize = ClampSize(_maximumSize);
if (_cacheKey == null)
_cacheKey = new ImageCacheKey(Source, maxSize, IsFlipped, _antialiasEdges);
return (ResourceImageItem)ScavengeImageCache.Instance.Lookup(_cacheKey);
}
protected override void OnImageAttributeChanged() => _cacheKey = null;
private void OnLoadComplete(object owner, ImageStatus status)
{
ResourceImageItem resourceFromCache = GetResourceFromCache();
if (resourceFromCache != null)
resourceFromCache.LoadCompleteHandler -= new ContentLoadCompleteHandler(OnLoadComplete);
SetStatus(status);
}
protected override ImageCacheItem GetCacheItem(out bool needAsyncLoad)
{
ResourceImageItem resourceImageItem;
if (!string.IsNullOrEmpty(Source))
{
resourceImageItem = FetchOrBuildItem();
if (resourceImageItem != null)
{
needAsyncLoad = resourceImageItem.Resource.Status != ResourceStatus.Available;
}
else
{
resourceImageItem = null;
needAsyncLoad = false;
}
}
else
{
resourceImageItem = null;
needAsyncLoad = false;
}
return resourceImageItem;
}
protected override void EnsureSizeMetrics()
{
ImageCacheItem cacheItem = GetCacheItem(out bool _);
if (cacheItem == null)
return;
_contentSize = cacheItem.ImageSize;
}
public static void RemoveCache(
string source,
Size maximumSize,
bool flippable,
bool antialiasEdges)
{
ScavengeImageCache.Instance.RemoveData(new ImageCacheKey(source, maximumSize, flippable, antialiasEdges));
}
2023-05-26 00:00:51 -05:00
public override string ToString() => $"{{UriImage '{Source}' {RenderImage?.ToString() ?? "null"}}}";
2022-03-03 08:14:05 -06:00
}
}