-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
EasyGifReader.h
124 lines (109 loc) · 3.52 KB
/
EasyGifReader.h
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
#pragma once
#include <cstddef>
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//
//
// EASY GIF READER v1.1 by Viktor Chlumsky (c) 2021 - 2024
// -------------------------------------------------------
//
// This is a single-class C++ library that aims to simplify reading an animated GIF file.
// It is built on top of and depends on giflib.
//
// MIT license
// https://github.com/Chlumsky/EasyGifReader
//
class EasyGifReader {
struct Internal;
struct FrameBounds;
public:
typedef unsigned char PixelComponent;
enum class Error {
UNKNOWN,
INVALID_OPERATION,
OPEN_FAILED,
READ_FAILED,
INVALID_FILENAME,
NOT_A_GIF_FILE,
INVALID_GIF_FILE,
OUT_OF_MEMORY,
CLOSE_FAILED,
NOT_READABLE,
IMAGE_DEFECT,
UNEXPECTED_EOF
};
struct FrameDuration {
int centiseconds;
int milliseconds() const;
double seconds() const;
FrameDuration &operator+=(FrameDuration other);
FrameDuration &operator-=(FrameDuration other);
FrameDuration operator+(FrameDuration other) const;
FrameDuration operator-(FrameDuration other) const;
bool operator==(FrameDuration other) const;
bool operator!=(FrameDuration other) const;
bool operator<(FrameDuration other) const;
bool operator>(FrameDuration other) const;
bool operator<=(FrameDuration other) const;
bool operator>=(FrameDuration other) const;
};
class Frame {
public:
Frame();
Frame(const Frame &orig);
Frame(Frame &&orig);
~Frame();
Frame &operator=(const Frame &orig);
Frame &operator=(Frame &&orig);
const PixelComponent *pixels() const;
int width() const;
int height() const;
FrameDuration duration() const;
FrameDuration rawDuration() const;
protected:
const Internal *parentData;
int index;
int w, h;
void nextFrame();
private:
PixelComponent *pixelBuffer;
int disposal;
int delay;
PixelComponent *row(int y);
PixelComponent *corner(const FrameBounds &bounds);
};
class FrameIterator : public Frame {
public:
enum Position {
BEGIN,
END,
LOOP_END
};
explicit FrameIterator(const EasyGifReader *decoder = nullptr, Position position = BEGIN);
FrameIterator &operator++();
void operator++(int);
bool operator==(const FrameIterator &other) const;
bool operator!=(const FrameIterator &other) const;
const Frame &operator*() const;
const Frame *operator->() const;
void rewind();
};
static EasyGifReader openFile(const char *filename);
static EasyGifReader openMemory(const void *buffer, std::size_t size);
static EasyGifReader openCustom(std::size_t (*readFunction)(void *outData, std::size_t size, void *userPtr), void *userPtr);
EasyGifReader();
EasyGifReader(const EasyGifReader &) = delete;
EasyGifReader(EasyGifReader &&orig);
~EasyGifReader();
EasyGifReader &operator=(const EasyGifReader &) = delete;
EasyGifReader &operator=(EasyGifReader &&orig);
int width() const;
int height() const;
int frameCount() const;
int repeatCount() const;
bool repeatsInfinitely() const;
FrameIterator begin() const;
FrameIterator end() const;
FrameIterator loopEnd() const;
private:
Internal *data;
explicit EasyGifReader(Internal *data);
};