フレームバッファ描画ライブラリ。
とりあえず画面クリア、ドット打つ、ボックス描画、ライン描画、だけです。
BASIC レベルにはしたいので円の描画、塗りつぶし、を ToDo としておきます。
サイトへの公開は帰ってからしますので先にソースだけでも。
draw.h
/*--------------------------------------------------------------------------------- draw library header version 0.01 May 10, 2010 By REGEKATSU ---------------------------------------------------------------------------------*/ #ifndef _DRAW_H_ #define _DRAW_H_ #ifdef __cplusplus extern "C" { #endif void drawCls(u16 *buf, int color); void drawBox(u16 *buf, int x, int y, int width, int height, bool is_fill, int fore_color, int back_color); void drawLine(u16 *buf, int x1, int y1, int x2, int y2, int color); void drawPSet(u16 *buf, int x, int y, int color); #ifdef __cplusplus } #endif #endif // _DRAW_H_
draw.c
/*--------------------------------------------------------------------------------- draw library routine version 0.01 May 10, 2010 By REGEKATSU ---------------------------------------------------------------------------------*/ #include <nds/ndstypes.h> #include <nds/arm9/background.h> #include "draw.h" //--------------------------------------------------------------------------------- void drawCls(u16 *buf, int color) { //--------------------------------------------------------------------------------- int x, y; for(y = 0;y < SCREEN_HEIGHT;y++){ for(x = 0;x < SCREEN_WIDTH;x++){ drawPSet(buf, x, y, color); } } } //--------------------------------------------------------------------------------- void drawBox(u16 *buf, int x, int y, int width, int height, bool is_fill, int fore_color, int back_color) { //--------------------------------------------------------------------------------- drawLine(buf, x, y, x + width - 1, y, fore_color);//w1 drawLine(buf, x, y, x, y + height - 1, fore_color);//h1 drawLine(buf, x, y + height - 1, x + width - 1, y + height - 1, fore_color);//w2 drawLine(buf, x + width - 1, y, x + width - 1, y + height - 1, fore_color);//h2 if(is_fill == true){ int i; for(i = y + 1;i < y + height - 1;i++){ drawLine(buf, x + 1, i, x + width - 2, i, back_color); } } } //--------------------------------------------------------------------------------- void drawLine(u16 *buf, int x1, int y1, int x2, int y2, int color) { //--------------------------------------------------------------------------------- //Bresenham's line algorithm int dx, dy;//二点間の距離 dx = (x2 > x1) ? x2 - x1 : x1 - x2; dy = (y2 > y1) ? y2 - y1 : y1 - y2; int sx, sy;//二点の方向 sx = (x2 > x1) ? 1 : -1; sy = (y2 > y1) ? 1 : -1; int i, e; //傾きが1より小さい場合 if(dx > dy){ e = -dx; for(i = 0;i <= dx;i++){ drawPSet(buf, x1, y1, color); x1 += sx; e += 2 * dy; if(e >= 0){ y1 += sy; e -= 2 * dx; } } //傾きが1以上の場合 }else{ e= -dy; for(i = 0;i <= dy;i++){ drawPSet(buf, x1, y1, color); y1 += sy; e += 2 * dx; if(e >= 0){ x1 += sx; e -= 2 * dy; } } } } //--------------------------------------------------------------------------------- void drawPSet(u16 *buf, int x, int y, int color) { //--------------------------------------------------------------------------------- buf[ y * SCREEN_WIDTH + x ] = color; } //---------------------------------------------------------------------------------