用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"},
};
在实际使用中应该先判断图片颜色位数,在根据颜色位数设置透明色
转贴 http://hi.baidu.com/chenzhuoyou/blog/item/86042334c5f1133f5bb5f5f9.html