You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.2 KiB
57 lines
1.2 KiB
using System.Text; |
|
|
|
namespace StabilityMatrix.Core.Helper.Webp; |
|
|
|
public class WebpReader(Stream stream) : BinaryReader(stream, Encoding.ASCII, true) |
|
{ |
|
private uint headerFileSize; |
|
|
|
public bool GetIsAnimatedFlag() |
|
{ |
|
ReadHeader(); |
|
|
|
while (BaseStream.Position < headerFileSize) |
|
{ |
|
if (ReadVoidChunk() is "ANMF" or "ANIM") |
|
{ |
|
return true; |
|
} |
|
} |
|
|
|
return false; |
|
} |
|
|
|
private void ReadHeader() |
|
{ |
|
// RIFF |
|
var riff = ReadBytes(4); |
|
if (!riff.SequenceEqual([.."RIFF"u8])) |
|
{ |
|
throw new InvalidDataException("Invalid RIFF header"); |
|
} |
|
|
|
// Size: uint32 |
|
headerFileSize = ReadUInt32(); |
|
|
|
// WEBP |
|
var webp = ReadBytes(4); |
|
if (!webp.SequenceEqual([.."WEBP"u8])) |
|
{ |
|
throw new InvalidDataException("Invalid WEBP header"); |
|
} |
|
} |
|
|
|
// Read a single chunk and discard its contents |
|
private string ReadVoidChunk() |
|
{ |
|
// FourCC: 4 bytes in ASCII |
|
var result = ReadBytes(4); |
|
|
|
// Size: uint32 |
|
var size = ReadUInt32(); |
|
|
|
BaseStream.Seek(size, SeekOrigin.Current); |
|
|
|
return Encoding.ASCII.GetString(result); |
|
} |
|
}
|
|
|