#include "scope.h"
#include "x11.h"
#include "wcpscope.h"
void
WcpQueryVersion (
FD fd,
register const unsigned char *buf)
{
PrintField (buf, 0, 1, REQUEST, REQUESTHEADER) ;
PrintField (buf, 1, 1, WCPREQUEST, WCPREQUESTHEADER) ;
if (Verbose < 1)
return;
if (Verbose > 1)
PrintField(SBf, 0, 4, CARD32, "sequence number");
printreqlen(buf, fd, CONST2(2));
}
void
WcpQueryVersionReply (
FD fd,
const unsigned char *buf)
{
PrintField(RBf, 0, 1, REPLY, REPLYHEADER) ;
PrintField(RBf, 1, 1, WCPREPLY, WCPREPLYHEADER) ;
if (Verbose < 1)
return;
printfield(buf, 2, 2, CARD16, "sequence number");
printfield(buf, 4, 4, DVALUE4(0), "reply length");
PrintField(buf, 8, 2, CARD16, "major-version");
PrintField(buf, 10, 2, CARD16, "minor-version");
}
#define NextByte(dst) if (!len--) { error = "Out of data"; break; } dst = *data++;
static void
WcpAnalyzeImage1RLL (
const char *buf,
int len,
int width,
int height)
{
unsigned char byte;
unsigned char *data = (unsigned char *) buf;
int x, y;
const char *error = NULL;
int bytewidth;
int i;
int w;
y = 0;
bytewidth = (width + 7) >> 3;
while (!error && height--)
{
x = 0;
if (Verbose > 2)
fprintf (stdout, "%s %9d %9d:", Leader, y, (char *) data - buf);
NextByte (byte);
if (Verbose > 2)
fprintf (stdout, " %2x", byte);
switch (byte) {
case 0xff:
for (i = 0; i < bytewidth; i++)
{
NextByte(byte);
}
break;
default:
w = width;
while (w)
{
NextByte(byte);
if (Verbose > 2)
fprintf (stdout, " %3d", byte);
if (byte > w)
{
error = "bad run";
break;
}
x += byte;
w -= byte;
}
break;
}
if (Verbose > 2)
fprintf (stdout, "\n");
y++;
}
if (error)
fprintf (stdout, "%s%20s: %d, %d %d\n", Leader, error,
x, y - 1, (char *) data - buf);
}
static void
WcpAnalyzeImageNRLL (
const char *buf,
int len,
int width,
int height,
int bytes)
{
}
#define MAX_LRU_SHORT 0xe
#define LRU_LONG 0xf
#define MAX_LRU_RUN (MAX_LRU_SHORT + 0xff)
#define LRU_CACHE 0xf
#define LRU_MISS 0xf
typedef unsigned long PIXEL;
static void
init_cache (
PIXEL cache[LRU_CACHE],
int BPP)
{
int e;
for (e = 0; e < 8; e++)
{
cache[e] = e;
cache[LRU_CACHE-e-1] = ((1 << BPP) - 1) - e;
}
}
static void
push (
PIXEL cache[LRU_CACHE],
PIXEL pixel)
{
int e;
e = LRU_CACHE - 1;
while (--e >= 0)
cache[e+1] = cache[e];
cache[0] = pixel;
}
static PIXEL
use (
PIXEL cache[LRU_CACHE],
int e)
{
PIXEL tmp;
tmp = cache[e];
if (e)
{
while (--e >= 0)
cache[e+1] = cache[e];
cache[0] = tmp;
}
return tmp;
}
static void
WcpAnalyzeImageNLRU (
const char *buf,
int len,
int width,
int height,
int bytes)
{
unsigned char *data = (unsigned char *) buf;
unsigned char byte;
int x, y;
int w;
int i;
int bytewidth;
int cache;
unsigned long run;
PIXEL lru[LRU_CACHE];
PIXEL pix;
const char *error = NULL;
y = 0;
bytewidth = width * bytes;
while (!error && height--)
{
x = 0;
if (Verbose > 2)
fprintf (stdout, "%s %9d %9d:", Leader, y, (char *) data - buf);
NextByte (byte);
if (Verbose > 2)
fprintf (stdout, " %2x", byte);
switch (byte) {
case 0xff:
for (i = 0; i < bytewidth; i++)
{
NextByte (byte);
}
break;
default:
init_cache (lru, bytes * 8);
w = width;
while (w)
{
NextByte (byte);
run = byte >> 4;
cache = byte & 0xf;
if (run == LRU_LONG)
{
NextByte (byte);
run = (int) byte + MAX_LRU_SHORT;
}
run++;
if (cache == LRU_MISS)
{
pix = 0;
for (i = 0; i < bytes; i++)
{
pix = pix << 8;
NextByte (byte);
pix |= byte;
}
push (lru, pix);
}
else
{
pix = use (lru, cache);
}
w -= run;
if (w < 0)
{
error = "bad run";
break;
}
x += run;
fprintf (stdout, " %3ld:%0*x", run, bytes * 2, pix);
}
break;
}
if (Verbose > 2)
fprintf (stdout, "\n");
y++;
}
if (error)
fprintf (stdout, "%s%20s: %d, %d %d\n", Leader, error,
x, y - 1, (char *) data - buf);
}
static void
WcpAnalyzeImage (
const char *buf,
int len,
int depth,
int encoding,
int width,
int height)
{
int bytes;
bytes = depth / 8;
switch (depth) {
case 1:
switch (encoding) {
case 1:
case 2:
case 3:
case 4:
WcpAnalyzeImage1RLL (buf, len, width, height);
return;
default:
break;
}
break;
case 4:
switch (encoding) {
case 1:
case 2:
case 3:
case 4:
default:
break;
}
break;
case 8:
case 16:
case 24:
switch (encoding) {
case 1:
case 2:
case 3:
WcpAnalyzeImageNRLL (buf, len, width, height, bytes);
return;
case 4:
WcpAnalyzeImageNLRU (buf, len, width, height, bytes);
return;
default:
break;
}
break;
}
fprintf (stdout, "%s%20s: ", Leader, "invalid");
fprintf (stdout, "encoding %d depth %d\n", encoding, depth);
}
void
WcpPutImage (
FD fd,
const unsigned char *buf)
{
int n;
PrintField (buf, 0, 1, REQUEST, REQUESTHEADER) ;
PrintField (buf, 1, 1, WCPREQUEST, WCPREQUESTHEADER) ;
if (Verbose < 1)
return;
if (Verbose > 1)
PrintField(SBf, 0, 4, CARD32, "sequence number");
n = (IShort(&buf[2]) - 7) * 4;
printreqlen(buf, fd, DVALUE2(7 + (n + p) / 4));
PrintField(buf, 4, 4, DRAWABLE, "drawable");
PrintField(buf, 8, 4, GCONTEXT, "gc");
if (Verbose > 2)
PrintValueRec (ILong(&buf[8]),
GC_function|
GC_plane_mask|
GC_foreground|
GC_background,
GC_BITMASK);
PrintField(buf, 12, 4, CARD32, "lut");
PrintField(buf, 16, 2, INT16, "dst-x");
PrintField(buf, 18, 2, INT16, "dst-y");
PrintField(buf, 20, 2, CARD16, "width");
PrintField(buf, 22, 2, CARD16, "height");
PrintField(buf, 24, 1, CARD8, "depth");
PrintField(buf, 25, 1, CARD8, "encoding");
PrintField(buf, 26, 1, CARD8, "left-pad");
WcpAnalyzeImage ((const char *) &buf[28], (long) n, buf[24], buf[25],
IShort(&buf[20]) + buf[26],
IShort(&buf[22]));
PrintBytes(&buf[28], (long)n, "data");
}
void
WcpGetImage (
FD fd,
const unsigned char *buf)
{
PrintField (buf, 0, 1, REQUEST, REQUESTHEADER) ;
PrintField (buf, 1, 1, WCPREQUEST, WCPREQUESTHEADER) ;
if (Verbose < 1)
return;
if (Verbose > 1)
PrintField(SBf, 0, 4, CARD32, "sequence number");
printreqlen(buf, fd, CONST2(2));
PrintField(buf, 4, 4, DRAWABLE, "drawable");
PrintField(buf, 8, 4, CARD32, "lut");
PrintField(buf, 12, 2, INT16, "x");
PrintField(buf, 14, 2, INT16, "y");
PrintField(buf, 16, 2, CARD16, "width");
PrintField(buf, 18, 2, CARD16, "height");
PrintField(buf, 20, 1, CARD8, "encoding");
}
void
WcpGetImageReply (
FD fd,
const unsigned char *buf)
{
long n;
PrintField(RBf, 0, 1, REPLY, REPLYHEADER) ;
PrintField(RBf, 1, 1, WCPREPLY, WCPREPLYHEADER) ;
if (Verbose < 1)
return;
printfield(buf, 2, 2, CARD16, "sequence number");
printfield(buf, 4, 4, DVALUE4(n), "reply length");
PrintField(buf, 8, 4, CARD32, "visual");
n = ILong (&buf[4]) * 4;
PrintBytes (&buf[32], n, "data");
}
void
WcpCreateColorCursor (
FD fd,
const unsigned char *buf)
{
PrintField (buf, 0, 1, REQUEST, REQUESTHEADER) ;
PrintField (buf, 1, 1, WCPREQUEST, WCPREQUESTHEADER) ;
if (Verbose < 1)
return;
if (Verbose > 1)
PrintField(SBf, 0, 4, CARD32, "sequence number");
printreqlen(buf, fd, CONST2(2));
}
void
WcpCreateLut (
FD fd,
const unsigned char *buf)
{
PrintField (buf, 0, 1, REQUEST, REQUESTHEADER) ;
PrintField (buf, 1, 1, WCPREQUEST, WCPREQUESTHEADER) ;
if (Verbose < 1)
return;
if (Verbose > 1)
PrintField(SBf, 0, 4, CARD32, "sequence number");
printreqlen(buf, fd, CONST2(2));
}
void
WcpFreeLut (
FD fd,
const unsigned char *buf)
{
PrintField (buf, 0, 1, REQUEST, REQUESTHEADER) ;
PrintField (buf, 1, 1, WCPREQUEST, WCPREQUESTHEADER) ;
if (Verbose < 1)
return;
if (Verbose > 1)
PrintField(SBf, 0, 4, CARD32, "sequence number");
printreqlen(buf, fd, CONST2(2));
}
void
WcpCopyArea (
FD fd,
const unsigned char *buf)
{
PrintField (buf, 0, 1, REQUEST, REQUESTHEADER) ;
PrintField (buf, 1, 1, WCPREQUEST, WCPREQUESTHEADER) ;
if (Verbose < 1)
return;
if (Verbose > 1)
PrintField(SBf, 0, 4, CARD32, "sequence number");
printreqlen(buf, fd, CONST2(2));
}