template<bool avx, bool aligned> void coloredToBGRA(const __m_auto_i* const src, const __m_auto_i* const srcEnd, __m_auto_i* const dest)
{
  static const __m_auto_i c_0 = _mmauto_setzero_si_all();
  __m_auto_i* pDest = dest;
  for(const __m_auto_i* pSrc = src; pSrc < srcEnd; pSrc++)
  {
    const __m_auto_i p = _mmauto_loadt_si_all<true>(pSrc);

    __m_auto_i pLo = p;
    __m_auto_i pHi = c_0;
    _mmauto_unpacklohi_epi8(pLo, pHi);

    __m_auto_i pLo2 = pLo;
    __m_auto_i pHi2 = c_0;
    _mmauto_unpacklohi_epi8(pLo2, pHi2);
    storeColors<avx, aligned>(pDest++, pLo2);
    storeColors<avx, aligned>(pDest++, pHi2);

    pLo2 = pHi;
    pHi2 = c_0;
    _mmauto_unpacklohi_epi8(pLo2, pHi2);
    storeColors<avx, aligned>(pDest++, pLo2);
    storeColors<avx, aligned>(pDest++, pHi2);
  }
}
Esempio n. 2
0
template<bool avx> void binaryToBGRA(const __m_auto_i* const src, const __m_auto_i* const srcEnd, __m_auto_i* const dest)
{
  static const __m_auto_i alpha = _mmauto_set1_epi32(0xFF000000);
  __m_auto_i* pDest = dest;
  for(const __m_auto_i* pSrc = src; pSrc < srcEnd; pSrc++)
  {
    const __m_auto_i p = _mmauto_cmpgt_epi8(_mmauto_loadt_si_all<true>(pSrc), _mmauto_setzero_si_all());

    __m_auto_i pLo = p;
    __m_auto_i pHi = p;
    _mmauto_unpacklohi_epi8(pLo, pHi);

    __m_auto_i pLo2 = pLo;
    __m_auto_i pHi2 = pLo;
    _mmauto_unpacklohi_epi8(pLo2, pHi2);
    _mmauto_storet_si_all<true>(pDest++, _mmauto_or_si_all(pLo2, alpha));
    _mmauto_storet_si_all<true>(pDest++, _mmauto_or_si_all(pHi2, alpha));

    pLo2 = pHi;
    pHi2 = pHi;
    _mmauto_unpacklohi_epi8(pLo2, pHi2);
    _mmauto_storet_si_all<true>(pDest++, _mmauto_or_si_all(pLo2, alpha));
    _mmauto_storet_si_all<true>(pDest++, _mmauto_or_si_all(pHi2, alpha));
  }
}
template<bool avx, bool aligned> void yuvToBGRA(const __m_auto_i* const src, const __m_auto_i* const srcEnd, __m_auto_i* const dest)
{
  static const __m_auto_i yMask = _mmauto_set1_epi32(0x000000FF);
  static const __m_auto_i channelMask = _mmauto_set1_epi16(0x00FF);
  static const __m_auto_i c_128 = _mmauto_set1_epi16(128);
  static const __m_auto_i c_0 = _mmauto_setzero_si_all();
  static const __m_auto_i alpha = _mmauto_set1_epi8(static_cast<unsigned char>(0xFF));
  static const __m_auto_i scaledInvUCoeff = _mmauto_set1_epi16(static_cast<short>(static_cast<float>(1 << 14) / ColorModelConversions::uCoeff));
  static const __m_auto_i scaledInvVCoeff = _mmauto_set1_epi16(static_cast<short>(static_cast<float>(1 << 14) / ColorModelConversions::vCoeff));
  static const __m_auto_i scaledGCoeffU = _mmauto_set1_epi16(static_cast<short>(ColorModelConversions::yCoeffB / (ColorModelConversions::yCoeffG * ColorModelConversions::uCoeff) * static_cast<float>(1 << 15)));
  static const __m_auto_i scaledGCoeffV = _mmauto_set1_epi16(static_cast<short>(ColorModelConversions::yCoeffR / (ColorModelConversions::yCoeffG * ColorModelConversions::vCoeff) * static_cast<float>(1 << 15)));
  __m_auto_i* pDest = dest;
  for(const __m_auto_i* pSrc = src; pSrc < srcEnd;)
  {
    const __m_auto_i p0 = _mmauto_loadt_si_all<true>(pSrc++);
    const __m_auto_i p1 = _mmauto_loadt_si_all<true>(pSrc++);

    const __m_auto_i y = _mmauto_correct_256op(_mmauto_packs_epi32(_mmauto_and_si_all(_mmauto_srli_epi32(p0, 16), yMask), _mmauto_and_si_all(_mmauto_srli_epi32(p1, 16), yMask)));

    const __m_auto_i uv0 = _mmauto_sub_epi16(_mmauto_and_si_all(_mmauto_srli_si_all(p0, 1), channelMask), c_128);
    const __m_auto_i uv1 = _mmauto_sub_epi16(_mmauto_and_si_all(_mmauto_srli_si_all(p1, 1), channelMask), c_128);
    const __m_auto_i u = _mmauto_correct_256op(_mmauto_packs_epi32(_mmauto_srai_epi32(_mmauto_slli_epi32(uv0, 16), 16), _mmauto_srai_epi32(_mmauto_slli_epi32(uv1, 16), 16)));
    const __m_auto_i v = _mmauto_correct_256op(_mmauto_packs_epi32(_mmauto_srai_epi32(uv0, 16), _mmauto_srai_epi32(uv1, 16)));

    const __m_auto_i b = _mmauto_correct_256op(_mmauto_packus_epi16(_mmauto_add_epi16(y, _mmauto_slli_epi16(_mmauto_mulhrs_epi16(u, scaledInvUCoeff), 1)), c_0));
    const __m_auto_i g = _mmauto_correct_256op(_mmauto_packus_epi16(_mmauto_sub_epi16(y, _mmauto_add_epi16(_mmauto_mulhrs_epi16(u, scaledGCoeffU), _mmauto_mulhrs_epi16(v, scaledGCoeffV))), c_0));
    const __m_auto_i r = _mmauto_correct_256op(_mmauto_packus_epi16(_mmauto_add_epi16(y, _mmauto_slli_epi32(_mmauto_mulhrs_epi16(v, scaledInvVCoeff), 1)), c_0));

    if(avx)
    {
      __m_auto_i bgra0 = b;
      __m_auto_i tmp = g;
      _mmauto_unpacklohi_epi8(bgra0, tmp);
      __m_auto_i bgra1 = r;
      tmp = alpha;
      _mmauto_unpacklohi_epi8(bgra1, tmp);
      _mmauto_unpacklohi_epi16(bgra0, bgra1);
      _mmauto_storet_si_all<aligned>(pDest++, bgra0);
      _mmauto_storet_si_all<aligned>(pDest++, bgra1);
    }
    else
    {
      const __m_auto_i bg = _mmauto_unpacklo_epi8(b, g);
      const __m_auto_i ra = _mmauto_unpacklo_epi8(r, alpha);
      _mmauto_storet_si_all<aligned>(pDest++, _mmauto_unpacklo_epi16(bg, ra));
      _mmauto_storet_si_all<aligned>(pDest++, _mmauto_unpackhi_epi16(bg, ra));
    }
  }
}
Esempio n. 4
0
template<bool avx> void ALWAYSINLINE storeColors(__m_auto_i* dest, const __m_auto_i p)
{
  alignas(avx ? 32 : 16)static __m_auto_i colors[FieldColors::numOfColors] =
  {
    _mmauto_set1_epi32(0xff7f7f7f), //none
    _mmauto_set1_epi32(0xffffffff), //white
    _mmauto_set1_epi32(0xff000000), //black
    _mmauto_set1_epi32(0xff00ff00), //green
    _mmauto_set1_epi32(0xff0000ff), //own team color
    _mmauto_set1_epi32(0xffff0000)  //opponent team color
  };

  __m_auto_i result = _mmauto_setzero_si_all();

  FOREACH_ENUM((FieldColors) Color, i)
    result = _mmauto_or_si_all(result, _mmauto_and_si_all(_mmauto_cmpeq_epi32(p, _mmauto_set1_epi32(i)), colors[i]));

  _mmauto_storet_si_all<true>(dest, result);
}