Index: source/row_win.cc |
diff --git a/source/row_win.cc b/source/row_win.cc |
index ad6614edaeeac1cb769b08d4f72ce12644002d5e..1b7322a9ffc005f60919d0c4b419847a334dbf72 100644 |
--- a/source/row_win.cc |
+++ b/source/row_win.cc |
@@ -226,6 +226,24 @@ static const uvec8 kShuffleMaskRAWToARGB = { |
2u, 1u, 0u, 12u, 5u, 4u, 3u, 13u, 8u, 7u, 6u, 14u, 11u, 10u, 9u, 15u |
}; |
+// Shuffle table for converting RAW to RGB24. First 8. |
+static const uvec8 kShuffleMaskRAWToRGB24_0 = { |
+ 2u, 1u, 0u, 5u, 4u, 3u, 8u, 7u, |
+ 128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u |
+}; |
+ |
+// Shuffle table for converting RAW to RGB24. Middle 8. |
+static const uvec8 kShuffleMaskRAWToRGB24_1 = { |
+ 2u, 7u, 6u, 5u, 10u, 9u, 8u, 13u, |
+ 128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u |
+}; |
+ |
+// Shuffle table for converting RAW to RGB24. Last 8. |
+static const uvec8 kShuffleMaskRAWToRGB24_2 = { |
+ 8u, 7u, 12u, 11u, 10u, 15u, 14u, 13u, |
+ 128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u |
+}; |
+ |
// Shuffle table for converting ARGB to RGB24. |
static const uvec8 kShuffleMaskARGBToRGB24 = { |
0u, 1u, 2u, 4u, 5u, 6u, 8u, 9u, 10u, 12u, 13u, 14u, 128u, 128u, 128u, 128u |
@@ -241,11 +259,6 @@ static const uvec8 kShuffleMaskARGBToRGB24_0 = { |
0u, 1u, 2u, 4u, 5u, 6u, 8u, 9u, 128u, 128u, 128u, 128u, 10u, 12u, 13u, 14u |
}; |
-// Shuffle table for converting ARGB to RAW. |
-static const uvec8 kShuffleMaskARGBToRAW_0 = { |
- 2u, 1u, 0u, 6u, 5u, 4u, 10u, 9u, 128u, 128u, 128u, 128u, 8u, 14u, 13u, 12u |
-}; |
- |
// YUY2 shuf 16 Y to 32 Y. |
static const lvec8 kShuffleYUY2Y = { |
0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, |
@@ -413,6 +426,34 @@ void RAWToARGBRow_SSSE3(const uint8* src_raw, uint8* dst_argb, |
} |
} |
+__declspec(naked) |
+void RAWToRGB24Row_SSSE3(const uint8* src_raw, uint8* dst_rgb24, int width) { |
+ __asm { |
+ mov eax, [esp + 4] // src_raw |
+ mov edx, [esp + 8] // dst_rgb24 |
+ mov ecx, [esp + 12] // width |
+ movdqa xmm3, xmmword ptr kShuffleMaskRAWToRGB24_0 |
+ movdqa xmm4, xmmword ptr kShuffleMaskRAWToRGB24_1 |
+ movdqa xmm5, xmmword ptr kShuffleMaskRAWToRGB24_2 |
+ |
+ convertloop: |
+ movdqu xmm0, [eax] |
+ movdqu xmm1, [eax + 4] |
+ movdqu xmm2, [eax + 8] |
+ lea eax, [eax + 24] |
+ pshufb xmm0, xmm3 |
+ pshufb xmm1, xmm4 |
+ pshufb xmm2, xmm5 |
+ movq qword ptr [edx], xmm0 |
+ movq qword ptr [edx + 8], xmm1 |
+ movq qword ptr [edx + 16], xmm2 |
+ lea edx, [edx + 24] |
+ sub ecx, 8 |
+ jg convertloop |
+ ret |
+ } |
+} |
+ |
// pmul method to replicate bits. |
// Math to replicate bits: |
// (v << 8) | (v << 3) |