[msbuild] Don't use gdk-sharp, use native functions instead. (#7623)
* [msbuild] Don't use gdk-sharp, use native functions instead. There's no netstandard version of gdk-sharp. * Don't require the source checkout to be named 'xamarin-macios'.
This commit is contained in:
Родитель
01f6710a15
Коммит
cf97aaf971
|
@ -2,8 +2,7 @@
|
|||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Gdk;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
using Microsoft.Build.Framework;
|
||||
using Microsoft.Build.Utilities;
|
||||
|
@ -73,15 +72,63 @@ namespace Xamarin.iOS.Tasks
|
|||
}
|
||||
}
|
||||
|
||||
const string CoreGraphicsLibrary = "/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics";
|
||||
|
||||
[DllImport (CoreGraphicsLibrary)]
|
||||
extern static /* CGDataProviderRef */ IntPtr CGDataProviderCreateWithFilename (/* const char* */ string filename);
|
||||
|
||||
[DllImport (CoreGraphicsLibrary)]
|
||||
extern static void CGDataProviderRelease (/* CGDataProviderRef */ IntPtr provider);
|
||||
|
||||
[DllImport (CoreGraphicsLibrary)]
|
||||
extern static IntPtr CGImageGetWidth (/* CGImageRef */ IntPtr image);
|
||||
|
||||
[DllImport (CoreGraphicsLibrary)]
|
||||
extern static IntPtr CGImageGetHeight (/* CGImageRef */ IntPtr image);
|
||||
|
||||
[DllImport (CoreGraphicsLibrary)]
|
||||
extern static /* CGImageRef */ IntPtr CGImageCreateWithJPEGDataProvider (/* CGDataProviderRef */ IntPtr source, /* CGFloat[] */ IntPtr decode, bool shouldInterpolate, CGColorRenderingIntent intent);
|
||||
|
||||
[DllImport (CoreGraphicsLibrary)]
|
||||
extern static void CGImageRelease (/* CGImageRef */ IntPtr image);
|
||||
|
||||
// untyped enum -> CGColorSpace.h
|
||||
enum CGColorRenderingIntent
|
||||
{
|
||||
Default,
|
||||
AbsoluteColorimetric,
|
||||
RelativeColorimetric,
|
||||
Perceptual,
|
||||
Saturation,
|
||||
};
|
||||
|
||||
static bool GetJpgImageSize (string path, out int width, out int height)
|
||||
{
|
||||
width = height = -1;
|
||||
try {
|
||||
var type = Pixbuf.GetFileInfo (path, out width, out height);
|
||||
return type != null && type.Name == "jpeg";
|
||||
var provider = CGDataProviderCreateWithFilename (path);
|
||||
if (provider == IntPtr.Zero)
|
||||
return false;
|
||||
|
||||
try {
|
||||
var img = CGImageCreateWithJPEGDataProvider (provider, IntPtr.Zero, false, CGColorRenderingIntent.Default);
|
||||
if (img == IntPtr.Zero)
|
||||
return false;
|
||||
|
||||
try {
|
||||
width = (int) CGImageGetWidth (img);
|
||||
height = (int) CGImageGetHeight (img);
|
||||
} finally {
|
||||
CGImageRelease (img);
|
||||
}
|
||||
} finally {
|
||||
CGDataProviderRelease (provider);
|
||||
}
|
||||
} catch {
|
||||
width = height = -1;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool Execute ()
|
||||
|
@ -114,7 +161,7 @@ namespace Xamarin.iOS.Tasks
|
|||
logicalName = width == 1024 ? "iTunesArtwork@2x" : "iTunesArtwork";
|
||||
|
||||
if (!artwork.Add (logicalName)) {
|
||||
Log.LogError (null, null, null, path, 0, 0, 0, 0, "Multiple iTunesArtwork files with the same dimensions detected.");
|
||||
Log.LogError (null, null, null, path, 0, 0, 0, 0, "Multiple iTunesArtwork files with the same dimensions detected ({0}x{1}) for '{2}'.", width, height, path);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,8 +39,6 @@
|
|||
<Reference Include="Microsoft.Build.Utilities.Core" HintPath="$(MSBuildBinPath)\Microsoft.Build.Utilities.Core.dll" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="gdk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
|
||||
<Reference Include="glib-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\external\Xamarin.MacDev\Xamarin.MacDev\Xamarin.MacDev.csproj">
|
||||
|
|
Двоичные данные
msbuild/tests/Xamarin.iOS.Tasks.Tests/Resources/iTunesArtwork-invalid-size.jpg
Normal file
Двоичные данные
msbuild/tests/Xamarin.iOS.Tasks.Tests/Resources/iTunesArtwork-invalid-size.jpg
Normal file
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 4.3 KiB |
Двоичные данные
msbuild/tests/Xamarin.iOS.Tasks.Tests/Resources/iTunesArtwork-invalid-size.png
Normal file
Двоичные данные
msbuild/tests/Xamarin.iOS.Tasks.Tests/Resources/iTunesArtwork-invalid-size.png
Normal file
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 20 KiB |
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 9.0 KiB |
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 106 KiB |
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 26 KiB |
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 273 KiB |
|
@ -0,0 +1,84 @@
|
|||
using System.IO;
|
||||
using System.Reflection;
|
||||
|
||||
using Microsoft.Build.Utilities;
|
||||
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Xamarin.iOS.Tasks {
|
||||
[TestFixture]
|
||||
public class CollectITunesArtworkTaskTests : TestBase {
|
||||
[Test]
|
||||
public void UnknownImageFormat ()
|
||||
{
|
||||
var task = CreateTask<CollectITunesArtwork> ();
|
||||
task.ITunesArtwork = new TaskItem [] { new TaskItem (Assembly.GetExecutingAssembly ().Location) };
|
||||
|
||||
Assert.IsFalse (task.Execute (), "Execute failure");
|
||||
Assert.AreEqual (1, Engine.Logger.ErrorEvents.Count, "ErrorCount");
|
||||
Assert.That (Engine.Logger.ErrorEvents [0].Message, Does.Match ("Error loading '.*/Xamarin.iOS.Tasks.Tests.dll': Unknown image format."), "ErrorMessage");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void InexistentFile ()
|
||||
{
|
||||
var task = CreateTask<CollectITunesArtwork> ();
|
||||
task.ITunesArtwork = new TaskItem [] { new TaskItem ("this-file-does-not-exist.tiff") };
|
||||
|
||||
Assert.IsFalse (task.Execute (), "Execute failure");
|
||||
Assert.AreEqual (1, Engine.Logger.ErrorEvents.Count, "ErrorCount");
|
||||
Assert.That (Engine.Logger.ErrorEvents [0].Message, Does.Match ("'.*/this-file-does-not-exist.tiff' not found."), "ErrorMessage");
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase ("jpg")]
|
||||
[TestCase ("png")]
|
||||
public void InvalidSize (string extension)
|
||||
{
|
||||
var task = CreateTask<CollectITunesArtwork> ();
|
||||
task.ITunesArtwork = new TaskItem [] { new TaskItem (Path.Combine ("..", "bin", "Resources", "iTunesArtwork-invalid-size." + extension)) };
|
||||
|
||||
Assert.IsFalse (task.Execute (), "Execute failure");
|
||||
Assert.AreEqual (1, Engine.Logger.ErrorEvents.Count, "ErrorCount");
|
||||
Assert.That (Engine.Logger.ErrorEvents [0].Message, Does.Match ($"Invalid iTunesArtwork dimensions [(]124x124[)] for '.*/iTunesArtwork-invalid-size.{extension}'."), "ErrorMessage");
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase ("", "512x512")]
|
||||
[TestCase ("@2x", "1024x1024")]
|
||||
public void MultipleSameSize (string size, string dimension)
|
||||
{
|
||||
var task = CreateTask<CollectITunesArtwork> ();
|
||||
task.ITunesArtwork = new TaskItem [] {
|
||||
new TaskItem (Path.Combine ("..", "bin", "Resources", $"iTunesArtwork{size}.jpg")),
|
||||
new TaskItem (Path.Combine ("..", "bin", "Resources", $"iTunesArtwork{size}.png")),
|
||||
};
|
||||
|
||||
Assert.IsFalse (task.Execute (), "Execute failure");
|
||||
Assert.AreEqual (1, Engine.Logger.ErrorEvents.Count, "ErrorCount");
|
||||
Assert.That (Engine.Logger.ErrorEvents [0].Message, Does.Match ($"Multiple iTunesArtwork files with the same dimensions detected [(]{dimension}[)] for '.*/msbuild/tests/bin/Resources/iTunesArtwork{size}.png'."), "ErrorMessage");
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase ("jpg")]
|
||||
[TestCase ("png")]
|
||||
public void Valid (string extension)
|
||||
{
|
||||
var task = CreateTask<CollectITunesArtwork> ();
|
||||
task.ITunesArtwork = new TaskItem [] {
|
||||
new TaskItem (Path.Combine ("..", "bin", "Resources", $"iTunesArtwork.{extension}")),
|
||||
new TaskItem (Path.Combine ("..", "bin", "Resources", $"iTunesArtwork@2x.{extension}")),
|
||||
};
|
||||
|
||||
Assert.IsTrue (task.Execute (), "Execute");
|
||||
Assert.AreEqual (0, Engine.Logger.ErrorEvents.Count, "ErrorCount");
|
||||
Assert.AreEqual (2, task.ITunesArtworkWithLogicalNames.Length, "ITunesArtworkWithLogicalNames.Count");
|
||||
for (var i = 0; i < task.ITunesArtworkWithLogicalNames.Length; i++) {
|
||||
Assert.AreEqual (Path.GetFileNameWithoutExtension (task.ITunesArtwork [i].GetMetadata ("FullPath")), task.ITunesArtworkWithLogicalNames [i].GetMetadata ("LogicalName"), $"LogicalName #{i}");
|
||||
Assert.AreEqual ("false", task.ITunesArtworkWithLogicalNames [i].GetMetadata ("Optimize"), $"Optimize #{i}");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -109,6 +109,7 @@
|
|||
<Compile Include="ProjectsTests\NativeReferencesNoEmbedding.cs" />
|
||||
<Compile Include="FrameworkListTest.cs" />
|
||||
<Compile Include="VerbosityTest.cs" />
|
||||
<Compile Include="TaskTests\CollectITunesArtworkTaskTests.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
|
@ -126,5 +127,23 @@
|
|||
<None Include="Resources\profile.mobileprovision">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Resources\iTunesArtwork.jpg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Resources\iTunesArtwork%402x.jpg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Resources\iTunesArtwork%402x.png">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Resources\iTunesArtwork.png">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Resources\iTunesArtwork-invalid-size.png">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Resources\iTunesArtwork-invalid-size.jpg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
Загрузка…
Ссылка в новой задаче