⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfbproto.c

📁 开放源码实时操作系统源码.
💻 C
📖 第 1 页 / 共 2 页
字号:

	    case rfbEncodingRaw:

		bytesPerLine = rect.r.w * myFormat.bitsPerPixel / 8;
		linesToRead = BUFFER_SIZE / bytesPerLine;

		while (rect.r.h > 0) {
		    if (linesToRead > rect.r.h)
			linesToRead = rect.r.h;

		    if (!ReadExact(rfbsock, buffer,bytesPerLine * linesToRead))
			return False;

		    CopyDataToScreen((CARD8 *)buffer, rect.r.x, rect.r.y,
				     rect.r.w, linesToRead);

		    rect.r.h -= linesToRead;
		    rect.r.y += linesToRead;

		}
		break;

	    case rfbEncodingCopyRect:
	    {
		rfbCopyRect cr;

		if (!ReadExact(rfbsock, (char *)&cr, sz_rfbCopyRect))
		    return False;

		cr.srcX = Swap16IfLE(cr.srcX);
		cr.srcY = Swap16IfLE(cr.srcY);

		if (copyRectDelay != 0) {
		    XFillRectangle(dpy, canvas, srcGC, cr.srcX, cr.srcY,
				   rect.r.w, rect.r.h);
		    XFillRectangle(dpy, canvas, dstGC, rect.r.x, rect.r.y,
				   rect.r.w, rect.r.h);
		    XSync(dpy,False);
		    usleep(copyRectDelay * 1000);
		    XFillRectangle(dpy, canvas, dstGC, rect.r.x, rect.r.y,
				   rect.r.w, rect.r.h);
		    XFillRectangle(dpy, canvas, srcGC, cr.srcX, cr.srcY,
				   rect.r.w, rect.r.h);
		}

		XCopyArea(dpy, canvas, canvas, gc, cr.srcX, cr.srcY,
			  rect.r.w, rect.r.h, rect.r.x, rect.r.y);

		break;
	    }

	    case rfbEncodingRRE:
	    {
		rfbRREHeader hdr;
		CARD8 pix8;
		CARD16 pix16;
		CARD32 pix32;
		XGCValues gcv;
		rfbRectangle subrect;
		int j;

		if (!ReadExact(rfbsock, (char *)&hdr, sz_rfbRREHeader))
		    return False;

		hdr.nSubrects = Swap32IfLE(hdr.nSubrects);

		switch (myFormat.bitsPerPixel) {

		case 8:
		    if (!ReadExact(rfbsock, (char *)&pix8, 1))
			return False;

		    gcv.foreground = (useBGR233 ? BGR233ToPixel[pix8]
				      : pix8);
		    XChangeGC(dpy, gc, GCForeground, &gcv);
		    XFillRectangle(dpy, canvas, gc, rect.r.x, rect.r.y,
				   rect.r.w, rect.r.h);

		    for (j = 0; j < hdr.nSubrects; j++) {
			if (!ReadExact(rfbsock, (char *)&pix8, 1))
			    return False;

			if (!ReadExact(rfbsock, (char *)&subrect,
					 sz_rfbRectangle))
			    return False;

			subrect.x = Swap16IfLE(subrect.x);
			subrect.y = Swap16IfLE(subrect.y);
			subrect.w = Swap16IfLE(subrect.w);
			subrect.h = Swap16IfLE(subrect.h);

			gcv.foreground = (useBGR233 ? BGR233ToPixel[pix8]
					  : pix8);
			XChangeGC(dpy, gc, GCForeground, &gcv);
			XFillRectangle(dpy, canvas, gc, rect.r.x + subrect.x,
				       rect.r.y + subrect.y, subrect.w,
				       subrect.h);
		    }
		    break;

		case 16:
		    if (!ReadExact(rfbsock, (char *)&pix16, 2))
			return False;

		    gcv.foreground = pix16;
		    XChangeGC(dpy, gc, GCForeground, &gcv);
		    XFillRectangle(dpy, canvas, gc, rect.r.x, rect.r.y,
				   rect.r.w, rect.r.h);

		    for (j = 0; j < hdr.nSubrects; j++) {
			if (!ReadExact(rfbsock, (char *)&pix16, 2))
			    return False;

			if (!ReadExact(rfbsock, (char *)&subrect,
					 sz_rfbRectangle))
			    return False;

			subrect.x = Swap16IfLE(subrect.x);
			subrect.y = Swap16IfLE(subrect.y);
			subrect.w = Swap16IfLE(subrect.w);
			subrect.h = Swap16IfLE(subrect.h);

			gcv.foreground = pix16;
			XChangeGC(dpy, gc, GCForeground, &gcv);
			XFillRectangle(dpy, canvas, gc, rect.r.x + subrect.x,
				       rect.r.y + subrect.y, subrect.w,
				       subrect.h);
		    }
		    break;

		case 32:
		    if (!ReadExact(rfbsock, (char *)&pix32, 4))
			return False;

		    gcv.foreground = pix32;
		    XChangeGC(dpy, gc, GCForeground, &gcv);
		    XFillRectangle(dpy, canvas, gc, rect.r.x, rect.r.y,
				   rect.r.w, rect.r.h);

		    for (j = 0; j < hdr.nSubrects; j++) {
			if (!ReadExact(rfbsock, (char *)&pix32, 4))
			    return False;

			if (!ReadExact(rfbsock, (char *)&subrect,
					 sz_rfbRectangle))
			    return False;

			subrect.x = Swap16IfLE(subrect.x);
			subrect.y = Swap16IfLE(subrect.y);
			subrect.w = Swap16IfLE(subrect.w);
			subrect.h = Swap16IfLE(subrect.h);

			gcv.foreground = pix32;
			XChangeGC(dpy, gc, GCForeground, &gcv);
			XFillRectangle(dpy, canvas, gc, rect.r.x + subrect.x,
				       rect.r.y + subrect.y, subrect.w,
				       subrect.h);
		    }
		    break;
		}
		break;
	    }

	    case rfbEncodingCoRRE:
	    {
		rfbRREHeader hdr;
		CARD8 pix8;
		CARD16 pix16;
		CARD32 pix32;
		XGCValues gcv;
		int j;
		CARD8 *ptr;
		register int x, y, w, h;

		if (!ReadExact(rfbsock, (char *)&hdr, sz_rfbRREHeader))
		    return False;

		hdr.nSubrects = Swap32IfLE(hdr.nSubrects);

		switch (myFormat.bitsPerPixel) {

		case 8:
		    if (!ReadExact(rfbsock, (char *)&pix8, 1))
			return False;

		    gcv.foreground = (useBGR233 ? BGR233ToPixel[pix8]
				      : pix8);
		    XChangeGC(dpy, gc, GCForeground, &gcv);
		    XFillRectangle(dpy, canvas, gc, rect.r.x, rect.r.y,
				   rect.r.w, rect.r.h);

		    if (!ReadExact(rfbsock, buffer, hdr.nSubrects * 5))
			return False;

		    ptr = (CARD8 *)buffer;

		    for (j = 0; j < hdr.nSubrects; j++) {
			pix8 = *ptr++;
			x = *ptr++;
			y = *ptr++;
			w = *ptr++;
			h = *ptr++;
			gcv.foreground = (useBGR233 ? BGR233ToPixel[pix8]
					  : pix8);
			XChangeGC(dpy, gc, GCForeground, &gcv);
			XFillRectangle(dpy, canvas, gc, rect.r.x + x,
				       rect.r.y + y, w, h);
		    }
		    break;

		case 16:
		    if (!ReadExact(rfbsock, (char *)&pix16, 2))
			return False;

		    gcv.foreground = pix16;
		    XChangeGC(dpy, gc, GCForeground, &gcv);
		    XFillRectangle(dpy, canvas, gc, rect.r.x, rect.r.y,
				   rect.r.w, rect.r.h);

		    if (!ReadExact(rfbsock, buffer, hdr.nSubrects * 6))
			return False;

		    ptr = (CARD8 *)buffer;

		    for (j = 0; j < hdr.nSubrects; j++) {
			pix16 = *(CARD16 *)ptr;
			ptr += 2;
			x = *ptr++;
			y = *ptr++;
			w = *ptr++;
			h = *ptr++;
			gcv.foreground = pix16;
			XChangeGC(dpy, gc, GCForeground, &gcv);
			XFillRectangle(dpy, canvas, gc, rect.r.x + x,
				       rect.r.y + y, w, h);
		    }
		    break;

		case 32:
		    if (!ReadExact(rfbsock, (char *)&pix32, 4))
			return False;

		    gcv.foreground = pix32;
		    XChangeGC(dpy, gc, GCForeground, &gcv);
		    XFillRectangle(dpy, canvas, gc, rect.r.x, rect.r.y,
				   rect.r.w, rect.r.h);

		    if (!ReadExact(rfbsock, buffer, hdr.nSubrects * 8))
			return False;

		    ptr = (CARD8 *)buffer;

		    for (j = 0; j < hdr.nSubrects; j++) {
			pix32 = *(CARD32 *)ptr;
			ptr += 4;
			x = *ptr++;
			y = *ptr++;
			w = *ptr++;
			h = *ptr++;
			gcv.foreground = pix32;
			XChangeGC(dpy, gc, GCForeground, &gcv);
			XFillRectangle(dpy, canvas, gc, rect.r.x + x,
				       rect.r.y + y, w, h);
		    }
		    break;
		}
		break;
	    }

	    case rfbEncodingHextile:
	    {
		switch (myFormat.bitsPerPixel) {
		case 8:
		    if (!HandleHextileEncoding8(rect.r.x, rect.r.y,
						rect.r.w, rect.r.h))
			return False;
		    break;
		case 16:
		    if (!HandleHextileEncoding16(rect.r.x, rect.r.y,
						 rect.r.w, rect.r.h))
			return False;
		    break;
		case 32:
		    if (!HandleHextileEncoding32(rect.r.x, rect.r.y,
						 rect.r.w, rect.r.h))
			return False;
		    break;
		}
		break;
	    }

	    default:
		fprintf(stderr,"%s: unknown rect encoding %d\n",programName,
		       (int)rect.encoding);
		return False;
	    }
	}

	sendUpdateRequest = True;

	break;
    }

    case rfbBell:
	XBell(dpy,100);
	break;

    case rfbServerCutText:
    {
#ifndef NANOX
	char *str;

	if (!ReadExact(rfbsock, ((char *)&msg) + 1,
			 sz_rfbServerCutTextMsg - 1))
	    return False;

	msg.sct.length = Swap32IfLE(msg.sct.length);

	str = malloc(msg.sct.length);

	if (!ReadExact(rfbsock, str, msg.sct.length))
	    return False;

	XSelectInput(dpy, DefaultRootWindow(dpy), 0);
	XStoreBytes(dpy, str, msg.sct.length);
	XSetSelectionOwner(dpy, XA_PRIMARY, None, CurrentTime);
	XSelectInput(dpy, DefaultRootWindow(dpy), PropertyChangeMask);

	free(str);
#endif /* !NANOX*/
	break;
    }

    default:
	fprintf(stderr,"%s: unknown message type %d from VNC server\n",
	       programName,msg.type);
	return False;
    }

    return True;
}


