kb_machblue_core_surface.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:13k
源码类别:

DVD

开发平台:

C/C++

  1. //*****************************************************************************
  2. //File Name: kb_machblue_core_surface.c
  3. //
  4. //Description: surface function
  5. //
  6. // used by Machblue to access the platform's surface api
  7. //
  8. //Author: steven
  9. //
  10. //Date:  2006.12.29
  11. //
  12. //Version:  v1.0
  13. //*****************************************************************************
  14. #include "osd.h"
  15. #include "stddefs.h"
  16. #include "stlayer.h"
  17. #include "layer.h"
  18. #include "stblit.h"
  19. #include "avmem.h"
  20. #include "evt.h"
  21. #include "machblue_defines.h"
  22. #include "machblue_porting_core.h"
  23. #include "kb_machblue_client.h"
  24. #include "kb_machblue_client_define.h"
  25. #define PIXEL_FORMAT_CLUT8     0     // Palettized Clut8 rendering (ex: as seen on OpenTV/DCT)
  26. #define PIXEL_FORMAT_RGB565    1     // RGB565 rendering  (ex: as seen on PTV)
  27. #define PIXEL_FORMAT_RGBA4444  2     // RGBA4444 renderring (ex: as seen on ST7100 for NDS)
  28. #define PIXEL_FORMAT_RGBA8888  3     // RGBA4444 renderring (ex: as seen on ST7100 for OpenTV)
  29. #define PIXEL_FORMAT  PIXEL_FORMAT_RGBA4444
  30. #define AVMEM1_SIZE 720*576*2
  31. #define MEM_PARTITION_HANDLE_COUNT 10
  32. /**
  33.  * Creates a new surface.
  34.  * surface < pointer to surface to create >
  35.  * width < width of the surface to create >
  36.  * height < height of the surface to create >
  37.  * format     < pixel format of the surface to create >
  38.  
  39.  * @return MB_SUCCESS and updates "surface" on success, MB_FAILURE otherwise.
  40.  */
  41. mb_error_t mb_surface_create(mb_surface_t *surface,int width,int height,mb_pixel_format_t format)
  42. {
  43.    ST_ErrorCode_t  ErrCode=ST_NO_ERROR;
  44.    STGXOBJ_BitmapAllocParams_t  BitmapParams1,BitmapParams2;
  45.    STAVMEM_MemoryRange_t  RangeArea[2]; 
  46.    U8  NbForbiddenRange; 
  47.    STAVMEM_AllocBlockParams_t  AllocParams;
  48. kb_movie_surface_t  *p_surface;
  49.    *surface=NULL;
  50.    p_surface=(kb_movie_surface_t*)mb_malloc(sizeof(kb_movie_surface_t));
  51.    if(p_surface==NULL)
  52.      {
  53.      mb_printf("n[Machblue]:Surface create malloc error.");
  54.        return MB_FAILURE ;
  55.      }
  56.    p_surface->m_width=width;
  57.    p_surface->m_height=height;
  58.    p_surface->m_format=format;
  59. #if (PIXEL_FORMAT==PIXEL_FORMAT_RGB565)
  60. p_surface->m_bitmap.ColorType=STGXOBJ_COLOR_TYPE_RGB565;
  61. p_surface->m_bitmap.PreMultipliedColor=FALSE;
  62. #elif (PIXEL_FORMAT==PIXEL_FORMAT_RGBA8888)
  63. p_surface->m_bitmap.ColorType=STGXOBJ_COLOR_TYPE_ARGB8888;
  64. p_surface->m_bitmap.PreMultipliedColor=FALSE;
  65. #elif (PIXEL_FORMAT==PIXEL_FORMAT_RGBA4444)
  66. p_surface->m_bitmap.ColorType=STGXOBJ_COLOR_TYPE_ARGB4444;
  67. p_surface->m_bitmap.PreMultipliedColor=FALSE;
  68. #else
  69. #error "PIXEL_FORMAT not supported"
  70. #endif
  71.    p_surface->m_bitmap.BitmapType=STGXOBJ_BITMAP_TYPE_RASTER_PROGRESSIVE;
  72.    p_surface->m_bitmap.ColorSpaceConversion=STGXOBJ_ITU_R_BT601;
  73.    p_surface->m_bitmap.AspectRatio=STGXOBJ_ASPECT_RATIO_4TO3;
  74.    p_surface->m_bitmap.Width=width;
  75.    p_surface->m_bitmap.Height=height; 
  76. #if (PIXEL_FORMAT==PIXEL_FORMAT_RGB565)
  77.    p_surface->m_bitmap.SubByteFormat=STGXOBJ_SUBBYTE_FORMAT_RPIX_LSB;
  78. #elif (PIXEL_FORMAT==PIXEL_FORMAT_RGBA8888)
  79.    p_surface->m_bitmap.SubByteFormat=STGXOBJ_SUBBYTE_FORMAT_RPIX_MSB;
  80. #elif (PIXEL_FORMAT==PIXEL_FORMAT_RGBA4444)
  81.    p_surface->m_bitmap.SubByteFormat=STGXOBJ_SUBBYTE_FORMAT_RPIX_MSB;
  82. #endif
  83.    p_surface->m_bitmap.BigNotLittle=0; 
  84. #define VIRTUAL_BASE_ADDRESS        0xA0000000
  85. #define VIRTUAL_SIZE                        AVMEM1_SIZE
  86. #define VIRTUAL_WINDOW_SIZE            AVMEM1_SIZE
  87. #define LAYER_OSD                           1
  88.    ErrCode=STLAYER_GetBitmapAllocParams(g_KB_LayerHandle[LAYER_OSD],&p_surface->m_bitmap,&BitmapParams1,&BitmapParams2);
  89.    if (ErrCode!=ST_NO_ERROR)
  90.      {
  91.        mb_printf("n[Machblue]:Surface create get bmp alloc params error.");
  92.        return MB_FAILURE;
  93.      }
  94.    /* Memory allocation for bitmap */  
  95.    NbForbiddenRange=1; 
  96.    RangeArea[0].StartAddr_p=(void *)VIRTUAL_BASE_ADDRESS;
  97.    RangeArea[0].StopAddr_p=(void *)RangeArea[0].StartAddr_p;
  98.    if((VIRTUAL_BASE_ADDRESS+VIRTUAL_WINDOW_SIZE)!=VIRTUAL_SIZE)
  99.      {
  100.        RangeArea[1].StartAddr_p=(void *)((U32)(RangeArea[0].StartAddr_p)+(U32)(0)+(U32)(VIRTUAL_WINDOW_SIZE));
  101.   RangeArea[1].StopAddr_p=(void *)((U32)(VIRTUAL_BASE_ADDRESS)+(U32)(VIRTUAL_SIZE)-1);
  102.        NbForbiddenRange=2;
  103.      }
  104.  
  105.    AllocParams.PartitionHandle=g_KBAvmemPartitionHandle[0];
  106.    AllocParams.ForbiddenBorderArray_p=(void **)NULL; 
  107.    AllocParams.AllocMode=STAVMEM_ALLOC_MODE_BOTTOM_TOP;
  108.    AllocParams.NumberOfForbiddenRanges=NbForbiddenRange;
  109.    AllocParams.ForbiddenRangeArray_p=&RangeArea[0];
  110.    AllocParams.NumberOfForbiddenBorders=0;
  111.    AllocParams.Size=BitmapParams1.AllocBlockParams.Size;
  112.    AllocParams.Alignment=16;
  113.    p_surface->m_bitmap.Pitch=BitmapParams1.Pitch;
  114.    p_surface->m_bitmap.Offset=BitmapParams1.Offset;
  115.    p_surface->m_bitmap.Data1_p=NULL;
  116.    p_surface->m_bitmap.Size1=AllocParams.Size;
  117.    p_surface->m_bitmap.Data2_p=NULL;
  118.    p_surface->m_bitmap.Size2=0;
  119.   p_surface->m_bitmap.Data1_p=mb_malloc(AllocParams.Size);
  120.    *surface=(mb_surface_t)p_surface;
  121.    return MB_SUCCESS ;
  122. }
  123. /**
  124.  * Deletes a surface.
  125.  * surface   < surface to delete >
  126.  
  127.  * @return MB_SUCCESS on success and MB_FAILURE on failure.
  128.  */
  129. mb_error_t mb_surface_delete(mb_surface_t surface)
  130. {
  131. kb_movie_surface_t  *pSurface=(kb_movie_surface_t *)surface;
  132. if(pSurface==NULL)
  133. {
  134. mb_printf("nmb_surface_delete surface NULL.");
  135. return MB_FAILURE;
  136. }
  137. mb_free((void*)pSurface->m_bitmap.Data1_p);
  138.    mb_free((void*)pSurface);
  139.    return MB_SUCCESS;
  140. }
  141. /**
  142.  * Get the pixel size in bytes.
  143.  * format < pixel format >
  144.  
  145.  * @return the pixel bytes success, -1 on failure.
  146.  */
  147. int mb_surface_pixel_bytes(mb_pixel_format_t format)
  148. {
  149. int bytes=-1;
  150.     switch(format)
  151.     {
  152.        case MB_CLUT8_FORMAT:
  153.           bytes=1;
  154. break;
  155.        case MB_ARGB4444_FORMAT:
  156.        case MB_ARGB1555_FORMAT:
  157.        case MB_RGB565_FORMAT:
  158.           bytes=2;
  159. break;
  160.        case MB_ARGB8888_FORMAT:
  161.          bytes=4;
  162. break;
  163.     }
  164.     return bytes;
  165. }
  166. /**
  167.  * Computes the amount of memory that would be required to create a surface
  168.  * with the provided attributes. size_req is updated with the amount of memory 
  169.  * required in case of success.
  170.  * width  < width of the surface to estimate >
  171.  * height  < height of the surface to estimate >
  172.  * format  < pixel format of the surface to estimate >
  173.  * size_req   < pointer to location to store size requirements >
  174.  
  175.  * @return MB_SUCCESS and MB_FAILURE on failure.
  176.  */
  177. mb_error_t mb_surface_requirement_get(int width,int height,mb_pixel_format_t format,mb_size_t *size_req)
  178. {
  179. int pixSize;
  180. if(size_req==NULL)
  181. {
  182. mb_printf("nmb_surface_requirement_get size NULL.");
  183. return MB_FAILURE;
  184. }
  185. pixSize=mb_surface_pixel_bytes(format);
  186. if(pixSize<0)
  187. {
  188. mb_printf("n[Machblue]:Surface requirement get error.");
  189. return MB_FAILURE;
  190. }
  191.     *size_req=width*height*pixSize;
  192.     return  MB_SUCCESS ;
  193. }
  194. /**
  195.  * Queries the attributes of a surface.
  196.  * surface < surface to query >
  197.  * width < pointer to location to store the width of the surface >
  198.  * height < pointer to location to store the height of the surface >
  199.  * format     < pointer to location to store the pixel format of the surface >
  200.  
  201.  * @return MB_SUCCESS and MB_FAILURE on failure.
  202.  */
  203. mb_error_t mb_surface_attributes_get(mb_surface_t surface,int *width,int *height,mb_pixel_format_t *format)
  204. {
  205. kb_movie_surface_t *pSurface=(kb_movie_surface_t *)surface;
  206.    if((pSurface==NULL)||(width==NULL)||(height==NULL)||(format==(mb_pixel_format_t*)NULL))
  207.      {
  208.      mb_printf("n[Machblue]:Surface attributes get error.");
  209.        return MB_FAILURE;
  210.      }
  211.    *width=pSurface->m_width;
  212.    *height=pSurface->m_height;
  213.    *format=pSurface->m_format;
  214.    return MB_SUCCESS;
  215. }
  216. /**
  217.  * Clears a surface.
  218.  * surface < surface to clear >
  219.  * rect < rectangle area to clear >
  220.  * color      < color in surface color format >
  221.  
  222.  * @return MB_SUCCESS on success and MB_FAILURE on failure.
  223.  */
  224. mb_error_t mb_surface_clear(mb_surface_t surface,mb_rect_t *rect,unsigned int  color)
  225. {
  226. kb_movie_surface_t  *pSurface=(kb_movie_surface_t *)surface;
  227. unsigned char  *pDest=pSurface->m_bitmap.Data1_p;
  228. unsigned long  index,desPitch;
  229. for (index=0;index<rect->height;index++)
  230. {
  231. desPitch=((rect->y+index)*pSurface->m_width+rect->x)*KB_OSD_BYTES;
  232. mb_memset(pDest+desPitch,0x00,rect->width*KB_OSD_BYTES);
  233. }     
  234. return MB_SUCCESS;
  235. }
  236. /**
  237.  * Locks a surface.
  238.  * surface < surface to lock >
  239.  * pitch < pointer to int to store surface pitch >
  240.  * locked_ptr < pointer to the location to store pointer to the locked surface buffer >
  241.  
  242.  * @return MB_SUCCESS and updates locked_ptr on success and MB_FAILURE on failure. 
  243.  * The pitch value is updated in case of success. 
  244.  */
  245. mb_error_t mb_surface_lock(mb_surface_t surface,int *pitch,void **locked_ptr)
  246. {
  247. kb_movie_surface_t *pSurface=(kb_movie_surface_t *)surface;
  248. if(pSurface==NULL)
  249. {
  250.      mb_printf("n[Machblue]:Surface lock error.");
  251.        return MB_FAILURE;
  252.      }
  253.    *pitch=pSurface->m_bitmap.Pitch;
  254.    *locked_ptr=pSurface->m_bitmap.Data1_p;
  255.    return MB_SUCCESS;
  256. }
  257. /**
  258.  * Unlocks a surface.
  259.  * surface   < surface to unlock >
  260.  
  261.  * @return MB_SUCCESS on success, MB_FAILURE on failure.
  262.  */
  263. mb_error_t mb_surface_unlock(mb_surface_t surface)
  264. {
  265. return MB_SUCCESS;
  266. }
  267. /**
  268.  * Blits a surface into another surface.
  269.  * dest_surface < destination surface >
  270.  * dest_rect < destination rectangle area to blit to >
  271.  * src_surface < source surface >
  272.  * src_rect < source rectangle area to blit from >
  273.  * options       < blit options >
  274.  
  275.  * @return MB_SUCCESS on success, MB_FAILURE on failure.
  276.  */
  277. mb_error_t mb_surface_blit(mb_surface_t dest_surface,mb_rect_t *dest_rect,mb_surface_t src_surface,mb_rect_t *src_rect,mb_blit_option_t options)
  278. {
  279. kb_movie_surface_t  *pSrcSurface=(kb_movie_surface_t *)src_surface;
  280. kb_movie_surface_t  *pDestSurface=(kb_movie_surface_t *)dest_surface;
  281. unsigned char  *pSrc=pSrcSurface->m_bitmap.Data1_p;
  282. unsigned char  *pDest=pDestSurface->m_bitmap.Data1_p;
  283. unsigned long  index,srcPitch,desPitch;
  284. for (index=0;index<src_rect->height;index++)
  285. {
  286. srcPitch=((src_rect->y+index)*pSrcSurface->m_width+src_rect->x)*KB_OSD_BYTES;
  287. desPitch=((dest_rect->y+index)*pDestSurface->m_width+dest_rect->x)*KB_OSD_BYTES;
  288. mb_memcpy(pDest+desPitch,pSrc+srcPitch,src_rect->width*KB_OSD_BYTES);
  289. }
  290. return MB_SUCCESS;
  291. }
  292. /**
  293.  * Copy data to display buf.
  294.  * pRect < rectangle parameter >
  295.  * pMemory < pointer to source data >
  296.  
  297.  * @return None.
  298.  */
  299. void mb_surface_osd_copy(mb_rect_t *pRect,void *pMemory)
  300. {    
  301. unsigned char *pSrc,*pDest;
  302. unsigned long index,srcPitch,desPitch;
  303. pSrc=(unsigned char*)pMemory;
  304. pDest=(unsigned char*)Bitmap[VPORT_OSD].Data1_p;
  305. for (index=0;index<pRect->height;index++)
  306. {
  307. srcPitch=index*KB_OSD_WIDTH*KB_OSD_BYTES;
  308. desPitch=((pRect->y+index)*KB_OSD_WIDTH+pRect->x)*KB_OSD_BYTES;
  309. mb_memcpy(pDest+desPitch,pSrc+srcPitch,pRect->width*KB_OSD_BYTES);
  310. }     
  311. }
  312. /**
  313.  * Clear display buf. 
  314.  * @return None.
  315.  */
  316. void mb_surface_osd_clear(void)
  317. {    
  318. unsigned char *pDest;
  319. pDest=(unsigned char*)Bitmap[VPORT_OSD].Data1_p;
  320. mb_memset(pDest,0x00,Bitmap[VPORT_OSD].Size1*KB_OSD_BYTES);
  321. }
  322. /**
  323.  * Callback of surface. 
  324.  * @return MB_SUCCESS on success, MB_FAILURE on failure.
  325.  */
  326. mb_error_t mb_surface_notify( mb_gfx_cb_reason_t reason, mb_args_t *args, void *client_data )
  327. {
  328. mb_rect_t  *dirtyRect;
  329. mb_surface_t  src_surface;
  330. unsigned char *bmpData;
  331.     switch(reason)
  332.     {
  333.        case MB_GFX_REDRAW_CB:
  334.           dirtyRect=(mb_rect_t *)MB_GFX_RECT_ARG(args);
  335.           src_surface=(mb_surface_t)MB_GFX_SURFACE_ARG(args);
  336.          
  337. bmpData=((kb_movie_surface_t*)src_surface)->m_bitmap.Data1_p;
  338. bmpData+=((dirtyRect->y*KB_OSD_WIDTH+dirtyRect->x)*2);
  339. mb_surface_osd_copy(dirtyRect,bmpData);
  340. break;
  341.        case MB_GFX_SET_PALETTE_CB:
  342. mb_printf("n[Machblue]:Surface graphics context set pallette notification.");
  343.        break;
  344.     }
  345.    return MB_SUCCESS;
  346. }
  347. /**
  348.  * Init graphics context which include the surface.
  349.  * format < pixel format >
  350.  
  351.  * @return MB_SUCCESS on success, MB_FAILURE on failure.
  352.  */
  353. mb_error_t mb_surface_graphics_init(mb_gfx_ctx_t *p_gfx_ctx, void *client_data)
  354. {
  355.     mb_pixel_format_t format;
  356.     switch(PIXEL_FORMAT)
  357.     {
  358.     case PIXEL_FORMAT_CLUT8:
  359.        format=MB_CLUT8_FORMAT;
  360.        break;
  361.     case PIXEL_FORMAT_RGB565:
  362.        format=MB_RGB565_FORMAT;
  363.        break;
  364.     case PIXEL_FORMAT_RGBA4444:
  365.        format=MB_ARGB4444_FORMAT;
  366.        break;
  367.     case PIXEL_FORMAT_RGBA8888:
  368.        format=MB_ARGB8888_FORMAT;
  369.        break;
  370.     default:
  371.        return MB_FAILURE;
  372.     }
  373.     //* Creates a new surface and return the surface pointer to be initialized.
  374.     if(mb_surface_create(&(p_gfx_ctx->surface),720,576,format)!=MB_SUCCESS)
  375.     {
  376.     mb_printf("n[Machblue]:Surface graphics init error.");
  377.        return MB_FAILURE;
  378.     }
  379.     p_gfx_ctx->bounds.x=0;
  380. p_gfx_ctx->bounds.y=0;
  381.     p_gfx_ctx->bounds.width=720;
  382.     p_gfx_ctx->bounds.height=576;
  383.     p_gfx_ctx->callback_f=mb_surface_notify;
  384.     p_gfx_ctx->cb_client_data=client_data;
  385.     return MB_SUCCESS;
  386. }