⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gfxlib.c

📁 IBM source for pallas/vulcan/vesta
💻 C
📖 第 1 页 / 共 2 页
字号:
//vulcan/drv/gfx/test/gfxlib.c/*----------------------------------------------------------------------------+||       This source code has been made available to you by IBM on an AS-IS|       basis.  Anyone receiving this source is licensed under IBM|       copyrights to use it in any way he or she deems fit, including|       copying it, modifying it, compiling it, and redistributing it either|       with or without modifications.  No license under IBM patents or|       patent applications is to be implied by the copyright license.||       Any user of this software should understand that IBM cannot provide|       technical support for this software and will not be responsible for|       any consequences resulting from the use of this software.||       Any person who transfers this source code or any derivative work|       must include the IBM copyright notice, this paragraph, and the|       preceding two paragraphs in the transferred software.||       COPYRIGHT   I B M   CORPORATION 1998|       LICENSED MATERIAL  -  PROGRAM PROPERTY OF I B M+----------------------------------------------------------------------------*/////Comment: //  Linux device driver interface of GFX controls //Revision Log:   //  Nov/07/2001                                   Created by YYD//  Jun/27/2002                 Adopted for Vulcan driver by YYD#include <sys/ioctl.h>#include "gfxlib.h"int gfx_open(void){    return open(GFX_DEV_NAME, O_RDWR);}int gfx_close(int fdGfxDev){    return close(fdGfxDev);}INT gfx_ClipBLTRect(UINT uSrcWidth, UINT uSrcHeight,                                 UINT uDesWidth, UINT uDesHeight,                                 UINT uSrcX,     UINT uSrcY,                                UINT uDesX,     UINT uDesY,                                UINT *uWidth,   UINT *uHeight                                ){    if(   !*uWidth || !*uHeight       || uSrcX >= uSrcWidth || uSrcY >= uSrcHeight       || uDesX >= uDesWidth || uDesY >= uDesWidth )    {        return -1;  // empty clip    }    if(uSrcX + *uWidth > uSrcWidth)    {        *uWidth = uSrcWidth - uSrcX;    }    if(uDesX + *uWidth > uDesWidth)    {        *uWidth = uDesWidth - uDesX;    }    if(uSrcY + *uHeight > uSrcHeight)    {        *uHeight = uSrcHeight - uSrcY;    }    if(uDesY + *uHeight > uDesHeight)    {        *uHeight = uDesHeight - uDesY;    }    return  (*uHeight)&&(*uWidth) ? 0 : -1;}INT gfx_ClipRect(UINT uDesWidth, UINT uDesHeight,                                 UINT uDesX,     UINT uDesY,                                UINT *uWidth,   UINT *uHeight                                ){    if(   !*uWidth || !*uHeight       || uDesX >= uDesWidth || uDesY >= uDesWidth )    {        return -1;  // empty clip    }    if(uDesX + *uWidth > uDesWidth)    {        *uWidth = uDesWidth - uDesX;    }    if(uDesY + *uHeight > uDesHeight)    {        *uHeight = uDesHeight - uDesY;    }    return  (*uHeight)&&(*uWidth) ? 0 : -1;}void gfx_pixelJustify(UINT uJustify, UINT *uX, UINT *uWidth){    if(uJustify < 2) return;    if(*uX % uJustify)        *uX += uJustify - *uX % uJustify;        if(*uWidth % uJustify)        *uWidth += uJustify - *uWidth % uJustify;}unsigned int gfx_plane_pixel_color(unsigned int uPlaneConfig, unsigned char a, unsigned char r, unsigned char g, unsigned char b){    switch(GET_GFX_SURFACE_DATA_TYPE(uPlaneConfig))    {        case G2D_CLUT1     :#ifdef G2D_CLUT4        case G2D_CLUT4     :#endif        case G2D_CLUT8     :            return r;#ifdef G2D_ARGB_1555        case G2D_ARGB_1555 :             return GFX_ARGB1555_COLOR(a,r,g,b);#endif#ifdef G2D_ARGB_4444        case G2D_ARGB_4444 :             return GFX_ARGB4444_COLOR(a,r,g,b);#endif#ifdef G2D_RGB_565        case G2D_RGB_565   :            return GFX_RGB565_COLOR(a,r,g,b);#endif        case G2D_ARGB_8888 :#ifdef G2D_YCBCR        case G2D_YCBCR     : /* 4:2:2, requires 2 buffers */         case G2D_AYCBCR    : /* 4:2:2, requires 3 buffers */#elif defined(G2D_YCBCR422)         case G2D_YCBCR422     : /* 4:2:2, requires 2 buffers */         case G2D_AYCBCR422    : /* 4:2:2, requires 3 buffers */        case G2D_YCBCR420     : /* 4:2:2, requires 2 buffers */         case G2D_AYCBCR420    : /* 4:2:2, requires 3 buffers */#endif            return GFX_ARGB8888_COLOR(a,r,g,b);        default:            return GFX_ARGB8888_COLOR(a,r,g,b);    }}void gfx_rgb2ycbcr(BYTE r, BYTE g,  BYTE b,  BYTE *y, BYTE *cb, BYTE *cr){    // Y  =  0.257*R + 0.504*G + 0.098*B + 16    // CB = -0.148*R - 0.291*G + 0.439*B + 128    // CR =  0.439*R - 0.368*G - 0.071*B + 128    *y  = (BYTE)((8432*(ULONG)r + 16425*(ULONG)g + 3176*(ULONG)b + 16*32768)>>15);    *cb = (BYTE)((128*32768 + 14345*(ULONG)b - 4818*(ULONG)r -9527*(ULONG)g)>>15);    *cr = (BYTE)((128*32768 + 14345*(ULONG)r - 12045*(ULONG)g-2300*(ULONG)b)>>15);}void gfx_ycbcr2rgb(BYTE y, BYTE cb,  BYTE cr,  BYTE *r, BYTE *g, BYTE *b){    // R = 1.164*(Y - 16) + 1.596*(CR - 128)    // G = 1.164*(Y - 16) - 0.813*(CR - 128) - 0.391*(CB - 128)    // B = 1.164*(Y - 16)                    + 2.018*(CB - 128)    // R = 1.164*Y + 1.596*CR - 222.4[1.164*16 + 1.592*128]    // G = 1.164*Y + 135.488[0.813*128 + 0.391*128 - 1.164*16] - 0.813*CR - 0.391*CB    // B = 1.164*Y + 2.018*CB - 276.928[1.164*16 + 2.018*128]    int rr, gg, bb, my;    my = 38142*(int)y;    rr = (my + 52298*(int)cr - 7287603)>>15;    if(rr > 255) *r = 255;    else if(rr < 0) *r = 0;    else *r = (BYTE)rr;    gg = (my + 4439671 - 26640*cr - 12812*cb)>> 15;    if(gg > 255) *g = 255;    else if(gg < 0) *g = 0;    else *g = (BYTE)gg;        bb = (my + 66126*cb - 9074377)>>15;    if(bb > 255) *b = 255;    else if(bb < 0) *b = 0;    else *b = (BYTE)bb;}int gfx_create_surface(int fdGfxDev,     UINT uWidth,        // width of buffer    UINT uHeight,       // height of buffer    UINT uPlaneConfig,  // plane config    GFX_VISUAL_DEVICE_ID_T graphDev,    // which device to be used    UINT32  uFillColor     // which color to fill   ){    GFX_CREATE_SURFACE_PARM_T parm;    parm.graphDev = graphDev;    parm.uFillColor = uFillColor;    parm.uWidth = uWidth;    parm.uHeight =  uHeight;    parm.uPlaneConfig = uPlaneConfig;    if(ioctl(fdGfxDev, IOC_GFX_CREATE_SURFACE, &parm) >= 0)    {        return parm.hSurface;    }    return -1;}int gfx_destroy_surface(int fdGfxDev, int hSurface){    return ioctl(fdGfxDev, IOC_GFX_DESTROY_SURFACE, hSurface);}int gfx_get_subplane_pseudo_surface(int fdGfxDev, int hSourceSurface, unsigned int uPlaneID, unsigned int uPlaneConfig, unsigned int uExpectWidth){    GFX_GET_SUBPLANE_PSEUDO_SURFACE_PARM_T parm;    parm.hSourceSurface = hSourceSurface;    parm.uPlaneConfig = uPlaneConfig;    parm.uPlaneID = uPlaneID;    parm.uExpectWidth = uExpectWidth;    if(ioctl(fdGfxDev, IOC_GFX_GET_SUBPLANE_PSEUDO_SURFACE, &parm) >= 0)        return parm.hSurface;    return -1;}int gfx_get_surface_info(int fdGfxDev, int hSurface, GFX_SURFACE_INFO_T *pParm){    if(!pParm) return -1;        memset(pParm, 0, sizeof(GFX_SURFACE_INFO_T));    pParm->hSurface = hSurface;    return ioctl(fdGfxDev, IOC_GFX_GET_SURFACE_INFO, pParm);}int gfx_lock_surface(int fdGfxDev, int hSurface, GFX_SURFACE_LOCK_INFO_T *pParm){    GFX_SURFACE_INFO_T parm;    int rtn, i;        memset(&parm, 0, sizeof(parm));    parm.hSurface = hSurface;    rtn = ioctl(fdGfxDev, IOC_GFX_LOCK_SURFACE, &parm);    if( rtn < 0)    {        return rtn;    }    memset(pParm, 0, sizeof(*pParm));    for(i=0; i<GET_GFX_SURFACE_SUBPLANES(parm.uPlaneConfig); i++)    {        pParm->plane[i].pPlane = mmap(0, parm.plane[i].plane.uSize,             PROT_WRITE|PROT_READ, MAP_SHARED,  fdGfxDev, parm.plane[i].plane.uBase);        if(MAP_FAILED == pParm->plane[i].pPlane)            break;    }    if(i<GET_GFX_SURFACE_SUBPLANES(parm.uPlaneConfig))  // failed    {        for(i--;i>=0; i--)        {            munmap(pParm->plane[i].pPlane, parm.plane[i].plane.uSize);        }        ioctl(fdGfxDev, IOC_GFX_UNLOCK_SURFACE, hSurface);        return -1;    }    pParm->uPlaneConfig = parm.uPlaneConfig;    for(i=0; i<GET_GFX_SURFACE_SUBPLANES(parm.uPlaneConfig); i++)    {        // printf("mapped from 0x%08x to 0x%08x\n", parm.plane[i].plane.uBase, (UINT)pParm->plane[i].pPlane);        pParm->plane[i].pPlane += parm.plane[i].plane.uOffset;        pParm->plane[i].plane = parm.plane[i].plane;        pParm->plane[i].uWidth = parm.plane[i].uWidth;        pParm->plane[i].uHeight = parm.plane[i].uHeight;        pParm->plane[i].uPixelSize = parm.plane[i].uPixelSize;        pParm->plane[i].uPixelJustify = parm.plane[i].uPixelJustify;        pParm->plane[i].uBytePerLine = parm.plane[i].uBytePerLine;        pParm->plane[i].a = parm.plane[i].a;        pParm->plane[i].r = parm.plane[i].r;        pParm->plane[i].g = parm.plane[i].g;        pParm->plane[i].b = parm.plane[i].b;    }    return 0;}int gfx_unlock_surface(int fdGfxDev, int hSurface, GFX_SURFACE_LOCK_INFO_T *pParm){    int rtn, i;        for(i=0; i<GET_GFX_SURFACE_SUBPLANES(pParm->uPlaneConfig); i++)    {        munmap(pParm->plane[i].pPlane - pParm->plane[i].plane.uOffset,             pParm->plane[i].plane.uSize);    }    rtn = ioctl(fdGfxDev, IOC_GFX_UNLOCK_SURFACE, hSurface);    if(!rtn)        memset(pParm, 0, sizeof(*pParm));    return rtn;}int gfx_attach_surface(int fdGfxDev, int hSurface, GFX_VISUAL_DEVICE_ID_T graphDev){    GFX_SURFACE_VDEV_PARM_T parm;    parm.graphDev = graphDev;    parm.hSurface = hSurface;    return ioctl(fdGfxDev, IOC_GFX_ATTACH_SURFACE, &parm);}int gfx_detach_surface(int fdGfxDev, int hSurface, GFX_VISUAL_DEVICE_ID_T graphDev){    GFX_SURFACE_VDEV_PARM_T parm;    parm.graphDev = graphDev;    parm.hSurface = hSurface;    return ioctl(fdGfxDev, IOC_GFX_DETACH_SURFACE, &parm);}int gfx_get_surface_palette(int fdGfxDev, int hSurface, UINT uStart, UINT uCount, GFX_PALETTE_T *pPalette){    GFX_SURFACE_ACCESS_PALETTE_PARM_T parm;    parm.hSurface = hSurface;    parm.pPalette = pPalette;    parm.uStart = uStart;    parm.uCount = uCount;    return ioctl(fdGfxDev, IOC_GFX_GET_SURFACE_PALETTE, &parm);}int gfx_set_surface_palette(int fdGfxDev, int hSurface, UINT uStart, UINT uCount, GFX_PALETTE_T *pPalette){    GFX_SURFACE_ACCESS_PALETTE_PARM_T parm;    parm.hSurface = hSurface;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -