]> git.tdb.fi Git - libs/gl.git/blob - source/pixelformat.cpp
Pull in sized depth component formats from ARB_depth_texture
[libs/gl.git] / source / pixelformat.cpp
1 #include <msp/gl/extensions/arb_texture_float.h>
2 #include <msp/gl/extensions/ext_bgra.h>
3 #include <msp/strings/format.h>
4 #include "pixelformat.h"
5
6 using namespace std;
7
8 namespace Msp {
9 namespace GL {
10
11 void operator>>(const LexicalConverter &conv, PixelFormat &fmt)
12 {
13         if(conv.get()=="STENCIL_INDEX")
14                 fmt = STENCIL_INDEX;
15         else if(conv.get()=="DEPTH_COMPONENT")
16                 fmt = DEPTH_COMPONENT;
17         else if(conv.get()=="RGB")
18                 fmt = RGB;
19         else if(conv.get()=="RGBA")
20                 fmt = RGBA;
21         else if(conv.get()=="BGR")
22                 fmt = BGR;
23         else if(conv.get()=="BGRA")
24                 fmt = BGRA;
25         else if(conv.get()=="SRGB")
26                 fmt = SRGB;
27         else if(conv.get()=="SRGB_ALPHA")
28                 fmt = SRGB_ALPHA;
29         else if(conv.get()=="LUMINANCE")
30                 fmt = LUMINANCE;
31         else if(conv.get()=="LUMINANCE_ALPHA")
32                 fmt = LUMINANCE_ALPHA;
33         else if(conv.get()=="SLUMINANCE")
34                 fmt = SLUMINANCE;
35         else if(conv.get()=="SLUMINANCE_ALPHA")
36                 fmt = SLUMINANCE_ALPHA;
37         else
38                 throw lexical_error(format("conversion of '%s' to PixelFormat", conv.get()));
39 }
40
41 PixelFormat pixelformat_from_graphics(Graphics::PixelFormat pf)
42 {
43         switch(pf)
44         {
45         case Graphics::LUMINANCE: return LUMINANCE;
46         case Graphics::LUMINANCE_ALPHA: return LUMINANCE_ALPHA;
47         case Graphics::RGB: return RGB;
48         case Graphics::RGBX:
49         case Graphics::RGBA: return RGBA;
50         case Graphics::BGR: return BGR;
51         case Graphics::BGRX:
52         case Graphics::BGRA: return BGRA;
53         default: throw invalid_argument("pixelformat_from_graphics");
54         }
55 }
56
57 PixelFormat storage_pixelformat_from_graphics(Graphics::PixelFormat pf, bool srgb)
58 {
59         PixelFormat result;
60         switch(pf)
61         {
62         case Graphics::RGBX:
63         case Graphics::BGR:
64         case Graphics::BGRX: result = RGB; break;
65         case Graphics::BGRA: result = RGBA; break;
66         default: result = pixelformat_from_graphics(pf);
67         }
68
69         if(srgb)
70                 return get_srgb_pixelformat(result);
71         else
72                 return result;
73 }
74
75 PixelFormat get_base_pixelformat(PixelFormat pf)
76 {
77         switch(pf)
78         {
79         case RGB8:
80         case RGB16F:
81         case RGB32F:
82         case SRGB:
83         case SRGB8: return RGB;
84         case RGBA8:
85         case RGBA16F:
86         case RGBA32F:
87         case SRGB_ALPHA:
88         case SRGB8_ALPHA8: return RGBA;
89         case LUMINANCE8:
90         case LUMINANCE16F:
91         case LUMINANCE32F:
92         case SLUMINANCE:
93         case SLUMINANCE8: return LUMINANCE;
94         case LUMINANCE_ALPHA8:
95         case LUMINANCE_ALPHA16F:
96         case LUMINANCE_ALPHA32F:
97         case SLUMINANCE_ALPHA:
98         case SLUMINANCE8_ALPHA8: return LUMINANCE_ALPHA;
99         case DEPTH_COMPONENT16:
100         case DEPTH_COMPONENT24:
101         case DEPTH_COMPONENT32: return DEPTH_COMPONENT;
102         default: return pf;
103         }
104 }
105
106 PixelFormat get_srgb_pixelformat(PixelFormat pf)
107 {
108         switch(pf)
109         {
110         case RGB: return SRGB;
111         case RGBA: return SRGB_ALPHA;
112         case RGB8: return SRGB8;
113         case RGBA8: return SRGB8_ALPHA8;
114         case LUMINANCE: return SLUMINANCE;
115         case LUMINANCE8: return SLUMINANCE8;
116         case LUMINANCE_ALPHA: return SLUMINANCE_ALPHA;
117         case LUMINANCE_ALPHA8: return SLUMINANCE8_ALPHA8;
118         default: return pf;
119         }
120 }
121
122 unsigned get_component_count(PixelFormat pf)
123 {
124         switch(get_base_pixelformat(pf))
125         {
126         case STENCIL_INDEX:
127         case DEPTH_COMPONENT:
128         case LUMINANCE:
129         case SLUMINANCE:
130                 return 1;
131         case LUMINANCE_ALPHA:
132         case SLUMINANCE_ALPHA:
133                 return 2;
134         case RGB:
135         case BGR:
136                 return 3;
137         case RGBA:
138         case BGRA:
139                 return 4;
140         default:
141                 throw invalid_argument("get_component_count");
142         }
143 }
144
145 unsigned get_component_size(PixelFormat pf)
146 {
147         switch(pf)
148         {
149         case RGB16F:
150         case RGBA16F:
151         case LUMINANCE16F:
152         case LUMINANCE_ALPHA16F:
153         case DEPTH_COMPONENT16:
154                 return 2;
155         case DEPTH_COMPONENT24:
156                 return 3;
157         case RGB32F:
158         case RGBA32F:
159         case LUMINANCE32F:
160         case LUMINANCE_ALPHA32F:
161         case DEPTH_COMPONENT32:
162                 return 4;
163         default:
164                 return 1;
165         }
166 }
167
168 unsigned get_pixel_size(PixelFormat pf)
169 {
170         return get_component_count(pf)*get_component_size(pf);
171 }
172
173 void require_pixelformat(PixelFormat pf)
174 {
175         switch(pf)
176         {
177         case RGB16F:
178         case RGB32F:
179         case RGBA16F:
180         case RGBA32F:
181         case LUMINANCE16F:
182         case LUMINANCE32F:
183         case LUMINANCE_ALPHA16F:
184         case LUMINANCE_ALPHA32F:
185                 { static Require _req(ARB_texture_float); }
186                 break;
187         case SRGB:
188         case SRGB8:
189         case SRGB_ALPHA:
190         case SRGB8_ALPHA8:
191         case SLUMINANCE:
192         case SLUMINANCE8:
193         case SLUMINANCE_ALPHA:
194         case SLUMINANCE8_ALPHA8:
195                 { static Require _req(EXT_texture_sRGB); }
196                 break;
197         case BGR:
198         case BGRA:
199                 { static Require _req(EXT_bgra); }
200                 break;
201         case DEPTH_COMPONENT:
202         case DEPTH_COMPONENT16:
203         case DEPTH_COMPONENT24:
204         case DEPTH_COMPONENT32:
205                 { static Require _req(ARB_depth_texture); }
206                 break;
207         default:
208                 break;
209         }
210 }
211
212 } // namespace GL
213 } // namespace Msp