]> git.tdb.fi Git - libs/gl.git/blob - source/core/pixelformat.h
Replace some local pointers with references in VulkanCommands
[libs/gl.git] / source / core / pixelformat.h
1 #ifndef MSP_GL_PIXELFORMAT_H_
2 #define MSP_GL_PIXELFORMAT_H_
3
4 #include <msp/graphics/image.h>
5 #include <msp/strings/lexicalcast.h>
6 #include "datatype.h"
7
8 namespace Msp {
9 namespace GL {
10
11 /**
12 Identifies the components of a pixel, without type information.
13
14 The values are bitfields laid as follows:
15
16 _grs dccc
17  │││ │  └╴Number of components
18  │││ └───╴Depth flag
19  ││└─────╴Stencil flag
20  │└──────╴Reverse order flag
21  └───────╴Grayscale flag
22
23 This information is presented for internal documentation purposes only; it is
24 inadvisable for applications to rely on it.
25 */
26 enum PixelComponents
27 {
28         RED = 0x01,
29         RG = 0x02,
30         RGB = 0x03,
31         RGBA = 0x04,
32         DEPTH_COMPONENT = 0x09,
33         STENCIL_INDEX = 0x11,
34         BGR = 0x23,
35         BGRA = 0x24,
36         LUMINANCE = 0x41,
37         LUMINANCE_ALPHA = 0x42
38 };
39
40 /**
41 Describes a mapping from one set of components to another.
42 */
43 enum ComponentSwizzle
44 {
45         NO_SWIZZLE,
46         R_TO_LUMINANCE,
47         RG_TO_LUMINANCE_ALPHA,
48         RGB_TO_BGR,
49         RGBA_TO_RGB
50 };
51
52 /**
53 Identifies a pixel format, with components and type.
54
55 The values are bitfields laid as follows:
56
57 tnfg ssss cccc cccc
58 ││││    │         └╴Components (see PixelComponents)
59 ││││    └──────────╴Size of one component (bytes)
60 │││└───────────────╴Signed flag
61 ││└────────────────╴Floating-point flag
62 │└─────────────────╴Normalized flag
63 └──────────────────╴sRGB flag
64
65 This information is presented for internal documentation purposes only; it is
66 inadvisable for applications to rely on it.
67 */
68 enum PixelFormat
69 {
70         NO_PIXELFORMAT = 0,
71         R8 = 0x4100|RED,
72         R16F = 0x3200|RED,
73         R32F = 0x3400|RED,
74         RG8 = 0x4100|RG,
75         RG16F = 0x3200|RG,
76         RG32F = 0x3400|RG,
77         RGB8 = 0x4100|RGB,
78         RGB16F = 0x3200|RGB,
79         RGB32F = 0x3400|RGB,
80         RGBA8 = 0x4100|RGBA,
81         RGBA16F = 0x3200|RGBA,
82         RGBA32F = 0x3400|RGBA,
83         SRGB8 = 0xC100|RGB,
84         SRGB8_ALPHA8 = 0xC100|RGBA,
85         BGR8 = 0x4100|BGR,
86         BGRA8 = 0x4100|BGRA,
87         SBGR8 = 0xC100|BGR,
88         SBGR8_ALPHA8 = 0xC100|BGRA,
89         LUMINANCE8 = 0x4100|LUMINANCE,
90         LUMINANCE8_ALPHA8 = 0x4100|LUMINANCE_ALPHA,
91         DEPTH_COMPONENT16 = 0x4200|DEPTH_COMPONENT,
92         DEPTH_COMPONENT24 = 0x4300|DEPTH_COMPONENT,
93         DEPTH_COMPONENT32 = 0x4400|DEPTH_COMPONENT,
94         DEPTH_COMPONENT32F = 0x3400|DEPTH_COMPONENT,
95         STENCIL_INDEX8 = 0x0100|STENCIL_INDEX
96 };
97
98 void operator>>(const LexicalConverter &, PixelComponents &);
99 void operator>>(const LexicalConverter &, PixelFormat &);
100
101 PixelComponents components_from_graphics(Graphics::PixelFormat);
102 PixelFormat pixelformat_from_image(const Graphics::Image &, bool = false);
103
104 ComponentSwizzle get_required_swizzle(PixelComponents);
105 PixelComponents swizzle_components(PixelComponents, ComponentSwizzle);
106 PixelComponents unswizzle_components(PixelComponents, ComponentSwizzle);
107
108 PixelFormat make_pixelformat(PixelComponents, DataType, bool = false);
109 inline PixelComponents get_components(PixelFormat f) { return static_cast<PixelComponents>(f&0xFF); }
110 inline unsigned get_component_count(PixelComponents c) { return c&7; }
111 inline unsigned get_component_count(PixelFormat f) { return get_component_count(get_components(f)); }
112 inline DataType get_component_type(PixelFormat f) { return static_cast<DataType>((f&0xF00)>>8 | (f&0x3000)>>4); }
113 inline unsigned get_component_size(PixelFormat f) { return get_type_size(get_component_type(f)); }
114 inline bool is_srgb(PixelFormat f) { return f&0x8000; }
115 inline unsigned get_pixel_size(PixelFormat f) { return get_component_count(f)*get_type_size(get_component_type(f)); }
116
117 void require_pixelformat(PixelFormat);
118
119 } // namespace GL
120 } // namespace Msp
121
122 #include "pixelformat_backend.h"
123
124 #endif