280 likes | 426 Views
13. IGraphics API. BREW 는 삼각형 , 직사각형 , 원 , 파이 조각 쐐기까지도 포함하는 다수의 프리미티프 를 가진다 . 그래픽스는 비트맵 보다 더 간단하고 더 적은 일을 제공한다 . 두 가지 주요 장점 - 확장 가능하다 . - 적은 공간을 차지한다 . IGraphic 인터페이스를 사용하기 위하여 다음과 같은 절차가 필요하다. IGraphics 인터페이스 생성. Draw 작업에 필요한 세팅. Draw( 점 , 선 , 다각형 등 ) 작업. Update.
E N D
13. IGraphics API • BREW는 삼각형, 직사각형, 원, 파이 조각 쐐기까지도 포함하는 다수의 프리미티프 • 를 가진다. • 그래픽스는 비트맵 보다 더 간단하고 더 적은 일을 제공한다. • 두 가지 주요 장점 • - 확장 가능하다. • - 적은 공간을 차지한다. • IGraphic 인터페이스를 사용하기 위하여 다음과 같은 절차가 필요하다. IGraphics 인터페이스 생성 Draw 작업에 필요한 세팅 Draw(점, 선, 다각형 등) 작업 Update IGraphics 인터페이스 객체 임베디드 모바일 프로그래밍
13. IGraphics API • 13.1 IGraphics 함수 • IGRAPHIC_SetColor 함수 • 현재 RGBA 값을 설정합니다. 다른 RGBA 값에 대해 이 함수를 다시 호출할 때까지 모든 그래픽 개체는 이 색으로 그려집니다. 여기서 RGBA 컬러모델은 별도로 투명도를 나타내는 256 단계의 알파채널을 추가한 것이다. 임베디드 모바일 프로그래밍
13. IGraphics API • IGRAPHIC_DrawArc 함수 • 전경색과 같은 원호를 그린다. 임베디드 모바일 프로그래밍
13. IGraphics API • IGRAPHICS_DrawCircle 함수 • 현재 전경색과 같은 윤곽선의 원을 그린다. 채우기 모드를 켜면 원의 내부가 현재 채우기 색으로 채워진다. 임베디드 모바일 프로그래밍
13. IGraphics API • IGRAPHICS_DrawEllipse 함수 • 전경색과 같은 윤곽선으로 타원을 그린다. 채우기 모드를 켜면 타원의 내부가 현재 채우기 색으로 채워진다 임베디드 모바일 프로그래밍
13. IGraphics API • IGRAPHICS_DrawLine 함수 • 주어진 시작점과 끝점으로 전경색의 선을 그린다. 임베디드 모바일 프로그래밍
13. IGraphics API • IGRAPHICS_DrawPie 함수 • 전경색과 같은 윤곽선의 원 조각을 그린다. 채우기 모드를 켜면 원 조각의 내부가 현재 채우기 색으로 채워진다. 임베디드 모바일 프로그래밍
13. IGraphics API • IGAPHICS_SetPointSize 함수 • 점 크기(너비)를 픽셀 단위로 설정한다. 임베디드 모바일 프로그래밍
13. IGraphics API • IGRAPHICS_DrawPoint 함수 • 현재 점 크기와 전경색으로 점을 그립니다 임베디드 모바일 프로그래밍
13. IGraphics API • IGRAPHICS_DrawPolyline 함수 • 현재 전경색의 윤곽선으로 다각형을 그린다. 채우기 모드를 켜면 다각형의 내부가 현재 채우기 색으로 채워진다. 임베디드 모바일 프로그래밍
13. IGraphics API • IGRAPHICS_DrawRect 함수 • 축을 따라 현재 전경색의 윤곽선으로 직사각형을 그린다. 채우기 모드를 켜면 내부가 현재 채우기 색으로 채워진다. 임베디드 모바일 프로그래밍
13. IGraphics API • IGRAPHIC_DrawTriangle 함수 • 현재 전경색의 윤곽선으로 삼각형을 그립니다. 채우기 모드를 켜면 내부가 현재 채우기 색으로 채워진다. 임베디드 모바일 프로그래밍
13. IGraphics API • ISHELL_SetTimer 함수 • 타이머가 만료되면 지정한 콜백 함수가 호출되어 함수의 첫 번째 인수로 지정한 사용자 데이터 포인터를 전달한다. • 타이머는 현재 시간에 지정한 밀리초(Milliseconds)를 더한 시간에 만료된다. 임베디드 모바일 프로그래밍
13. IGraphics API 13.2 IGraphic API – 예제 프로그램(geometry.c) #include "geometry.h" #include "geometry.bid" static void DisplayOutput(IApplet * pMe, int nline, char *pszStr, RGBVAL clrColor); int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po,void ** ppObj){ *ppObj = NULL; if(ClsId == AEECLSID_GEOMETRY){ if(AEEApplet_New(sizeof(myapp_t), ClsId, pIShell, po, (IApplet**)ppObj, (AEEHANDLER)Geometry_HandleEvent, (PFNFREEAPPDATA)Geometry_Cleanup) == TRUE) { return(AEE_SUCCESS); } } return(EFAILED);}static boolean Geometry_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: ISHELL_GetDeviceInfo (pMe->m_pIShell, &pApp->di); ISHELL_CreateInstance(pApp->a.m_pIShell, AEECLSID_GRAPHICS,(void **)&pApp->pIGraphics); IDISPLAY_ClearScreen (pMe->m_pIDisplay); // Clear whole screen IDisplayOutput((IApplet *)pMe, 5, "드로잉 데모", MAKE_RGB(0,0,0)); IDISPLAY_Update (pMe->m_pIDisplay); //set timer to start drawing shapes ISHELL_SetTimer(pApp->a.m_pIShell, TIMER_PERIOD, (PFNNOTIFY)Geometry_CallbackArc, pApp); return(TRUE); break; } return(FALSE);} 임베디드 모바일 프로그래밍
13. IGraphics API void Geometry_Cleanup(myapp_t * pApp) { IGRAPHICS_Release(pApp->pIGraphics); } //draw arc void Geometry_CallbackArc(myapp_t * pApp) { AEEArc arc; AECHAR szBuf[] = {'A','r','c','\0'}; arc.cx = pApp->di.cxScreen / 2; arc.cy = pApp->di.cyScreen / 2; arc.r = 30; arc.startAngle = 0; arc.arcAngle = 180; IDISPLAY_ClearScreen (pApp->a.m_pIDisplay); IGRAPHICS_SetColor(pApp->pIGraphics, 0xFF, 0x00, 0x00, 0xFF); IGRAPHICS_DrawArc(pApp->pIGraphics, &arc); IDISPLAY_DrawText(pApp->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, pApp->di.cyScreen - 15, 0, IDF_ALIGN_CENTER); IDISPLAY_Update (pApp->a.m_pIDisplay); ISHELL_SetTimer(pApp->a.m_pIShell, TIMER_PERIOD, (PFNNOTIFY)Geometry_CallbackCircle, pApp); } 임베디드 모바일 프로그래밍
13. IGraphics API //draw circle void Geometry_CallbackCircle(myapp_t * pApp) { AEECircle circle; AECHAR szBuf[] = {'C','i','r','c','l','e', '\0'}; circle.cx = pApp->di.cxScreen / 2; circle.cy = pApp->di.cyScreen / 2; circle.r = 30; IDISPLAY_ClearScreen (pApp->a.m_pIDisplay); IGRAPHICS_SetColor(pApp->pIGraphics, 0xFF, 0x00, 0xFF, 0xFF); IGRAPHICS_DrawCircle(pApp->pIGraphics, &circle); IDISPLAY_DrawText(pApp->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, pApp->di.cyScreen - 15, 0, IDF_ALIGN_CENTER); IDISPLAY_Update (pApp->a.m_pIDisplay); ISHELL_SetTimer(pApp->a.m_pIShell, TIMER_PERIOD, (PFNNOTIFY)Geometry_CallbackEllipse, pApp); } //draw ellipse void Geometry_CallbackEllipse(myapp_t * pApp) { AEEEllipse ellipse; AECHAR szBuf[] = {'E','l','l','i','p','s','e','\0'}; ellipse.cx = pApp->di.cxScreen / 2; 임베디드 모바일 프로그래밍
13. IGraphics API ellipse.cy = pApp->di.cyScreen / 2; ellipse.wx = 30; ellipse.wy = 15; IDISPLAY_ClearScreen (pApp->a.m_pIDisplay); IGRAPHICS_SetColor(pApp->pIGraphics, 0xFF, 0x00, 0x00, 0xFF); IGRAPHICS_DrawEllipse(pApp->pIGraphics, &ellipse); IDISPLAY_DrawText(pApp->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, pApp->di.cyScreen - 15, 0, IDF_ALIGN_CENTER); IDISPLAY_Update (pApp->a.m_pIDisplay); ISHELL_SetTimer(pApp->a.m_pIShell, TIMER_PERIOD, (PFNNOTIFY)Geometry_CallbackLine, pApp); } //draw line void Geometry_CallbackLine(myapp_t * pApp) { AEELine line; AECHAR szBuf[] = {'L','i','n','e','\0'}; line.sx = 20; line.sy = 20; line.ex = 60; line.ey = 60; IDISPLAY_ClearScreen (pApp->a.m_pIDisplay); IGRAPHICS_SetColor(pApp->pIGraphics, 0xFF, 0x00, 0x00, 0xFF); IGRAPHICS_DrawLine(pApp->pIGraphics, &line); 임베디드 모바일 프로그래밍
13. IGraphics API IDISPLAY_DrawText(pApp->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, pApp->di.cyScreen - 15, 0, IDF_ALIGN_CENTER); IDISPLAY_Update (pApp->a.m_pIDisplay); ISHELL_SetTimer(pApp->a.m_pIShell, TIMER_PERIOD, (PFNNOTIFY)Geometry_CallbackPie, pApp); } //draw pie graph void Geometry_CallbackPie(myapp_t * pApp) { AEEPie pie; AECHAR szBuf[] = {'P','i','e','\0'}; pie.cx = pApp->di.cxScreen / 2; pie.cy = pApp->di.cyScreen / 2; pie.r = 30; pie.startAngle = 0; pie.arcAngle = 45; IDISPLAY_ClearScreen (pApp->a.m_pIDisplay); IGRAPHICS_SetColor(pApp->pIGraphics, 0xCC, 0x00, 0xFF, 0xFF); IGRAPHICS_DrawPie(pApp->pIGraphics, &pie); IDISPLAY_DrawText(pApp->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, pApp->di.cyScreen - 15, 0, IDF_ALIGN_CENTER); IDISPLAY_Update (pApp->a.m_pIDisplay); ISHELL_SetTimer(pApp->a.m_pIShell, TIMER_PERIOD, (PFNNOTIFY)Geometry_CallbackPoint, pApp); } 임베디드 모바일 프로그래밍
13. IGraphics API //draw point void Geometry_CallbackPoint(myapp_t * pApp) { AEEPoint point; AECHAR szBuf[] = {'P','o','i','n','t','\0'}; point.x = pApp->di.cxScreen / 2; point.y = pApp->di.cyScreen / 2; IDISPLAY_ClearScreen (pApp->a.m_pIDisplay); IGRAPHICS_SetColor(pApp->pIGraphics, 0x66, 0x00, 0x99, 0xFF); IGRAPHICS_SetPointSize(pApp->pIGraphics, 10); IGRAPHICS_DrawPoint(pApp->pIGraphics, &point); IDISPLAY_DrawText(pApp->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, pApp->di.cyScreen - 15, 0, IDF_ALIGN_CENTER); IDISPLAY_Update (pApp->a.m_pIDisplay); ISHELL_SetTimer(pApp->a.m_pIShell, TIMER_PERIOD, (PFNNOTIFY)Geometry_CallbackPolygon, pApp); } //draw polygon void Geometry_CallbackPolygon(myapp_t * pApp) { AEEPolygon polygon; AECHAR szBuf[] = {'P','o','l','y','g','o','n','\0'}; 임베디드 모바일 프로그래밍
13. IGraphics API polygon.len = 4; polygon.points = MALLOC(sizeof(AEEPoint) * polygon.len); //allocate point array for polygon //make polygon points polygon.points[0].x = 10; polygon.points[0].y = 10; polygon.points[1].x = 50; polygon.points[1].y = 50; polygon.points[2].x = 30; polygon.points[2].y = 70; polygon.points[3].x = 10; polygon.points[3].y = 30; IDISPLAY_ClearScreen (pApp->a.m_pIDisplay); IGRAPHICS_SetColor(pApp->pIGraphics, 0xFF, 0x00, 0x00, 0xFF); IGRAPHICS_DrawPolygon(pApp->pIGraphics, &polygon); IDISPLAY_DrawText(pApp->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, pApp->di.cyScreen - 15, 0, IDF_ALIGN_CENTER); IDISPLAY_Update (pApp->a.m_pIDisplay); FREE(polygon.points); ISHELL_SetTimer(pApp->a.m_pIShell, TIMER_PERIOD, (PFNNOTIFY)Geometry_CallbackPolyline, pApp); } 임베디드 모바일 프로그래밍
13. IGraphics API //draw polyline (multiple connected lines) void Geometry_CallbackPolyline(myapp_t * pApp) { AEEPolyline polyline; AECHAR szBuf[] = {'P','o','l','y','l','i','n','e','\0'}; polyline.len = 4; polyline.points = MALLOC(sizeof(AEEPoint) * polyline.len); //allocate point array for polyline //make polyline points polyline.points[0].x = 80; polyline.points[0].y = 20; polyline.points[1].x = 30; polyline.points[1].y = 90; polyline.points[2].x = 50; polyline.points[2].y = 70; polyline.points[3].x = 20; polyline.points[3].y = 60; IDISPLAY_ClearScreen (pApp->a.m_pIDisplay); IGRAPHICS_SetColor(pApp->pIGraphics, 0x99, 0x00, 0x00, 0xFF); IGRAPHICS_DrawPolyline(pApp->pIGraphics, &polyline); IDISPLAY_DrawText(pApp->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, pApp->di.cyScreen - 15, 0, IDF_ALIGN_CENTER); IDISPLAY_Update (pApp->a.m_pIDisplay); FREE(polyline.points); ISHELL_SetTimer(pApp->a.m_pIShell, TIMER_PERIOD, (PFNNOTIFY)Geometry_CallbackRect, pApp); } 임베디드 모바일 프로그래밍
13. IGraphics API //draw rectangle void Geometry_CallbackRect(myapp_t * pApp) { AEERect rect; AECHAR szBuf[] = {'R','e','c','t','a','n','g','l','e','\0'}; rect.x = 20; rect.y = 20; rect.dx = 80; rect.dy = 50; IDISPLAY_ClearScreen (pApp->a.m_pIDisplay); IGRAPHICS_SetColor(pApp->pIGraphics, 0x00, 0x00, 0xFF, 0xFF); IGRAPHICS_DrawRect(pApp->pIGraphics, &rect); IDISPLAY_DrawText(pApp->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, pApp->di.cyScreen - 15, 0, IDF_ALIGN_CENTER); IDISPLAY_Update (pApp->a.m_pIDisplay); ISHELL_SetTimer(pApp->a.m_pIShell, TIMER_PERIOD, (PFNNOTIFY)Geometry_CallbackTriangle, pApp); } //draw triangle void Geometry_CallbackTriangle(myapp_t * pApp) { AEETriangle triangle; AECHAR szBuf[] = {'T','r','i','a','n','g','l','e','\0'}; triangle.x0 = 50; triangle.y0 = 10; 임베디드 모바일 프로그래밍
13. IGraphics API triangle.x1 = 80; triangle.y1 = 50; triangle.x2 = 30; triangle.y2 = 50; IDISPLAY_ClearScreen (pApp->a.m_pIDisplay); IGRAPHICS_SetColor(pApp->pIGraphics, 0xFF, 0x00, 0xFF, 0xFF); IGRAPHICS_DrawTriangle(pApp->pIGraphics, &triangle); IDISPLAY_DrawText(pApp->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, pApp->di.cyScreen - 15, 0, IDF_ALIGN_CENTER); IDISPLAY_Update (pApp->a.m_pIDisplay); ISHELL_SetTimer(pApp->a.m_pIShell, TIMER_PERIOD, (PFNNOTIFY)Geometry_CallbackArc, pApp); } static void DisplayOutput(IApplet * pi, int nline, char *pszStr, RGBVAL clrColor) { AEEDeviceInfo di; // Device Info AECHAR szBuf[200] = {0}; // a buffer that supports 200 char string AECHAR * psz = NULL; int pixelWidth; AEEFont font = AEE_FONT_NORMAL; int pnFits = 0, dy; int totalCh = 0; int charHeight = 0; // Stores the char height in pixels for given font int pnAscent = 0; // Stores the ascent in number of pixels int pnDescent = 0; // Stores the descent in number of pixels AEERect rc; 임베디드 모바일 프로그래밍
13. IGraphics API AEEApplet * pMe = (AEEApplet*)pi; if (pMe == NULL) return; // Get device information ISHELL_GetDeviceInfo(pMe->m_pIShell,&di); // Get the font metrics info charHeight = IDISPLAY_GetFontMetrics (pMe->m_pIDisplay, AEE_FONT_NORMAL, &pnAscent, &pnDescent); STREXPAND((byte *)pszStr, STRLEN(pszStr), szBuf, sizeof(szBuf)); if (nline < 0) { dy = di.cyScreen*2/5; } else{ dy = nline * charHeight; } psz = szBuf; totalCh = STRLEN ((char *)pszStr); while ((totalCh > 0) && (*psz != NULL)) { pixelWidth = IDISPLAY_MeasureTextEx(pMe->m_pIDisplay, font, (AECHAR *) psz, // Start of the buffer to display, -1, di.cxScreen - 5, // maxWidth &pnFits); // Number of chars that will fit a line 임베디드 모바일 프로그래밍
13. IGraphics API if (pnFits == 0) return; SETAEERECT(&rc, 0, dy, di.cxScreen, charHeight); IDISPLAY_EraseRect(pMe->m_pIDisplay, &rc); IDISPLAY_SetColor(pMe->m_pIDisplay,CLR_USER_TEXT,clrColor); IDISPLAY_DrawText(pMe->m_pIDisplay, AEE_FONT_BOLD, psz, pnFits, 5 /*start dx*/, dy, 0 /* use default rectangle coordinates */, IDF_ALIGN_CENTER); psz += pnFits; // move pointer to the next segment to be displayed totalCh -= pnFits; // reduce the total number of characters to still display dy += charHeight; // Place next line charHeight pixels below the // previous line. IDISPLAY_Update(pMe->m_pIDisplay); if (totalCh < pnFits) pnFits = totalCh; // if total number is less than pnFits, adjust pnFits } return; } 임베디드 모바일 프로그래밍
13. IGraphics API // geometry.h #ifndef __GEOMETRY_H__ #define __GEOMETRY_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 "AEEGraphics.h" #include "AEEMenu.h" // Menu Services #include "AEEFile.h" // AEEFile Services #include "AEEText.h" #define TIMER_PERIOD 2000 typedef struct myapp_s { AEEApplet a; //applet header AEEDeviceInfo di; IGraphics * pIGraphics; } myapp_t; 임베디드 모바일 프로그래밍
13. IGraphics API static boolean Geometry_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam); void Geometry_Cleanup(myapp_t* pApp); //drawing callbacks void Geometry_CallbackArc(myapp_t * pApp); void Geometry_CallbackCircle(myapp_t * pApp); void Geometry_CallbackEllipse(myapp_t * pApp); void Geometry_CallbackLine(myapp_t * pApp); void Geometry_CallbackPie(myapp_t * pApp); void Geometry_CallbackPoint(myapp_t * pApp); void Geometry_CallbackPolygon(myapp_t * pApp); void Geometry_CallbackPolyline(myapp_t * pApp); void Geometry_CallbackRect(myapp_t * pApp); void Geometry_CallbackTriangle(myapp_t * pApp); #endif 임베디드 모바일 프로그래밍
13. IGraphics API 13.3 실행결과 임베디드 모바일 프로그래밍