public WicImageContainer(IWICBitmapDecoder *dec, SafeHandle?src, FileFormat fmt)
        {
            WicDecoder = dec;
            handle     = src;

            uint fcount;

            HRESULT.Check(dec->GetFrameCount(&fcount));
            FrameCount      = (int)fcount;
            ContainerFormat = fmt;
        }
        public static WicImageContainer Create(IWICBitmapDecoder *dec, SafeHandle?src = null)
        {
            var guid = default(Guid);

            HRESULT.Check(dec->GetContainerFormat(&guid));

            var fmt = WicImageDecoder.FormatMap.GetValueOrDefault(guid, FileFormat.Unknown);

            if (fmt == FileFormat.Gif)
            {
                return(new WicGifContainer(dec, src));
            }

            return(new WicImageContainer(dec, src, fmt));
        }
        public WicGifContainer(IWICBitmapDecoder *dec, SafeHandle?src) : base(dec, src, FileFormat.Gif)
        {
            using var meta = default(ComPtr <IWICMetadataQueryReader>);
            HRESULT.Check(dec->GetMetadataQueryReader(meta.GetAddressOf()));

            ScreenWidth  = meta.GetValueOrDefault <ushort>(Wic.Metadata.Gif.LogicalScreenWidth);
            ScreenHeight = meta.GetValueOrDefault <ushort>(Wic.Metadata.Gif.LogicalScreenHeight);

            if (meta.GetValueOrDefault <bool>(Wic.Metadata.Gif.GlobalPaletteFlag))
            {
                using var pal = default(ComPtr <IWICPalette>);
                HRESULT.Check(Wic.Factory->CreatePalette(pal.GetAddressOf()));
                HRESULT.Check(dec->CopyPalette(pal));

                uint pcc;
                HRESULT.Check(pal.Get()->GetColorCount(&pcc));

                uint idx = meta.GetValueOrDefault <byte>(Wic.Metadata.Gif.BackgroundColorIndex);
                if (idx < pcc)
                {
                    using var buff = new PoolBuffer <uint>((int)pcc);
                    fixed(uint *pbuff = buff.Span)
                    {
                        HRESULT.Check(pal.Get()->GetColors(pcc, pbuff, &pcc));
                        BackgroundColor = pbuff[idx];
                    }
                }
            }

            var sbuff  = (Span <byte>) stackalloc byte[16];
            var appext = meta.GetValueOrDefault(Wic.Metadata.Gif.AppExtension, sbuff);

            if (appext.Length == 11 && netscape2_0.SequenceEqual(appext) || animexts1_0.SequenceEqual(appext))
            {
                var appdata = meta.GetValueOrDefault(Wic.Metadata.Gif.AppExtensionData, sbuff);
                if (appdata.Length >= 4 && appdata[0] >= 3 && appdata[1] == 1)
                {
                    LoopCount = BinaryPrimitives.ReadUInt16LittleEndian(appdata.Slice(2));
                }
            }
        }
 public int CreateFastMetadataEncoderFromDecoder([NativeTypeName("IWICBitmapDecoder *")] IWICBitmapDecoder *pIDecoder, [NativeTypeName("IWICFastMetadataEncoder **")] IWICFastMetadataEncoder **ppIFastEncoder)
 {
     return(((delegate * unmanaged[Stdcall] < IWICImagingFactory2 *, IWICBitmapDecoder *, IWICFastMetadataEncoder **, int >)(lpVtbl[24]))((IWICImagingFactory2 *)Unsafe.AsPointer(ref this), pIDecoder, ppIFastEncoder));
 }
Exemple #5
0
 public HRESULT CreateFastMetadataEncoderFromDecoder(IWICBitmapDecoder *pIDecoder, IWICFastMetadataEncoder **ppIFastEncoder)
 {
     return(((delegate * unmanaged <IWICComponentFactory *, IWICBitmapDecoder *, IWICFastMetadataEncoder **, int>)(lpVtbl[24]))((IWICComponentFactory *)Unsafe.AsPointer(ref this), pIDecoder, ppIFastEncoder));
 }