summaryrefslogtreecommitdiff
path: root/lbx/lbxgfx.c
diff options
context:
space:
mode:
Diffstat (limited to 'lbx/lbxgfx.c')
-rw-r--r--lbx/lbxgfx.c854
1 files changed, 0 insertions, 854 deletions
diff --git a/lbx/lbxgfx.c b/lbx/lbxgfx.c
deleted file mode 100644
index 506859a20..000000000
--- a/lbx/lbxgfx.c
+++ /dev/null
@@ -1,854 +0,0 @@
-/* $Xorg: lbxgfx.c,v 1.3 2000/08/17 19:53:31 cpqbld Exp $ */
-/*
- * Copyright 1993 Network Computing Devices, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name Network Computing Devices, Inc. not be
- * used in advertising or publicity pertaining to distribution of this
- * software without specific, written prior permission.
- *
- * THIS SOFTWARE IS PROVIDED `AS-IS'. NETWORK COMPUTING DEVICES, INC.,
- * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT
- * LIMITATION ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE, OR NONINFRINGEMENT. IN NO EVENT SHALL NETWORK
- * COMPUTING DEVICES, INC., BE LIABLE FOR ANY DAMAGES WHATSOEVER, INCLUDING
- * SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS OF USE, DATA,
- * OR PROFITS, EVEN IF ADVISED OF THE POSSIBILITY THEREOF, AND REGARDLESS OF
- * WHETHER IN AN ACTION IN CONTRACT, TORT OR NEGLIGENCE, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* $XFree86: xc/programs/Xserver/lbx/lbxgfx.c,v 1.3 2001/01/17 22:36:59 dawes Exp $ */
-
-/* various bits of DIX-level mangling */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <sys/types.h>
-#include <stdio.h>
-#define NEED_REPLIES
-#define NEED_EVENTS
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "os.h"
-#include "dixstruct.h"
-#include "resource.h"
-#include "servermd.h"
-#include "windowstr.h"
-#include "scrnintstr.h"
-#define _XLBX_SERVER_
-#include <X11/extensions/lbxstr.h>
-#include "lbxserve.h"
-#include "lbxtags.h"
-#include <X11/Xfuncproto.h>
-#include <X11/extensions/lbximage.h>
-#include "lbxsrvopts.h"
-
-#define DrawableCache(client) (LbxClient(client)->drawableCache)
-#define GContextCache(client) (LbxClient(client)->gcontextCache)
-
-static void
-push (XID cache[GFX_CACHE_SIZE],
- XID xid)
-{
- memmove (cache+1, cache, (GFX_CACHE_SIZE - 1) * sizeof (cache[0]));
- cache[0] = xid;
-}
-
-static XID
-use (XID cache[GFX_CACHE_SIZE],
- int i)
-{
- XID tmp;
-
- tmp = cache[i];
- if (i != 0)
- {
- memmove (cache + 1, cache, i * sizeof (cache[0]));
- cache[0] = tmp;
- }
- return tmp;
-}
-
-extern char *ConnectionInfo;
-
-static int
-LbxDecodeGFXCache(ClientPtr client,
- CARD8 cacheEnts,
- char *after,
- Drawable *drawp,
- GContext *gcp)
-{
- int skip;
- int dcache, gcache;
-
- dcache = GFXdCacheEnt (cacheEnts);
- gcache = GFXgCacheEnt (cacheEnts);
- skip = 0;
- if (dcache == GFXCacheNone)
- {
- memcpy (drawp, after, sizeof (Drawable));
- push (DrawableCache(client), *drawp);
- after += sizeof (Drawable);
- skip += sizeof (Drawable);
- }
- else
- *drawp = use (DrawableCache(client), dcache);
- if (gcache == GFXCacheNone)
- {
- memcpy (gcp, after, sizeof (GContext));
- push (GContextCache(client), *gcp);
- skip += sizeof (GContext);
- }
- else
- *gcp = use (GContextCache(client), gcache);
- return skip;
-}
-
-static int
-LbxDecodeDrawableCache(ClientPtr client,
- CARD8 cacheEnts,
- char *after,
- Drawable *drawp)
-{
- int skip;
- int dcache;
-
- dcache = GFXdCacheEnt (cacheEnts);
- skip = 0;
- if (dcache == GFXCacheNone)
- {
- memcpy (drawp, after, sizeof (Drawable));
- push (DrawableCache(client), *drawp);
- after += sizeof (Drawable);
- skip += sizeof (Drawable);
- }
- else
- *drawp = use (DrawableCache(client), dcache);
- return skip;
-}
-
-#ifdef notyet
-static int
-LbxDecodeGCCache(ClientPtr client,
- CARD8 cacheEnts,
- char *after,
- GContext *gcp)
-{
- int skip;
- int gcache;
-
- gcache = GFXgCacheEnt (cacheEnts);
- skip = 0;
- if (gcache == GFXCacheNone)
- {
- memcpy (gcp, after, sizeof (GContext));
- push (GContextCache(client), *gcp);
- after += sizeof (GContext);
- skip += sizeof (GContext);
- }
- else
- *gcp = use (GContextCache(client), gcache);
- return skip;
-}
-#endif
-
-#define GFX_GET_DRAWABLE_AND_GC(type,in,len) {\
- int skip; \
- len = (client->req_len << 2) - SIZEOF(type); \
- in = ((char *) stuff) + SIZEOF(type);\
- skip = LbxDecodeGFXCache(client, stuff->cacheEnts, in, \
- &drawable, &gc); \
- in += skip; \
- len -= skip; \
-}
-
-#define GFX_GET_DST_DRAWABLE_AND_GC(type,in,len) {\
- int skip; \
- len = (client->req_len << 2) - SIZEOF(type); \
- in = ((char *) stuff) + SIZEOF(type);\
- skip = LbxDecodeGFXCache(client, stuff->cacheEnts, in, \
- &dstDrawable, &gc); \
- in += skip; \
- len -= skip; \
-}
-
-#define GFX_GET_SRC_DST_DRAWABLE_AND_GC(type, in, len) { \
- int skip; \
- len = (client->req_len << 2) - SIZEOF(type); \
- in = ((char *) stuff) + SIZEOF(type); \
- skip = LbxDecodeDrawableCache(client, stuff->srcCache, in, \
- &srcDrawable); \
- in += skip; \
- len -= skip; \
- skip = LbxDecodeGFXCache(client, stuff->cacheEnts, in, \
- &dstDrawable, &gc); \
- in += skip; \
- len -= skip; \
-}
-
-#define GFX_GET_GC(type, in, len) { \
- int skip; \
- len = (client->req_len << 2) - SIZEOF(type); \
- in = ((char *) stuff) + SIZEOF(type); \
- skip = LbxDecodeGCCache(client, stuff->gcCache, in, &gc); \
- in += skip; \
- len -= skip; \
-}
-
-int
-LbxDecodePoly(ClientPtr client,
- CARD8 xreqtype,
- int (*decode_rtn)(char *, char *, short *))
-{
- REQUEST(xLbxPolyPointReq);
- char *in;
- xPolyPointReq *xreq;
- int len;
- int retval;
- Drawable drawable;
- GContext gc;
-
- GFX_GET_DRAWABLE_AND_GC(xLbxPolyPointReq, in, len);
- if ((xreq = (xPolyPointReq *)
- xalloc(sizeof(xPolyPointReq) + (len << 1))) == NULL)
- return BadAlloc;
- len = (*decode_rtn)(in, in + len - stuff->padBytes, (short *)(&xreq[1]));
- xreq->reqType = xreqtype;
- xreq->coordMode = 1;
- xreq->drawable = drawable;
- xreq->gc = gc;
- xreq->length = client->req_len = (sizeof(xPolyPointReq) + len) >> 2;
- client->requestBuffer = (pointer)xreq;
-
- retval = (*ProcVector[xreqtype])(client);
- xfree(xreq);
- return retval;
-}
-
-int
-LbxDecodeFillPoly(ClientPtr client)
-{
- REQUEST(xLbxFillPolyReq);
- char *in;
- xFillPolyReq *xreq;
- int len;
- int retval;
- Drawable drawable;
- GContext gc;
-
- GFX_GET_DRAWABLE_AND_GC(xLbxFillPolyReq, in, len);
- if ((xreq = (xFillPolyReq *)
- xalloc(sizeof(xFillPolyReq) + (len << 1))) == NULL)
- return BadAlloc;
- len = LbxDecodePoints(in, in + len - stuff->padBytes, (short *) &xreq[1]);
- xreq->reqType = X_FillPoly;
- xreq->drawable = drawable;
- xreq->gc = gc;
- xreq->shape = stuff->shape;
- xreq->coordMode = 1;
- xreq->length = client->req_len = (sizeof(xFillPolyReq) + len) >> 2;
- client->requestBuffer = (pointer)xreq;
-
- retval = (*ProcVector[X_FillPoly])(client);
- xfree(xreq);
- return retval;
-}
-
-/*
- * Routines for decoding line drawing requests
- */
-
-#define DECODE_PSHORT(in, val) \
- if ((*(in) & 0xf0) != 0xf0) \
- (val) = *(CARD8 *)(in)++; \
- else { \
- (val) = ((*(CARD8 *)(in) & 0x0f) << 8) | *(CARD8 *)((in) + 1); \
- if ((val) >= 0xe00) \
- (val) -= 0x1000; \
- else \
- (val) += 0xf0; \
- (in) += 2; \
- }
-
-#define DECODE_SHORT(in, val) \
- if ((*(in) & 0xf0) != 0x80) \
- (val) = *(INT8 *)(in)++; \
- else { \
- (val) = ((*(CARD8 *)(in) & 0x0f) << 8) | *(CARD8 *)((in) + 1); \
- if ((val) & 0x0800) \
- (val) = ((val) | 0xf000) - 0x70; \
- else \
- (val) += 0x80; \
- (in) += 2; \
- }
-
-#define DECODE_USHORT(in, val) \
- if ((*(in) & 0xf0) != 0xf0) \
- (val) = *(CARD8 *)(in)++; \
- else { \
- (val) = (((*(CARD8 *)(in) & 0x0f) << 8) | *(CARD8 *)((in) + 1)) + 0xf0; \
- (in) += 2; \
- }
-
-#define DECODE_ANGLE(in, val) \
- if (*(INT8 *)(in) >= 0x6e) \
- (val) = (*(INT8 *)(in)++ - 0x67) * (15 << 6); \
- else if (*(INT8 *)(in) >= 0x5a) \
- (val) = (*(INT8 *)(in)++ - 0x5a) * (5 << 6); \
- else if (*(INT8 *)(in) <= (INT8)0x91) \
- (val) = (*(INT8 *)(in)++ - (INT8)0x98) * (15 << 6); \
- else if (*(INT8 *)(in) <= (INT8)0xa5) \
- (val) = (*(INT8 *)(in)++ - (INT8)0xa6) * (5 << 6); \
- else { \
- (val) = (*(CARD8 *)(in) << 8) | *(CARD8 *)((in) + 1); \
- (in) += 2; \
- }
-
-int
-LbxDecodePoints(char *in,
- char *inend,
- short *out)
-{
- char *start_out = (char *)out;
-
- while (in < inend) {
- DECODE_SHORT(in, *out);
- out++;
- DECODE_SHORT(in, *out);
- out++;
- }
- return ((char *)out - start_out);
-}
-
-int
-LbxDecodeSegment(char *in,
- char *inend,
- short *out)
-{
- short diff;
- short last_x = 0;
- short last_y = 0;
- char *start_out = (char *)out;
-
- while (in < inend) {
- DECODE_SHORT(in, diff);
- *out = last_x + diff;
- last_x += diff;
- out++;
- DECODE_SHORT(in, diff);
- *out = last_y + diff;
- last_y += diff;
- out++;
-
- DECODE_SHORT(in, diff);
- *out = last_x + diff;
- out++;
- DECODE_SHORT(in, diff);
- *out = last_y + diff;
- out++;
- }
- return ((char *)out - start_out);
-}
-
-int
-LbxDecodeRectangle(char *in,
- char *inend,
- short *out)
-{
- short diff;
- short last_x = 0;
- short last_y = 0;
- char *start_out = (char *)out;
-
- while (in < inend) {
- DECODE_SHORT(in, diff);
- *out = last_x + diff;
- last_x += diff;
- out++;
- DECODE_SHORT(in, diff);
- *out = last_y + diff;
- last_y += diff;
- out++;
-
- DECODE_USHORT(in, *(unsigned short *)out);
- out++;
- DECODE_USHORT(in, *(unsigned short *)out);
- out++;
- }
- return ((char *)out - start_out);
-}
-
-int
-LbxDecodeArc(char *in,
- char *inend,
- short *out)
-{
- short diff;
- short last_x = 0;
- short last_y = 0;
- char *start_out = (char *)out;
-
- while (in < inend) {
- DECODE_SHORT(in, diff);
- *out = last_x + diff;
- last_x += diff;
- out++;
- DECODE_SHORT(in, diff);
- *out = last_y + diff;
- last_y += diff;
- out++;
-
- DECODE_USHORT(in, *(unsigned short *)out);
- out++;
- DECODE_USHORT(in, *(unsigned short *)out);
- out++;
-
- DECODE_ANGLE(in, *out);
- out++;
- DECODE_ANGLE(in, *out);
- out++;
- }
- return ((char *)out - start_out);
-}
-
-int
-LbxDecodeCopyArea (ClientPtr client)
-{
- REQUEST(xLbxCopyAreaReq);
- char *in;
- xCopyAreaReq req;
- int len;
- Drawable srcDrawable, dstDrawable;
- GContext gc;
-
- GFX_GET_SRC_DST_DRAWABLE_AND_GC(xLbxCopyAreaReq, in, len);
- req.reqType = X_CopyArea;
- req.length = client->req_len = SIZEOF(xCopyAreaReq) >> 2;
- req.srcDrawable = srcDrawable;
- req.dstDrawable = dstDrawable;
- req.gc = gc;
- DECODE_PSHORT (in, req.srcX);
- DECODE_PSHORT (in, req.srcY);
- DECODE_PSHORT (in, req.dstX);
- DECODE_PSHORT (in, req.dstY);
- DECODE_USHORT (in, req.width);
- DECODE_USHORT (in, req.height);
- client->requestBuffer = (pointer) &req;
- return (*ProcVector[X_CopyArea])(client);
-}
-
-int
-LbxDecodeCopyPlane (ClientPtr client)
-{
- REQUEST(xLbxCopyPlaneReq);
- char *in;
- xCopyPlaneReq req;
- int len;
- Drawable srcDrawable, dstDrawable;
- GContext gc;
-
- GFX_GET_SRC_DST_DRAWABLE_AND_GC(xLbxCopyPlaneReq, in, len);
- req.reqType = X_CopyPlane;
- req.length = client->req_len = SIZEOF(xCopyPlaneReq) >> 2;
- req.srcDrawable = srcDrawable;
- req.dstDrawable = dstDrawable;
- req.gc = gc;
- DECODE_PSHORT (in, req.srcX);
- DECODE_PSHORT (in, req.srcY);
- DECODE_PSHORT (in, req.dstX);
- DECODE_PSHORT (in, req.dstY);
- DECODE_USHORT (in, req.width);
- DECODE_USHORT (in, req.height);
- req.bitPlane = stuff->bitPlane;
- client->requestBuffer = (pointer) &req;
- return (*ProcVector[X_CopyPlane])(client);
-}
-
-static pointer
-get_gfx_buffer(ClientPtr client,
- int len)
-{
- LbxClientPtr lbxClient = LbxClient(client);
- pointer tmp;
-
- /* XXX should probably shrink this sucker too */
- if (len > lbxClient->gb_size) {
- tmp = (pointer) xrealloc(lbxClient->gfx_buffer, len);
- if (!tmp)
- return (pointer) NULL;
- lbxClient->gfx_buffer = tmp;
- lbxClient->gb_size = len;
- }
- return lbxClient->gfx_buffer;
-}
-
-int
-LbxDecodePolyText (ClientPtr client)
-{
- REQUEST(xLbxPolyTextReq);
- char *in, *pos;
- xPolyTextReq *xreq;
- int len;
- Drawable drawable;
- GContext gc;
-
- GFX_GET_DRAWABLE_AND_GC(xLbxPolyTextReq, in, len);
- xreq = (xPolyTextReq *) get_gfx_buffer(client, sizeof (xPolyTextReq) + len);
- if (!xreq)
- return BadAlloc;
- xreq->reqType = stuff->lbxReqType == X_LbxPolyText8? X_PolyText8 : X_PolyText16;
- xreq->drawable = drawable;
- xreq->gc = gc;
- pos = in;
- DECODE_PSHORT(in, xreq->x);
- DECODE_PSHORT(in, xreq->y);
- len -= (in - pos);
- memmove ((char *) (xreq + 1), in, len);
- xreq->length = client->req_len = (sizeof (xPolyTextReq) + len) >> 2;
- client->requestBuffer = (pointer) xreq;
- return (*ProcVector[xreq->reqType])(client);
-}
-
-int
-LbxDecodeImageText (ClientPtr client)
-{
- REQUEST(xLbxImageTextReq);
- char *in, *pos;
- xImageTextReq *xreq;
- int len;
- Drawable drawable;
- GContext gc;
-
- GFX_GET_DRAWABLE_AND_GC(xLbxImageTextReq, in, len);
- xreq = (xImageTextReq *) get_gfx_buffer(client, sizeof (xImageTextReq) + len);
- if (!xreq)
- return BadAlloc;
- xreq->reqType = stuff->lbxReqType == X_LbxImageText8? X_ImageText8 : X_ImageText16;
- xreq->drawable = drawable;
- xreq->gc = gc;
- xreq->nChars = stuff->nChars;
- pos = in;
- DECODE_PSHORT(in, xreq->x);
- DECODE_PSHORT(in, xreq->y);
- len -= (in - pos);
- memmove ((char *) (xreq + 1), in, len);
- xreq->length = client->req_len = (sizeof (xImageTextReq) + len) >> 2;
- client->requestBuffer = (pointer) xreq;
- return (*ProcVector[xreq->reqType])(client);
-}
-
-int
-LbxDecodePutImage (ClientPtr client)
-{
- REQUEST (xLbxPutImageReq);
- char *in, *data;
- xPutImageReq xreq;
- int ppl, bpl, nbytes;
- int retval;
- int n;
-
- xreq.reqType = X_PutImage;
-
- in = (char *) stuff + sz_xLbxPutImageReq;
-
- if (stuff->bitPacked & 0x80) {
- xreq.format = (stuff->bitPacked >> 5) & 0x3;
- xreq.depth = ((stuff->bitPacked >> 2) & 0x7) + 1;
- xreq.leftPad = 0;
- } else {
- xreq.depth = (stuff->bitPacked >> 2) + 1;
- xreq.format = (*in >> 5) & 0x3;
- xreq.leftPad = *in++ & 0x1f;
- }
- DECODE_USHORT(in, xreq.width);
- DECODE_USHORT(in, xreq.height);
- DECODE_PSHORT(in, xreq.dstX);
- DECODE_PSHORT(in, xreq.dstY);
- if (client->swapped) {
- if (GFXdCacheEnt (stuff->cacheEnts) == GFXCacheNone ||
- GFXgCacheEnt (stuff->cacheEnts) == GFXCacheNone)
- {
- swapl (in, n);
- if (GFXdCacheEnt (stuff->cacheEnts) == GFXCacheNone &&
- GFXgCacheEnt (stuff->cacheEnts) == GFXCacheNone)
- swapl (in + 4, n);
- }
- }
- in += LbxDecodeGFXCache(client, stuff->cacheEnts, in,
- &xreq.drawable, &xreq.gc);
-
- ppl = xreq.width + xreq.leftPad;
- if (xreq.format != ZPixmap ||
- (xreq.depth == 1 && screenInfo.formats->bitsPerPixel == 1)) {
-#ifdef INTERNAL_VS_EXTERNAL_PADDING
- bpl = BitmapBytePadProto(ppl);
-#else
- bpl = BitmapBytePad(ppl);
-#endif
- nbytes = bpl;
- if (xreq.format == XYPixmap)
- nbytes *= xreq.depth;
- } else {
-#ifdef INTERNAL_VS_EXTERNAL_PADDING
- bpl = PixmapBytePadProto(ppl, xreq.depth);
-#else
- bpl = PixmapBytePad(ppl, xreq.depth);
-#endif
- nbytes = bpl;
- }
- nbytes *= xreq.height;
- xreq.length = ((nbytes + 3) >> 2) + (sz_xPutImageReq >> 2);
- /* +1 is because fillspan in DecodeFaxG42D seems to go 1 byte too far,
- * and I don't want to mess with that code */
- if ((data = (char *) xalloc ((xreq.length << 2) + 1)) == NULL)
- return BadAlloc;
-
- *((xPutImageReq *)data) = xreq;
-
- if (!stuff->compressionMethod)
- {
- memcpy(data + sz_xPutImageReq, in, nbytes);
- }
- else if (xreq.format != ZPixmap ||
- (xreq.depth == 1 && screenInfo.formats->bitsPerPixel == 1))
- {
- LbxBitmapCompMethod *compMethod;
-
- compMethod = LbxSrvrLookupBitmapCompMethod (LbxProxy(client),
- stuff->compressionMethod);
-
- if (!compMethod)
- {
- xfree (data);
- return (BadValue);
- }
- else
- {
- if (!compMethod->inited)
- {
- if (compMethod->compInit)
- (*compMethod->compInit)();
- compMethod->inited = 1;
- }
-
- (*compMethod->decompFunc) (
- (unsigned char *) in, (unsigned char *) data + sz_xPutImageReq,
- nbytes,
-#if BITMAP_BIT_ORDER != IMAGE_BYTE_ORDER
- (ppl + BITMAP_SCANLINE_UNIT - 1) & ~BITMAP_SCANLINE_UNIT,
-#else
- ppl,
-#endif
- bpl,
- ((xConnSetup *) ConnectionInfo)->bitmapBitOrder == LSBFirst);
- }
- }
- else
- {
- LbxPixmapCompMethod *compMethod;
-
- compMethod = LbxSrvrLookupPixmapCompMethod (LbxProxy(client),
- stuff->compressionMethod);
-
- if (!compMethod)
- {
- xfree (data);
- return (BadValue);
- }
- else
- {
- if (!compMethod->inited)
- {
- if (compMethod->compInit)
- (*compMethod->compInit)();
- compMethod->inited = 1;
- }
-
- (*compMethod->decompFunc) (
- in, (char *) data + sz_xPutImageReq,
- (int) xreq.height, bpl);
- }
- }
-
- client->req_len = xreq.length;
- client->requestBuffer = (pointer) data;
-
- retval = (*ProcVector[X_PutImage])(client);
- xfree(data);
- return retval;
-}
-
-int
-LbxDecodeGetImage (ClientPtr client)
-{
- REQUEST (xLbxGetImageReq);
- xLbxGetImageReply *reply = NULL;
- int lbxLen, xLen, n;
- int method = 0, bytes, status;
- xGetImageReply *theImage;
-
- REQUEST_SIZE_MATCH(xLbxGetImageReq);
-
- status = DoGetImage(client, stuff->format, stuff->drawable,
- stuff->x, stuff->y,
- (int)stuff->width, (int)stuff->height,
- stuff->planeMask, &theImage);
-
- if (status != Success)
- return (status);
-
- if ((reply = (xLbxGetImageReply *) xalloc (
- sz_xLbxGetImageReply + theImage->length)) == NULL)
- {
- xfree(theImage);
- return (BadAlloc);
- }
-
- if (stuff->format != ZPixmap ||
- (theImage->depth == 1 && screenInfo.formats->bitsPerPixel == 1))
- {
- LbxBitmapCompMethod *compMethod;
-
- compMethod = LbxSrvrFindPreferredBitmapCompMethod (LbxProxy(client));
-
- if (!compMethod)
- status = LBX_IMAGE_COMPRESS_NO_SUPPORT;
- else
- {
- if (!compMethod->inited)
- {
- if (compMethod->compInit)
- (*compMethod->compInit)();
- compMethod->inited = 1;
- }
-
- status = (*compMethod->compFunc) (
- (unsigned char *) &theImage[1],
- (unsigned char *) &reply[1],
- theImage->length,
- theImage->length,
-#if BITMAP_BIT_ORDER != IMAGE_BYTE_ORDER
- (int) (stuff->width + BITMAP_SCANLINE_UNIT - 1) &
- ~BITMAP_SCANLINE_UNIT,
-#else
- (int) stuff->width,
-#endif
-#ifdef INTERNAL_VS_EXTERNAL_PADDING
- BitmapBytePadProto(stuff->width),
-#else
- BitmapBytePad(stuff->width),
-#endif
- ((xConnSetup *) ConnectionInfo)->bitmapBitOrder == LSBFirst,
- &bytes);
-
- method = compMethod->methodOpCode;
- }
- }
- else
- {
- LbxPixmapCompMethod *compMethod;
-
- compMethod = LbxSrvrFindPreferredPixmapCompMethod (
- LbxProxy(client), (int) stuff->format, theImage->depth);
-
- if (!compMethod)
- status = LBX_IMAGE_COMPRESS_NO_SUPPORT;
- else
- {
- if (!compMethod->inited)
- {
- if (compMethod->compInit)
- (*compMethod->compInit)();
- compMethod->inited = 1;
- }
-
- status = (*compMethod->compFunc) (
- (char *) &theImage[1],
- (char *) &reply[1],
- theImage->length,
- (int) stuff->format,
- theImage->depth,
- (int) stuff->height,
-#ifdef INTERNAL_VS_EXTERNAL_PADDING
- PixmapBytePadProto(stuff->width, theImage->depth),
-#else
- PixmapBytePad(stuff->width, theImage->depth),
-#endif
- &bytes);
-
- method = compMethod->methodOpCode;
- }
- }
-
- reply->type = X_Reply;
- reply->depth = theImage->depth;
- reply->sequenceNumber = client->sequence;
- reply->visual = theImage->visual;
- reply->pad1 = reply->pad2 = reply->pad3 = reply->pad4 = reply->pad5 = 0;
-
- if (status != LBX_IMAGE_COMPRESS_SUCCESS)
- {
- reply->compressionMethod = LbxImageCompressNone;
- reply->lbxLength = reply->xLength = (theImage->length + 3) >> 2;
- }
- else
- {
- reply->compressionMethod = method;
- reply->lbxLength = (bytes + 3) >> 2;
- reply->xLength = (theImage->length + 3) >> 2;
- }
-
- lbxLen = reply->lbxLength;
- xLen = reply->xLength;
-
- if (client->swapped)
- {
- swaps (&reply->sequenceNumber, n);
- swapl (&reply->lbxLength, n);
- swapl (&reply->xLength, n);
- swapl (&reply->visual, n);
- }
-
- if (reply->compressionMethod != LbxImageCompressNone)
- {
- /*
- * If the compressed image is greater that 25% of the original
- * image, run the GetImage reply through the regular stream
- * compressor. Otherwise, just write the compressed image.
- */
-
- if (lbxLen > (xLen / 4))
- {
- WriteToClient (client,
- sz_xLbxGetImageReply + (lbxLen << 2), (char *)reply);
- }
- else
- {
- UncompressedWriteToClient (client,
- sz_xLbxGetImageReply + (lbxLen << 2), (char *)reply);
- }
- }
- else
- {
- /*
- * Write back the original uncompressed image.
- */
-
- WriteToClient (client, sz_xLbxGetImageReply, (char *)reply);
- WriteToClient (client, lbxLen << 2, (char *)&theImage[1]);
- }
-
- xfree (theImage);
-
- if (reply)
- xfree ((char *) reply);
-
- return (Success);
-}