forked from KolibriOS/kolibrios
VNC Viewer: support for 32bpp, bugfixes.
git-svn-id: svn://kolibrios.org@5722 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
82fee6f311
commit
35f6e3767b
@ -33,13 +33,13 @@ encoding_CopyRect:
|
|||||||
movzx ebx, word[esi] ; [src.x]
|
movzx ebx, word[esi] ; [src.x]
|
||||||
xchg bl, bh
|
xchg bl, bh
|
||||||
add eax, ebx ; [screen.width]*[src.y]+[src.x]
|
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
|
lea esi, [framebuffer+eax*3] ; esi = framebuffer_data+([screen.width]*[src.y]+[src.x])*3
|
||||||
|
|
||||||
mov eax, [rectangle.y]
|
mov eax, [rectangle.y]
|
||||||
movzx ebx, [screen.width]
|
movzx ebx, [screen.width]
|
||||||
mul ebx ; [screen.width]*[rectangle.y]
|
mul ebx ; [screen.width]*[rectangle.y]
|
||||||
add eax, [rectangle.x] ; [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
|
lea edi, [framebuffer+eax*3] ; edi = framebuffer_data+([screen.width]*[rectangle.y]+[rectangle.x])*3
|
||||||
|
|
||||||
movzx eax, [screen.width]
|
movzx eax, [screen.width]
|
||||||
sub eax, [rectangle.width]
|
sub eax, [rectangle.width]
|
||||||
|
@ -234,6 +234,8 @@ draw_gui:
|
|||||||
mcall 18, 18, [thread_id] ; kill thread
|
mcall 18, 18, [thread_id] ; kill thread
|
||||||
.ok:
|
.ok:
|
||||||
and [URLbox.flags], not ed_disabled
|
and [URLbox.flags], not ed_disabled
|
||||||
|
mov [USERbox.size], 0
|
||||||
|
mov [PASSbox.size], 0
|
||||||
mov [status], STATUS_CONNECT
|
mov [status], STATUS_CONNECT
|
||||||
inc [update_gui]
|
inc [update_gui]
|
||||||
jmp .loop
|
jmp .loop
|
||||||
|
@ -71,8 +71,10 @@ thread_start:
|
|||||||
je err_connect
|
je err_connect
|
||||||
|
|
||||||
; Verify handshake from server
|
; Verify handshake from server
|
||||||
call wait_for_data
|
call read_data
|
||||||
cmp dword[receive_buffer], "RFB "
|
cmp eax, 12
|
||||||
|
jb err_proto
|
||||||
|
cmp dword[esi], "RFB "
|
||||||
jne err_proto
|
jne err_proto
|
||||||
add esi, 12
|
add esi, 12
|
||||||
|
|
||||||
@ -89,7 +91,9 @@ thread_start:
|
|||||||
mcall send, [socketnum], HandShake, 12, 0
|
mcall send, [socketnum], HandShake, 12, 0
|
||||||
|
|
||||||
; VNC 3.3 protocol: server decides security type
|
; VNC 3.3 protocol: server decides security type
|
||||||
call wait_for_data
|
call read_data
|
||||||
|
cmp eax, 4
|
||||||
|
jb err_proto
|
||||||
lodsd
|
lodsd
|
||||||
cmp eax, 0x00000000
|
cmp eax, 0x00000000
|
||||||
je err_handshake
|
je err_handshake
|
||||||
@ -101,6 +105,10 @@ thread_start:
|
|||||||
|
|
||||||
vnc_security:
|
vnc_security:
|
||||||
|
|
||||||
|
lea eax, [esi+8]
|
||||||
|
cmp [datapointer], eax
|
||||||
|
jb err_proto
|
||||||
|
|
||||||
push esi ; pointer to message
|
push esi ; pointer to message
|
||||||
|
|
||||||
mov dword[password], 0
|
mov dword[password], 0
|
||||||
@ -196,53 +204,62 @@ vnc_security:
|
|||||||
|
|
||||||
securityresult:
|
securityresult:
|
||||||
; Wait for SecurityResult from server
|
; Wait for SecurityResult from server
|
||||||
call wait_for_data
|
call read_data
|
||||||
cmp dword[receive_buffer], 0 ; OK
|
cmp eax, 4
|
||||||
|
jb err_proto
|
||||||
|
cmp dword[esi], 0 ; OK
|
||||||
jne err_login
|
jne err_login
|
||||||
|
|
||||||
initialize:
|
initialize:
|
||||||
DEBUGF 1, "Sending ClientInit\n"
|
DEBUGF 1, "Sending ClientInit\n"
|
||||||
mcall send, [socketnum], ClientInit, 1, 0
|
mcall send, [socketnum], ClientInit, 1, 0
|
||||||
|
|
||||||
call wait_for_data ; now the server should send init message
|
call read_data ; now the server should send init message
|
||||||
|
cmp eax, ServerInit.name
|
||||||
|
jb err_proto
|
||||||
|
|
||||||
DEBUGF 1, "Serverinit: bpp: %u depth: %u bigendian: %u truecolor: %u\n", \
|
DEBUGF 2, "Serverinit: bpp: %u depth: %u bigendian: %u truecolor: %u\n", \
|
||||||
[receive_buffer+framebuffer.pixelformat.bpp]:1, \
|
[esi+ServerInit.pixelformat.bpp]:1, \
|
||||||
[receive_buffer+framebuffer.pixelformat.depth]:1, \
|
[esi+ServerInit.pixelformat.depth]:1, \
|
||||||
[receive_buffer+framebuffer.pixelformat.big_endian]:1, \
|
[esi+ServerInit.pixelformat.big_endian]:1, \
|
||||||
[receive_buffer+framebuffer.pixelformat.true_color]:1
|
[esi+ServerInit.pixelformat.true_color]:1
|
||||||
|
|
||||||
mov eax, dword[receive_buffer+framebuffer.width]
|
mov eax, dword[esi+ServerInit.width]
|
||||||
mov dword[FramebufferUpdateRequest.width], eax
|
mov dword[FramebufferUpdateRequest.width], eax
|
||||||
bswap eax
|
bswap eax
|
||||||
mov dword[screen], eax
|
mov dword[screen], eax
|
||||||
DEBUGF 1, "Screen width=%u, height=%u\n", [screen.width]:2, [screen.height]:2
|
DEBUGF 1, "Screen width=%u, height=%u\n", [screen.width]:2, [screen.height]:2
|
||||||
|
|
||||||
|
; Set main window caption to servername
|
||||||
|
mov ecx, dword[esi+ServerInit.name_length]
|
||||||
|
bswap ecx
|
||||||
|
add esi, ServerInit.name
|
||||||
|
lea eax, [esi+ecx]
|
||||||
|
cmp [datapointer], eax
|
||||||
|
jb err_proto
|
||||||
|
cmp ecx, 64 ; Limit name length to 64 chars
|
||||||
|
jbe @f
|
||||||
|
mov ecx, 64
|
||||||
|
@@:
|
||||||
|
mov edi, servername
|
||||||
|
rep movsb
|
||||||
|
mov byte[edi], 0
|
||||||
|
mov [name.dash], "-"
|
||||||
|
|
||||||
DEBUGF 1, "Sending pixel format\n"
|
DEBUGF 1, "Sending pixel format\n"
|
||||||
if BITS_PER_PIXEL = 8
|
if BITS_PER_PIXEL = 8
|
||||||
mcall send, [socketnum], SetPixelFormat8, 20, 0
|
mcall send, [socketnum], SetPixelFormat8, 20, 0
|
||||||
else if BITS_PER_PIXEL = 16
|
else if BITS_PER_PIXEL = 16
|
||||||
mcall send, [socketnum], SetPixelFormat16, 20, 0
|
mcall send, [socketnum], SetPixelFormat16, 20, 0
|
||||||
else
|
else if BITS_PER_PIXEL = 24
|
||||||
mcall send, [socketnum], SetPixelFormat24, 20, 0
|
mcall send, [socketnum], SetPixelFormat24, 20, 0
|
||||||
|
else
|
||||||
|
mcall send, [socketnum], SetPixelFormat32, 20, 0
|
||||||
end if
|
end if
|
||||||
|
|
||||||
DEBUGF 1, "Sending encoding info\n"
|
DEBUGF 1, "Sending encoding info\n"
|
||||||
mcall send, [socketnum], SetEncodings, SetEncodings.length, 0
|
mcall send, [socketnum], SetEncodings, SetEncodings.length, 0
|
||||||
|
|
||||||
; Set main window caption to servername
|
|
||||||
mov ecx, dword[receive_buffer+framebuffer.name_length]
|
|
||||||
bswap ecx
|
|
||||||
cmp ecx, 64
|
|
||||||
jbe @f
|
|
||||||
mov ecx, 64
|
|
||||||
@@:
|
|
||||||
lea esi, [receive_buffer+framebuffer.name]
|
|
||||||
mov edi, servername
|
|
||||||
rep movsb
|
|
||||||
mov byte[edi], 0
|
|
||||||
mov [name.dash], "-"
|
|
||||||
|
|
||||||
; Tell the main thread we are ready for business!
|
; Tell the main thread we are ready for business!
|
||||||
mov [status], STATUS_CONNECTED
|
mov [status], STATUS_CONNECTED
|
||||||
|
|
||||||
@ -443,17 +460,6 @@ read_data:
|
|||||||
jmp .more
|
jmp .more
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
wait_for_data: ; FIXME: add timeout
|
|
||||||
mcall recv, [socketnum], receive_buffer, 4096, 0 ; MSG_DONTWAIT
|
|
||||||
cmp eax, -1
|
|
||||||
je err_sock
|
|
||||||
test eax, eax
|
|
||||||
jz err_disconnected
|
|
||||||
mov esi, receive_buffer
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
err_disconnected:
|
err_disconnected:
|
||||||
mov [status], STATUS_DISCONNECTED
|
mov [status], STATUS_DISCONNECTED
|
||||||
inc [update_gui]
|
inc [update_gui]
|
||||||
@ -465,6 +471,8 @@ err_dns:
|
|||||||
mcall -1
|
mcall -1
|
||||||
|
|
||||||
err_sock:
|
err_sock:
|
||||||
|
; TODO: distinguish between different socket errors!
|
||||||
|
DEBUGF 2, "Socket error: %u\n", ebx
|
||||||
mov [status], STATUS_SOCK_ERR
|
mov [status], STATUS_SOCK_ERR
|
||||||
inc [update_gui]
|
inc [update_gui]
|
||||||
mcall -1
|
mcall -1
|
||||||
|
@ -23,6 +23,8 @@ if BITS_PER_PIXEL = 16
|
|||||||
shl eax, 1
|
shl eax, 1
|
||||||
else if BITS_PER_PIXEL = 24
|
else if BITS_PER_PIXEL = 24
|
||||||
lea eax, [eax*2+eax]
|
lea eax, [eax*2+eax]
|
||||||
|
else if BITS_PER_PIXEL = 32
|
||||||
|
shl eax, 2
|
||||||
end if
|
end if
|
||||||
@@:
|
@@:
|
||||||
push eax
|
push eax
|
||||||
@ -39,7 +41,7 @@ end if
|
|||||||
movzx ebx, [screen.width]
|
movzx ebx, [screen.width]
|
||||||
mul ebx ; [screen.width]*[rectangle.y]
|
mul ebx ; [screen.width]*[rectangle.y]
|
||||||
add eax, [rectangle.x] ; [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
|
lea edi, [framebuffer+eax*3] ; edi = framebuffer_data+([screen.width]*[rectangle.y]+[rectangle.x])*3
|
||||||
|
|
||||||
movzx eax, [screen.width]
|
movzx eax, [screen.width]
|
||||||
sub eax, [rectangle.width]
|
sub eax, [rectangle.width]
|
||||||
@ -92,6 +94,13 @@ else if BITS_PER_PIXEL = 16
|
|||||||
jnz .pixelloop
|
jnz .pixelloop
|
||||||
else if BITS_PER_PIXEL = 24
|
else if BITS_PER_PIXEL = 24
|
||||||
rep movsb
|
rep movsb
|
||||||
|
else if BITS_PER_PIXEL = 32
|
||||||
|
.pixelloop:
|
||||||
|
movsw
|
||||||
|
movsb
|
||||||
|
inc esi
|
||||||
|
dec ecx
|
||||||
|
jnz .pixelloop
|
||||||
end if
|
end if
|
||||||
|
|
||||||
add edi, ebp
|
add edi, ebp
|
||||||
|
@ -12,16 +12,16 @@
|
|||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
pixel_to_24bpp: ; returns in ecx
|
load_pixel_rre: ; returns in ecx
|
||||||
|
|
||||||
push eax
|
push eax
|
||||||
; @@:
|
@@:
|
||||||
; lea eax, [esi+BYTES_PER_PIXEL]
|
lea eax, [esi+BYTES_PER_PIXEL]
|
||||||
; cmp [datapointer], eax
|
cmp [datapointer], eax
|
||||||
; jae @f
|
jae @f
|
||||||
; call read_data.more
|
call read_data.more
|
||||||
; jmp @b
|
jmp @b
|
||||||
; @@:
|
@@:
|
||||||
|
|
||||||
if BITS_PER_PIXEL = 8
|
if BITS_PER_PIXEL = 8
|
||||||
|
|
||||||
@ -65,14 +65,18 @@ else if BITS_PER_PIXEL = 16
|
|||||||
shl cl, 3
|
shl cl, 3
|
||||||
and cx, 0x00f8 ; blue
|
and cx, 0x00f8 ; blue
|
||||||
|
|
||||||
else
|
else if BITS_PER_PIXEL = 24
|
||||||
|
|
||||||
xor ecx, ecx
|
mov ecx, [esi]
|
||||||
mov cx, [esi]
|
and ecx, 0x00ffffff
|
||||||
shl ecx, 8
|
|
||||||
mov cl, [esi+2]
|
|
||||||
add esi, 3
|
add esi, 3
|
||||||
|
|
||||||
|
else if BITS_PER_PIXEL = 32
|
||||||
|
|
||||||
|
mov ecx, [esi]
|
||||||
|
and ecx, 0x00ffffff
|
||||||
|
add esi, 4
|
||||||
|
|
||||||
end if
|
end if
|
||||||
pop eax
|
pop eax
|
||||||
|
|
||||||
@ -97,13 +101,13 @@ encoding_RRE:
|
|||||||
DEBUGF 1, "%u subrectangles\n", eax
|
DEBUGF 1, "%u subrectangles\n", eax
|
||||||
|
|
||||||
; Get background color
|
; Get background color
|
||||||
call pixel_to_24bpp
|
call load_pixel_rre
|
||||||
|
|
||||||
; Calculate first pixel pos
|
; Calculate first pixel pos
|
||||||
movzx eax, [screen.width]
|
movzx eax, [screen.width]
|
||||||
mul [rectangle.y] ; [screen.width]*[rectangle.y]
|
mul [rectangle.y] ; [screen.width]*[rectangle.y]
|
||||||
add eax, [rectangle.x] ; [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
|
lea edi, [framebuffer+eax*3] ; edi = framebuffer_data+([screen.width]*[rectangle.y]+[rectangle.x])*3
|
||||||
|
|
||||||
; Calculate offset between two rows of pixels
|
; Calculate offset between two rows of pixels
|
||||||
movzx eax, [screen.width]
|
movzx eax, [screen.width]
|
||||||
@ -142,7 +146,7 @@ encoding_RRE:
|
|||||||
@@:
|
@@:
|
||||||
|
|
||||||
; Get subrectangle color
|
; Get subrectangle color
|
||||||
call pixel_to_24bpp
|
call load_pixel_rre
|
||||||
|
|
||||||
; Get coordinates
|
; Get coordinates
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
|
@ -20,7 +20,7 @@ create_palette:
|
|||||||
DEBUGF 1, "Loading palette of %u colors\n", dl
|
DEBUGF 1, "Loading palette of %u colors\n", dl
|
||||||
mov edi, palette
|
mov edi, palette
|
||||||
.loop:
|
.loop:
|
||||||
call pixel_to_24bpp
|
call load_pixel_trle
|
||||||
mov [edi], ecx
|
mov [edi], ecx
|
||||||
add edi, 4
|
add edi, 4
|
||||||
dec dl
|
dec dl
|
||||||
@ -30,6 +30,71 @@ create_palette:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
load_pixel_trle: ; 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 ebx
|
||||||
|
|
||||||
|
mov bl, 36
|
||||||
|
mov al, [esi]
|
||||||
|
and al, 7
|
||||||
|
mul bl
|
||||||
|
mov ch, al ; red
|
||||||
|
|
||||||
|
mov al, [esi]
|
||||||
|
shr al, 3
|
||||||
|
and al, 7
|
||||||
|
mul bl
|
||||||
|
mov cl, al ; green
|
||||||
|
|
||||||
|
mov bl, 85
|
||||||
|
mov al, [esi]
|
||||||
|
shr al, 6
|
||||||
|
and al, 3
|
||||||
|
mul bl
|
||||||
|
shl ecx, 8
|
||||||
|
mov cl, al ; blue
|
||||||
|
|
||||||
|
inc esi
|
||||||
|
pop ebx
|
||||||
|
|
||||||
|
else if BITS_PER_PIXEL = 16
|
||||||
|
|
||||||
|
lodsw
|
||||||
|
mov cl, ah
|
||||||
|
and al, 0xf8 ; red
|
||||||
|
|
||||||
|
mov cx, ax
|
||||||
|
shl cx, 5
|
||||||
|
and ch, 0xfc ; green
|
||||||
|
shl ecx, 8
|
||||||
|
|
||||||
|
mov cl, al
|
||||||
|
shl cl, 3
|
||||||
|
and cx, 0x00f8 ; blue
|
||||||
|
|
||||||
|
else ; 32 BPP gets packed to 24 BPP
|
||||||
|
|
||||||
|
mov ecx, [esi]
|
||||||
|
and ecx, 0x00ffffff
|
||||||
|
add esi, 3
|
||||||
|
|
||||||
|
end if
|
||||||
|
pop eax
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
encoding_TRLE:
|
encoding_TRLE:
|
||||||
|
|
||||||
DEBUGF 1, "TRLE\n"
|
DEBUGF 1, "TRLE\n"
|
||||||
@ -62,7 +127,7 @@ encoding_TRLE:
|
|||||||
mul ebx
|
mul ebx
|
||||||
add eax, [rectangle.x]
|
add eax, [rectangle.x]
|
||||||
add eax, [subrectangle.x]
|
add eax, [subrectangle.x]
|
||||||
lea edi, [framebuffer_data+eax*3]
|
lea edi, [framebuffer+eax*3]
|
||||||
|
|
||||||
; Calculate offset between two rows of pixels
|
; Calculate offset between two rows of pixels
|
||||||
movzx eax, [screen.width]
|
movzx eax, [screen.width]
|
||||||
@ -197,8 +262,7 @@ encoding_TRLE:
|
|||||||
jmp .next_tile
|
jmp .next_tile
|
||||||
|
|
||||||
.rle_reload:
|
.rle_reload:
|
||||||
; load pixel value
|
call load_pixel_trle
|
||||||
call pixel_to_24bpp
|
|
||||||
|
|
||||||
@@:
|
@@:
|
||||||
lea eax, [esi+1]
|
lea eax, [esi+1]
|
||||||
@ -447,7 +511,7 @@ encoding_TRLE:
|
|||||||
.raw_line:
|
.raw_line:
|
||||||
mov ebx, [subrectangle.width]
|
mov ebx, [subrectangle.width]
|
||||||
.raw_pixel:
|
.raw_pixel:
|
||||||
call pixel_to_24bpp
|
call load_pixel_trle
|
||||||
mov word[edi], cx
|
mov word[edi], cx
|
||||||
shr ecx, 16
|
shr ecx, 16
|
||||||
add edi, 2
|
add edi, 2
|
||||||
@ -465,7 +529,7 @@ encoding_TRLE:
|
|||||||
; Single color tile
|
; Single color tile
|
||||||
.solid:
|
.solid:
|
||||||
DEBUGF 1, "Solid tile\n"
|
DEBUGF 1, "Solid tile\n"
|
||||||
call pixel_to_24bpp
|
call load_pixel_trle
|
||||||
mov eax, ecx
|
mov eax, ecx
|
||||||
shr eax, 16
|
shr eax, 16
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ format binary as ""
|
|||||||
__DEBUG__ = 1
|
__DEBUG__ = 1
|
||||||
__DEBUG_LEVEL__ = 2
|
__DEBUG_LEVEL__ = 2
|
||||||
|
|
||||||
BITS_PER_PIXEL = 8 ; 8, 16 24
|
BITS_PER_PIXEL = 32 ; 8, 16, 24 or 32
|
||||||
SERVERADDRLEN = 4096
|
SERVERADDRLEN = 4096
|
||||||
|
|
||||||
use32
|
use32
|
||||||
@ -40,7 +40,7 @@ include "../../struct.inc"
|
|||||||
include "../../develop/libraries/box_lib/trunk/box_lib.mac"
|
include "../../develop/libraries/box_lib/trunk/box_lib.mac"
|
||||||
include "../../network.inc"
|
include "../../network.inc"
|
||||||
|
|
||||||
struct pixel_format
|
struct PixelFormat
|
||||||
bpp db ?
|
bpp db ?
|
||||||
depth db ?
|
depth db ?
|
||||||
big_endian db ?
|
big_endian db ?
|
||||||
@ -54,12 +54,12 @@ struct pixel_format
|
|||||||
padding rb 3
|
padding rb 3
|
||||||
ends
|
ends
|
||||||
|
|
||||||
struct framebuffer
|
struct ServerInit
|
||||||
width dw ?
|
width dw ?
|
||||||
height dw ?
|
height dw ?
|
||||||
pixelformat pixel_format
|
pixelformat PixelFormat
|
||||||
name_length dd ?
|
name_length dd ?
|
||||||
name rb 256
|
name db ?
|
||||||
ends
|
ends
|
||||||
|
|
||||||
xpos = 4
|
xpos = 4
|
||||||
@ -156,7 +156,7 @@ redraw:
|
|||||||
|
|
||||||
draw_framebuffer:
|
draw_framebuffer:
|
||||||
DEBUGF 1, "Drawing framebuffer\n"
|
DEBUGF 1, "Drawing framebuffer\n"
|
||||||
mcall 7, framebuffer_data, dword[screen], 0
|
mcall 7, framebuffer, dword[screen], 0
|
||||||
mov [update_framebuffer], 0
|
mov [update_framebuffer], 0
|
||||||
|
|
||||||
mainloop:
|
mainloop:
|
||||||
@ -275,15 +275,15 @@ ClientInit db 0 ; not shared
|
|||||||
SetPixelFormat32 db 0 ; setPixelformat
|
SetPixelFormat32 db 0 ; setPixelformat
|
||||||
db 0, 0, 0 ; padding
|
db 0, 0, 0 ; padding
|
||||||
.bpp db 32 ; bits per pixel
|
.bpp db 32 ; bits per pixel
|
||||||
.depth db 32 ; depth
|
.depth db 24 ; depth
|
||||||
.big_endian db 0 ; big-endian flag
|
.big_endian db 0 ; big-endian flag
|
||||||
.true_color db 1 ; true-colour flag
|
.true_color db 1 ; true-colour flag
|
||||||
.red_max db 0, 255 ; red-max
|
.red_max db 0, 255 ; red-max
|
||||||
.green_max db 0, 255 ; green-max
|
.green_max db 0, 255 ; green-max
|
||||||
.blue_max db 0, 255 ; blue-max
|
.blue_max db 0, 255 ; blue-max
|
||||||
.red_shif db 0 ; red-shift
|
.red_shift db 16 ; red-shift
|
||||||
.green_shift db 8 ; green-shift
|
.green_shift db 8 ; green-shift
|
||||||
.blue_shift db 16 ; blue-shift
|
.blue_shift db 0 ; blue-shift
|
||||||
db 0, 0, 0 ; padding
|
db 0, 0, 0 ; padding
|
||||||
|
|
||||||
SetPixelFormat24 db 0 ; setPixelformat
|
SetPixelFormat24 db 0 ; setPixelformat
|
||||||
@ -479,7 +479,7 @@ keys rd 32*2 ; DES keys for VNC authentication
|
|||||||
sz_err_security_c rb 512+1
|
sz_err_security_c rb 512+1
|
||||||
|
|
||||||
receive_buffer rb RECEIVE_BUFFER_SIZE
|
receive_buffer rb RECEIVE_BUFFER_SIZE
|
||||||
framebuffer_data rb 1280*1024*3 ; framebuffer
|
framebuffer rb 1280*1024*3 ; framebuffer
|
||||||
|
|
||||||
rb 0x1000
|
rb 0x1000
|
||||||
thread_stack:
|
thread_stack:
|
||||||
|
@ -12,6 +12,68 @@
|
|||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
|
||||||
|
load_pixel_zrle: ; returns in ecx
|
||||||
|
|
||||||
|
push eax
|
||||||
|
|
||||||
|
; TODO: check for buffer underrun!
|
||||||
|
|
||||||
|
if BITS_PER_PIXEL = 8
|
||||||
|
|
||||||
|
push ebx
|
||||||
|
|
||||||
|
mov bl, 36
|
||||||
|
mov al, [esi]
|
||||||
|
and al, 7
|
||||||
|
mul bl
|
||||||
|
mov ch, al ; red
|
||||||
|
|
||||||
|
mov al, [esi]
|
||||||
|
shr al, 3
|
||||||
|
and al, 7
|
||||||
|
mul bl
|
||||||
|
mov cl, al ; green
|
||||||
|
|
||||||
|
mov bl, 85
|
||||||
|
mov al, [esi]
|
||||||
|
shr al, 6
|
||||||
|
and al, 3
|
||||||
|
mul bl
|
||||||
|
shl ecx, 8
|
||||||
|
mov cl, al ; blue
|
||||||
|
|
||||||
|
inc esi
|
||||||
|
pop ebx
|
||||||
|
|
||||||
|
else if BITS_PER_PIXEL = 16
|
||||||
|
|
||||||
|
lodsw
|
||||||
|
mov cl, ah
|
||||||
|
and al, 0xf8 ; red
|
||||||
|
|
||||||
|
mov cx, ax
|
||||||
|
shl cx, 5
|
||||||
|
and ch, 0xfc ; green
|
||||||
|
shl ecx, 8
|
||||||
|
|
||||||
|
mov cl, al
|
||||||
|
shl cl, 3
|
||||||
|
and cx, 0x00f8 ; blue
|
||||||
|
|
||||||
|
else ; 32 BPP gets packed to 24 BPP
|
||||||
|
|
||||||
|
mov ecx, [esi]
|
||||||
|
and ecx, 0x00ffffff
|
||||||
|
add esi, 3
|
||||||
|
|
||||||
|
end if
|
||||||
|
pop eax
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
deflate_callback:
|
deflate_callback:
|
||||||
mov eax, [deflate_length]
|
mov eax, [deflate_length]
|
||||||
mov ecx, [esp+8]
|
mov ecx, [esp+8]
|
||||||
@ -19,6 +81,8 @@ deflate_callback:
|
|||||||
mov eax, [deflate_buffer]
|
mov eax, [deflate_buffer]
|
||||||
ret 8
|
ret 8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
encoding_ZRLE:
|
encoding_ZRLE:
|
||||||
|
|
||||||
DEBUGF 2, "ZRLE\n"
|
DEBUGF 2, "ZRLE\n"
|
||||||
@ -102,7 +166,7 @@ encoding_ZRLE:
|
|||||||
mul ebx
|
mul ebx
|
||||||
add eax, [rectangle.x]
|
add eax, [rectangle.x]
|
||||||
add eax, [subrectangle.x]
|
add eax, [subrectangle.x]
|
||||||
lea edi, [framebuffer_data+eax*3]
|
lea edi, [framebuffer+eax*3]
|
||||||
|
|
||||||
; Calculate offset between two rows of pixels
|
; Calculate offset between two rows of pixels
|
||||||
movzx eax, [screen.width]
|
movzx eax, [screen.width]
|
||||||
@ -219,8 +283,7 @@ encoding_ZRLE:
|
|||||||
jmp .next_tile
|
jmp .next_tile
|
||||||
|
|
||||||
.rle_reload:
|
.rle_reload:
|
||||||
; load pixel value
|
call load_pixel_zrle
|
||||||
call pixel_to_24bpp
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
|
|
||||||
@ -454,7 +517,7 @@ encoding_ZRLE:
|
|||||||
.raw_line:
|
.raw_line:
|
||||||
mov ebx, [subrectangle.width]
|
mov ebx, [subrectangle.width]
|
||||||
.raw_pixel:
|
.raw_pixel:
|
||||||
call pixel_to_24bpp
|
call load_pixel_zrle
|
||||||
mov word[edi], cx
|
mov word[edi], cx
|
||||||
shr ecx, 16
|
shr ecx, 16
|
||||||
add edi, 2
|
add edi, 2
|
||||||
@ -472,7 +535,7 @@ encoding_ZRLE:
|
|||||||
; Single color tile
|
; Single color tile
|
||||||
.solid:
|
.solid:
|
||||||
DEBUGF 1, "Solid tile\n"
|
DEBUGF 1, "Solid tile\n"
|
||||||
call pixel_to_24bpp
|
call load_pixel_zrle
|
||||||
mov eax, ecx
|
mov eax, ecx
|
||||||
shr eax, 16
|
shr eax, 16
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user