Implement sRGB conversion for the fallback path.

Change-Id: Idba9017de6bf92142e2281bdca3cb6c73ea2451d
Reviewed-on: https://swiftshader-review.googlesource.com/14491
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Renderer/Surface.cpp b/src/Renderer/Surface.cpp
index 899e7e1..cbb7987 100644
--- a/src/Renderer/Surface.cpp
+++ b/src/Renderer/Surface.cpp
@@ -66,265 +66,277 @@
 
 	inline void Surface::Buffer::write(void *element, const Color<float> &color)
 	{
+		float r = color.r;
+		float g = color.g;
+		float b = color.b;
+		float a = color.a;
+
+		if(isSRGBformat(format))
+		{
+			r = linearToSRGB(r);
+			g = linearToSRGB(g);
+			b = linearToSRGB(b);
+		}
+
 		switch(format)
 		{
 		case FORMAT_A8:
-			*(unsigned char*)element = unorm<8>(color.a);
+			*(unsigned char*)element = unorm<8>(a);
 			break;
 		case FORMAT_R8I_SNORM:
-			*(char*)element = snorm<8>(color.r);
+			*(char*)element = snorm<8>(r);
 			break;
 		case FORMAT_R8:
-			*(unsigned char*)element = unorm<8>(color.r);
+			*(unsigned char*)element = unorm<8>(r);
 			break;
 		case FORMAT_R8I:
-			*(char*)element = scast<8>(color.r);
+			*(char*)element = scast<8>(r);
 			break;
 		case FORMAT_R8UI:
-			*(unsigned char*)element = ucast<8>(color.r);
+			*(unsigned char*)element = ucast<8>(r);
 			break;
 		case FORMAT_R16I:
-			*(short*)element = scast<16>(color.r);
+			*(short*)element = scast<16>(r);
 			break;
 		case FORMAT_R16UI:
-			*(unsigned short*)element = ucast<16>(color.r);
+			*(unsigned short*)element = ucast<16>(r);
 			break;
 		case FORMAT_R32I:
-			*(int*)element = static_cast<int>(color.r);
+			*(int*)element = static_cast<int>(r);
 			break;
 		case FORMAT_R32UI:
-			*(unsigned int*)element = static_cast<unsigned int>(color.r);
+			*(unsigned int*)element = static_cast<unsigned int>(r);
 			break;
 		case FORMAT_R3G3B2:
-			*(unsigned char*)element = (unorm<3>(color.r) << 5) | (unorm<3>(color.g) << 2) | (unorm<2>(color.b) << 0);
+			*(unsigned char*)element = (unorm<3>(r) << 5) | (unorm<3>(g) << 2) | (unorm<2>(b) << 0);
 			break;
 		case FORMAT_A8R3G3B2:
-			*(unsigned short*)element = (unorm<8>(color.a) << 8) | (unorm<3>(color.r) << 5) | (unorm<3>(color.g) << 2) | (unorm<2>(color.b) << 0);
+			*(unsigned short*)element = (unorm<8>(a) << 8) | (unorm<3>(r) << 5) | (unorm<3>(g) << 2) | (unorm<2>(b) << 0);
 			break;
 		case FORMAT_X4R4G4B4:
-			*(unsigned short*)element = 0xF000 | (unorm<4>(color.r) << 8) | (unorm<4>(color.g) << 4) | (unorm<4>(color.b) << 0);
+			*(unsigned short*)element = 0xF000 | (unorm<4>(r) << 8) | (unorm<4>(g) << 4) | (unorm<4>(b) << 0);
 			break;
 		case FORMAT_A4R4G4B4:
-			*(unsigned short*)element = (unorm<4>(color.a) << 12) | (unorm<4>(color.r) << 8) | (unorm<4>(color.g) << 4) | (unorm<4>(color.b) << 0);
+			*(unsigned short*)element = (unorm<4>(a) << 12) | (unorm<4>(r) << 8) | (unorm<4>(g) << 4) | (unorm<4>(b) << 0);
 			break;
 		case FORMAT_R4G4B4A4:
-			*(unsigned short*)element = (unorm<4>(color.r) << 12) | (unorm<4>(color.g) << 8) | (unorm<4>(color.b) << 4) | (unorm<4>(color.a) << 0);
+			*(unsigned short*)element = (unorm<4>(r) << 12) | (unorm<4>(g) << 8) | (unorm<4>(b) << 4) | (unorm<4>(a) << 0);
 			break;
 		case FORMAT_R5G6B5:
-			*(unsigned short*)element = (unorm<5>(color.r) << 11) | (unorm<6>(color.g) << 5) | (unorm<5>(color.b) << 0);
+			*(unsigned short*)element = (unorm<5>(r) << 11) | (unorm<6>(g) << 5) | (unorm<5>(b) << 0);
 			break;
 		case FORMAT_A1R5G5B5:
-			*(unsigned short*)element = (unorm<1>(color.a) << 15) | (unorm<5>(color.r) << 10) | (unorm<5>(color.g) << 5) | (unorm<5>(color.b) << 0);
+			*(unsigned short*)element = (unorm<1>(a) << 15) | (unorm<5>(r) << 10) | (unorm<5>(g) << 5) | (unorm<5>(b) << 0);
 			break;
 		case FORMAT_R5G5B5A1:
-			*(unsigned short*)element = (unorm<5>(color.r) << 11) | (unorm<5>(color.g) << 6) | (unorm<5>(color.b) << 1) | (unorm<5>(color.a) << 0);
+			*(unsigned short*)element = (unorm<5>(r) << 11) | (unorm<5>(g) << 6) | (unorm<5>(b) << 1) | (unorm<5>(a) << 0);
 			break;
 		case FORMAT_X1R5G5B5:
-			*(unsigned short*)element = 0x8000 | (unorm<5>(color.r) << 10) | (unorm<5>(color.g) << 5) | (unorm<5>(color.b) << 0);
+			*(unsigned short*)element = 0x8000 | (unorm<5>(r) << 10) | (unorm<5>(g) << 5) | (unorm<5>(b) << 0);
 			break;
 		case FORMAT_A8R8G8B8:
-			*(unsigned int*)element = (unorm<8>(color.a) << 24) | (unorm<8>(color.r) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.b) << 0);
+			*(unsigned int*)element = (unorm<8>(a) << 24) | (unorm<8>(r) << 16) | (unorm<8>(g) << 8) | (unorm<8>(b) << 0);
 			break;
 		case FORMAT_X8R8G8B8:
-			*(unsigned int*)element = 0xFF000000 | (unorm<8>(color.r) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.b) << 0);
+			*(unsigned int*)element = 0xFF000000 | (unorm<8>(r) << 16) | (unorm<8>(g) << 8) | (unorm<8>(b) << 0);
 			break;
 		case FORMAT_A8B8G8R8I_SNORM:
