UGL之标准位图

2020-09-28 10:48:28 浏览数 (1)

位图操作是WindML 2D图形库里一个非常重要的功能。要想绘制位图,需要先了解两个名词

  • DIB - Device Independent Bitmap
  • DDB - Device Dependent Bitmap

顾名思义,DIB主要是给人用的,DDB主要是给显卡用的。与之相关的函数主要有这几个:

代码语言:javascript复制

typedef struct ugl_dib
    {
    UGL_SIZE          width;         /* width of bitmap image in pixels */
    UGL_SIZE          height;        /* height of bitmap image in pixels */
    UGL_SIZE          stride;        /* distance between adjacent scan lines */
    UGL_INT32         imageFormat;   /* format of the index in bitmap image */
    UGL_COLOR_FORMAT  colorFormat;   /* format of the image */
    UGL_SIZE          clutSize;      /* size of clut in number of elements */
    void             *pClut;         /* Pointer to CLUT */
    void             *pImage;        /* Pointer to image */
    UGL_UINT32        transColorKey; /* Reserved field */
    } UGL_DIB;
typedef struct ugl_bmap_header
    {
    UGL_UINT16 type;                /* type of bitmap */
    UGL_UINT16 width;               /* width of bitmap */
    UGL_UINT16 height;              /* height of bitmap */
    UGL_UINT16 maxWidth;            /* maximum width of bitmap */
    UGL_UINT16 maxHeight;           /* maximum height of bitmap */
    void      *extension;           /* device specific extensions */
    } UGL_BMAP_HEADER;
typedef UGL_BMAP_HEADER *UGL_BITMAP_ID;  
typedef UGL_BMAP_HEADER  UGL_DDB;
typedef UGL_DDB         *UGL_DDB_ID;

UGL_DDB_ID uglBitmapCreate 
    (
    UGL_DEVICE_ID          devId,
    UGL_DIB               *pDib,
    UGL_DIB_CREATE_MODE    createMode,
    UGL_UINT32             initValue,
    UGL_DEVICE_MEM_POOL_ID poolId
    );
UGL_STATUS uglBitmapDestroy 
    (
    UGL_DEVICE_ID devId,
    UGL_DDB_ID    ddbId
    );
UGL_STATUS uglBitmapBlt
    (
    UGL_GC_ID     gc,
    UGL_BITMAP_ID srcBitmapId,
    UGL_POS       srcLeft,
    UGL_POS       srcTop,
    UGL_POS       srcRight,
    UGL_POS       srcBottom,
    UGL_DDB_ID    dstBitmapId,
    UGL_POS       dstX,
    UGL_POS       dstY
    );
UGL_STATUS uglBitmapStretchBlt 
    (
    UGL_GC_ID     gc,
    UGL_BITMAP_ID srcBitmapId,
    UGL_POS       srcLeft,
    UGL_POS       srcTop,
    UGL_POS       srcRight,
    UGL_POS       srcBottom,
    UGL_DDB_ID    dstBitmapId,
    UGL_POS       dstLeft,
    UGL_POS       dstTop,
    UGL_POS       dstRight,
    UGL_POS       dstBottom
    );
UGL_STATUS uglBitmapWrite
    (
    UGL_DEVICE_ID devId,
    UGL_DIB      *pDib,
    UGL_POS       srcLeft,
    UGL_POS       srcTop,
    UGL_POS       srcRight,
    UGL_POS       srcBottom,
    UGL_DDB_ID    ddbId,
    UGL_POS       dstX,
    UGL_POS       dstY
    );
UGL_STATUS uglBitmapRead 
    (
    UGL_DEVICE_ID devId,
    UGL_DDB_ID    ddbId,
    UGL_POS       srcLeft,
    UGL_POS       srcTop,
    UGL_POS       srcRight,
    UGL_POS       srcBottom,
    UGL_DIB      *pDib,
    UGL_POS       dstX,
    UGL_POS       dstY
    );
UGL_STATUS uglBitmapInfoGet
    (
    UGL_DEVICE_ID    devId,
    UGL_DDB_ID       bitmapId,
    UGL_BITMAP_INFO *pBitmapInfo
    );
UGL_STATUS uglBitmapSizeGet
    (
    UGL_DDB_ID ddbId,
    UGL_SIZE  *pWidth,
    UGL_SIZE  *pHeight
    );
UGL_STATUS uglBitmapResize
    (
    UGL_DEVICE_ID devId,
    UGL_DDB_ID    bitmapId,
    int           width,
    int           height
    );

首先,需要先创建一个DIB对象。而将这个DIB绘制到屏幕,大致有两种方案:uglBitmapWrite()和uglBitmapBlt()。

uglBitmapWrite()的作用是将DIB直接搬移到一个DDB设备,当这个设备就是Display时,那就是绘制到屏幕了。第二种方案是,先用uglBitmapCreate()将DIB转换为DDB,然后使用uglBitmapBlt()将这个DDB位图搬移到DDB设备;如果需要拉伸,可以使用uglBitmapStretchBlt()。uglBitmapCreate()的另一个优势是,通过第三个参数UGL_DIB_CREATE_MODE createMode,可以轻松创建纯色的位图。

0 人点赞