12. IImage API
-
Upload
zenaida-buck -
Category
Documents
-
view
43 -
download
1
description
Transcript of 12. IImage API
임베디드 모바일 프로그래밍 1
12. IImage API 비트맵 이미지를 그리는 것부터 간단한 기하학적 도형 까지 , BREW 는 인상적인
이미지를 제공하기 위하여 다수의 기능들을 가지고 있다 .
BREW 는 비트맵과 기하학적 그래픽스의 디스플레이를 위한 적절한 기능을 가지고 있다 .
BREW 는 BMP 이미지를 직접 다루기 위한 다수의 기능을 포함한다 . 그러한 가능은 BMP 적재하는 기능 뿐만 아니라 그러한 이미지들의 디스플레이와 애니메이션을 포함한다 .
IImage 인터페이스를 사용하여 비트맵 이미지를 그리고 애니메이션 비트맵을 화면에 표시할 수 있다 .
IImage 인터페이스 사용방법
IImage 인터페이스
생성
이미지 적재
Draw작업
IImage해제
임베디드 모바일 프로그래밍 2
12. IImage API
12.1 IImage API 관련 자료형
AEEIImageParameters- IPARM_SIZE: 디스플레이용으로 사용하는 이미지의 실제 크기- IPARM_OFFSET: 디스플레이용으로 사용하는 전체 이미지 내의 오프셋- IPARM_CXFRAME: 일반적으로 (Windows - BMP 등의 ) 애니메이션을 지원하지 않는 형식에 대한 각 프레임의
너비- IPARM_NFRAMES: 프레임의 수 . IPARM_RATE 밀리초 단위의 애니메이션 속도 .- IPARM_ROP: 이미지를 그릴 때 사용할 래스터 동작 . - IPARM_OFFSCREEN: 이미지를 오프스크린 버퍼에 그릴 것인지 여부를 지정
AEEImageInfo
typedef struct _AEEImageInfo { uint16 cx; uint16 cy; uint16 nColors; boolean bAnimated; uint16 cxFrame; } AEEImageInfo;
- cx : 이미지 너비 ( 픽셀 )
- cy : 이미지 높이 ( 픽셀 )
- nColors : 이미지의 색상 수 - bAnimated : 이미지에 애니메이션이 있으면 TRUE
- cxFrame : 이미지가 여러 프레임으로 나눠져 있는 경우 , 이 구성원은 각 프레임의 너비를 나타낸다 .
임베디드 모바일 프로그래밍 3
12. IImage API
12.2 IImage API 함수
IImage_SetParm 함수
• IImage 인터페이스 개체의 다양한 이미지 관련 매개 변수를 설정할 수 있다 . 설정할 매개 변수는 nParm 에 의해 지정되며 IPARM_SIZE, IPARM_OFFSET, IPARM_CXFRAME, IPARM_NFRAMES, IPARM_RATE, IPARM_ROP 또는 IPARM_OFFSCREEN 중 하나이다 .
• 새 매개 변수 값은 p1 과 p2 를 사용하여 지정합니다 .
형식void IIMAGE_SetParm (pImage * pIImage, int nParm, int p1, int p2)
매개변수- pIImage: IImage 인터페이스 개체에 대한 포인터- nParm: IPARM_SIZE, IPARM_OFFSET, IPARM_CXFRAME, IPARM_NFRAMES, IPARM_RATE, IPARM_RO
P 및 IPARM_OFFSCREEN. - p1: nParm 관련 매개 변수 값- p2: nParm 관련 매개 변수 값
반환값없음
임베디드 모바일 프로그래밍 4
12. IImage API IImage_Start 함수
• 주어진 이미지의 애니메이션을 시작한다 . 이미지의 각 프레임 사이를 순환한다 . 각 프레임이 x 및 y 매개 변수가 지정한 좌표에 나타난다 . 두 연속 프레임이 표시되는 애니메이션 타이머의 시간 간격은 150 밀리초이다 . 애니메이션은 IIMAGE_Stop() 을 호출할 때까지 계속된다 .
형식void IIMAGE_Start (IImage * pIImage, int x, int y)
매개변수- pIImage: 애니메이트해야 할 IImage 인터페이스 개체에 대한 포인터 - x: 프레임을 그려야 할 대상 직사각형 영역의 왼쪽 위 모서리 기준 x 좌표 - y: 프레임을 그려야 할 대상 직사각형 영역의 왼쪽 위 모서리 기준 y 좌표
반환값없음
임베디드 모바일 프로그래밍 5
12. IImage API IImage_Draw 함수
• 화면의 지정된 위치에 이미지를 그린다 .
형식void IIMAGE_Draw (IImage * pIImage, int x, int y )
매개변수- pIImage: [in] IImage 인터페이스 개체에 대한 유효한 포인터 - x: [in] 이미지를 그려야 할 대상 직사각형 영역의 왼쪽 위 모서리 기준 x 좌표 - y: [in] 이미지를 그려야 할 대상 직사각형 영역의 왼쪽 위 모서리 기준 y 좌표
반환값없음
임베디드 모바일 프로그래밍 6
12. IImage API
12.3 IImage API – 애니메이션 예제 프로그램 (animation.c)
하나의 폭 넓은 BMP 내의 애니메이션 프레임등 (anim.bmp)
임베디드 모바일 프로그래밍 7
12. IImage API
animation.h
#ifndef __HELLO_H__#define __HELLO_H__
#include "AEE.h"#include "AEEDisp.h"#include "AEEModGen.h"#include "AEEAppGen.h"#include "AEEDisp.h"#include "AEEClassIDs.h"#include "AEEStdLib.h"#include "AEEImage.h"#include "AEEShell.h"
#include "AEEMenu.h" // Menu Services#include "AEEFile.h" // AEEFile Services#include "AEEText.h"
typedef struct myapp_s{
AEEApplet a; //applet headerAEEDeviceInfo di;
IImage* pImage; //our animated BMP image
} myapp_t;
static boolean Animation_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam);void Animation_CleanUp(myapp_t* pApp);
#endif
임베디드 모바일 프로그래밍 8
12. IImage API animation.c
#include "animation.h"#include "animation.bid"int AEEClsCreateInstance(AEECLSID ClsId, IShell * pIShell, IModule * po, void ** ppObj){ *ppObj = NULL; if( ClsId == AEECLSID_ANIMATION ) { if(AEEApplet_New(sizeof(myapp_t), ClsId, pIShell, po, (IApplet**)ppObj,
(AEEHANDLER)Animation_HandleEvent, (PFNFREEAPPDATA)Animation_CleanUp) == TRUE) { return(AEE_SUCCESS); } } return(EFAILED);}
static boolean Animation_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam){ myapp_t* pApp = (myapp_t*)pi; AEEApplet * pMe = &pApp->a;
switch (eCode) {case EVT_APP_START:
//get info about the handset (resolution, etc.)ISHELL_GetDeviceInfo(pMe->m_pIShell, &pApp->di);
//clear screen (default color is white)IDISPLAY_ClearScreen(pMe->m_pIDisplay);
pApp->pImage = ISHELL_LoadImage(pMe->m_pIShell, "anim.bmp");
//set up image animation propertiesIIMAGE_SetParm(pApp->pImage, IPARM_CXFRAME, 51, 0);IIMAGE_SetParm(pApp->pImage, IPARM_NFRAMES, 3, 0);IIMAGE_SetParm(pApp->pImage, IPARM_RATE, 200, 0);
임베디드 모바일 프로그래밍 9
12. IImage API//start the animationIIMAGE_Start(pApp->pImage, pApp->di.cxScreen / 4, pApp->di.cyScreen / 5);
//we've successfully handled this messagereturn(TRUE);break; } return(FALSE);}
void Animation_CleanUp(myapp_t* pApp)
{
IIMAGE_Stop(pApp->pImage);
IIMAGE_Release(pApp->pImage);
}
임베디드 모바일 프로그래밍 10
12. IImage API 실행결과
임베디드 모바일 프로그래밍 11
12. IImage API
12-4 IImage API – 슬라이드쇼 예제 프로그램 (slideshow.c)
slideshow.h
#ifndef __SLIDESHOW_H__#define __SLIDESHOW_H__
#include "AEE.h"#include "AEEDisp.h"#include "AEEModGen.h"#include "AEEAppGen.h"#include "AEEDisp.h" #include "AEEClassIDs.h" #include "AEEStdLib.h"#include "AEEImage.h"#include "AEEShell.h"#include "AEEMenu.h"#include "AEEFile.h"#include "AEEText.h"#define MAX_IMAGES 4#define DISPLAY_DELAY 1000
static boolean Slideshow_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam);
typedef struct myapp_s{
AEEApplet a; //applet header
AEEDeviceInfo di;
int nImage;IImage* pImages[MAX_IMAGES];
} myapp_t;
임베디드 모바일 프로그래밍 12
12. IImage APIvoid Slideshow_CleanUp(myapp_t* pApp);void Slideshow_Timer(myapp_t * pApp);
#endif
slideshow.c
#include "slideshow.h"#include "slideshow.bid”int AEEClsCreateInstance(AEECLSID ClsId, IShell * pIShell, IModule * po, void ** ppObj){ *ppObj = NULL; if(ClsId == AEECLSID_SLIDESHOW ) { if(AEEApplet_New(sizeof(myapp_t), ClsId, pIShell,po,(IApplet**)ppObj, (AEEHANDLER)Slideshow_HandleEvent, (PFNFREEAPPDATA)Slideshow_CleanUp) == TRUE) { return (AEE_SUCCESS); } } return (EFAILED);}static boolean Slideshow_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam){ myapp_t * pApp = (myapp_t*)pi; AEEApplet * pMe = &pApp->a; switch (eCode) { case EVT_APP_START:
//get info about the handset (resolution, etc.)ISHELL_GetDeviceInfo(pMe->m_pIShell, &pApp->di);
//clear whole screen IDISPLAY_ClearScreen (pMe->m_pIDisplay);
//load our imagespApp->pImages[0] = ISHELL_LoadImage(pMe->m_pIShell, "slide1.bmp");pApp->pImages[1] = ISHELL_LoadImage(pMe->m_pIShell, "slide2.bmp");
pApp->pImages[2] = ISHELL_LoadImage(pMe->m_pIShell, "slide3.bmp"); pApp->pImages[3] = ISHELL_LoadImage(pMe->m_pIShell, "slide4.bmp");
애플릿의 참조 카운트가 0이 되면 호출되는 함수 .
애플릿 데이터를 해제 (free) 시키는 함수
임베디드 모바일 프로그래밍 13
12. IImage APIpApp->nImage = 0;
//draw the first imageIIMAGE_Draw(pApp->pImages[pApp->nImage], 10, 10);IDISPLAY_Update(pMe->m_pIDisplay);
//Set the timer...let's go!ISHELL_SetTimer(pApp->a.m_pIShell, DISPLAY_DELAY, (PFNNOTIFY)Slideshow_Timer, pApp);
return(TRUE); break; case EVT_APP_SUSPEND:
//If we've paused the applet for some reason, kill the timerISHELL_CancelTimer(pApp->a.m_pIShell, NULL, NULL);return(TRUE); break; case EVT_APP_RESUME:
//When the applet is re-activated, redraw and start the timerIDISPLAY_ClearScreen (pMe->m_pIDisplay); IIMAGE_Draw(pApp->pImages[pApp->nImage], 10, 10);IDISPLAY_Update(pMe->m_pIDisplay);ISHELL_SetTimer(pApp->a.m_pIShell, DISPLAY_DELAY, (PFNNOTIFY)Slideshow_Timer, pApp);
return(TRUE); break; } return FALSE;}void Slideshow_CleanUp(myapp_t* pApp){
//delete our loaded BMPs
int i;
for (i = 0; i < MAX_IMAGES; i++){
IIMAGE_Release(pApp->pImages[i]);}
}
임베디드 모바일 프로그래밍 14
12. IImage APIvoid Slideshow_Timer(myapp_t * pApp){
//Toggle between the two images, draw image, and start//timer again for next image.
AEEApplet * pMe = &pApp->a;
++pApp->nImage;
if (pApp->nImage >= MAX_IMAGES)pApp->nImage = 0;
IIMAGE_Draw(pApp->pImages[pApp->nImage], 10, 10);IDISPLAY_Update(pMe->m_pIDisplay);
ISHELL_SetTimer(pApp->a.m_pIShell, DISPLAY_DELAY, (PFNNOTIFY)Slideshow_Timer, pApp);}
임베디드 모바일 프로그래밍 15
12. IImage API 실행결과