1

組み込みデバイスのTFTディスプレイを管理するために、低レベルのドライバーを作成する必要があります。デバイスは、PIC24、64KのRAM、および約128Kのプログラムメモリを搭載しています。

私の意図は、すべてのプリミティブグラフィックス関数と、コマンドとデータを表示するためのドライバーを配置する汎用グラフィックスライブラリを作成することです。

Graphics libはドライバーを使用してディスプレイにアクセスしますが、ディスプレイテクノロジーは変更される可能性があるため、ドライバーは簡単に再実装できる必要があります。

この種のシナリオで再利用可能なコードを書くための最良の方法は何ですか?

 -----------------          ---------------       
|                 |        |               |
|                 |        |               |
|    GFX_LIB      | =====> |    DRIVER     | ====> DISPLAY
|                 |        |               |
|                 |        |               |
 -----------------          -----/----\----
                                /      \
                               /        \
                         ----------   ----------
                        |          | |          |
                        | TYPE A   | |  TYPE B  |
                        |          | |          |
                         ----------   ----------

詳細

これは私のgfxlibのコードの一部です

#include "Graphics.h"

void gfx_Init(uint16_t width, uint16_t height, uint8_t rotation){
    gfx_displayWidth=width;
    gfx_displayHeight=height;
    gfx_rotation=rotation;  
    displayDriverInit();
}

void gfx_setPixel(uint16_t x, uint16_t y, uint32_t color){
    displayDriverSendCommand(CHANGE_COORDINATE);
    displayDriverSendData(x);
    displayDriverSendData(y);
    displayDriverSendCommand(SET_COLOR);
    displayDriverSendData(color);
}

これは私のグラフィックライブラリの架空の実装です。

さて、ドライバーを変更した場合、gfx libを再利用して、表示ドライバールーチンのみを書き直すことができれば本当にうれしいです。これを達成するための最良の方法は何ですか?

ありがとうございました。

4

4 に答える 4

1

ドライバーが提供する機能によって少し異なります。

最小限の API は次のように宣言できます。

typedef void* gfx;
typedef struct init_options {
  int display_width, display_height;
  //..etc..
};

gfx* gfx_init( init_options* opts );
void gfx_free( gfx* gfx );

// blit something onto sceeen
void gfx_blit( gfx* gfx, void* buffer, int buf_w, int buf_h, int trg_x, int trg_y, int trg_w, int trg_h );

// if you have double buffering (probably a good idea)
void gfx_swap( gfx* gfx );

初期化、シャットダウン、モード切り替え、画面へのピクセルのブリットだけで十分です。おそらく、高速な SetPixel() ルーチンも提供する必要があります。これに基づいて、他のすべてはある種の「GfxUtil」ライブラリで実装できます。

ドライバーの選択とこの API の実装は、適切なライブラリーをリンクするだけで処理できます (各ライブラリーには実際のドライバーが含まれており、ブリットなどの実際のコードが含まれています)。

編集

動的に置き換え可能なコードをいくつか持つには、ドライバーを、ドライバー固有のコードの実際の実装への関数ポインターを持つ構造体にすることができます。

// common driver struct, used by gfx api
typedef struct driver {
    void (*init)( driver *driver, init_options* );
    void (*setpixel)( driver *driver, int x, int y, color color );
    //...
};

// driver constructor
driver* create_foo_driver() {
    driver* d = malloc( sizeof(driver) );
    memset(d,0,sizeof(driver));
    d->init = foo_init;
    d->setpixel = foo_setpixel;
    return d;
}

// some driver-specific code ...
void foo_setpixel( driver *driver, int x, int y, color color ) {
    // actual implementation
}

// API code calling driver code
void gfx_setpixel( gfx* gfx, int x, int y, color color ) {
   driver* driver = ((gfx_impl)gfx)->driver; // .. just an example
   driver->setpixel( driver, x, y, color );
}
于 2012-06-30T20:43:21.277 に答える
1

なぜ車輪を再発明するのですか?GD Graphics Libraryを使用して、ディスプレイの画像バッファーに画像を作成します。または、ディスプレイのイメージ バッファの外にイメージを作成し、レンダリングが完了したらピクセル データをコピーします。

GD は通常、(ブラウザがダウンロードする) 画像ファイルの作成に使用されますが、レンダリング コードは独立していることに注意してください。

于 2012-06-30T20:16:50.310 に答える
0

ここでグーグル検索する人は誰でも、Adafruit の GFX ライブラリを見て、特定のグラフィックス ドライバ用のライブラリがそれをどのように実装しているかを確認する必要があります。私の経験は、特にST7735 ドライバー( chipKIT の PIC32で動作するように移植し、経験豊富な chipKIT 開発者から支援を受けています) に関するものです。特定のハードウェア用のドライバーが実装できる C++ / OOP グラフィックス フレームワークの完璧な例です。

この質問が、最近の他の「どうすればこれを成し遂げられるか」というタイプの質問のように、話題から外れているために閉じられていなかったことに驚いています。

于 2013-09-06T08:19:49.953 に答える
0

プラットフォームでどれだけのメモリを確保できるかに応じて、ASCII アートで描いたのとまったく同じ構造のCairoを使用できます。Cでも実装されています。

于 2012-06-30T20:16:37.840 に答える