-			*(unsigned int*)element = (static_cast<unsigned int>(snorm<8>(color.a)) << 24) |
-			                          (static_cast<unsigned int>(snorm<8>(color.b)) << 16) |
-			                          (static_cast<unsigned int>(snorm<8>(color.g)) << 8) |
-			                          (static_cast<unsigned int>(snorm<8>(color.r)) << 0);
+			*(unsigned int*)element = (static_cast<unsigned int>(snorm<8>(a)) << 24) |
+			                          (static_cast<unsigned int>(snorm<8>(b)) << 16) |
+			                          (static_cast<unsigned int>(snorm<8>(g)) << 8) |
+			                          (static_cast<unsigned int>(snorm<8>(r)) << 0);
 			break;
 		case FORMAT_A8B8G8R8:
 		case FORMAT_SRGB8_A8:
-			*(unsigned int*)element = (unorm<8>(color.a) << 24) | (unorm<8>(color.b) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0);
+			*(unsigned int*)element = (unorm<8>(a) << 24) | (unorm<8>(b) << 16) | (unorm<8>(g) << 8) | (unorm<8>(r) << 0);
 			break;
 		case FORMAT_A8B8G8R8I:
-			*(unsigned int*)element = (static_cast<unsigned int>(scast<8>(color.a)) << 24) |
-			                          (static_cast<unsigned int>(scast<8>(color.b)) << 16) |
-			                          (static_cast<unsigned int>(scast<8>(color.g)) << 8) |
-			                          (static_cast<unsigned int>(scast<8>(color.r)) << 0);
+			*(unsigned int*)element = (static_cast<unsigned int>(scast<8>(a)) << 24) |
+			                          (static_cast<unsigned int>(scast<8>(b)) << 16) |
+			                          (static_cast<unsigned int>(scast<8>(g)) << 8) |
+			                          (static_cast<unsigned int>(scast<8>(r)) << 0);
 			break;
 		case FORMAT_A8B8G8R8UI:
