X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpixelformat.cpp;h=027ae88c7fe1bb7c5e11290ef5133e3c143b8d05;hb=5a93cc603eef43617a10b76bc9c19a3272ac1d49;hp=4744ebbdfbad3a61c209be9085a01e15c8e4b1bc;hpb=f14435e58bfa0fa697a06ba9a454bb30cd37d9d8;p=libs%2Fgl.git diff --git a/source/pixelformat.cpp b/source/pixelformat.cpp index 4744ebbd..027ae88c 100644 --- a/source/pixelformat.cpp +++ b/source/pixelformat.cpp @@ -1,4 +1,6 @@ -#include "except.h" +#include +#include +#include #include "pixelformat.h" using namespace std; @@ -6,41 +8,44 @@ using namespace std; namespace Msp { namespace GL { -istream &operator>>(istream &in, PixelFormat &fmt) +void operator>>(const LexicalConverter &conv, PixelFormat &fmt) { - string word; - - in>>word; - if(word=="COLOR_INDEX") + if(conv.get()=="COLOR_INDEX") fmt = COLOR_INDEX; - else if(word=="STENCIL_INDEX") + else if(conv.get()=="STENCIL_INDEX") fmt = STENCIL_INDEX; - else if(word=="DEPTH_COMPONENT") + else if(conv.get()=="DEPTH_COMPONENT") fmt = DEPTH_COMPONENT; - else if(word=="RED") + else if(conv.get()=="RED") fmt = RED; - else if(word=="GREEN") + else if(conv.get()=="GREEN") fmt = GREEN; - else if(word=="BLUE") + else if(conv.get()=="BLUE") fmt = BLUE; - else if(word=="ALPHA") + else if(conv.get()=="ALPHA") fmt = ALPHA; - else if(word=="RGB") + else if(conv.get()=="RGB") fmt = RGB; - else if(word=="RGBA") + else if(conv.get()=="RGBA") fmt = RGBA; - else if(word=="BGR") + else if(conv.get()=="BGR") fmt = BGR; - else if(word=="BGRA") + else if(conv.get()=="BGRA") fmt = BGRA; - else if(word=="LUMINANCE") + else if(conv.get()=="SRGB") + fmt = SRGB; + else if(conv.get()=="SRGB_ALPHA") + fmt = SRGB_ALPHA; + else if(conv.get()=="LUMINANCE") fmt = LUMINANCE; - else if(word=="LUMINANCE_ALPHA") + else if(conv.get()=="LUMINANCE_ALPHA") fmt = LUMINANCE_ALPHA; + else if(conv.get()=="SLUMINANCE") + fmt = SLUMINANCE; + else if(conv.get()=="SLUMINANCE_ALPHA") + fmt = SLUMINANCE_ALPHA; else - in.setstate(ios_base::failbit); - - return in; + throw lexical_error(format("conversion of '%s' to PixelFormat", conv.get())); } PixelFormat pixelformat_from_graphics(Graphics::PixelFormat pf) @@ -51,10 +56,24 @@ PixelFormat pixelformat_from_graphics(Graphics::PixelFormat pf) case Graphics::LUMINANCE: return LUMINANCE; case Graphics::LUMINANCE_ALPHA: return LUMINANCE_ALPHA; case Graphics::RGB: return RGB; + case Graphics::RGBX: case Graphics::RGBA: return RGBA; case Graphics::BGR: return BGR; + case Graphics::BGRX: case Graphics::BGRA: return BGRA; - default: throw InvalidParameterValue("Unknown Graphics::PixelFormat"); + default: throw invalid_argument("pixelformat_from_graphics"); + } +} + +PixelFormat storage_pixelformat_from_graphics(Graphics::PixelFormat pf) +{ + switch(pf) + { + case Graphics::RGBX: + case Graphics::BGR: + case Graphics::BGRX: return RGB; + case Graphics::BGRA: return RGBA; + default: return pixelformat_from_graphics(pf); } } @@ -64,19 +83,87 @@ PixelFormat get_base_pixelformat(PixelFormat pf) { case RGB8: case RGB16F: - case RGB32F: return RGB; + case RGB32F: + case SRGB: + case SRGB8: return RGB; case RGBA8: case RGBA16F: - case RGBA32F: return RGBA; + case RGBA32F: + case SRGB_ALPHA: + case SRGB8_ALPHA8: return RGBA; case LUMINANCE8: case LUMINANCE16F: - case LUMINANCE32F: return LUMINANCE; + case LUMINANCE32F: + case SLUMINANCE: + case SLUMINANCE8: return LUMINANCE; case LUMINANCE_ALPHA8: case LUMINANCE_ALPHA16F: - case LUMINANCE_ALPHA32F: return LUMINANCE_ALPHA; + case LUMINANCE_ALPHA32F: + case SLUMINANCE_ALPHA: + case SLUMINANCE8_ALPHA8: return LUMINANCE_ALPHA; default: return pf; } } +unsigned get_component_count(PixelFormat pf) +{ + switch(get_base_pixelformat(pf)) + { + case COLOR_INDEX: + case STENCIL_INDEX: + case DEPTH_COMPONENT: + case RED: + case GREEN: + case BLUE: + case LUMINANCE: + case SLUMINANCE: + return 1; + case LUMINANCE_ALPHA: + case SLUMINANCE_ALPHA: + return 2; + case RGB: + case BGR: + return 3; + case RGBA: + case BGRA: + return 4; + default: + throw invalid_argument("get_pixelformat_component_count"); + } +} + +void require_pixelformat(PixelFormat pf) +{ + switch(pf) + { + case RGB16F: + case RGB32F: + case RGBA16F: + case RGBA32F: + case LUMINANCE16F: + case LUMINANCE32F: + case LUMINANCE_ALPHA16F: + case LUMINANCE_ALPHA32F: + { static Require _req(ARB_texture_float); } + break; + case SRGB: + case SRGB8: + case SRGB_ALPHA: + case SRGB8_ALPHA8: + case SLUMINANCE: + case SLUMINANCE8: + case SLUMINANCE_ALPHA: + case SLUMINANCE8_ALPHA8: + { static Require _req(EXT_texture_sRGB); } + break; + case BGR: + case BGRA: + { static Require _req(EXT_bgra); } + break; + default: + break; + } +} + } // namespace GL } // namespace Msp