#!/usr/bin/perl
#
# This script has been (or is hereby) released into the public domain by
# its author, Karl J. Runge <runge@karlrunge.com>. This applies worldwide.
# 
# In case this is not legally possible: Karl J. Runge grants anyone the
# right to use this work for any purpose, without any conditions, unless
# such conditions are required by law.

while (<>) {
	if (/^#include.*"rfb.h"/) {
		print <<END;
#include <rfb/rfb.h>
#define Bool rfbBool
#define CARD32 uint32_t
#define CARD16 uint16_t
#define CARD8 uint8_t
#define xalloc malloc
#define xrealloc realloc
#define rfbTightNoZlib 0x0A
#define tightSubsampLevel correMaxWidth

#if LIBVNCSERVER_HAVE_LIBPTHREAD && LIBVNCSERVER_HAVE_TLS
#define TLS __thread
#else
#define TLS
#endif

END
		next;
	}
	foreach $func (qw(FindBestSolidArea ExtendSolidArea CheckSolidTile CheckSolidTile##bpp CheckSolidTile8 CheckSolidTile16 CheckSolidTile32 Pack24)) {
		if (/static.*\b\Q$func\E\b/ && !exists $did_static{$func}) {
			$_ =~ s/\b\Q$func\E\b(\s*)\(/$func$1(rfbClientPtr cl, /;
			$did_static{$func} = 1;
		} elsif (/\b\Q$func\E\b\s*\(/) {
			$_ =~ s/\b\Q$func\E\b(\s*)\(/$func$1(cl, /;
		}
	}

#	if (/^\s*subsampLevel\s*=\s*cl/) {
#		$_ = "//$_";
#		print "subsampLevel = 0;\n";
#	}

#	$_ =~ s/cl->tightQualityLevel;/cl->tightQualityLevel * 10;/;

	if (/^static\s+(Bool|int|CARD32|PALETTE|char|unsigned|tjhandle)\s+[^()]*;\s*$/) {
		$_ =~ s/^static/static TLS /;
	}

	$_ =~ s/rfbScreen.pfbMemory/cl->scaledScreen->frameBuffer/g;
	$_ =~ s/rfbScreen.paddedWidthInBytes/cl->scaledScreen->paddedWidthInBytes/g;
	$_ =~ s/rfbScreen.bitsPerPixel/cl->scaledScreen->bitsPerPixel/g;
	$_ =~ s/rfbServerFormat/cl->screen->serverFormat/g;

	if (/^(FindBestSolidArea|ExtendSolidArea|static void Pack24|CheckSolidTile)\(cl/) {
		$_ .= "rfbClientPtr cl;\n";
	}
	if (/^(CheckSolidTile##bpp)\(cl/) {
		$_ .= "rfbClientPtr cl; \\\n";
	}
	$_ =~ s/\bublen\b/cl->ublen/;
	$_ =~ s/\bupdateBuf\b/cl->updateBuf/;

	if (/cl->(rfbRectanglesSent|rfbBytesSent)/) {
		$_ = "//$_";
	}
	print;
}

print <<END;

void rfbTightCleanup(rfbScreenInfoPtr screen) {
}

END


