chenzhuoyou

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

[原创]为MicroWindows添加透明绘图函数

用GrLoadImageFromFile()函数时,microwindows将图片解码放进一个图片头结构中,在Mwtypes.h文件中定义如下

typedef struct {
     int   width;   /* image width in pixels*/
     int   height;   /* image height in pixels*/
     int   planes;   /* # image planes*/
     int   bpp;   /* bits per pixel (1, 4 or 8)*/
     int   pitch;   /* bytes per line*/
     int   bytesperpixel; /* bytes per pixel*/
     int   compression; /* compression algorithm*/
     int   palsize; /* palette size*/
     long   transcolor; /* transparent color or -1 if none*/
     MWPALENTRY 
* palette; /* palette*/
     MWUCHAR 
* imagebits; /* image bits (dword right aligned)*/
} MWIMAGEHDR, 
*PMWIMAGEHDR;

其中transcolor就是图片的透明色。

由于nano-X是C/S结构,绘图函数实现都在服务器端,因此为了添加新的函数,我们必须在客户端和服务器端都添加函数。

//修改客户端API
//*****nano-X.h*****
void GrSetImageTransColor(GR_IMAGE_ID id, long color);

//*****nanox/Client.c*****
#if MW_FEATURE_IMAGES
/**
* Set transcolor of a image.
*
* @param id ID of the image buffer to free
*
* @ingroup nanox_image
*/
void
GrSetImageTransColor(GR_IMAGE_ID id, 
long color)
{
     nxSetImageTransColorReq 
*req;
     LOCK(
&nxGlobalLock);
     req 
= AllocReq(SetImageTransColor);
     req
->id = id;
     req
->color = color;
     UNLOCK(
&nxGlobalLock);
}
#endif /* MW_FEATURE_IMAGES */


//修改绘图引擎层
//*****include/Device.h*****
int GdSetImageTransColor(int id, long color);

//*****engine/Devimage.c*****
/**
* Set the transcolor of image.
*
* @param id Image to query.
* @param color for the transcolor.
* @return TRUE on success, FALSE on error.
*/
MWBOOL
GdSetImageTransColor(
int id, long color)
{
     PMWIMAGEHDR pimage;
     PIMAGEITEM pItem;
     int   i;
     pItem 
= findimage(id);
     if (!pItem) {
        
return FALSE;
     }
     pimage 
= pItem->pimage;
     pimage
->transcolor = color;
     return TRUE;
}


//添加C/S通信协议
//*****nanox/Nxproto.h******
#define GrNumSetImageTransColor             125
typedef 
struct {
     BYTE8 reqType;
     BYTE8 hilength;
     UINT16 length;
     IDTYPE id;
     UINT32 color;
} nxSetImageTransColorReq;

#define GrTotalNumCalls         126


//添加服务器端函数
//*****nanox/Srvfunc.c*****
/* set the transcolor of image */
void
GrSetImageTransColor(GR_IMAGE_ID id, 
long color)
{
     SERVER_LOCK();
     GdSetImageTransColor(id, color);
     SERVER_UNLOCK();
}


//*****nanox/Srvnet.c*****
static void
GrSetImageTransColorWrapper(
void *r)
{
     nxSetImageTransColorReq 
*req = r;
     GrSetImageTransColor(req
->id, req->color);
}

/*
* Handler functions, ordered by reqType
*/
struct GrFunction {
     void   (*func)(void *);
     GR_FUNC_NAME name;
} GrFunctions[] 
= {
     /*   0 */ {GrOpenWrapper, "GrOpen"},
     ……
     …… 
     ……
     ……
     ……
     ……
     /* 125 */ {GrSetImageTransColorWrapper, "GrSetImageTransColor"},
};

在实际使用中应该先判断图片颜色位数,在根据颜色位数设置透明色

posted on 2008-08-29 22:56  Chen Zhuoyou  阅读(319)  评论(0)    收藏  举报