Eungene's Imaginations...

Clet04_우리가 작성한 이미지 핸드폰에 출력하기 본문

Programming/WIPI Clet

Clet04_우리가 작성한 이미지 핸드폰에 출력하기

Eungene's 2008. 3. 19. 23:54
728x90
반응형
 이미지를 출력하기 위해서는 첫 번째로 'WIPI ResEditor'에서 이미지에 ID를 부여해 주어야 한다. <이미지는 첨부파일로 추가했습니다. 저장하는 곳은 우리가 생성한 Project폴더안에 resource라는 폴더가 있을 것이다. 그곳에다가 꼭 저장을 한다.>

사용자 삽입 이미지

위 그림에 모두 나와있지만, [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 함수를 이용해서 숫자 키패드가 눌리면, 이미지가 바뀌도록 한번 연습을 해보기 바란다.

그럼 여기서 끄읕~

반응형
Comments