8 #include "../Geometry/Size.h"
9 #include "../Containers/Image.h"
12 struct png_struct_def;
15 namespace Gorgon {
namespace Encoding {
23 void (*Read)(png_struct_def *p,
unsigned char *buf,
size_t size);
28 void (*Write)(png_struct_def *p,
unsigned char *buf,
size_t size);
33 void ReadVector(png_struct_def *p,
unsigned char *buf,
size_t size);
35 class VectorReader :
public Reader {
37 VectorReader(
const std::vector<Byte> &Buf) : Buf(Buf), BufPos(0) {
41 const std::vector<Byte> &Buf;
44 inline Reader *ReadyReadStruct(
const std::vector<Byte> &vec) {
45 return new VectorReader(vec);
47 inline unsigned long long GetReadSize(
const std::vector<Byte> &vec) {
50 inline void VectorSeek(Reader *r,
long long addr) {
51 VectorReader *reader=(VectorReader *)r;
52 reader->BufPos+=(unsigned)addr;
54 inline std::function<void(Reader*,
long long)> SeekFn(
const std::vector<Byte> &vec) {
59 void WriteVector(png_struct_def *p,
unsigned char *buf,
size_t size);
60 class VectorWriter :
public Writer {
62 VectorWriter(std::vector<Byte> &Buf) : Buf(Buf) {
66 std::vector<Byte> &Buf;
68 inline Writer *ReadyWriteStruct(std::vector<Byte> &vec) {
69 return new VectorWriter(vec);
74 ArrayWrapper() =
default;
75 ArrayWrapper(
const Byte *data, std::size_t size) : data(data), size(size) { }
77 const Byte *data =
nullptr;
83 void ReadArray(png_struct_def *p,
unsigned char *buf,
size_t size);
85 class ArrayReader :
public Reader {
87 ArrayReader(ArrayWrapper Buf) : Buf(Buf), BufPos(0) {
94 inline Reader *ReadyReadStruct(ArrayWrapper f) {
95 return new ArrayReader(f);
97 inline unsigned long long GetReadSize(
const ArrayWrapper &vec) {
100 inline void ArraySeek(Reader *r,
long long addr) {
101 ArrayReader *reader=(ArrayReader *)r;
102 reader->BufPos+=(unsigned)addr;
104 inline std::function<void(Reader*,
long long)> SeekFn(
const ArrayWrapper &) {
111 void ReadFile(png_struct_def *p,
unsigned char *buf,
size_t size);
112 unsigned long long GetReadSize(std::istream &f);
113 class FileReader :
public Reader {
115 FileReader(std::istream &Buf) : Buf(Buf) {
121 inline Reader *ReadyReadStruct(std::istream &f) {
122 return new FileReader(f);
124 inline unsigned long long GetReadSize(std::istream &f) {
128 f.seekg(c, std::ios::beg);
131 inline void FileSeek(Reader *r,
long long addr) {
132 FileReader *reader=(FileReader *)r;
133 reader->Buf.seekg(addr, std::ios::cur);
135 inline std::function<void(Reader*,
long long)> SeekFn(std::istream &vec) {
140 void WriteFile(png_struct_def *p,
unsigned char *buf,
size_t size);
141 class FileWriter :
public Writer {
143 FileWriter(std::ostream &Buf) : Buf(Buf) {
149 inline Writer *ReadyWriteStruct(std::ostream &f) {
150 return new FileWriter(f);
164 encode(input, png::ReadyWriteStruct(output), replace_colormode);
170 std::ofstream file(output, std::ios::binary);
171 if(!file.is_open())
throw std::runtime_error(
"Cannot open file");
172 encode(input, png::ReadyWriteStruct(file), replace_colormode);
180 encode(input, png::ReadyWriteStruct(output), replace_colormode);
187 return decode(png::ReadyReadStruct(input), output);
194 std::ifstream file(input, std::ios::binary);
195 if(!file.is_open())
throw std::runtime_error(
"Cannot open file");
196 return decode(png::ReadyReadStruct(file), output);
203 return decode(png::ReadyReadStruct(input), output);
210 return decode(png::ReadyReadStruct(png::ArrayWrapper(input, size)), output);