55 lines
1.9 KiB
Python
55 lines
1.9 KiB
Python
from . import common
|
|
from struct import *
|
|
from lib import log
|
|
import zlib
|
|
|
|
|
|
class Encoding:
|
|
name = 'zlib'
|
|
id = 6
|
|
description = 'zlib VNC encoding'
|
|
enabled = True
|
|
firstUpdateSent = False
|
|
_compressObj = None
|
|
|
|
def __init__(self):
|
|
log.debug("Initialized", __name__)
|
|
self._compressObj = zlib.compressobj(
|
|
zlib.Z_DEFAULT_COMPRESSION, # level: 0-9
|
|
zlib.DEFLATED, # method: must be DEFLATED
|
|
zlib.MAX_WBITS, # window size in bits:
|
|
# -15..-8: negate, suppress header
|
|
# 8..15: normal
|
|
# 16..30: subtract 16, gzip header
|
|
zlib.DEF_MEM_LEVEL, # mem level: 1..8/9
|
|
zlib.Z_DEFAULT_STRATEGY # strategy:
|
|
# 0 = Z_DEFAULT_STRATEGY
|
|
# 1 = Z_FILTERED
|
|
# 2 = Z_HUFFMAN_ONLY
|
|
# 3 = Z_RLE
|
|
# 4 = Z_FIXED
|
|
)
|
|
|
|
def send_image(self, x, y, w, h, image):
|
|
sendbuff = bytearray()
|
|
|
|
rectangles = 1
|
|
sendbuff.extend(pack("!BxH", 0, rectangles)) # message type 0 == FramebufferUpdate
|
|
sendbuff.extend(pack("!HHHH", x, y, w, h))
|
|
sendbuff.extend(pack(">i", self.id))
|
|
|
|
#log.debug("Compressing...")
|
|
zlibdata = self._compressObj.compress( image.tobytes() )
|
|
zlibdata += self._compressObj.flush(zlib.Z_FULL_FLUSH)
|
|
#log.debug("LEN", len(zlibdata))
|
|
|
|
l = pack("!I", len(zlibdata) )
|
|
sendbuff.extend( l ) # send length
|
|
sendbuff.extend( zlibdata ) # send compressed data
|
|
|
|
return sendbuff
|
|
|
|
common.encodings[common.ENCODINGS.zlib] = Encoding
|
|
|
|
log.debug("Loaded encoding: %s (%s)" % (__name__, Encoding.id))
|