#define GET_PIXEL8(pix, ptr) ((pix) = *(ptr)++)

#define GET_PIXEL16(pix, ptr) (((CARD8*)&(pix))[0] = *(ptr)++, \
			       ((CARD8*)&(pix))[1] = *(ptr)++)

#define GET_PIXEL32(pix, ptr) (((CARD8*)&(pix))[0] = *(ptr)++, \
			       ((CARD8*)&(pix))[1] = *(ptr)++, \
			       ((CARD8*)&(pix))[2] = *(ptr)++, \
			       ((CARD8*)&(pix))[3] = *(ptr)++)

#define DEFINE_HEXTILE(bpp)                                                   \
static Bool                                                                   \
HandleHextileEncoding##bpp(int rx, int ry, int rw, int rh)                    \
{                                                                             \
    CARD##bpp bg, fg;                                                         \
    XGCValues gcv;                                                            \
    int i;                                                                    \
    CARD8 *ptr;                                                               \
    int x, y, w, h;                                                           \
    int sx, sy, sw, sh;                                                       \
    CARD8 subencoding;                                                        \
    CARD8 nSubrects;                                                          \
                                                                              \
    for (y = ry; y < ry+rh; y += 16) {                                        \
        for (x = rx; x < rx+rw; x += 16) {                                    \
            w = h = 16;                                                       \
            if (rx+rw - x < 16)                                               \
                w = rx+rw - x;                                                \
            if (ry+rh - y < 16)                                               \
                h = ry+rh - y;                                                \
                                                                              \
            if (!ReadExact(rfbsock, (char *)&subencoding, 1))                 \
                return False;                                                 \
                                                                              \
            if (subencoding & rfbHextileRaw) {                                \
                if (!ReadExact(rfbsock, buffer, w * h * (bpp / 8)))           \
                    return False;                                             \
                                                                              \
                CopyDataToScreen((CARD8 *)buffer, x, y, w, h);                \
                continue;                                                     \
            }                                                                 \
                                                                              \
            if (subencoding & rfbHextileBackgroundSpecified)                  \
                if (!ReadExact(rfbsock, (char *)&bg, (bpp/8)))                \
                    return False;                                             \
                                                                              \
            if ((bpp == 8) && useBGR233)                                      \
                gcv.foreground = BGR233ToPixel[bg];                           \
            else                                                              \
                gcv.foreground = bg;                                          \
                                                                              \
            XChangeGC(dpy, gc, GCForeground, &gcv);                           \
            XFillRectangle(dpy, canvas, gc, x, y, w, h);                      \
                                                                              \
            if (subencoding & rfbHextileForegroundSpecified)                  \
                if (!ReadExact(rfbsock, (char *)&fg, (bpp/8)))                \
                    return False;                                             \
                                                                              \
            if (!(subencoding & rfbHextileAnySubrects)) {                     \
                continue;                                                     \
            }                                                                 \
                                                                              \
            if (!ReadExact(rfbsock, (char *)&nSubrects, 1))                   \
                return False;                                                 \
                                                                              \
            ptr = (CARD8 *)buffer;                                            \
                                                                              \
            if (subencoding & rfbHextileSubrectsColoured) {                   \
                if (!ReadExact(rfbsock, buffer, nSubrects * (2 + (bpp / 8)))) \
                    return False;                                             \
                                                                              \
                for (i = 0; i < nSubrects; i++) {                             \
                    GET_PIXEL##bpp(fg, ptr);                                  \
                    sx = rfbHextileExtractX(*ptr);                            \
                    sy = rfbHextileExtractY(*ptr);                            \
                    ptr++;                                                    \
                    sw = rfbHextileExtractW(*ptr);                            \
                    sh = rfbHextileExtractH(*ptr);                            \
                    ptr++;                                                    \
                    if ((bpp == 8) && useBGR233)                              \
                        gcv.foreground = BGR233ToPixel[fg];                   \
                    else                                                      \
                        gcv.foreground = fg;                                  \
                                                                              \
                    XChangeGC(dpy, gc, GCForeground, &gcv);                   \
                    XFillRectangle(dpy, canvas, gc, x+sx, y+sy, sw, sh);      \
                }                                                             \
                                                                              \
            } else {                                                          \
                if (!ReadExact(rfbsock, buffer, nSubrects * 2))               \
                    return False;                                             \
                                                                              \
                if ((bpp == 8) && useBGR233)                                  \
                    gcv.foreground = BGR233ToPixel[fg];                       \
                else                                                          \
                    gcv.foreground = fg;                                      \
                                                                              \
                XChangeGC(dpy, gc, GCForeground, &gcv);                       \
                                                                              \
                for (i = 0; i < nSubrects; i++) {                             \
                    sx = rfbHextileExtractX(*ptr);                            \
                    sy = rfbHextileExtractY(*ptr);                            \
                    ptr++;                                                    \
                    sw = rfbHextileExtractW(*ptr);                            \
                    sh = rfbHextileExtractH(*ptr);                            \
                    ptr++;                                                    \
                    XFillRectangle(dpy, canvas, gc, x+sx, y+sy, sw, sh);      \
                }                                                             \
            }                                                                 \
        }                                                                     \
    }                                                                         \
                                                                              \
    return True;                                                              \
}

DEFINE_HEXTILE(8)
DEFINE_HEXTILE(16)
DEFINE_HEXTILE(32)


/*
 * PrintPixelFormat.
 */

void
PrintPixelFormat(format)
    rfbPixelFormat *format;
{
    if (format->bitsPerPixel == 1) {
	fprintf(stderr,"Single bit per pixel.\n");
	fprintf(stderr,
		"%s significant bit in each byte is leftmost on the screen.\n",
		(format->bigEndian ? "Most" : "Least"));
    } else {
	fprintf(stderr,"%d bits per pixel.\n",format->bitsPerPixel);
	if (format->bitsPerPixel != 8) {
	    fprintf(stderr,"%s significant byte first in each pixel.\n",
		    (format->bigEndian ? "Most" : "Least"));
	}
	if (format->trueColour) {
	    fprintf(stderr,"True colour: max red %d green %d blue %d\n",
		    format->redMax, format->greenMax, format->blueMax);
	    fprintf(stderr,"            shift red %d green %d blue %d\n",
		    format->redShift, format->greenShift, format->blueShift);
	} else {
	    fprintf(stderr,"Uses a colour map (not true colour).\n");
	}
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -