зеркало из https://github.com/mono/SkiaSharp.git
Added members to decode a particular frame
- binding - tests
This commit is contained in:
Родитель
59fa0b1205
Коммит
38413b6377
|
@ -925,6 +925,12 @@ namespace SkiaSharp
|
|||
FrameIndex = 0;
|
||||
HasPriorFrame = false;
|
||||
}
|
||||
public SKCodecOptions (int frameIndex, bool hasPriorFrame) {
|
||||
ZeroInitialized = SKZeroInitialized.No;
|
||||
Subset = null;
|
||||
FrameIndex = frameIndex;
|
||||
HasPriorFrame = hasPriorFrame;
|
||||
}
|
||||
public SKZeroInitialized ZeroInitialized { get; set; }
|
||||
public SKRectI? Subset { get; set; }
|
||||
public bool HasSubset => Subset != null;
|
||||
|
@ -932,6 +938,22 @@ namespace SkiaSharp
|
|||
public bool HasPriorFrame { get; set; }
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct SKCodecFrameInfo {
|
||||
private IntPtr requiredFrame;
|
||||
private IntPtr duration;
|
||||
|
||||
public int RequiredFrame {
|
||||
get { return (int)requiredFrame; }
|
||||
set { requiredFrame = (IntPtr)value; }
|
||||
}
|
||||
|
||||
public int Duration {
|
||||
get { return (int)duration; }
|
||||
set { duration = (IntPtr)value; }
|
||||
}
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct SKPoint {
|
||||
private float x, y;
|
||||
|
@ -2922,7 +2944,6 @@ typeMask = Mask.Scale | Mask.RectStaysRect
|
|||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException (nameof (color));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -80,6 +80,19 @@ namespace SkiaSharp
|
|||
}
|
||||
}
|
||||
|
||||
public int RepetitionCount => SkiaApi.sk_codec_get_repetition_count (Handle);
|
||||
|
||||
public int FrameCount => SkiaApi.sk_codec_get_frame_count (Handle);
|
||||
|
||||
public SKCodecFrameInfo[] FrameInfo {
|
||||
get {
|
||||
var length = SkiaApi.sk_codec_get_frame_count (Handle);
|
||||
var info = new SKCodecFrameInfo [length];
|
||||
SkiaApi.sk_codec_get_frame_info (Handle, info);
|
||||
return info;
|
||||
}
|
||||
}
|
||||
|
||||
public SKCodecResult GetPixels (out byte[] pixels)
|
||||
{
|
||||
return GetPixels (Info, out pixels);
|
||||
|
@ -107,6 +120,12 @@ namespace SkiaSharp
|
|||
}
|
||||
}
|
||||
|
||||
public unsafe SKCodecResult GetPixels (SKImageInfo info, IntPtr pixels, int rowBytes, SKCodecOptions options)
|
||||
{
|
||||
var colorTableCount = 0;
|
||||
return GetPixels (info, pixels, rowBytes, options, IntPtr.Zero, ref colorTableCount);
|
||||
}
|
||||
|
||||
public unsafe SKCodecResult GetPixels (SKImageInfo info, IntPtr pixels, int rowBytes, SKCodecOptions options, IntPtr colorTable, ref int colorTableCount)
|
||||
{
|
||||
if (pixels == IntPtr.Zero)
|
||||
|
@ -125,6 +144,12 @@ namespace SkiaSharp
|
|||
return SkiaApi.sk_codec_get_pixels (Handle, ref info, pixels, (IntPtr)rowBytes, ref nativeOptions, colorTable, ref colorTableCount);
|
||||
}
|
||||
|
||||
public SKCodecResult GetPixels (SKImageInfo info, IntPtr pixels, SKCodecOptions options)
|
||||
{
|
||||
var colorTableCount = 0;
|
||||
return GetPixels (info, pixels, options, IntPtr.Zero, ref colorTableCount);
|
||||
}
|
||||
|
||||
public SKCodecResult GetPixels (SKImageInfo info, IntPtr pixels, SKCodecOptions options, IntPtr colorTable, ref int colorTableCount)
|
||||
{
|
||||
return GetPixels (info, pixels, info.RowBytes, options, colorTable, ref colorTableCount);
|
||||
|
|
|
@ -1059,6 +1059,12 @@ namespace SkiaSharp
|
|||
public extern static SKCodecResult sk_codec_start_incremental_decode(sk_codec_t codec, ref SKImageInfo info, IntPtr pixels, IntPtr rowBytes, IntPtr optionsZero, IntPtr ctableZero, IntPtr ctableCountZero);
|
||||
[DllImport(SKIA, CallingConvention = CallingConvention.Cdecl)]
|
||||
public extern static SKCodecResult sk_codec_incremental_decode(sk_codec_t codec, out int rowsDecoded);
|
||||
[DllImport(SKIA, CallingConvention = CallingConvention.Cdecl)]
|
||||
public extern static int sk_codec_get_repetition_count(sk_codec_t codec);
|
||||
[DllImport(SKIA, CallingConvention = CallingConvention.Cdecl)]
|
||||
public extern static int sk_codec_get_frame_count(sk_codec_t codec);
|
||||
[DllImport(SKIA, CallingConvention = CallingConvention.Cdecl)]
|
||||
public extern static void sk_codec_get_frame_info(sk_codec_t codec, [Out] SKCodecFrameInfo[] frameInfo);
|
||||
|
||||
// Bitmap
|
||||
[DllImport(SKIA, CallingConvention = CallingConvention.Cdecl)]
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 559dead6d57212457b989be1eae6c13ac8d43274
|
||||
Subproject commit 707ac58f0208b7bc8fb7cc008f4f8003be39b870
|
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 15 KiB |
|
@ -24,6 +24,7 @@ namespace SkiaSharpSample
|
|||
public static Stream NinePatch => Embedded.Load("nine-patch.png");
|
||||
public static Stream BabyTux => Embedded.Load("baby_tux.webp");
|
||||
public static Stream LogosSvg => Embedded.Load("logos.svg");
|
||||
public static Stream AnimatedHeartGif => Embedded.Load("animated-heart.gif");
|
||||
}
|
||||
|
||||
public static class Fonts
|
||||
|
|
|
@ -59,15 +59,14 @@
|
|||
<ItemGroup>
|
||||
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Media\adobe-dng.dng" />
|
||||
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Media\baby_tux.webp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Media\baboon.png" />
|
||||
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Media\color-wheel.png" />
|
||||
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Media\embedded-font.ttf" />
|
||||
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Media\nine-patch.png" />
|
||||
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Media\logos.svg" />
|
||||
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Media\animated-heart.gif" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="$(MSBuildThisFileDirectory)Media\content-font.ttf" />
|
||||
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Media\logos.svg" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -175,6 +175,10 @@
|
|||
<Link>images\logos.svg</Link>
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="..\..\samples\SkiaSharpSample.Shared\Media\animated-heart.gif">
|
||||
<Link>images\animated-heart.gif</Link>
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
|
@ -31,6 +31,47 @@ namespace SkiaSharp.Tests
|
|||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetGifFrames ()
|
||||
{
|
||||
const int FrameCount = 16;
|
||||
|
||||
var stream = new SKFileStream (Path.Combine (PathToImages, "animated-heart.gif"));
|
||||
using (var codec = SKCodec.Create (stream)) {
|
||||
Assert.AreEqual (-1, codec.RepetitionCount);
|
||||
|
||||
var frameInfos = codec.FrameInfo;
|
||||
Assert.AreEqual (FrameCount, frameInfos.Length);
|
||||
|
||||
Assert.AreEqual (-1, frameInfos [0].RequiredFrame);
|
||||
|
||||
var cachedFrames = new SKBitmap [FrameCount];
|
||||
var info = new SKImageInfo (codec.Info.Width, codec.Info.Height);
|
||||
|
||||
var decode = new Action<SKBitmap, bool, int> ((bm, cached, index) => {
|
||||
if (cached) {
|
||||
var requiredFrame = frameInfos [index].RequiredFrame;
|
||||
if (requiredFrame != -1) {
|
||||
Assert.IsTrue (cachedFrames [requiredFrame].CopyTo (bm));
|
||||
}
|
||||
}
|
||||
var opts = new SKCodecOptions (index, cached);
|
||||
var result = codec.GetPixels (info, bm.GetPixels (), opts);
|
||||
Assert.AreEqual (SKCodecResult.Success, result);
|
||||
});
|
||||
|
||||
for (var i = 0; i < FrameCount; i++) {
|
||||
var cachedFrame = cachedFrames [i] = new SKBitmap (info);
|
||||
decode (cachedFrame, true, i);
|
||||
|
||||
var uncachedFrame = new SKBitmap (info);
|
||||
decode (uncachedFrame, false, i);
|
||||
|
||||
CollectionAssert.AreEqual (cachedFrame.Bytes, uncachedFrame.Bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetEncodedInfo ()
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче