]> git.tdb.fi Git - libs/gl.git/blob - source/pixelformat.cpp
Move srgb handling to storage_pixelformat_from_graphics
[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         default: return pf;
100         }
101 }
102
103 PixelFormat get_srgb_pixelformat(PixelFormat pf)
104 {
105         switch(pf)
106         {
107         case RGB: return SRGB;
108         case RGBA: return SRGB_ALPHA;
109         case RGB8: return SRGB8;
110         case RGBA8: return SRGB8_ALPHA8;
111         case LUMINANCE: return SLUMINANCE;
112         case LUMINANCE8: return SLUMINANCE8;
113         case LUMINANCE_ALPHA: return SLUMINANCE_ALPHA;
114         case LUMINANCE_ALPHA8: return SLUMINANCE8_ALPHA8;
115         default: return pf;
116         }
117 }
118
119 unsigned get_component_count(PixelFormat pf)
120 {
121         switch(get_base_pixelformat(pf))
122         {
123         case STENCIL_INDEX:
124         case DEPTH_COMPONENT:
125         case LUMINANCE:
126         case SLUMINANCE:
127                 return 1;
128         case LUMINANCE_ALPHA:
129         case SLUMINANCE_ALPHA:
130                 return 2;
131         case RGB:
132         case BGR:
133                 return 3;
134         case RGBA:
135         case BGRA:
136                 return 4;
137         default:
138                 throw invalid_argument("get_component_count");
139         }
140 }
141
142 unsigned get_component_size(PixelFormat pf)
143 {
144         switch(pf)
145         {
146         case RGB16F:
147         case RGBA16F:
148         case LUMINANCE16F:
149         case LUMINANCE_ALPHA16F:
150                 return 2;
151         case RGB32F:
152         case RGBA32F:
153         case LUMINANCE32F:
154         case LUMINANCE_ALPHA32F:
155                 return 4;
156         default:
157                 return 1;
158         }
159 }
160
161 unsigned get_pixel_size(PixelFormat pf)
162 {
163         return get_component_count(pf)*get_component_size(pf);
164 }
165
166 void require_pixelformat(PixelFormat pf)
167 {
168         switch(pf)
169         {
170         case RGB16F:
171         case RGB32F:
172         case RGBA16F:
173         case RGBA32F:
174         case LUMINANCE16F:
175         case LUMINANCE32F:
176         case LUMINANCE_ALPHA16F:
177         case LUMINANCE_ALPHA32F:
178                 { static Require _req(ARB_texture_float); }
179                 break;
180         case SRGB:
181         case SRGB8:
182         case SRGB_ALPHA:
183         case SRGB8_ALPHA8:
184         case SLUMINANCE:
185         case SLUMINANCE8:
186         case SLUMINANCE_ALPHA:
187         case SLUMINANCE8_ALPHA8:
188                 { static Require _req(EXT_texture_sRGB); }
189                 break;
190         case BGR:
191         case BGRA:
192                 { static Require _req(EXT_bgra); }
193                 break;
194         default:
195                 break;
196         }
197 }
198
199 } // namespace GL
200 } // namespace Msp