kolibrios/programs/network/vncc/rre.inc
2015-08-20 09:30:24 +00:00

173 lines
4.8 KiB
PHP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2010-2015. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;; VNC client for KolibriOS ;;
;; ;;
;; Written by hidnplayr@kolibrios.org ;;
;; ;;
;; GNU GENERAL PUBLIC LICENSE ;;
;; Version 2, June 1991 ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
load_pixel: ; returns in eax
if BITS_PER_PIXEL = 8
xor eax, eax
lodsb
mov eax, [lut_8bpp+eax*4]
else if BITS_PER_PIXEL = 16
push ebx
lodsw
mov bx, ax
shl bx, 5
and bh, 0xfc ; green
mov bl, ah
and bl, 0xf8 ; red
shl ebx, 8
mov bl, al
shl bl, 3
and bl, 0xf8 ; blue
mov eax, ebx
pop ebx
else if BITS_PER_PIXEL = 24
mov eax, [esi]
and eax, 0x00ffffff
add esi, 3
else if BITS_PER_PIXEL = 32
lodsd
end if
ret
encoding_RRE:
DEBUGF 1,"RRE\n"
@@:
lea eax, [esi+4+BYTES_PER_PIXEL]
cmp [datapointer], eax
jae @f
call read_data.more
jmp @b
@@:
lodsd
bswap eax
mov [subrectangles], eax
DEBUGF 1, "%u subrectangles\n", eax
; Calculate first pixel pos
movzx eax, [screen.width]
mul [rectangle.y] ; [screen.width]*[rectangle.y]
add eax, [rectangle.x] ; [screen.width]*[rectangle.y]+[rectangle.x]
lea edi, [framebuffer+eax*3] ; edi = framebuffer_data+([screen.width]*[rectangle.y]+[rectangle.x])*3
; Calculate offset between two rows of pixels
movzx eax, [screen.width]
sub eax, [rectangle.width]
lea ebp, [eax*3] ; ebp = ([screen.width]-[rectangle.width])*3
; Get background color
call load_pixel
; Draw background rectangle
push edi
mov edx, [rectangle.height]
.lineloop:
mov ecx, [rectangle.width]
.pixelloop:
stosw
rol eax, 16
stosb
rol eax, 16
dec ecx
jnz .pixelloop
add edi, ebp
dec edx
jnz .lineloop
pop edi
; Any subrectangles at all?
cmp [subrectangles], 0
je next_rectangle
.subrectangle:
push edi
@@:
lea eax, [esi+8+BYTES_PER_PIXEL]
cmp [datapointer], eax
jae @f
call read_data.more
jmp @b
@@:
; Get subrectangle color
call load_pixel
push eax
; Get coordinates
xor eax, eax
lodsw
xchg al, ah
mov [subrectangle.x], eax
lodsw
xchg al, ah
mov [subrectangle.y], eax
lodsw
xchg al, ah
mov [subrectangle.width], eax
lodsw
xchg al, ah
mov [subrectangle.height], eax
DEBUGF 1, "Subrectangle: x=%u y=%u width=%u height=%u\n", \
[subrectangle.x], [subrectangle.y], [subrectangle.width], [subrectangle.height]
; Calculate pos of first pixel
movzx eax, [screen.width]
mul [subrectangle.y]
add eax, [subrectangle.x]
lea eax, [eax*3]
add edi, eax
; Calculate offset between two rows of pixels
movzx eax, [screen.width]
sub eax, [subrectangle.width]
lea ebp, [eax*3] ; ebp = ([screen.width]-[rectangle.width])*3
; Draw the subrectangle
pop eax
mov edx, [subrectangle.height]
.lineloop2:
mov ecx, [subrectangle.width]
.pixelloop2:
stosw
rol eax, 16
stosb
rol eax, 16
dec ecx
jnz .pixelloop2
add edi, ebp
dec edx
jnz .lineloop2
pop edi
dec [subrectangles]
jnz .subrectangle
jmp next_rectangle