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;
}