-			*(unsigned int*)element = (ucast<8>(color.a) << 24) | (ucast<8>(color.b) << 16) | (ucast<8>(color.g) << 8) | (ucast<8>(color.r) << 0);
+			*(unsigned int*)element = (ucast<8>(a) << 24) | (ucast<8>(b) << 16) | (ucast<8>(g) << 8) | (ucast<8>(r) << 0);
 			break;
 		case FORMAT_X8B8G8R8I_SNORM:
 			*(unsigned int*)element = 0x7F000000 |
-			                          (static_cast<unsigned int>(snorm<8>(color.b)) << 16) |
-			                          (static_cast<unsigned int>(snorm<8>(color.g)) << 8) |
-			                          (static_cast<unsigned int>(snorm<8>(color.r)) << 0);
+			                          (static_cast<unsigned int>(snorm<8>(b)) << 16) |
+			                          (static_cast<unsigned int>(snorm<8>(g)) << 8) |
+			                          (static_cast<unsigned int>(snorm<8>(r)) << 0);
 			break;
 		case FORMAT_X8B8G8R8:
 		case FORMAT_SRGB8_X8:
-			*(unsigned int*)element = 0xFF000000 | (unorm<8>(color.b) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0);
+			*(unsigned int*)element = 0xFF000000 | (unorm<8>(b) << 16) | (unorm<8>(g) << 8) | (unorm<8>(r) << 0);
 			break;
 		case FORMAT_X8B8G8R8I:
 			*(unsigned int*)element = 0x7F000000 |
-			                          (static_cast<unsigned int>(scast<8>(color.b)) << 16) |
-			                          (static_cast<unsigned int>(scast<8>(color.g)) << 8) |
-			                          (static_cast<unsigned int>(scast<8>(color.r)) << 0);
+			                          (static_cast<unsigned int>(scast<8>(b)) << 16) |
+			                          (static_cast<unsigned int>(scast<8>(g)) << 8) |
+			                          (static_cast<unsigned int>(scast<8>(r)) << 0);
 		case FORMAT_X8B8G8R8UI:
-			*(unsigned int*)element = 0xFF000000 | (ucast<8>(color.b) << 16) | (ucast<8>(color.g) << 8) | (ucast<8>(color.r) << 0);
+			*(unsigned int*)element = 0xFF000000 | (ucast<8>(b) << 16) | (ucast<8>(g) << 8) | (ucast<8>(r) << 0);
 			break;
 		case FORMAT_A2R10G10B10:
-			*(unsigned int*)element = (unorm<2>(color.a) << 30) | (unorm<10>(color.r) << 20) | (unorm<10>(color.g) << 10) | (unorm<10>(color.b) << 0);
+			*(unsigned int*)element = (unorm<2>(a) << 30) | (unorm<10>(r) << 20) | (unorm<10>(g) << 10) | (unorm<10>(b) << 0);
 			break;
 		case FORMAT_A2B10G10R10:
 		case FORMAT_A2B10G10R10UI:
-			*(unsigned int*)element = (unorm<2>(color.a) << 30) | (unorm<10>(color.b) << 20) | (unorm<10>(color.g) << 10) | (unorm<10>(color.r) << 0);
+			*(unsigned int*)element = (unorm<2>(a) << 30) | (unorm<10>(b) << 20) | (unorm<10>(g) << 10) | (unorm<10>(r) << 0);
 			break;
 		case FORMAT_G8R8I_SNORM:
-			*(unsigned short*)element = (static_cast<unsigned short>(snorm<8>(color.g)) << 8) |
-			                            (static_cast<unsigned short>(snorm<8>(color.r)) << 0);
+			*(unsigned short*)element = (static_cast<unsigned short>(snorm<8>(g)) << 8) |
+			                            (static_cast<unsigned short>(snorm<8>(r)) << 0);
 			break;
 		case FORMAT_G8R8:
