syntax = "proto2"; // Proto description of the gif format. // Refer to: https://www.fileformat.info/format/gif/egff.htm // https://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp // TODO: Verify if this is correct message LogicalScreenDescriptor { required uint32 ScreenWidth = 1; required uint32 ScreenHeight= 2; required uint32 Packed = 3; required uint32 BackgroundColor = 4; required uint32 AspectRatio = 5; } message GlobalColorTable { required bytes colors = 1; } message ImageDescriptor { required uint32 Seperator =1; required uint32 Left =2; required uint32 Top = 3; required uint32 Width = 4; required uint32 Height = 5; required uint32 Packed = 6; } message GraphicControlExtension { required uint32 Packed = 1; required uint32 DelayTime = 2; required uint32 transparentColorIndex = 3; } message PlainTextExtension { repeated SubBlock subs = 1; optional GraphicControlExtension gcExt = 2; } message LocalColorTable { required bytes colors = 1; } message SubBlock { required uint32 len = 1; required bytes data = 2; } message ImageData { required uint32 lzw = 1; repeated SubBlock subs = 2; } message BasicChunk { required ImageDescriptor imDescriptor =1; required LocalColorTable lct = 2; required ImageData img = 3; optional GraphicControlExtension gcExt = 4; } message ApplicationExtension { required fixed64 appid = 1; repeated SubBlock subs = 2; } message CommentExtension { repeated SubBlock subs = 1; } message Header { enum Version { ENA = 1; ESA = 2; INV = 3; } required Version ver = 1; } message Trailer {} message ImageChunk { oneof chunk_oneof { BasicChunk basic = 1; PlainTextExtension plaintext = 2; ApplicationExtension appExt = 3; CommentExtension comExt = 4; } } message GifProto { required Header header = 1; required LogicalScreenDescriptor lsd = 2; // Instead of making GCT optional here, we condition its visit on LSD's packed byte // in the converter required GlobalColorTable gct = 3; repeated ImageChunk chunks = 4; required Trailer trailer = 5; } package gifProtoFuzzer;