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

DVD

开发平台:

C/C++

  1. #include "osd.h"
  2. #include "layer.h"
  3. #include "avmem.h"
  4. #include "text.h"
  5. #include "blit.h"
  6. #include "errors.h"
  7. STGXOBJ_Bitmap_t             Bitmap[NUM_VPORTS];
  8. STAVMEM_BlockHandle_t      BitmapBlockHandle[NUM_VPORTS];
  9. static INT32 gnOsdInitFlag = FALSE;
  10. static INT32 gnOsdTransparencyLevel;
  11. INT32 KB_OSDFillRect(INT32 nX,INT32 nY,INT32 nWidth,INT32 nHeight,ColrRef nColor)
  12. {    
  13.      STGXOBJ_Rectangle_t tRect;    
  14.      ST_ErrorCode_t nStErrCode;
  15.      STGXOBJ_Color_t tColor;
  16.     
  17.      tRect.PositionX = (S32)nX;
  18.      tRect.PositionY = (S32)nY;
  19.      tRect.Width     = (S32)nWidth;
  20.      tRect.Height    = (S32)nHeight;      
  21.     
  22.      tColor.Type = STGXOBJ_COLOR_TYPE_ARGB4444;//STGXOBJ_COLOR_TYPE_ARGB1555;   
  23. tColor.Value.ARGB1555.Alpha = (UINT8)((nColor >> 31) & 0x00000001);
  24.      tColor.Value.ARGB1555.R     = (UINT8)((nColor >> 19) & 0x0000001F);
  25.      tColor.Value.ARGB1555.G     = (UINT8)((nColor >> 11) & 0x0000001F);
  26.      tColor.Value.ARGB1555.B     = (UINT8)((nColor >>  3) & 0x0000001F);
  27.     
  28.      nStErrCode = STBLIT_FillRectangle(BLIT_Handle, &Bitmap[VPORT_OSD], &tRect, &tColor, &GtBlitContext);
  29.     
  30.      return RETOK;
  31. }
  32. INT32 KB_OSDRef2Rgb(ColrRef nColorRef, KB_OSDRGB *pRgb)
  33. {
  34.      if (pRgb == NULL)
  35.      {
  36.          return RETFAIL3;
  37.      }
  38.     
  39.      pRgb->cRed   = (UINT8)((nColorRef >> 16) & 0x000000FF);
  40.      pRgb->cGreen = (UINT8)((nColorRef >>  8) & 0x000000FF);
  41.      pRgb->cBlue  = (UINT8)((nColorRef)       & 0x000000FF);
  42.      return RETOK;
  43. }
  44. INT32 KB_OSDGetTransparency(void)
  45. {
  46.      return gnOsdTransparencyLevel;
  47. }
  48. INT32 KB_OSDSetTransparency(INT32 nLevel)
  49. {
  50.      if (nLevel < 0 || nLevel > 100)
  51.      {
  52.          return RETFAIL3;
  53.      }
  54.     
  55.      gnOsdTransparencyLevel = nLevel;
  56.      KB_LayerSetViewPortAlpha(VPORT_OSD, nLevel);
  57.      return RETOK;
  58. }
  59. /*=============================================================
  60.  函数名称 : KB_OSDAllocate
  61.  功    能 : 在g_KBAvmemPartitionHandle[0]分区中分配存储空间
  62.                    该空间能够容纳特定类型的位图数据,
  63.                    这里的类型是本OSD 模块所支持的类型
  64.  入    口 : INT32 nWidth  位图的宽
  65.                    INT32 nHeight 位图的高
  66.  出    口 : 无
  67.  返    回 : 存储空间指针
  68. =============================================================*/
  69. void* KB_OSDAllocate(INT32 nWidth, INT32 nHeight)
  70. {
  71.      ST_ErrorCode_t              ErrCode = ST_NO_ERROR;
  72.      STAVMEM_AllocBlockParams_t  AllocParams;    
  73.      STAVMEM_BlockHandle_t       BlockHandle;
  74.      STGXOBJ_BitmapAllocParams_t BitmapAllocParams1, BitmapAllocParams2;
  75.      STGXOBJ_Bitmap_t *Bitmap_p;
  76.      STGXOBJ_Bitmap_t Bitmap;       
  77.      Bitmap_p = &Bitmap;
  78.     
  79.      /* Image Info */
  80.      Bitmap_p->ColorType            = STGXOBJ_COLOR_TYPE_ARGB4444;
  81.      Bitmap_p->BitmapType           = STGXOBJ_BITMAP_TYPE_RASTER_PROGRESSIVE;
  82.      Bitmap_p->ColorSpaceConversion = STGXOBJ_ITU_R_BT601;
  83.      Bitmap_p->AspectRatio          = STGXOBJ_ASPECT_RATIO_4TO3;
  84.      Bitmap_p->Width                = (U32)nWidth;
  85.      Bitmap_p->Height               = (U32)nHeight;
  86.      /* Unused */
  87.      Bitmap_p->PreMultipliedColor   = FALSE;
  88.      Bitmap_p->SubByteFormat        = STGXOBJ_SUBBYTE_FORMAT_RPIX_MSB;
  89.      Bitmap_p->BigNotLittle         = FALSE;
  90.      /* Get Alloc Parameters */
  91.      ErrCode = STLAYER_GetBitmapAllocParams(g_KB_LayerHandle[LAYER_OSD], Bitmap_p, &BitmapAllocParams1, &BitmapAllocParams2);
  92.      if ( ErrCode != ST_NO_ERROR )
  93.      {
  94.          printf("STLAYER_GetBitmapAllocParams()=%sn", DBGError(ErrCode));
  95.          return NULL;
  96.      }
  97.      AllocParams.PartitionHandle          = g_KBAvmemPartitionHandle[0];
  98.      AllocParams.AllocMode                = STAVMEM_ALLOC_MODE_BOTTOM_TOP;
  99.      AllocParams.NumberOfForbiddenRanges  = 0;
  100.      AllocParams.ForbiddenRangeArray_p    = (STAVMEM_MemoryRange_t *) NULL;
  101.      AllocParams.NumberOfForbiddenBorders = 0;
  102.      AllocParams.ForbiddenBorderArray_p   = (void **) NULL;
  103.      /* Values from layer fn */
  104.      AllocParams.Size      = BitmapAllocParams1.AllocBlockParams.Size;
  105.      AllocParams.Alignment = BitmapAllocParams1.AllocBlockParams.Alignment;
  106. AllocParams.Alignment = 16;
  107.      Bitmap_p->Pitch   = BitmapAllocParams1.Pitch;
  108.      Bitmap_p->Offset  = BitmapAllocParams1.Offset;
  109.      Bitmap_p->Data1_p = NULL;
  110.      Bitmap_p->Size1   = AllocParams.Size;
  111.      Bitmap_p->Data2_p = NULL;
  112.      Bitmap_p->Size2   = 0;
  113.      /* Allocate Display buffer */
  114.      ErrCode = STAVMEM_AllocBlock( &AllocParams, &BlockHandle );
  115.      if ( ErrCode != ST_NO_ERROR )
  116.      {
  117.          printf("Error allocating AVMEM memory : 0x%08Xn",ErrCode);
  118.          return NULL;
  119.      }
  120.     
  121.      ErrCode = STAVMEM_GetBlockAddress( BlockHandle, (void **)&(Bitmap_p->Data1_p));
  122.      if ( ErrCode != ST_NO_ERROR )
  123.      {
  124.          printf("STAVMEM_GetBlockAddress(0x%x,0x%x)=%sn",
  125. Bitmap_p->Data1_p, Bitmap_p->Data2_p, DBGError(ErrCode));
  126.          return NULL;
  127.      }
  128.      return Bitmap_p->Data1_p;
  129. }
  130. //在AVMEM 中为位图分配空间来存储其数据
  131. INT32 KB_OSDAllocBitmap(STGXOBJ_Bitmap_t *Bitmap_p, 
  132.                         STAVMEM_BlockHandle_t *BlockHandle_p, 
  133.                         U32 Width, 
  134.                         U32 Height )
  135. {
  136.      ST_ErrorCode_t              ErrCode = ST_NO_ERROR;
  137.      STAVMEM_AllocBlockParams_t  AllocParams;
  138.      STAVMEM_FreeBlockParams_t   FreeBlockParams;
  139.      if ( *BlockHandle_p != 0 )
  140.      {
  141.          printf("KB_OSDAllocBitmap *BlockHandle_p != 0 n");
  142.          FreeBlockParams.PartitionHandle = g_KBAvmemPartitionHandle[0];
  143.          (void) STAVMEM_FreeBlock(&FreeBlockParams, BlockHandle_p);
  144.      }
  145.      Bitmap_p->ColorType            = STGXOBJ_COLOR_TYPE_ARGB4444;
  146.      Bitmap_p->BitmapType           = STGXOBJ_BITMAP_TYPE_RASTER_PROGRESSIVE;
  147.      Bitmap_p->ColorSpaceConversion = STGXOBJ_ITU_R_BT601;
  148.      Bitmap_p->AspectRatio          = STGXOBJ_ASPECT_RATIO_4TO3;
  149.      Bitmap_p->Width                = Width;
  150.      Bitmap_p->Height               = Height;
  151.      Bitmap_p->PreMultipliedColor   = FALSE;
  152.      Bitmap_p->SubByteFormat        = STGXOBJ_SUBBYTE_FORMAT_RPIX_MSB;
  153.      Bitmap_p->BigNotLittle         = FALSE;
  154.      AllocParams.PartitionHandle          = g_KBAvmemPartitionHandle[0];
  155.      AllocParams.AllocMode                = STAVMEM_ALLOC_MODE_BOTTOM_TOP;
  156.      AllocParams.NumberOfForbiddenRanges  = 0;
  157.      AllocParams.ForbiddenRangeArray_p    = (STAVMEM_MemoryRange_t *) NULL;
  158.      AllocParams.NumberOfForbiddenBorders = 0;
  159.      AllocParams.ForbiddenBorderArray_p   = (void **) NULL;
  160.      AllocParams.Size      = Width * Height * KB_OSD_BYTES;
  161.      AllocParams.Alignment = KB_OSD_BYTES /* BitmapAllocParams1.AllocBlockParams.Alignment */;
  162.      Bitmap_p->Pitch   = Width * KB_OSD_BYTES;
  163.      Bitmap_p->Offset  = 0;
  164.      Bitmap_p->Data1_p = NULL;
  165.      Bitmap_p->Size1   = AllocParams.Size;
  166.      Bitmap_p->Data2_p = NULL;
  167.      Bitmap_p->Size2   = 0;
  168.      (void) STAVMEM_AllocBlock( &AllocParams, BlockHandle_p );
  169.      ErrCode = STAVMEM_GetBlockAddress( *BlockHandle_p, (void **)&(Bitmap_p->Data1_p));
  170.      if ( ErrCode != ST_NO_ERROR )
  171.      {
  172.          printf("STAVMEM_GetBlockAddress(0x%x,0x%x)=%sn",
  173. Bitmap_p->Data1_p, Bitmap_p->Data2_p, DBGError(ErrCode));
  174.          return RETFIAL1;
  175.      }
  176.      return RETOK;
  177. }
  178. //初始化osd 显示,先安装BLIT,再初始化文本显示,再分配osd 的数据存储区,并将其
  179. //与打开的视频端口联系起来,光标也设置在该层,只是另行 分配视频端口
  180. //经过该过程,以后要在osd 上显示的数据都应拷贝到Bitmap[VPORT_OSD]中,而光标数据
  181. //放在Bitmap[VPORT_OSD_CURSOR] 中
  182. /*=============================================================
  183.  函数名称 : KB_OSDInit(void)
  184.  功    能 : 初始化osd 显示
  185.  入    口 : 无
  186.  出    口 : 无
  187.  返    回 : RETOK ---成功,RETFIAL1 ---失败
  188.  描    述 :
  189. =============================================================*/
  190. INT32 KB_OSDInit(void)
  191. {
  192.      ST_ErrorCode_t nStErrCode;
  193.      STGXOBJ_Rectangle_t OutputRectangle;
  194.      INT32 nReturn;
  195.     
  196.      if (gnOsdInitFlag == TRUE)
  197.      {
  198.          return RETFIAL1;
  199.      }    
  200.      /*nStErrCode = BLIT_Setup();
  201.      if (nStErrCode != ST_NO_ERROR)
  202.      {
  203.          return RETFIAL1;
  204.      }*/
  205. #ifdef J_OSD_USE_GFX
  206.      nStErrCode = GFX_Setup();
  207.      if (nStErrCode != ST_NO_ERROR) 
  208.          return(RETFIAL1);
  209. #endif
  210.     //初始化文本显示
  211.      KB_TxtInit();
  212.     
  213.      nReturn = KB_OSDAllocBitmap(&Bitmap[VPORT_OSD], 
  214. &BitmapBlockHandle[VPORT_OSD], 
  215. KB_OSD_WIDTH, 
  216. KB_OSD_HEIGHT);
  217.      if ( nReturn != RETOK )
  218.      {
  219.          printf("KB_OSDAllocBitmap(%d) error!n", VPORT_OSD);
  220.         return(RETFIAL1);
  221.      }
  222.      Bitmap[VPORT_OSD].Width  = KB_OSD_WIDTH;
  223.      Bitmap[VPORT_OSD].Height = KB_OSD_HEIGHT;
  224.      OutputRectangle.PositionX = 0;
  225.      OutputRectangle.PositionY = 0;
  226.      OutputRectangle.Height    = KB_OSD_HEIGHT;
  227.      OutputRectangle.Width     = KB_OSD_WIDTH;
  228.      KB_LayerOpenViewPort((UINT8)LAYER_OSD, (UINT8)VPORT_OSD, &Bitmap[VPORT_OSD],&OutputRectangle);
  229. //clear screen
  230. KB_OSDFillRect(0,0,KB_OSD_WIDTH,KB_OSD_HEIGHT,KB_COLOR_TRANSPARENCY);
  231. memset(Bitmap[VPORT_OSD].Data1_p,0x00,Bitmap[VPORT_OSD].Size1*KB_OSD_BYTES);
  232.      gnOsdInitFlag = TRUE;
  233.      gnOsdTransparencyLevel = 100;
  234.      return RETOK;    
  235. }
  236. /* EOF */