kolibrios-fun/programs/network/vncc/copyrect.inc
hidnplayr 8f52c43d64 VNC viewer: bugfixes and optimization for CopyRect encoding.
git-svn-id: svn://kolibrios.org@5708 a494cfbc-eb01-0410-851d-a64ba20cac60
2015-08-10 11:09:36 +00:00

85 lines
3.2 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 ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
encoding_CopyRect:
DEBUGF 1,"CopyRect\n"
@@:
lea eax, [esi+4]
cmp [datapointer], eax
jae @f
call read_data.more
jmp @b
@@:
push esi
movzx eax, word[esi+2] ; [src.y]
xchg al, ah
movzx ebx, [screen.width]
mul ebx ; [screen.width]*[src.y]
movzx ebx, word[esi] ; [src.x]
xchg bl, bh
add eax, ebx ; [screen.width]*[src.y]+[src.x]
lea esi, [framebuffer_data+eax*3] ; esi = framebuffer_data+([screen.width]*[src.y]+[src.x])*3
mov eax, [rectangle.y]
movzx ebx, [screen.width]
mul ebx ; [screen.width]*[rectangle.y]
add eax, [rectangle.x] ; [screen.width]*[rectangle.y]+[rectangle.x]
lea edi, [framebuffer_data+eax*3] ; edi = framebuffer_data+([screen.width]*[rectangle.y]+[rectangle.x])*3
movzx eax, [screen.width]
sub eax, [rectangle.width]
lea ebp, [eax*3] ; ebp = ([screen.width]-[rectangle.width])*3
cmp esi, edi
ja .not_backwards
; Source pixels come before destination in buffer, copy backwards.
DEBUGF 1,"backwards\n"
mov eax, [rectangle.height]
dec eax
movzx edx, [screen.width]
mul edx
add eax, [rectangle.width]
lea eax, [eax*3-1] ; eax = (([rectangle.height]-1)*[screen.width]+[rectangle.width])*3-1
add esi, eax
add edi, eax
neg ebp
std
.not_backwards:
; Do the actual copying
mov eax, [rectangle.width]
lea eax, [eax*3]
mov ebx, eax
and eax, 11b
shr ebx, 2
mov edx, [rectangle.height]
.lineloop:
mov ecx, eax
rep movsb
mov ecx, ebx
rep movsd
add esi, ebp
add edi, ebp
dec edx
jnz .lineloop
pop esi
add esi, 4
cld
jmp next_rectangle