-			*(unsigned short*)element = (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0);
+			*(unsigned short*)element = (unorm<8>(g) << 8) | (unorm<8>(r) << 0);
 			break;
 		case FORMAT_G8R8I:
-			*(unsigned short*)element = (static_cast<unsigned short>(scast<8>(color.g)) << 8) |
-			                            (static_cast<unsigned short>(scast<8>(color.r)) << 0);
+			*(unsigned short*)element = (static_cast<unsigned short>(scast<8>(g)) << 8) |
+			                            (static_cast<unsigned short>(scast<8>(r)) << 0);
 			break;
 		case FORMAT_G8R8UI:
-			*(unsigned short*)element = (ucast<8>(color.g) << 8) | (ucast<8>(color.r) << 0);
+			*(unsigned short*)element = (ucast<8>(g) << 8) | (ucast<8>(r) << 0);
 			break;
 		case FORMAT_G16R16:
-			*(unsigned int*)element = (unorm<16>(color.g) << 16) | (unorm<16>(color.r) << 0);
+			*(unsigned int*)element = (unorm<16>(g) << 16) | (unorm<16>(r) << 0);
 			break;
 		case FORMAT_G16R16I:
-			*(unsigned int*)element = (static_cast<unsigned int>(scast<16>(color.g)) << 16) |
-			                          (static_cast<unsigned int>(scast<16>(color.r)) << 0);
+			*(unsigned int*)element = (static_cast<unsigned int>(scast<16>(g)) << 16) |
+			                          (static_cast<unsigned int>(scast<16>(r)) << 0);
 			break;
 		case FORMAT_G16R16UI:
-			*(unsigned int*)element = (ucast<16>(color.g) << 16) | (ucast<16>(color.r) << 0);
+			*(unsigned int*)element = (ucast<16>(g) << 16) | (ucast<16>(r) << 0);
 			break;
 		case FORMAT_G32R32I:
 		case FORMAT_G32R32UI:
-			((unsigned int*)element)[0] = static_cast<unsigned int>(color.r);
-			((unsigned int*)element)[1] = static_cast<unsigned int>(color.g);
+			((unsigned int*)element)[0] = static_cast<unsigned int>(r);
+			((unsigned int*)element)[1] = static_cast<unsigned int>(g);
 			break;
 		case FORMAT_A16B16G16R16:
-			((unsigned short*)element)[0] = unorm<16>(color.r);
-			((unsigned short*)element)[1] = unorm<16>(color.g);
-			((unsigned short*)element)[2] = unorm<16>(color.b);
-			((unsigned short*)element)[3] = unorm<16>(color.a);
+			((unsigned short*)element)[0] = unorm<16>(r);
+			((unsigned short*)element)[1] = unorm<16>(g);
+			((unsigned short*)element)[2] = unorm<16>(b);
+			((unsigned short*)element)[3] = unorm<16>(a);
 			break;
 		case FORMAT_A16B16G16R16I:
-			((unsigned short*)element)[0] = static_cast<unsigned short>(scast<16>(color.r));
-			((unsigned short*)element)[1] = static_cast<unsigned short>(scast<16>(color.g));
-			((unsigned short*)element)[2] = static_cast<unsigned short>(scast<16>(color.b));
-			((unsigned short*)element)[3] = static_cast<unsigned short>(scast<16>(color.a));
+			((unsigned short*)element)[0] = static_cast<unsigned short>(scast<16>(r));
+			((unsigned short*)element)[1] = static_cast<unsigned short>(scast<16>(g));
+			((unsigned short*)element)[2] = static_cast<unsigned short>(scast<16>(b));
+			((unsigned short*)element)[3] = static_cast<unsigned short>(scast<16>(a));
 			break;
 		case FORMAT_A16B16G16R16UI:
