]> git.tdb.fi Git - libs/gl.git/blob - source/pixelformat.cpp
Have get_component_size return zero for unsized formats
[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()=="RED")
18                 fmt = RED;
19         else if(conv.get()=="RG")
20                 fmt = RG;
21         else if(conv.get()=="RGB")
22                 fmt = RGB;
23         else if(conv.get()=="RGBA")
24                 fmt = RGBA;
25         else if(conv.get()=="BGR")
26                 fmt = BGR;
27         else if(conv.get()=="BGRA")
28                 fmt = BGRA;
29         else if(conv.get()=="SRGB")
30                 fmt = SRGB;
31         else if(conv.get()=="SRGB_ALPHA")
32                 fmt = SRGB_ALPHA;
33         else if(conv.get()=="LUMINANCE")
34                 fmt = LUMINANCE;
35         else if(conv.get()=="LUMINANCE_ALPHA")
36                 fmt = LUMINANCE_ALPHA;
37         else if(conv.get()=="SLUMINANCE")
38                 fmt = SLUMINANCE;
39         else if(conv.get()=="SLUMINANCE_ALPHA")
40                 fmt = SLUMINANCE_ALPHA;
41         else
42                 throw lexical_error(format("conversion of '%s' to PixelFormat", conv.get()));
43 }
44
45 PixelFormat pixelformat_from_graphics(Graphics::PixelFormat pf)
46 {
47         switch(pf)
48         {
49         case Graphics::LUMINANCE: return LUMINANCE;
50         case Graphics::LUMINANCE_ALPHA: return LUMINANCE_ALPHA;
51         case Graphics::RGB: return RGB;
52         case Graphics::RGBX:
53         case Graphics::RGBA: return RGBA;
54         case Graphics::BGR: return BGR;
55         case Graphics::BGRX:
56         case Graphics::BGRA: return BGRA;
57         default: throw invalid_argument("pixelformat_from_graphics");
58         }
59 }
60
61 PixelFormat storage_pixelformat_from_graphics(Graphics::PixelFormat pf, bool srgb)
62 {
63         PixelFormat result;
64         switch(pf)
65         {
66         case Graphics::RGBX:
67         case Graphics::BGR:
68         case Graphics::BGRX: result = RGB; break;
69         case Graphics::BGRA: result = RGBA; break;
70         default: result = pixelformat_from_graphics(pf);
71         }
72
73         if(srgb)
74                 return get_srgb_pixelformat(result);
75         else
76                 return result;
77 }
78
79 PixelFormat get_base_pixelformat(PixelFormat pf)
80 {
81         switch(pf)
82         {
83         case R8:
84         case R16F:
85         case R32F: return RED;
86         case RG8:
87         case RG16F:
88         case RG32F: return RG;
89         case RGB8:
90         case RGB16F:
91         case RGB32F:
92         case SRGB:
93         case SRGB8: return RGB;
94         case RGBA8:
95         case RGBA16F:
96         case RGBA32F:
97         case SRGB_ALPHA:
98         case SRGB8_ALPHA8: return RGBA;
99         case LUMINANCE8:
100         case SLUMINANCE:
101         case SLUMINANCE8: return LUMINANCE;
102         case LUMINANCE_ALPHA8:
103         case SLUMINANCE_ALPHA:
104         case SLUMINANCE8_ALPHA8: return LUMINANCE_ALPHA;
105         case DEPTH_COMPONENT16:
106         case DEPTH_COMPONENT24:
107         case DEPTH_COMPONENT32: return DEPTH_COMPONENT;
108         default: return pf;
109         }
110 }
111
112 PixelFormat get_sized_pixelformat(PixelFormat pf)
113 {
114         switch(pf)
115         {
116         case RED: return R8;
117         case RG: return RG8;
118         case RGB: return RGB8;
119         case RGBA: return RGBA8;
120         case SRGB: return SRGB8;
121         case SRGB_ALPHA: return SRGB8_ALPHA8;
122         case LUMINANCE: return LUMINANCE8;
123         case SLUMINANCE: return SLUMINANCE8;
124         case LUMINANCE_ALPHA: return LUMINANCE8_ALPHA8;
125         case SLUMINANCE_ALPHA: return SLUMINANCE8_ALPHA8;
126         case DEPTH_COMPONENT:
127                 if(get_gl_api()==OPENGL_ES2)
128                         return DEPTH_COMPONENT16;
129                 else
130                         return DEPTH_COMPONENT32;
131         default: return pf;
132         }
133 }
134
135 PixelFormat get_srgb_pixelformat(PixelFormat pf)
136 {
137         switch(pf)
138         {
139         case RGB: return SRGB;
140         case RGBA: return SRGB_ALPHA;
141         case RGB8: return SRGB8;
142         case RGBA8: return SRGB8_ALPHA8;
143         case LUMINANCE: return SLUMINANCE;
144         case LUMINANCE8: return SLUMINANCE8;
145         case LUMINANCE_ALPHA: return SLUMINANCE_ALPHA;
146         case LUMINANCE_ALPHA8: return SLUMINANCE8_ALPHA8;
147         default: return pf;
148         }
149 }
150
151 unsigned get_component_count(PixelFormat pf)
152 {
153         switch(get_base_pixelformat(pf))
154         {
155         case STENCIL_INDEX:
156         case DEPTH_COMPONENT:
157         case RED:
158         case LUMINANCE:
159         case SLUMINANCE:
160                 return 1;
161         case RG:
162         case LUMINANCE_ALPHA:
163         case SLUMINANCE_ALPHA:
164                 return 2;
165         case RGB:
166         case BGR:
167                 return 3;
168         case RGBA:
169         case BGRA:
170                 return 4;
171         default:
172                 throw invalid_argument("get_component_count");
173         }
174 }
175
176 unsigned get_component_size(PixelFormat pf)
177 {
178         switch(pf)
179         {
180         case R8:
181         case RG8:
182         case RGB8:
183         case RGBA8:
184         case SRGB8:
185         case SRGB8_ALPHA8:
186         case LUMINANCE8:
187         case LUMINANCE8_ALPHA8:
188         case SLUMINANCE8:
189         case SLUMINANCE8_ALPHA8:
190                 return 1;
191         case R16F:
192         case RG16F:
193         case RGB16F:
194         case RGBA16F:
195         case DEPTH_COMPONENT16:
196                 return 2;
197         case DEPTH_COMPONENT24:
198                 return 3;
199         case R32F:
200         case RG32F:
201         case RGB32F:
202         case RGBA32F:
203         case DEPTH_COMPONENT32:
204                 return 4;
205         default:
206                 return 0;
207         }
208 }
209
210 unsigned get_pixel_size(PixelFormat pf)
211 {
212         return get_component_count(pf)*max(get_component_size(pf), 1U);
213 }
214
215 void require_pixelformat(PixelFormat pf)
216 {
217         switch(pf)
218         {
219         case RED:
220         case R8:
221         case RG:
222         case RG8:
223                 { static Require _req(ARB_texture_rg); }
224                 break;
225         case R16F:
226         case R32F:
227         case RG16F:
228         case RG32F:
229                 { static Require _req(ARB_texture_rg); }
230                 { static Require _req(ARB_texture_float); }
231                 break;
232         case RGB16F:
233         case RGB32F:
234         case RGBA16F:
235         case RGBA32F:
236                 { static Require _req(ARB_texture_float); }
237                 break;
238         case SRGB:
239         case SRGB8:
240         case SRGB_ALPHA:
241         case SRGB8_ALPHA8:
242         case SLUMINANCE:
243         case SLUMINANCE8:
244         case SLUMINANCE_ALPHA:
245         case SLUMINANCE8_ALPHA8:
246                 { static Require _req(EXT_texture_sRGB); }
247                 break;
248         case BGR:
249         case BGRA:
250                 { static Require _req(EXT_bgra); }
251                 break;
252         case DEPTH_COMPONENT:
253         case DEPTH_COMPONENT16:
254         case DEPTH_COMPONENT24:
255         case DEPTH_COMPONENT32:
256                 { static Require _req(ARB_depth_texture); }
257                 break;
258         default:
259                 break;
260         }
261 }
262
263 } // namespace GL
264 } // namespace Msp