LoginSignup
0
0

RGB24からRGB16に変更

Last updated at Posted at 2023-10-18

小型のLCDに画像を表示するためにcairoのメモリバッファに書いて、それをSPIでLCDに転送しています。

LCDに転送する前にRGB24からRBG16に変換していました。

    for (x = 0; x < data->width * 4; ++x) {
#if BYTE_ORDER == BIG_ENDIAN
      color = (*(framedata + 1) >> 3) << 11;
      color |= (*(framedata + 2) >> 2) << 5;
      color |= *(framedata + 3) >> 3;
#else
      color = (*(framedata + 2) >> 3) << 11;
      color |= (*(framedata + 1) >> 2) << 5;
      color |= *(framedata + 0) >> 3;
#endif
      framedata += 4;
      
      txbuf[i] = color >> 8;
      ++i;
      txbuf[i] = color & 0xff;
      ++i;

こういう処理ってSIMDで出来るのかもしれませんが、MIPS DSPでコピペできるような適当なコードが見つかりません。またAtherosの24KにはDSPがありません。

はたと考えました。そもそもcairoのsurfaceをRGB16で作れば変換しなくてもいいはずです。

cairo_image_surface_create()のパラメータをCAIRO_FORMAT_RGB24からCAIRO_FORMAT_RGB16_565に変換して、コピーのコードを以下のようにしてみました。

#if BYTE_ORDER == BIG_ENDIAN
      txbuf[i] = *framedata++;
      txbuf[i + 1] = *framedata++;
#else
      txbuf[i + 1] = *framedata++;
      txbuf[i] = *framedata++;
#endif
      i += 2;

SPIの転送がボトルネックで劇的には早くなりません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0