-			((unsigned short*)element)[0] = static_cast<unsigned short>(ucast<16>(color.r));
-			((unsigned short*)element)[1] = static_cast<unsigned short>(ucast<16>(color.g));
-			((unsigned short*)element)[2] = static_cast<unsigned short>(ucast<16>(color.b));
-			((unsigned short*)element)[3] = static_cast<unsigned short>(ucast<16>(color.a));
+			((unsigned short*)element)[0] = static_cast<unsigned short>(ucast<16>(r));
+			((unsigned short*)element)[1] = static_cast<unsigned short>(ucast<16>(g));
+			((unsigned short*)element)[2] = static_cast<unsigned short>(ucast<16>(b));
+			((unsigned short*)element)[3] = static_cast<unsigned short>(ucast<16>(a));
 			break;
 		case FORMAT_X16B16G16R16I:
-			((unsigned short*)element)[0] = static_cast<unsigned short>(scast<16>(color.r));
-			((unsigned short*)element)[1] = static_cast<unsigned short>(scast<16>(color.g));
-			((unsigned short*)element)[2] = static_cast<unsigned short>(scast<16>(color.b));
+			((unsigned short*)element)[0] = static_cast<unsigned short>(scast<16>(r));
+			((unsigned short*)element)[1] = static_cast<unsigned short>(scast<16>(g));
+			((unsigned short*)element)[2] = static_cast<unsigned short>(scast<16>(b));
 			break;
 		case FORMAT_X16B16G16R16UI:
-			((unsigned short*)element)[0] = static_cast<unsigned short>(ucast<16>(color.r));
-			((unsigned short*)element)[1] = static_cast<unsigned short>(ucast<16>(color.g));
-			((unsigned short*)element)[2] = static_cast<unsigned short>(ucast<16>(color.b));
+			((unsigned short*)element)[0] = static_cast<unsigned short>(ucast<16>(r));
+			((unsigned short*)element)[1] = static_cast<unsigned short>(ucast<16>(g));
+			((unsigned short*)element)[2] = static_cast<unsigned short>(ucast<16>(b));
 			break;
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A32B32G32R32UI:
-			((unsigned int*)element)[0] = static_cast<unsigned int>(color.r);
-			((unsigned int*)element)[1] = static_cast<unsigned int>(color.g);
-			((unsigned int*)element)[2] = static_cast<unsigned int>(color.b);
-			((unsigned int*)element)[3] = static_cast<unsigned int>(color.a);
+			((unsigned int*)element)[0] = static_cast<unsigned int>(r);
+			((unsigned int*)element)[1] = static_cast<unsigned int>(g);
+			((unsigned int*)element)[2] = static_cast<unsigned int>(b);
+			((unsigned int*)element)[3] = static_cast<unsigned int>(a);
 			break;
 		case FORMAT_X32B32G32R32I:
 		case FORMAT_X32B32G32R32UI:
-			((unsigned int*)element)[0] = static_cast<unsigned int>(color.r);
-			((unsigned int*)element)[1] = static_cast<unsigned int>(color.g);
-			((unsigned int*)element)[2] = static_cast<unsigned int>(color.b);
+			((unsigned int*)element)[0] = static_cast<unsigned int>(r);
+			((unsigned int*)element)[1] = static_cast<unsigned int>(g);
+			((unsigned int*)element)[2] = static_cast<unsigned int>(b);
 			break;
 		case FORMAT_V8U8:
-			*(unsigned short*)element = (snorm<8>(color.g) << 8) | (snorm<8>(color.r) << 0);
+			*(unsigned short*)element = (snorm<8>(g) << 8) | (snorm<8>(r) << 0);
 			break;
 		case FORMAT_L6V5U5:
-			*(unsigned short*)element = (unorm<6>(color.b) << 10) | (snorm<5>(color.g) << 5) | (snorm<5>(color.r) << 0);
+			*(unsigned short*)element = (unorm<6>(b) << 10) | (snorm<5>(g) << 5) | (snorm<5>(r) << 0);
 			break;
 		case FORMAT_Q8W8V8U8:
-			*(unsigned int*)element = (snorm<8>(color.a) << 24) | (snorm<8>(color.b) << 16) | (snorm<8>(color.g) << 8) | (snorm<8>(color.r) << 0);
+			*(unsigned int*)element = (snorm<8>(a) << 24) | (snorm<8>(b) << 16) | (snorm<8>(g) << 8) | (snorm<8>(r) << 0);
 			break;
 		case FORMAT_X8L8V8U8:
