+void Texture::set_format(PixelFormat fmt)
+{
+ PixelComponents comp = get_components(fmt);
+ PixelComponents st_comp = comp;
+ FormatSwizzle swiz = NO_SWIZZLE;
+ switch(comp)
+ {
+ case LUMINANCE:
+ st_comp = RED;
+ swiz = R_TO_LUMINANCE;
+ break;
+ case LUMINANCE_ALPHA:
+ st_comp = RG;
+ swiz = RG_TO_LUMINANCE_ALPHA;
+ break;
+ case BGR:
+ st_comp = RGB;
+ swiz = RGB_TO_BGR;
+ break;
+ case BGRA:
+ st_comp = RGBA;
+ swiz = RGB_TO_BGR;
+ break;
+ default:;
+ }
+
+ PixelFormat st_fmt = make_pixelformat(st_comp, get_component_type(fmt));
+ require_pixelformat(st_fmt);
+ if(swiz!=NO_SWIZZLE)
+ static Require _req(ARB_texture_swizzle);
+
+ format = fmt;
+ storage_fmt = st_fmt;
+ swizzle = swiz;
+}
+
+void Texture::apply_swizzle()
+{
+ if(swizzle==NO_SWIZZLE)
+ return;
+
+ if(get_gl_api()==OPENGL_ES2)
+ {
+ set_parameter_i(GL_TEXTURE_SWIZZLE_R, swizzle_orders[swizzle*4]);
+ set_parameter_i(GL_TEXTURE_SWIZZLE_G, swizzle_orders[swizzle*4+1]);
+ set_parameter_i(GL_TEXTURE_SWIZZLE_B, swizzle_orders[swizzle*4+2]);
+ set_parameter_i(GL_TEXTURE_SWIZZLE_A, swizzle_orders[swizzle*4+3]);
+ }
+ else
+ {
+ if(ARB_direct_state_access)
+ glTextureParameteriv(id, GL_TEXTURE_SWIZZLE_RGBA, swizzle_orders+swizzle*4);
+ else
+ glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle_orders+swizzle*4);
+ }
+}