Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/xwt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/Xwt
diff options
context:
space:
mode:
authorVsevolod Kukol <sevoku@microsoft.com>2019-10-01 16:48:41 +0300
committerGitHub <noreply@github.com>2019-10-01 16:48:41 +0300
commit9b14825d27c7821b301d0ed67a2a12a21000ccc8 (patch)
treef510edec4848d3ca80ca696e0431350e743c4449 /Xwt
parente38fc084369de426be61111878f2c9ec640ba224 (diff)
parentb63076f5563e4d5acae44bba1b06b9f3599d21b1 (diff)
Merge pull request #973 from mono/fix-tagged-image-reloading
Fix tag filtering when reloading tagged images
Diffstat (limited to 'Xwt')
-rw-r--r--Xwt/Xwt.Drawing/Image.cs38
1 files changed, 28 insertions, 10 deletions
diff --git a/Xwt/Xwt.Drawing/Image.cs b/Xwt/Xwt.Drawing/Image.cs
index 7c15de0e..92dc58a1 100644
--- a/Xwt/Xwt.Drawing/Image.cs
+++ b/Xwt/Xwt.Drawing/Image.cs
@@ -171,17 +171,22 @@ namespace Xwt.Drawing
/// </remarks>
public static Image FromResource (Assembly assembly, string resource)
{
+ return FromResource (assembly, resource, null);
+ }
+
+ internal static Image FromResource (Assembly assembly, string resource, ImageTagSet tagFilter)
+ {
if (assembly == null)
throw new ArgumentNullException ("assembly");
if (resource == null)
throw new ArgumentNullException ("resource");
-
+
var toolkit = Toolkit.CurrentEngine;
if (toolkit == null)
throw new ToolkitNotInitializedException ();
var loader = new ResourceImageLoader (toolkit, assembly);
- return LoadImage (loader, resource, null);
+ return LoadImage (loader, resource, tagFilter);
}
static Image LoadImage (ImageLoader loader, string fileName, ImageTagSet tagFilter)
@@ -196,10 +201,11 @@ namespace Xwt.Drawing
var ext = GetExtension (fileName);
var name = fileName.Substring (0, fileName.Length - ext.Length);
var altImages = new List<Tuple<string,ImageTagSet,bool,object>> ();
- var tags = Context.RegisteredStyles;
+ int scale;
foreach (var r in loader.GetAlternativeFiles (fileName, name, ext)) {
- int scale;
+ if (r == fileName) // loader might include the base filename, make sure to exclude it
+ continue;
ImageTagSet fileTags;
if (ParseImageHints (name, r, ext, out scale, out fileTags) && (tagFilter == null || tagFilter.Equals (fileTags))) {
var rim = loader.LoadImage (r);
@@ -209,7 +215,11 @@ namespace Xwt.Drawing
}
if (altImages.Count > 0) {
- altImages.Insert (0, new Tuple<string, ImageTagSet, bool, object> (fileName, ImageTagSet.Empty, false, img));
+ // Add the base file only if no tag filter is specified or the tags match
+ ImageTagSet fileTags = null;
+ if (tagFilter == null || tagFilter.IsEmpty || ParseImageHints (name, fileName, ext, out scale, out fileTags) && tagFilter.Equals (fileTags)) {
+ altImages.Insert (0, new Tuple<string, ImageTagSet, bool, object> (fileName, fileTags ?? ImageTagSet.Empty, false, img));
+ }
var list = new List<Tuple<Image,string[]>> ();
foreach (var imageGroup in altImages.GroupBy (t => t.Item2)) {
Image altImg;
@@ -234,17 +244,20 @@ namespace Xwt.Drawing
}
}
+ static readonly char [] tagDelimiters = { '@', '~' };
+
static bool ParseImageHints (string baseName, string fileName, string ext, out int scale, out ImageTagSet tags)
{
scale = 1;
tags = ImageTagSet.Empty;
+ var firstDelimiter = fileName.IndexOfAny (tagDelimiters);
- if (!fileName.StartsWith (baseName, StringComparison.Ordinal) || fileName.Length <= baseName.Length + 1 || (fileName [baseName.Length] != '@' && fileName [baseName.Length] != '~'))
+ if (firstDelimiter <= 0 || fileName.Length <= baseName.Length + 1 || !fileName.StartsWith (baseName, StringComparison.Ordinal))
return false;
fileName = fileName.Substring (0, fileName.Length - ext.Length);
- int i = baseName.Length;
+ int i = firstDelimiter;
if (fileName [i] == '~') {
// For example: foo~dark@2x
i++;
@@ -328,12 +341,17 @@ namespace Xwt.Drawing
public static Image FromFile (string file)
{
+ return FromFile (file, null);
+ }
+
+ internal static Image FromFile (string file, ImageTagSet tagFilter)
+ {
var toolkit = Toolkit.CurrentEngine;
if (toolkit == null)
throw new ToolkitNotInitializedException ();
var loader = new FileImageLoader (toolkit);
- return LoadImage (loader, file, null);
+ return LoadImage (loader, file, tagFilter);
}
static Image CreateComposedNinePatch (Toolkit toolkit, IEnumerable<Tuple<string,ImageTagSet,bool,object>> altImages)
@@ -882,10 +900,10 @@ namespace Xwt.Drawing
} else if (s.CustomImageLoader != null) {
targetToolkit.Invoke (() => newBackend = Image.FromCustomLoader (s.CustomImageLoader, s.Source, s.Tags).GetBackend());
} else if (s.ResourceAssembly != null) {
- targetToolkit.Invoke (() => newBackend = Image.FromResource (s.ResourceAssembly, s.Source).GetBackend());
+ targetToolkit.Invoke (() => newBackend = Image.FromResource (s.ResourceAssembly, s.Source, s.Tags).GetBackend());
}
else if (s.Source != null)
- targetToolkit.Invoke (() => newBackend = Image.FromFile (s.Source).GetBackend());
+ targetToolkit.Invoke (() => newBackend = Image.FromFile (s.Source, s.Tags).GetBackend());
else if (s.DrawCallback != null)
newBackend = targetToolkit.ImageBackendHandler.CreateCustomDrawn (s.DrawCallback);
else if (s.StockId != null)