Skip to content

Commit

Permalink
Speedup other 2L convertions
Browse files Browse the repository at this point in the history
  • Loading branch information
homm committed Oct 2, 2017
1 parent 9940519 commit 2a41d63
Showing 1 changed file with 33 additions and 4 deletions.
37 changes: 33 additions & 4 deletions libImaging/Convert.c
Original file line number Diff line number Diff line change
Expand Up @@ -241,8 +241,24 @@ rgb2l(UINT8* out, const UINT8* in, int xsize)
static void
rgb2la(UINT8* out, const UINT8* in, int xsize)
{
int x;
for (x = 0; x < xsize; x++, in += 4, out += 4) {
int x = 0;
__m128i coeff = _mm_set_epi16(
0, 3735, 19235, 9798, 0, 3735, 19235, 9798);
for (; x < xsize - 3; x += 4, in += 16, out += 16) {
__m128i pix0, pix1;
__m128i source = _mm_loadu_si128((__m128i*)in);
pix0 = _mm_unpacklo_epi8(source, _mm_setzero_si128());
pix1 = _mm_unpackhi_epi8(source, _mm_setzero_si128());
pix0 = _mm_madd_epi16(pix0, coeff);
pix1 = _mm_madd_epi16(pix1, coeff);
pix0 = _mm_hadd_epi32(pix0, pix1);
pix0 = _mm_srli_epi32(pix0, 15);
pix0 = _mm_shuffle_epi8(pix0, _mm_set_epi8(
-1,12,12,12, -1,8,8,8, -1,4,4,4, -1,0,0,0));
pix0 = _mm_or_si128(pix0, _mm_set1_epi32(0xff000000));
_mm_storeu_si128((__m128i*)out, pix0);
}
for (; x < xsize; x++, in += 4, out += 4) {
/* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */
out[0] = out[1] = out[2] = L24(in) >> 16;
out[3] = 255;
Expand All @@ -252,9 +268,22 @@ rgb2la(UINT8* out, const UINT8* in, int xsize)
static void
rgb2i(UINT8* out_, const UINT8* in, int xsize)
{
int x;
int x = 0;
INT32* out = (INT32*) out_;
for (x = 0; x < xsize; x++, in += 4)
__m128i coeff = _mm_set_epi16(
0, 3735, 19235, 9798, 0, 3735, 19235, 9798);
for (; x < xsize - 3; x += 4, in += 16, out += 4) {
__m128i pix0, pix1;
__m128i source = _mm_loadu_si128((__m128i*)in);
pix0 = _mm_unpacklo_epi8(source, _mm_setzero_si128());
pix1 = _mm_unpackhi_epi8(source, _mm_setzero_si128());
pix0 = _mm_madd_epi16(pix0, coeff);
pix1 = _mm_madd_epi16(pix1, coeff);
pix0 = _mm_hadd_epi32(pix0, pix1);
pix0 = _mm_srli_epi32(pix0, 15);
_mm_storeu_si128((__m128i*)out, pix0);
}
for (; x < xsize; x++, in += 4)
*out++ = L24(in) >> 16;
}

Expand Down

0 comments on commit 2a41d63

Please sign in to comment.