X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpixelformat.cpp;h=ac2b1ea73dfde7818fab470b45565e1c5f5e32a2;hb=b1c758a602262afad23e28ab68d62021a5b1257e;hp=7647717a44ad3d047e7bfbc0d386a575f5564701;hpb=4d7f66ea28c788e12f700216b9c53af9e71b8390;p=libs%2Fgl.git diff --git a/source/pixelformat.cpp b/source/pixelformat.cpp index 7647717a..ac2b1ea7 100644 --- a/source/pixelformat.cpp +++ b/source/pixelformat.cpp @@ -10,20 +10,14 @@ 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()=="RG") + fmt = RG; else if(conv.get()=="RGB") fmt = RGB; else if(conv.get()=="RGBA") @@ -52,7 +46,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; @@ -65,22 +58,34 @@ 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) { switch(pf) { + case R8: + case R16F: + case R32F: return RED; + case RG8: + case RG16F: + case RG32F: return RG; case RGB8: case RGB16F: case RGB32F: @@ -92,15 +97,37 @@ PixelFormat get_base_pixelformat(PixelFormat pf) case SRGB_ALPHA: case SRGB8_ALPHA8: return RGBA; case LUMINANCE8: - case LUMINANCE16F: - case LUMINANCE32F: case SLUMINANCE: case SLUMINANCE8: return LUMINANCE; case LUMINANCE_ALPHA8: - case LUMINANCE_ALPHA16F: - 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_sized_pixelformat(PixelFormat pf) +{ + switch(pf) + { + case RED: return R8; + case RG: return RG8; + case RGB: return RGB8; + case RGBA: return RGBA8; + case SRGB: return SRGB8; + case SRGB_ALPHA: return SRGB8_ALPHA8; + case LUMINANCE: return LUMINANCE8; + case SLUMINANCE: return SLUMINANCE8; + case LUMINANCE_ALPHA: return LUMINANCE8_ALPHA8; + case SLUMINANCE_ALPHA: return SLUMINANCE8_ALPHA8; + case DEPTH_COMPONENT: + if(get_gl_api()==OPENGL_ES2) + return DEPTH_COMPONENT16; + else + return DEPTH_COMPONENT32; default: return pf; } } @@ -125,15 +152,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 RG: case LUMINANCE_ALPHA: case SLUMINANCE_ALPHA: return 2; @@ -144,7 +169,7 @@ unsigned get_component_count(PixelFormat pf) case BGRA: return 4; default: - throw invalid_argument("get_pixelformat_component_count"); + throw invalid_argument("get_component_count"); } } @@ -152,15 +177,19 @@ unsigned get_component_size(PixelFormat pf) { switch(pf) { + case R16F: + case RG16F: case RGB16F: case RGBA16F: - case LUMINANCE16F: - case LUMINANCE_ALPHA16F: + case DEPTH_COMPONENT16: return 2; + case DEPTH_COMPONENT24: + return 3; + case R32F: + case RG32F: case RGB32F: case RGBA32F: - case LUMINANCE32F: - case LUMINANCE_ALPHA32F: + case DEPTH_COMPONENT32: return 4; default: return 1; @@ -176,14 +205,23 @@ void require_pixelformat(PixelFormat pf) { switch(pf) { + case RED: + case R8: + case RG: + case RG8: + { static Require _req(ARB_texture_rg); } + break; + case R16F: + case R32F: + case RG16F: + case RG32F: + { static Require _req(ARB_texture_rg); } + { static Require _req(ARB_texture_float); } + break; 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: @@ -200,6 +238,12 @@ void require_pixelformat(PixelFormat pf) 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; }