[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:
Rolf Bjarne Kvinge 2019-12-19 15:21:09 +01:00 коммит произвёл GitHub
Родитель 01f6710a15
Коммит cf97aaf971
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
10 изменённых файлов: 156 добавлений и 8 удалений

Просмотреть файл

@ -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">

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.3 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичные данные
msbuild/tests/Xamarin.iOS.Tasks.Tests/Resources/iTunesArtwork.jpg Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 9.0 KiB

Двоичные данные
msbuild/tests/Xamarin.iOS.Tasks.Tests/Resources/iTunesArtwork.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 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>