前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UGL之单色位图

UGL之单色位图

作者头像
Taishan3721
发布2020-10-19 09:39:04
6470
发布2020-10-19 09:39:04
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks

除了标准位图,WindML还提供一种单色位图(Monochrome Bitmap)。这种位图的图案仅包含一种颜色,而且由GC的前景色来指定。

代码语言:javascript
复制

typedef struct ugl_bmap_header
    {
    UGL_UINT16 type;
    UGL_UINT16 width;
    UGL_UINT16 height;
    UGL_UINT16 maxWidth;
    UGL_UINT16 maxHeight;
    void      *extension; 
    } UGL_BMAP_HEADER;
typedef UGL_BMAP_HEADER UGL_DDB;
typedef UGL_BMAP_HEADER UGL_MDDB;
typedef UGL_BMAP_HEADER UGL_TDDB;
typedef UGL_DDB  *UGL_DDB_ID;
typedef UGL_MDDB *UGL_MDDB_ID;
typedef UGL_TDDB *UGL_TDDB_ID;

/* Monochrome bitmaps */
typedef struct ugl_mdib
    {
    UGL_SIZE   width;
    UGL_SIZE   height;
    UGL_SIZE   stride;
    UGL_UINT8 *pImage;
    } UGL_MDIB;
UGL_MDDB_ID uglMonoBitmapCreate
    (
    UGL_DEVICE_ID          devId,
    UGL_MDIB              *mDib,
    UGL_DIB_CREATE_MODE    createMode,
    UGL_UINT32             initValue,
    UGL_DEVICE_MEM_POOL_ID poolId
    );
UGL_STATUS uglMonoBitmapDestroy
    (
    UGL_DEVICE_ID devId, 
    UGL_MDDB_ID   mDdbId
    );
UGL_STATUS uglMonoBitmapRead
    (
    UGL_GC_ID   gc, 
    UGL_MDDB_ID mDdbId,
    UGL_POS     srcLeft, 
    UGL_POS     srcTop,
    UGL_POS     srcRight, 
    UGL_POS     srcBottom, 
    UGL_MDIB   *pMdib, 
    UGL_POS     dstX, 
    UGL_POS     dstY
    );
UGL_STATUS uglMonoBitmapWrite
    (
    UGL_GC_ID   gc,
    UGL_MDIB   *pMdib, 
    UGL_POS     srcLeft, 
    UGL_POS     srcTop,
    UGL_POS     srcRight, 
    UGL_POS     srcBottom,
    UGL_MDDB_ID mDdbId,
    UGL_POS     dstX, 
    UGL_POS     dstY
    );
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 uglFillPatternSet
    (
    UGL_GC_ID   gc, 
    UGL_MDDB_ID patternBitmap
    );
UGL_STATUS uglFillPatternGet
    (
    UGL_GC_ID    gc, 
    UGL_MDDB_ID *patternBitmap
    );

要想使用它,也是需要先将DIB转换为DDB - 使用uglMonoBitmapCreate()。而绘制这个DDB,使用标准位图的uglBitmapBlt()/uglBitmapStretchBlt()即可。

不过单色位图更主要的使用场景是封闭图形的填充 - 使用uglFillPatternSet()将其设置为封闭图形的背景图案。

完整代码如下

代码语言:javascript
复制
/* Copyright 2020 VxWorks567 */
#include <ugl/ugl.h>

/* 位图尺寸 */
#define WIDTH 16
#define HIGHT 16

/* 位图数据 */
static UINT8 mdibData[WIDTH*HIGHT/8] =
    { 
    0xFF, 0xFF, 
    0x00, 0x01,
    0x00, 0x01,
    0x00, 0x01,
    0x00, 0x01,
    0x00, 0x01,
    0x00, 0x01,
    0x00, 0x01,
    0xFF, 0xFF, 
    0x01, 0x00,
    0x01, 0x00,
    0x01, 0x00,
    0x01, 0x00,
    0x01, 0x00,
    0x01, 0x00,
    0x01, 0x00
    };

void uglTest()
{
    UGL_REG_DATA *pRegData;
    UGL_GC_ID     gc;
    UGL_DEVICE_ID devId;
    UGL_MDIB      myMdib;
    UGL_MDDB_ID   myMddbId;

    /* 初始化WindML */
    uglDisplayOpen(NULL, NULL, NULL); 
    pRegData = uglRegistryFind(UGL_DISPLAY_TYPE, NULL, NULL, NULL);
    devId    = (UGL_DEVICE_ID)pRegData->id;
    gc       = uglGcCreate(devId);

    /* 初始化MDIB */
    myMdib.width  = WIDTH;
    myMdib.stride = WIDTH;
    myMdib.height = HIGHT;
    myMdib.pImage = mdibData;

    /* 将MDIB转换为单色DDB */
    myMddbId = uglMonoBitmapCreate(devId, &myMdib, UGL_DIB_INIT_DATA, 0, UGL_NULL);

    /* 设置位图颜色 */
    uglForegroundColorSet(gc, 0xff0000);
    uglBackgroundColorSet(gc, 0x00ff00);

/* 图形1 */
    /* 将单色DDB搬移到屏幕的(150,100) */
    uglBitmapBlt(gc, myMddbId, 0, 0, WIDTH-1, HIGHT-1, 
                 UGL_DISPLAY_ID, 150, 100);

/* 图形2 */
    /* 将单色DDB拉伸到屏幕的(200,100)(300,200) */
    uglBitmapStretchBlt(gc, myMddbId, 0, 0, WIDTH-1, HIGHT-1, 
                        UGL_DISPLAY_ID, 200, 100, 300, 200);

    /* 设置封闭图形的填充图案 */
    uglFillPatternSet(gc, myMddbId);

/* 图形3 */
    uglEllipse(gc, 400, 100, 500, 200, 0, 0, 0, 0);
/* 图形4 */
    uglRectangle(gc, 550, 100, 700, 200);

#if 0
    /* 退出图形 */
    uglMonoBitmapDestroy(devId, myMddbId);
    uglGcDestroy (gc);
    uglDisplayClose(NULL);
#endif
    return;
    }

执行效果如下

我是泰山 专注Vx 0x10年

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图数据库 KonisGraph
图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档