#!/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.

$saw_mark = 0;
$done = 0;

while (<>) {
	if (! $saw_mark && /case rfbEncodingServerIdentity:/) 		{
		$saw_mark = 1;
	}
	if ($saw_mark && !$done && /default:/) {
		print;

		print <<END;
                /* for turbovnc */
#define rfbJpegQualityLevel1       0xFFFFFE01
#define rfbJpegQualityLevel100     0xFFFFFE64
#define rfbJpegSubsamp1X           0xFFFFFD00
#define rfbJpegSubsamp4X           0xFFFFFD01
#define rfbJpegSubsamp2X           0xFFFFFD02
#define rfbJpegSubsampGray         0xFFFFFD03

                if ( enc >= (uint32_t)rfbJpegSubsamp1X &&
                         enc <= (uint32_t)rfbJpegSubsampGray ) {
                    /* XXX member really should be tightSubsample not correMaxWidth */
                    cl->correMaxWidth = enc & 0xFF;
                    rfbLog("Using JPEG subsampling %d for client %s\\n",
                           cl->correMaxWidth, cl->host);
                } else if ( enc >= (uint32_t)rfbEncodingQualityLevel0 &&
                            enc <= (uint32_t)rfbEncodingQualityLevel9 ) {
                    static int JPEG_QUAL[10] = {
                       5, 10, 15, 25, 37, 50, 60, 70, 75, 80
                    };
                    cl->tightQualityLevel = JPEG_QUAL[enc & 0x0F];
                    /* XXX member really should be tightSubsample not correMaxWidth */
                    cl->correMaxWidth = 2;
                    rfbLog("Using image level Subsample %d  Quality %d for client %s\\n",
                           cl->correMaxWidth, cl->tightQualityLevel, cl->host);
                } else if ( enc >= (uint32_t)rfbJpegQualityLevel1 &&
                            enc <= (uint32_t)rfbJpegQualityLevel100 ) {
                    cl->tightQualityLevel = enc & 0xFF;
                    rfbLog("Using image quality level %d for client %s\\n",
                           cl->tightQualityLevel, cl->host);
                } else
END
		$done = 1;
		next;
	}
	print;
}
