RawLoader改

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してしまうように変更。

かなり速くなった。

RawLoader改による表示

RawLoader改による表示

RawLoader改による表示

RawLoader改による表示

品質もかなり改善された。

でも、速度はもっと速くならないかな?

現在の状態は、こちら

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;
}
カテゴリー: ARM, mbed, 作ったモノ タグ: , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA