summaryrefslogtreecommitdiff
path: root/core/fxcodec/gif/cfx_gif.h
blob: bba2d9c9119d13e57c18cb994bd1317404fc9bbb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_FXCODEC_GIF_CFX_GIF_H_
#define CORE_FXCODEC_GIF_CFX_GIF_H_

#include <memory>
#include <vector>

class CFX_GifContext;

extern const char kGifSignature87[];
extern const char kGifSignature89[];

#define GIF_SIG_EXTENSION 0x21
#define GIF_SIG_IMAGE 0x2C
#define GIF_SIG_TRAILER 0x3B
#define GIF_BLOCK_GCE 0xF9
#define GIF_BLOCK_PTE 0x01
#define GIF_BLOCK_CE 0xFE
#define GIF_BLOCK_TERMINAL 0x00
#define GIF_MAX_LZW_EXP 12
#define GIF_MAX_LZW_CODE 4096
#define GIF_DATA_BLOCK 255
#define GIF_D_STATUS_SIG 0x01
#define GIF_D_STATUS_TAIL 0x02
#define GIF_D_STATUS_EXT 0x03
#define GIF_D_STATUS_EXT_CE 0x05
#define GIF_D_STATUS_EXT_GCE 0x06
#define GIF_D_STATUS_EXT_PTE 0x07
#define GIF_D_STATUS_EXT_UNE 0x08
#define GIF_D_STATUS_IMG_INFO 0x09
#define GIF_D_STATUS_IMG_DATA 0x0A

#pragma pack(1)
struct CFX_GifGlobalFlags {
  uint8_t pal_bits : 3;
  uint8_t sort_flag : 1;
  uint8_t color_resolution : 3;
  uint8_t global_pal : 1;
};

struct CFX_GifLocalFlags {
  uint8_t pal_bits : 3;
  uint8_t reserved : 2;
  uint8_t sort_flag : 1;
  uint8_t interlace : 1;
  uint8_t local_pal : 1;
};

struct CFX_GifHeader {
  char signature[6];
};

struct CFX_GifLocalScreenDescriptor {
  uint16_t width;
  uint16_t height;
  CFX_GifGlobalFlags global_flags;
  uint8_t bc_index;
  uint8_t pixel_aspect;
};

struct CFX_CFX_GifImageInfo {
  uint16_t left;
  uint16_t top;
  uint16_t width;
  uint16_t height;
  CFX_GifLocalFlags local_flags;
};

struct CFX_GifControlExtensionFlags {
  uint8_t transparency : 1;
  uint8_t user_input : 1;
  uint8_t disposal_method : 3;
  uint8_t reserved : 3;
};

struct CFX_GifGraphicControlExtension {
  uint8_t block_size;
  CFX_GifControlExtensionFlags gce_flags;
  uint16_t delay_time;
  uint8_t trans_index;
};

struct CFX_GifPlainTextExtension {
  uint8_t block_size;
  uint16_t grid_left;
  uint16_t grid_top;
  uint16_t grid_width;
  uint16_t grid_height;
  uint8_t char_width;
  uint8_t char_height;
  uint8_t fc_index;
  uint8_t bc_index;
};

struct GifApplicationExtension {
  uint8_t block_size;
  uint8_t app_identify[8];
  uint8_t app_authentication[3];
};

struct CFX_GifPalette {
  uint8_t r;
  uint8_t g;
  uint8_t b;
};
#pragma pack()

enum class CFX_GifDecodeStatus {
  Error,
  Success,
  Unfinished,
  InsufficientDestSize,  // Only used internally by CGifLZWDecoder::Decode()
};

typedef struct {
  std::unique_ptr<CFX_GifGraphicControlExtension> image_GCE;
  std::vector<CFX_GifPalette> local_palettes;
  std::vector<uint8_t> row_buffer;
  CFX_CFX_GifImageInfo image_info;
  uint8_t local_pallette_exp;
  uint8_t code_exp;
  uint32_t data_pos;
  int32_t row_num;
} CFX_GifImage;

#endif  // CORE_FXCODEC_GIF_CFX_GIF_H_