pixel_buffer.h Source File - ClanLib SDK
Description: pixel_buffer.h Source File

pixel_buffer.h
1/*
2** ClanLib SDK
3** Copyright (c) 1997-2020 The ClanLib Team
4**
5** This software is provided 'as-is', without any express or implied
6** warranty. In no event will the authors be held liable for any damages
7** arising from the use of this software.
8**
9** Permission is granted to anyone to use this software for any purpose,
10** including commercial applications, and to alter it and redistribute it
11** freely, subject to the following restrictions:
12**
13** 1. The origin of this software must not be misrepresented; you must not
14** claim that you wrote the original software. If you use this software
15** in a product, an acknowledgment in the product documentation would be
16** appreciated but is not required.
17** 2. Altered source versions must be plainly marked as such, and must not be
18** misrepresented as being the original software.
19** 3. This notice may not be removed or altered from any source distribution.
20**
21** Note: Some of the libraries ClanLib may link to may have additional
22** requirements or restrictions.
23**
24** File Author(s):
25**
26** Magnus Norddahl
27** Harry Storbacka
28** Mark Page
29*/
30
31#pragma once
32
33#include <memory>
34#include "../../Core/Math/rect.h"
35#include "texture_format.h"
36#include "buffer_usage.h"
37
38namespace clan
39{
42
43 class Size;
44 class Rect;
45 class PixelFormat;
46 class Color;
47 class Colorf;
48 class PixelBuffer;
49 class PixelBuffer_Impl;
50 class FileSystem;
51 class IODevice;
52 class GraphicContext;
53 class PixelBufferProvider;
54 class PixelConverter;
55
57 enum class PixelBufferDirection
58 {
60 data_to_gpu,
61
63 data_from_gpu
64 };
65
67 class PixelBuffer
68 {
69 public:
71 PixelBuffer();
72
80 PixelBuffer(int width, int height, TextureFormat texture_format, const void *data = nullptr, bool only_reference_data = false);
81
85 PixelBuffer(const std::string &fullname, bool srgb = false);
86
91 PixelBuffer(const std::string &filename, const FileSystem &file_system, bool srgb = false);
92
97 PixelBuffer(IODevice &file, const std::string &image_type, bool srgb = false);
98
102 PixelBuffer(std::unique_ptr<PixelBufferProvider> provider);
103
104 virtual ~PixelBuffer();
105
107 bool is_null() const { return !impl; }
108 explicit operator bool() const { return bool(impl); }
109
111 void throw_if_null() const;
112
114 PixelBuffer copy() const;
115
117 PixelBuffer copy(const Rect &rect) const;
118
120 int get_width() const;
121
123 int get_height() const;
124
126 Size get_size() const { return Size{ get_width(), get_height() }; }
127
129 int get_pitch() const;
130
135 float get_pixel_ratio() const;
136
138 float get_dip_width() const { return get_width() / get_pixel_ratio(); }
139
141 float get_dip_height() const { return get_height() / get_pixel_ratio(); }
142
144 Sizef get_dip_size() const { return Sizef{ get_dip_width(), get_dip_height() }; }
145
147 void *get_data();
148
149 const void *get_data() const;
150
152 bool is_gpu() const;
153
154 template<typename Type> Type *get_data() { return reinterpret_cast<Type*>(get_data()); }
155 template<typename Type> const Type *get_data() const { return reinterpret_cast<Type*>(get_data()); }
156
158 unsigned char *get_data_uint8() { return reinterpret_cast<unsigned char*>(get_data()); }
159 const unsigned char *get_data_uint8() const { return reinterpret_cast<const unsigned char*>(get_data()); }
160
162 unsigned short *get_data_uint16() { return reinterpret_cast<unsigned short*>(get_data()); }
163 const unsigned short *get_data_uint16() const { return reinterpret_cast<const unsigned short*>(get_data()); }
164
166 unsigned int *get_data_uint32() { return reinterpret_cast<unsigned int*>(get_data()); }
167 const unsigned int *get_data_uint32() const { return reinterpret_cast<const unsigned int*>(get_data()); }
168
170 void *get_line(int line) { unsigned char *d = get_data_uint8(); return d + line * get_pitch(); }
171 const void *get_line(int line) const { const unsigned char *d = get_data_uint8(); return d + line * get_pitch(); }
172
174 unsigned char *get_line_uint8(int line) { return reinterpret_cast<unsigned char*>(get_line(line)); }
175 const unsigned char *get_line_uint8(int line) const { return reinterpret_cast<const unsigned char*>(get_line(line)); }
176
178 unsigned short *get_line_uint16(int line) { return reinterpret_cast<unsigned short*>(get_line(line)); }
179 const unsigned short *get_line_uint16(int line) const { return reinterpret_cast<const unsigned short*>(get_line(line)); }
180
182 unsigned int *get_line_uint32(int line) { return reinterpret_cast<unsigned int*>(get_line(line)); }
183 const unsigned int *get_line_uint32(int line) const { return reinterpret_cast<const unsigned int*>(get_line(line)); }
184
186 bool has_transparency() const;
187
191 unsigned int get_bytes_per_pixel() const;
192
196 unsigned int get_bytes_per_block() const;
197
201 unsigned int get_data_size() const;
202
206 static unsigned int get_data_size(const Size &size, TextureFormat texture_format);
207
211 static unsigned int get_bytes_per_pixel(TextureFormat texture_format);
212
216 static unsigned int get_bytes_per_block(TextureFormat texture_format);
217
219 bool is_compressed() const;
220
222 static bool is_compressed(TextureFormat texture_format);
223
225 TextureFormat get_format() const;
226
230 PixelBufferProvider *get_provider() const;
231
233 Colorf get_pixel(int x, int y);
234
236 void lock(GraphicContext &gc, BufferAccess access);
237
239 void unlock();
240
242 void upload_data(GraphicContext &gc, const Rect &dest_rect, const void *data);
243
247 void set_image(const PixelBuffer &source);
248
252 void set_image(const PixelBuffer &source, PixelConverter &converter);
253
259 void set_subimage(const PixelBuffer &source, const Point &dest_pos, const Rect &src_rect);
260
266 void set_subimage(const PixelBuffer &source, const Point &dest_pos, const Rect &src_rect, PixelConverter &converter);
267
271 PixelBuffer to_cpu(GraphicContext &gc);
272
276 PixelBuffer to_gpu(GraphicContext &gc);
277
279 PixelBuffer to_format(TextureFormat texture_format) const;
280
282 PixelBuffer to_format(TextureFormat texture_format, PixelConverter &converter) const;
283
285 void flip_vertical();
286
290 void premultiply_alpha();
291
296 void premultiply_gamma(float gamma);
297
299 void set_pixel_ratio(float ratio);
300
301 private:
302 std::shared_ptr<PixelBuffer_Impl> impl;
303 friend class PixelBuffer_Impl;
304 };
305
307}
clan::Color
Color description class.
Definition color.h:46
clan::Colorf
Floating point color description class (for float).
Definition color.h:799
clan::FileSystem
Virtual File System (VFS).
Definition file_system.h:47
clan::GraphicContext
Interface to drawing graphics.
Definition graphic_context.h:257
clan::IODevice
I/O Device interface.
Definition iodevice.h:50
clan::PixelBufferProvider
Element Array Buffer provider.
Definition pixel_buffer_provider.h:42
clan::PixelBuffer
Pixel data container.
Definition pixel_buffer.h:68
clan::PixelBuffer::PixelBuffer
PixelBuffer(IODevice &file, const std::string &image_type, bool srgb=false)
Constructs a PixelBuffer.
clan::PixelBuffer::get_line
const void * get_line(int line) const
Definition pixel_buffer.h:171
clan::PixelBuffer::premultiply_alpha
void premultiply_alpha()
Multiply the RGB components by the Alpha component.
clan::PixelBuffer::get_provider
PixelBufferProvider * get_provider() const
Get Provider.
clan::PixelBuffer::get_pixel
Colorf get_pixel(int x, int y)
Return color of pixel at the specified coordinates.
clan::PixelBuffer::get_pixel_ratio
float get_pixel_ratio() const
clan::PixelBuffer::get_height
int get_height() const
Retrieves the actual height of the buffer.
clan::PixelBuffer::to_format
PixelBuffer to_format(TextureFormat texture_format) const
Converts current buffer to a new pixel format and returns the result.
clan::PixelBuffer::get_line
void * get_line(int line)
Returns a pointer to the beginning of a specific line.
Definition pixel_buffer.h:170
clan::PixelBuffer::get_data
const Type * get_data() const
Definition pixel_buffer.h:155
clan::PixelBuffer::upload_data
void upload_data(GraphicContext &gc, const Rect &dest_rect, const void *data)
Uploads data to buffer.
clan::PixelBuffer::get_data_size
static unsigned int get_data_size(const Size &size, TextureFormat texture_format)
Returns the size in bytes of the image data.
clan::PixelBuffer::PixelBuffer_Impl
friend class PixelBuffer_Impl
Definition pixel_buffer.h:303
clan::PixelBuffer::unlock
void unlock()
Unmaps element buffer.
clan::PixelBuffer::get_data_size
unsigned int get_data_size() const
Returns the size in bytes of the image data.
clan::PixelBuffer::get_bytes_per_block
unsigned int get_bytes_per_block() const
Returns the number of bytes per compression block.
clan::PixelBuffer::has_transparency
bool has_transparency() const
Returns true if format has an alpha channel.
clan::PixelBuffer::~PixelBuffer
virtual ~PixelBuffer()
clan::PixelBuffer::is_compressed
bool is_compressed() const
Returns true if compressed.
clan::PixelBuffer::PixelBuffer
PixelBuffer(const std::string &filename, const FileSystem &file_system, bool srgb=false)
Constructs a PixelBuffer.
clan::PixelBuffer::copy
PixelBuffer copy() const
Create a copy of the pixelbuffer that doesn't share data with the original pixel buffer.
clan::PixelBuffer::get_bytes_per_pixel
static unsigned int get_bytes_per_pixel(TextureFormat texture_format)
Returns the number of bytes per pixel.
clan::PixelBuffer::get_line_uint16
unsigned short * get_line_uint16(int line)
Returns a pointer to the beginning of a specific line as 16 bit data.
Definition pixel_buffer.h:178
clan::PixelBuffer::get_dip_height
float get_dip_height() const
Returns the device independent height of this texture.
Definition pixel_buffer.h:141
clan::PixelBuffer::is_compressed
static bool is_compressed(TextureFormat texture_format)
Returns true if compressed.
clan::PixelBuffer::PixelBuffer
PixelBuffer(int width, int height, TextureFormat texture_format, const void *data=nullptr, bool only_reference_data=false)
Constructs a PixelBuffer.
clan::PixelBuffer::is_null
bool is_null() const
Returns true if this object is invalid.
Definition pixel_buffer.h:107
clan::PixelBuffer::get_bytes_per_block
static unsigned int get_bytes_per_block(TextureFormat texture_format)
Returns the number of bytes per compression block.
clan::PixelBuffer::get_data
Type * get_data()
Definition pixel_buffer.h:154
clan::PixelBuffer::get_dip_size
Sizef get_dip_size() const
Returns the device independent size of this texture.
Definition pixel_buffer.h:144
clan::PixelBuffer::PixelBuffer
PixelBuffer(std::unique_ptr< PixelBufferProvider > provider)
Constructs a PixelBuffer.
clan::PixelBuffer::to_gpu
PixelBuffer to_gpu(GraphicContext &gc)
Uploads the pixel buffer to GPU memory.
clan::PixelBuffer::to_format
PixelBuffer to_format(TextureFormat texture_format, PixelConverter &converter) const
Converts current buffer to a new pixel format and returns the result.
clan::PixelBuffer::get_data
const void * get_data() const
clan::PixelBuffer::lock
void lock(GraphicContext &gc, BufferAccess access)
Maps buffer into system memory.
clan::PixelBuffer::set_subimage
void set_subimage(const PixelBuffer &source, const Point &dest_pos, const Rect &src_rect, PixelConverter &converter)
Copy source pixel buffer into this buffer, doing a format conversion if needed.
clan::PixelBuffer::get_line_uint8
const unsigned char * get_line_uint8(int line) const
Definition pixel_buffer.h:175
clan::PixelBuffer::set_image
void set_image(const PixelBuffer &source)
Copy source pixel buffer into this buffer, doing a format conversion if needed.
clan::PixelBuffer::premultiply_gamma
void premultiply_gamma(float gamma)
Multiply the RGB components by gamma value.
clan::PixelBuffer::get_data_uint16
const unsigned short * get_data_uint16() const
Definition pixel_buffer.h:163
clan::PixelBuffer::set_subimage
void set_subimage(const PixelBuffer &source, const Point &dest_pos, const Rect &src_rect)
Copy source pixel buffer into this buffer, doing a format conversion if needed.
clan::PixelBuffer::set_image
void set_image(const PixelBuffer &source, PixelConverter &converter)
Copy source pixel buffer into this buffer, doing a format conversion if needed.
clan::PixelBuffer::get_data_uint32
const unsigned int * get_data_uint32() const
Definition pixel_buffer.h:167
clan::PixelBuffer::PixelBuffer
PixelBuffer()
Constructs a null instance.
clan::PixelBuffer::set_pixel_ratio
void set_pixel_ratio(float ratio)
Sets the display pixel ratio for this texture.
clan::PixelBuffer::get_width
int get_width() const
Retrieves the actual width of the buffer.
clan::PixelBuffer::to_cpu
PixelBuffer to_cpu(GraphicContext &gc)
Downloads the pixel buffer to CPU memory.
clan::PixelBuffer::copy
PixelBuffer copy(const Rect &rect) const
Create a copy of the pixelbuffer that doesn't share data with the original pixel buffer.
clan::PixelBuffer::flip_vertical
void flip_vertical()
Flip the entire image vertically (turn it upside down).
clan::PixelBuffer::get_size
Size get_size() const
Retrieves the actual size of the buffer.
Definition pixel_buffer.h:126
clan::PixelBuffer::get_bytes_per_pixel
unsigned int get_bytes_per_pixel() const
Returns the number of bytes per pixel.
clan::PixelBuffer::get_line_uint16
const unsigned short * get_line_uint16(int line) const
Definition pixel_buffer.h:179
clan::PixelBuffer::get_data_uint8
const unsigned char * get_data_uint8() const
Definition pixel_buffer.h:159
clan::PixelBuffer::get_line_uint32
unsigned int * get_line_uint32(int line)
Returns a pointer to the beginning of a specific line as 32 bit data.
Definition pixel_buffer.h:182
clan::PixelBuffer::get_line_uint32
const unsigned int * get_line_uint32(int line) const
Definition pixel_buffer.h:183
clan::PixelBuffer::get_data
void * get_data()
Returns a pointer to the beginning of the pixel buffer.
clan::PixelBuffer::is_gpu
bool is_gpu() const
Returns true if this pixel buffer is a GPU based one.
clan::PixelBuffer::get_line_uint8
unsigned char * get_line_uint8(int line)
Returns a pointer to the beginning of a specific line as 8 bit data.
Definition pixel_buffer.h:174
clan::PixelBuffer::PixelBuffer
PixelBuffer(const std::string &fullname, bool srgb=false)
Constructs a PixelBuffer.
clan::PixelBuffer::get_dip_width
float get_dip_width() const
Returns the device independent width of this texture.
Definition pixel_buffer.h:138
clan::PixelBuffer::get_pitch
int get_pitch() const
Returns the pitch (in bytes per scanline).
clan::PixelBuffer::get_data_uint16
unsigned short * get_data_uint16()
Returns a pointer to the beginning of the pixel buffer as 16 bit data.
Definition pixel_buffer.h:162
clan::PixelBuffer::get_data_uint8
unsigned char * get_data_uint8()
Returns a pointer to the beginning of the pixel buffer as 8 bit data.
Definition pixel_buffer.h:158
clan::PixelBuffer::get_data_uint32
unsigned int * get_data_uint32()
Returns a pointer to the beginning of the pixel buffer as 32 bit data.
Definition pixel_buffer.h:166
clan::PixelBuffer::throw_if_null
void throw_if_null() const
Throw an exception if this object is invalid.
clan::PixelBuffer::get_format
TextureFormat get_format() const
Returns the pixel format.
clan::PixelConverter
Low level pixel format converter class.
Definition pixel_converter.h:45
clan::Point
2D (x,y) point structure - Integer
Definition point.h:62
clan::Rect
2D (left,top,right,bottom) rectangle structure - Integer
Definition rect.h:446
clan::Size
2D (width,height) size structure - Integer
Definition size.h:176
clan::Sizef
2D (width,height) size structure - Float
Definition size.h:189
clan::TextureFormat
TextureFormat
Texture format.
Definition texture_format.h:39
clan::BufferAccess
BufferAccess
Array Buffer access enum.
Definition buffer_usage.h:53
clan::PixelBufferDirection
PixelBufferDirection
Pixel buffer prefered direction.
Definition pixel_buffer.h:58
clan::FillMode::line
@ line
Definition graphic_context.h:79
clan::PixelBufferDirection::data_to_gpu
@ data_to_gpu
Use of the pixel buffer is to send data to the gpu.
Definition pixel_buffer.h:60
clan::PixelBufferDirection::data_from_gpu
@ data_from_gpu
Use of the pixel buffer is to retrieve data from the gpu.
Definition pixel_buffer.h:63
clan
Definition clanapp.h:36
clan::Key::y
@ y
Definition keys.h:105
clan::Key::d
@ d
Definition keys.h:84
clan::Key::x
@ x
Definition keys.h:104