static HI_VOID circumrotate (HI_U32 u32CurOnShow) { TDE_HANDLE s32Handle; TDE2_OPT_S stOpt = {0}; HI_FLOAT eXMid, eYMid; HI_FLOAT eRadius; HI_U32 i; HI_FLOAT f; HI_U32 u32NextOnShow; TDE2_RECT_S stSrcRect; TDE2_RECT_S stDstRect; HI_S32 s32Ret = HI_SUCCESS; u32NextOnShow = !u32CurOnShow; f = (float) (g_s32FrameNum % CYCLE_LEN) / CYCLE_LEN; stSrcRect.s32Xpos = 0; stSrcRect.s32Ypos = 0; stSrcRect.u32Width = g_stBackGround.u32Width; stSrcRect.u32Height = g_stBackGround.u32Height; eXMid = g_stBackGround.u32Width/2.16f; eYMid = g_stBackGround.u32Height/2.304f; eRadius = MIN (eXMid, eYMid) / 2.0f; /* 1. start job */ s32Handle = HI_TDE2_BeginJob(); if(HI_ERR_TDE_INVALID_HANDLE == s32Handle) { TDE_PRINT("start job failed!\n"); return ; } /* 2. bitblt background to screen */ s32Ret = HI_TDE2_QuickCopy(s32Handle, &g_stBackGround, &stSrcRect, &g_stScreen[u32NextOnShow], &stSrcRect); if(s32Ret < 0) { TDE_PRINT("Line:%d failed,ret=0x%x!\n", __LINE__, s32Ret); HI_TDE2_CancelJob(s32Handle); return ; } for(i = 0; i < N_IMAGES; i++) { HI_FLOAT ang; HI_FLOAT r; stSrcRect.s32Xpos = 0; stSrcRect.s32Ypos = 0; stSrcRect.u32Width = g_stImgSur[i].u32Width; stSrcRect.u32Height = g_stImgSur[i].u32Height; /* 3. calculate new pisition */ ang = 2.0f * (HI_FLOAT) M_PI * (HI_FLOAT) i / N_IMAGES - f * 2.0f * (HI_FLOAT) M_PI; r = eRadius + (eRadius / 3.0f) * sinf (f * 2.0 * M_PI); stDstRect.s32Xpos = eXMid + r * cosf (ang) - g_stImgSur[i].u32Width / 2.0f;; stDstRect.s32Ypos = eYMid + r * sinf (ang) - g_stImgSur[i].u32Height / 2.0f; stDstRect.u32Width = g_stImgSur[i].u32Width; stDstRect.u32Height = g_stImgSur[i].u32Height; /* 4. bitblt image to screen */ s32Ret = HI_TDE2_Bitblit(s32Handle, NULL, NULL, &g_stImgSur[i], &stSrcRect, &g_stScreen[u32NextOnShow], &stDstRect, &stOpt); if(s32Ret < 0) { TDE_PRINT("Line:%d,HI_TDE2_Bitblit failed,ret=0x%x!\n", __LINE__, s32Ret); HI_TDE2_CancelJob(s32Handle); return ; } } /* 5. submit job */ s32Ret = HI_TDE2_EndJob(s32Handle, HI_FALSE, HI_TRUE, 10); if(s32Ret < 0) { TDE_PRINT("Line:%d,HI_TDE2_EndJob failed,ret=0x%x!\n", __LINE__, s32Ret); HI_TDE2_CancelJob(s32Handle); return ; } g_s32FrameNum++; return; }
HI_S32 TDE_DrawGraphicSample() { HI_U32 u32Size; HI_S32 s32Fd; HI_U32 u32Times; HI_U8* pu8Screen; HI_U8* pu8BackGroundVir; HI_U32 u32PhyAddr; HI_S32 s32Ret = -1; HI_U32 i = 0; HI_BOOL bShow; HIFB_ALPHA_S stAlpha = {0}; struct fb_fix_screeninfo stFixInfo; struct fb_var_screeninfo stVarInfo; struct fb_bitfield stR32 = {10, 5, 0}; struct fb_bitfield stG32 = {5, 5, 0}; struct fb_bitfield stB32 = {0, 5, 0}; struct fb_bitfield stA32 = {15, 1, 0}; /* 1. open tde device */ HI_TDE2_Open(); /* 2. framebuffer operation */ s32Fd = open("/dev/fb0", O_RDWR); if (s32Fd == -1) { printf("open frame buffer device error\n"); goto FB_OPEN_ERROR; } stAlpha.bAlphaChannel = HI_FALSE; stAlpha.bAlphaEnable = HI_FALSE; if (ioctl(s32Fd, FBIOPUT_ALPHA_HIFB, &stAlpha) < 0) { printf("Put alpha info failed!\n"); goto FB_PROCESS_ERROR0; } /* get the variable screen info */ if (ioctl(s32Fd, FBIOGET_VSCREENINFO, &stVarInfo) < 0) { printf("Get variable screen info failed!\n"); goto FB_PROCESS_ERROR0; } stVarInfo.xres_virtual = SCREEN_WIDTH; stVarInfo.yres_virtual = SCREEN_HEIGHT*2; stVarInfo.xres = SCREEN_WIDTH; stVarInfo.yres = SCREEN_HEIGHT; stVarInfo.activate = FB_ACTIVATE_NOW; stVarInfo.bits_per_pixel = 16; stVarInfo.xoffset = 0; stVarInfo.yoffset = 0; stVarInfo.red = stR32; stVarInfo.green = stG32; stVarInfo.blue = stB32; stVarInfo.transp = stA32; if (ioctl(s32Fd, FBIOPUT_VSCREENINFO, &stVarInfo) < 0) { printf("process frame buffer device error\n"); goto FB_PROCESS_ERROR0; } if (ioctl(s32Fd, FBIOGET_FSCREENINFO, &stFixInfo) < 0) { printf("process frame buffer device error\n"); goto FB_PROCESS_ERROR0; } u32Size = stFixInfo.smem_len; u32PhyAddr = stFixInfo.smem_start; pu8Screen = mmap(NULL, u32Size, PROT_READ|PROT_WRITE, MAP_SHARED, s32Fd, 0); if (NULL == pu8Screen) { printf("mmap fb0 failed!\n"); goto FB_PROCESS_ERROR0; } memset(pu8Screen, 0x00, stFixInfo.smem_len); /* 3. create surface */ g_stScreen[0].enColorFmt = PIXFMT; g_stScreen[0].u32PhyAddr = u32PhyAddr; g_stScreen[0].u32Width = SCREEN_WIDTH; g_stScreen[0].u32Height = SCREEN_HEIGHT; g_stScreen[0].u32Stride = stFixInfo.line_length; g_stScreen[0].bAlphaMax255 = HI_TRUE; g_stScreen[1] = g_stScreen[0]; g_stScreen[1].u32PhyAddr = g_stScreen[0].u32PhyAddr + g_stScreen[0].u32Stride * g_stScreen[0].u32Height; /* allocate memory (720*576*2*N_IMAGES bytes) to save Images' infornation */ if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&(g_stBackGround.u32PhyAddr), ((void**)&pu8BackGroundVir), NULL, NULL, 720*576*2*N_IMAGES)) { TDE_PRINT("allocate memory (720*576*2*N_IMAGES bytes) failed\n"); goto FB_PROCESS_ERROR1; } TDE_CreateSurfaceByFile(BACKGROUND_NAME, &g_stBackGround, pu8BackGroundVir); g_stImgSur[0].u32PhyAddr = g_stBackGround.u32PhyAddr + g_stBackGround.u32Stride * g_stBackGround.u32Height; for(i = 0; i < N_IMAGES - 1; i++) { TDE_CreateSurfaceByFile(pszImageNames[i], &g_stImgSur[i], pu8BackGroundVir + ((HI_U32)g_stImgSur[i].u32PhyAddr - g_stBackGround.u32PhyAddr)); g_stImgSur[i+1].u32PhyAddr = g_stImgSur[i].u32PhyAddr + g_stImgSur[i].u32Stride * g_stImgSur[i].u32Height; } TDE_CreateSurfaceByFile(pszImageNames[i], &g_stImgSur[i], pu8BackGroundVir + ((HI_U32)g_stImgSur[i].u32PhyAddr - g_stBackGround.u32PhyAddr)); bShow = HI_TRUE; if (ioctl(s32Fd, FBIOPUT_SHOW_HIFB, &bShow) < 0) { fprintf (stderr, "Couldn't show fb\n"); goto FB_PROCESS_ERROR2; } g_s32FrameNum = 0; /* 3. use tde and framebuffer to realize rotational effect */ for (u32Times = 0; u32Times < 20; u32Times++) { circumrotate(u32Times%2); stVarInfo.yoffset = (u32Times%2)?0:576; /*set frame buffer start position*/ if (ioctl(s32Fd, FBIOPAN_DISPLAY, &stVarInfo) < 0) { TDE_PRINT("process frame buffer device error\n"); goto FB_PROCESS_ERROR2; } sleep(1); } s32Ret = 0; FB_PROCESS_ERROR2: HI_MPI_SYS_MmzFree(g_stBackGround.u32PhyAddr, pu8BackGroundVir); FB_PROCESS_ERROR1: munmap(pu8Screen, u32Size); FB_PROCESS_ERROR0: close(s32Fd); FB_OPEN_ERROR: HI_TDE2_Close(); return s32Ret; }
static HI_VOID circumrotate (HI_U32 u32CurOnShow) { TDE_HANDLE s32Handle; TDE2_OPT_S stOpt = {0}; TDE2_RECT_S stSrcRect; TDE2_RECT_S stDstRect; HI_U32 u32NextOnShow; u32NextOnShow = !u32CurOnShow; HI_U32 s32Ret; HI_U32 u32FillData = 0x8000; TDE2_RECT_S pstScreenRect; /* 1. start job */ s32Handle = HI_TDE2_BeginJob(); if(HI_ERR_TDE_INVALID_HANDLE == s32Handle) { TDE_PRINT("start job failed!\n"); return ; } pstScreenRect.s32Xpos = 0; pstScreenRect.s32Ypos = 0; pstScreenRect.u32Width = SCREEN_WIDTH; pstScreenRect.u32Height = SCREEN_HEIGHT; s32Ret = HI_TDE2_QuickFill(s32Handle, &g_stScreen[u32NextOnShow], &pstScreenRect, u32FillData); if(s32Ret < 0) { TDE_PRINT("Line:%d,HI_TDE2_QuickFill failed,ret=0x%x!\n", __LINE__, s32Ret); HI_TDE2_CancelJob(s32Handle); return ; } stOpt.enColorKeyMode = TDE2_COLORKEY_MODE_FOREGROUND; stOpt.unColorKeyValue.struCkARGB.stBlue.bCompIgnore = HI_FALSE; stOpt.unColorKeyValue.struCkARGB.stBlue.bCompOut = HI_FALSE; stOpt.unColorKeyValue.struCkARGB.stBlue.u8CompMin = 0xff; stOpt.unColorKeyValue.struCkARGB.stBlue.u8CompMax = 0xff; stOpt.unColorKeyValue.struCkARGB.stBlue.u8CompMask = 0xff; stOpt.unColorKeyValue.struCkARGB.stGreen.bCompIgnore = HI_TRUE; stOpt.unColorKeyValue.struCkARGB.stRed.bCompIgnore = HI_TRUE; stOpt.unColorKeyValue.struCkARGB.stAlpha.bCompIgnore = HI_TRUE; stSrcRect.s32Xpos = 0; stSrcRect.s32Ypos = 0; stSrcRect.u32Width = g_stImgSur.u32Width; stSrcRect.u32Height = g_stImgSur.u32Height; stDstRect.s32Xpos = 100; stDstRect.s32Ypos = 100; stDstRect.u32Width = g_stImgSur.u32Width; stDstRect.u32Height = g_stImgSur.u32Height; /* 4. bitblt image to screen */ s32Ret = HI_TDE2_Bitblit(s32Handle, &g_stScreen[u32NextOnShow], &stDstRect, &g_stImgSur, &stSrcRect, &g_stScreen[u32NextOnShow], &stDstRect, &stOpt); if(s32Ret < 0) { TDE_PRINT("Line:%d,HI_TDE2_Bitblit failed,ret=0x%x!\n", __LINE__, s32Ret); HI_TDE2_CancelJob(s32Handle); return ; } /* 5. submit job */ s32Ret = HI_TDE2_EndJob(s32Handle, HI_FALSE, HI_TRUE, 10); if(s32Ret < 0) { TDE_PRINT("Line:%d,HI_TDE2_EndJob failed,ret=0x%x!\n", __LINE__, s32Ret); HI_TDE2_CancelJob(s32Handle); return ; } return; }