]> git.tdb.fi Git - libs/gl.git/blob - source/pixelformat.cpp
Prefer sized internal formats when possible
[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_sized_pixelformat(PixelFormat pf)
107 {
108         switch(pf)
109         {
110         case RGB: return RGB8;
111         case RGBA: return RGBA8;
112         case SRGB: return SRGB8;
113         case SRGB_ALPHA: return SRGB8_ALPHA8;
114         case LUMINANCE: return LUMINANCE8;
115         case SLUMINANCE: return SLUMINANCE8;
116         case LUMINANCE_ALPHA: return LUMINANCE8_ALPHA8;
117         case SLUMINANCE_ALPHA: return SLUMINANCE8_ALPHA8;
118         case DEPTH_COMPONENT:
119                 if(get_gl_api()==OPENGL_ES2)
120                         return DEPTH_COMPONENT16;
121                 else
122                         return DEPTH_COMPONENT32;
123         default: return pf;
124         }
125 }
126
127 PixelFormat get_srgb_pixelformat(PixelFormat pf)
128 {
129         switch(pf)
130         {
131         case RGB: return SRGB;
132         case RGBA: return SRGB_ALPHA;
133         case RGB8: return SRGB8;
134         case RGBA8: return SRGB8_ALPHA8;
135         case LUMINANCE: return SLUMINANCE;
136         case LUMINANCE8: return SLUMINANCE8;
137         case LUMINANCE_ALPHA: return SLUMINANCE_ALPHA;
138         case LUMINANCE_ALPHA8: return SLUMINANCE8_ALPHA8;
139         default: return pf;
140         }
141 }
142
143 unsigned get_component_count(PixelFormat pf)
144 {
145         switch(get_base_pixelformat(pf))
146         {
147         case STENCIL_INDEX:
148         case DEPTH_COMPONENT:
149         case LUMINANCE:
150         case SLUMINANCE:
151                 return 1;
152         case LUMINANCE_ALPHA:
153         case SLUMINANCE_ALPHA:
154                 return 2;
155         case RGB:
156         case BGR:
157                 return 3;
158         case RGBA:
159         case BGRA:
160                 return 4;
161         default:
162                 throw invalid_argument("get_component_count");
163         }
164 }
165
166 unsigned get_component_size(PixelFormat pf)
167 {
168         switch(pf)
169         {
170         case RGB16F:
171         case RGBA16F:
172         case LUMINANCE16F:
173         case LUMINANCE_ALPHA16F:
174         case DEPTH_COMPONENT16:
175                 return 2;
176         case DEPTH_COMPONENT24:
177                 return 3;
178         case RGB32F:
179         case RGBA32F:
180         case LUMINANCE32F:
181         case LUMINANCE_ALPHA32F:
182         case DEPTH_COMPONENT32:
183                 return 4;
184         default:
185                 return 1;
186         }
187 }
188
189 unsigned get_pixel_size(PixelFormat pf)
190 {
191         return get_component_count(pf)*get_component_size(pf);
192 }
193
194 void require_pixelformat(PixelFormat pf)
195 {
196         switch(pf)
197         {
198         case RGB16F:
199         case RGB32F:
200         case RGBA16F:
201         case RGBA32F:
202         case LUMINANCE16F:
203         case LUMINANCE32F:
204         case LUMINANCE_ALPHA16F:
205         case LUMINANCE_ALPHA32F:
206                 { static Require _req(ARB_texture_float); }
207                 break;
208         case SRGB:
209         case SRGB8:
210         case SRGB_ALPHA:
211         case SRGB8_ALPHA8:
212         case SLUMINANCE:
213         case SLUMINANCE8:
214         case SLUMINANCE_ALPHA:
215         case SLUMINANCE8_ALPHA8:
216                 { static Require _req(EXT_texture_sRGB); }
217                 break;
218         case BGR:
219         case BGRA:
220                 { static Require _req(EXT_bgra); }
221                 break;
222         case DEPTH_COMPONENT:
223         case DEPTH_COMPONENT16:
224         case DEPTH_COMPONENT24:
225         case DEPTH_COMPONENT32:
226                 { static Require _req(ARB_depth_texture); }
227                 break;
228         default:
229                 break;
230         }
231 }
232
233 } // namespace GL
234 } // namespace Msp