読者です 読者をやめる 読者になる 読者になる

フレームバッファ描画ライブラリ。


とりあえず画面クリア、ドット打つ、ボックス描画、ライン描画、だけです。
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;
	
}

//---------------------------------------------------------------------------------