-			*(unsigned int*)element = 0xFF000000 | (unorm<8>(color.b) << 16) | (snorm<8>(color.g) << 8) | (snorm<8>(color.r) << 0);
+			*(unsigned int*)element = 0xFF000000 | (unorm<8>(b) << 16) | (snorm<8>(g) << 8) | (snorm<8>(r) << 0);
 			break;
 		case FORMAT_V16U16:
-			*(unsigned int*)element = (snorm<16>(color.g) << 16) | (snorm<16>(color.r) << 0);
+			*(unsigned int*)element = (snorm<16>(g) << 16) | (snorm<16>(r) << 0);
 			break;
 		case FORMAT_A2W10V10U10:
-			*(unsigned int*)element = (unorm<2>(color.a) << 30) | (snorm<10>(color.b) << 20) | (snorm<10>(color.g) << 10) | (snorm<10>(color.r) << 0);
+			*(unsigned int*)element = (unorm<2>(a) << 30) | (snorm<10>(b) << 20) | (snorm<10>(g) << 10) | (snorm<10>(r) << 0);
 			break;
 		case FORMAT_A16W16V16U16:
-			((unsigned short*)element)[0] = snorm<16>(color.r);
-			((unsigned short*)element)[1] = snorm<16>(color.g);
-			((unsigned short*)element)[2] = snorm<16>(color.b);
-			((unsigned short*)element)[3] = unorm<16>(color.a);
+			((unsigned short*)element)[0] = snorm<16>(r);
+			((unsigned short*)element)[1] = snorm<16>(g);
+			((unsigned short*)element)[2] = snorm<16>(b);
+			((unsigned short*)element)[3] = unorm<16>(a);
 			break;
 		case FORMAT_Q16W16V16U16:
-			((unsigned short*)element)[0] = snorm<16>(color.r);
-			((unsigned short*)element)[1] = snorm<16>(color.g);
-			((unsigned short*)element)[2] = snorm<16>(color.b);
-			((unsigned short*)element)[3] = snorm<16>(color.a);
+			((unsigned short*)element)[0] = snorm<16>(r);
+			((unsigned short*)element)[1] = snorm<16>(g);
+			((unsigned short*)element)[2] = snorm<16>(b);
+			((unsigned short*)element)[3] = snorm<16>(a);
 			break;
 		case FORMAT_R8G8B8:
-			((unsigned char*)element)[0] = unorm<8>(color.b);
-			((unsigned char*)element)[1] = unorm<8>(color.g);
-			((unsigned char*)element)[2] = unorm<8>(color.r);
+			((unsigned char*)element)[0] = unorm<8>(b);
+			((unsigned char*)element)[1] = unorm<8>(g);
+			((unsigned char*)element)[2] = unorm<8>(r);
 			break;
 		case FORMAT_B8G8R8:
-			((unsigned char*)element)[0] = unorm<8>(color.r);
-			((unsigned char*)element)[1] = unorm<8>(color.g);
-			((unsigned char*)element)[2] = unorm<8>(color.b);
+			((unsigned char*)element)[0] = unorm<8>(r);
+			((unsigned char*)element)[1] = unorm<8>(g);
+			((unsigned char*)element)[2] = unorm<8>(b);
 			break;
 		case FORMAT_R16F:
-			*(half*)element = (half)color.r;
+			*(half*)element = (half)r;
 			break;
 		case FORMAT_A16F:
-			*(half*)element = (half)color.a;
+			*(half*)element = (half)a;
 			break;
 		case FORMAT_G16R16F:
-			((half*)element)[0] = (half)color.r;
-			((half*)element)[1] = (half)color.g;
+			((half*)element)[0] = (half)r;
+			((half*)element)[1] = (half)g;
 			break;
 		case FORMAT_B16G16R16F:
-			((half*)element)[0] = (half)color.r;
-			((half*)element)[1] = (half)color.g;
-			((half*)element)[2] = (half)color.b;
+			((half*)element)[0] = (half)r;
+			((half*)element)[1] = (half)g;
+			((half*)element)[2] = (half)b;
 			break;
 		case FORMAT_A16B16G16R16F:
-			((half*)element)[0] = (half)color.r;
-			((half*)element)[1] = (half)color.g;
-			((half*)element)[2] = (half)color.b;
-			((half*)element)[3] = (half)color.a;
+			((half*)element)[0] = (half)r;
+			((half*)element)[1] = (half)g;
+			((half*)element)[2] = (half)b;
+			((half*)element)[3] = (half)a;
 			break;
 		case FORMAT_A32F:
