본문 바로가기

NDS

PA_Draw 는 어떻게 그려질까?

PA_16bitDraw는 스타일러스 터치 위치에 따라서 color와 size를 가진 선을 그어준다.
하지만 굵기를 가지게 되면 기본적으로 사각형의 픽셀을 가진다.
사용자 삽입 이미지
얇은 굵기에서는 티나지않지만 굵어지면 부자연 스럽다. 이것을 원형(●)이나 물방울모양으로 바꾸어 보려한다.

우선 Draw 함수를 분석해보자.

void PA_16bitDraw(u8 screen, u16 color){
s16 i, j, low, high;
u16 x, y;

if (Stylus.Held){
	x = Stylus.X;
	y = Stylus.Y;
	i = 0;
	j = 0;
	
	low = (PA_drawsize[screen] >> 1) - PA_drawsize[screen]+1;
	high = (PA_drawsize[screen] >> 1)+1;

	if (Stylus.Newpress) {
		for (i = low; i < high; i++)
			for (j = low; j < high; j++)
				if ((x+i > 0) && (y+j > 0) && \
(x+i < 256) && (y+j < 192)) PA_Put16bitPixel(screen, x+i, y+j, color); } else { PA_Draw16bitLineEx(screen, x, y, PA_oldx[screen], PA_oldy[screen], color, PA_drawsize[screen]); } PA_oldx[screen] = Stylus.X; PA_oldy[screen] = Stylus.Y; } }
11-12행은 size에 따른 픽셀 위치를 구한다.
14행- 첫 터치시에 실행되며 두 for문이 초기값이며 최종값, 증가값이 같다. |low| + high 값의 정사각형을 그린다는 얘기다.
else는 Held, Released 시에 두곳을 size의 굵기로 연결한다.
25행 else시의 두곳을 연결할때 한곳은 현재 위치, 다른 한곳은 여기에서 저장된값을 사용한다. 이전에 터치 인식된 좌표란 얘기.

이 함수가 계속 반복되어 스타일러스가 이동할때마다 계속 선을 이어준다.
Newpress시야 x,y를 중심으로 가지는 size크기의 원형을 그린다고 치면 금방 해결 되는데 계속 이어주는 것은 PA_Draw16bitLineEx 함수로 넘어간다.

void PA_Draw16bitLineEx(u8 screen,
s16 basex, s16 basey, s16 endx, s16 endy, u16 color, s8 size){ s8 low = (size >> 1) - size +1; s8 high = (size >> 1)+1; s16 i, j; s16 x1, x2, y1, y2; for (i = low; i < high; i++){ for (j = low; j < high; j++){ if ((basex+i >= 0) && (basey+j >= 0)&&(basex+i < 256) && (basey+j < 192)){ PA_Put16bitPixel(screen, basex+i, basey+j, color); } } } for (i = low; i < high; i++){ j = low; x1 = basex+i; x2 = endx+i; y1 = basey+j; y2 = endy+j; while(x1 < 0) x1++; while(x1 > 255) x1--; while(x2 < 0) x2++; while(x2 > 255) x2--; while(y1 < 0) y1++; while(y1 > 191) y1--; while(y2 < 0) y2++; while(y2 > 191) y2--; PA_Draw16bitLine(screen, x1, y1, x2, y2, color); j = high-1; x1 = basex+i; x2 = endx+i; y1 = basey+j; y2 = endy+j; while(x1 < 0) x1++; while(x1 > 255) x1--; while(x2 < 0) x2++; while(x2 > 255) x2--; while(y1 < 0) y1++; while(y1 > 191) y1--; while(y2 < 0) y2++; while(y2 > 191) y2--; PA_Draw16bitLine(screen, x1, y1, x2, y2, color); } for (j = low; j < high; j++){ i = low; x1 = basex+i; x2 = endx+i; y1 = basey+j; y2 = endy+j; while(x1 < 0) x1++; while(x1 > 255) x1--; while(x2 < 0) x2++; while(x2 > 255) x2--; while(y1 < 0) y1++; while(y1 > 191) y1--; while(y2 < 0) y2++; while(y2 > 191) y2--; PA_Draw16bitLine(screen, x1, y1, x2, y2, color); i = high-1; x1 = basex+i; x2 = endx+i; y1 = basey+j; y2 = endy+j; while(x1 < 0) x1++; while(x1 > 255) x1--; while(x2 < 0) x2++; while(x2 > 255) x2--; while(y1 < 0) y1++; while(y1 > 191) y1--; while(y2 < 0) y2++; while(y2 > 191) y2--; PA_Draw16bitLine(screen, x1, y1, x2, y2, color); } }
이쪽은 좀더 복잡하다.
3-4행, 8-14행은 이전 함수의 내용과 같다. size에 따른 위치를 구해서 첫위치에 사각형을그린다.

두개의 for문은 그림으로 표현하자면 이렇다.
사용자 삽입 이미지
이건 각 for문의 첫번째 DrawLine만 표현 한것이다. 사각형의 각 변끼리 직선을 계속 그어서 칠해주는거다. 윗변 왼쪽변만 표현한것이고 오른쪽과 아래 변까지 연결하게 되면 처음 이미지 처럼된다.

사실 size를 가진 선연결 방법이 도움이 될까해서 한참을 째려본건데 크게 도움될거같지는 않다. 대신 나중에 선에 알파값이 추가되고 선 중앙은 진하게, 주변은 흐리게 한다면 도움이 될듯하다.

사실 실제 픽셀을 뿌리는건 PA_Draw16bitLine 함수기때문에 이 함수를 봐야하겠다.


소스 분석중에 찾아낸 함수가 있다.
/*
void PA_DrawCircle(int xCenter, int yCenter, int radius, int color){
int x = 0;
int y = radius;
int p = 3 - 2 * radius;

   while (x <= y){
      PA_DrawPixel(xCenter + x, yCenter + y, color);
      PA_DrawPixel(xCenter - x, yCenter + y, color);
      PA_DrawPixel(xCenter + x, yCenter - y, color);
      PA_DrawPixel(xCenter - x, yCenter - y, color);
      PA_DrawPixel(xCenter + y, yCenter + x, color);
      PA_DrawPixel(xCenter - y, yCenter + x, color);
      PA_DrawPixel(xCenter + y, yCenter - x, color);
      PA_DrawPixel(xCenter - y, yCenter - x, color);
      if (p < 0) p += 4 * x++ + 6;
      else p += 4 * (x++ - y--) + 10;
   }
}
*/

DrawCircle 원을 그리는 함수같은데 주석처리 되있었다. 제대로 동작하지 않아서 일까.
사용하는 Palib이 2007년꺼라 최신 라이브러리엔 추가되있을지도 모르겠지만 우선은 이 소스를 테스트해보고 수정해 참고해보아야겠다. (한번 2008년 라이브러리 설치해봤다가 호환안되서 다시 2007년껄로 바꿨었다)
같은 원형 표현이니 적용해볼수 있을지도.

나중에 계속...

2008/08/25 - [NDS/NDS_Palib] - PA_Draw 는 어떻게 그려질까? 2
2008/08/25 - [NDS/NDS_Palib] - Palib - PA_16bitDrawCircle 함수

'NDS' 카테고리의 다른 글

Palib - PA_16bitDrawCircle 함수  (6) 2008.08.25
PA_Draw 는 어떻게 그려질까? 2  (0) 2008.08.25
NDS SuChupDS 0.2.1 BMP 저장 이미지  (0) 2008.08.22
SuChupDS - changelog  (2) 2008.08.22
NDS SuChupDS - 그리는 메모장  (0) 2008.08.22