Nokia LCDのソースコードを見たらblitという関数があったのでスピードアップのために使ってみた。
確かに2倍くらい速くなって、画像のシマシマ感も無くなったけど、まだ速度の面で満足いかない。
改善点としては、ロードしたRawデータのRGB順を入れ替えたり、blit内でも24bit→12bitの変換を毎ピクセル行っていてもったいない。
そこでNokia LCDのソースコードを取ってきて、12bitのデータそのままを転送する関数blit12を追加することにした。
それにともなって、元のRawデータをLCDネイティブな12bitカラーのRawイメージに変換するプログラムをMac上で書いて、LCDネイティブなRawデータ(拡張子”.r12″)に変換しておくことにした。
で、それをmicroSDカードに入れて、実行すると速くはなったけど効果はイマイチ。
やはりリードが1ライン単位というのが遅い原因だろう。
12bitにしたことでデータが小さくなったので、一気にイメージ全部をバッファにロードして、一気にblit12してしまうように変更。
かなり速くなった。
品質もかなり改善された。
でも、速度はもっと速くならないかな?
現在の状態は、こちら
Macで書いた変換プログラムのソースコードです。
#include <iostream> typedef struct { unsigned char r, g, b; } RGB24; int main (int argc, char * const argv[]) { // insert code here... if (argc < 2) { return -1; } FILE *fp; fp = fopen(argv[1], "rb"); if (fp) { FILE *of; of = fopen("128x128.r12", "wb"); RGB24 bufLine[128]; unsigned char outLine[64 * 3]; for (int y = 0; y < 128; y++) { int res; res = fread(bufLine, sizeof(RGB24), 128, fp); if (res == 128) { int xx = 0; unsigned char c0, c1, c2; RGB24 rgb0, rgb1; for (int x = 0; x < 128; x++) { if (x % 2 == 0) { rgb0 = bufLine[x]; c0 = (rgb0.r & 0xf0) | (rgb0.g >> 4); c1 = rgb0.b & 0xf0; } else { rgb1 = bufLine[x]; c1 = (rgb0.b & 0xf0) | (rgb1.r >> 4); c2 = (rgb1.g & 0xf0) | (rgb1.b >> 4); outLine[xx++] = c0; outLine[xx++] = c1; outLine[xx++] = c2; } } res = fwrite(outLine, sizeof(unsigned char), 64 * 3, of); if (res != 192) { std::cout << "fwrite error!\n"; } } else { std::cout << "fread error!\n"; } } fclose(of); fclose(fp); } else { std::cout << "Can't open file.\n"; } return 0; }