add rle algorithm
This commit is contained in:
@@ -35,7 +35,7 @@ def decode(src, width, height, colorType):
|
|||||||
"""
|
"""
|
||||||
lastopcode = -1
|
lastopcode = -1
|
||||||
x = width
|
x = width
|
||||||
prevline = 0
|
prevLine = 0
|
||||||
code = UInt8()
|
code = UInt8()
|
||||||
opcode = UInt8()
|
opcode = UInt8()
|
||||||
color1 = colorType()
|
color1 = colorType()
|
||||||
@@ -46,8 +46,7 @@ def decode(src, width, height, colorType):
|
|||||||
fom_mask = 0
|
fom_mask = 0
|
||||||
mask = 0
|
mask = 0
|
||||||
line = 0
|
line = 0
|
||||||
typeSize = sizeof(colorType())
|
dst = [colorType()] * width * height
|
||||||
dst = Stream("\x00" * (width * height * typeSize))
|
|
||||||
|
|
||||||
while src.dataLen() > 0:
|
while src.dataLen() > 0:
|
||||||
#compute orders
|
#compute orders
|
||||||
@@ -87,7 +86,7 @@ def decode(src, width, height, colorType):
|
|||||||
|
|
||||||
|
|
||||||
if opcode == 0:
|
if opcode == 0:
|
||||||
if lastopcode == opcode and not (x == width and prevline == 0):
|
if lastopcode == opcode and not (x == width and prevLine == 0):
|
||||||
insertMix = True
|
insertMix = True
|
||||||
elif opcode == 3 or opcode == 8:
|
elif opcode == 3 or opcode == 8:
|
||||||
src.readType(color2)
|
src.readType(color2)
|
||||||
@@ -109,13 +108,73 @@ def decode(src, width, height, colorType):
|
|||||||
raise InvalidExpectedDataException("In RLE decompression height must be greater than 0")
|
raise InvalidExpectedDataException("In RLE decompression height must be greater than 0")
|
||||||
x = 0
|
x = 0
|
||||||
height -= 1
|
height -= 1
|
||||||
prevline = line
|
prevLine = line
|
||||||
line = width * height * typeSize
|
line = width * height
|
||||||
|
|
||||||
|
#fill
|
||||||
if opcode == 0:
|
if opcode == 0:
|
||||||
if insertMix:
|
if insertMix:
|
||||||
pass
|
if prevLine == 0:
|
||||||
|
dst[line + x] = mix
|
||||||
|
else:
|
||||||
|
dst[line + x] = dst[prevLine + x] ^ mix
|
||||||
|
insertMix = False
|
||||||
|
count -= 1
|
||||||
|
x += 1
|
||||||
|
|
||||||
return dst
|
if prevLine == 0:
|
||||||
|
while count > 0 and x < width:
|
||||||
|
dst[line + x] = colorType()
|
||||||
|
count -= 1
|
||||||
|
x += 1
|
||||||
|
else:
|
||||||
|
while count > 0 and x < width:
|
||||||
|
dst[line + x] = dst[prevLine + x]
|
||||||
|
count -= 1
|
||||||
|
x += 1
|
||||||
|
#mix
|
||||||
|
elif opcode == 1:
|
||||||
|
if prevLine == 0:
|
||||||
|
while count > 0 and x < width:
|
||||||
|
dst[line + x] = mix
|
||||||
|
count -= 1
|
||||||
|
x += 1
|
||||||
|
else:
|
||||||
|
while count > 0 and x < width:
|
||||||
|
dst[line + x] = dst[prevLine + x] ^ mix
|
||||||
|
count -= 1
|
||||||
|
x += 1
|
||||||
|
#fill or mix
|
||||||
|
elif opcode == 2:
|
||||||
|
pass
|
||||||
|
#color
|
||||||
|
elif opcode == 3:
|
||||||
|
while count > 0 and x < width:
|
||||||
|
dst[line + x] = color2
|
||||||
|
count -= 1
|
||||||
|
x += 1
|
||||||
|
#copy
|
||||||
|
elif opcode == 4:
|
||||||
|
while count > 0 and x < width:
|
||||||
|
src.readType(dst[line + x])
|
||||||
|
count -= 1
|
||||||
|
x += 1
|
||||||
|
#bicolor
|
||||||
|
elif opcode == 8:
|
||||||
|
pass
|
||||||
|
#write
|
||||||
|
elif opcode == 0xd:
|
||||||
|
while count > 0 and x < width:
|
||||||
|
dst[line + x] = ~colorType()
|
||||||
|
count -= 1
|
||||||
|
x += 1
|
||||||
|
elif opcode == 0xe:
|
||||||
|
while count > 0 and x < width:
|
||||||
|
dst[line + x] = colorType()
|
||||||
|
count -= 1
|
||||||
|
x += 1
|
||||||
|
output = Stream()
|
||||||
|
output.writeType(dst)
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
@@ -9,6 +9,8 @@ sys.path.insert(1, os.path.join(sys.path[0], '../..'))
|
|||||||
from rdpy.protocol.rdp import rdp
|
from rdpy.protocol.rdp import rdp
|
||||||
|
|
||||||
class TestServerFactory(rdp.ServerFactory):
|
class TestServerFactory(rdp.ServerFactory):
|
||||||
|
def __init__(self):
|
||||||
|
rdp.ServerFactory.__init__(self, "/tmp/private.pem", "/tmp/certificate.pem")
|
||||||
def startedConnecting(self, connector):
|
def startedConnecting(self, connector):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user