📄 gfx_osi_surface.c
字号:
if(!gfx_osi_pSurface_alloc(pSurface)) { PDEBUG("pSurface is not initialized !"); return -1; } if(!pSurface->pPalette ) { PDEBUG("pSurface doesn't have palette !"); return 0; // we don't have palette } uMaxPal = 1<<pSurface->plane[0].uPixelSize; if(uStart >= uMaxPal || uNumEntry == 0) { PDEBUG("Palette index s(%d) n(%d) out of range!\n", uStart, uNumEntry); return 0; } if(uStart + uNumEntry > uMaxPal) uNumEntry = uMaxPal - uStart; PDEBUGE("Get palette %d to %d\n", uStart, uStart + uNumEntry-1); _OS_MEMCPY(pPal, pSurface->pPalette + uStart, uNumEntry*sizeof(GFX_PALETTE_T)); return 0;}static int __gfx_osi_adjust_surface_wh(UINT uPlaneConfig, UINT *puWidth, UINT *puHeight, UINT *puBytePerLine){ switch(uPlaneConfig) { case GFX_SURFACE_CLUT8BPP_ARGB: case GFX_SURFACE_CLUT8BPP_AYCBCR: case GFX_SURFACE_AYCBCR_422_8888: case GFX_SURFACE_YCBCR_422_888: case GFX_SURFACE_AYCBCR_420_8888: case GFX_SURFACE_YCBCR_420_888: *puWidth = (*puWidth + 3)&0xfffffffc; // 4 pixel justify *puHeight = (*puHeight + 1) & 0xfffffffe; // must be even lines *puBytePerLine = *puWidth; break; case GFX_SURFACE_CLUT8BPPP_ARGB: case GFX_SURFACE_CLUT8BPPP_AYCBCR: case GFX_SURFACE_CLUT4BPP_ARGB: case GFX_SURFACE_CLUT4BPP_AYCBCR: case GFX_SURFACE_CURSOR4BPP_RGB: case GFX_SURFACE_CURSOR4BPP_YCBCR: *puWidth = (*puWidth + 7)&0xfffffff8; // 8 pixel justify *puHeight = (*puHeight + 1) & 0xfffffffe; // must be even lines *puBytePerLine = *puWidth/2; break; case GFX_SURFACE_CLUT4BPPP_ARGB: case GFX_SURFACE_CLUT4BPPP_AYCBCR: case GFX_SURFACE_CLUT2BPP_ARGB: case GFX_SURFACE_CLUT2BPP_AYCBCR: case GFX_SURFACE_CURSOR4BPPP_RGB: case GFX_SURFACE_CURSOR4BPPP_YCBCR: case GFX_SURFACE_CURSOR2BPP_RGB: case GFX_SURFACE_CURSOR2BPP_YCBCR: *puWidth = (*puWidth + 15)&0xfffffff0; // 16 pixel justify *puHeight = (*puHeight + 1) & 0xfffffffe; // must be even lines *puBytePerLine = *puWidth/4; break; case GFX_SURFACE_CLUT2BPPP_ARGB: case GFX_SURFACE_CLUT2BPPP_AYCBCR: case GFX_SURFACE_CURSOR2BPPP_RGB: case GFX_SURFACE_CURSOR2BPPP_YCBCR: *puWidth = (*puWidth + 31)&0xffffffe0; // 32 pixel justify *puHeight = (*puHeight + 1) & 0xfffffffe; // must be even lines *puBytePerLine = *puWidth/8; break; case GFX_SURFACE_ARGB_8888: *puBytePerLine = *puWidth*4; break; case GFX_SURFACE_RAW8BPP : *puBytePerLine = *puWidth; break; case GFX_SURFACE_RAW1BPP : *puBytePerLine = (*puWidth + 7)/8; break; default: PDEBUG("Invalid plane config 0x%8.8x !\n", uPlaneConfig); return -1; } if(IS_SURFACE_CURSOR_COMP(uPlaneConfig) && *puBytePerLine > 32) // cursor must be less than 32bpl in stb03 and stbx2 return -1; return 0;}INT gfx_osi_create_surface(GFX_SURFACE_T *pSurface, GFX_VISUAL_DEVICE_ID_T graphDev, UINT uPlaneConfig, UINT uWidth, UINT uHeight){ UINT uNumBuf, i; UINT uHeaderSize; UINT uAllocSize, uNumPal, uBytePerLine; UINT cursor=0, twinheader=0; uNumBuf = GET_GFX_SURFACE_SUBPLANES(uPlaneConfig); // first, a rough check of the parameters if(!pSurface ) { PDEBUG("pSurface is NULL!"); return -1; } if(gfx_osi_pSurface_alloc(pSurface)) { PDEBUG("pSurface is already initialized !"); return -1; } if( uNumBuf < 1 // wrong plane config || uWidth < 4 || uHeight < 2 || uWidth > GFX_SURFACE_MAX_WIDTH || uHeight > GFX_SURFACE_MAX_HEIGHT) { PDEBUG("Invalid parameter: plane config = %08x, width=%d, height=%d !\n", uPlaneConfig, uWidth, uHeight); return -1; // we cann't do it } if(__gfx_osi_adjust_surface_wh(uPlaneConfig, &uWidth, &uHeight, &uBytePerLine) < 0) { PDEBUG("Invalid parameter: plane config = %08x, width=%d, height=%d !\n", uPlaneConfig, uWidth, uHeight); return -1; // we cann't do it } // then, we need to check if the planeconfig is compatible with the device switch(graphDev) { case GFX_VDEV_OSDCUR: if(!(uPlaneConfig & GFX_COMP_OSDCUR)) { PDEBUG("Desired planeConfig is incompatible with cursor device!\n"); return -1; } break; case GFX_VDEV_OSDGFX: if(!(uPlaneConfig & GFX_COMP_OSDGFX)) { PDEBUG("Desired planeConfig is incompatible with graphics device!\n"); return -1; } break; case GFX_VDEV_OSDIMG: if(!(uPlaneConfig & GFX_COMP_OSDIMG)) { PDEBUG("Desired planeConfig is incompatible with still device!\n"); return -1; } break; default: // GFX_VDEV_NULL break; } gfx_osi_init_surface_t(pSurface); // just make sure it's is empty //ok, we now try to alloc the surface switch(uPlaneConfig) { case GFX_SURFACE_CLUT8BPP_ARGB: case GFX_SURFACE_CLUT8BPP_AYCBCR: pSurface->plane[0].uAllocWidth = uWidth; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 8; // 8 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; // for palette entry pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = sizeof(STB_OSD_GI_CONTROL_BLOCK_T) + 256*sizeof(STB_OSD_GI_PALETTE_T); pSurface->pPalette = (GFX_PALETTE_T *)1; // we have palette break; case GFX_SURFACE_CLUT8BPPP_ARGB: case GFX_SURFACE_CLUT8BPPP_AYCBCR: pSurface->plane[0].uAllocWidth = uWidth/2; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 8; // 8 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; // for palette entry pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = sizeof(STB_OSD_GI_CONTROL_BLOCK_T) + 256*sizeof(STB_OSD_GI_PALETTE_T); pSurface->pPalette = (GFX_PALETTE_T *)1; // we have palette break; case GFX_SURFACE_CLUT4BPP_ARGB: case GFX_SURFACE_CLUT4BPP_AYCBCR: pSurface->plane[0].uAllocWidth = uWidth; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 4; // 4 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; // for palette entry pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = sizeof(STB_OSD_GI_CONTROL_BLOCK_T) + 16*sizeof(STB_OSD_GI_PALETTE_T); pSurface->pPalette = (GFX_PALETTE_T *)1; // we have palette break; case GFX_SURFACE_CLUT4BPPP_ARGB: case GFX_SURFACE_CLUT4BPPP_AYCBCR: pSurface->plane[0].uAllocWidth = uWidth/2; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 4; // 4 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; // for palette entry pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = sizeof(STB_OSD_GI_CONTROL_BLOCK_T) + 16*sizeof(STB_OSD_GI_PALETTE_T); pSurface->pPalette = (GFX_PALETTE_T *)1; // we have palette break; case GFX_SURFACE_CLUT2BPP_ARGB: case GFX_SURFACE_CLUT2BPP_AYCBCR: pSurface->plane[0].uAllocWidth = uWidth; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 2; // 4 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; // for palette entry pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = sizeof(STB_OSD_GI_CONTROL_BLOCK_T) + 4*sizeof(STB_OSD_GI_PALETTE_T); pSurface->pPalette = (GFX_PALETTE_T *)1; // we have palette break; case GFX_SURFACE_CLUT2BPPP_ARGB: case GFX_SURFACE_CLUT2BPPP_AYCBCR: pSurface->plane[0].uAllocWidth = uWidth/2; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 2; // 4 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; // for palette entry pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = sizeof(STB_OSD_GI_CONTROL_BLOCK_T) + 4*sizeof(STB_OSD_GI_PALETTE_T); pSurface->pPalette = (GFX_PALETTE_T *)1; // we have palette break; case GFX_SURFACE_CURSOR4BPP_RGB: case GFX_SURFACE_CURSOR4BPP_YCBCR: pSurface->plane[0].uAllocWidth = uWidth; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 4; // 4 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; // for palette entry pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = sizeof(STB_OSD_CURSOR_CONTROL_BLOCK_T) + 16*sizeof(STB_OSD_C_PALETTE_T); pSurface->pPalette = (GFX_PALETTE_T *)1; // we have palette cursor = 1; break; case GFX_SURFACE_CURSOR4BPPP_RGB: case GFX_SURFACE_CURSOR4BPPP_YCBCR: pSurface->plane[0].uAllocWidth = uWidth/2; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 4; // 4 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; // for palette entry pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = sizeof(STB_OSD_CURSOR_CONTROL_BLOCK_T) + 16*sizeof(STB_OSD_C_PALETTE_T); pSurface->pPalette = (GFX_PALETTE_T *)1; // we have palette cursor = 1; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -