Gorgon Game Engine
JPEG.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <vector>
4 #include <Gorgon/Utils/Assert.h>
5 #include <fstream>
6 #include <functional>
7 
8 #include "../Types.h"
9 #include "../Containers/Image.h"
10 
11 extern "C" {
12  struct jpeg_decompress_struct;
13  struct jpeg_compress_struct;
14 }
15 
16 namespace Gorgon { namespace Encoding {
17 
18 
19  namespace jpg {
20 
21  class Reader;
22  class SourceManager;
23  class DestManager;
24 
25  class Reader {
26  public:
27  Reader();
28 
29  virtual void Attach(jpeg_decompress_struct &cinfo);
30 
31  virtual void init_source(jpeg_decompress_struct &cinfo) = 0;
32  virtual bool fill_input_buffer(jpeg_decompress_struct &cinfo) = 0;
33  virtual void skip_input_data(jpeg_decompress_struct &cinfo, long size);
34  virtual bool resync_to_restart(jpeg_decompress_struct &cinfo, int desired);
35  virtual void term_source(jpeg_decompress_struct &cinfo);
36 
37  SourceManager *manager;
38  virtual ~Reader();
39  };
40 
41  class StreamReader : public Reader {
42  public:
43  StreamReader(std::istream &file) : file(file) { }
44 
45  virtual void init_source(jpeg_decompress_struct &cinfo);
46  virtual bool fill_input_buffer(jpeg_decompress_struct &cinfo);
47  virtual void skip_input_data(jpeg_decompress_struct &cinfo, long size);
48 
49  protected:
50  std::istream &file;
51  Byte buffer[1024];
52  };
53 
54  class VectorReader : public Reader {
55  public:
56  VectorReader(std::vector<Byte> &data) : data(data) { }
57 
58  virtual void init_source(jpeg_decompress_struct &cinfo);
59  virtual bool fill_input_buffer(jpeg_decompress_struct &cinfo);
60 
61  protected:
62  std::vector<Byte> &data;
63  };
64 
65  class ArrayReader : public Reader {
66  public:
67  ArrayReader(Byte *data, std::size_t size) : data(data), size(size) { }
68 
69  virtual void init_source(jpeg_decompress_struct &cinfo);
70  virtual bool fill_input_buffer(jpeg_decompress_struct &cinfo);
71 
72  protected:
74  std::size_t size;
75  };
76 
77  class Writer {
78  public:
79  Writer();
80 
81  virtual void Attach(jpeg_compress_struct &cinfo);
82 
83  virtual void init_destination(jpeg_compress_struct &cinfo) = 0;
84  virtual bool empty_output_buffer(jpeg_compress_struct &cinfo) = 0;
85  virtual void term_destination(jpeg_compress_struct &cinfo) = 0;
86 
87  DestManager *manager;
88 
89  virtual ~Writer();
90  };
91 
92  class StreamWriter : public Writer {
93  public:
94  StreamWriter(std::ostream &out) : out(out) {}
95 
96  virtual void init_destination(jpeg_compress_struct &cinfo);
97  virtual bool empty_output_buffer(jpeg_compress_struct &cinfo);
98  virtual void term_destination(jpeg_compress_struct &cinfo);
99 
100  private:
101  std::ostream &out;
102  Byte buffer[1024];
103  };
104 
105  class VectorWriter : public Writer {
106  public:
107  VectorWriter(std::vector<Byte> &out) : out(out) {}
108 
109  virtual void init_destination(jpeg_compress_struct &cinfo);
110  virtual bool empty_output_buffer(jpeg_compress_struct &cinfo);
111  virtual void term_destination(jpeg_compress_struct &cinfo);
112 
113  private:
114  std::vector<Byte> &out;
115  };
116 
117  }
118 
119 
120 
121  //currently only works for RGB
122  //see LZMA for template class decisions
123  class JPEG {
124  public:
125 
126  JPEG() { }
127 
130  void Decode(std::istream &input, Containers::Image &output) {
131  jpg::StreamReader reader(input);
132 
133  decode(reader, output);
134  }
135 
138  void Decode(const std::string &input, Containers::Image &output) {
139  std::ifstream file(input, std::ios::binary);
140  if(!file.is_open()) throw std::runtime_error("Cannot open file");
141 
142  Decode(file, output);
143  }
144 
147  void Decode(std::vector<Byte> &input, Containers::Image &output) {
148  jpg::VectorReader reader(input);
149 
150  decode(reader, output);
151  }
154  void Decode(Byte *input, std::size_t size, Containers::Image &output) {
155  jpg::ArrayReader reader(input, size);
156 
157  decode(reader, output);
158  }
159 
162  void Encode(Containers::Image &input, std::ostream &output, int quality = 90) {
163  jpg::StreamWriter writer(output);
164 
165  encode(writer, input, quality);
166  }
167 
170  void Encode(Containers::Image &input, const std::string &output, int quality = 90) {
171  std::ofstream file(output, std::ios::binary);
172  if(!file.is_open()) throw std::runtime_error("Cannot open file");
173 
174  Encode(input, file, quality);
175  }
176 
179  void Encode(Containers::Image &input, std::vector<Byte> &output, int quality = 90) {
180  jpg::VectorWriter writer(output);
181 
182  encode(writer, input, quality);
183  }
184 
185 
186  protected:
187  void encode(jpg::Writer &writer, Containers::Image &input, int quality);
188  void decode(jpg::Reader &reader, Containers::Image &output);
189 
190  };
191 
192  extern JPEG Jpg;
193 
194 } }
Gorgon::Encoding::jpg::Reader::init_source
virtual void init_source(jpeg_decompress_struct &cinfo)=0
Gorgon::Encoding::jpg::VectorWriter::term_destination
virtual void term_destination(jpeg_compress_struct &cinfo)
Definition: JPEG.cpp:249
Gorgon::Encoding::jpg::ArrayReader::data
Byte * data
Definition: JPEG.h:73
Gorgon::Encoding::jpg::Writer
Definition: JPEG.h:77
Gorgon::Encoding::jpg::StreamReader::StreamReader
StreamReader(std::istream &file)
Definition: JPEG.h:43
Gorgon::Containers::basic_Image::GetMode
Graphics::ColorMode GetMode() const
Returns the color mode of the image.
Definition: Image.h:1311
Gorgon::Encoding::jpg::VectorReader::data
std::vector< Byte > & data
Definition: JPEG.h:62
Gorgon::Encoding::JPEG::Encode
void Encode(Containers::Image &input, std::vector< Byte > &output, int quality=90)
Encode given image to JPG compressed data.
Definition: JPEG.h:179
Gorgon::Containers::basic_Image::Resize
void Resize(const Geometry::Size &size, Graphics::ColorMode mode)
Resizes the image to the given size and color mode.
Definition: Image.h:71
Gorgon::Graphics::ColorMode
ColorMode
Color modes for images.
Definition: Color.h:16
Gorgon::Encoding::jpg::empty_output_buffer
boolean empty_output_buffer(jpeg_compress_struct *cinfo)
Definition: JPEG.cpp:306
Gorgon::Graphics::ColorMode::RGB
@ RGB
24bit red, green, blue color mode that has red component in the lowest byte order
Gorgon::Encoding::jpg::Writer::term_destination
virtual void term_destination(jpeg_compress_struct &cinfo)=0
Gorgon::Encoding::jpg::VectorReader::fill_input_buffer
virtual bool fill_input_buffer(jpeg_decompress_struct &cinfo)
Definition: JPEG.cpp:205
Gorgon::Graphics::ColorMode::Invalid
@ Invalid
This is used to mark invalid color data.
Gorgon::Encoding::jpg::VectorReader::VectorReader
VectorReader(std::vector< Byte > &data)
Definition: JPEG.h:56
Gorgon::Encoding::jpg::StreamWriter::term_destination
virtual void term_destination(jpeg_compress_struct &cinfo)
Definition: JPEG.cpp:231
Gorgon::Containers::basic_Image::RawData
Byte * RawData()
Returns the raw data pointer.
Definition: Image.h:211
Gorgon::Encoding::jpg::StreamReader::fill_input_buffer
virtual bool fill_input_buffer(jpeg_decompress_struct &cinfo)
Definition: JPEG.cpp:175
Gorgon::Geometry::basic_Size::Height
T_ Height
Height of this size object.
Definition: Size.h:261
Gorgon::Graphics::ColorMode::RGBA
@ RGBA
32bit red, green, blue and alpha channel image. Red component is in the lowest byte order and
Gorgon::Encoding::jpg::VectorWriter
Definition: JPEG.h:105
Gorgon::Encoding::jpg::Reader::resync_to_restart
virtual bool resync_to_restart(jpeg_decompress_struct &cinfo, int desired)
Definition: JPEG.cpp:156
Gorgon::Encoding::JPEG::decode
void decode(jpg::Reader &reader, Containers::Image &output)
Definition: JPEG.cpp:48
Gorgon::Encoding::jpg::VectorWriter::init_destination
virtual void init_destination(jpeg_compress_struct &cinfo)
Definition: JPEG.cpp:253
Gorgon::Encoding::jpg::StreamReader::skip_input_data
virtual void skip_input_data(jpeg_decompress_struct &cinfo, long size)
Definition: JPEG.cpp:188
Gorgon::Encoding::jpg::StreamReader::buffer
Byte buffer[1024]
Definition: JPEG.h:51
Gorgon::Encoding::jpg::init_destination
void init_destination(jpeg_compress_struct *cinfo)
Definition: JPEG.cpp:302
Gorgon::Encoding::jpg::term_source
void term_source(jpeg_decompress_struct *cinfo)
Definition: JPEG.cpp:284
Gorgon::Encoding::jpg::ArrayReader::init_source
virtual void init_source(jpeg_decompress_struct &cinfo)
Definition: JPEG.cpp:212
Gorgon::Encoding::jpg::StreamWriter::empty_output_buffer
virtual bool empty_output_buffer(jpeg_compress_struct &cinfo)
Definition: JPEG.cpp:240
Gorgon::Encoding::JPEG::Encode
void Encode(Containers::Image &input, const std::string &output, int quality=90)
Encode given image to JPG compressed data.
Definition: JPEG.h:170
JPEG.h
Gorgon::Encoding::jpg::Reader
Definition: JPEG.h:25
Gorgon::Encoding::jpg::Writer::empty_output_buffer
virtual bool empty_output_buffer(jpeg_compress_struct &cinfo)=0
Gorgon::Encoding::jpg::ArrayReader::ArrayReader
ArrayReader(Byte *data, std::size_t size)
Definition: JPEG.h:67
Gorgon::Encoding::jpg::Writer::init_destination
virtual void init_destination(jpeg_compress_struct &cinfo)=0
Gorgon::Graphics::ColorMode::Grayscale
@ Grayscale
8bit gray scale color mode
Gorgon::Encoding::JPEG::Decode
void Decode(std::vector< Byte > &input, Containers::Image &output)
Decodes given JPG data from the given input and creates the image.
Definition: JPEG.h:147
Gorgon::Encoding::jpg::Reader::skip_input_data
virtual void skip_input_data(jpeg_decompress_struct &cinfo, long size)
Definition: JPEG.cpp:163
Gorgon
Root namespace for Gorgon Game Engine.
Definition: Any.h:19
Gorgon::Encoding::jpg::ArrayReader::fill_input_buffer
virtual bool fill_input_buffer(jpeg_decompress_struct &cinfo)
Definition: JPEG.cpp:218
Gorgon::Encoding::JPEG::encode
void encode(jpg::Writer &writer, Containers::Image &input, int quality)
Definition: JPEG.cpp:88
Gorgon::Encoding::jpg::Writer::manager
DestManager * manager
Definition: JPEG.h:87
Gorgon::Encoding::jpg::StreamReader::init_source
virtual void init_source(jpeg_decompress_struct &cinfo)
Definition: JPEG.cpp:171
Gorgon::Encoding::jpg::ArrayReader::size
std::size_t size
Definition: JPEG.h:74
Gorgon::Encoding::jpg::Writer::Writer
Writer()
Definition: JPEG.cpp:314
Gorgon::Encoding::JPEG::Decode
void Decode(const std::string &input, Containers::Image &output)
Decodes given JPG data from the given input and creates the image.
Definition: JPEG.h:138
Gorgon::Encoding::jpgtocolormode
Graphics::ColorMode jpgtocolormode(const struct jpeg_decompress_struct &cinfo)
Definition: JPEG.cpp:27
Gorgon::Encoding::jpg::Reader::manager
SourceManager * manager
Definition: JPEG.h:37
Gorgon::Encoding::jpg::Reader::Attach
virtual void Attach(jpeg_decompress_struct &cinfo)
Definition: JPEG.cpp:150
Gorgon::Encoding::jpg::VectorReader::init_source
virtual void init_source(jpeg_decompress_struct &cinfo)
Definition: JPEG.cpp:200
Gorgon::Encoding::jpg::Reader::Reader
Reader()
Definition: JPEG.cpp:288
Gorgon::Encoding::jpg::VectorReader
Definition: JPEG.h:54
Gorgon::Encoding::Jpg
JPEG Jpg
Definition: JPEG.cpp:327
Gorgon::Encoding::jpg::init_source
void init_source(jpeg_decompress_struct *cinfo)
Definition: JPEG.cpp:268
Gorgon::Byte
unsigned char Byte
Represents smallest cell in memory.
Definition: Types.h:9
Gorgon::Encoding::jpg::Writer::Attach
virtual void Attach(jpeg_compress_struct &cinfo)
Definition: JPEG.cpp:225
Gorgon::Encoding::jpg::ArrayReader
Definition: JPEG.h:65
Gorgon::Encoding::jpg::VectorWriter::VectorWriter
VectorWriter(std::vector< Byte > &out)
Definition: JPEG.h:107
Gorgon::Encoding::jpg::skip_input_data
void skip_input_data(jpeg_decompress_struct *cinfo, long size)
Definition: JPEG.cpp:276
Gorgon::Encoding::jpg::StreamWriter
Definition: JPEG.h:92
Gorgon::Encoding::my_output_message
void my_output_message(j_common_ptr cinfo)
Definition: JPEG.cpp:19
Gorgon::Encoding::jpg::Reader::fill_input_buffer
virtual bool fill_input_buffer(jpeg_decompress_struct &cinfo)=0
Gorgon::Encoding::jpg::StreamReader::file
std::istream & file
Definition: JPEG.h:50
Gorgon::Encoding::jpg::term_destination
void term_destination(jpeg_compress_struct *cinfo)
Definition: JPEG.cpp:310
Gorgon::Encoding::jpg::resync_to_restart
boolean resync_to_restart(jpeg_decompress_struct *cinfo, int desired)
Definition: JPEG.cpp:280
Gorgon::Containers::basic_Image
This class is a container for image data.
Definition: Image.h:19
Gorgon::Encoding::jpg::StreamReader
Definition: JPEG.h:41
Gorgon::Resource::GID::JPEG
constexpr Type JPEG
JPEG compression.
Definition: GID.h:124
Gorgon::Geometry::basic_Size::Width
T_ Width
Width of this size object.
Definition: Size.h:258
Gorgon::Encoding::JPEG::Decode
void Decode(Byte *input, std::size_t size, Containers::Image &output)
Decodes given JPG data from the given input and creates the image.
Definition: JPEG.h:154
Gorgon::Encoding::jpg::Reader::term_source
virtual void term_source(jpeg_decompress_struct &cinfo)
Definition: JPEG.cpp:160
Gorgon::Encoding::jpg::StreamWriter::StreamWriter
StreamWriter(std::ostream &out)
Definition: JPEG.h:94
Gorgon::Encoding::JPEG
Definition: JPEG.h:123
Gorgon::Encoding::JPEG::Decode
void Decode(std::istream &input, Containers::Image &output)
Decodes given JPG data from the given input and creates the image.
Definition: JPEG.h:130
Gorgon::Encoding::JPEG::JPEG
JPEG()
Definition: JPEG.h:126
Gorgon::Encoding::jpg::StreamWriter::init_destination
virtual void init_destination(jpeg_compress_struct &cinfo)
Definition: JPEG.cpp:235
Gorgon::Encoding::jpg::VectorWriter::empty_output_buffer
virtual bool empty_output_buffer(jpeg_compress_struct &cinfo)
Definition: JPEG.cpp:259
Gorgon::Encoding::jpg::Writer::~Writer
virtual ~Writer()
Definition: JPEG.cpp:322
Gorgon::Encoding::JPEG::Encode
void Encode(Containers::Image &input, std::ostream &output, int quality=90)
Encode given image to JPG compressed data.
Definition: JPEG.h:162
Gorgon::Encoding::jpg::fill_input_buffer
boolean fill_input_buffer(jpeg_decompress_struct *cinfo)
Definition: JPEG.cpp:272
Gorgon::Encoding::my_error_exit
void my_error_exit(j_common_ptr cinfo)
Definition: JPEG.cpp:15
Gorgon::Encoding::jpg::Reader::~Reader
virtual ~Reader()
Definition: JPEG.cpp:298
Gorgon::Containers::basic_Image::GetSize
Geometry::Size GetSize() const
Returns the size of the image.
Definition: Image.h:1291
Assert.h
Gorgon::Containers::basic_Image::GetChannelsPerPixel
unsigned GetChannelsPerPixel() const
Returns the number units occupied by a single pixel of this image.
Definition: Image.h:1326