X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpixelformat.cpp;h=99f15307d1304bf41c36c80aa7af825fd41a7171;hb=0221e39a685c4f3122a0fae032a7888b5ce40579;hp=26600b33661fca3c7e73729702278f0aa4664feb;hpb=055f553b1a75f44e72f3c2b5a1c98c1e1e8f3f30;p=libs%2Fgl.git diff --git a/source/pixelformat.cpp b/source/pixelformat.cpp index 26600b33..99f15307 100644 --- a/source/pixelformat.cpp +++ b/source/pixelformat.cpp @@ -10,20 +10,10 @@ namespace GL { void operator>>(const LexicalConverter &conv, PixelFormat &fmt) { - if(conv.get()=="COLOR_INDEX") - fmt = COLOR_INDEX; - else if(conv.get()=="STENCIL_INDEX") + if(conv.get()=="STENCIL_INDEX") fmt = STENCIL_INDEX; else if(conv.get()=="DEPTH_COMPONENT") fmt = DEPTH_COMPONENT; - else if(conv.get()=="RED") - fmt = RED; - else if(conv.get()=="GREEN") - fmt = GREEN; - else if(conv.get()=="BLUE") - fmt = BLUE; - else if(conv.get()=="ALPHA") - fmt = ALPHA; else if(conv.get()=="RGB") fmt = RGB; else if(conv.get()=="RGBA") @@ -32,10 +22,18 @@ void operator>>(const LexicalConverter &conv, PixelFormat &fmt) fmt = BGR; else if(conv.get()=="BGRA") fmt = BGRA; + 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(conv.get()=="LUMINANCE_ALPHA") fmt = LUMINANCE_ALPHA; + else if(conv.get()=="SLUMINANCE") + fmt = SLUMINANCE; + else if(conv.get()=="SLUMINANCE_ALPHA") + fmt = SLUMINANCE_ALPHA; else throw lexical_error(format("conversion of '%s' to PixelFormat", conv.get())); } @@ -44,7 +42,6 @@ PixelFormat pixelformat_from_graphics(Graphics::PixelFormat pf) { switch(pf) { - case Graphics::COLOR_INDEX: return COLOR_INDEX; case Graphics::LUMINANCE: return LUMINANCE; case Graphics::LUMINANCE_ALPHA: return LUMINANCE_ALPHA; case Graphics::RGB: return RGB; @@ -57,16 +54,22 @@ PixelFormat pixelformat_from_graphics(Graphics::PixelFormat pf) } } -PixelFormat storage_pixelformat_from_graphics(Graphics::PixelFormat pf) +PixelFormat storage_pixelformat_from_graphics(Graphics::PixelFormat pf, bool srgb) { + PixelFormat result; switch(pf) { case Graphics::RGBX: case Graphics::BGR: - case Graphics::BGRX: return RGB; - case Graphics::BGRA: return RGBA; - default: return pixelformat_from_graphics(pf); + case Graphics::BGRX: result = RGB; break; + case Graphics::BGRA: result = RGBA; break; + default: result = pixelformat_from_graphics(pf); } + + if(srgb) + return get_srgb_pixelformat(result); + else + return result; } PixelFormat get_base_pixelformat(PixelFormat pf) @@ -75,16 +78,43 @@ 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; + case DEPTH_COMPONENT16: + case DEPTH_COMPONENT24: + case DEPTH_COMPONENT32: return DEPTH_COMPONENT; + default: return pf; + } +} + +PixelFormat get_srgb_pixelformat(PixelFormat pf) +{ + switch(pf) + { + case RGB: return SRGB; + case RGBA: return SRGB_ALPHA; + case RGB8: return SRGB8; + case RGBA8: return SRGB8_ALPHA8; + case LUMINANCE: return SLUMINANCE; + case LUMINANCE8: return SLUMINANCE8; + case LUMINANCE_ALPHA: return SLUMINANCE_ALPHA; + case LUMINANCE_ALPHA8: return SLUMINANCE8_ALPHA8; default: return pf; } } @@ -93,15 +123,13 @@ 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: @@ -110,10 +138,38 @@ unsigned get_component_count(PixelFormat pf) case BGRA: return 4; default: - throw invalid_argument("get_pixelformat_component_count"); + throw invalid_argument("get_component_count"); + } +} + +unsigned get_component_size(PixelFormat pf) +{ + switch(pf) + { + case RGB16F: + case RGBA16F: + case LUMINANCE16F: + case LUMINANCE_ALPHA16F: + case DEPTH_COMPONENT16: + return 2; + case DEPTH_COMPONENT24: + return 3; + case RGB32F: + case RGBA32F: + case LUMINANCE32F: + case LUMINANCE_ALPHA32F: + case DEPTH_COMPONENT32: + return 4; + default: + return 1; } } +unsigned get_pixel_size(PixelFormat pf) +{ + return get_component_count(pf)*get_component_size(pf); +} + void require_pixelformat(PixelFormat pf) { switch(pf) @@ -128,10 +184,26 @@ void require_pixelformat(PixelFormat pf) 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; + case DEPTH_COMPONENT: + case DEPTH_COMPONENT16: + case DEPTH_COMPONENT24: + case DEPTH_COMPONENT32: + { static Require _req(ARB_depth_texture); } + break; default: break; }