Browse Source

pixelformat: Add pack and unpack for B5G6R5 (#281)

* pixelformat: Add pack and unpack for B5G6R5

Invert R5G6B5 and B5G6R5

* pixelformat: Fix typo in BGRA4
Sandy 3 years ago
parent
commit
2a81637f99
2 changed files with 28 additions and 5 deletions
  1. 23 4
      include/bx/inline/pixelformat.inl
  2. 5 1
      include/bx/pixelformat.h

+ 23 - 4
include/bx/inline/pixelformat.inl

@@ -823,8 +823,8 @@ namespace bx
 		memCopy(_dst, _src, 16);
 		memCopy(_dst, _src, 16);
 	}
 	}
 
 
-	// R5G6B5
-	inline void packR5G6B5(void* _dst, const float* _src)
+	// B5G6R5
+	inline void packB5G6R5(void* _dst, const float* _src)
 	{
 	{
 		*( (uint16_t*)_dst) = 0
 		*( (uint16_t*)_dst) = 0
 			| uint16_t(toUnorm(_src[0], 31.0f)<<11)
 			| uint16_t(toUnorm(_src[0], 31.0f)<<11)
@@ -833,7 +833,7 @@ namespace bx
 			;
 			;
 	}
 	}
 
 
-	inline void unpackR5G6B5(float* _dst, const void* _src)
+	inline void unpackB5G6R5(float* _dst, const void* _src)
 	{
 	{
 		uint16_t packed = *( (const uint16_t*)_src);
 		uint16_t packed = *( (const uint16_t*)_src);
 		_dst[0] = float( ( (packed>>11) & 0x1f) ) / 31.0f;
 		_dst[0] = float( ( (packed>>11) & 0x1f) ) / 31.0f;
@@ -842,6 +842,25 @@ namespace bx
 		_dst[3] = 1.0f;
 		_dst[3] = 1.0f;
 	}
 	}
 
 
+	// R5G6B5
+	inline void packR5G6B5(void* _dst, const float* _src)
+	{
+		*( (uint16_t*)_dst) = 0
+			| uint16_t(toUnorm(_src[0], 31.0f)    )
+			| uint16_t(toUnorm(_src[1], 63.0f)<< 5)
+			| uint16_t(toUnorm(_src[2], 31.0f)<<11)
+			;
+	}
+
+	inline void unpackR5G6B5(float* _dst, const void* _src)
+	{
+		uint16_t packed = *( (const uint16_t*)_src);
+		_dst[0] = float( ( (packed    ) & 0x1f) ) / 31.0f;
+		_dst[1] = float( ( (packed>> 5) & 0x3f) ) / 63.0f;
+		_dst[2] = float( ( (packed>>11) & 0x1f) ) / 31.0f;
+		_dst[3] = 1.0f;
+	}
+
 	// RGBA4
 	// RGBA4
 	inline void packRgba4(void* _dst, const float* _src)
 	inline void packRgba4(void* _dst, const float* _src)
 	{
 	{
@@ -862,7 +881,7 @@ namespace bx
 		_dst[3] = float( ( (packed>>12) & 0xf) ) / 15.0f;
 		_dst[3] = float( ( (packed>>12) & 0xf) ) / 15.0f;
 	}
 	}
 
 
-	// RGBA4
+	// BGRA4
 	inline void packBgra4(void* _dst, const float* _src)
 	inline void packBgra4(void* _dst, const float* _src)
 	{
 	{
 		*( (uint16_t*)_dst) = 0
 		*( (uint16_t*)_dst) = 0

+ 5 - 1
include/bx/pixelformat.h

@@ -209,6 +209,10 @@ namespace bx
 	void packRgba32F(void* _dst, const float* _src);
 	void packRgba32F(void* _dst, const float* _src);
 	void unpackRgba32F(float* _dst, const void* _src);
 	void unpackRgba32F(float* _dst, const void* _src);
 
 
+	// B5G6R5
+	void packB5G6R5(void* _dst, const float* _src);
+	void unpackB5G6R5(float* _dst, const void* _src);
+
 	// R5G6B5
 	// R5G6B5
 	void packR5G6B5(void* _dst, const float* _src);
 	void packR5G6B5(void* _dst, const float* _src);
 	void unpackR5G6B5(float* _dst, const void* _src);
 	void unpackR5G6B5(float* _dst, const void* _src);
@@ -217,7 +221,7 @@ namespace bx
 	void packRgba4(void* _dst, const float* _src);
 	void packRgba4(void* _dst, const float* _src);
 	void unpackRgba4(float* _dst, const void* _src);
 	void unpackRgba4(float* _dst, const void* _src);
 
 
-	// RGBA4
+	// BGRA4
 	void packBgra4(void* _dst, const float* _src);
 	void packBgra4(void* _dst, const float* _src);
 	void unpackBgra4(float* _dst, const void* _src);
 	void unpackBgra4(float* _dst, const void* _src);