2016-11-08 03:23:52 +03:00
|
|
|
|
; ---------------------------------------------------------------------------- ;
|
|
|
|
|
; Tooltip widget
|
|
|
|
|
;
|
|
|
|
|
; Created by Siemargl, 2016
|
|
|
|
|
;
|
|
|
|
|
; Changelist
|
|
|
|
|
; 161107 - initial version + test
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; http://stackoverflow.com/questions/8976600/fasm-how-to-send-struct-to-proc
|
|
|
|
|
virtual at edi
|
|
|
|
|
ttip tooltip ?, ?, ?, ?, ?, ?, ?, ?, ?
|
|
|
|
|
end virtual
|
|
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------- ;
|
|
|
|
|
; <20><><EFBFBD>樠<EFBFBD><E6A8A0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ᥩ 楯<>窨 <20><><EFBFBD>⨯<EFBFBD><E2A8AF>, <20><>ନ<E0ACA8><E0AEA2><EFBFBD><EFBFBD> ࠧ<><E0A0A7> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
; return eax zero if fails
|
|
|
|
|
align 16
|
|
|
|
|
proc tooltip_init uses esi edi, ttip:dword
|
|
|
|
|
locals
|
|
|
|
|
max_len dw ? ;maximum chars in line
|
|
|
|
|
lines dw ? ;lines in tooltip
|
|
|
|
|
endl
|
|
|
|
|
|
|
|
|
|
mov edi, [ttip]
|
|
|
|
|
jmp .tail_call
|
|
|
|
|
.list_next:
|
|
|
|
|
; init statics
|
|
|
|
|
mov [ttip.mouse], 0
|
|
|
|
|
mov [ttip.tm_strt], 0
|
|
|
|
|
mov [ttip.video_y], 0
|
|
|
|
|
mov [ttip.video_x], 0
|
|
|
|
|
mov [ttip.video], 0
|
|
|
|
|
stdcall get_font_size, [ttip.col_txt]
|
|
|
|
|
mov [ttip.font_sz], eax
|
|
|
|
|
|
|
|
|
|
; count num of lines and max len
|
|
|
|
|
mov esi, [ttip.txt]
|
|
|
|
|
mov [lines], 1 ; lines
|
|
|
|
|
mov [max_len], 0 ; max_len
|
|
|
|
|
.line:
|
|
|
|
|
mov ecx, 0 ; len
|
|
|
|
|
.symb:
|
|
|
|
|
mov al, [esi]
|
|
|
|
|
cmp al, 0
|
|
|
|
|
je .eos
|
|
|
|
|
cmp al, 13
|
|
|
|
|
jne .next
|
|
|
|
|
inc [lines]
|
|
|
|
|
inc esi
|
|
|
|
|
cmp cx, [max_len] ; detect max
|
|
|
|
|
jle @f
|
|
|
|
|
mov [max_len], cx
|
|
|
|
|
@@:
|
|
|
|
|
jmp .line
|
|
|
|
|
.next:
|
|
|
|
|
inc ecx
|
|
|
|
|
inc esi
|
|
|
|
|
jmp .symb
|
|
|
|
|
.eos:; string ended, we have correct width and hight
|
|
|
|
|
cmp cx, [max_len] ; detect max
|
|
|
|
|
jle @f
|
|
|
|
|
mov [max_len], cx
|
|
|
|
|
@@:
|
|
|
|
|
|
|
|
|
|
mov eax, [ttip.font_sz]
|
|
|
|
|
shr eax, 16
|
|
|
|
|
imul [max_len]
|
|
|
|
|
mov dx, ax ; width in pixels
|
|
|
|
|
mov [ttip.video_w], ax
|
|
|
|
|
mov eax, [ttip.font_sz] ; lo word == h
|
|
|
|
|
and eax, $FFFF
|
|
|
|
|
imul ax, [lines]
|
|
|
|
|
mov [ttip.video_h], ax
|
|
|
|
|
imul [ttip.video_w]
|
|
|
|
|
imul eax, 3 ; eax have now width * height in pixels *3
|
|
|
|
|
; getmem
|
|
|
|
|
invoke mem.alloc, eax
|
|
|
|
|
mov [ttip.video], eax
|
|
|
|
|
test eax, eax
|
|
|
|
|
je .exitp ; malloc fails
|
|
|
|
|
|
|
|
|
|
; cycle list
|
|
|
|
|
mov edi, [ttip.next]
|
|
|
|
|
.tail_call:
|
|
|
|
|
test edi, edi
|
|
|
|
|
jne .list_next
|
|
|
|
|
xor eax, eax
|
2016-11-13 16:06:20 +03:00
|
|
|
|
inc eax ; good return
|
2016-11-08 03:23:52 +03:00
|
|
|
|
.exitp:
|
|
|
|
|
ret
|
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------- ;
|
|
|
|
|
; <20><><EFBFBD><EFBFBD>⪠ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ᥩ 楯<>窨 <20><><EFBFBD>⨯<EFBFBD><E2A8AF>
|
|
|
|
|
align 4
|
|
|
|
|
proc tooltip_delete uses edi, ttip:dword
|
|
|
|
|
mov edi, [ttip]
|
|
|
|
|
jmp .tail_call
|
|
|
|
|
.list_next:
|
|
|
|
|
mov eax, [ttip.video]
|
|
|
|
|
test eax, eax
|
|
|
|
|
je @f
|
|
|
|
|
invoke mem.free, eax
|
|
|
|
|
@@:
|
|
|
|
|
mov edi, [ttip.next]
|
|
|
|
|
.tail_call:
|
|
|
|
|
test edi, edi
|
|
|
|
|
jne .list_next
|
|
|
|
|
ret
|
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------- ;
|
|
|
|
|
; <20><><EFBFBD><EFBFBD><EFBFBD> <20>㦭<EFBFBD><E3A6AD><EFBFBD> <20><> <20>ᥩ 楯<>窨 <20><><EFBFBD>⨯<EFBFBD><E2A8AF> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢨<EFBFBD> (event 0)
|
|
|
|
|
align 4
|
|
|
|
|
proc tooltip_test_show uses edi ebx, ttip:dword
|
|
|
|
|
mov edi, [ttip]
|
|
|
|
|
jmp .tail_call
|
|
|
|
|
.list_next:
|
|
|
|
|
cmp [ttip.tm_strt], 0 ; ⠩<><E2A0A9><EFBFBD> 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
je .nextp
|
|
|
|
|
cmp [ttip.video_y], 0 ; <20><><EFBFBD>⨯ 㦥 <20>⮡ࠦ<E2AEA1><E0A0A6>
|
|
|
|
|
;;; jne .redraw
|
|
|
|
|
jne .nextp
|
|
|
|
|
mcall SF_SYSTEM_GET, SSF_TIME_COUNT
|
|
|
|
|
movzx ebx, [ttip.tm_wait]
|
|
|
|
|
sub eax, ebx
|
|
|
|
|
cmp eax, [ttip.tm_strt]
|
|
|
|
|
jl .exitp ; <20><><EFBFBD> <20><><EFBFBD><EFBFBD> ⮫쪮 <20><><EFBFBD><EFBFBD>
|
|
|
|
|
; <20>६<EFBFBD> <20><>⨪<EFBFBD><E2A8AA><EFBFBD>, <20><><EFBFBD>࠭塞 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>㥬<EFBFBD><E3A5AC>
|
|
|
|
|
;CopyScreen(shadow_buf, 5*skinned+x+wForm.left, GetSkinHeight()*skinned+y+wForm.top, w, h);
|
|
|
|
|
mcall SF_THREAD_INFO, proc_info, -1
|
|
|
|
|
movzx edx, word [proc_info + 34] ; window x position
|
|
|
|
|
add edx, 5
|
|
|
|
|
shl edx, 16
|
|
|
|
|
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
|
|
|
|
|
movzx ebx, word [proc_info + 38] ; window y position
|
|
|
|
|
add eax, ebx
|
|
|
|
|
add edx, eax ; x_y
|
|
|
|
|
add edx, [ttip.mouse]
|
|
|
|
|
add edx, 20 ; pixels below mouse
|
|
|
|
|
mov ecx, dword [ttip.video_h] ; w_h
|
|
|
|
|
mcall SF_GET_IMAGE, [ttip.video]
|
|
|
|
|
|
|
|
|
|
mov eax, [ttip.mouse] ; <20><><EFBFBD>࠭<EFBFBD><E0A0AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>㥬<EFBFBD><E3A5AC>
|
|
|
|
|
add eax, 20 ; pixels below mouse
|
|
|
|
|
mov [ttip.video_y], ax
|
|
|
|
|
shr eax, 16
|
|
|
|
|
mov [ttip.video_x], ax
|
|
|
|
|
.redraw: ; <20><><EFBFBD>㥬<EFBFBD><E3A5AC> <20>⭮<EFBFBD><E2ADAE>⥫쭮 <20><><EFBFBD><EFBFBD>!!!
|
|
|
|
|
stdcall tooltip_draw, edi
|
|
|
|
|
|
|
|
|
|
jmp .exitp ; <20><><EFBFBD> <20><><EFBFBD><EFBFBD> ⮫쪮 <20><><EFBFBD><EFBFBD>
|
|
|
|
|
.nextp:
|
|
|
|
|
mov edi, [ttip.next]
|
|
|
|
|
.tail_call:
|
|
|
|
|
test edi, edi
|
|
|
|
|
jne .list_next
|
|
|
|
|
.exitp:
|
|
|
|
|
ret
|
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
; <20><><EFBFBD>㥬<EFBFBD><E3A5AC> <20>⭮<EFBFBD><E2ADAE>⥫쭮 <20><><EFBFBD><EFBFBD>!!!
|
|
|
|
|
; internal func
|
|
|
|
|
proc tooltip_draw uses esi edi ebx, ttip:dword
|
|
|
|
|
locals
|
|
|
|
|
line dw ? ;line # drawing
|
|
|
|
|
ptr_li dd ? ;line begin
|
|
|
|
|
endl
|
|
|
|
|
mov edi, [ttip]
|
|
|
|
|
; draw square
|
|
|
|
|
movzx ebx, [ttip.video_x]
|
|
|
|
|
shl ebx, 16
|
|
|
|
|
mov bx, [ttip.video_w]
|
|
|
|
|
movzx ecx, [ttip.video_y]
|
|
|
|
|
shl ecx, 16
|
|
|
|
|
mov cx, [ttip.video_h]
|
|
|
|
|
mcall SF_DRAW_RECT, , , [ttip.col_bkg]
|
|
|
|
|
|
|
|
|
|
; 横<> <20><> <20><>ப<EFBFBD><E0AEAA>
|
|
|
|
|
; count num of lines and max len
|
|
|
|
|
mov esi, [ttip.txt]
|
|
|
|
|
mov [line], 0 ; line #
|
|
|
|
|
.line:
|
|
|
|
|
mov ecx, 0 ; len
|
|
|
|
|
mov [ptr_li], esi
|
|
|
|
|
.symb:
|
|
|
|
|
mov al, [esi]
|
|
|
|
|
cmp al, 0
|
|
|
|
|
je @f
|
|
|
|
|
cmp al, 13
|
|
|
|
|
jne .next
|
|
|
|
|
@@:
|
|
|
|
|
; draw line if len > 0
|
|
|
|
|
test ecx, ecx
|
|
|
|
|
je @f
|
|
|
|
|
; draw single line
|
|
|
|
|
pushad
|
|
|
|
|
mov esi, ecx ; length
|
|
|
|
|
movzx ebx, [ttip.video_x]
|
|
|
|
|
shl ebx, 16
|
|
|
|
|
mov eax, [ttip.font_sz]
|
|
|
|
|
and eax, $FFFF
|
|
|
|
|
imul ax, [line]
|
|
|
|
|
add ax, [ttip.video_y]
|
|
|
|
|
add ebx, eax
|
|
|
|
|
mov ecx, [ttip.col_txt]
|
|
|
|
|
and ecx, $37FFFFFF
|
|
|
|
|
mov edx, [ptr_li]
|
|
|
|
|
mcall SF_DRAW_TEXT
|
|
|
|
|
popad
|
|
|
|
|
@@:
|
|
|
|
|
cmp byte ptr esi, 0
|
|
|
|
|
je .exitp
|
|
|
|
|
inc [line]
|
|
|
|
|
inc esi
|
|
|
|
|
jmp .line
|
|
|
|
|
.next:
|
|
|
|
|
inc ecx
|
|
|
|
|
inc esi
|
|
|
|
|
jmp .symb
|
|
|
|
|
.exitp:
|
|
|
|
|
ret
|
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------- ;
|
|
|
|
|
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⨯<EFBFBD> <20><><EFBFBD> 饫窥 <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20>ꥧ<EFBFBD><EAA5A7> <20><> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD> <20>ᥩ 楯<>窨 <20><><EFBFBD>⨯<EFBFBD><E2A8AF> <20><><EFBFBD> ᮡ<>⨨ <20><><EFBFBD><EFBFBD>
|
|
|
|
|
; <20> mouse_coord == -1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
align 4
|
|
|
|
|
proc tooltip_mouse, ttip:dword
|
|
|
|
|
locals
|
|
|
|
|
mouse_coord dd ?
|
|
|
|
|
mouse_but dd ?
|
|
|
|
|
endl
|
|
|
|
|
pushad
|
|
|
|
|
; <20><><EFBFBD><EFBFBD>ᨬ <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>㥬 <20><> <20><><EFBFBD>⨯<EFBFBD><E2A8AF>
|
|
|
|
|
mcall SF_MOUSE_GET, SSF_WINDOW_POSITION
|
|
|
|
|
mov [mouse_coord], eax
|
|
|
|
|
mcall SF_MOUSE_GET, SSF_BUTTON
|
|
|
|
|
mov [mouse_but], eax
|
|
|
|
|
mov edi, [ttip]
|
|
|
|
|
.list_next:
|
|
|
|
|
test edi, edi
|
|
|
|
|
je .exitp
|
|
|
|
|
cmp [mouse_but], 0 ; <20><><EFBFBD> 饫窥 <20><><EFBFBD>ࠥ<EFBFBD><E0A0A5><EFBFBD>
|
|
|
|
|
jne @f
|
|
|
|
|
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
mov eax, [mouse_coord]
|
|
|
|
|
mov [ttip.mouse], eax ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20>뫠 <20><><EFBFBD><EFBFBD>祭<EFBFBD> <20><><EFBFBD><EFBFBD>! (<28><> <20><>祬)
|
|
|
|
|
mov ecx, eax
|
|
|
|
|
shr ecx, 16
|
|
|
|
|
cmp cx, [ttip.zone_x] ; zone_x is higher word
|
|
|
|
|
jl @f
|
|
|
|
|
cmp ax, [ttip.zone_y]
|
|
|
|
|
jl @f
|
|
|
|
|
mov cx, [ttip.zone_w]
|
|
|
|
|
add cx, [ttip.zone_x]
|
|
|
|
|
shl ecx, 16
|
|
|
|
|
cmp eax, ecx ; x+w < mouse_x (mouse_y in low word ignored)
|
|
|
|
|
jge @f
|
|
|
|
|
mov cx, [ttip.zone_y]
|
|
|
|
|
add cx, [ttip.zone_h]
|
|
|
|
|
cmp ax, cx
|
|
|
|
|
jge @f
|
|
|
|
|
; <20><> <20> <20><><EFBFBD><EFBFBD> - <20><>ᥪ<EFBFBD><E1A5AA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD> <20><> <20>뫮
|
|
|
|
|
cmp [ttip.tm_strt], 0
|
|
|
|
|
jne .nextp
|
|
|
|
|
mcall SF_SYSTEM_GET, SSF_TIME_COUNT
|
|
|
|
|
mov [ttip.tm_strt], eax
|
|
|
|
|
jmp .nextp
|
|
|
|
|
@@:
|
|
|
|
|
; <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⨭<EFBFBD><E2A8AD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 楯<>窥
|
|
|
|
|
mov [ttip.tm_strt], 0
|
|
|
|
|
cmp [ttip.video_y], 0
|
|
|
|
|
je .nextp
|
|
|
|
|
movzx ecx, [ttip.video_w]
|
|
|
|
|
shl ecx, 16
|
|
|
|
|
mov cx, [ttip.video_h]
|
|
|
|
|
movzx edx, [ttip.video_x]
|
|
|
|
|
shl edx, 16
|
|
|
|
|
mov dx, [ttip.video_y]
|
|
|
|
|
mcall SF_PUT_IMAGE, [ttip.video]
|
|
|
|
|
mov [ttip.video_y], 0
|
|
|
|
|
;jmp exitp ; <20><><EFBFBD> <20><><EFBFBD><EFBFBD> ⮫쪮 <20><><EFBFBD><EFBFBD> - <20>⬥<EFBFBD><E2ACA5> - <20><>ࠡ<EFBFBD><E0A0A1><EFBFBD><EFBFBD><EFBFBD> <20>㦭<EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ⠩<><E2A0A9>
|
|
|
|
|
.nextp:
|
|
|
|
|
;mov eax, [ttip].next
|
|
|
|
|
;stdcall tooltip_mouse, [ttip].next, [mouse_coord], [mouse_but]
|
|
|
|
|
; tail call unroll recursion
|
|
|
|
|
mov edi, [ttip.next]
|
|
|
|
|
jmp .list_next
|
|
|
|
|
.exitp:
|
|
|
|
|
popad
|
|
|
|
|
ret
|
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------- ;
|
|
|
|
|
; decrypt font size as of SysFn 4
|
|
|
|
|
; returns eax = (x,y)
|
|
|
|
|
align 4
|
|
|
|
|
proc get_font_size, color:dword ; x86 calling convention uses eax ecx edx
|
|
|
|
|
;font = color >> 24;
|
|
|
|
|
;int font_multipl = (font & 7) + 1;
|
|
|
|
|
;if (font & 0x10) // 8x16
|
|
|
|
|
;{
|
|
|
|
|
; ed->width_sym = 8 * font_multipl;
|
|
|
|
|
; ed->hight_sym = 16 * font_multipl;
|
|
|
|
|
;} else // 6x9
|
|
|
|
|
;{
|
|
|
|
|
; ed->width_sym = 6 * font_multipl;
|
|
|
|
|
; ed->hight_sym = 9 * font_multipl;
|
|
|
|
|
;}
|
|
|
|
|
mov edx, [color]
|
|
|
|
|
shr edx, 24 ; font
|
|
|
|
|
|
|
|
|
|
mov ecx, edx ; font_multipl
|
|
|
|
|
and ecx, 7
|
|
|
|
|
inc ecx
|
|
|
|
|
|
|
|
|
|
test edx, $10
|
|
|
|
|
mov edx, ecx
|
|
|
|
|
jz @f
|
|
|
|
|
; 8x16
|
|
|
|
|
shl edx, 3 + 16 ; x == width
|
|
|
|
|
mov eax, edx
|
|
|
|
|
mov edx, ecx
|
|
|
|
|
shl edx, 4 ; y == hight
|
|
|
|
|
jmp .exitp
|
|
|
|
|
@@:
|
|
|
|
|
; 6x9
|
|
|
|
|
imul edx, 6 ; x == width
|
|
|
|
|
shl edx, 16
|
|
|
|
|
mov eax, edx
|
|
|
|
|
mov edx, ecx
|
|
|
|
|
imul edx, 9 ; y == hight
|
|
|
|
|
.exitp:
|
|
|
|
|
or eax, edx
|
|
|
|
|
ret
|
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
;---------------------------------------------------------------------
|
|
|
|
|
;--- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ----------------------------------------------
|
|
|
|
|
;---------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
proc_info rd 1024
|
|
|
|
|
|