📄 client.c
字号:
*
* Create a new window with the specified parent and window attributes.
*/
GR_WINDOW_ID
GrNewWindow(GR_WINDOW_ID parent, GR_COORD x, GR_COORD y, GR_SIZE width,
GR_SIZE height, GR_SIZE bordersize, GR_COLOR background,
GR_COLOR bordercolor)
{
nxNewWindowReq *req;
GR_WINDOW_ID wid;
req = AllocReq(NewWindow);
req->parentid = parent;
req->x = x;
req->y = y;
req->width = width;
req->height = height;
req->backgroundcolor = background;
req->bordercolor = bordercolor;
req->bordersize = bordersize;
if(GrTypedReadBlock(&wid, sizeof(wid),GrNumNewWindow) == -1)
return 0;
return wid;
}
/**
* GrNewPixmap:
* @width: the width of the pixmap
* @height: the height of the pixmap
* @addr: currently unused in client/server mode
* @Returns: the ID of the newly created pixmap
*
* Create a new server side pixmap (an offscreen drawing area which can be
* copied into a window using a GrCopyArea call) of the specified width and
* height.
*/
/* FIXME: Add support for shared memory... */
GR_WINDOW_ID
GrNewPixmap(GR_SIZE width, GR_SIZE height, void *addr)
{
nxNewPixmapReq *req;
GR_WINDOW_ID wid;
req = AllocReq(NewPixmap);
req->width = width;
req->height = height;
if(GrTypedReadBlock(&wid, sizeof(wid), GrNumNewPixmap) == -1)
return 0;
return wid;
}
/**
* GrNewInputWindow:
* @parent: the ID of the window to use as the parent of the new window
* @x: the X coordinate of the new window relative to the parent window
* @y: the Y coordinate of the new window relative to the parent window
* @width: the width of the new window
* @height: the height of the new window
* @Returns: the ID of the newly created window
*
* Create a new input-only window with the specified dimensions which is a
* child of the specified parent window.
*/
GR_WINDOW_ID
GrNewInputWindow(GR_WINDOW_ID parent, GR_COORD x, GR_COORD y, GR_SIZE width,
GR_SIZE height)
{
nxNewInputWindowReq *req;
GR_WINDOW_ID wid;
req = AllocReq(NewInputWindow);
req->parentid = parent;
req->x = x;
req->y = y;
req->width = width;
req->height = height;
if(GrTypedReadBlock(&wid, sizeof(wid), GrNumNewInputWindow) == -1)
return 0;
return wid;
}
/**
* GrDestroyWindow:
* @wid: the ID of the window to destroy
*
* Recursively unmaps and frees the data structures associated with the
* specified window and all of its children.
*/
void
GrDestroyWindow(GR_WINDOW_ID wid)
{
nxDestroyWindowReq *req;
req = AllocReq(DestroyWindow);
req->windowid = wid;
}
/**
* GrGetWindowInfo:
* @wid: the ID of the window to retrieve information about
* @infoptr: pointer to a GR_WINDOW_INFO structure to return the information in
*
* Fills in a GR_WINDOW_INFO structure with information regarding the window
* with the specified window ID.
*/
void
GrGetWindowInfo(GR_WINDOW_ID wid, GR_WINDOW_INFO *infoptr)
{
nxGetWindowInfoReq *req;
req = AllocReq(GetWindowInfo);
req->windowid = wid;
GrTypedReadBlock(infoptr, sizeof(GR_WINDOW_INFO), GrNumGetWindowInfo);
}
/**
* GrNewGC:
* @Returns: the ID of the newly created graphics context or 0 on error
*
* Creates a new graphics context structure and returns the ID used to refer
* to it. The structure is initialised with a set of default parameters.
*/
GR_GC_ID
GrNewGC(void)
{
GR_GC_ID gc;
AllocReq(NewGC);
if(GrTypedReadBlock(&gc, sizeof(gc),GrNumNewGC) == -1)
return 0;
return gc;
}
/**
* GrCopyGC:
* @gc: the already existing graphics context to copy the parameters from
* @Returns: the ID of the newly created graphics context or 0 on error
*
* Creates a new graphics context structure and fills it in with the values
* from the specified already existing graphics context.
*/
GR_GC_ID
GrCopyGC(GR_GC_ID gc)
{
nxCopyGCReq *req;
GR_GC_ID newgc;
req = AllocReq(CopyGC);
req->gcid = gc;
if(GrTypedReadBlock(&newgc, sizeof(newgc),GrNumCopyGC) == -1)
return 0;
return newgc;
}
/**
* GrDestroyGC:
* @gc: the ID of the graphics context structure to destroy
*
* Destroys the graphics context structure with the specified ID.
*/
void
GrDestroyGC(GR_GC_ID gc)
{
nxDestroyGCReq *req;
req = AllocReq(DestroyGC);
req->gcid = gc;
}
/**
* GrNewRegion:
* @Returns: the ID of the newly created region
*
* Creates a new region structure and returns the ID used to refer to it.
* The structure is initialised with a set of default parameters.
*/
GR_REGION_ID
GrNewRegion(void)
{
GR_REGION_ID region;
AllocReq(NewRegion);
if(GrTypedReadBlock(®ion, sizeof(region),GrNumNewRegion) == -1)
return 0;
return region;
}
/**
* GrDestroyRegion:
* @region: the ID of the region structure to destroy
*
* Destroys the region structure with the specified ID.
*/
void
GrDestroyRegion(GR_REGION_ID region)
{
nxDestroyRegionReq *req;
req = AllocReq(DestroyRegion);
req->regionid = region;
}
/**
* GrUnionRectWithRegion:
* @region: the ID of the region to modify
* @rect: a pointer to the rectangle to add to the region
*
* Makes a union of the specified region and the specified rectangle and
* places the result back in the source region.
*/
void
GrUnionRectWithRegion(GR_REGION_ID region, GR_RECT *rect)
{
nxUnionRectWithRegionReq *req;
req = AllocReq(UnionRectWithRegion);
if(rect)
memcpy(&req->rect, rect, sizeof(*rect));
req->regionid = region;
}
/**
* GrUnionRegion:
* @dst_rgn: the ID of the destination region
* @src_rgn1: the ID of the first source region
* @src_rgn2: the ID of the second source region
*
* Makes a union of the specified source regions and places the result in the
* specified destination region.
*/
void
GrUnionRegion(GR_REGION_ID dst_rgn, GR_REGION_ID src_rgn1,
GR_REGION_ID src_rgn2)
{
nxUnionRegionReq *req;
req = AllocReq(UnionRegion);
req->regionid = dst_rgn;
req->srcregionid1 = src_rgn1;
req->srcregionid2 = src_rgn2;
}
/**
* GrSubtractRegion:
* @dst_rgn: the ID of the destination region
* @src_rgn1: the ID of the first source region
* @src_rgn2: the ID of the second source region
*
* Subtracts the second source region from the first source region and places
* the result in the specified destination region.
*/
void
GrSubtractRegion(GR_REGION_ID dst_rgn, GR_REGION_ID src_rgn1,
GR_REGION_ID src_rgn2)
{
nxSubtractRegionReq *req;
req = AllocReq(SubtractRegion);
req->regionid = dst_rgn;
req->srcregionid1 = src_rgn1;
req->srcregionid2 = src_rgn2;
}
/**
* GrXorRegion:
* @dst_rgn: the ID of the destination region
* @src_rgn1: the ID of the first source region
* @src_rgn2: the ID of the second source region
*
* Performs a logical exclusive OR operation on the specified source regions
* and places the result in the destination region. The destination region
* will contain only the parts of the source regions which do not overlap.
*/
void
GrXorRegion(GR_REGION_ID dst_rgn, GR_REGION_ID src_rgn1,
GR_REGION_ID src_rgn2)
{
nxXorRegionReq *req;
req = AllocReq(XorRegion);
req->regionid = dst_rgn;
req->srcregionid1 = src_rgn1;
req->srcregionid2 = src_rgn2;
}
/**
* GrIntersectRegion:
* @dst_rgn: the ID of the destination region
* @src_rgn1: the ID of the first source region
* @src_rgn2: the ID of the second source region
*
* Calculates the intersection of the two specified source regions and places
* the result in the specified destination region. The destination region
* will contain only the parts of the source regions which overlap each other.
*/
void
GrIntersectRegion(GR_REGION_ID dst_rgn, GR_REGION_ID src_rgn1,
GR_REGION_ID src_rgn2)
{
nxIntersectRegionReq *req;
req = AllocReq(IntersectRegion);
req->regionid = dst_rgn;
req->srcregionid1 = src_rgn1;
req->srcregionid2 = src_rgn2;
}
/**
* GrSetGCRegion:
* @gc: the ID of the graphics context to set the clip mask of
* @region: the ID of the region to use as the clip mask
*
* Sets the clip mask of the specified graphics context to the specified
* region. Subsequent drawing operations using this graphics context will not
* draw outside the specified region. The region ID can be set to 0 to remove
* the clipping region from the specified graphics context.
*/
void
GrSetGCRegion(GR_GC_ID gc, GR_REGION_ID region)
{
nxSetGCRegionReq *req;
req = AllocReq(SetGCRegion);
req->gcid = gc;
req->regionid = region;
}
/**
* GrSetGCClipOrigin:
* @gc: the ID of the graphics context with user clip region
* @xoff: new X offset of user clip region
* @xoff: new Y offset of user clip region
*
* Sets the X,Y origin of the user clip region in the specified
* graphics context.
*/
void
GrSetGCClipOrigin(GR_GC_ID gc, int x, int y)
{
nxSetGCClipOriginReq *req;
req = AllocReq(SetGCClipOrigin);
req->gcid = gc;
req->xoff = x;
req->yoff = y;
}
/**
* GrPointInRegion:
* @region: the ID of the region to examine
* @x: the X coordinate of the point to test for
* @y: the Y coordinate of the point to test for
* @Returns: True if the point is within the region, or False otherwise
*
* Tests whether the specified point is within the specified region, and
* then returns either True or False depending on the result.
*/
GR_BOOL
GrPointInRegion(GR_REGION_ID region, GR_COORD x, GR_COORD y)
{
nxPointInRegionReq *req;
GR_BOOL ret_value;
req = AllocReq(PointInRegion);
req->regionid = region;
req->x = x;
req->y = y;
if(GrTypedReadBlock(&ret_value, sizeof(ret_value),
GrNumPointInRegion) == -1)
return GR_FALSE;
return ret_value;
}
/**
* GrRectInRegion:
* @region: the ID of the region to examine
* @x: the X coordinates of the rectangle to test
* @y: the Y coordinates of the rectangle to test
* @w: the width of the rectangle to test
* @h: the height of the rectangle to test
* @Returns: GR_RECT_PARTIN, GR_RECT_ALLIN, or GR_RECT_OUT
*
* Tests whether the specified rectangle is contained within the specified
* region. Returns GR_RECT_OUT if it is not inside it at all, GR_RECT_ALLIN
* if it is completely contained within the region, or GR_RECT_PARTIN if
* it is partially contained within the region.
*/
int
GrRectInRegion(GR_REGION_ID region, GR_COORD x, GR_COORD y, GR_COORD w,
GR_COORD h)
{
nxRectInRegionReq *req;
unsigned short ret_value;
req = AllocReq(RectInRegion);
req->regionid = region;
req->x = x;
req->y = y;
req->w = w;
req->h = h;
if(GrTypedReadBlock(&ret_value, sizeof(ret_value),
GrNumRectInRegion) == -1)
return 0;
return (int)ret_value;
}
/**
* GrEmptyRegion:
* @region: the ID of the region to examine
* @Returns: GR_TRUE if the region is empty, or GR_FALSE if it is not
*
* Determines whether the specified region is empty, and returns GR_TRUE
* if it is, or GR_FALSE otherwise.
*/
GR_BOOL
GrEmptyRegion(GR_REGION_ID region)
{
nxEmptyRegionReq *req;
GR_BOOL ret_value;
req = AllocReq(EmptyRegion);
req->regionid = region;
if(GrTypedReadBlock(&ret_value, sizeof(ret_value),
GrNumEmptyRegion) == -1)
return GR_FALSE;
return ret_value;
}
/**
* GrEqualRegion:
* @rgn1: the ID of the first region to examine
* @rgn2: the ID of the second region to examine
* @Returns: GR_TRUE if the regions are equal, or GR_FALSE otherwise
*
* Determines whether the specified regions are identical, and returns GR_TRUE
* if it is, or GR_FALSE otherwise.
*/
GR_BOOL
GrEqualRegion(GR_REGION_ID rgn1, GR_REGION_ID rgn2)
{
nxEqualRegionReq *req;
GR_BOOL ret_value;
req = AllocReq(EqualRegion);
req->region1 = rgn1;
req->region2 = rgn2;
if(GrTypedReadBlock(&ret_value, sizeof(ret_value),
GrNumEqualRegion) == -1)
return GR_FALSE;
return ret_value;
}
/**
* GrOffsetRegion:
* @region: the ID of the region to offset
* @dx: the distance to offset the region by in the X axis
* @dy: the distance to offset the region by in the Y axis
*
* Offsets the specified region by the specified distance.
*/
void
GrOffsetRegion(GR_REGION_ID region, GR_SIZE dx, GR_SIZE dy)
{
nxOffsetRegionReq *req;
req = AllocReq(OffsetRegion);
req->region = region;
req->dx = dx;
req->dy = dy;
}
/**
* GrGetRegionBox:
* @region: the ID of the region to get the bounding box of
* @rect: pointer to a rectangle structure
* @Returns: the region type
*
* Fills in the specified rectangle structure with a bounding box that would
* completely enclose the specified region, and also returns the type of the
* specified region.
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -