Eungene's Imaginations...
Clet04_우리가 작성한 이미지 핸드폰에 출력하기 본문
위 그림에 모두 나와있지만, [NAME]은 꼭 대문자로 써 준다. 안 써줘도 되지만, 프로그래머들 사이에서 정해놓은 규약이기 때문에 지키는 것이 좋다.
※ Mobile 환경에서는 Jpg와 Bmp 파일은 안 쓴다. 특히 게임에서는 더욱더 그렇다. 용량을 줄여주기 위해서 Photoshop에서 PNG 파일로 파일을 변환하여 저장해서 출력하기 바란다.
이제 우리들은 재미있는(?) 소스코딩을 시작할 것이다.
/*
** ===========================================================================
**
** Project:
** WIPI
**
** File:
** CletModule.c
**
** Description:
** Application Skeleton
**
** ===========================================================================
*/
/*
**----------------------------------------------------------------------------
** INCLUDE FILES FOR MODULE
**----------------------------------------------------------------------------
*/
//For Using WIPI API
#include "WIPIheader.h"
/*
**----------------------------------------------------------------------------
** VARIABLES FOR MODULE
**----------------------------------------------------------------------------
*/
MC_GrpImage g_ImageBg;
M_Int32 g_iCurrentFormat;
MC_GrpContext cxt;
MC_GrpFrameBuffer bpl;
/*
**----------------------------------------------------------------------------
** FUCTION PROTOTYPES
**----------------------------------------------------------------------------
*/
void GetImageFromResID(MC_GrpImage *pGrpImage, M_Char *szResName);
void DisplayObjects(MC_GrpImage grpImage);
/*
**----------------------------------------------------------------------------
** LAYOUTS FOR MODULE
**----------------------------------------------------------------------------
*/
/* 이벤트를 처리하는 함수이다.*/
void handleCletEvent( int type, int param1, int param2 )
{
switch( type )
{
// Key press
case MV_KEY_PRESS_EVENT:
{
switch ( param1 ) {
case '1' :
DisplayObjects(g_ImageBg);
break;
}
}
break;
}
MC_knlPrintk( "param1 = %d, param2 = %d\n", param1, param2 );
}
/* 프로그램이 시작될 때 불리는 함수이다. */
void startClet( int argc, char *argv[] )
{
GetImageFromResID(&g_ImageBg, "IDB_BACKGROUND");
MC_grpInitContext( &cxt );
bpl = MC_grpGetScreenFrameBuffer(0);
DisplayObjects(g_ImageBg);
}
/* 프로그램이 잠시 멈추어 질때 이 함수를 호출해 준다.*/
void pauseClet( void )
{
}
/* 프로그램이 재개될 때 이 함수를 호출해 준다. */
void resumeClet( void )
{
}
/* 프로그램이 종료될 때 불린다. */
void destroyClet( void )
{
MC_grpDestroyImage(g_ImageBg);
}
/*화면의 일부분을 다시 칠해야 하는 경우에 불리는 함수이다./ */
void paintClet( int x, int y, int w, int h )
{
MC_grpFlushLcd(0, bpl, 0, 0, 240, 320);
}
void GetImageFromResID(MC_GrpImage *pGrpImage, M_Char *szResName)
{
M_Int32 iResource;
M_Int32 iResourceSize;
M_Int32 iImage;
iResource = MC_knlGetResourceID(szResName, &iResourceSize);
iImage = MC_knlCalloc(iResourceSize);
MC_knlGetResource(iResource, (void*)iImage, iResourceSize);
MC_grpCreateImage(pGrpImage, iImage, 0, iResourceSize);
}
void DisplayObjects(MC_GrpImage grpImage)
{
MC_knlPrintk("display Object에 들어왔습니다.\n");
MC_grpSetContext(&cxt, MC_GRP_CONTEXT_FG_PIXEL_IDX, (void*)MC_grpGetPixelFromRGB(255, 255, 255));
MC_grpFillRect(bpl, 0, 0, 240, 320, &cxt);
MC_knlPrintk("DrawImage 함수가 호출되었습니다.\n");
MC_grpDrawImage(bpl, 0, 0, 240, 290, grpImage, 0, 0, &cxt);
MC_grpFlushLcd(0, bpl, 0, 0, 240, 320);
}
우선 딱 봐서는 뭐가 무슨 내용인지는 대충 아시겠고~
우리가 핵심적으로 봐야 할 것은
GetImageFromResID 함수와 DisplayObjects 함수이다.
우선 프로그램 순서도를 먼저 보자<함수위주>
startClet() ---> GetImageFromResID() --> DisplayObjects() 순으로 진행이 된다.
기존에 우리가 전역변수로 MC_grpImage 타입의 이미지 변수를 생성해주었고, 그 이미지 변수를 가지고 startClet에서 GetImageFromResID()함수를 이용해 이미지 ID를 얻어오고, 버퍼에 데이터를 넣어줍니다.
소스에서 보시다시피 GetImageFromResID의 함수에는 이미지 변수와, 기존에 우리가 Resource Editor에서 추가 시켜줬던 아이디를 매개변수로 입력을 해주었고, 그 안에서 이미지의 ID를 얻어오고, 버퍼용량을 할당하고, 버퍼에 이미지 데이터를 넣어주고, 생성을 해는 일까지 하게 되었다.
그러고 나서 DisplayObjects()함수로 돌아오면, 우리가 기존에 많이 보고, 익숙한 MC_grpSetContext()함수를 이용해 색을 설정해주고, MC_grpFillRect() 함수를 이용해서 핸드폰 배경을 하얀색으로 깔아주었다.
그 다음이 바로 우리가 생성한 이미지를 뿌려주는 역할을 하게 되는 것이다.
우리가 기존에 못 보았던 함수들이 있어서 그렇지 그 내용만 자세히 알게 되면, 위의 소스는 전혀 어려운 것이 없다.
여기에서 사용한 이미지뿐만이 아니라 여러분들이 handleEvent 함수를 이용해서 숫자 키패드가 눌리면, 이미지가 바뀌도록 한번 연습을 해보기 바란다.
그럼 여기서 끄읕~