diff --git a/programs/network/vncc/raw.inc b/programs/network/vncc/raw.inc index 990a85d513..6c3839e3ac 100644 --- a/programs/network/vncc/raw.inc +++ b/programs/network/vncc/raw.inc @@ -38,8 +38,7 @@ end if mov eax, [rectangle.y] movzx ebx, [screen.width] mul ebx ; [screen.width]*[rectangle.y] - mov ebx, [rectangle.x] - add eax, ebx ; [screen.width]*[rectangle.y]+[rectangle.x] + 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] diff --git a/programs/network/vncc/rre.inc b/programs/network/vncc/rre.inc index b9e5c9cca4..333c3e639a 100644 --- a/programs/network/vncc/rre.inc +++ b/programs/network/vncc/rre.inc @@ -14,9 +14,18 @@ pixel_to_24bpp: ; returns in ecx + push eax + @@: + lea eax, [esi+BYTES_PER_PIXEL] + cmp [datapointer], eax + jae @f + call read_data.more + jmp @b + @@: + if BITS_PER_PIXEL = 8 - push eax ebx + push ebx mov bl, 36 mov al, [esi] @@ -39,11 +48,10 @@ if BITS_PER_PIXEL = 8 mov cl, al ; blue inc esi - pop ebx eax + pop ebx else if BITS_PER_PIXEL = 16 - push eax lodsw mov cl, ah and al, 0xf8 ; red @@ -56,7 +64,6 @@ else if BITS_PER_PIXEL = 16 mov cl, al shl cl, 3 and cx, 0x00f8 ; blue - pop eax else @@ -67,6 +74,7 @@ else add esi, 3 end if + pop eax ret diff --git a/programs/network/vncc/trle.inc b/programs/network/vncc/trle.inc new file mode 100644 index 0000000000..e2cee6d40d --- /dev/null +++ b/programs/network/vncc/trle.inc @@ -0,0 +1,516 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 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 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +create_palette: + + push ecx edx edi + mov dl, [palettesize] + DEBUGF 1, "Loading palette of %u colors\n", dl + mov edi, palette + .loop: + call pixel_to_24bpp + mov [edi], ecx + add edi, 4 + dec dl + jnz .loop + pop edi edx ecx + + ret + + +encoding_TRLE: + + DEBUGF 1, "TRLE\n" + + mov [subrectangle.x], 0 + mov [subrectangle.y], 0 + .tile: + mov eax, [rectangle.width] + sub eax, [subrectangle.x] + cmp eax, 16 + jb @f + mov eax, 16 + @@: + mov [subrectangle.width], eax + + mov edx, [rectangle.height] + sub edx, [subrectangle.y] + cmp edx, 16 + jb @f + mov edx, 16 + @@: + mov [subrectangle.height], edx + DEBUGF 1, "Subrectangle: x=%u y=%u width=%u height=%u ", \ + [subrectangle.x], [subrectangle.y], [subrectangle.width], [subrectangle.height] + +; Calculate first pixel pos + mov eax, [rectangle.y] + add eax, [subrectangle.y] + movzx ebx, [screen.width] + mul ebx + add eax, [rectangle.x] + add eax, [subrectangle.x] + lea edi, [framebuffer_data+eax*3] + +; Calculate offset between two rows of pixels + movzx eax, [screen.width] + sub eax, [subrectangle.width] + lea ebp, [eax*3] + + mov edx, [subrectangle.height] + + @@: + lea eax, [esi+1] + cmp [datapointer], eax + jae @f + call read_data.more + jmp @b + @@: + lodsb ; subencoding type + DEBUGF 1, "encoding=%u\n", al + test al, al + jz .raw + cmp al, 1 + je .solid + cmp al, 16 + jbe .palette_packed + cmp al, 127 + je .reuse_palette + jb .invalid + and al, 0x7f + jz .plain_rle + cmp al, 1 + je .prle_reuse_palette + +; Palette Run Length Encoded tile + mov [palettesize], al + call create_palette + .prle_reuse_palette: + DEBUGF 1, "Pallete RLE tile\n" + + mov eax, 1 + .prle_line: + mov ebx, [subrectangle.width] + .prle_pixel: + dec eax + jz .prle_reload + + mov word[edi], cx + rol ecx, 16 + add edi, 2 + mov byte[edi], cl + rol ecx, 16 + inc edi + dec ebx + jnz .prle_pixel + + add edi, ebp + dec edx + jnz .prle_line + jmp .next_tile + + .prle_reload: + @@: + lea eax, [esi+1] + cmp [datapointer], eax + jae @f + call read_data.more + jmp @b + @@: +; load palette index and get color from palette + xor eax, eax + lodsb + push ebx + mov bl, al + and al, 0x7f + mov ecx, [palette+eax*4] + +; run length follows? + xor eax, eax + test bl, 0x80 + pop ebx + jz .plength_ok + + @@: + lea eax, [esi+1] + cmp [datapointer], eax + jae @f + call read_data.more + jmp @b + @@: + +; load runlength + push ebx + xor eax, eax + xor ebx, ebx + @@: + lodsb + cmp al, 255 + jne @f + add ebx, eax + jmp @b + @@: + add eax, ebx + pop ebx + .plength_ok: + add eax, 2 + jmp .prle_pixel + + + + +; Run Length Encoded tile + .plain_rle: + + DEBUGF 1, "Plain RLE tile\n" + + mov eax, 1 + .rle_line: + mov ebx, [subrectangle.width] + .rle_pixel: + dec eax + jz .rle_reload + + mov word[edi], cx + rol ecx, 16 + add edi, 2 + mov byte[edi], cl + rol ecx, 16 + inc edi + dec ebx + jnz .rle_pixel + add edi, ebp + dec edx + jnz .rle_line + jmp .next_tile + + .rle_reload: + ; load pixel value + call pixel_to_24bpp + + @@: + lea eax, [esi+1] + cmp [datapointer], eax + jae @f + call read_data.more + jmp @b + @@: + + ; load length + xor eax, eax + push ebx + xor ebx, ebx + @@: + lodsb + cmp al, 255 + jne @f + add ebx, eax + jmp @b + @@: + add eax, ebx + add eax, 2 + pop ebx + jmp .rle_pixel + + + + .reuse_palette: + cmp [palettesize], 1 + jne .reuse_palette_ + mov ecx, [palette] + mov eax, ecx + shr eax, 16 + jmp .solid_line + +; Palette packed tile + .palette_packed: + DEBUGF 1, "Palette packed tile\n" + + mov [palettesize], al + call create_palette + + .reuse_palette_: + cmp [palettesize], 2 + je .palette_1bit + cmp [palettesize], 4 + jbe .palette_2bit + jmp .palette_4bit + + .palette_1bit: + DEBUGF 1, "1-bit palette\n" + .palette_1bit_line: + mov ebx, [subrectangle.width] + .palette_1bit_byte: + lodsb + rol al, 1 + mov ecx, eax + and eax, 0x1 + mov eax, [palette+4*eax] + stosw + shr eax, 16 + stosb + dec ebx + jz .palette_1bit_next_line + + rol cl, 1 + mov eax, ecx + and eax, 0x1 + mov eax, [palette+4*eax] + stosw + shr eax, 16 + stosb + dec ebx + jz .palette_1bit_next_line + + rol cl, 1 + mov eax, ecx + and eax, 0x1 + mov eax, [palette+4*eax] + stosw + shr eax, 16 + stosb + dec ebx + jz .palette_1bit_next_line + + rol cl, 1 + mov eax, ecx + and eax, 0x1 + mov eax, [palette+4*eax] + stosw + shr eax, 16 + stosb + dec ebx + jz .palette_1bit_next_line + + rol cl, 1 + mov eax, ecx + and eax, 0x1 + mov eax, [palette+4*eax] + stosw + shr eax, 16 + stosb + dec ebx + jz .palette_1bit_next_line + + rol cl, 1 + mov eax, ecx + and eax, 0x1 + mov eax, [palette+4*eax] + stosw + shr eax, 16 + stosb + dec ebx + jz .palette_1bit_next_line + + rol cl, 1 + mov eax, ecx + and eax, 0x1 + mov eax, [palette+4*eax] + stosw + shr eax, 16 + stosb + dec ebx + jz .palette_1bit_next_line + + rol cl, 1 + and ecx, 0x1 + mov eax, [palette+4*ecx] + stosw + shr eax, 16 + stosb + dec ebx + jnz .palette_1bit_byte + + .palette_1bit_next_line: + add edi, ebp + dec edx + jnz .palette_1bit_line + jmp .next_tile + + + + .palette_2bit: + DEBUGF 1, "2-bit palette\n" + .palette_2bit_line: + mov ebx, [subrectangle.width] + .palette_2bit_byte: + lodsb + mov ecx, eax + and eax, 0xc0 + shr eax, 4 + mov eax, [palette+eax] + stosw + shr eax, 16 + stosb + dec ebx + jz .palette_2bit_next_line + + mov eax, ecx + and eax, 0x30 + shr eax, 2 + mov eax, [palette+eax] + stosw + shr eax, 16 + stosb + dec ebx + jz .palette_2bit_next_line + + mov eax, ecx + and eax, 0x0c + mov eax, [palette+eax] + stosw + shr eax, 16 + stosb + dec ebx + jz .palette_2bit_next_line + + and ecx, 0x03 + mov eax, [palette+4*ecx] + stosw + shr eax, 16 + stosb + dec ebx + jnz .palette_2bit_byte + + .palette_2bit_next_line: + add edi, ebp + dec edx + jnz .palette_2bit_line + jmp .next_tile + + + + + .palette_4bit: + DEBUGF 1, "4-bit palette\n" + .palette_4bit_line: + mov ebx, [subrectangle.width] + .palette_4bit_byte: + lodsb + mov cl, al + and eax, 0xf0 + shr eax, 2 + mov eax, [palette+eax] + stosw + shr eax, 16 + stosb + dec ebx + jz .palette_4bit_next_line + + and ecx, 0x0f + shl ecx, 2 + mov eax, [palette+ecx] + stosw + shr eax, 16 + stosb + dec ebx + jnz .palette_4bit_byte + .palette_4bit_next_line: + add edi, ebp + dec edx + jnz .palette_4bit_line + jmp .next_tile + + +; RAW tile + .raw: + push edx + mov eax, [subrectangle.width] + mul [subrectangle.height] + lea eax, [eax*3] + pop edx + + @@: + push eax + add eax, esi + cmp [datapointer], eax + jae @f + call read_data.more + pop eax + jmp @b + @@: + pop eax + + DEBUGF 1, "RAW tile\n" + .raw_line: + mov ebx, [subrectangle.width] + .raw_pixel: + call pixel_to_24bpp + mov word[edi], cx + shr ecx, 16 + add edi, 2 + mov byte[edi], cl + inc edi + dec ebx + jnz .raw_pixel + add edi, ebp + dec edx + jnz .raw_line + jmp .next_tile + + + +; Single color tile + .solid: + DEBUGF 1, "Solid tile\n" + call pixel_to_24bpp + mov eax, ecx + shr eax, 16 + + mov [palettesize], 1 + mov [palette], ecx + + .solid_line: + mov ebx, [subrectangle.width] + .solid_pixel: + mov [edi], cx + add edi, 2 + mov [edi], al + inc edi + dec ebx + jnz .solid_pixel + add edi, ebp + dec edx + jnz .solid_line +; jmp .next_tile + + + +; Go to the next tile + .next_tile: + mov eax, [subrectangle.x] + add eax, 16 + cmp eax, [rectangle.width] + jae .next_row + mov [subrectangle.x], eax + jmp .tile + .next_row: + mov [subrectangle.x], 0 + mov eax, [subrectangle.y] + add eax, 16 + cmp eax, [rectangle.height] + jae .done + mov [subrectangle.y], eax + jmp .tile + + .invalid: + DEBUGF 2, "Invalid subencoding type!\n" + .fail: + DEBUGF 2, "TRLE failed!\n" + jmp next_rectangle + + .done: + DEBUGF 1, "TRLE complete!\n" + jmp next_rectangle \ No newline at end of file diff --git a/programs/network/vncc/vncc.asm b/programs/network/vncc/vncc.asm index a60348188a..0a9661e1e4 100644 --- a/programs/network/vncc/vncc.asm +++ b/programs/network/vncc/vncc.asm @@ -93,6 +93,7 @@ include "network.inc" include "raw.inc" include "copyrect.inc" include "rre.inc" +include "trle.inc" include "des.inc" START: @@ -438,6 +439,9 @@ screen: ; Remote screen resolution .height dw ? .width dw ? +palette rd 128 ; TRLE/ZRLE +palettesize db ? ; TRLE/ZRLE + keymap rw 128 keymap_shift rw 128 keymap_alt rw 128