-			*(float*)element = color.a;
+			*(float*)element = a;
 			break;
 		case FORMAT_R32F:
-			*(float*)element = color.r;
+			*(float*)element = r;
 			break;
 		case FORMAT_G32R32F:
-			((float*)element)[0] = color.r;
-			((float*)element)[1] = color.g;
+			((float*)element)[0] = r;
+			((float*)element)[1] = g;
 			break;
 		case FORMAT_X32B32G32R32F:
 			((float*)element)[3] = 1.0f;
 		case FORMAT_B32G32R32F:
-			((float*)element)[0] = color.r;
-			((float*)element)[1] = color.g;
-			((float*)element)[2] = color.b;
+			((float*)element)[0] = r;
+			((float*)element)[1] = g;
+			((float*)element)[2] = b;
 			break;
 		case FORMAT_A32B32G32R32F:
-			((float*)element)[0] = color.r;
-			((float*)element)[1] = color.g;
-			((float*)element)[2] = color.b;
-			((float*)element)[3] = color.a;
+			((float*)element)[0] = r;
+			((float*)element)[1] = g;
+			((float*)element)[2] = b;
+			((float*)element)[3] = a;
 			break;
 		case FORMAT_D32F:
 		case FORMAT_D32FS8:
@@ -332,40 +344,40 @@
 		case FORMAT_D32FS8_TEXTURE:
 		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
-			*((float*)element) = color.r;
+			*((float*)element) = r;
 			break;
 		case FORMAT_D32F_COMPLEMENTARY:
 		case FORMAT_D32FS8_COMPLEMENTARY:
-			*((float*)element) = 1 - color.r;
+			*((float*)element) = 1 - r;
 			break;
 		case FORMAT_S8:
-			*((unsigned char*)element) = unorm<8>(color.r);
+			*((unsigned char*)element) = unorm<8>(r);
 			break;
 		case FORMAT_L8:
-			*(unsigned char*)element = unorm<8>(color.r);
+			*(unsigned char*)element = unorm<8>(r);
 			break;
 		case FORMAT_A4L4:
-			*(unsigned char*)element = (unorm<4>(color.a) << 4) | (unorm<4>(color.r) << 0);
+			*(unsigned char*)element = (unorm<4>(a) << 4) | (unorm<4>(r) << 0);
 			break;
 		case FORMAT_L16:
-			*(unsigned short*)element = unorm<16>(color.r);
+			*(unsigned short*)element = unorm<16>(r);
 			break;
 		case FORMAT_A8L8:
-			*(unsigned short*)element = (unorm<8>(color.a) << 8) | (unorm<8>(color.r) << 0);
+			*(unsigned short*)element = (unorm<8>(a) << 8) | (unorm<8>(r) << 0);
 			break;
 		case FORMAT_L16F:
-			*(half*)element = (half)color.r;
+			*(half*)element = (half)r;
 			break;
 		case FORMAT_A16L16F:
-			((half*)element)[0] = (half)color.r;
-			((half*)element)[1] = (half)color.a;
+			((half*)element)[0] = (half)r;
+			((half*)element)[1] = (half)a;
 			break;
 		case FORMAT_L32F:
-			*(float*)element = color.r;
+			*(float*)element = r;
 			break;
 		case FORMAT_A32L32F:
-			((float*)element)[0] = color.r;
-			((float*)element)[1] = color.a;
+			((float*)element)[0] = r;
+			((float*)element)[1] = a;
 			break;
 		default:
 			ASSERT(false);
@@ -1008,12 +1020,12 @@
 			ASSERT(false);
 		}
 
-	//	if(sRGB)
-	//	{
-	//		r = sRGBtoLinear(r);
-	//		g = sRGBtoLinear(g);
-	//		b = sRGBtoLinear(b);
-	//	}
+		if(isSRGBformat(format))
+		{
+			r = sRGBtoLinear(r);
+			g = sRGBtoLinear(g);
+			b = sRGBtoLinear(b);
+		}
 
 		return Color<float>(r, g, b, a);
 	}