xamarin-macios/msbuild/Xamarin.MacDev.Tasks.Core/Tasks/TextureAtlasTaskBase.cs

107 строки
2.9 KiB
C#
Исходник Обычный вид История

2016-04-21 16:40:25 +03:00
using System;
using System.IO;
using System.Collections.Generic;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using Xamarin.MacDev;
namespace Xamarin.MacDev.Tasks
{
public abstract class TextureAtlasTaskBase : XcodeToolTaskBase
{
readonly Dictionary<string, List<ITaskItem>> atlases = new Dictionary<string, List<ITaskItem>> ();
#region Inputs
public ITaskItem[] AtlasTextures { get; set; }
#endregion
protected override string DefaultBinDir {
get { return DeveloperRootBinDir; }
}
protected override string ToolName {
get { return "TextureAtlas"; }
}
protected override void AppendCommandLineArguments (IDictionary<string, string> environment, CommandLineBuilder args, ITaskItem input, ITaskItem output)
{
args.AppendFileNameIfNotNull (input.GetMetadata ("FullPath"));
args.AppendFileNameIfNotNull (Path.GetDirectoryName (output.GetMetadata ("FullPath")));
}
protected override string GetBundleRelativeOutputPath (IList<string> prefixes, ITaskItem input)
{
// Note: if the relative input dir is "relative/texture.atlas", then the relative output path will be "relative/texture.atlasc"
return Path.ChangeExtension (base.GetBundleRelativeOutputPath (prefixes, input), ".atlasc");
}
protected override IEnumerable<ITaskItem> GetCompiledBundleResources (ITaskItem input, ITaskItem output)
{
var bundleDir = output.GetMetadata ("LogicalName");
if (!Directory.Exists (output.ItemSpec))
yield break;
foreach (var file in Directory.GetFiles (output.ItemSpec)) {
var fileName = Path.GetFileName (file);
var relative = Path.Combine (output.ItemSpec, fileName);
var logical = Path.Combine (bundleDir, fileName);
var item = new TaskItem (relative);
item.SetMetadata ("LogicalName", logical);
item.SetMetadata ("Optimize", "false");
yield return item;
}
yield break;
}
protected override bool NeedsBuilding (ITaskItem input, ITaskItem output)
{
var plist = Path.Combine (output.ItemSpec, Path.GetFileNameWithoutExtension (input.ItemSpec) + ".plist");
if (!File.Exists (plist))
return true;
var items = atlases[input.ItemSpec];
foreach (var item in items) {
if (File.GetLastWriteTimeUtc (item.ItemSpec) > File.GetLastWriteTimeUtc (plist))
2016-04-21 16:40:25 +03:00
return true;
}
return false;
}
protected override IEnumerable<ITaskItem> EnumerateInputs ()
{
if (AtlasTextures == null)
yield break;
// group the atlas textures by their parent .atlas directories
foreach (var item in AtlasTextures) {
var atlas = Path.GetDirectoryName (BundleResource.GetVirtualProjectPath (ProjectDir, item, !string.IsNullOrEmpty(SessionId)));
2016-04-21 16:40:25 +03:00
List<ITaskItem> items;
if (!atlases.TryGetValue (atlas, out items)) {
items = new List<ITaskItem> ();
atlases.Add (atlas, items);
}
items.Add (item);
}
foreach (var atlas in atlases.Keys)
yield return new TaskItem (atlas);
yield break;
}
}
}