Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch NewWidgets Through [ffeeb8d937] Excluding Merge-Ins
This is equivalent to a diff from 10fcf3a92e to ffeeb8d937
|
2015-11-21
| ||
| 17:14 | Mouse selection for TEdit control and also caret problems fixed (?). check-in: a209b18030 user: johnfound tags: NewWidgets | |
| 11:37 | Work on TEdit. Procedure BlendSolidRect has been implemented. check-in: ffeeb8d937 user: johnfound tags: NewWidgets | |
|
2015-11-20
| ||
| 21:24 | Some trick with the message processing in order to stop keyboard buffer overflow on slow machines. check-in: 8cc10ecdd8 user: johnfound tags: NewWidgets | |
|
2015-05-26
| ||
| 18:36 | A branch for experiments with new architecture for the GUI widgets. The idea is to not use the OS provided windows, but to make our own windows structure and to keep the OS provided windows only for the top-level windows. This solution will be biger and more complex, but will be faster, more portable and allows full featured GUI even for systems with rudimentary windows features. check-in: 681971e932 user: johnfound tags: NewWidgets | |
|
2015-03-11
| ||
| 12:44 | Work on the font and text handling in Linux using FreeType library. Closed-Leaf check-in: 10fcf3a92e user: johnfound tags: FreshLibGUI | |
|
2015-02-24
| ||
| 18:04 | Fixed some issues with font rendering in all modes: mono, gray, lcd and rgba(not tested). The blending of the alpha values is now properly implemented. Some MMX optimizations. check-in: 6fc7f25125 user: johnfound tags: FreshLibGUI | |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | Legend: [+] - Fully implemented (more or less). [?] - Partially implemented/work in progress. [ ] - Not even started. Needed GUI controls in order to start work on Fresh IDE 3.0: [+] TForm [+] TSplitGrid [+] TAction (and Action lists) [+] TButton [+] TCheckbox [?] TTreeView [ ] TabControl [?] TSourceEditor [ ] TToolbar [?] TMenu [ ] TMenuBar [ ] TStatusbar [+] TProgressbar [ ] TListView, TListbox or other kind of table/grid control with columns. [?] TEdit - line editor [ ] THint [+] General message dialog. [ ] Open/Save dialogs. [ ] Color selection dialog. (not so important). [ ] Font select dialog. |
1 2 3 4 5 6 7 8 9 10 | include 'i18n.asm' include 'arrays.asm' include 'strlib.asm' include 'uconfig.asm' include 'memstream.asm' include 'markdown.asm' include 'hashes.asm' include 'bitstream.asm' include 'bytestream.asm' | > | 1 2 3 4 5 6 7 8 9 10 11 | include 'i18n.asm' include 'arrays.asm' include 'strlib.asm' include 'base64.asm' include 'uconfig.asm' include 'memstream.asm' include 'markdown.asm' include 'hashes.asm' include 'bitstream.asm' include 'bytestream.asm' |
| ︙ | ︙ |
| ︙ | ︙ | |||
649 650 651 652 653 654 655 | ; Frees all elements of the list calling ; [FreeProc] on every element. ; (proc FreeProc, ptrItem) ; Frees the array of items ;-------------------------------------------- proc ListFree, .ptrList, .FreeProc begin | | | | 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 |
; Frees all elements of the list calling
; [FreeProc] on every element.
; (proc FreeProc, ptrItem)
; Frees the array of items
;--------------------------------------------
proc ListFree, .ptrList, .FreeProc
begin
pushad
mov edi, [.ptrList]
mov ebx, [edi+TArray.count]
cmp [.FreeProc], 0
je .endwhile
.freeloop:
dec ebx
js .endwhile
stdcall [.FreeProc], [edi+4*ebx+TArray.array]
jmp .freeloop
.endwhile:
stdcall FreeMem, edi
.finish:
popad
return
endp
endmodule
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
; _______________________________________________________________________________________
;| |
;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." |
;|_______________________________________________________________________________________|
;
; Description: OS independent string manipulation library.
;
; Target OS: Any
;
; Dependencies:
;
; Notes: Author of this library is Decard (Mateusz Tymek)
;
;_________________________________________________________________________________________
module "Base64 library"
if used base64_table
base64_table db "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
db "abcdefghijklmnopqrstuvwxyz"
db "0123456789+/"
end if
; calculates size of base64 stream after encoding
proc Base64Size, .DataLen
begin
push ebx ecx edx
mov eax, [.DataLen]
mov ebx, eax
add eax, 2
xor edx, edx
mov ecx, 3
div ecx
add ebx, 3
sub ebx, edx
mov eax, ebx
xor edx, edx
div ecx
shl eax, 2
pop edx ecx ebx
return
endp
; encodes given buffer into base64 stream
proc EncodeBase64, .pData, .Length
begin
push ecx edx esi edi
mov esi, [.pData]
mov ecx, [.Length]
stdcall StrNew
mov edi, eax
stdcall Base64Size, ecx
stdcall StrSetCapacity, edi, eax
push edi
stdcall StrPtr, edi
mov edi, eax
push edi
.loop:
mov edx, [esi]
cmp ecx, 3
jae .remainder_ok
and edx, 0xffff
cmp ecx, 2
jae .remainder_ok
and edx, 0xff
.remainder_ok:
bswap edx
mov eax, edx
shr eax, 26
and eax, 111111b
mov al, [base64_table+eax]
mov [edi], al
inc edi
mov eax, edx
shr eax, 20
and eax, 111111b
mov al, [base64_table+eax]
mov [edi], al
inc edi
dec ecx
jz .r2
mov eax, edx
shr eax, 14
and eax, 111111b
mov al, [base64_table+eax]
mov [edi], al
inc edi
dec ecx
jz .r1
mov eax, edx
shr eax, 8
and eax, 111111b
mov al, [base64_table+eax]
mov [edi], al
inc edi
add esi, 3
dec ecx
jnz .loop
jmp .finish
.r2:
mov byte [edi], '-'
inc edi
.r1:
mov byte [edi], '-'
inc edi
.finish:
mov byte [edi], 0
mov ecx, edi
pop edi
sub ecx, edi ; string length.
mov [edi+string.len], ecx
pop eax ; string handle
pop edi esi edx ecx
return
endp
; decodes base64 stream into given buffer
proc DecodeBase64, .hString
.decode_table rb 0x100
.ret dd ?
begin
push ebx ecx edx esi edi
xor eax, eax
mov ebx, 63
.make_table:
mov al, [base64_table+ebx]
mov [.decode_table+eax], bl
dec ebx
jns .make_table
mov [.decode_table+'-'], 0
stdcall StrPtr, [.hString]
mov esi, eax
stdcall StrLen, [.hString]
mov ecx, eax
lea eax, [ecx+4]
stdcall GetMem, eax
lea edi, [eax+4]
mov [.ret], edi
xor ebx, ebx
xor eax, eax
.load_dword:
mov edx, [esi]
bswap edx
add esi, 4
mov al, dl
mov al, [.decode_table+eax]
shrd ebx, eax, 6
shr edx, 8
mov al, dl
mov al, [.decode_table+eax]
shrd ebx, eax, 6
shr edx, 8
mov al, dl
mov al, [.decode_table+eax]
shrd ebx, eax, 6
shr edx, 8
mov al, dl
mov al, [.decode_table+eax]
shrd ebx, eax, 6
bswap ebx
mov [edi], ebx
add edi, 3
sub ecx, 4
js .exit_loop ; this jump should be never taken
jnz .load_dword ; (src_size should be a multiple of four)
.exit_loop:
sub edi, 2
cmp byte [edi], 0
je .size_ok
inc edi
cmp byte [edi], 0
je .size_ok
inc edi
.size_ok:
mov eax, [.ret]
sub edi, eax
mov [eax-4], edi
pop edi esi edx ecx ebx
return
endp
endmodule
|
| ︙ | ︙ | |||
101 102 103 104 105 106 107 108 109 110 111 112 113 |
@@:
; read 2 bit header BTYPE
mov edx, eax
shr eax, 2
and edx, 3
sub ch, 2
dec edx
js .uncompressed ; BTYPE == 0 uncompressed type
mov [.b_type], edx ; 0 if fixed tree; <>0 if dynamic tree
jnz .dynamic_tree
| > > < | > | > > | 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
@@:
; read 2 bit header BTYPE
mov edx, eax
shr eax, 2
and edx, 3
sub ch, 2
dec edx
js .uncompressed ; BTYPE == 0 uncompressed type
mov [.b_type], edx ; 0 if fixed tree; <>0 if dynamic tree
jnz .dynamic_tree
; BTYPE == 1 compressed with fixed huffman tree.
; load the fixed huffman tree for literal/lengths.
pushad
lea edi, [.lengths]
lea esi, [.TreeFixed]
mov ebx, edi
xor eax, eax
xor ecx, ecx
mov dl, 4 ; edx == 0 here.
.loop_fx:
lodsw
mov cl, ah
rep stosb
dec edx
jnz .loop_fx
sub edi, ebx
lea eax, [.len_tree]
stdcall __tree_by_lengths, ebx, edi, eax
popad
jmp .decode
.dynamic_tree:
dec edx
jnz .error3 ; BTYPE == 3 invalid block type
|
| ︙ | ︙ | |||
219 220 221 222 223 224 225 |
rol eax, cl
@@:
dec edx
jnz .loop_hc
lea ebx, [.ll_tree]
| | | 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
rol eax, cl
@@:
dec edx
jnz .loop_hc
lea ebx, [.ll_tree]
stdcall __tree_by_lengths, edi, 19, ebx
jnz .error6
; now create the two remaining huffman trees: for literal/lengths and for distances.
; First the literal/lengths huffman tree
mov edx, [.LLCount]
|
| ︙ | ︙ | |||
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 |
xor edx, [.len_tree+4*edx]
jns .bitloop1
not edx
cmp edx, 255
ja .copy_from_older ; if EDX <= 255 then it is simple encoded byte, so store it.
; Store literal value.
mov [edi], dl
inc edi
jmp .decode
.copy_from_older:
sub edx, 257
js .next_block ; if EDX == 256 then end of block flag.
; The code is a length code. Compute the length of string to be copied from the previous decoded data.
; Compute the additional length and the extra bit count.
; 2^n(4 + edx mod 4)
| > > > > > > | 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 |
xor edx, [.len_tree+4*edx]
jns .bitloop1
not edx
cmp edx, 255
ja .copy_from_older ; if EDX <= 255 then it is simple encoded byte, so store it.
; OutputValue "Literal: ", edx, 16, 2
; Store literal value.
mov [edi], dl
inc edi
jmp .decode
.copy_from_older:
; OutputValue "Length code:", edx, 10, 3
sub edx, 257
js .next_block ; if EDX == 256 then end of block flag.
; The code is a length code. Compute the length of string to be copied from the previous decoded data.
; Compute the additional length and the extra bit count.
; 2^n(4 + edx mod 4)
|
| ︙ | ︙ | |||
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 |
or edx, -1
shl edx, cl
not edx
and edx, eax
shr eax, cl
sub ch, cl
jg .length_ok
add esi, 2
mov cl, ch
mov eax, [esi]
add ch, $10
rol eax, cl
.length_ok:
lea ebx, [ebx+edx+3]
; ... so now decode the distance code
cmp [.b_type], 0
jne .decode_dist ; when there is fixed huffman table, then the distances are encoded with 5 bit fixed code
; read fixed 5 bit distance.
| > > > > > | > > > | > | > > > | 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 |
or edx, -1
shl edx, cl
not edx
and edx, eax
shr eax, cl
; OutputValue "Additional value:", edx, 10, 2
sub ch, cl
jg .length_ok
add esi, 2
mov cl, ch
mov eax, [esi]
add ch, $10
rol eax, cl
.length_ok:
lea ebx, [ebx+edx+3]
; OutputValue "Copy length:", ebx, 10, 3
; ... so now decode the distance code
cmp [.b_type], 0
jne .decode_dist ; when there is fixed huffman table, then the distances are encoded with 5 bit fixed code
; read fixed 5 bit distance.
mov cl, 5
xor edx, edx
.bitloop4:
shr eax, 1
rcl edx, 1
dec cl
jnz .bitloop4
; OutputValue "Distance code:", edx, 10, 2
sub ch, 5
jg .compute_distance
add esi, 2
mov cl, ch
|
| ︙ | ︙ | |||
479 480 481 482 483 484 485 |
not [.final] ; Tricky makes CF=1 on exit.
.next_block:
mov [.pCurrent], edi
cmp [.final], 0
je .main_loop
| | < | 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 |
not [.final] ; Tricky makes CF=1 on exit.
.next_block:
mov [.pCurrent], edi
cmp [.final], 0
je .main_loop
; exit!
shl [.final], 1 ; If normal end [.final] is always 1; If error, [.final] is $ffffffff or $fffffffe
popad
return
|
| ︙ | ︙ | |||
618 619 620 621 622 623 624 |
jnz .rep_loop
; next length
cmp edi, [.p_lengths_end]
jb .loop_len
ja .errordl
| | | 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 |
jnz .rep_loop
; next length
cmp edi, [.p_lengths_end]
jb .loop_len
ja .errordl
stdcall __tree_by_lengths ; the arguments are already in the stack.
retn
; The assembly way of error handling. ;)
.errordl:
add esp, 3*4 + 4 ; pushed arguments and the return address.
jmp .error
|
| ︙ | ︙ | |||
657 658 659 660 661 662 663 | ; and contains NOT-ed symbol value instead of index in the array. ; ; ZF=0 Error. The provided length list describes not valid Huffman tree. ; In this case no values are filled in the tree. ; ; The comments in the code are according to the RFC-1951 ; | | | 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 |
; and contains NOT-ed symbol value instead of index in the array.
;
; ZF=0 Error. The provided length list describes not valid Huffman tree.
; In this case no values are filled in the tree.
;
; The comments in the code are according to the RFC-1951
;
proc __tree_by_lengths, .pLengths, .count, .pTree
.bl_count rd DEFLATE_MAX_BITS + 1
.next_code rd DEFLATE_MAX_BITS + 1 ; keep immediately after .bl_count
begin
pushad
|
| ︙ | ︙ |
| ︙ | ︙ | |||
2351 2352 2353 2354 2355 2356 2357 | endp ;_______________________________________________________________________ ; proc StrClipQuotes ; First removes the spaced from the beginning and from the end of the | | | 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 | endp ;_______________________________________________________________________ ; proc StrClipQuotes ; First removes the spaced from the beginning and from the end of the ; string. Then check whether the string is quoted string - i.e. starts ; and ends with equal characters single or double quote. If so, removes ; them as well. ; ; Arguments: ; hString - string to be processed ; Returns: ; CF=1 - invalid string handle. |
| ︙ | ︙ | |||
2739 2740 2741 2742 2743 2744 2745 | ; UTF-8 support functions. ; Some of the above functions also need some revision in order to support ; utf-8 strings properly. | > > | | 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 |
; UTF-8 support functions.
; Some of the above functions also need some revision in order to support
; utf-8 strings properly.
;! Bug - on [.len]=-1 sometimes in Linux returns error on normal strings.
proc StrLenUtf8, .hString, .len
.maxptr dd ?
begin
push esi ecx edx
stdcall StrPtr, [.hString]
|
| ︙ | ︙ |
| ︙ | ︙ | |||
21 22 23 24 25 26 27 | ends struct POINT .x dd ? .y dd ? ends | > > > > > > > > | 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | ends struct POINT .x dd ? .y dd ? ends struct TBounds .x dd ? .y dd ? .width dd ? .height dd ? ends |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 |
; _______________________________________________________________________________________
;| |
;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." |
;|_______________________________________________________________________________________|
;
; Description: FreeType library constants and structures.
;
; Target OS: Linux
;
; Dependencies:
;
; Notes:
;_________________________________________________________________________________________
FT_FACE_FLAG_SCALABLE = $0001
FT_FACE_FLAG_FIXED_SIZES = $0002
FT_FACE_FLAG_FIXED_WIDTH = $0004
FT_FACE_FLAG_SFNT = $0008
FT_FACE_FLAG_HORIZONTAL = $0010
FT_FACE_FLAG_VERTICAL = $0020
FT_FACE_FLAG_KERNING = $0040
FT_FACE_FLAG_FAST_GLYPHS = $0080
FT_FACE_FLAG_MULTIPLE_MASTERS = $0100
FT_FACE_FLAG_GLYPH_NAMES = $0200
FT_FACE_FLAG_EXTERNAL_STREAM = $0400
FT_FACE_FLAG_HINTER = $0800
FT_FACE_FLAG_CID_KEYED = $1000
FT_FACE_FLAG_TRICKY = $2000
FT_LOAD_DEFAULT = $0
FT_LOAD_NO_SCALE = $1
FT_LOAD_NO_HINTING = $2
FT_LOAD_RENDER = $4
FT_LOAD_NO_BITMAP = $8
FT_LOAD_VERTICAL_LAYOUT = $10
FT_LOAD_FORCE_AUTOHINT = $20
FT_LOAD_CROP_BITMAP = $40 ; deprecated, ignored
FT_LOAD_PEDANTIC = $80
FT_LOAD_ADVANCE_ONLY = $100
FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH = $200 ; deprecated, ignored
FT_LOAD_NO_RECURSE = $400
FT_LOAD_IGNORE_TRANSFORM = $800
FT_LOAD_MONOCHROME = $1000
FT_LOAD_LINEAR_DESIGN = $2000
FT_LOAD_SBITS_ONLY = $4000
FT_LOAD_NO_AUTOHINT = $8000
FT_LOAD_COLOR = $100000
FT_ADVANCE_FLAG_FAST_ONLY = $20000000
FT_RENDER_MODE_NORMAL = 0
FT_RENDER_MODE_LIGHT = 1
FT_RENDER_MODE_MONO = 2
FT_RENDER_MODE_LCD = 3
FT_RENDER_MODE_LCD_V = 4
FT_RENDER_MODE_MAX = 5
struc FT_LOAD_TARGET x {
. = (x and 15) shl 16
}
FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET FT_RENDER_MODE_NORMAL
FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET FT_RENDER_MODE_LIGHT
FT_LOAD_TARGET_MONO FT_LOAD_TARGET FT_RENDER_MODE_MONO
FT_LOAD_TARGET_LCD FT_LOAD_TARGET FT_RENDER_MODE_LCD
FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_NONE = 0
FT_PIXEL_MODE_MONO = 1
FT_PIXEL_MODE_GRAY = 2
FT_PIXEL_MODE_GRAY2 = 3
FT_PIXEL_MODE_GRAY4 = 4
FT_PIXEL_MODE_LCD = 5
FT_PIXEL_MODE_LCD_V = 6
FT_PIXEL_MODE_BGRA = 7
struct FT_Generic
.data dd ?
.finalizer dd ? ; pointer to procedure with one argument.
ends
struct FT_BBox
.xMin dd ?
.yMin dd ?
.xMax dd ?
.yMax dd ?
ends
struct FT_Vector
.x dd ?
.y dd ?
ends
struct FT_Bitmap
.rows dd ?
.width dd ?
.pitch dd ?
.buffer dd ? ; pointer to the buffer.
.num_grays dw ?
.pixel_mode db ?
.palette_mode db ?
.palette dd ? ; pointer to the palette.
ends
struct FT_Outline
.n_contours dw ?
.n_points dw ?
.points dd ? ; pointer to array of FT_Vector elements.
.tags dd ? ; pointer to byte array.
.contours dd ? ; pointer to word array.
.flags dd ?
ends
struct FT_Glyph_Metrics
.width dd ?
.height dd ?
.horiBearingX dd ?
.horiBearingY dd ?
.horiAdvance dd ?
.vertBearingX dd ?
.vertBearingY dd ?
.vertAdvance dd ?
ends
struct FT_GlyphSlot
.library dd ?
.face dd ? ; parent FT_Face object
.next dd ? ; pointer tp FT_GlyphSlot
.reserved dd ?
.generic FT_Generic
.metrics FT_Glyph_Metrics
.linearHoriAdvance dd ?
.linearVertAdvance dd ?
.advance FT_Vector
.format dd ?
.bitmap FT_Bitmap
.bitmap_left dd ?
.bitmap_top dd ?
.outline FT_Outline
.num_subglyphs dd ?
.subglyphs dd ? ; pointer to array of FT_SubGlyphRec elements.
.control_data dd ?
.control_len dd ?
.lsb_delta dd ?
.rsb_delta dd ?
.other dd ?
.internal dd ? ; pointer to FT_Slot_InternalRec
ends
struct FT_FaceRec
.num_faces dd ?
.face_index dd ?
.face_flags dd ?
.style_flags dd ?
.num_glyphs dd ?
.family_name dd ?
.style_name dd ?
.num_fixed_sizes dd ?
.available_sizes dd ?
.num_charmaps dd ?
.charmaps dd ?
.generic FT_Generic
; scalable fonts members down to .underline_thickness
.bbpx FT_BBox
.units_per_EM dw ?
.ascender dw ?
.descender dw ?
.height dw ?
.max_advance_width dw ?
.max_advance_height dw ?
.underline_position dw ?
.underline_thickness dw ?
.glyph dd ? ; pointer to FT_GlyphSlot
.size dd ? ; pointer to FT_Size
.charmap dd ? ; pointer to FT_CharMap
; down is the private part.
ends
struct FT_GlyphRec
.library dd ?
.clazz dd ?
.format dd ?
.advance FT_Vector
ends
struct FT_BitmapGlyphRec
.root FT_GlyphRec
.left dd ?
.top dd ?
.bitmap FT_Bitmap
ends
FT_SIZE_REQUEST_TYPE_NOMINAL = 0
FT_SIZE_REQUEST_TYPE_REAL_DIM = 1
FT_SIZE_REQUEST_TYPE_BBOX = 2
FT_SIZE_REQUEST_TYPE_CELL = 3
FT_SIZE_REQUEST_TYPE_SCALES = 4
struct FT_Size_RequestRec
.type dd ?
.width dd ?
.height dd ?
.horiResolution dd ?
.vertResolution dd ?
ends
struct FT_Size_Metrics
.x_ppem dw ? ; horizontal pixels per EM
.y_ppem dw ? ; vertical pixels per EM
.x_scale dd ? ; scaling values used to convert font
.y_scale dd ? ; units to 26.6 fractional pixels
.ascender dd ? ; ascender in 26.6 frac. pixels
.descender dd ? ; descender in 26.6 frac. pixels
.height dd ? ; text height in 26.6 frac. pixels
.max_advance dd ? ; max horizontal advance, in 26.6 pixels
ends
struct FT_SizeRec
.face dd ? ; parent face object
.generic FT_Generic ; generic pointer for client uses
.metrics FT_Size_Metrics ; size metrics
.internal:
ends
struct FTC_ScalerRec
.face_id dd ?
.width dd ?
.height dd ?
.pixel dd ?
.x_res dd ?
.y_res dd ?
ends
struct FTC_ImageType
.face_id dd ?
.width dd ?
.height dd ?
.flags dd ?
ends
interface FT_Face_Requester, .face_id, .library, .request_data, .pFace
|
| ︙ | ︙ | |||
25 26 27 28 29 30 31 32 33 34 35 36 37 38 | SO_KEEPALIVE = 1 shl 4 SO_OOBINLINE = 1 shl 5 SO_REUSEADDR = 1 shl 6 SO_REUSEPORT = 1 shl 7 SO_USELOOPBACK = 1 shl 8 SO_BINDTODEVICE = 1 shl 9 SO_BLOCK = 1 shl 10 ; Socket level SOL_SOCKET = 0 ; Socket States SS_NOFDREF = 0x001 ; no file table ref any more SS_ISCONNECTED = 0x002 ; socket connected to a peer | > > > > > > | 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | SO_KEEPALIVE = 1 shl 4 SO_OOBINLINE = 1 shl 5 SO_REUSEADDR = 1 shl 6 SO_REUSEPORT = 1 shl 7 SO_USELOOPBACK = 1 shl 8 SO_BINDTODEVICE = 1 shl 9 SO_BLOCK = 1 shl 10 SO_RCVBUF = 0 SO_SNDBUF = 0 SO_RCVTIMEO = 0 SO_SNDTIMEO = 0 SO_LINGER = 0 ; Socket level SOL_SOCKET = 0 ; Socket States SS_NOFDREF = 0x001 ; no file table ref any more SS_ISCONNECTED = 0x002 ; socket connected to a peer |
| ︙ | ︙ |
1 2 3 4 5 6 7 | sys_drawwindow = 0 ; DrawWindow syscall_setpixel = 1 ; SetPixel sys_getkey = 2 ; GetKey sys_clock = 3 ; GetTime sys_writetext = 4 ; WriteText sys_delay_hs = 5 ; DelayHs sys_openramdiskfile = 6 ; OpenRamdiskFile | > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ; _______________________________________________________________________________________ ;| | ;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license. | ;|_______________________________________________________________________________________| ; ; Description: KolibriOS system functions and related constants. ; ; Target OS: KolibriOS ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ sys_drawwindow = 0 ; DrawWindow syscall_setpixel = 1 ; SetPixel sys_getkey = 2 ; GetKey sys_clock = 3 ; GetTime sys_writetext = 4 ; WriteText sys_delay_hs = 5 ; DelayHs sys_openramdiskfile = 6 ; OpenRamdiskFile |
| ︙ | ︙ |
| ︙ | ︙ | |||
12 13 14 15 16 17 18 | ; Notes: ;_________________________________________________________________________________________ include '_syscalls.inc' include '_geometry.inc' include '_network.inc' | > | 12 13 14 15 16 17 18 19 | ; Notes: ;_________________________________________________________________________________________ include '_syscalls.inc' include '_geometry.inc' include '_network.inc' include '_libFT.inc' |
| ︙ | ︙ | |||
419 420 421 422 423 424 425 426 427 428 429 430 431 432 | GCClipYOrigin = 40000h GCClipMask = 80000h GCDashOffset = 100000h GCDashList = 200000h GCArcMode = 400000h GCLastBit = 22 GCAll = (1 shl (GCLastBit+1)) -1 struct XGCValues .function dd ? ; logical operation .plane_mask dd ? ; plane mask .foreground dd ? ; foreground pixel | > > > > > > > > | 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 | GCClipYOrigin = 40000h GCClipMask = 80000h GCDashOffset = 100000h GCDashList = 200000h GCArcMode = 400000h GCLastBit = 22 struct XRectangle .x dw ? .y dw ? .width dw ? .height dw ? ends GCAll = (1 shl (GCLastBit+1)) -1 struct XGCValues .function dd ? ; logical operation .plane_mask dd ? ; plane mask .foreground dd ? ; foreground pixel |
| ︙ | ︙ | |||
1013 1014 1015 1016 1017 1018 1019 | struct XEvent .xany XAnyEvent .pad rb 24*4 - sizeof.XAnyEvent virtual at .xany . XAnyEvent end virtual | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 |
struct XEvent
.xany XAnyEvent
.pad rb 24*4 - sizeof.XAnyEvent
virtual at .xany
. XAnyEvent
end virtual
;
;
; virtual at .xany
; .xkey XKeyEvent
; end virtual
;
; virtual at .xany
; .xbutton XButtonEvent
; end virtual
;
; virtual at .xany
; .xmotion XMotionEvent
; end virtual
;
; virtual at .xany
; .xcrossing XCrossingEvent
; end virtual
;
; virtual at .xany
; .xfocus XFocusChangeEvent
; end virtual
;
; virtual at .xany
; .xexpose XExposeEvent
; end virtual
;
; virtual at .xany
; .xgraphicsexpose XGraphicsExposeEvent
; end virtual
;
; virtual at .xany
; .xnoexpose XNoExposeEvent
; end virtual
;
; virtual at .xany
; .xvisibility XVisibilityEvent
; end virtual
;
; virtual at .xany
; .xcreatewindow XCreateWindowEvent
; end virtual
;
; virtual at .xany
; .xdestroywindow XDestroyWindowEvent
; end virtual
;
; virtual at .xany
; .xunmap XUnmapEvent
; end virtual
;
; virtual at .xany
; .xmap XMapEvent
; end virtual
;
; virtual at .xany
; .xmaprequest XMapRequestEvent
; end virtual
;
; virtual at .xany
; .xreparent XReparentEvent
; end virtual
;
; virtual at .xany
; .xconfigure XConfigureEvent
; end virtual
;
; virtual at .xany
; .xgravity XGravityEvent
; end virtual
;
; virtual at .xany
; .xresizerequest XResizeEvent
; end virtual
;
; virtual at .xany
; .xconfigurerequest XConfigureRequestEvent
; end virtual
;
; virtual at .xany
; .xcirculate XCirculateEvent
; end virtual
;
; virtual at .xany
; .xcirculaterequest XCirculateRequestEvent
; end virtual
;
; virtual at .xany
; .xproperty XPropertyEvent
; end virtual
;
; virtual at .xany
; .xselectionclear XSelectionClearEvent
; end virtual
;
; virtual at .xany
; .xselectionrequest XSelectionRequestEvent
; end virtual
;
; virtual at .xany
; .xselection XSelectionEvent
; end virtual
;
; virtual at .xany
; .xcolormap XColormapEvent
; end virtual
;
; virtual at .xany
; .xclient XClientMessageEvent
; end virtual
;
; virtual at .xany
; .xmapping XMappingEvent
; end virtual
;
; virtual at .xany
; .xerror XErrorEvent
; end virtual
;
; virtual at .xany
; .xkeymap XKeymapEvent
; end virtual
ends
; Misc. Structures
struct XKeyboardControl
.key_click_percent rd 1
|
| ︙ | ︙ |
| ︙ | ︙ | |||
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ; Target OS: Linux ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ struct RECT .left dd ? .top dd ? .right dd ? .bottom dd ? ends struct POINT .x dd ? .y dd ? ends | > > > > > > > > > | < < < < < | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | ; Target OS: Linux ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ struct TBounds .x dd ? .y dd ? .width dd ? .height dd ? ends struct RECT .left dd ? .top dd ? .right dd ? .bottom dd ? ends struct POINT .x dd ? .y dd ? ends |
| ︙ | ︙ | |||
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
FT_LOAD_NO_RECURSE = $400
FT_LOAD_IGNORE_TRANSFORM = $800
FT_LOAD_MONOCHROME = $1000
FT_LOAD_LINEAR_DESIGN = $2000
FT_LOAD_SBITS_ONLY = $4000
FT_LOAD_NO_AUTOHINT = $8000
FT_LOAD_COLOR = $100000
FT_RENDER_MODE_NORMAL = 0
FT_RENDER_MODE_LIGHT = 1
FT_RENDER_MODE_MONO = 2
FT_RENDER_MODE_LCD = 3
FT_RENDER_MODE_LCD_V = 4
FT_RENDER_MODE_MAX = 5
struc FT_LOAD_TARGET x {
. = (x and 15) shl 16
}
FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET FT_RENDER_MODE_NORMAL
FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET FT_RENDER_MODE_LIGHT
FT_LOAD_TARGET_MONO FT_LOAD_TARGET FT_RENDER_MODE_MONO
FT_LOAD_TARGET_LCD FT_LOAD_TARGET FT_RENDER_MODE_LCD
FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_NONE = 0
FT_PIXEL_MODE_MONO = 1
FT_PIXEL_MODE_GRAY = 2
FT_PIXEL_MODE_GRAY2 = 3
FT_PIXEL_MODE_GRAY4 = 4
| > > > > | 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
FT_LOAD_NO_RECURSE = $400
FT_LOAD_IGNORE_TRANSFORM = $800
FT_LOAD_MONOCHROME = $1000
FT_LOAD_LINEAR_DESIGN = $2000
FT_LOAD_SBITS_ONLY = $4000
FT_LOAD_NO_AUTOHINT = $8000
FT_LOAD_COLOR = $100000
FT_ADVANCE_FLAG_FAST_ONLY = $20000000
FT_RENDER_MODE_NORMAL = 0
FT_RENDER_MODE_LIGHT = 1
FT_RENDER_MODE_MONO = 2
FT_RENDER_MODE_LCD = 3
FT_RENDER_MODE_LCD_V = 4
FT_RENDER_MODE_MAX = 5
struc FT_LOAD_TARGET x {
. = (x and 15) shl 16
}
FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET FT_RENDER_MODE_NORMAL
FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET FT_RENDER_MODE_LIGHT
FT_LOAD_TARGET_MONO FT_LOAD_TARGET FT_RENDER_MODE_MONO
FT_LOAD_TARGET_LCD FT_LOAD_TARGET FT_RENDER_MODE_LCD
FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_NONE = 0
FT_PIXEL_MODE_MONO = 1
FT_PIXEL_MODE_GRAY = 2
FT_PIXEL_MODE_GRAY2 = 3
FT_PIXEL_MODE_GRAY4 = 4
|
| ︙ | ︙ | |||
203 204 205 206 207 208 209 | .size dd ? ; pointer to FT_Size .charmap dd ? ; pointer to FT_CharMap ; down is the private part. ends | < < < < < < < < | 207 208 209 210 211 212 213 214 215 216 217 218 219 220 | .size dd ? ; pointer to FT_Size .charmap dd ? ; pointer to FT_CharMap ; down is the private part. ends struct FT_GlyphRec .library dd ? .clazz dd ? .format dd ? .advance FT_Vector ends |
| ︙ | ︙ | |||
275 276 277 278 279 280 281 282 283 284 285 | .width dd ? .height dd ? .pixel dd ? .x_res dd ? .y_res dd ? ends interface FT_Face_Requester, .face_id, .library, .request_data, .pFace | > > > > > > > > | 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 | .width dd ? .height dd ? .pixel dd ? .x_res dd ? .y_res dd ? ends struct FTC_ImageType .face_id dd ? .width dd ? .height dd ? .flags dd ? ends interface FT_Face_Requester, .face_id, .library, .request_data, .pFace |
| ︙ | ︙ | |||
662 663 664 665 666 667 668 |
; Signal values
; default action is: "Term" - terminate; "Core" - terminate with core dump; "Ign" - ignore; "Stop" - stop the process; "Cont" - continue the process.
macro signal name, value {
name = value
| | | 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 |
; Signal values
; default action is: "Term" - terminate; "Core" - terminate with core dump; "Ign" - ignore; "Stop" - stop the process; "Cont" - continue the process.
macro signal name, value {
name = value
name#.mask = 1 shl value
}
signal SIGHUP , 1 ; Term Hangup detected on controlling terminal or death of controlling process
signal SIGINT , 2 ; Term Interrupt from keyboard
signal SIGQUIT , 3 ; Core Quit from keyboard
signal SIGILL , 4 ; Core Illegal Instruction
signal SIGTRAP , 5 ; Core Trace/breakpoint trap
|
| ︙ | ︙ |
| ︙ | ︙ | |||
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | .biCompression dd ? .biSizeImage dd ? .biXPelsPerMeter dd ? .biYPelsPerMeter dd ? .biClrUsed dd ? .biClrImportant dd ? ends struct BITMAPFILEHEADER .bfType dw ? .bfSize dd ? .bfReserved1 dw ? .bfReserved2 dw ? .bfOffBits dd ? ends struct TEXTMETRIC .tmHeight dd ? .tmAscent dd ? .tmDescent dd ? .tmInternalLeading dd ? .tmExternalLeading dd ? | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | .biCompression dd ? .biSizeImage dd ? .biXPelsPerMeter dd ? .biYPelsPerMeter dd ? .biClrUsed dd ? .biClrImportant dd ? ends struct CIEXYZ .ciexyzX dd ? .ciexyzY dd ? .ciexyzZ dd ? ends struct CIEXYZTRIPLE .ciexyzRed CIEXYZ .ciexyzGreen CIEXYZ .ciexyzBlue CIEXYZ ends struct BITMAPV4HEADER .biSize dd ? .biWidth dd ? .biHeight dd ? .biPlanes dw ? .biBitCount dw ? .biCompression dd ? .biSizeImage dd ? .biXPelsPerMeter dd ? .biYPelsPerMeter dd ? .biClrUsed dd ? .biClrImportant dd ? .RedMask dd ? .GreenMask dd ? .BlueMask dd ? .AlphaMask dd ? .CSType dd ? .Endpoints CIEXYZTRIPLE .GamaRed dd ? .GammaGreen dd ? .GammaBlue dd ? ends struct BITMAPFILEHEADER .bfType dw ? .bfSize dd ? .bfReserved1 dw ? .bfReserved2 dw ? .bfOffBits dd ? ends struct TEXTMETRIC .tmHeight dd ? .tmAscent dd ? .tmDescent dd ? .tmInternalLeading dd ? .tmExternalLeading dd ? |
| ︙ | ︙ | |||
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | .tmItalic db ? .tmUnderlined db ? .tmStruckOut db ? .tmPitchAndFamily db ? .tmCharSet db ? .__align rb 7 ends struct LOGBRUSH .lbStyle dd ? .lbColor dd ? .lbHatch dd ? ends struct LOGPEN .lopnStyle dd ? .lopnWidth POINT .lopnColor dd ? ends | > > > > | 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | .tmItalic db ? .tmUnderlined db ? .tmStruckOut db ? .tmPitchAndFamily db ? .tmCharSet db ? .__align rb 7 ends struct LOGBRUSH .lbStyle dd ? .lbColor dd ? .lbHatch dd ? ends struct LOGPEN .lopnStyle dd ? .lopnWidth POINT .lopnColor dd ? ends |
| ︙ | ︙ |
| ︙ | ︙ | |||
320 321 322 323 324 325 326 | WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW WS_TILED = WS_OVERLAPPED WS_ICONIC = WS_MINIMIZE WS_SIZEBOX = WS_THICKFRAME ; Extended Window Styles | | | | | | | | | | | | | | | | | | | | | | > | 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 | WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW WS_TILED = WS_OVERLAPPED WS_ICONIC = WS_MINIMIZE WS_SIZEBOX = WS_THICKFRAME ; Extended Window Styles WS_EX_DLGMODALFRAME = 00000001h WS_EX_DRAGOBJECT = 00000002h WS_EX_NOPARENTNOTIFY = 00000004h WS_EX_TOPMOST = 00000008h WS_EX_ACCEPTFILES = 00000010h WS_EX_TRANSPARENT = 00000020h WS_EX_MDICHILD = 00000040h WS_EX_TOOLWINDOW = 00000080h WS_EX_WINDOWEDGE = 00000100h WS_EX_CLIENTEDGE = 00000200h WS_EX_CONTEXTHELP = 00000400h WS_EX_RIGHT = 00001000h WS_EX_LEFT = 00000000h WS_EX_RTLREADING = 00002000h WS_EX_LTRREADING = 00000000h WS_EX_LEFTSCROLLBAR = 00004000h WS_EX_RIGHTSCROLLBAR = 00000000h WS_EX_CONTROLPARENT = 00010000h WS_EX_STATICEDGE = 00020000h WS_EX_APPWINDOW = 00040000h WS_EX_LAYERED = 00080000h WS_EX_NOACTIVATE = 08000000h WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE or WS_EX_CLIENTEDGE WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE or WS_EX_TOOLWINDOW or WS_EX_TOPMOST ; MDI client style bits MDIS_ALLCHILDSTYLES = 1 |
| ︙ | ︙ |
> > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ; _______________________________________________________________________________________ ;| | ;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." | ;|_______________________________________________________________________________________| ; ; Description: Different geometry structures. ; ; Target OS: Windows ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ struct TBounds .x dd ? .y dd ? .width dd ? .height dd ? ends |
| ︙ | ︙ | |||
10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ CRLF equ 13, 10 include '_kernel32.inc' include '_user32.inc' include '_gdi32.inc' include '_comctl32.inc' include '_comdlg32.inc' include '_shell32.inc' include '_wsock32.inc' | > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ CRLF equ 13, 10 include '_geometry.inc' include '_kernel32.inc' include '_user32.inc' include '_gdi32.inc' include '_comctl32.inc' include '_comdlg32.inc' include '_shell32.inc' include '_wsock32.inc' |
| ︙ | ︙ |
| ︙ | ︙ | |||
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ; Target OS: Any ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ TRUE = 1 FALSE = 0 NULL = 0 include '%TargetOS%/allequates.inc' include '_sqlite3.inc' include '_zlib1.inc' include '_sdl.inc' | > > > > > > > > > > > > > | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | ; Target OS: Any ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ ; Very generic constants! TRUE = 1 FALSE = 0 NULL = 0 regEDI = 0 regESI = 1 regEBP = 2 regESP = 3 regEBX = 4 regEDX = 5 regECX = 6 regEAX = 7 include '%TargetOS%/allequates.inc' include '_sqlite3.inc' include '_zlib1.inc' include '_sdl.inc' |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ | > > > > > > > > > > > > > > > | | > > > > > > > > > | > > > > | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
;
; Dependencies:
;
; Notes:
;_________________________________________________________________________________________
; needed for FreeType support.
proc FTCRequester as FT_Face_Requester
begin
return
endp
body FontCreate
begin
return
endp
body FontDestroy
begin
return
endp
body GetFontMetrics
begin
return
endp
|
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ | > > > > > | | > | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
;
; Dependencies:
;
; Notes:
;_________________________________________________________________________________________
struct TImage
.width dd ? ; width in pixels.
.height dd ? ; height in pixels.
.pPixels dd ? ; pointer to the pixel memory.
ends
body CreateImage
begin
stc
return
endp
body DestroyImage
begin
return
endp
body DrawImageRect
begin
return
endp
|
| ︙ | ︙ | |||
9 10 11 12 13 14 15 16 | ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > | > > > > > > | > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 |
;
; Dependencies:
;
; Notes:
;_________________________________________________________________________________________
iglobal
var flagFreeTypeLoadFlags = FT_LOAD_RENDER or FT_LOAD_TARGET_LCD or FT_LOAD_NO_AUTOHINT or FT_LOAD_COLOR
endg
uglobal
var FTC_CMapCache_Lookup = 0
var FTC_ImageCache_LookupScaler = 0
endg
body DrawDecomposedString ;, .pImage, .pArray, .x, .y, .font, .color
.scaler FTC_ScalerRec
.glyph dd ?
.startX dd ?
begin
pushad
mov edx, [.font]
xor ecx, ecx
mov [.scaler.face_id], edx
mov [.scaler.width], ecx
mov eax, [edx+__TFont.height]
inc ecx
mov [.scaler.height], eax
mov [.scaler.pixel], ecx ; ecx = 1
mov eax, [.x]
mov [.startX], eax
mov esi, [.pArray]
xor edi, edi
dec edi
.char_loop:
inc edi
cmp edi, [esi+TArray.count]
jae .finish
cmp word [esi+TArray.array+8*edi+TTextChar.width], 0
je .char_ok
cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, [esi+TArray.array+8*edi+TTextChar.code]
lea ecx, [.scaler]
lea edx, [.glyph]
cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0
test eax, eax
jnz .char_ok
mov ebx, [.glyph]
mov ecx, [.x]
mov edx, [.y]
add ecx, [ebx+FT_BitmapGlyphRec.left]
sub edx, [ebx+FT_BitmapGlyphRec.top]
lea eax, [ebx+FT_BitmapGlyphRec.bitmap]
stdcall __DrawGlyph, [.pImage], eax, ecx, edx, [.color]
movzx eax, word [esi+TArray.array+8*edi+TTextChar.width]
add [.x], eax
.char_ok:
; check for new line.
movzx eax, word [esi+TArray.array+8*edi+TTextChar.height]
test eax, eax
jz .char_loop
add [.y], eax
mov eax, [.startX]
mov [.x], eax
jmp .char_loop
.finish:
popad
return
endp
; Draws the string on the image using the specified font and color.
; The string is drawn in one line. The control symbols are not
; processed. The tabs are not expanded or replaced with spaces.
;
; Arguments:
; .pImage - pointer to the image where to draw the text.
; .pString - pointer to a UTF-8 string.
; .len - how many bytes from the string to be drawn. If -1, the whole string will be drawn.
; .x - X coordinate, where to start drawing.
; .y - Y coordinate of the baseline where to draw the string.
; .font - the font to be used.
; .color - ARGB color to draw the glyphs.
;
;;;;;;;; Returns:
;;;;;;;; EAX - the width of the string in pixels.
;;;;;;;; EBX - the ascender of the string. It is negative.
;;;;;;;; EDX - the height of the string in pixels.
body DrawString ;, .pImage, .pString, .len, .x, .y, .font, .color
.scaler FTC_ScalerRec
.glyph dd ?
.miny dd ?
.maxy dd ?
.startX dd ?
begin
pushad
mov edx, [.font]
xor ecx, ecx
mov [.scaler.face_id], edx
mov [.scaler.width], ecx
mov eax, [edx+__TFont.height]
inc ecx
mov [.scaler.height], eax
mov [.scaler.pixel], ecx ; ecx = 1
ror ecx, 1 ; ecx = $80000000
mov [.maxy], ecx
dec ecx
mov [.miny], ecx ; ecx = $7fffffff
mov eax, [.x]
mov [.startX], eax
mov esi, [.pString]
.char_loop:
stdcall DecodeUtf8, [esi]
jc .finish
add esi, edx
sub [.len], edx
jb .finish
test eax, eax
jz .finish
cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax
lea ecx, [.scaler]
lea edx, [.glyph]
cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0
test eax, eax
jnz .char_loop
mov ebx, [.glyph]
mov ecx, [.x]
mov edx, [.y]
add ecx, [ebx+FT_BitmapGlyphRec.left]
sub edx, [ebx+FT_BitmapGlyphRec.top]
cmp edx, [.miny]
jge @f
mov [.miny], edx
@@:
mov eax, edx
add eax, [ebx+FT_BitmapGlyphRec.bitmap.rows]
cmp eax, [.maxy]
jle @f
mov [.maxy], eax
@@:
lea eax, [ebx+FT_BitmapGlyphRec.bitmap]
stdcall __DrawGlyph, [.pImage], eax, ecx, edx, [.color]
mov eax, [ebx+FT_BitmapGlyphRec.root.advance.x]
sar eax, 16 ; format 16.16 fixed decimal point.
add [.x], eax
jmp .char_loop
.finish:
; mov eax, [.x]
; mov edx, [.maxy]
; mov ebx, [.miny]
; sub eax, [.startX]
; sub edx, ebx
; sub ebx, [.y]
; mov [esp+4*regEAX], eax
; mov [esp+4*regEBX], ebx
; mov [esp+4*regEDX], edx
popad
return
endp
; returns:
; EAX - array with decomposed string.
; EDX - maximal bearing_Y of the string.
; ECX - maximal descender of the string.
body TextDecompose ;, .hString, .font
.scaler FTC_ScalerRec
.glyph dd ?
.miny dd ?
.maxy dd ?
begin
pushad
mov edx, [.font]
xor ecx, ecx
mov [.scaler.face_id], edx
mov [.scaler.width], ecx
mov eax, [edx+__TFont.height]
inc ecx
mov [.scaler.height], eax
mov [.scaler.pixel], ecx ; ecx = 1
ror ecx, 1 ; ecx = $80000000
mov [.maxy], ecx
dec ecx
mov [.miny], ecx ; ecx = $7fffffff
stdcall StrPtr, [.hString]
mov esi, eax
stdcall CreateArray, sizeof.TTextChar
mov edi, eax
.char_loop:
stdcall DecodeUtf8, [esi]
jc .finish
add esi, edx
mov ebx, eax
test eax, eax
jz .end
cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax
lea ecx, [.scaler]
lea edx, [.glyph]
cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0
xor ecx, ecx
test eax, eax
jnz .glyph_size_ok ; zero width glyph ????
mov ecx, [.glyph]
mov eax, [ecx+FT_BitmapGlyphRec.top]
neg eax
cmp eax, [.miny]
jge @f
mov [.miny], eax
@@:
add eax, [ecx+FT_BitmapGlyphRec.bitmap.rows]
cmp eax, [.maxy]
jle @f
mov [.maxy], eax
@@:
mov ecx, [ecx+FT_BitmapGlyphRec.root.advance.x] ; format 16.16 fixed decimal point.
sar ecx, 16 ; format 16.16
.glyph_size_ok:
stdcall AddArrayItems, edi, 1
mov edi, edx
mov dword [eax+TTextChar.width], ecx
mov [eax+TTextChar.code], ebx
jmp .char_loop
.end:
clc
.finish:
mov [esp+4*regEAX], edi
mov eax, [.miny]
neg eax
mov ecx, [.maxy]
mov [esp+4*regEDX], eax
mov [esp+4*regECX], ecx
add ecx, eax
mov [edi+TArray.lparam], ecx
popad
return
endp
; Returns an array with the widths from the begining of the text to the every character inside the string.
proc GetTextWidthsArray, .hString, .font
.scaler FTC_ScalerRec
.glyph dd ?
.x dd ?
begin
pushad
mov edx, [.font]
xor ecx, ecx
mov [.scaler.face_id], edx
mov [.scaler.width], ecx
mov eax, [edx+__TFont.height]
inc ecx
mov [.scaler.height], eax
mov [.scaler.pixel], ecx ; ecx = 1
stdcall StrPtr, [.hString]
mov esi, eax
stdcall CreateArray, 4
mov edi, eax
xor ebx, ebx
.char_loop:
stdcall DecodeUtf8, [esi]
jc .finish
add esi, edx
test eax, eax
jz .end
cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax
lea ecx, [.scaler]
lea edx, [.glyph]
cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0
test eax, eax
jnz .glyph_size_ok ; zero width glyph ????
mov ecx, [.glyph]
mov ecx, [ecx+FT_BitmapGlyphRec.root.advance.x] ; format 16.16 fixed decimal point.
add ebx, ecx
.glyph_size_ok:
stdcall AddArrayItems, edi, 1
mov edi, edx
mov edx, ebx
sar edx, 16 ; format 16.16
mov [eax], edx
jmp .char_loop
.end:
clc
.finish:
mov [esp+4*regEAX], edi
popad
return
.error:
stc
popad
return
endp
; Computes the width and height of the text.
;
; Arguments:
; .pString - pointer to a UTF-8 string.
; .len - how many bytes from the string to be used. If -1 the whole string will be scanned.
; .font - the font to be used for the computations.
;
; Returns:
; EAX - the width of the string in pixels.
; EBX - the ascender of the string. It is negative.
; EDX - the height of the string in pixels.
body GetTextBounds ;, .pString, .len, .font
.scaler FTC_ScalerRec
.glyph dd ?
.x dd ?
.miny dd ?
.maxy dd ?
.charlen dd ?
begin
pushad
mov edx, [.font]
xor ecx, ecx
mov [.scaler.face_id], edx
mov [.scaler.width], ecx
mov [.x], ecx
mov eax, [edx+__TFont.height]
inc ecx
mov [.scaler.height], eax
mov [.scaler.pixel], ecx ; ecx = 1
ror ecx, 1 ; ecx = $80000000
mov [.maxy], ecx
dec ecx
mov [.miny], ecx ; ecx = $7fffffff
mov esi, [.pString]
.char_loop:
stdcall DecodeUtf8, [esi]
jc .finish
add esi, edx
mov [.charlen], edx
test eax, eax
jz .finish
cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax
lea ecx, [.scaler]
lea edx, [.glyph]
cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0
test eax, eax
jnz .char_loop
mov ebx, [.glyph]
sub eax, [ebx+FT_BitmapGlyphRec.top] ; eax = 0 here
mov edx, eax
add edx, [ebx+FT_BitmapGlyphRec.bitmap.rows]
cmp eax, [.miny]
jge @f
mov [.miny], eax
@@:
cmp edx, [.maxy]
jle @f
mov [.maxy], edx
@@:
mov eax, [ebx+FT_GlyphRec.advance.x]
sar eax, 16 ; format 16.16 fixed decimal point.
add [.x], eax
mov eax, [.charlen]
sub [.len], eax
ja .char_loop
.finish:
mov eax, [.x]
mov edx, [.maxy]
mov ebx, [.miny]
sub edx, ebx
mov [esp+4*regEAX], eax
mov [esp+4*regEBX], ebx
mov [esp+4*regEDX], edx
popad
return
endp
proc __DrawGlyph, .pImage, .pFTBitmap, .x, .y, .color
.spitch dd ?
.dpitch dd ?
.drect RECT
.srect RECT
.pixel_mode dd ?
.sstart dd ?
.dstart dd ?
.xsize dd ?
.bpp dd ?
.bit_ofs dd ?
begin
pushad
stdcall __fix_color, [.color], regEAX
mov [.color], eax
mov ebx, [.pImage]
mov edi, [.pFTBitmap]
; the glyph pixel mode handling.
movzx eax, [edi+FT_Bitmap.pixel_mode]
cmp eax, FT_PIXEL_MODE_BGRA
ja .finish
mov [.pixel_mode], eax
movzx eax, [.bpp_const+eax]
mov [.bpp], eax
; Clip the glyph to the image surface.
mov eax, [ebx+TImage.width]
mov ecx, [ebx+TImage.height]
mov [.drect.right], eax
mov [.drect.bottom], ecx
xor eax, eax
mov [.drect.left], eax
mov [.drect.top], eax
mov eax, [.x]
mov ecx, [.y]
mov [.srect.left], eax
mov [.srect.top], ecx
mov eax, [edi+FT_Bitmap.width]
cmp [.pixel_mode], FT_PIXEL_MODE_LCD
jne @f
cdq
mov ecx, 3
div ecx
@@:
add eax, [.srect.left]
mov [.srect.right], eax
mov eax, [.srect.top]
add eax, [edi+FT_Bitmap.rows]
mov [.srect.bottom], eax
lea eax, [.srect]
lea ecx, [.drect]
stdcall RectIntersect, ecx, eax, ecx
jc .finish ; the rectangles does not intersect!
mov eax, [.drect.left]
mov ecx, [.drect.top]
sub eax, [.x]
sub ecx, [.y]
mov [.srect.left], eax
mov [.srect.top], ecx
mov eax, [.drect.right]
mov ecx, [.drect.bottom]
sub eax, [.drect.left]
sub ecx, [.drect.top]
mov [.srect.right], eax ; width!
mov [.srect.bottom], ecx ; height!
; End of clipping code - [.srect] contains the rectangle of the glyph that have to be drawn (left, top, width, height).
; [.drect] contains the destination rectangle. Both have the same size.
mov ecx, [edi+FT_Bitmap.pitch]
mov [.spitch], ecx
; glyph pixel pointer
mov esi, [edi+FT_Bitmap.buffer]
test esi, esi
jz .finish
mov eax, [.srect.top]
mov ecx, [.srect.left]
imul eax, [.spitch]
imul ecx, [.bpp]
mov [.bit_ofs], ecx
shr ecx, 3 ; byte offs
and [.bit_ofs], 7 ; bit offs
add esi, ecx
add esi, eax
; TImage destination pixel pointer
mov edi, [ebx+TImage.pPixels]
mov ecx, [ebx+TImage.width]
mov eax, [.drect.top]
imul eax, ecx
add eax, [.drect.left]
lea edi, [edi+4*eax] ; in bytes.
shl ecx, 2
mov [.dpitch], ecx
; prepare MMX constants
pxor mm0, mm0 ; mm0 = 0000 0000 0000 0000
pcmpeqw mm1, mm1 ; mm1 = ffff ffff ffff ffff
psrlw mm1, 15 ; mm1 = 0001 0001 0001 0001
psllw mm1, 8 ; mm1 = 0100 0100 0100 0100
movq mm2, mm1 ; mm2 = 0001 0001 0001 0001
psllq mm2, 48 ; mm2 = 0100 0000 0000 0000
.loopy:
mov [.sstart], esi
mov [.dstart], edi
mov eax, [.srect.right] ; width!
mov [.xsize], eax
cmp [.pixel_mode], FT_PIXEL_MODE_BGRA
je .loopx32
cmp [.pixel_mode], FT_PIXEL_MODE_LCD
je .loopx24
cmp [.pixel_mode], FT_PIXEL_MODE_GRAY
je .loopx8
cmp [.pixel_mode], FT_PIXEL_MODE_MONO
jne .finish
lodsd
bswap eax
mov ch, 32
mov cl, byte [.bit_ofs]
shl eax, cl
sub ch, cl
.loopx1:
shl eax, 1
dec ch
jnz @f
lodsd
bswap eax
mov ch, 32
@@:
jnc .next_x
movd mm7, [.color] ; source pixel.
movd mm6, [edi] ; destination pixel.
movq mm5, mm7
psrlq mm5, 24 ; alpha source
punpckldq mm5, mm5 ;
punpcklbw mm6, mm0 ; byte to word destination pixel
packssdw mm5, mm5 ; mm5 = As, As, As, As
punpcklbw mm7, mm0 ; byte to word source pixel
movq mm4, mm1
psubw mm4, mm5 ; mm4 = Bs Bs Bs Bs (Bs = $100 - As)
psrlq mm5, 16 ; mm5 = 0 As As As
por mm5, mm2 ; mm5 = $100 As As As
pmullw mm6, mm4 ; mm6 = Cd = Cd * (256-As) = Cd * Bs (For alpha Ad = Ad*Bs)
pmullw mm7, mm5 ; Cs = Cs * As (For alpha As = $100*As )
paddusw mm6, mm7 ; Cd = Cs + Cd (For alpha Ad = $100*As + Ad*Bs)
psrlw mm6, 8 ; Cd = Cd/256 (For alpha Ad = As + Ad*Bs/$100)
packuswb mm6, mm0 ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
movd [edi], mm6
.next_x:
add edi, 4
dec [.xsize]
jnz .loopx1
jmp .nexty
.loopx8:
movzx eax, byte [esi] ; intensity
add esi, 1
movd mm6, [.color]
movd mm7, eax
punpcklbw mm6, mm0 ; byte to word color.
punpckldq mm7, mm7 ;
packssdw mm7, mm7 ; mm7 = I, I, I, I
pmullw mm7, mm6 ; mm7 is the color to blend = Cs*256
movd mm6, [edi] ; Destination color
punpcklbw mm6, mm0 ; byte to word destination pixel
movq mm5, mm7
psrlq mm5, 56 ; alpha source
punpckldq mm5, mm5
packssdw mm5, mm5 ; mm5 = As, As, As, As
movq mm4, mm1
psubw mm4, mm5 ; mm4 = Bs Bs Bs Bs (Bs = $100 - As)
pmullw mm6, mm4 ; mm6 = Cd = Cd * (256-As) = Cd * Bs
paddusw mm6, mm7 ; Cd = 256*Cs + Cd*(256-As)
psrlw mm6, 8 ; Cd = Cd/256
packuswb mm6, mm0 ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
movd [edi], mm6
add edi, 4
dec [.xsize]
jnz .loopx8
jmp .nexty
.loopx24:
movzx eax, byte [esi]
movzx edx, byte [esi+1]
lea eax, [eax+2*edx]
movzx edx, byte [esi+2]
add eax, edx
shr eax, 2 ; grayscale.
movd mm6, [.color]
movd mm7, eax
punpcklbw mm6, mm0 ; byte to word color.
punpckldq mm7, mm7 ;
packssdw mm7, mm7 ; mm7 = I, I, I, I
pmullw mm7, mm6 ; mm7 is the color to blend = Cs*256
movd mm6, [edi] ; Destination color
punpcklbw mm6, mm0 ; byte to word destination pixel
movq mm5, mm7
psrlq mm5, 56 ; alpha source
punpckldq mm5, mm5
packssdw mm5, mm5 ; mm5 = As, As, As, As
movq mm4, mm1
psubw mm4, mm5 ; mm4 = Bs Bs Bs Bs (Bs = $100 - As)
pmullw mm6, mm4 ; mm6 = Cd = Cd * (256-As) = Cd * Bs
paddusw mm6, mm7 ; Cd = 256*Cs + Cd*(256-As)
psrlw mm6, 8 ; Cd = Cd/256
packuswb mm6, mm0 ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
movd [edi], mm6
add esi, 3
add edi, 4
dec [.xsize]
jnz .loopx24
jmp .nexty
.loopx32:
movd mm7, [esi] ; source pixel.
movd mm6, [edi] ; destination pixel.
movq mm5, mm7
psrlq mm5, 24 ; alpha source
punpckldq mm5, mm5 ;
punpcklbw mm6, mm0 ; byte to word destination pixel
packssdw mm5, mm5 ; mm5 = As, As, As, As
punpcklbw mm7, mm0 ; byte to word source pixel
movq mm4, mm1
psubw mm4, mm5 ; mm4 = Bs Bs Bs Bs (Bs = $100 - As)
psrlq mm5, 16 ; mm5 = 0 As As As
por mm5, mm2 ; mm5 = $100 As As As
pmullw mm6, mm4 ; mm6 = Cd = Cd * (256-As) = Cd * Bs (For alpha Ad = Ad*Bs)
pmullw mm7, mm5 ; Cs = Cs * As (For alpha As = $100*As )
paddusw mm6, mm7 ; Cd = Cs + Cd (For alpha Ad = $100*As + Ad*Bs)
psrlw mm6, 8 ; Cd = Cd/256 (For alpha Ad = As + Ad*Bs/$100)
packuswb mm6, mm0 ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
movd [edi], mm6
add edi, 4
add esi, 4
dec [.xsize]
jnz .loopx32
jmp .nexty
.nexty:
mov esi, [.sstart]
add esi, [.spitch]
mov edi, [.dstart]
add edi, [.dpitch]
dec [.srect.bottom] ; height
jnz .loopy
.finish:
emms
popad
return
.bpp_const db 0, 1, 8, 2, 4, 24, 8, 32
endp
; the colors must be pre-multiplied ARGB.
proc _BlendPixel, .dstColor, .srcColor
begin
pushad
movzx ecx, byte [.srcColor+3] ; As
mov ebx, $ff
mov esi, ebx
sub ebx, ecx ; 1 - As
movzx eax, byte [.dstColor+3] ; Ad
imul ecx, esi
mul ebx
add eax, ecx
adc edx, 0
div esi
mov byte [esp+4*regEAX+3], al
movzx eax, byte [.dstColor] ; Bd
movzx ecx, byte [.srcColor] ; Bs
imul ecx, esi
mul ebx
add eax, ecx
adc edx, 0
div esi
mov byte [esp+4*regEAX], al
movzx eax, byte [.dstColor+1] ; Gd
movzx ecx, byte [.srcColor+1] ; Gs
imul ecx, esi
mul ebx
add eax, ecx
adc edx, 0
div esi
mov byte [esp+4*regEAX+1], al
movzx eax, byte [.dstColor+2] ; Rd
movzx ecx, byte [.srcColor+2] ; Rs
imul ecx, esi
mul ebx
add eax, ecx
adc edx, 0
div esi
mov byte [esp+4*regEAX+2], al
popad
return
endp
|
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
| ︙ | ︙ | |||
29 30 31 32 33 34 35 |
mov ebx, [.context]
cinvoke XDrawLine, [hApplicationDisplay], [ebx+TContext.raster], [ebx+TContext.handle], [.x1], [.y1], [.x2], [.y2]
pop edx ecx ebx eax
return
endp
| < < < < < < < < < < | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
mov ebx, [.context]
cinvoke XDrawLine, [hApplicationDisplay], [ebx+TContext.raster], [ebx+TContext.handle], [.x1], [.y1], [.x2], [.y2]
pop edx ecx ebx eax
return
endp
macro Outline [type, x, y] {
common
local ..types, ..points, ..count
dd ..count
dd ..types
|
| ︙ | ︙ |
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | ; Target OS: Linux ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > > > > > > > > > > > > > | | | > > | | > > > > > < > | > > | | < | > < < > | | > > > > > > > | > | > > | | | | > > > > | > | > > | < | | > > > > | | | > > > | > > > > | | < | | > > > | | | > | > > > > > > | | | > > | | < > > > | > | | > > | > > > > > > | | > > | | | < < > | | > | < > | | > | > > > > > > | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
; Target OS: Linux
;
; Dependencies:
;
; Notes:
;_________________________________________________________________________________________
iglobal
if used FontAttr.mono | used FontAttr.size | used FontAttr.weight | used FontAttr.italic
label FontAttr byte
.mono db ',Mono', 0
.size db ':pixelsize=', 0
.weight db ':weight=', 0
.italic db ':slant=italic', 0
.regular db ':slant=roman', 0
;fwLight = 0
;fwDemilight = 1
;fwNormal = 2
;fwMedium = 3
;fwDemibold = 4
;fwBold = 5
;fwExtraBold = 6
;fwBlack = 7
.font_weights db 0, 55, 80, 100, 180, 200, 205, 210
end if
endg
;initialize InitFonts
;begin
; cinvoke FcInit
; return
;endp
;
;
;finalize FinalizeFonts
;begin
; cinvoke FcFini
; return
;endp
proc FTCRequester as FT_Face_Requester
.res dd ?
.idx dd ?
.face dd ?
begin
pushad
mov esi, [.face_id]
stdcall StrDup, [esi+__TFont.hFontFace]
mov ebx, eax
test [esi+__TFont.flags], ffMonospaced
jz @f
stdcall StrCat, ebx, FontAttr.mono
@@:
mov eax, [esi+__TFont.weight]
and eax, 7
movzx eax, byte [FontAttr.font_weights+eax]
stdcall StrCat, ebx, FontAttr.weight
stdcall NumToStr, eax, ntsDec or ntsUnsigned
push eax
stdcall StrCat, ebx, eax
stdcall StrDel ; from the stack
mov eax, FontAttr.regular
test [esi+__TFont.flags], ffItalic
jz @f
mov eax, FontAttr.italic
@@:
stdcall StrCat, ebx, eax
stdcall StrPtr, ebx
; OutputLn eax
cinvoke FcNameParse, eax
stdcall StrDel, ebx
test eax, eax
jnz @f
cinvoke FcNameParse, txt "Helvetica"
DebugMsg "Error: Bad pattern fallback."
@@:
mov ebx, eax
cinvoke FcDefaultSubstitute, ebx
cinvoke FcConfigSubstitute, 0, ebx, 0
lea eax, [.res]
cinvoke FcFontMatch, 0, ebx, eax
push eax
cinvoke FcPatternDestroy, ebx
pop ebx
if defined options.DebugMode & options.DebugMode
cinvoke FcPatternPrint, ebx
end if
lea eax, [.res]
cinvoke FcPatternGetString, ebx, FC_FILE, 0, eax
OutputLn [.res]
lea eax, [.idx]
cinvoke FcPatternGetInteger, ebx, FC_INDEX, 0, eax
mov edi, [.pFace]
mov eax, [.res]
cinvoke FT_New_Face, [FTLibrary], eax, [.idx], edi
.finish:
mov [esp+4*regEAX], eax
cinvoke FcPatternDestroy, ebx
popad
cret
endp
FC_FILE text 'file'
FC_INDEX text 'index'
FC_PIXEL_SIZE text 'pixelsize'
body FontCreate
begin
push edx
stdcall GetMem, sizeof.__TFont
mov edx, eax
stdcall StrDupMem, [.font_name]
mov [edx+__TFont.hFontFace], eax
mov eax, [.size]
mov [edx+__TFont.height], eax
mov eax, [.weight]
mov [edx+__TFont.weight], eax
mov eax, [.flags]
mov [edx+__TFont.flags], eax
mov eax, edx
pop edx
return
endp
body FontDestroy
begin
pushad
mov edi, [.pFont]
cinvoke FTC_Manager_RemoveFaceID, [FTCManager], edi
stdcall StrDel, [edi+__TFont.hFontFace]
stdcall FreeMem, edi
popad
return
endp
; returns some font metrics
;
; Arguments:
; .font - the font
; Returns:
; EAX - the line height of the font.
; EBX - the ascender of the font.
; EDX - the descender of the font.
body GetFontMetrics
.scaler FTC_ScalerRec
.size dd ?
begin
push ecx
mov edx, [.font]
xor ecx, ecx
mov [.scaler.face_id], edx
mov [.scaler.width], ecx
mov eax, [edx+__TFont.height]
inc ecx
mov [.scaler.height], eax
mov [.scaler.pixel], ecx ; ecx = 1
lea eax, [.scaler]
lea edx, [.size]
cinvoke FTC_Manager_LookupSize, [FTCManager], eax, edx
test eax, eax
jnz .error
mov edx, [.size]
mov eax, [edx+FT_SizeRec.metrics.height]
mov ebx, [edx+FT_SizeRec.metrics.ascender]
mov edx, [edx+FT_SizeRec.metrics.descender]
sar eax, 6
sar ebx, 6
sar edx, 6
clc
pop ecx
return
.error:
stc
pop ecx
return
endp
|
| ︙ | ︙ | |||
38 39 40 41 42 43 44 |
xor eax, eax
inc eax
mov ecx, [.width]
mov edx, [.height]
| | | | | | | 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
xor eax, eax
inc eax
mov ecx, [.width]
mov edx, [.height]
cmp ecx, 0
cmovle ecx, eax
cmp edx, 0
cmovle edx, eax
mov [esi+TImage.width], ecx
mov [esi+TImage.height], edx
lea eax, [4*ecx]
imul eax, edx
cinvoke shmget, IPC_PRIVATE, eax, IPC_CREAT or 777o
test eax, eax
js .error
mov [esi+TImage.shminfo.ShmID], eax
cinvoke shmat, eax, 0, 0
cmp eax, -1
je .error_free
mov [esi+TImage.shminfo.Addr], eax
mov [esi+TImage.pPixels], eax
mov [esi+TImage.shminfo.fReadOnly], 1
lea ebx, [esi+TImage.shminfo]
cinvoke XShmCreateImage, [hApplicationDisplay], 0, $20, ZPixmap, eax, ebx, [esi+TImage.width], [esi+TImage.height]
mov [esi+TImage.ximage], eax
cinvoke XShmAttach, [hApplicationDisplay], ebx
|
| ︙ | ︙ | |||
96 97 98 99 100 101 102 |
body DestroyImage
begin
pushad
mov esi, [.ptrImage]
test esi, esi
| | > | > | | > > > > > > > > > > > > > > | > > > > | > | | | | | > | > > | | > > > > > > > > > > > > > > > > > > > | > < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
body DestroyImage
begin
pushad
mov esi, [.ptrImage]
test esi, esi
jz .finish
lea eax, [esi+TImage.shminfo]
cinvoke XShmDetach, [hApplicationDisplay], eax
cinvoke XDestroyImage, [esi+TImage.ximage]
cinvoke shmdt, [esi+TImage.shminfo.Addr]
cinvoke shmctl, [esi+TImage.shminfo.ShmID], IPC_RMID, 0
stdcall FreeMem, esi
.finish:
popad
return
endp
;if used ___CheckCompletionEvent
;___CheckCompletionEvent:
;
;virtual at esp+4
; .display dd ?
; .pEvent dd ?
; .user dd ?
;end virtual
;
;; timeout
; stdcall GetTimestamp
; cmp eax, [.user]
; jbe @f
;
; DebugMsg "Timeout!"
;
; mov eax, 1
; retn
;
;@@:
; mov eax, [.pEvent] ;.pEvent
; mov eax, [eax+XEvent.type]
;
; cmp eax, [ShmCompletionEvent]
; sete al
; movzx eax, al
; retn
;end if
body DrawImageRect
.event XEvent
rb 256
begin
pushad
mov esi, [.pImage]
test esi, esi
jz .exit
mov ebx, [esi+TImage.ximage]
cinvoke XCreateGC, [hApplicationDisplay], [.where], 0, 0
mov edi, eax
cinvoke XShmPutImage, [hApplicationDisplay], [.where], edi, [esi+TImage.ximage], [.xSrc], [.ySrc], [.xDst], [.yDst], [.width], [.height], TRUE
; THIS CODE SOMETIMES CAUSES HANGS!
stdcall GetTimestamp
lea esi, [eax+20]
.loop:
lea eax, [.event]
cinvoke XCheckTypedEvent, [hApplicationDisplay], [ShmCompletionEvent], eax
test eax, eax
jnz .finish
stdcall GetTimestamp
cmp eax, esi
jb .loop
.finish:
cinvoke XFreeGC, [hApplicationDisplay], edi
.exit:
popad
return
endp
|
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | ; Target OS: Linux ; ; Dependencies: ; ; Notes: Uses XFT library to renter the text. ;_________________________________________________________________________________________ | | | | | < < | > | | | | | > | | < < < < | < | | < < | < < < < | < < | < < < | | < | > | < | < | > | < < | | | | < < < < < < | | < < < | | < < | > > < < > | < | < | < < < > > > | | < < | | < < < | > < < < > | | | | < | > | | | > > > > | > > > > | < < > | | | > > < < > > | > > | < | > > | | > | | < > | < < | < < < | > > > > < < < < < < < < < < < < < < < < < < < < | | < < > > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | < | | | > > > > > > | > > > | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 |
; Target OS: Linux
;
; Dependencies:
;
; Notes: Uses XFT library to renter the text.
;_________________________________________________________________________________________
uses libFT, libFC
iglobal
var flagFreeTypeLoadFlags = FT_LOAD_RENDER or FT_LOAD_TARGET_NORMAL or FT_LOAD_COLOR
endg
body DrawDecomposedString ;, .pImage, .pArray, .x, .y, .font, .color
.scaler FTC_ScalerRec
.glyph dd ?
.startX dd ?
begin
pushad
mov edx, [.font]
xor ecx, ecx
mov [.scaler.face_id], edx
mov [.scaler.width], ecx
mov eax, [edx+__TFont.height]
inc ecx
mov [.scaler.height], eax
mov [.scaler.pixel], ecx ; ecx = 1
mov eax, [.x]
mov [.startX], eax
mov esi, [.pArray]
xor edi, edi
dec edi
.char_loop:
inc edi
cmp edi, [esi+TArray.count]
jae .finish
cmp word [esi+TArray.array+8*edi+TTextChar.width], 0
je .char_ok
cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, [esi+TArray.array+8*edi+TTextChar.code]
lea ecx, [.scaler]
lea edx, [.glyph]
cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0
test eax, eax
jnz .char_ok
mov ebx, [.glyph]
mov ecx, [.x]
mov edx, [.y]
add ecx, [ebx+FT_BitmapGlyphRec.left]
sub edx, [ebx+FT_BitmapGlyphRec.top]
lea eax, [ebx+FT_BitmapGlyphRec.bitmap]
stdcall __DrawGlyph, [.pImage], eax, ecx, edx, [.color]
movzx eax, word [esi+TArray.array+8*edi+TTextChar.width]
add [.x], eax
.char_ok:
; check for new line.
movzx eax, word [esi+TArray.array+8*edi+TTextChar.height]
test eax, eax
jz .char_loop
add [.y], eax
mov eax, [.startX]
mov [.x], eax
jmp .char_loop
.finish:
popad
return
endp
; Draws the string on the image using the specified font and color.
; The string is drawn in one line. The control symbols are not
; processed. The tabs are not expanded or replaced with spaces.
;
; Arguments:
; .pImage - pointer to the image where to draw the text.
; .pString - pointer to a UTF-8 string.
; .len - how many bytes from the string to be drawn. If -1, the whole string will be drawn.
; .x - X coordinate, where to start drawing.
; .y - Y coordinate of the baseline where to draw the string.
; .font - the font to be used.
; .color - ARGB color to draw the glyphs.
;
;;;;;;;; Returns:
;;;;;;;; EAX - the width of the string in pixels.
;;;;;;;; EBX - the ascender of the string. It is negative.
;;;;;;;; EDX - the height of the string in pixels.
body DrawString ;, .pImage, .pString, .len, .x, .y, .font, .color
.scaler FTC_ScalerRec
.glyph dd ?
.miny dd ?
.maxy dd ?
.startX dd ?
begin
pushad
mov edx, [.font]
xor ecx, ecx
mov [.scaler.face_id], edx
mov [.scaler.width], ecx
mov eax, [edx+__TFont.height]
inc ecx
mov [.scaler.height], eax
mov [.scaler.pixel], ecx ; ecx = 1
ror ecx, 1 ; ecx = $80000000
mov [.maxy], ecx
dec ecx
mov [.miny], ecx ; ecx = $7fffffff
mov eax, [.x]
mov [.startX], eax
mov esi, [.pString]
.char_loop:
stdcall DecodeUtf8, [esi]
jc .finish
add esi, edx
sub [.len], edx
jb .finish
test eax, eax
jz .finish
cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax
lea ecx, [.scaler]
lea edx, [.glyph]
cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0
test eax, eax
jnz .char_loop
mov ebx, [.glyph]
mov ecx, [.x]
mov edx, [.y]
add ecx, [ebx+FT_BitmapGlyphRec.left]
sub edx, [ebx+FT_BitmapGlyphRec.top]
cmp edx, [.miny]
jge @f
mov [.miny], edx
@@:
mov eax, edx
add eax, [ebx+FT_BitmapGlyphRec.bitmap.rows]
cmp eax, [.maxy]
jle @f
mov [.maxy], eax
@@:
lea eax, [ebx+FT_BitmapGlyphRec.bitmap]
stdcall __DrawGlyph, [.pImage], eax, ecx, edx, [.color]
mov eax, [ebx+FT_BitmapGlyphRec.root.advance.x]
sar eax, 16 ; format 16.16 fixed decimal point.
add [.x], eax
jmp .char_loop
.finish:
; mov eax, [.x]
; mov edx, [.maxy]
; mov ebx, [.miny]
; sub eax, [.startX]
; sub edx, ebx
; sub ebx, [.y]
; mov [esp+4*regEAX], eax
; mov [esp+4*regEBX], ebx
; mov [esp+4*regEDX], edx
popad
return
endp
; returns:
; EAX - array with decomposed string.
; EDX - maximal bearing_Y of the string.
; ECX - maximal descender of the string.
body TextDecompose ;, .hString, .font
.scaler FTC_ScalerRec
.glyph dd ?
.miny dd ?
.maxy dd ?
begin
pushad
mov edx, [.font]
xor ecx, ecx
mov [.scaler.face_id], edx
mov [.scaler.width], ecx
mov eax, [edx+__TFont.height]
inc ecx
mov [.scaler.height], eax
mov [.scaler.pixel], ecx ; ecx = 1
ror ecx, 1 ; ecx = $80000000
mov [.maxy], ecx
dec ecx
mov [.miny], ecx ; ecx = $7fffffff
stdcall StrPtr, [.hString]
mov esi, eax
stdcall CreateArray, sizeof.TTextChar
mov edi, eax
.char_loop:
stdcall DecodeUtf8, [esi]
jc .finish
add esi, edx
mov ebx, eax
test eax, eax
jz .end
cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax
lea ecx, [.scaler]
lea edx, [.glyph]
cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0
xor ecx, ecx
test eax, eax
jnz .glyph_size_ok ; zero width glyph ????
mov ecx, [.glyph]
mov eax, [ecx+FT_BitmapGlyphRec.top]
neg eax
cmp eax, [.miny]
jge @f
mov [.miny], eax
@@:
add eax, [ecx+FT_BitmapGlyphRec.bitmap.rows]
cmp eax, [.maxy]
jle @f
mov [.maxy], eax
@@:
mov ecx, [ecx+FT_BitmapGlyphRec.root.advance.x] ; format 16.16 fixed decimal point.
sar ecx, 16 ; format 16.16
.glyph_size_ok:
stdcall AddArrayItems, edi, 1
mov edi, edx
mov dword [eax+TTextChar.width], ecx
mov [eax+TTextChar.code], ebx
jmp .char_loop
.end:
clc
.finish:
mov [esp+4*regEAX], edi
mov eax, [.miny]
neg eax
mov ecx, [.maxy]
mov [esp+4*regEDX], eax
mov [esp+4*regECX], ecx
add ecx, eax
mov [edi+TArray.lparam], ecx
popad
return
endp
; Returns an array with the widths from the begining of the text to the every character inside the string.
proc GetTextWidthsArray, .hString, .font
.scaler FTC_ScalerRec
.glyph dd ?
.x dd ?
begin
pushad
mov edx, [.font]
xor ecx, ecx
mov [.scaler.face_id], edx
mov [.scaler.width], ecx
mov eax, [edx+__TFont.height]
inc ecx
mov [.scaler.height], eax
mov [.scaler.pixel], ecx ; ecx = 1
stdcall StrPtr, [.hString]
mov esi, eax
stdcall CreateArray, 4
mov edi, eax
xor ebx, ebx
.char_loop:
stdcall DecodeUtf8, [esi]
jc .finish
add esi, edx
test eax, eax
jz .end
cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax
lea ecx, [.scaler]
lea edx, [.glyph]
cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0
test eax, eax
jnz .glyph_size_ok ; zero width glyph ????
mov ecx, [.glyph]
mov ecx, [ecx+FT_BitmapGlyphRec.root.advance.x] ; format 16.16 fixed decimal point.
add ebx, ecx
.glyph_size_ok:
stdcall AddArrayItems, edi, 1
mov edi, edx
mov edx, ebx
sar edx, 16 ; format 16.16
mov [eax], edx
jmp .char_loop
.end:
clc
.finish:
mov [esp+4*regEAX], edi
popad
return
.error:
stc
popad
return
endp
; Computes the width and height of the text.
;
; Arguments:
; .pString - pointer to a UTF-8 string.
; .len - how many bytes from the string to be used. If -1 the whole string will be scanned.
; .font - the font to be used for the computations.
;
; Returns:
; EAX - the width of the string in pixels.
; EBX - the ascender of the string. It is negative.
; EDX - the height of the string in pixels.
body GetTextBounds ;, .pString, .len, .font
.scaler FTC_ScalerRec
.glyph dd ?
.x dd ?
.miny dd ?
.maxy dd ?
.charlen dd ?
begin
pushad
mov edx, [.font]
xor ecx, ecx
mov [.scaler.face_id], edx
mov [.scaler.width], ecx
mov [.x], ecx
mov eax, [edx+__TFont.height]
inc ecx
mov [.scaler.height], eax
mov [.scaler.pixel], ecx ; ecx = 1
ror ecx, 1 ; ecx = $80000000
mov [.maxy], ecx
dec ecx
mov [.miny], ecx ; ecx = $7fffffff
mov esi, [.pString]
.char_loop:
stdcall DecodeUtf8, [esi]
jc .finish
add esi, edx
mov [.charlen], edx
test eax, eax
jz .finish
cinvoke FTC_CMapCache_Lookup, [FTCCMapCache], [.font], -1, eax
lea ecx, [.scaler]
lea edx, [.glyph]
cinvoke FTC_ImageCache_LookupScaler, [FTCImageCache], ecx, [flagFreeTypeLoadFlags], eax, edx, 0
test eax, eax
jnz .char_loop
mov ebx, [.glyph]
sub eax, [ebx+FT_BitmapGlyphRec.top] ; eax = 0 here
mov edx, eax
add edx, [ebx+FT_BitmapGlyphRec.bitmap.rows]
cmp eax, [.miny]
jge @f
mov [.miny], eax
@@:
cmp edx, [.maxy]
jle @f
mov [.maxy], edx
@@:
mov eax, [ebx+FT_GlyphRec.advance.x]
sar eax, 16 ; format 16.16 fixed decimal point.
add [.x], eax
mov eax, [.charlen]
sub [.len], eax
ja .char_loop
.finish:
mov eax, [.x]
mov edx, [.maxy]
mov ebx, [.miny]
sub edx, ebx
mov [esp+4*regEAX], eax
mov [esp+4*regEBX], ebx
mov [esp+4*regEDX], edx
popad
return
endp
proc __DrawGlyph, .pImage, .pFTBitmap, .x, .y, .color
.spitch dd ?
.dpitch dd ?
.drect RECT
.srect RECT
.pixel_mode dd ?
.sstart dd ?
.dstart dd ?
.xsize dd ?
.bpp dd ?
.bit_ofs dd ?
begin
pushad
stdcall __fix_color, [.color], regEAX
mov [.color], eax
mov ebx, [.pImage]
mov edi, [.pFTBitmap]
; the glyph pixel mode handling.
movzx eax, [edi+FT_Bitmap.pixel_mode]
cmp eax, FT_PIXEL_MODE_BGRA
|
| ︙ | ︙ | |||
454 455 456 457 458 459 460 |
dec [.xsize]
jnz .loopx1
jmp .nexty
.loopx8:
| | | < | | | < | > | > | | < > > | < < < < < | < < | | | | > | > > | > | | > | | < | > | | < | < < | > > > > < < < < | < < | | | > | > | 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 |
dec [.xsize]
jnz .loopx1
jmp .nexty
.loopx8:
movzx eax, byte [esi] ; intensity
add esi, 1
movd mm6, [.color]
movd mm7, eax
punpcklbw mm6, mm0 ; byte to word color.
punpckldq mm7, mm7 ;
packssdw mm7, mm7 ; mm7 = I, I, I, I
pmullw mm7, mm6 ; mm7 is the color to blend = Cs*256
movd mm6, [edi] ; Destination color
punpcklbw mm6, mm0 ; byte to word destination pixel
movq mm5, mm7
psrlq mm5, 56 ; alpha source
punpckldq mm5, mm5
packssdw mm5, mm5 ; mm5 = As, As, As, As
movq mm4, mm1
psubw mm4, mm5 ; mm4 = Bs Bs Bs Bs (Bs = $100 - As)
pmullw mm6, mm4 ; mm6 = Cd = Cd * (256-As) = Cd * Bs
paddusw mm6, mm7 ; Cd = 256*Cs + Cd*(256-As)
psrlw mm6, 8 ; Cd = Cd/256
packuswb mm6, mm0 ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
movd [edi], mm6
add edi, 4
dec [.xsize]
jnz .loopx8
jmp .nexty
.loopx24:
movzx eax, byte [esi]
movzx edx, byte [esi+1]
lea eax, [eax+2*edx]
movzx edx, byte [esi+2]
add eax, edx
shr eax, 2 ; grayscale.
movd mm6, [.color]
movd mm7, eax
punpcklbw mm6, mm0 ; byte to word color.
punpckldq mm7, mm7 ;
packssdw mm7, mm7 ; mm7 = I, I, I, I
pmullw mm7, mm6 ; mm7 is the color to blend = Cs*256
movd mm6, [edi] ; Destination color
punpcklbw mm6, mm0 ; byte to word destination pixel
movq mm5, mm7
psrlq mm5, 56 ; alpha source
punpckldq mm5, mm5
packssdw mm5, mm5 ; mm5 = As, As, As, As
movq mm4, mm1
psubw mm4, mm5 ; mm4 = Bs Bs Bs Bs (Bs = $100 - As)
pmullw mm6, mm4 ; mm6 = Cd = Cd * (256-As) = Cd * Bs
paddusw mm6, mm7 ; Cd = 256*Cs + Cd*(256-As)
psrlw mm6, 8 ; Cd = Cd/256
packuswb mm6, mm0 ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
movd [edi], mm6
add esi, 3
add edi, 4
dec [.xsize]
jnz .loopx24
jmp .nexty
|
| ︙ | ︙ | |||
589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 |
add edi, [.dpitch]
dec [.srect.bottom] ; height
jnz .loopy
.finish:
popad
return
.bpp_const db 0, 1, 8, 2, 4, 24, 8, 32
endp
| > < | < < < < < < < | < < > | | | < | | | | < | < | | < < < < | < < | < < < < | | | | | < < < | < < < | < | < > | | | < | | < < < < < | < < | < | < | | < | | | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 |
add edi, [.dpitch]
dec [.srect.bottom] ; height
jnz .loopy
.finish:
emms
popad
return
.bpp_const db 0, 1, 8, 2, 4, 24, 8, 32
endp
; the colors must be pre-multiplied ARGB.
proc _BlendPixel, .dstColor, .srcColor
begin
pushad
movzx ecx, byte [.srcColor+3] ; As
mov ebx, $ff
mov esi, ebx
sub ebx, ecx ; 1 - As
movzx eax, byte [.dstColor+3] ; Ad
imul ecx, esi
mul ebx
add eax, ecx
adc edx, 0
div esi
mov byte [esp+4*regEAX+3], al
movzx eax, byte [.dstColor] ; Bd
movzx ecx, byte [.srcColor] ; Bs
imul ecx, esi
mul ebx
add eax, ecx
adc edx, 0
div esi
mov byte [esp+4*regEAX], al
movzx eax, byte [.dstColor+1] ; Gd
movzx ecx, byte [.srcColor+1] ; Gs
imul ecx, esi
mul ebx
add eax, ecx
adc edx, 0
div esi
mov byte [esp+4*regEAX+1], al
movzx eax, byte [.dstColor+2] ; Rd
movzx ecx, byte [.srcColor+2] ; Rs
imul ecx, esi
mul ebx
add eax, ecx
adc edx, 0
div esi
mov byte [esp+4*regEAX+2], al
popad
return
endp
|
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ | > > > > > > > > > > > > > > > > > > > | > > > > > > | | | | > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
;
; Dependencies:
;
; Notes:
;_________________________________________________________________________________________
iglobal
if used FontAttr.font_weights
;fwLight = 0
;fwDemilight = 1
;fwNormal = 2
;fwMedium = 3
;fwDemibold = 4
;fwBold = 5
;fwExtraBold = 6
;fwBlack = 7
FontAttr:
.font_weights dw FW_THIN, FW_EXTRALIGHT, FW_NORMAL, FW_MEDIUM, FW_SEMIBOLD, FW_BOLD, FW_EXTRABOLD, FW_HEAVY
end if
endg
body FontCreate
.pwc dd ?
begin
push ebx ecx edx esi edi
mov eax, [.weight]
and eax, 7
movzx eax, [FontAttr.font_weights+2*eax]
mov [.weight], eax
neg [.size]
stdcall StrLen, [.font_name]
mov ebx, eax
stdcall StrPtr, [.font_name]
mov [.font_name], eax
lea ecx, [8*ebx]
stdcall GetMem, ecx
mov edi, eax
invoke MultiByteToWideChar, CP_UTF8, 0, [.font_name], ebx, edi, ecx
mov eax, [.flags]
mov ebx, eax
mov ecx, eax
mov edx, eax
and ebx, ffItalic
and ecx, ffUnderline
and edx, ffStrikeOut
and eax, ffMonospaced
jz @f
mov eax, FIXED_PITCH
@@:
invoke CreateFontW, [.size], 0, 0, 0, [.weight], ebx, ecx, edx, \
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, \
CLIP_DEFAULT_PRECIS, PROOF_QUALITY, eax, \
edi
if defined options.DebugMode & options.DebugMode
pushad
mov esi, eax
invoke CreateCompatibleDC, 0
mov ebx, eax
invoke SelectObject, ebx, esi
push eax
invoke GetTextFaceA, ebx, 1024, fontName
OutputLn fontName
invoke SelectObject, ebx ; from the stack
invoke DeleteObject, ebx
popad
end if
stdcall FreeMem, edi
pop edi esi edx ecx ebx
return
endp
uglobal
if defined options.DebugMode & options.DebugMode
fontName rb 1024
end if
endg
body FontDestroy
begin
push eax ecx edx
invoke DeleteObject, [.pFont]
pop edx ecx eax
return
endp
; returns some font metrics
;
; Arguments:
; .font - the font
; Returns:
; EAX - the line height of the font.
; EBX - the ascender of the font.
; EDX - the descender of the font.
body GetFontMetrics
.tm TEXTMETRIC
begin
invoke CreateCompatibleDC, 0
mov ebx, eax
invoke SelectObject, ebx, [.font]
push eax
lea eax, [.tm]
invoke GetTextMetricsW, ebx, eax
invoke SelectObject, ebx ; from the stack
invoke DeleteDC, ebx
mov eax, [.tm.tmHeight]
mov ebx, [.tm.tmAscent]
mov edx, [.tm.tmDescent]
return
endp
|
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | ; Target OS: Win32 ; ; Dependencies: memory.asm ; ; Notes: ;_________________________________________________________________________________________ | | < < | > | | | | | | | > > > > > > | | > > > | > | < | < | | < | < < > | < < < < < < < < | | | | | | | | | | | | | | | | | | | | | | | | > > > > | < < < < | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 |
; Target OS: Win32
;
; Dependencies: memory.asm
;
; Notes:
;_________________________________________________________________________________________
uses msimg32, gdi32
struct TImage
.width dd ? ; width in pixels.
.height dd ? ; height in pixels.
.pPixels dd ? ; pointer to the pixel memory.
; os dependent data
.hBitmap dd ?
ends
body CreateImage
.bmi BITMAPV4HEADER
begin
pushad
stdcall GetMem, sizeof.TImage
jc .finish
mov esi, eax
xor eax, eax
lea edi, [.bmi]
mov ecx, sizeof.BITMAPV4HEADER/4
rep stosd
inc eax
mov ecx, [.width]
mov edx, [.height]
cmp ecx, 0
cmovle ecx, eax
cmp edx, 0
cmovle edx, eax
mov [esi+TImage.width], ecx
mov [esi+TImage.height], edx
mov [.bmi.biSize], sizeof.BITMAPV4HEADER
mov [.bmi.biPlanes], 1
; it is already 0
; mov [.bmi.biCompression], BI_RGB
; mov [.bmi.biSizeImage], 0
; mov [.bmi.biClrUsed], 0
; mov [.bmi.biClrImportant], 0
mov [.bmi.BlueMask], $000000ff
mov [.bmi.GreenMask], $0000ff00
mov [.bmi.RedMask], $00ff0000
mov [.bmi.AlphaMask], $ff000000
mov [.bmi.biBitCount], 32
neg edx
mov [.bmi.biWidth], ecx
mov [.bmi.biHeight], edx
lea eax, [.bmi]
lea ecx, [esi+TImage.pPixels]
xor edx, edx
invoke CreateDIBSection, edx, eax, DIB_RGB_COLORS, ecx, edx, edx
mov [esi+TImage.hBitmap], eax
clc
mov [esp+4*regEAX], esi
.finish:
popad
return
endp
body DestroyImage
begin
push eax ecx edx esi
mov esi, [.ptrImage]
cmp esi, 0
je @f
invoke GdiFlush
invoke DeleteObject, [esi+TImage.hBitmap]
stdcall FreeMem, esi
@@:
pop esi edx ecx eax
return
endp
;AC_SRC_OVER = $00000000
;AC_SRC_ALPHA = $01000000
;
;struct BLENDFUNCTION
; .BlendOp db ?
; .BlendFlags db ?
; .SourceConstantAlpha db ?
; .AlphaFormat db ?
;ends
body DrawImageRect
begin
push eax ecx edx esi edi
mov esi, [.pImage]
test esi, esi
jz .exit
invoke CreateCompatibleDC, 0
mov ebx, eax
invoke SelectObject, ebx, [esi+TImage.hBitmap]
push eax
invoke BitBlt, [.where], [.xDst], [.yDst], [.width], [.height], ebx, [.xSrc], [.ySrc], SRCCOPY
invoke SelectObject, ebx ; from the stack
invoke DeleteDC, ebx
.exit:
pop edi esi edx ecx eax
return
endp
;body DrawText
;.pwc dd ?
;.pwl dd ?
;.buffer rb 256
;.charlen dd ?
;begin
; push eax ebx ecx edx
;
;; first convert the string:
; lea eax, [.buffer]
; mov ecx, [.len]
; shl ecx, 3
; cmp ecx, $100
; jbe @f
;
; stdcall GetMem, ecx
;
;@@:
; mov [.pwl], ecx
; mov [.pwc], eax
;
; invoke MultiByteToWideChar, CP_UTF8, 0, [.text], [.len], [.pwc], ecx
; mov [.charlen], eax
;
;
; mov ebx, [.pImage]
; stdcall AllocateContext, [ebx+TImage.hBitmap]
; mov ebx, eax
;
; cmp [.font], 0
; jne @f
;
; invoke GetStockObject, DEFAULT_GUI_FONT
; mov [.font], eax
;
;@@:
; invoke SelectObject, [ebx+TContext.handle], [.font]
; push eax
;
; invoke SetBkMode, [ebx+TContext.handle], TRANSPARENT
; invoke SetTextAlign, [ebx+TContext.handle], TA_NOUPDATECP or TA_LEFT or TA_BASELINE
;
; mov eax, [.color]
; bswap eax
; ror eax, 8
; invoke SetTextColor, [ebx+TContext.handle], eax
; invoke TextOutW, [ebx+TContext.handle], [.x], [.y], [.pwc], [.charlen]
;
; invoke SelectObject, [ebx+TContext.handle] ; old font from the stack.
;
; cmp [.pwl], $100
; jbe @f
; stdcall FreeMem, [.pwc]
;@@:
; stdcall ReleaseContext, ebx
;
; pop edx ecx ebx eax
; return
;endp
|
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | ; Dependencies: memory.asm ; ; Notes: ;_________________________________________________________________________________________ | | > > | > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | > > > | | > > > > | | > > | > | > > > > > | | | < > | > | > | > | < | < < | > > > | > > | > | | > | | > > > | > > > > > > | > > > | | > > | > | | > | > > | | | > > > > < < > | | > | | > > > > > > | > > > | | > > > | | | < < < > | < | < < < | | < < < < | > | < > | < | | | | | < | > | > > > > > > > > > > > > > > > > > > > > > > | > > > > > | > > | | > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < | < < | > | | > > | | | | | | < | | | | | | < < | | < < | | | | > | < > > | < | < | > | > | > | | > > > | > > < > > > | | | > | | | | > | | | < | | < < < < < < < < < < < < < < > | > > > | < | < < < < < < | | | > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 |
; Dependencies: memory.asm
;
; Notes:
;_________________________________________________________________________________________
body DrawDecomposedString ;, .pImage, .pArray, .x, .y, .font, .color
.startX dd ?
.old_font dd ?
.old_bmp dd ?
.img dd ?
begin
pushad
mov eax, [.x]
mov [.startX], eax
stdcall GetFontMetrics, [.font]
sub [.y], ebx
mov ebx, [.pImage]
stdcall CreateImage, 100, 100
mov [.img], eax
invoke CreateCompatibleDC, 0
mov ebx, eax
mov eax, [.img]
invoke SelectObject, ebx, [eax+TImage.hBitmap]
mov [.old_bmp], eax
invoke SelectObject, ebx, [.font]
mov [.old_font], eax
invoke SetBkMode, ebx, TRANSPARENT
invoke SelectClipRgn, ebx, 0
invoke SetTextColor, ebx, $ffffff
invoke SetTextAlign, ebx, TA_TOP or TA_LEFT
mov esi, [.pArray]
xor edi, edi
dec edi
.char_loop:
inc edi
cmp edi, [esi+TArray.count]
jae .finish
cmp word [esi+TArray.array+8*edi+TTextChar.width], 0
je .char_ok
movzx ecx, word [esi+TArray.array+8*edi+TTextChar.width]
stdcall DrawSolidRect, [.img], 0, 0, ecx, [esi+TArray.lparam], 0
lea eax, [esi+TArray.array+8*edi+TTextChar.code]
movzx ecx, word [esi+TArray.array+8*edi+TTextChar.width]
invoke ExtTextOutW, ebx, 0, 0, 0, 0, eax, 1, 0
movzx ecx, word [esi+TArray.array+8*edi+TTextChar.width]
stdcall __BlendAlphaMask, [.pImage], [.x], [.y], [.img], 0, 0, ecx, [esi+TArray.lparam], [.color]
movzx eax, word [esi+TArray.array+8*edi+TTextChar.width]
add [.x], eax
.char_ok:
; check for new line.
movzx eax, word [esi+TArray.array+8*edi+TTextChar.height]
test eax, eax
jz .char_loop
add [.y], eax
mov eax, [.startX]
mov [.x], eax
jmp .char_loop
.finish:
invoke SelectObject, ebx, [.old_font]
invoke SelectObject, ebx, [.old_bmp]
invoke DeleteDC, ebx
stdcall DestroyImage, [.img]
popad
return
endp
body TextDecompose ;, .hString, .font
.miny dd ?
.maxy dd ?
.more dd ?
.string rd 2
.code dd ?
.size SIZE
.old_font dd ?
begin
pushad
invoke CreateCompatibleDC, 0
mov ebx, eax
invoke SelectClipRgn, ebx, 0
invoke SelectObject, ebx, [.font]
mov [.old_font], eax
xor ecx, ecx
mov [.string], ecx
mov [.string+4], ecx
inc ecx
ror ecx, 1 ; ecx = $80000000
mov [.maxy], ecx
dec ecx
mov [.miny], ecx ; ecx = $7fffffff
mov word [.string], '|'
mov word [.string+2], '|'
lea ecx, [.string]
lea eax, [.size]
invoke GetTextExtentPoint32W, ebx, ecx, 1, eax
mov eax, [.size.cx]
mov [.more], eax
stdcall StrPtr, [.hString]
mov esi, eax
stdcall CreateArray, sizeof.TTextChar
mov edi, eax
.char_loop:
stdcall DecodeUtf8, [esi]
jc .finish
add esi, edx
test eax, eax
jz .end
mov [.code], eax
mov word [.string], ax
lea ecx, [.string]
lea eax, [.size]
invoke GetTextExtentPoint32W, ebx, ecx, 2, eax
stdcall AddArrayItems, edi, 1
mov edi, edx
mov ecx, [.size.cx]
sub ecx, [.more]
mov dword [eax+TTextChar.width], ecx
mov ecx, [.code]
mov [eax+TTextChar.code], ecx
jmp .char_loop
.end:
clc
.finish:
pushf
invoke SelectObject, ebx, [.old_font] ; old font from the stack.
invoke DeleteDC, ebx
stdcall GetFontMetrics, [.font]
popf
mov [esp+4*regEDX], ebx ; font ascent
mov [esp+4*regECX], edx ; font descent
mov [edi+TArray.lparam], eax ; line height
mov [esp+4*regEAX], edi
popad
return
endp
;interface DrawString, .pImage, .pString, .len, .x, .y, .font, .color
body DrawString ;, .pImage, .pString, .len, .x, .y, .font, .color
.pwc dd ?
.charlen dd ?
.img dd ?
.size SIZE
.tm TEXTMETRIC
begin
push eax ebx ecx edx
invoke CreateCompatibleDC, 0
mov ebx, eax
invoke SelectObject, ebx, [.font]
push eax
invoke SetBkMode, ebx, TRANSPARENT
invoke SetTextAlign, ebx, TA_TOP or TA_LEFT
invoke SelectClipRgn, ebx, 0
invoke SetTextColor, ebx, $ffffff
lea eax, [.tm]
invoke GetTextMetricsW, ebx, eax
mov eax, [.tm.tmAscent]
sub [.y], eax
; convert the string:
mov ecx, [.len]
shl ecx, 2
stdcall GetMem, ecx
mov [.pwc], eax
shr ecx, 1
invoke MultiByteToWideChar, CP_UTF8, 0, [.pString], [.len], [.pwc], ecx
mov [.charlen], eax
lea eax, [.size]
invoke GetTextExtentPoint32W, ebx, [.pwc], [.charlen], eax
stdcall CreateImage, [.size.cx], [.size.cy]
mov [.img], eax
invoke SelectObject, ebx, [eax+TImage.hBitmap]
push eax
xor eax, eax
invoke ExtTextOutW, ebx, eax, eax, eax, eax, [.pwc], [.charlen], eax
invoke SelectObject, ebx ; old bitmap from the stack.
invoke SelectObject, ebx ; old font from the stack.
invoke DeleteDC, ebx
stdcall __BlendAlphaMask, [.pImage], [.x], [.y], [.img], 0, 0, [.size.cx], [.size.cy], [.color]
stdcall DestroyImage, [.img]
stdcall FreeMem, [.pwc]
pop edx ecx ebx eax
return
endp
proc __BlendAlphaMask, .pDstImage, .xDst, .yDst, .pSrcImage, .xSrc, .ySrc, .width, .height, .color
.srect RECT
.drect RECT
.rect RECT
begin
pushad
stdcall __fix_color, [.color], regEAX
mov [.color], eax
mov esi, [.pSrcImage]
mov edi, [.pDstImage]
xor eax, eax
mov ecx, [esi+TImage.width]
mov edx, [esi+TImage.height]
mov [.srect.left], eax
mov [.srect.top], eax
mov [.srect.right], ecx
mov [.srect.bottom], edx
mov ecx, [edi+TImage.width]
mov edx, [edi+TImage.height]
mov [.drect.left], eax
mov [.drect.top], eax
mov [.drect.right], ecx
mov [.drect.bottom], edx
mov ecx, [.xSrc]
mov edx, [.ySrc]
mov [.rect.left], ecx
mov [.rect.top], edx
add ecx, [.width]
add edx, [.height]
mov [.rect.right], ecx
mov [.rect.bottom], edx
lea ecx, [.srect]
lea edx, [.rect]
stdcall RectIntersect, ecx, ecx, edx
jc .finish
mov ecx, [.xSrc]
mov edx, [.ySrc]
sub ecx, [.xDst]
sub edx, [.yDst]
; convert the rect to the destination coordinates.
sub [.srect.left], ecx
sub [.srect.top], edx
sub [.srect.right], ecx
sub [.srect.bottom], edx
lea eax, [.srect]
lea ebx, [.drect]
stdcall RectIntersect, ebx, ebx, eax
jc .finish
stdcall RectCopy, eax, ebx ; srect = drect
;convert back to source coordinates.
add [.srect.left], ecx
add [.srect.top], edx
add [.srect.right], ecx
add [.srect.bottom], edx
; here [.srect] contains the source rectange
; [.drect] contains the destination rectangle
; the width and height of the rectangles is the same.
mov ecx, [.srect.left]
mov edx, [.srect.top]
sub [.srect.right], ecx
sub [.srect.bottom], edx
mov ecx, [.srect.top]
mov edx, [.drect.top]
imul ecx, [esi+TImage.width]
imul edx, [edi+TImage.width]
add ecx, [.srect.left]
add edx, [.drect.left]
shl ecx, 2
shl edx, 2
add ecx, [esi+TImage.pPixels]
add edx, [edi+TImage.pPixels]
mov esi, [esi+TImage.width]
mov edi, [edi+TImage.width]
lea esi, [4*esi]
lea edi, [4*edi]
; prepare MMX constants
pxor mm0, mm0 ; mm0 = 0000 0000 0000 0000
pcmpeqw mm1, mm1 ; mm1 = ffff ffff ffff ffff
psrlw mm1, 15 ; mm1 = 0001 0001 0001 0001
psllw mm1, 8 ; mm1 = 0100 0100 0100 0100
.loopY:
mov ebx, [.srect.right] ; the width of the source rectangle
.loopX:
dec ebx ; The ZF will not be changed later in the inner loop.
js .nextY
push edx
movzx eax, byte [ecx+4*ebx]
movzx edx, byte [ecx+4*ebx+1]
lea eax, [eax+2*edx]
movzx edx, byte [ecx+4*ebx+2]
add eax, edx
shr eax, 2 ; grayscale.
pop edx
movd mm6, [.color]
movd mm7, eax
punpcklbw mm6, mm0 ; byte to word color.
punpckldq mm7, mm7 ;
packssdw mm7, mm7 ; mm7 = I, I, I, I
pmullw mm7, mm6 ; mm7 is the color to blend = Cs*256
movd mm6, [edx+4*ebx] ; Destination color
punpcklbw mm6, mm0 ; byte to word destination pixel
movq mm5, mm7
psrlq mm5, 56 ; alpha source
punpckldq mm5, mm5
packssdw mm5, mm5 ; mm5 = As, As, As, As
movq mm4, mm1
psubw mm4, mm5 ; mm4 = Bs Bs Bs Bs (Bs = $100 - As)
pmullw mm6, mm4 ; mm6 = Cd = Cd * (256-As) = Cd * Bs
paddusw mm6, mm7 ; Cd = 256*Cs + Cd*(256-As)
psrlw mm6, 8 ; Cd = Cd/256
packuswb mm6, mm0 ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
movd [edx+4*ebx], mm6
jmp .loopX
.nextY:
add ecx, esi
add edx, edi
dec [.srect.bottom]
jnz .loopY
.finish:
emms
popad
return
endp
;interface GetTextBounds, .pString, .len, .font
body GetTextBounds ;, .pString, .len, .font
.size SIZE
.pwc dd ?
.charlen dd ?
begin
push ebx ecx
invoke CreateCompatibleDC, 0
mov ebx, eax
; first convert the string:
mov ecx, [.len]
shl ecx, 3
stdcall GetMem, ecx
mov [.pwc], eax
invoke MultiByteToWideChar, CP_UTF8, 0, [.pString], [.len], [.pwc], ecx
mov [.charlen], eax
invoke SelectClipRgn, ebx, 0
invoke SelectObject, ebx, [.font]
push eax
lea eax, [.size]
invoke GetTextExtentPoint32W, ebx, [.pwc], [.charlen], eax
invoke SelectObject, ebx ; from the stack.
invoke DeleteDC, ebx
mov eax, [.size.cx]
mov edx, [.size.cy]
stdcall FreeMem, [.pwc]
pop ecx ebx
return
|
| ︙ | ︙ |
1 2 3 4 5 6 7 8 9 10 11 12 13 | ; _______________________________________________________________________________________ ;| | ;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." | ;|_______________________________________________________________________________________| ; ; Description: Graphics amalgamation include file. ; Includes all graphic libraries of FreshLib ; ; Target OS: Any ;_________________________________________________________________________________________ include 'rectangles.asm' | < < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ; _______________________________________________________________________________________ ;| | ;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." | ;|_______________________________________________________________________________________| ; ; Description: Graphics amalgamation include file. ; Includes all graphic libraries of FreshLib ; ; Target OS: Any ;_________________________________________________________________________________________ include 'rectangles.asm' include 'images.asm' include 'draw.asm' include 'giflib.asm' include 'pnglib.asm' include 'fonts.asm' include 'text.asm' |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | ; Dependencies: ; ; Notes: This file contains OS independent part and includes OS dependent files. ;_________________________________________________________________________________________ module "Draw library" | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | | | | | > | | > > > > | > > > | > > | > | > > | > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 |
; Dependencies:
;
; Notes: This file contains OS independent part and includes OS dependent files.
;_________________________________________________________________________________________
module "Draw library"
;include "%TargetOS%/draw.asm"
proc DrawSolidRect, .pDstImage, .x, .y, .width, .height, .color
.drect RECT
.rect RECT
begin
pushad
mov esi, [.pDstImage]
xor eax, eax
mov ecx, [esi+TImage.width]
mov edx, [esi+TImage.height]
mov [.drect.left], eax
mov [.drect.top], eax
mov [.drect.right], ecx
mov [.drect.bottom], edx
mov ecx, [.x]
mov edx, [.y]
mov [.rect.left], ecx
mov [.rect.top], edx
add ecx, [.width]
add edx, [.height]
mov [.rect.right], ecx
mov [.rect.bottom], edx
lea ecx, [.drect]
lea edx, [.rect]
stdcall RectIntersect, ecx, ecx, edx
jc .finish
; here [.srect] contains the source rectange
; [.drect] contains the destination rectangle
; the width and height of the rectangles is the same.
mov ecx, [.drect.right]
mov edx, [.drect.bottom]
sub ecx, [.drect.left]
sub edx, [.drect.top]
mov edi, [.drect.top]
imul edi, [esi+TImage.width]
add edi, [.drect.left]
lea edi, [edi*4]
add edi, [esi+TImage.pPixels]
mov esi, [esi+TImage.width]
lea esi, [4*esi]
stdcall __fix_color, [.color], regEAX
.loopY:
mov ebx, ecx ; the width of the source rectangle
.loopX:
dec ebx
mov [edi+4*ebx], eax ; fill the color
jnz .loopX
add edi, esi
dec edx
jnz .loopY
.finish:
popad
return
endp
proc BlendSolidRect, .pDstImage, .x, .y, .width, .height, .color
.drect RECT
.rect RECT
begin
pushad
mov esi, [.pDstImage]
xor eax, eax
mov ecx, [esi+TImage.width]
mov edx, [esi+TImage.height]
mov [.drect.left], eax
mov [.drect.top], eax
mov [.drect.right], ecx
mov [.drect.bottom], edx
mov ecx, [.x]
mov edx, [.y]
mov [.rect.left], ecx
mov [.rect.top], edx
add ecx, [.width]
add edx, [.height]
mov [.rect.right], ecx
mov [.rect.bottom], edx
lea ecx, [.drect]
lea edx, [.rect]
stdcall RectIntersect, ecx, ecx, edx
jc .finish
; here [.srect] contains the source rectange
; [.drect] contains the destination rectangle
; the width and height of the rectangles is the same.
mov ecx, [.drect.right]
mov edx, [.drect.bottom]
sub ecx, [.drect.left]
sub edx, [.drect.top]
mov edi, [.drect.top]
imul edi, [esi+TImage.width]
add edi, [.drect.left]
lea edi, [edi*4]
add edi, [esi+TImage.pPixels]
mov esi, [esi+TImage.width]
lea esi, [4*esi]
stdcall __fix_color, [.color], regEAX
; prepare MMX constants
pxor mm0, mm0 ; mm0 = 0000 0000 0000 0000
pcmpeqw mm1, mm1 ; mm1 = ffff ffff ffff ffff
psrlw mm1, 8 ; mm1 = 00ff 00ff 00ff 00ff
; the color
movd mm7, eax
movq mm5, mm7
psrlq mm5, 24 ; alpha source
punpckldq mm5, mm5
packssdw mm5, mm5 ; mm5 = As, As, As, As
movq mm4, mm1
psubw mm4, mm5 ; mm4 = Bs Bs Bs Bs (Bs = $100 - As)
punpcklbw mm7, mm0 ; byte to word source pixel
psllw mm7, 8 ; Cs = Cs*256
.loopY:
mov ebx, ecx ; the width of the source rectangle
.loopX:
dec ebx ; The ZF will not be changed later in the inner loop.
movd mm6, [edi+4*ebx] ; destination pixel.
punpcklbw mm6, mm0 ; byte to word destination pixel
pmullw mm6, mm4 ; mm6 = Cd = Cd * (256-As) = Cd * Bs (For alpha Ad = Ad*Bs)
paddusw mm6, mm7 ; Cd = Cs + Cd
psrlw mm6, 8 ; Cd = Cd/256
packuswb mm6, mm0 ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
movd [edi+4*ebx], mm6
jnz .loopX
.nextY:
add edi, esi
dec edx
jnz .loopY
.finish:
popad
return
endp
proc __fix_color, .color, .reg
begin
pushad
movzx ebx, byte [.color+3] ; alpha
mov ecx, ebx
mov esi, $ff
movzx eax, byte [.color+2] ; red
mul ebx
div esi
shl ecx, 8
mov cl, al
movzx eax, byte [.color+1] ; green
mul ebx
div esi
shl ecx, 8
mov cl, al
movzx eax, byte [.color] ; blue
mul ebx
div esi
shl ecx, 8
mov cl, al
mov eax, [.reg]
lea eax, [esp+4*eax]
mov [eax], ecx
popad
return
endp
; Draws horizontal line from .x1 to .x2 on y with color [.color]
;
;
proc DrawHLine, .pImage, .x1, .x2, .y, .color
begin
return
endp
proc DrawVLine, .pImage, .y1, .y2, .x, .color
begin
return
endp
proc ApplyAlphaRect, .pImage, .x, .y, .width, .height, .alpha
.drect RECT
.rect RECT
begin
pushad
mov edi, [.pImage]
xor eax, eax
mov ecx, [edi+TImage.width]
mov edx, [edi+TImage.height]
mov [.drect.left], eax
mov [.drect.top], eax
mov [.drect.right], ecx
mov [.drect.bottom], edx
mov ecx, [.x]
mov edx, [.y]
mov [.rect.left], ecx
mov [.rect.top], edx
add ecx, [.width]
add edx, [.height]
mov [.rect.right], ecx
mov [.rect.bottom], edx
lea ecx, [.drect]
lea edx, [.rect]
stdcall RectIntersect, ecx, ecx, edx
jc .finish
; here [.drect] contains the destination rectangle
mov ecx, [.drect.left]
mov edx, [.drect.top]
sub [.drect.right], ecx
sub [.drect.bottom], edx
imul edx, [edi+TImage.width]
add edx, [.drect.left]
shl edx, 2
add edx, [edi+TImage.pPixels] ; pointer to the upper left corner of the rect.
mov edi, [edi+TImage.width]
lea edi, [4*edi]
.loopY:
mov ebx, [.drect.right] ; the width of the source rectangle
.loopX:
dec ebx ; The ZF will not be changed later in the inner loop.
js .nextY
movzx eax, byte [edx+4*ebx+3] ; dest alpha.
movzx ecx, byte [.alpha]
; Ad = Ad * [.alpha]/256
imul eax, ecx
sar eax, 8
mov [edx+4*ebx+3], al
jmp .loopX
.nextY:
add edx, edi
dec [.drect.bottom]
jnz .loopY
.finish:
popad
return
endp
proc FilterDisabled, .pImage, .no_alpha
.gray dd ?
.alpha dd ?
begin
pushad
mov edi, [.pImage]
mov ebx, [edi+TImage.width]
mov ecx, [edi+TImage.height]
mov edi, [edi+TImage.pPixels]
.outloop:
dec ecx
js .finish
mov esi, ebx ; Counter from 0 to IconWidth-1
inc esi
.inloop:
dec esi
jz .outloop
movzx eax, byte [edi] ; blue
movzx edx, byte [edi+1] ; green
lea edx, [edx+2*eax] ; 2*Blue + Green
movzx eax, byte [edi+2]
add edx, eax ; + Red
movzx eax, byte [edi+3] ; Alpha
mov [.alpha], eax
shr edx, 2 ; div 4 -> Grayscale pixel.
; This formula gives more realistic view.
mov [.gray], edx
; blend alpha
cmp [.no_alpha], 0
jne .store
imul eax, esi
cdq
div ebx
mov [.alpha], eax
mov eax, [.gray]
imul eax, esi
cdq
div ebx
mov [.gray], eax
.store:
mov al, byte [.alpha]
shl eax, 8
mov al ,byte [.gray]
shl eax, 8
mov al ,byte [.gray]
shl eax, 8
mov al ,byte [.gray]
stosd
jmp .inloop
.finish:
popad
return
endp
endmodule
|
| ︙ | ︙ | |||
15 16 17 18 19 20 21 22 23 24 25 26 | module "Fonts library" ffItalic = 1 ffUnderline = 2 ffStrikeOut = 4 ffMonospaced = $80 include '%TargetOS%/fonts.asm' endmodule | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | module "Fonts library" ffItalic = 1 ffUnderline = 2 ffStrikeOut = 4 ffMonospaced = $80 fwLight = 0 fwDemilight = 1 fwNormal = 2 fwMedium = 3 fwDemibold = 4 fwBold = 5 fwExtraBold = 6 fwBlack = 7 struct __TFont .hFontFace dd ? ; The name of the font face. .height dd ? ; The character height in pixels. .weight dd ? ; The weight of the characters. .flags dd ? ; ffItalic, ffMonospaced, etc. ends interface FontCreate, .font_name, .size, .weight, .flags interface FontDestroy, .pFont ; returns some font metrics ; ; Arguments: ; .font - the font ; Returns: ; EAX - the line height of the font. ; EBX - the ascender of the font. ; EDX - the descender of the font. interface GetFontMetrics, .font include '%TargetOS%/fonts.asm' endmodule |
| ︙ | ︙ | |||
18 19 20 21 22 23 24 | ; Creates memory image with parameters specified. interface CreateImage, .width, .height interface DestroyImage, .ptrImage | < | | < < < < < < < < < < < < < < < | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | ; Creates memory image with parameters specified. interface CreateImage, .width, .height interface DestroyImage, .ptrImage ; Draws the image on a OS provided window surface. interface DrawImageRect, .where, .pImage, .xDst, .yDst, .xSrc, .ySrc, .width, .height proc BlendImage, .pDstImage, .xDst, .yDst, .pSrcImage, .xSrc, .ySrc, .width, .height .srect RECT .drect RECT .rect RECT |
| ︙ | ︙ | |||
140 141 142 143 144 145 146 |
lea esi, [4*esi]
lea edi, [4*edi]
; prepare MMX constants
pxor mm0, mm0 ; mm0 = 0000 0000 0000 0000
pcmpeqw mm1, mm1 ; mm1 = ffff ffff ffff ffff
| > > | | < < < < | < < | > | < < | | > < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
lea esi, [4*esi]
lea edi, [4*edi]
; prepare MMX constants
pxor mm0, mm0 ; mm0 = 0000 0000 0000 0000
pcmpeqw mm1, mm1 ; mm1 = ffff ffff ffff ffff
psrlw mm1, 8 ; mm1 = 00ff 00ff 00ff 00ff
; psrlw mm1, 15 ; mm1 = 0001 0001 0001 0001
; psllw mm1, 8 ; mm1 = 0100 0100 0100 0100
.loopY:
mov ebx, [.srect.right] ; the width of the source rectangle
.loopX:
dec ebx ; The ZF will not be changed later in the inner loop.
movd mm7, [ecx+4*ebx] ; source pixel.
movd mm6, [edx+4*ebx] ; destination pixel.
movq mm5, mm7
psrlq mm5, 24 ; alpha source
punpckldq mm5, mm5
packssdw mm5, mm5 ; mm5 = As, As, As, As
movq mm4, mm1
psubw mm4, mm5 ; mm4 = Bs Bs Bs Bs (Bs = $100 - As)
punpcklbw mm6, mm0 ; byte to word destination pixel
punpcklbw mm7, mm0 ; byte to word source pixel
psllw mm7, 8 ; Cs = Cs*256
pmullw mm6, mm4 ; mm6 = Cd = Cd * (256-As) = Cd * Bs (For alpha Ad = Ad*Bs)
paddusw mm6, mm7 ; Cd = Cs + Cd
psrlw mm6, 8 ; Cd = Cd/256
packuswb mm6, mm0 ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
movd [edx+4*ebx], mm6
jnz .loopX
.nextY:
add ecx, esi
add edx, edi
dec [.srect.bottom]
jnz .loopY
.finish:
emms
popad
return
endp
proc CopyImageRect, .pDstImage, .xDst, .yDst, .pSrcImage, .xSrc, .ySrc, .width, .height
.srect RECT
.drect RECT
.rect RECT
begin
|
| ︙ | ︙ | |||
396 397 398 399 400 401 402 403 404 405 406 407 408 |
add ecx, esi
add edx, edi
dec [.srect.bottom]
jnz .loopY
.finish:
popad
return
endp
| > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 |
add ecx, esi
add edx, edi
dec [.srect.bottom]
jnz .loopY
.finish:
emms
popad
return
endp
;proc ImageMulAlpha2, .pImage, .x, .y, .width, .height
;.drect RECT
;.rect RECT
;begin
; pushad
;
; mov edi, [.pImage]
;
; xor eax, eax
; mov ecx, [edi+TImage.width]
; mov edx, [edi+TImage.height]
;
; mov [.drect.left], eax
; mov [.drect.top], eax
; mov [.drect.right], ecx
; mov [.drect.bottom], edx
;
; mov ecx, [.x]
; mov edx, [.y]
;
; mov [.rect.left], ecx
; mov [.rect.top], edx
;
; add ecx, [.width]
; add edx, [.height]
;
; mov [.rect.right], ecx
; mov [.rect.bottom], edx
;
; lea ecx, [.drect]
; lea edx, [.rect]
; stdcall RectIntersect, ecx, ecx, edx
; jc .finish
;
; mov ecx, [.drect.left]
; mov edx, [.drect.top]
; sub [.drect.right], ecx
; sub [.drect.bottom], edx
;
; mov esi, [.drect.top]
; imul esi, [edi+TImage.width]
;
; add esi, [.drect.left]
; lea esi, [4*esi]
; add esi, [edi+TImage.pPixels]
;
; mov edi, [edi+TImage.width]
; lea edi, [4*edi]
;
;; prepare MMX constants
;
; pxor mm0, mm0 ; mm0 = 0000 0000 0000 0000
; pcmpeqw mm1, mm1 ; mm1 = ffff ffff ffff ffff
; psrlw mm1, 15 ; mm1 = 0001 0001 0001 0001
; psllw mm1, 8 ; mm1 = 0100 0100 0100 0100
; psllq mm1, 48 ; mm1 = 0100 0000 0000 0000
;
;.loopY:
; mov ebx, [.drect.right] ; the width of the source rectangle
;
;.loopX:
; dec ebx ; The ZF will not be changed later in the inner loop.
;
; movd mm6, [esi+4*ebx] ; destination pixel.
;
; movq mm5, mm6
; psrlq mm5, 24 ; alpha
;
; punpckldq mm5, mm5 ;
; punpcklbw mm6, mm0 ; byte to word destination pixel
; packssdw mm5, mm5 ; mm5 = Ad, Ad, Ad, Ad
;
; psrlq mm5, 16 ; mm5 = 0 Ad Ad Ad
; por mm5, mm1 ; mm5 = $100 Ad Ad Ad
;
; pmullw mm6, mm5 ; mm6 = Cd = Cd * Ad (For alpha Ad = Ad * 256)
; psrlw mm6, 8 ; Cd = Cd/256 (For alpha Ad = Ad)
;
; packuswb mm6, mm0 ; pack words to bytes 0A 0R 0G 0B -> 0000ARGB
; movd [esi+4*ebx], mm6
;
; jnz .loopX
;
;.nextY:
; add esi, edi
;
; dec [.drect.bottom]
; jnz .loopY
;
;.finish:
; emms
; popad
; return
;endp
include '%TargetOS%/images.asm'
endmodule
|
| ︙ | ︙ | |||
566 567 568 569 570 571 572 573 574 575 576 577 578 579 |
rol ebx, cl
shl ebx, 2
add ebx, [.pPalette]
mov edx, [ebx]
.store_px:
mov [edi], edx
add edi, 4
dec [.j]
jnz .inner2
movzx eax, ch
| > > > | 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 |
rol ebx, cl
shl ebx, 2
add ebx, [.pPalette]
mov edx, [ebx]
.store_px:
stdcall __fix_color, edx, regEDX ; pre-multiply alpha
mov [edi], edx
add edi, 4
dec [.j]
jnz .inner2
movzx eax, ch
|
| ︙ | ︙ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ; _______________________________________________________________________________________ ;| | ;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." | ;|_______________________________________________________________________________________| ; ; Description: TGrid object class ; ; Target OS: Any ; ; Dependencies: ; Notes: ;_________________________________________________________________________________________ module "Rectangles library" ; Calculates the intersection of two source rectangles, pointed by [.src1] and [.src2] ; The result rectangle is placed in RECT structure pointed by [.dest] ; All three rectangles may point to the same structures. ; ; Returns CF=0 if rectangles intersect and CF=1 if not. | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
; _______________________________________________________________________________________
;| |
;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." |
;|_______________________________________________________________________________________|
;
; Description: TGrid object class
;
; Target OS: Any
;
; Dependencies:
; Notes:
;_________________________________________________________________________________________
module "Rectangles library"
; Calculates the bounding rectangle of two source rectangles, pointed by [.src1] and [.src2]
; The result rectangle is placed in RECT structure pointed by [.dest]
;
; All three rectangles may point to the same structures.
;
; Procedure preserves all registers.
proc RectBounding, .dest, .src1, .src2
begin
pushad
mov esi, [.src1]
mov edi, [.src2]
mov ebx, [.dest]
; min left1, left2
mov eax, [esi+RECT.left]
mov edx, [edi+RECT.left]
sub edx, eax
sbb ecx, ecx
and ecx, edx
add eax, ecx
mov [ebx+RECT.left], eax
; min top1, top2
mov eax, [esi+RECT.top]
mov edx, [edi+RECT.top]
sub edx, eax
sbb ecx, ecx
and ecx, edx
add eax, ecx
mov [ebx+RECT.top], eax
; max right1, right2
mov eax, [esi+RECT.right]
mov edx, [edi+RECT.right]
sub edx, eax
sbb ecx, ecx
not ecx
and ecx, edx
add eax, ecx
mov [ebx+RECT.right], eax
; max bottom1, bottom2
mov eax, [esi+RECT.bottom]
mov edx, [edi+RECT.bottom]
sub edx, eax
sbb ecx, ecx
not ecx
and ecx, edx
add eax, ecx
mov [ebx+RECT.bottom], eax
popad
return
endp
; Calculates the intersection of two source rectangles, pointed by [.src1] and [.src2]
; The result rectangle is placed in RECT structure pointed by [.dest]
; All three rectangles may point to the same structures.
;
; Returns CF=0 if rectangles intersect and CF=1 if not.
|
| ︙ | ︙ |
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | ; Dependencies: StrLib ; ; Notes: This file contains OS independent part of the library and includes respective ; OS dependent files. ;_________________________________________________________________________________________ module "Text library" | | > < < | | | > | | | < < < < | > > > > > > > > < < < < < < < < < | < < | < < | < < | < < < < < < < < | | > | | | | > | > | | > | < | < | | | | | < < < < > | < > | > | | < < | < > > > < < | | > | | > > | < < < < > | | | > | > > | | | < | < | | | | < | | | | | | > | > > | | | > > > | | > | < | | > > | > | > > | > | | | < < | < | | > | | < | | > | | > | > > | | | | > | > | > | > > | > | | | | > | | > > | | | < < | | | > | > > > > < < < | < | > | > | | < > | | > | | > > | | | | | > | | | | > > | | | > > > | | | | | < | | < < | | | | | | < < > > | | | | | | | > > | | | > | | | | < | | | < < | | | > | < | < < < < > > > > > > > > > | > > | > > > > > > | > | < | | < | < | | < > < | < < < < | < < < < < | < | < < < < | | > > | > | | > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > | | > > | | > > > > > | > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > | > | < | | > | > > > > > > > > > > > > > > > > > | > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > | > > > > > > > | > > | | > > > > > > > > > > > > > > | > > | > > > > > > > > > | > > > > > | > > > > > > > > > > > > > > > > > | > > > > | > > | > | > | > > | > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > | > | | > > > | > > > > > > > > | > > | > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > | > > | | | > > > > > > > > > > > > | > > > > > > > > > > > | > > > > > > > > > > | > | > | > > > > > > > > | > > > > | > > > > > > > > > > > > > > > > > > > | | | | | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | > > > > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 |
; Dependencies: StrLib
;
; Notes: This file contains OS independent part of the library and includes respective
; OS dependent files.
;_________________________________________________________________________________________
module "Text library"
interface DrawString, .pImage, .pString, .len, .x, .y, .font, .color
interface TextDecompose, .hString, .font
interface DrawDecomposedString, .pImage, .pArray, .x, .y, .font, .color
interface GetTextBounds, .pString, .len, .font
struct TTextExtent
.width dd ?
.height dd ?
.OffsX dd ?
.OffsY dd ?
ends
struct TCharAttr
.font dd ?
.color dd ?
.background dd ?
.flags dd ? ; for free use of the client.
ends
; dtfXXX means "draw text flag"
dtfHAlignMask = $3
dtfVAlignMask = $c
; horizontal align
dtfAlignLeft = 0
dtfAlignRight = 1
dtfAlignCenter = 2
dtfAlignJustify = 3
; vertical align
dtfAlignTop = 0 shl 2
dtfAlignBottom = 1 shl 2
dtfAlignMiddle = 2 shl 2
; Text layout
dtfCRLF = $0100
dtfWordWrap = $0200
dtfTableTabs = $0400
dtfSingleLine = $0800
struct _TTextChunk
.y dd ?
.width dd ?
.len dd ?
.ptr dd ?
ends
struct TTextChar
.code dd ? ; unicode of the character.
.width dw ? ; width increment in pixels.
.height dw ? ; height increment in pixels - if <> 0 this char must be written on new line.
ends
proc AdjustCountUtf8
begin
push esi
lea esi, [esi+ebx]
stdcall ScanBackUtf8
mov ebx, esi
pop esi
sub ebx, esi
return
endp
proc JustifyLine, .CharArray, .from, .to, .current_width, .align_width
begin
pushad
dec [.to] ; don't change the last character width.
mov edi, [.CharArray]
mov ecx, [.to]
sub ecx, [.from]
jle .finish
mov edx, [.align_width]
sub edx, [.current_width]
jle .finish
mov esi, edx
mov ebx, [.from]
.align_loop:
inc ebx
cmp ebx, [.to]
jae .finish
cmp word [edi+TArray.array+8*ebx+TTextChar.width], 0
je .skip_this
.sub:
test esi, esi
js .negative
sub esi, ecx
inc word [edi+TArray.array+8*ebx+TTextChar.width]
jmp .sub
.negative:
add esi, edx
jmp .align_loop
.skip_this:
dec ecx
jnz .align_loop
.finish:
popad
return
endp
proc DrawTextBox, .pImage, .text, .x, .y, .width, .height, .extra_line, .flags, .font, .color
.ascender dd ?
.descender dd ?
.txt_height dd ?
.last_word dd ?
.lw_width dd ?
.no_just dd ?
begin
pushad
stdcall TextDecompose, [.text], [.font]
mov edi, eax
mov [.ascender], edx
mov [.descender], ecx
add [.y], edx
xor ecx, ecx
mov [.txt_height], ecx
cmp [edi+TArray.count], ecx
je .finish
.main_loop: ; start of new line
xor ebx, ebx ; current X coordinate.
or [.last_word], -1 ; end of the word -1 means there is no word from the beginning of the line.
mov eax, [.txt_height]
cmp eax, [.height]
jb .format_it
mov eax, [.extra_line]
sub [.txt_height], eax
mov [edi+TArray.count], ecx
jmp .draw_all2
.format_it:
stdcall InsertArrayItems, edi, ecx, 1
mov edi, edx
mov [eax+TTextChar.code], $20
mov dword [eax+TTextChar.width], ebx ; Set to zero TTextChar.height as well!
mov esi, ecx ; start of the line!
inc ecx
.slice_loop:
; Is it end of a word?
cmp [edi+TArray.array+8*ecx+TTextChar.code], $20
ja .white_ok
test ecx, ecx
jz .white_ok
cmp [edi+TArray.array+8*ecx-8+TTextChar.code], $20 ; previous character
jbe .white_ok
mov [.last_word], ecx ; edx is a pointer to the end of the last word.
mov [.lw_width], ebx
.white_ok:
test [.flags], dtfCRLF
jz .crlf_ok
mov [.no_just], 1
cmp [edi+TArray.array+8*ecx+TTextChar.code], $0d
je .new_line
cmp [edi+TArray.array+8*ecx+TTextChar.code], $0a
je .new_line
.crlf_ok:
mov [.no_just], 0
test [.flags], dtfTableTabs
jz .tabs_ok
; implement here check for tab and tabs expanding.
.tabs_ok:
; check the current line width
movzx eax, word [edi+TArray.array+8*ecx+TTextChar.width]
add eax, ebx
cmp eax, [.width]
ja .wider
mov ebx, eax
inc ecx
cmp ecx, [edi+TArray.count]
jb .slice_loop
mov [.no_just], 1
call .RowAlign
jmp .draw_all
.wider:
test [.flags], dtfSingleLine
jnz .del_remaining
mov eax, ecx
sub eax, esi
cmp eax, 1
jbe .finish ; Even single char can not be displayed on this [.width]
; next line
.new_line:
test [.flags], dtfWordWrap
jz .word_ok
; word wrap
cmp [.last_word], 0
jl .word_ok ; there is no previous word, so split on the current pos.
mov ecx, [.last_word]
mov ebx, [.lw_width]
.word_ok:
call .RowAlign
mov eax, [edi+TArray.lparam] ; contains the line height computed by DecomposeText
add eax, [.extra_line]
add [.txt_height], eax
mov word [edi+TArray.array+8*ecx-8+TTextChar.height], ax
test [.flags], dtfCRLF
jz .skip_ws_loop
mov eax, [edi+TArray.array+8*ecx+TTextChar.code]
cmp eax, $0d
je .skip_cr
cmp eax, $0a
jne .skip_ws_loop
.skip_cr:
mov word [edi+TArray.array+8*ecx+TTextChar.width], 0 ; zero width, skip it.
inc ecx
cmp ecx, [edi+TArray.count]
je .draw_all
xor eax, $0d xor $0a
cmp [edi+TArray.array+8*ecx+TTextChar.code], eax
jne .main_loop
mov word [edi+TArray.array+8*ecx+TTextChar.width], 0 ; zero width, skip it.
inc ecx
cmp ecx, [edi+TArray.count]
jae .draw_all
jmp .main_loop
.del_remaining:
mov eax, [edi+TArray.count]
sub eax, ecx
stdcall DeleteArrayItems, edi, ecx, eax
jmp .draw_all
.skip_ws_loop:
cmp [edi+TArray.array+8*ecx+TTextChar.code], $20
ja .main_loop
mov word [edi+TArray.array+8*ecx+TTextChar.width], 0 ; zero width, skip it.
inc ecx
cmp ecx, [edi+TArray.count]
jb .skip_ws_loop
.draw_all:
; compute the vertical align.
mov eax, [edi+TArray.lparam]
add [.txt_height], eax
.draw_all2:
mov ecx, [.height]
sub ecx, [.txt_height]
mov eax, [.flags]
and eax, dtfVAlignMask
cmp eax, dtfAlignTop
je .drawit
add [.y], ecx
cmp eax, dtfAlignBottom
je .drawit
sar ecx, 1
sub [.y], ecx
.drawit:
stdcall DrawDecomposedString, [.pImage], edi, [.x], [.y], [.font], [.color]
.finish:
stdcall FreeMem, edi
popad
return
.RowAlign:
mov eax, [.flags]
and eax, dtfHAlignMask
cmp eax, dtfAlignLeft
je .align_ok ; no need for extra space
cmp eax, dtfAlignJustify
jne .align_center_right
cmp [.no_just], 1
je .align_ok
stdcall JustifyLine, edi, esi, ecx, ebx, [.width]
jmp .align_ok
.align_center_right:
mov edx, [.width]
sub edx, ebx
cmp eax, dtfAlignRight
je .set_align
sar edx, 1
.set_align:
mov word [edi+TArray.array+8*esi+TTextChar.width], dx
.align_ok:
retn
endp
;proc DrawTextBox, .pImage, .text, .x, .y, .width, .height, .flags, .font, .color
;
; .count dd ?
;
; .widths dd ?
; .offset dd ?
;
;begin
; pushad
;
; stdcall StrPtr, [.text]
; mov esi, eax
;
; add [.y], 22
;
; stdcall GetTextWidthsArray, [.text], [.font]
;
; mov [.widths], eax
; mov eax, [.widths]
; lea edi, [eax+TArray.array] ; array with x coordinates of every char in the string.
;
;; slice the string on chunks, depending on flags, rectangle width and the string content.
;; push _TTextChunk for every chunk in stack.
;
; xor ecx, ecx
; mov [.count], ecx
; mov [.offset], ecx
;
;.slice_loop:
; push esi ; push _TTextChunk.ptr
;
;.scan_loop:
; stdcall DecodeUtf8, [esi]
;
; test eax, eax
; jz .slice_here
;
; test [.flags], dtfCRLF
; jz .check_width
;
; cmp eax, $0d
; je .cr_lf
;
; cmp eax, $0a
; je .cr_lf
;
;
;.check_width:
; mov ecx, [edi]
; sub ecx, [.offset]
; cmp ecx, [.width]
; jae .slice_here
;
; add esi, edx
; add edi, 4
; jmp .scan_loop
;
;
;.cr_lf:
; mov ecx, esi
; inc esi
; add edi, 4
;
; xor eax, $0d xor $0a
; cmp byte [esi], al
; jne @f
; inc esi
; dec ecx
; add edi, 4
;@@:
;
; pushd [edi]
; popd [.offset]
;
; jmp .chunk_len
;
;
;.slice_here:
; mov ecx, [edi]
; mov [.offset], ecx
;
;.end_string:
; mov ecx, esi
;
;.chunk_len:
; sub ecx, [esp] ; the start of the chunk!
;
; push ecx ; push _TTextChunk.len
; push edx ; push _TTextChunk.width
; push [.y] ; push _TTextChunk.y
;
;
; add [.y], 22 ;TEST/DEBUG
; inc [.count]
;
; test eax, eax
; jnz .slice_loop
;
;; here, all slices are in the stack, so draw them from down to the top.
;
;
; cmp [.count], 0
; je .finish
;
;.draw_loop:
; mov ebx, esp
; stdcall DrawString, [.pImage], [ebx+_TTextChunk.ptr], [ebx+_TTextChunk.len], [.x], [ebx+_TTextChunk.y], [.font], [.color]
;
; add esp, sizeof._TTextChunk
;
; dec [.count]
; jnz .draw_loop
;
;
;.finish:
; stdcall FreeMem, [.widths]
; popad
; return
;
;endp
;
;
;
;
;
; mov ecx, [.len]
;
; test [.flags], dtfCRLF
; jz .cropit
;
; xor ecx, ecx
;
;.scanCRLF:
; cmp ecx, [.len]
; jae .cropit
;
; mov al, [esi+ecx]
;
; cmp al, $0d
; je .cropit
; cmp al, $0a
; je .cropit
; inc ecx
; jmp .scanCRLF
;
;.cropit:
; mov ebx, ecx ; high limit
;
; stdcall AdjustCountUtf8
;
; mov eax, [.widths]
; mov eax, [eax+4*ebx+TArray.array]
; sub eax, [.start_len]
;
;; stdcall GetTextBounds, [.context], esi, ebx, [.font]
;
;;?????
;; cmp edx, [.height]
;; jg .drawchunks
;
;; mov [.lineh], edx
;
; cmp eax, [edi+TBounds.width]
; jle .itfits
;
; mov [.high], ebx
; mov [.low], 0
;
;.croploop:
; mov ebx, [.low]
; add ebx, [.high]
; shr ebx, 1
;
; cmp ebx, 1
; ja .check_width
;
; mov ebx, 1
; jmp .itfits
;
;.check_width:
; stdcall AdjustCountUtf8
; stdcall GetTextBounds, [.context], esi, ebx, [.font]
; cmp eax, [edi+TBounds.width]
; je .itfits
;
; jg .above
;
; cmp ebx, [.low]
; je .itfits
;
; mov [.low], ebx
; jmp .croploop
;
;.above:
; mov [.high], ebx
; jmp .croploop
;
;.itfits: ; here ebx contains the len of string that fits in the rectangle.
; mov ecx, ebx
; mov [.linew], eax
;
; test [.flags], dtfWordWrap
; jz .pushit
;
;; search the last space or tab that separates words:
; mov edx, ecx
;
;.searchword:
; cmp byte [esi+edx], 0
; je .found
; cmp byte [esi+edx], ' '
; je .found
; cmp byte [esi+edx], $09
; je .found
; cmp byte [esi+edx], $0d
; je .found
; cmp byte [esi+edx], $0a
; je .found
;
; dec edx
; jnz .searchword
;
; mov edx, ecx
;
;.found:
; push ebx
; mov ebx, edx
;
; stdcall AdjustCountUtf8
;
; stdcall GetTextBounds, [.context], esi, ebx, [.font]
;
; mov [.linew], eax
; mov [.lineh], edx
; mov ecx, ebx
; pop ebx
;
;.pushit:
; push esi ; pointer to the string.
; push ecx ; length of the string in bytes.
; push [.lineh] ; height of the line in pixels.
; push [.linew] ; width of the line in pixels.
; push [.y] ; y coordinate of the line.
;
; inc [.count]
;
; mov eax, [.lineh]
; add [.y], eax
; sub [.height], eax
;
; lea esi, [esi+ecx]
; sub [.len], ecx
; jz .drawchunks
;
; xor ecx, ecx
;
;; search for the whitespace that have to be skip
;.skiploop:
; mov al, [esi]
; cmp al, $0d
; je .skipcrlf
; cmp al, $0a
; je .skipcrlf
; cmp al, $20
; je .skipspace
; cmp al, $09
; je .skipspace
;
; jmp .slice
;
;.skipspace:
; inc esi
; dec [.len]
; jnz .skiploop
; jmp .drawchunks
;
;.skipcrlf:
; inc esi
; dec [.len]
; xor al, $0d xor $0a
; cmp [esi], al
; jne .slice
; inc esi
; dec [.len]
; jnz .slice
;
;
;
;
;
; return
;endp
;proc DrawTextBox, .context, .text, .bounds, .flags, .font, .color
;.len dd ?
;.count dd ?
;.height dd ?
;.y dd ?
;
;.low dd ?
;.high dd ?
;
;.linew dd ?
;.lineh dd ?
;
;.DrawProc dd ?
;begin
; pushad
;
; mov ecx, DrawString
;
; mov eax, [.flags]
; and eax, $03
; cmp eax, dtfAlignJustify
; jne @f
; mov ecx, DrawStringJustified
;@@:
; mov [.DrawProc], ecx
;
; stdcall StrLen, [.text]
; mov [.len], eax
;
; stdcall StrPtr, [.text]
; mov esi, eax
;
; mov edi, [.bounds]
; mov eax, [edi+TBounds.height]
;; mov ecx, [edi+TBounds.y]
; mov [.height], eax
; mov [.y], 0 ;ecx
;
;; slice the string on chunks, depending on flags, rectangle width and the string content.
;; push _TTextChunk for every chunk in stack.
; mov [.count], 0
;
;.slice:
; mov ecx, [.len]
;
; test [.flags], dtfCRLF
; jz .cropit
;
; xor ecx, ecx
;
;.scanCRLF:
; cmp ecx, [.len]
; jae .cropit
;
; mov al, [esi+ecx]
;
; cmp al, $0d
; je .cropit
; cmp al, $0a
; je .cropit
; inc ecx
; jmp .scanCRLF
;
;.cropit:
; mov ebx, ecx ; high limit
;
; stdcall AdjustCountUtf8
; stdcall GetTextBounds, [.context], esi, ebx, [.font]
;
; cmp edx, [.height]
; jg .drawchunks
;
; mov [.lineh], edx
;
; cmp eax, [edi+TBounds.width]
; jle .itfits
;
; mov [.high], ebx
; mov [.low], 0
;
;.croploop:
; mov ebx, [.low]
; add ebx, [.high]
; shr ebx, 1
;
; cmp ebx, 1
; ja .check_width
;
; mov ebx, 1
; jmp .itfits
;
;.check_width:
; stdcall AdjustCountUtf8
; stdcall GetTextBounds, [.context], esi, ebx, [.font]
; cmp eax, [edi+TBounds.width]
; je .itfits
;
; jg .above
;
; cmp ebx, [.low]
; je .itfits
;
; mov [.low], ebx
; jmp .croploop
;
;.above:
; mov [.high], ebx
; jmp .croploop
;
;.itfits: ; here ebx contains the len of string that fits in the rectangle.
; mov ecx, ebx
; mov [.linew], eax
;
; test [.flags], dtfWordWrap
; jz .pushit
;
;; search the last space or tab that separates words:
; mov edx, ecx
; cmp byte [esi+edx], $0d
; je .found
; cmp byte [esi+edx], $0a
; je .found
;
;.searchword:
; cmp byte [esi+edx], 0
; je .found
; cmp byte [esi+edx], ' '
; je .found
; cmp byte [esi+edx], $09
; je .found
; cmp byte [esi+edx], $0d
; je .found
; cmp byte [esi+edx], $0a
; je .found
;
; dec edx
; jnz .searchword
;
; mov edx, ecx
;
;.found:
; push ebx
; mov ebx, edx
; stdcall AdjustCountUtf8
; stdcall GetTextBounds, [.context], esi, ebx, [.font]
; mov [.linew], eax
; mov [.lineh], edx
; mov ecx, ebx
; pop ebx
;
;.pushit:
; push esi ; pointer to the string.
; push ecx ; length of the string.
; push [.lineh] ; height of the line.
; push [.linew] ; width of the line.
; push [.y] ;
;
; inc [.count]
;
; mov eax, [.lineh]
; add [.y], eax
; sub [.height], eax
;
; lea esi, [esi+ecx]
; sub [.len], ecx
; jz .drawchunks
;
; xor ecx, ecx
;
;; search for the whitespace that have to be skip
;.skiploop:
; mov al, [esi]
; cmp al, $0d
; je .skipcrlf
; cmp al, $0a
; je .skipcrlf
; cmp al, $20
; je .skipspace
; cmp al, $09
; je .skipspace
;
; jmp .slice
;
;.skipspace:
; inc esi
; dec [.len]
; jnz .skiploop
; jmp .drawchunks
;
;.skipcrlf:
; inc esi
; dec [.len]
; xor al, $0d xor $0a
; cmp [esi], al
; jne .slice
; inc esi
; dec [.len]
; jnz .slice
;
;; pop the _TTextChunk structures and draw, depending on flags.
;.drawchunks:
; cmp [.count], 0
; je .finish
;
; mov ebx, esp
; stdcall GetTextOffset, [.context], [ebx+_TTextChunk.ptr], [ebx+_TTextChunk.len], [.font]
; mov eax, [ebx+_TTextChunk.height]
; sub eax, edx ; it should be the line y descent
; test [.flags], dtfAlignBottom
; jnz @f
; sub [.y], eax
;@@:
; mov edx, [.flags]
; and edx, dtfAlignBottom or dtfAlignMiddle
;
; mov ecx, [edi+TBounds.height]
; sub ecx, [.y]
;
; cmp edx, dtfAlignBottom
; je .yalignok
;
; sar ecx, 1
; cmp edx, dtfAlignMiddle
; je .yalignok
;
; xor ecx, ecx
;
;.yalignok:
;.drawloop:
; cmp [.count], 0
; je .finish
;
; mov ebx, esp
;
; mov eax, [edi+TBounds.width]
; sub eax, [ebx+_TTextChunk.width]
;
; mov edx, [.flags]
; and edx, $03
;
; cmp edx, dtfAlignRight
; je .hready
;
; shr eax, 1
; cmp edx, dtfAlignCenter
; je .hready
;
; xor eax, eax
;
;.hready:
; add eax, [edi+TBounds.x]
;
; push eax
; stdcall GetTextOffset, [.context], [ebx+_TTextChunk.ptr], [ebx+_TTextChunk.len], [.font]
; add edx, ecx
; add edx, [ebx+_TTextChunk.y]
; add edx, [edi+TBounds.y]
; pop eax
;
; stdcall [.DrawProc], [.context], [ebx+_TTextChunk.ptr], [ebx+_TTextChunk.len], eax, edx, [.font], [.color]
;
;;; draws lines on every row of text. For debug purposes.
;;iglobal
;; if used __UnderlineStyle
;; __UnderlineStyle LineStyle 0, $808080
;; end if
;;endg
;;
;;if defined options.DebugMode & options.DebugMode
;; stdcall SetLineStyle, [.context], __UnderlineStyle
;; stdcall DrawLine, [.context], [edi+TBounds.x], edx, [edi+TBounds.width], edx
;;end if
;;; end debug code
;
;
; add esp, sizeof._TTextChunk
; dec [.count]
; jmp .drawloop
;
;.finish:
; popad
; return
;endp
;
;
;
;
;proc DrawStringJustified, .raster, .ptrString, .len, .x, .y, .font, .color
;.XX dd ?
;.rem dd ?
;.crem dd ?
;.endptr dd ?
;begin
; pushad
;
; mov esi, [.ptrString]
; mov eax, [.len]
; add eax, esi
; mov [.endptr], eax
;
; stdcall StrLenUtf8, esi, [.len]
; mov ecx, eax
; dec ecx
; jg @f
; mov ecx, 1
;@@:
;
; stdcall GetTextBounds, [.raster], esi, [.len], [.font]
;
; sub eax, [edi+TBounds.width]
; neg eax
;
; cdq
; div ecx
;
; cmp eax, 4
; jge .cantjustify ; the needed space is too big for justify, so just draw it left aligned
;
; mov ecx, eax
; mov [.rem], edx
; mov [.crem], edx
;
; mov ebx, [.len]
; push [.x]
; pop [.XX]
;
;.drawloop:
; cmp esi, [.endptr]
; jae .finish
;
; stdcall DecodeUtf8, [esi]
; jc .finish
;
; push edx
; stdcall DrawString, [.raster], esi, edx, [.XX], [.y], [.font], [.color]
; stdcall GetTextBounds, [.raster], esi, edx, [.font]
; pop edx
; add esi, edx
; add [.XX], eax
; add [.XX], ecx
;
; cmp [.crem], 0
; je .drawloop
;
; sub ebx, [.rem]
; jge .drawloop
;
; inc [.XX]
; dec [.crem]
; mov ebx, [.len]
; sub ebx, [.rem]
; jmp .drawloop
;
;.finish:
; popad
; return
;
;.cantjustify:
; stdcall DrawString, [.raster], [.ptrString], [.len], [.x], [.y], [.font], [.color]
; jmp .finish
;endp
include "%TargetOS%/text.asm"
endmodule
|
| ︙ | ︙ | |||
37 38 39 40 41 42 43 | ; ; The event can be not processed in the following cases: ; 1. The window that receives the message is not FreshLib object. ; 2. TObjectClass.procSysEventHandler = 0 for the given class and all parents. ; 3. All procSysEventHandler procedures refuse to process the event (CF=1) ;---------------------------------------------------------------------------------------------------------- | | > > > | | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
;
; The event can be not processed in the following cases:
; 1. The window that receives the message is not FreshLib object.
; 2. TObjectClass.procSysEventHandler = 0 for the given class and all parents.
; 3. All procSysEventHandler procedures refuse to process the event (CF=1)
;----------------------------------------------------------------------------------------------------------
proc __ProcessOneSystemEvent, .hwnd, .wmsg, .wparam, .lparam
begin
dispatch [.wmsg]
.ondefault:
stc
return
oncase 0
clc
return
enddispatch
endp
|
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ | > > > > > > > > > > > > | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
;
; Dependencies:
;
; Notes:
;_________________________________________________________________________________________
uglobal
var FTLibrary = ?
var FTCManager = ?
var FTCImageCache = ?
var FTCCMapCache = ?
endg
method TApplication.__create
begin
return
endp
|
| ︙ | ︙ | |||
22 23 24 25 26 27 28 |
proc GetStockCursor, .index
begin
return
endp
| | | 22 23 24 25 26 27 28 29 30 31 32 |
proc GetStockCursor, .index
begin
return
endp
proc __MouseCapture, .hwnd
begin
return
endp
|
| ︙ | ︙ | |||
8 9 10 11 12 13 14 15 16 17 18 | ; Target OS: KolibriOS ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ ;_________________________________________________________________________________________ | > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | > > > > > > > > > > | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
; Target OS: KolibriOS
;
; Dependencies:
;
; Notes:
;_________________________________________________________________________________________
body _CreateNullWindow
begin
return
endp
;_________________________________________________________________________________________
body _DestroyWindow
begin
return
endp
;_________________________________________________________________________________________
body _GetWindowBounds
begin
return
endp
;_________________________________________________________________________________________
body _SetWindowBounds
begin
return
endp
;_________________________________________________________________________________________
body _ClientToScreen
begin
return
endp
;_________________________________________________________________________________________
body _SetWindowBorder
begin
return
endp
;_________________________________________________________________________________________
body _ShowWindow
begin
return
endp
;_________________________________________________________________________________________
body _RefreshWindowRect
begin
return
endp
;_________________________________________________________________________________________
body _SetWindowTextUtf8
begin
return
endp
;_________________________________________________________________________________________
proc _AddChild, .hwnd, .child
begin
return
endp
;_________________________________________________________________________________________
; Common utility procedures.
;_________________________________________________________________________________________
;
; Returns the window TObject structure, from the window handle.
;_________________________________________________________________________________________
body _GetWindowStruct
begin
return
endp
;_________________________________________________________________________________________
body _SetWindowStruct
begin
return
endp
;_________________________________________________________________________________________
body _SetModalTowards
begin
return
endp
;_________________________________________________________________________________________
body _FinalizeModal
begin
return
endp
;_________________________________________________________________________________________
|
| ︙ | ︙ | |||
15 16 17 18 19 20 21 |
uglobal
if used fGlobalTerminate
fGlobalTerminate dd ?
end if
endg
| > | | | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
uglobal
if used fGlobalTerminate
fGlobalTerminate dd ?
end if
endg
body ProcessSystemEvents
.event XEvent
rb 256
begin
push ebx ecx edx
.event_loop:
; check for quit
get eax, [pApplication], TApplication:MainWindow
|
| ︙ | ︙ | |||
66 67 68 69 70 71 72 |
pop edx ecx ebx
return
endp
| | < < < < < < < < < < < < < < < < < < < < | | < < | < < | < < < < < < < < | | < < | < < | < < < < < | < < < < < < < < < > > | > | | | | > | | < < < < < | | | > | | | > | < < | < | < < < | < < < < | > | > > > | > > | > > | | > > > > > | > > > > | > > | > > | > | > | > > | > > | > > > > > > > > | > > > | < > > | | > > | | | > | > > | > > > | | | | | > | > > > | > | > > | | | > > > > > > > > > > > > > > > > > > > > > > | > | | > | | | < < < < < < | > | > > > > > | > > > | > < < | | | | | | > > > > > > > > > < < < < < > > | | > > < < | | | | | | > | < > > | | > < < < < < < < < < > > > > > > > > | | | | | > > > > | | | | | | | > > > > > > > > > > > > < < < < < < < < < < < < | 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 |
pop edx ecx ebx
return
endp
body WaitForSystemEvent
.event XEvent
begin
push eax ecx edx
lea eax, [.event]
cinvoke XPeekEvent, [hApplicationDisplay], eax
pop edx ecx eax
return
endp
proc __ProcessOneSystemEvent, .linux_event
begin
pushad
mov ebx, [.linux_event]
; mov eax, [ebx+XEvent.type]
; cmp eax, [ShmCompletionEvent]
; je .shm_completion
stdcall _GetWindowStruct, [ebx+XEvent.window]
jc .notprocessed
test eax, eax
jz .notprocessed
mov esi, eax
mov ecx, [ebx+XEvent.type]
cmp ecx, LASTEvent
jae .notprocessed
mov ecx, [.jump_table+4*ecx]
jecxz .notprocessed
jmp ecx
.notprocessed:
popad
stc
return
.finish:
popad
clc
return
;.shm_completion:
; DebugMsg "Put back completion event!"
;
; int3
; cinvoke XPutBackEvent, [hApplicationDisplay], ebx
; jmp .finish
;.........................................................................
; seMove and seResize events.
;-------------------------------------------------------------------------
.moveresize:
cinvoke XCheckTypedWindowEvent, [hApplicationDisplay], [ebx+XConfigureEvent.window], ConfigureNotify, ebx
test eax, eax
jnz .moveresize
; resize event...
mov eax, [esi+TWindow._width]
mov edx, [esi+TWindow._height]
cmp eax, [ebx+XConfigureEvent.width]
jne .resize
cmp edx, [ebx+XConfigureEvent.height]
je .is_move
.resize:
exec esi, TWindow:EventResize, [ebx+XConfigureEvent.width], [ebx+XConfigureEvent.height]
; move event...
.is_move:
mov eax, [esi+TWindow._x]
mov edx, [esi+TWindow._y]
cmp eax, [ebx+XConfigureEvent.x]
jne .move
cmp eax, [ebx+XConfigureEvent.y]
je .finish
.move:
exec esi, TWindow:EventMove, [ebx+XConfigureEvent.x], [ebx+XConfigureEvent.y]
jmp .finish
;.........................................................................
; DestroyNotify handler it invalidates the handle in TWindow structure and then destroys TWindow.
.destroy:
test esi, esi
jz .finish
mov [esi+TWindow.handle], 0
destroy esi
jmp .finish
;.........................................................................
; Mouse event handlers
.mousemove:
cinvoke XCheckTypedWindowEvent, [hApplicationDisplay], [ebx+XConfigureEvent.window], MotionNotify, ebx
test eax, eax
jnz .mousemove
stdcall ServeMenuMouseMove, [ebx+XMotionEvent.window], [ebx+XMotionEvent.x], [ebx+XMotionEvent.y], [ebx+XMotionEvent.state]
jc .finish
cinvoke XCheckTypedWindowEvent, [hApplicationDisplay], [ebx+XMotionEvent.window], MotionNotify, ebx
test eax, eax
jnz .mousemove
mov edi, [__MouseTarget]
test edi, edi
jz .search_target_move
stdcall __GetRelativeXY, edi, [ebx+XMotionEvent.x], [ebx+XMotionEvent.y]
jmp .target_move
.search_target_move:
exec esi, TWindow:ChildByXY, [ebx+XMotionEvent.x], [ebx+XMotionEvent.y], TRUE
mov edi, eax
.target_move:
cmp edi, [__LastPointedWindow]
je .move_event
cmp [__LastPointedWindow], 0
je .leave_ok
exec [__LastPointedWindow], TWindow:EventMouseLeave
.leave_ok:
mov [__LastPointedWindow], edi
exec edi, TWindow:EventMouseEnter
.move_event:
exec edi, TWindow:EventMouseMove, ecx, edx, [ebx+XMotionEvent.state]
jmp .finish
;.........................................................................
.mouse_btn_press:
stdcall ServeMenuButtonPress, [ebx+XButtonEvent.window], [ebx+XButtonEvent.button], [ebx+XButtonEvent.state], [ebx+XButtonEvent.x], [ebx+XButtonEvent.y]
jc .finish
mov edi, [__MouseTarget]
test edi, edi
jz .search_target_press
stdcall __GetRelativeXY, edi, [ebx+XButtonEvent.x], [ebx+XButtonEvent.y]
jmp .target_press
.search_target_press:
exec esi, TWindow:ChildByXY, [ebx+XButtonEvent.x], [ebx+XButtonEvent.y], TRUE
mov edi, eax
.target_press:
get eax, eax, TWindow:GlobalEnabled
test eax, eax
jz .finish
cmp [ebx+XButtonEvent.button], 4
jge .wheelscroll
; deal with focus
cmp edi, [__FocusedWindow]
je .focusok
get eax, edi, TWindow:WantFocus
test eax, eax
jz .focusok
mov eax, [__FocusedWindow]
mov [__FocusedWindow], edi
test eax, eax
jz @f
exec eax, TWindow:EventFocusOut
@@:
exec edi, TWindow:EventFocusIn
.focusok:
exec edi, TWindow:EventButtonPress, [ebx+XButtonEvent.button], [ebx+XButtonEvent.state], ecx, edx
jmp .finish
.wheelscroll:
mov ecx, scWheelUp
je @f
mov ecx, scWheelDn
@@:
exec edi, TWindow:EventScroll, scrollY, ecx, 1
jmp .finish
;.........................................................................
.mouse_btn_release:
mov edi, [__MouseTarget]
test edi, edi
jz .search_target_release
stdcall __GetRelativeXY, edi, [ebx+XButtonEvent.x], [ebx+XButtonEvent.y]
jmp .target_release
.search_target_release:
exec esi, TWindow:ChildByXY, [ebx+XButtonEvent.x], [ebx+XButtonEvent.y], TRUE
mov edi, eax
.target_release:
get eax, eax, TWindow:GlobalEnabled
test eax, eax
jz .finish
exec edi, TWindow:EventButtonRelease, [ebx+XButtonEvent.button], [ebx+XButtonEvent.state], ecx, edx
jmp .finish
;.........................................................................
; Window paint event
.expose:
get edi, esi, TWindow:ImgScreen
stdcall DrawImageRect, [esi+TWindow.handle], edi, [ebx+XExposeEvent.x], [ebx+XExposeEvent.y], [ebx+XExposeEvent.x], [ebx+XExposeEvent.y], [ebx+XExposeEvent.width], [ebx+XExposeEvent.height]
jmp .finish
;.........................................................................
; Keyboard events.
locals
.utf8buff rb 16
endl
.key_press:
cmp [__FocusedWindow], 0
je .finish
mov dword [.utf8buff], 0
lea eax, [.utf8buff]
cinvoke Xutf8LookupString, [hInputContext], ebx, eax, 16, 0, 0
mov eax, [ebx+XKeyEvent.keycode]
cinvoke XKeycodeToKeysym, [hApplicationDisplay], eax, 0
exec [__FocusedWindow], TWindow:EventKeyPress, dword [.utf8buff], eax, [ebx+XKeyEvent.state]
jmp .finish
;.........................................................................
.key_release:
cmp [__FocusedWindow], 0
je .finish
mov eax, [ebx+XKeyEvent.keycode]
cinvoke XKeycodeToKeysym, [hApplicationDisplay], eax, 0
exec [__FocusedWindow], TWindow:EventKeyRelease, eax, [ebx+XKeyEvent.state]
jmp .finish
; refreshes keyboard mapping information, stored locally in XLib.
.mapping_notify:
cinvoke XRefreshKeyboardMapping, ebx
jmp .finish
;.........................................................................
; This event is sent from the window manager, when the user click on the close button of the
; window or close it some other way. So, the window have to decide whether to close or not.
.clientmessage:
mov eax, dword [ebx+XClientMessageEvent.data]
cmp eax, [atomWMDelete]
jne .finish
; The window is closed by click on close button or by pressing Alt+F4 or by other WM method
;.close_from_wm:
exec esi, TWindow:CloseRequest, cerFromUser
jmp .finish
; Focus handling events.
.focusin:
call .hide_menu
stdcall __SearchWindowToFocus, esi
mov [__FocusedWindow], eax
test eax, eax
jz .finish
exec eax, TWindow:EventFocusIn
jmp .finish
.focusout:
call .hide_menu
xor ebx, ebx
xchg [__FocusedWindow], ebx
test ebx, ebx
jz .finish
exec ebx, TWindow:EventFocusOut
jmp .finish
.hideall:
DebugMsg "Hide one menu"
set [__ActiveMenu], TWindow:Visible, FALSE
.hide_menu:
cmp [__ActiveMenu], 0
jne .hideall
retn
.jump_table dd 0 ; event 0
dd 0 ; event 1
dd .key_press ; KeyPress = 2
dd .key_release ; KeyRelease = 3
dd .mouse_btn_press ; ButtonPress = 4
dd .mouse_btn_release ; ButtonRelease = 5
dd .mousemove ; MotionNotify = 6
dd 0 ; EnterNotify = 7
dd 0 ; LeaveNotify = 8
dd .focusin ; FocusIn = 9
dd .focusout ; FocusOut = 10
dd 0 ; KeymapNotify = 11
dd .expose ; Expose = 12
dd 0 ; GraphicsExpose = 13
dd 0 ; NoExpose = 14
dd 0 ; VisibilityNotify = 15
dd 0 ; CreateNotify = 16
dd .destroy ; DestroyNotify = 17
dd 0 ; UnmapNotify = 18
dd 0 ; MapNotify = 19
dd 0 ; MapRequest = 20
dd 0 ; ReparentNotify = 21
dd .moveresize ; ConfigureNotify = 22
dd 0 ; ConfigureRequest = 23
dd 0 ; GravityNotify = 24
dd 0 ; ResizeRequest = 25
dd 0 ; CirculateNotify = 26
dd 0 ; CirculateRequest = 27
dd 0 ; PropertyNotify = 28
dd 0 ; SelectionClear = 29
dd 0 ; SelectionRequest = 30
dd 0 ; SelectionNotify = 31
dd 0 ; ColormapNotify = 32
dd .clientmessage ; ClientMessage = 33
dd .mapping_notify ; MappingNotify = 34
endp
|
| ︙ | ︙ | |||
12 13 14 15 16 17 18 | ; Notes: TApplication by the idea is the base of GUI application, but the implementation ; somehow need fixing... ;_________________________________________________________________________________________ uglobal if used hApplicationDisplay | | | | | > | > > > > > > > > > > > > > > | > > > > > | | | | | < < < < < < < < < | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < < | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
; Notes: TApplication by the idea is the base of GUI application, but the implementation
; somehow need fixing...
;_________________________________________________________________________________________
uglobal
if used hApplicationDisplay
var hApplicationDisplay = ?
var hRootWindow = ?
var hInputMethod = ?
var hInputContext = ?
var atomWMDelete = ?
var atomState = ?
var atomStateAbove = ?
var atomStateModal = ?
var atomAllowedActions = ?
var atomActionMove = ?
var atomActionResize = ?
var atomActionMinimize = ?
var atomActionShade = ?
var atomActionStick = ?
var atomActionMaximizeHorz = ?
var atomActionMaximizeVert = ?
var atomActionFullscreen = ?
var atomActionChangeDesktop = ?
var atomActionClose = ?
var atomWindowType = ?
var atomWindowTypeMenu = ?
var atomWindowTypeUtility = ?
var atomWindowTypeDialog = ?
var atomWindowTypeNormal = ?
var ShmCompletionEvent = ?
var FTLibrary = ?
var FTCManager = ?
var FTCImageCache = ?
var FTCCMapCache = ?
end if
endg
;XNVaNestedList text "XNVaNestedList"
;XNSeparatorofNestedList text "separatorofNestedList"
XNQueryInputStyle text "queryInputStyle"
;XNClientWindow text "clientWindow"
XNInputStyle text "inputStyle"
;XNFocusWindow text "focusWindow"
;XNResourceName text "resourceName"
;XNResourceClass text "resourceClass"
;XNGeometryCallback text "geometryCallback"
;XNDestroyCallback text "destroyCallback"
;XNFilterEvents text "filterEvents"
;XNPreeditStartCallback text "preeditStartCallback"
;XNPreeditDoneCallback text "preeditDoneCallback"
;XNPreeditDrawCallback text "preeditDrawCallback"
;XNPreeditCaretCallback text "preeditCaretCallback"
;XNPreeditStateNotifyCallback text "preeditStateNotifyCallback"
;XNPreeditAttributes text "preeditAttributes"
;XNStatusStartCallback text "statusStartCallback"
;XNStatusDoneCallback text "statusDoneCallback"
;XNStatusDrawCallback text "statusDrawCallback"
;XNStatusAttributes text "statusAttributes"
;XNArea text "area"
;XNAreaNeeded text "areaNeeded"
;XNSpotLocation text "spotLocation"
;XNColormap text "colorMap"
;XNStdColormap text "stdColorMap"
;XNForeground text "foreground"
;XNBackground text "background"
;XNBackgroundPixmap text "backgroundPixmap"
;XNFontSet text "fontSet"
;XNLineSpace text "lineSpace"
;XNCursor text "cursor"
;XNQueryIMValuesList text "queryIMValuesList"
;XNQueryICValuesList text "queryICValuesList"
;XNStringConversionCallback text "stringConversionCallback"
;XNStringConversion text "stringConversion"
;XNResetState text "resetState"
;XNHotKey text "hotkey"
;XNHotKeyState text "hotkeyState"
;XNPreeditState text "preeditState"
;XNVisiblePosition text "visiblePosition"
;XNR6PreeditCallbackBehavior text "r6PreeditCallback"
;XNRequiredCharSet text "requiredCharSet"
;XNQueryOrientation text "queryOrientation"
;XNDirectionalDependentDrawing text "directionalDependentDrawing"
;XNContextualDrawing text "contextualDrawing"
;XNBaseFontName text "baseFontName"
;XNMissingCharSet text "missingCharSet"
;XNDefaultString text "defaultString"
;XNOrientation text "orientation"
;XNFontInfo text "fontInfo"
;XNOMAutomatic text "omAutomatic"
method TApplication.__create
.ptr dd ?
begin
cinvoke XInitThreads
test eax, eax
jz .exit_error
cinvoke XSetErrorHandler, __FreshXErrorHandler
mov ecx, 5
|
| ︙ | ︙ | |||
155 156 157 158 159 160 161 |
cinvoke XFree, [.ptr]
stdcall InitMouseCursors
; Creating internal atoms that to be used with Window manager of the application windows...
; Maybe this code should reside somewhere else, not in application. In initialize TWindow???
| | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < < < < < | 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
cinvoke XFree, [.ptr]
stdcall InitMouseCursors
; Creating internal atoms that to be used with Window manager of the application windows...
; Maybe this code should reside somewhere else, not in application. In initialize TWindow???
cinvoke XInternAtom, [hApplicationDisplay], "WM_DELETE_WINDOW", 1
mov [atomWMDelete], eax
cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_STATE", 1
mov [atomState], eax
cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_STATE_ABOVE", 1
mov [atomStateAbove], eax
cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_STATE_MODAL", 1
mov [atomStateModal], eax
; cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_ALLOWED_ACTIONS", 1
; mov [atomAllowedActions], eax
; cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_ACTION_MOVE", 1
; mov [atomActionMove], eax
; cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_ACTION_RESIZE", 1
; mov [atomActionResize], eax
; cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_ACTION_MINIMIZE", 1
; mov [atomActionMinimize], eax
; cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_ACTION_SHADE", 1
; mov [atomActionShade], eax
; cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_ACTION_STICK", 1
; mov [atomActionStick], eax
; cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_ACTION_MAXIMIZE_HORZ", 1
; mov [atomActionMaximizeHorz], eax
; cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_ACTION_MAXIMIZE_VERT", 1
; mov [atomActionMaximizeVert], eax
; cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_ACTION_FULLSCREEN", 1
; mov [atomActionFullscreen], eax
; cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_ACTION_CHANGE_DESKTOP", 1
; mov [atomActionChangeDesktop], eax
; cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_ACTION_CLOSE", 1
; mov [atomActionClose], eax
cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_WINDOW_TYPE", 1
mov [atomWindowType], eax
cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_WINDOW_TYPE_POPUP_MENU", 1
mov [atomWindowTypeMenu], eax
cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_WINDOW_TYPE_UTILITY", 1
mov [atomWindowTypeUtility], eax
cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_WINDOW_TYPE_DIALOG", 1
mov [atomWindowTypeDialog], eax
cinvoke XInternAtom, [hApplicationDisplay], "_NET_WM_WINDOW_TYPE_NORMAL", 1
mov [atomWindowTypeNormal], eax
cinvoke FT_Init_FreeType, FTLibrary
test eax, eax
jnz .error_ft
cinvoke FTC_Manager_New, [FTLibrary], 0, 0, 0, FTCRequester, 0, FTCManager
cinvoke FTC_ImageCache_New, [FTCManager], FTCImageCache
cinvoke FTC_CMapCache_New, [FTCManager], FTCCMapCache
; clipboard initialization.
if __UseClipboard = 1
stdcall __InitLinuxClipboard
end if
clc
return
.error_ft:
DebugMsg 'Error initializing FreeType library.'
jmp .exit_error
.error_disp:
DebugMsg 'Error open display.'
.exit_error:
stc
return
endp
cXErrorMsg text 'X server error:'
cXErrorMsg2 text 10, 0
|
| ︙ | ︙ |
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ iglobal if used _Xcursors | | | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
; Dependencies:
;
; Notes:
;_________________________________________________________________________________________
iglobal
if used _Xcursors
_Xcursors db 68, 152, 34, 108, 116, 40, 40, 150, 58, 52, 86 ; X standard cursor font
end if
endg
uglobal
if used StockCursors
StockCursors rd mcCount
|
| ︙ | ︙ | |||
58 59 60 61 62 63 64 |
.exit:
return
endp
end if
| | | > > | > > | > | 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
.exit:
return
endp
end if
proc SetMouseCursor, .hWindow, .hCursor
begin
push eax ecx edx
cinvoke XDefineCursor, [hApplicationDisplay], [.hWindow], [.hCursor]
pop edx ecx eax
return
endp
proc GetStockCursor, .index
begin
mov eax, [.index]
cmp eax, mcCount
jb @f
xor eax, eax
@@:
mov eax, [StockCursors+4*eax]
return
endp
proc __MouseCapture, .hwnd
begin
push eax ecx edx
cmp [.hwnd], 0
je .release
cinvoke XGrabPointer, [hApplicationDisplay], [.hwnd], FALSE, PointerMotionMask or ButtonPressMask or ButtonReleaseMask, \
GrabModeAsync, GrabModeAsync, None, None, CurrentTime
.finish:
pop edx ecx eax
return
.release:
cinvoke XUngrabPointer, [hApplicationDisplay], CurrentTime
jmp .finish
endp
|
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ | > | > > > > | > < > > > > > > > > > | | | | | | | | | > | > > | > | > | | > | > > > | > > > > > > > | | > > > > | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
;
; Dependencies:
;
; Notes:
;_________________________________________________________________________________________
body _CreateWindow
.attr XSetWindowAttributes
.vis XVisualInfo
.prop dd ?
begin
pushad
mov esi, [.pWindow]
cinvoke XDefaultScreen, [hApplicationDisplay]
mov edx, eax
lea eax, [.vis]
cinvoke XMatchVisualInfo, [hApplicationDisplay], edx, $20, TrueColor, eax
cinvoke XCreateColormap, [hApplicationDisplay], [hRootWindow], [.vis.Visual], AllocNone
mov [.attr.colormap], eax
; border
xor eax, eax
mov ecx, [esi+TWindow._border]
test ecx, ecx ; borderNone = 0
jnz @f
inc eax
@@:
mov [.attr.override_redirect], eax
and ecx, $3
mov eax, [.types+4*ecx]
mov [.prop], eax
xor eax, eax
mov [.attr.backing_store], eax ; NotUseful
mov [.attr.background_pixmap], eax ; None
mov [.attr.border_pixel], eax ; 0
mov [.attr.event_mask], ExposureMask or FocusChangeMask or \
KeyPressMask or KeyReleaseMask or \
ButtonPressMask or ButtonReleaseMask or \
EnterWindowMask or LeaveWindowMask or \
PointerMotionMask or StructureNotifyMask
lea eax, [.attr]
cinvoke XCreateWindow, [hApplicationDisplay], [hRootWindow], \
[esi+TWindow._x], [esi+TWindow._y], [esi+TWindow._width], [esi+TWindow._height], \
0, $20, InputOutput, [.vis.Visual], \
CWBackingStore or CWOverrideRedirect or \
CWBorderPixel or CWColormap or \
CWEventMask or CWBackPixmap, eax
mov edi, eax
test eax, eax
jz .exit ; Error processing???
cinvoke XChangeProperty, [hApplicationDisplay], edi, [atomWindowType], XA_ATOM, 32, PropModeReplace, [.prop], 1
cinvoke XSetWMProtocols, [hApplicationDisplay], edi, atomWMDelete, 1
cinvoke XSaveContext, [hApplicationDisplay], edi, win_structure_context, esi
; the caption
mov eax, [esi+TWindow._caption]
test eax, eax
jz .exit
stdcall StrPtr, eax
cinvoke XStoreName, [hApplicationDisplay], edi, eax
.exit:
mov [esp+4*regEAX], edi
popad
return
.types dd atomWindowTypeMenu, atomWindowTypeNormal, atomWindowTypeDialog, atomWindowTypeUtility
endp
;_________________________________________________________________________________________
body _DestroyWindow
begin
push eax ecx edx
cinvoke XSaveContext, [hApplicationDisplay], [.hwnd], win_structure_context, 0
cinvoke XDestroyWindow, [hApplicationDisplay], [.hwnd]
pop edx ecx eax
return
endp
|
| ︙ | ︙ | |||
105 106 107 108 109 110 111 | endp ;_________________________________________________________________________________________ | < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | | | < | | < | < | < > > > > > < | | > > | > > | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < > | > | | | | | | | | | | | | 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 |
endp
;_________________________________________________________________________________________
body _ClientToScreen
.attr XWindowAttributes
begin
push eax
lea ecx, [.attr]
cinvoke XGetWindowAttributes, [hApplicationDisplay], [.hwnd], ecx
mov ecx, [.attr.x]
mov edx, [.attr.y]
add [.x], ecx
add [.y], edx
stdcall _GetParent, [.hwnd]
test eax, eax
jz .finish
lea ecx, [.attr]
cinvoke XGetWindowAttributes, [hApplicationDisplay], eax, ecx
mov ecx, [.attr.x]
mov edx, [.attr.y]
add [.x], ecx
add [.y], edx
.finish:
mov ecx, [.x]
mov edx, [.y]
pop eax
return
endp
;_________________________________________________________________________________________
body _ShowWindow
begin
push eax ecx edx
mov ecx, XUnmapWindow
cmp [.flag], 0
je @f
mov ecx, XMapWindow
@@:
push [.hwnd] [hApplicationDisplay]
call dword [ecx]
add esp, 8
pop edx ecx eax
return
endp
;_________________________________________________________________________________________
body _RefreshWindowRect
begin
push eax ecx edx
cinvoke XClearArea, [hApplicationDisplay], [.hwnd], [.x], [.y], [.width], [.height], TRUE
cinvoke XFlush, [hApplicationDisplay]
pop edx ecx eax
return
endp
;body _RefreshWindowRect
;begin
; push eax ecx edx
;
; stdcall _GetWindowStruct, [.hwnd]
; get eax, eax, TWindow:ImgScreen
;
; stdcall DrawImageRect, [.hwnd], eax, [.x], [.y], [.x], [.y], [.width], [.height]
; pop edx ecx eax
; return
;endp
;_________________________________________________________________________________________
body _SetWindowTextUtf8
begin
push eax ecx edx
cinvoke XStoreName, [hApplicationDisplay], [.hwnd], [.ptrUtf8]
pop edx ecx eax
return
endp
;_________________________________________________________________________________________
body _SetModalTowards
begin
push eax ecx edx
cinvoke XSetTransientForHint, [hApplicationDisplay], [.hwnd], [.hwndParent]
; The following is not working for every window manager!!! It is not a problem of the below code. (probably... :)
cinvoke XChangeProperty, [hApplicationDisplay], [.hwnd], [atomState], XA_ATOM, 32, PropModeAppend, atomStateAbove, 1
cinvoke XChangeProperty, [hApplicationDisplay], [.hwnd], [atomState], XA_ATOM, 32, PropModeAppend, atomStateModal, 1
pop edx ecx eax
return
endp
;_________________________________________________________________________________________
body _FinalizeModal
.flushevent XEvent
begin
push eax ecx edx
; dirty hack, but the button receives LeaveNotify after DestroyNotify
cinvoke XSync, [hApplicationDisplay], FALSE
.loop_flush:
lea eax, [.flushevent]
cinvoke XCheckMaskEvent, [hApplicationDisplay], LeaveWindowMask, eax
test eax, eax
jnz .loop_flush
pop edx ecx eax
return
endp
;_________________________________________________________________________________________
win_structure_context = 1
body _GetWindowStruct
.user_data dd ?
begin
push ecx edx
lea eax, [.user_data]
cinvoke XFindContext, [hApplicationDisplay], [.hwin], win_structure_context, eax
; test eax, eax
; jnz .error
mov eax, [.user_data]
clc
pop edx ecx
return
;.error:
; DebugMsg 'FreshLib: Error find context.'
; mov edx, [ebp+4]
; OutputRegister regEDX, 16
;
; stc
; pop edx ecx
; return
endp
;_________________________________________________________________________________________
body _SetWindowStruct
begin
push eax ecx edx
cinvoke XSaveContext, [hApplicationDisplay], [.hwin], win_structure_context, [.value]
pop edx ecx eax
return
endp
|
| ︙ | ︙ | |||
11 12 13 14 15 16 17 | ; ; Notes: Organize the main message/event loop needed by every GUI engine. ; This file contains only OS independent part and includes OS dependent files. ;_________________________________________________________________________________________ module "Main library" uglobal | | | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
;
; Notes: Organize the main message/event loop needed by every GUI engine.
; This file contains only OS independent part and includes OS dependent files.
;_________________________________________________________________________________________
module "Main library"
uglobal
var pApplication = ?
var __LastPointedWindow = ?
var __FocusedWindow = ?
var __MouseTarget = ?
var __ActiveMenu = ?
endg
;_________________________________________________________________________________________
;
; Process all the events queued from the system and exits.
; Arguments: none
; Returns: CF = 1 if the termination event has been received.
;_________________________________________________________________________________________
interface ProcessSystemEvents
;_________________________________________________________________________________________
;
; Waits for system events to arive.
; During the wait, the application
; does not use CPU resources.
;_________________________________________________________________________________________
interface WaitForSystemEvent
proc Run
begin
.mainloop:
stdcall ProcessSystemEvents
jc .terminate
|
| ︙ | ︙ | |||
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
stdcall ecx, eax
.eventok:
stdcall WaitForSystemEvent
jmp .mainloop
.terminate:
return
endp
proc ShowModal, .pForm, .pParent
.prev dd ?
begin
push ecx edx
mov ecx, [.pParent]
mov edx, [.pForm]
jecxz @f
stdcall _SetModalTowards, [edx+TForm.handle], [ecx+TWindow.handle]
@@:
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < | | 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
stdcall ecx, eax
.eventok:
stdcall WaitForSystemEvent
jmp .mainloop
.terminate:
DebugMsg "Terminate GUI application!"
return
endp
proc ServeMenuMouseMove, .window, .x, .y, .kbdState
begin
cmp [__ActiveMenu], 0
jne .serve_menu
clc
return
.serve_menu:
pushad
stdcall _ClientToScreen, [.window], [.x], [.y]
exec [__ActiveMenu], TWindow:EventMouseMove, ecx, edx, [.kbdState]
popad
stc
return
endp
proc ServeMenuButtonPress, .window, .button, .kbdState, .x, .y
begin
cmp [__ActiveMenu], 0
jne .serve_menu
clc
return
.serve_menu:
pushad
stdcall _ClientToScreen, [.window], [.x], [.y]
exec [__ActiveMenu], TWindow:EventButtonPress, [.button], [.kbdState], ecx, edx
popad
stc
return
endp
proc ShowModal, .pForm, .pParent
.prev dd ?
begin
push ecx edx
mov ecx, [.pParent]
mov edx, [.pForm]
set edx, TForm:Visible, TRUE
jecxz @f
stdcall _SetModalTowards, [edx+TForm.handle], [ecx+TWindow.handle]
@@:
jecxz @f
set ecx, TWindow:Enabled, FALSE
@@:
set edx, TForm:ModalResult, 0
get eax, edx, TForm:OnClose
mov [.prev], eax
|
| ︙ | ︙ | |||
84 85 86 87 88 89 90 |
.vis_ok:
stdcall WaitForSystemEvent
jmp .modal_loop
.exit_modal:
jecxz @f
| | < | < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
.vis_ok:
stdcall WaitForSystemEvent
jmp .modal_loop
.exit_modal:
jecxz @f
set ecx, TWindow:Enabled, TRUE
@@:
set edx, TForm:OnClose, [.prev]
jecxz @f
stdcall _FinalizeModal, [edx+TForm.handle], [ecx+TWindow.handle]
@@:
set edx, TForm:Visible, FALSE
get eax, edx, TForm:ModalResult
pop edx ecx
return
endp
; prevent destroy of the form from the close button or Alt+F4
proc __ModalOnClose, .self, .reason
begin
set [.self], TForm:ModalResult, mrCancel
stc
return
endp
proc __GetRelativeXY, .window, .x, .y
begin
push eax esi
mov ecx, [.x]
mov edx, [.y]
mov esi, [.window]
.loop:
get eax, esi, TWindow:Parent
test eax, eax
jz .finish
sub ecx, [esi+TWindow._x]
sub edx, [esi+TWindow._y]
mov esi, eax
jmp .loop
.finish:
pop esi eax
return
endp
proc __SearchWindowToFocus, .pWindow
begin
pushad
mov esi, [.pWindow]
get eax, esi, TWindow:Enabled
test eax, eax
jz .no
get eax, esi, TWindow:Visible
test eax, eax
jz .no
get eax, esi, TWindow:WantFocus
test eax, eax
jz .children
mov [esp+4*regEAX], esi
popad
return
.children:
get edi, esi, TWindow:Children
test edi, edi
jnz .loopit
.no:
xor eax, eax
mov [esp+4*regEAX], eax
popad
return
.loopit:
mov ecx, [edi+TArray.count]
jecxz .no
.children_loop:
dec ecx
js .no
mov esi, [edi+TArray.array+4*ecx]
istype esi, TWindow
jne .children_loop
stdcall __SearchWindowToFocus, esi
test eax, eax
jz .children_loop
mov [esp+4*regEAX], eax
popad
return
endp
include '%TargetOS%/Main.asm'
endmodule
|
| ︙ | ︙ | |||
24 25 26 27 28 29 30 | .vtable dd ? ; pointer to the virtual methods table. .paramsize dd ? .ptrVar dd ? .params: ends | | > | > > > | | > > > > > > > > > > | | | > > > > > > | | > > > | 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
.vtable dd ? ; pointer to the virtual methods table.
.paramsize dd ?
.ptrVar dd ?
.params:
ends
macro ObjTemplate flags, class, name, [idparam] {
common
local ..paramsize, ..prms, ..here
if ~defined used.#class | defined ..here
used.#class = 1
..here = 1
end if
dd flags
dd sizeof.#class
dd vtables.#class
dd ..paramsize
dd name
..prms:
forward
local ..value, ..ofs, ..valid
..valid equ FALSE
match id == param, idparam \{
..ofs dd class\#.\#id\#.#set
dd ..value
..valid EQU TRUE
\}
match =FALSE, ..valid \{
error Invalid parameter definition in template.
\}
common
dd -1
forward
match id == param, idparam \{
if param eqtype 2
..value = param
else
if param eqtype [2]
match =[par=], param \\{
..value = par
\\}
store byte $fe at ..ofs+3
else
..value db param, 0
end if
end if
\}
common
local ..here
if ~defined name | defined ..here
name dd ?
..here = 1
end if
|
| ︙ | ︙ | |||
86 87 88 89 90 91 92 |
.createloop:
stdcall GetMem, [esi+TObjTemplate.size]
mov ebx, eax
mov edi, [esi+TObjTemplate.vtable]
mov [ebx], edi
| | < < < < < < < < < < < < < < < > > > > > > > > > > | > < | < | < < < < < < > | | 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
.createloop:
stdcall GetMem, [esi+TObjTemplate.size]
mov ebx, eax
mov edi, [esi+TObjTemplate.vtable]
mov [ebx], edi
exec ebx, TWindow:Create, [.parent]
lea ecx, [esi+TObjTemplate.params]
.paramloop:
cmp dword [ecx], -1
je .paramsok
mov eax, [ecx]
bswap eax
mov edx, [ecx+4] ; value
cmp al, $fe ; Is it indirect?
jne @f
mov edx, [edx] ; the value is an address of a variable.
@@:
bswap eax
test eax, $00ff0000
movzx eax, ax ; not changing flags!
jnz .method
mov [ebx+eax], edx
jmp .param_set
.method:
stdcall dword [edi+4*eax+8], ebx, edx
.param_set:
add ecx, 8
jmp .paramloop
.paramsok:
mov eax, [esi+TObjTemplate.ptrVar]
test eax, eax
jz .var_ok
mov [eax], ebx ; returned pointer/handle to the object.
set ebx, TObject:ptrVar, eax
.var_ok:
get eax, ebx, TObject:OnCreate
test eax, eax
jz .gonext
; execute user OnCreate event.
pushad
stdcall eax, ebx
popad
.gonext:
mov edx, [esi+TObjTemplate.flags]
mov eax, sizeof.TObjTemplate
add eax, [esi+TObjTemplate.paramsize]
|
| ︙ | ︙ |
| ︙ | ︙ | |||
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
struct TSplitTemplate
.type dw ?
.width dw ?
.pos dd ?
.min dd ?
.max dd ?
ends
struct TCellTemplate
.type dw ?
.id dw ?
ends
macro SplitStart name {
local ..expected, ..id
..expected = 1
| > | > | 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
struct TSplitTemplate
.type dw ?
.width dw ?
.pos dd ?
.min dd ?
.max dd ?
ends
struct TCellTemplate
.type dw ?
.id dw ?
ends
macro SplitStart name {
local ..expected, ..id
..expected = 1
..id = 0
cell@expected equ ..expected
cell@id equ ..id
cell@name equ name
label name byte
macro Split type, width, pos, min, max \{
dw type, width
dd pos, min, max
cell@id = cell@id + 1
cell@expected = cell@expected + 1
\}
macro Cell name \{
.\#name = cell@id
dw stNone, cell@id
cell@id = cell@id + 1
|
| ︙ | ︙ | |||
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
end repeat
if ..expected <> 0
disp 1, 'WARNING! "', `., '" split template is not consistent! Automatically added ', <..expected, 10>, " empty cells. FIXIT!", 13
end if
}
proc RealignGrid, .ptrSplitter, .ptrRect
.rect RECT
begin
pushad
mov edi, [.ptrSplitter]
mov esi, [.ptrRect]
call _DoRealign
popad
return
endp
; edi is pointer to the current TSplitRect
; esi is pointer to the rect that have to be assigned to the current TSplitRect
| > > > > > > > > > > > > | 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
end repeat
if ..expected <> 0
disp 1, 'WARNING! "', `., '" split template is not consistent! Automatically added ', <..expected, 10>, " empty cells. FIXIT!", 13
end if
}
uglobal
RealignCnt dd ?
endg
proc RealignGrid, .ptrSplitter, .ptrRect
.rect RECT
begin
pushad
stdcall GetTimestamp
mov [RealignCnt], eax
mov edi, [.ptrSplitter]
mov esi, [.ptrRect]
call _DoRealign
stdcall GetTimestamp
sub eax, [RealignCnt]
OutputValue "Realign time:", eax, 10, 4
popad
return
endp
; edi is pointer to the current TSplitRect
; esi is pointer to the rect that have to be assigned to the current TSplitRect
|
| ︙ | ︙ | |||
188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
mov ebx, [esi+ecx+TSplitRect.rect.right]
sub ebx, [esi+ecx+TSplitRect.rect.left] ; size of rect (x or y depending on type)
mov edx, [esi+TSplitRect.spWidth]
sub ebx, edx
mov eax, [esi+TSplitRect.pos]
mov ecx, [esi+TSplitRect.type]
and ecx, $ff
test [esi+TSplitRect.type], stRelative
jz .posready
| > > > > > > > > > | 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 |
mov ebx, [esi+ecx+TSplitRect.rect.right]
sub ebx, [esi+ecx+TSplitRect.rect.left] ; size of rect (x or y depending on type)
mov edx, [esi+TSplitRect.spWidth]
sub ebx, edx
mov eax, [esi+TSplitRect.pos]
cmp eax, [esi+TSplitRect.min]
cmovl eax, [esi+TSplitRect.min]
cmp eax, [esi+TSplitRect.max]
cmovg eax, [esi+TSplitRect.max]
mov [esi+TSplitRect.pos],eax
mov ecx, [esi+TSplitRect.type]
and ecx, $ff
test [esi+TSplitRect.type], stRelative
jz .posready
|
| ︙ | ︙ | |||
229 230 231 232 233 234 235 |
lea esi, [.rect2]
call _DoRealign
pop esi
.endsplit:
| | > | > > > > > > > > > > > > | | | | | | | | | | | | | | 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 |
lea esi, [.rect2]
call _DoRealign
pop esi
.endsplit:
mov ebx, [esi+TSplitRect.pWindow]
test ebx, ebx
jz .endresize
mov eax, [esi+TSplitRect.rect.right]
mov ecx, [esi+TSplitRect.rect.bottom]
sub eax, [esi+TSplitRect.rect.left]
sub ecx, [esi+TSplitRect.rect.top]
mov [ebx+TWindow._width], eax
mov [ebx+TWindow._height], ecx
mov eax, [esi+TSplitRect.rect.left]
mov ecx, [esi+TSplitRect.rect.top]
mov [ebx+TWindow._x], eax
mov [ebx+TWindow._y], ecx
; mov ebx, [esi+TSplitRect.rect.left]
; mov edx, [esi+TSplitRect.rect.top]
; sub eax, ebx
; sub ecx, edx
;
; set [esi+TSplitRect.pWindow], TWindow:width, eax
; set [esi+TSplitRect.pWindow], TWindow:height, ecx
; set [esi+TSplitRect.pWindow], TWindow:x, ebx
; set [esi+TSplitRect.pWindow], TWindow:y, edx
; exec [esi+TSplitRect.pWindow], TWindow:UpdateBounds
exec [esi+TSplitRect.pWindow], TWindow:Refresh
.endresize:
return
endp
proc DrawSplitters, .pImage, .ptrSplitters
begin
pushad
mov esi, [.ptrSplitters]
mov edi, [.pImage]
call _DoDrawSplitters
popad
return
endp
;esi - pointer to TSplitRect
; edi - TImage
proc _DoDrawSplitters
begin
mov ebx, esi
add esi, sizeof.TSplitRect
test [ebx+TSplitRect.type], stNone
|
| ︙ | ︙ | |||
431 432 433 434 435 436 437 438 |
popad
return
endp
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 467 468 469 470 471 472 473 474 475 |
popad
return
endp
endmodule
|
| ︙ | ︙ | |||
12 13 14 15 16 17 18 | ; Notes: "Action" is set of executable code, combined with user interface attributes - ; caption, accelerator keys, enable/disable status flag etc. ; Different UI elements, such as buttons, menu items etc. can be attached to ; the action object and to use its attributes. When the programmer changes ; something in the action, all UI elements are updated automatically. ;_________________________________________________________________________________________ | < | < < < < < < < | | | < < | < < < < | < < < | | | | < > > > > > > | > | > > | > | > > | > > > > > > > | > > | > > | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > | > > > | > | > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > > | > > | > > > > | > > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 |
; Notes: "Action" is set of executable code, combined with user interface attributes -
; caption, accelerator keys, enable/disable status flag etc.
; Different UI elements, such as buttons, menu items etc. can be attached to
; the action object and to use its attributes. When the programmer changes
; something in the action, all UI elements are updated automatically.
;_________________________________________________________________________________________
module "TAction"
Ctrl = maskCtrl
Alt = maskAlt
Shift = maskShift
fkScancode = $80000000
struct TFastKey
.flags dd ?
.key dd ?
ends
object TAction, TObject
._caption dd ?
._hint_text dd ?
._icon_index dd ?
._enabled dd ?
._checked dd ?
._accel TFastKey
._on_execute dd ?
._on_idle dd ?
._ctrl_list dd ?
._icon_cache_gray dd ?
._icon_cache dd ?
param .Caption, ._caption, .SetCaption
param .HintText, ._hint_text, .SetHintText
param .IconIndex, ._icon_index, .SetIconIndex
param .Enabled, ._enabled, .SetEnabled
param .Checked, ._checked, .SetChecked
param .AccelStr, .GetAccelStr, NONE
param .Icon, .GetIcon, NONE
param .OnExecute, ._on_execute, ._on_execute
param .OnIdle, ._on_idle, ._on_idle
method .GetIcon
method .GetAccelStr
method .SetParent, .value
method .SetCaption, .value
method .SetHintText, .value
method .SetIconIndex, .value
method .SetEnabled, .value
method .SetChecked, .value
method .UpdateControls
method .SetAccelerator, .flags, .key
method .Execute, .fromCtrl
method .Attach, .ctrl
method .Detach, .ctrl
method .Create, .parent
method .Destroy
method .__clear_cache
endobj
interface TAction.OnExecute, .Action, .Ctrl
method TAction.Create
begin
inherited [.parent]
mov eax, [.self]
mov [eax+TAction._enabled], 1
return
endp
method TAction.Destroy
begin
pushad
mov esi, [.self]
exec esi, TAction:__clear_cache
mov edi, [esi+TAction._ctrl_list]
test edi, edi
je .finish
mov ecx, [edi+TArray.count]
.loop:
dec ecx
js .end_loop
set [edi+TArray.array+4*ecx], TWindow:Action, 0
jmp .loop
.end_loop:
stdcall FreeMem, edi
.finish:
popad
inherited
return
endp
method TAction.SetParent
begin
inherited [.value]
exec [.self], TAction:UpdateControls
return
endp
method TAction.Execute
begin
pushad
mov esi, [.self]
cmp [esi+TAction._enabled], 0
je .finish
mov edi, [esi+TAction._on_execute]
test edi, edi
jz .finish
stdcall edi, esi, [.fromCtrl]
.finish:
popad
return
endp
method TAction.Attach
begin
pushad
mov esi, [.self]
mov edx, [esi+TAction._ctrl_list]
test edx, edx
jnz @f
stdcall CreateArray, 4
mov edx, eax
@@:
stdcall AddArrayItems, edx, 1
mov ecx, [.ctrl]
mov [eax], ecx
mov [esi+TAction._ctrl_list], edx
popad
return
endp
method TAction.Detach
begin
pushad
mov esi, [.self]
mov edx, [esi+TAction._ctrl_list]
test edx, edx
jz .finish
stdcall ListIndexOf, edx, [.ctrl]
jc .finish ; not found
stdcall DeleteArrayItems, edx, eax, 1
cmp [edx+TArray.count], 0
jne @f
stdcall FreeMem, edx
xor edx, edx
@@:
mov [esi+TAction._ctrl_list], edx
.finish:
popad
return
endp
method TAction.GetIcon
.list dd ?
begin
pushad
mov esi, [.self]
mov edi, [esi+TAction._enabled]
and edi, 1
mov eax, [esi+TAction._icon_cache_gray+4*edi]
test eax, eax
jnz .finish
mov edx, [esi+TAction._icon_index]
test edx, edx
js .finish ; return 0
get [.list], esi, TAction:Parent
get ecx, [.list], TActionList:IconSize
stdcall CreateImage, ecx, ecx
mov [esi+TAction._icon_cache_gray+4*edi], eax
imul edx, ecx ; x coordinate.
get ebx, [.list], TActionList:ImgIcons
test ebx, ebx
jz .finish
stdcall CopyImageRect, eax, 0, 0, ebx, edx, 0, ecx, ecx
test edi, edi
jnz .finish
stdcall FilterDisabled, eax, FALSE
.finish:
mov [esp+regEAX*4], eax
popad
return
endp
method TAction.GetAccelStr
begin
mov eax, [.self]
lea eax, [eax+TAction._accel]
stdcall AcceleratorToStr, eax
return
endp
method TAction.__clear_cache
begin
push eax edx
mov edx, [.self]
xor eax, eax
xchg eax, [edx+TAction._icon_cache]
test eax, eax
jz .cache_ok1
stdcall DestroyImage, eax
.cache_ok1:
xor eax, eax
xchg eax, [edx+TAction._icon_cache_gray]
test eax, eax
jz .cache_ok2
stdcall DestroyImage, eax
.cache_ok2:
pop edx eax
return
endp
method TAction.UpdateControls
begin
push eax ecx edx
mov edx, [.self]
exec edx, TAction:__clear_cache
mov edx, [edx+TAction._ctrl_list]
test edx, edx
jz .finish
mov ecx, [edx+TArray.count]
.loop:
dec ecx
js .finish
exec [edx+TArray.array+4*ecx], TWindow:UpdateAction, [.self]
jmp .loop
.finish:
pop edx ecx eax
return
endp
method TAction.SetCaption ;, .value
begin
pushad
mov esi, [.self]
mov eax, [.value]
cmp eax, [esi+TAction._caption]
je .finish
mov [esi+TAction._caption], eax
exec esi, TAction:UpdateControls
.finish:
popad
return
endp
method TAction.SetHintText ;, .value
begin
pushad
mov esi, [.self]
mov eax, [.value]
cmp eax, [esi+TAction._hint_text]
je .finish
mov [esi+TAction._hint_text], eax
exec esi, TAction:UpdateControls
.finish:
popad
return
endp
method TAction.SetIconIndex ;, .value
begin
pushad
mov esi, [.self]
mov eax, [.value]
cmp eax, [esi+TAction._icon_index]
je .finish
mov [esi+TAction._icon_index], eax
exec esi, TAction:UpdateControls
.finish:
popad
return
endp
method TAction.SetEnabled ;, .value
begin
pushad
mov esi, [.self]
mov eax, [.value]
cmp eax, [esi+TAction._enabled]
je .finish
mov [esi+TAction._enabled], eax
exec esi, TAction:UpdateControls
.finish:
popad
return
endp
method TAction.SetChecked ;, .value
begin
pushad
mov esi, [.self]
mov eax, [.value]
cmp eax, [esi+TAction._checked]
je .finish
mov [esi+TAction._checked], eax
exec esi, TAction:UpdateControls
.finish:
popad
return
endp
method TAction.SetAccelerator
begin
pushad
mov esi, [.self]
mov eax, [.flags]
mov ecx, [.key]
test eax, fkScancode
jz @f
or ecx, fkScancode
@@:
and eax, not fkScancode
mov [esi+TAction._accel.flags], eax
mov [esi+TAction._accel.key], ecx
exec esi, TAction:UpdateControls
popad
return
endp
endmodule
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
; _______________________________________________________________________________________
;| |
;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." |
;|_______________________________________________________________________________________|
;
; Description: Actions management library.
;
; Target OS: Any
;
; Dependencies:
;
; Notes: TActionList is set of TAction that provides some common functionality
; for example the common icons. It is implemented as a parent object for
; several TAction objects.
;_________________________________________________________________________________________
module "TActionList"
object TActionList, TObject
._img_icons dd ?
._icon_size dd ?
param .ImgIcons, ._img_icons, .SetIcons
param .IconSize, ._icon_size, .SetIconSize
method .Create, .parent
method .SetIcons, .value
method .SetIconSize, .value
method .UpdateActions
endobj
method TActionList.Create
begin
inherited [.parent]
set [.self], TActionList:IconSize, 16
return
endp
method TActionList.SetIconSize
begin
push eax ecx
mov ecx, [.self]
mov eax, [.value]
xchg eax, [ecx+TActionList._icon_size]
cmp eax, [ecx+TActionList._icon_size]
je .finish
exec ecx, TActionList:UpdateActions
.finish:
pop ecx eax
return
endp
method TActionList.UpdateActions
begin
pushad
get edx, [.self], TActionList:Children
test edx, edx
jz .finish
mov ecx, [edx+TArray.count]
.loop:
dec ecx
js .finish
exec [edx+TArray.array+4*ecx], TAction:UpdateControls
jmp .loop
.finish:
popad
return
endp
method TActionList.SetIcons
begin
pushad
; the .value parameter points to a PNG image in the memory.
mov esi, [.self]
get ecx, esi, TActionList:ImgIcons
jecxz .old_ok
stdcall DestroyImage, ecx
.old_ok:
mov eax, [.value]
test eax, eax
jz .new_ok
stdcall CreateImagePNG, eax, [eax-4]
.new_ok:
mov [esi+TActionList._img_icons], eax
exec [.self], TActionList:UpdateActions
popad
return
endp
endmodule
|
| ︙ | ︙ | |||
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | ; The root object in the application. ; every other object will be child on the TApplication.MainWindow. ; only one instance of TApplication should be created. ; object TApplication, TObject .FMainWindow dd ? .FAccelerators dd ? .FOnIdle dd ? param .MainWindow, .FMainWindow, .FMainWindow param .Accelerators, .FAccelerators, .FAccelerators param .OnIdle, .FOnIdle, .FOnIdle method .Create endobj include '%TargetOS%/TApplication.asm' endmodule | > > > > > > > > > > > > > > > > > > > > > > > > > > | 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
; The root object in the application.
; every other object will be child on the TApplication.MainWindow.
; only one instance of TApplication should be created.
;
object TApplication, TObject
.FMainWindow dd ?
.FAccelerators dd ?
.FOnIdle dd ?
param .MainWindow, .FMainWindow, .FMainWindow
param .Accelerators, .FAccelerators, .FAccelerators
param .OnIdle, .FOnIdle, .FOnIdle
method .__create ; OS dependent create handler.
method .Create
method .ProcessIdle ; calls all TAction idle handlers if any.
endobj
method TApplication.Create
begin
inherited 0 ; no parent for the application!
exec [.self], TApplication:__create
return
endp
method TApplication.ProcessIdle
begin
return
endp
include '%TargetOS%/TApplication.asm'
endmodule
|
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | ; Dependencies: ; ; Notes: Represents GUI button. ;_________________________________________________________________________________________ module "TButton library" | | > | > | | | > > > > > > > > > | > > < > > | | | > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 |
; Dependencies:
;
; Notes: Represents GUI button.
;_________________________________________________________________________________________
module "TButton library"
; Button states for the field TButton._state
bsNeutral = 0
bsHovered = 1
bsPressed = 2
bsDisabled = 3
; icon positions
iposLeft = 0
iposRight = 1
iposTop = 2
iposBottom = 3
iposCenter = 4
object TButton, TWindow
; private fields
._state dd ? ; internal state variable.
._textalign dd ?
._icon dd ?
._iconpos dd ?
._OnClick dd ?
._ModalResult dd ?
; parameters
param .OnClick, ._OnClick, ._OnClick
param .TextAlign, ._textalign, .SetTextAlign
param .Icon, ._icon, .SetIcon
param .IconPosition, ._iconpos, .SetIconPos
param .ModalResult, ._ModalResult, ._ModalResult
; methods
; parameters handling methods
method .SetTextAlign, .value
method .SetIcon, .value
method .SetIconPos, .value
; system events methods
method .Create, .Parent
method .Paint
method .EventMouseEnter
method .EventMouseLeave
method .EventButtonPress, .button, .kbdState, .x, .y
method .EventButtonRelease, .button, .kbdState, .x, .y
method .EventKeyPress, .utf8, .scancode, .kbdState
method .EventKeyRelease, .scancode, .kbdState
endobj
interface TButton.OnClick, .self, .button
; new
method TButton.Create
begin
inherited [.Parent]
mov eax, [.self]
mov [eax+TButton._cursor], mcHand
mov [eax+TButton.__want_focus], TRUE
return
endp
method TButton.Paint
.bounds TBounds
.clTxt dd ?
.canvas dd ?
.caption dd ?
.enabled dd ?
.icon dd ?
begin
pushad
mov esi, [.self]
get edx, esi, TButton:Action
test edx, edx
jz .get_normal
get [.caption], edx, TAction:Caption
get [.icon], edx, TAction:Icon
jmp .get_enabled
.get_normal:
get [.caption], esi, TButton:Caption
get [.icon], esi, TButton:Icon
.get_enabled:
get [.enabled], esi, TButton:Enabled ; it will return the TAction:Enabled if attached.
.paint_it:
get eax, esi, TWindow:Canvas
mov [.canvas], eax
mov eax, [esi+TButton._state]
cmp [.enabled], 0
jne .state_ok
mov eax, bsDisabled
.state_ok:
mov edi, [GUI.clBtnBk+4*eax] ; background color
mov ecx, [GUI.clBtnTxt+4*eax] ; text color
mov edx, [GUI.btnBorder+4*eax]
cmp [.enabled], 0
jne .border_ok
or edx, bxDisabled
.border_ok:
mov [.clTxt], ecx
mov ecx, [esi+TButton._width]
mov eax, [esi+TButton._height]
mov [.bounds.x], 0
mov [.bounds.y], 0
mov [.bounds.width], ecx
mov [.bounds.height], eax
lea eax, [.bounds]
stdcall [DrawBox], [.canvas], eax, edi, edx, [GUI.boxBorderWidth]
; first draw the icon and then resize bounds for the text.
mov ebx, [GUI.btnMarginX]
mov edx, [GUI.btnMarginY]
add [.bounds.x], ebx
add [.bounds.y], edx
sub [.bounds.width], ebx
sub [.bounds.height], edx
sub [.bounds.width], ebx
sub [.bounds.height], edx
mov edi, [.icon]
test edi, edi
jz .draw_text
cmp [esi+TButton._iconpos], iposCenter
jne @f
mov eax, [.bounds.width]
sub eax, [edi+TImage.width]
sar eax, 1
add eax, [.bounds.x]
mov ecx, [.bounds.height]
sub ecx, [edi+TImage.height]
sar ecx, 1
add ecx, [.bounds.y] ; x coordinate of the icon.
jmp .draw_icon
@@:
cmp [esi+TButton._iconpos], iposLeft
jne @f
; align left
mov eax, [.bounds.x]
mov ecx, [.bounds.height]
sub ecx, [edi+TImage.height]
sar ecx, 1
add ecx, [.bounds.y] ; x coordinate of the icon.
add ebx, [edi+TImage.width]
add [.bounds.x], ebx
sub [.bounds.width], ebx
jmp .draw_icon
@@:
cmp [esi+TButton._iconpos], iposRight
jne @f
; align right
mov eax, [.bounds.x]
add eax, [.bounds.width]
sub eax, [edi+TImage.width]
add ebx, [edi+TImage.width]
sub [.bounds.width], ebx
mov ecx, [.bounds.height]
sub ecx, [edi+TImage.height]
sar ecx, 1
add ecx, [.bounds.y]
jmp .draw_icon
@@:
cmp [esi+TButton._iconpos], iposTop
jne @f
; align top
mov eax, [.bounds.width]
sub eax, [edi+TImage.width]
sar eax, 1
add eax, [.bounds.x]
mov ecx, [.bounds.y]
add edx, [edi+TImage.height]
add [.bounds.y], edx
sub [.bounds.height], edx
jmp .draw_icon
@@:
cmp [esi+TButton._iconpos], iposBottom
jne .draw_text
; align bottom
mov ecx, [.bounds.y]
add ecx, [.bounds.height]
sub ecx, [edi+TImage.height]
add edx, [edi+TImage.height]
sub [.bounds.height], edx
mov eax, [.bounds.width]
sub eax, [edi+TImage.width]
sar eax, 1
add eax, [.bounds.x]
.draw_icon:
cmp [esi+TButton._state], bsPressed
jne .blend_icon
add eax, [GUI.btnPressedOfsX]
add ecx, [GUI.btnPressedOfsY]
.blend_icon:
stdcall BlendImage, [.canvas], eax, ecx, edi, 0, 0, [edi+TImage.width], [edi+TImage.height]
.draw_text:
get edi, esi, TButton:TextAlign
mov eax, [.caption]
test eax, eax
jz .textok
cmp [esi+TButton._state], bsPressed
jne .textofsok
mov ecx, [GUI.btnPressedOfsX]
add [.bounds.x], ecx
mov ecx, [GUI.btnPressedOfsY]
add [.bounds.y], ecx
.textofsok:
stdcall DrawTextBox, [.canvas], eax, [.bounds.x], [.bounds.y], [.bounds.width], [.bounds.height], 2, edi, [GUI.DefaultFont], [.clTxt]
stdcall StrDel, eax
.textok:
cmp esi, [__FocusedWindow]
jne .not_focused
mov eax, [esi+TButton._height]
mov ecx, [esi+TButton._width]
sub eax, 2
sub ecx, 4
stdcall DrawSolidRect, [.canvas], 0, eax, [esi+TButton._width], 2, [GUI.clBorderFocused]
.not_focused:
inherited
popad
return
endp
method TButton.EventMouseEnter
begin
mov eax, [.self]
mov [eax+TButton._state], bsHovered
exec eax, TButton:Refresh
inherited
return
endp
method TButton.EventMouseLeave
begin
mov eax, [.self]
mov [eax+TButton._state], bsNeutral
exec eax, TButton:Refresh
inherited
return
endp
method TButton.EventButtonPress
begin
mov eax, [.self]
mov [eax+TButton._state], bsPressed
exec eax, TButton:Refresh
return
endp
method TButton.EventButtonRelease
begin
pushad
mov esi, [.self]
cmp [esi+TButton._state], bsPressed
jne .finish
mov [esi+TButton._state], bsHovered
exec esi, TButton:Refresh
cmp [esi+TButton._ModalResult], mrNone
je @f
get eax, esi, TButton:Parent
istype eax, TForm
jne @f
set eax, TForm:ModalResult, [esi+TButton._ModalResult]
@@:
get eax, esi, TButton:OnClick
test eax, eax
jz .click_ok
stdcall eax, esi, [.button] ; OnClick event
.click_ok:
get eax, esi, TButton:Action
test eax, eax
jz .finish
exec eax, TAction:Execute, [.self]
.finish:
popad
return
endp
method TButton.EventKeyPress
begin
push ecx
cmp [.utf8], ' '
jne .finish
mov ecx, [.self]
mov [ecx+TButton._state], bsPressed
exec ecx, TWindow:EventButtonRelease, mbLeft, [.kbdState], 0, 0
mov [ecx+TButton._state], bsPressed
exec ecx, TWindow:Refresh
.finish:
inherited [.utf8], [.scancode], [.kbdState]
pop ecx
return
endp
method TButton.EventKeyRelease
begin
push ecx
mov ecx, [.self]
mov [ecx+TButton._state], bsNeutral
exec ecx, TWindow:Refresh
pop ecx
return
endp
method TButton.SetTextAlign
begin
push ecx
mov ecx, [.self]
push [.value]
pop [ecx+TButton._textalign]
exec ecx, TWindow:Refresh
pop ecx
return
endp
method TButton.SetIcon
begin
push ecx
mov ecx, [.self]
|
| ︙ | ︙ | |||
90 91 92 93 94 95 96 97 |
exec ecx, TWindow:Refresh
pop ecx
return
endp
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 480 481 482 483 484 485 486 487 488 |
exec ecx, TWindow:Refresh
pop ecx
return
endp
endmodule
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 |
; _______________________________________________________________________________________
;| |
;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." |
;|_______________________________________________________________________________________|
;
; Description: TCheckbox object class
;
; Target OS: Any
;
; Dependencies:
;
; Notes: Represents GUI checkbox.
;_________________________________________________________________________________________
module "TCheckbox library"
; Button states for the field TCheckbox._state
cbsNeutral = 0
cbsHovered = 1
cbsPressed = 2
cbsDisabled = 3
object TCheckbox, TWindow
; private fields
._state dd ? ; internal state variable.
._OnClick dd ?
._checked dd ?
; parameters
param .Checked, .GetChecked, .SetChecked
param .OnClick, ._OnClick, ._OnClick
; methods
; parameters handling methods
method .GetChecked
method .SetChecked, .value
; system events methods
method .Create, .Parent
method .Paint
method .EventMouseEnter
method .EventMouseLeave
method .EventButtonPress, .button, .kbdState, .x, .y
method .EventButtonRelease, .button, .kbdState, .x, .y
method .EventKeyPress, .utf8, .scancode, .kbdState
method .EventKeyRelease, .scancode, .kbdState
endobj
; new
method TCheckbox.Create
begin
inherited [.Parent]
mov eax, [.self]
mov [eax+TCheckbox.__want_focus], TRUE
mov [eax+TCheckbox._cursor], mcHand
return
endp
method TCheckbox.Paint
.bounds TBounds
.canvas dd ?
.caption dd ?
.enabled dd ?
.checked dd ?
begin
pushad
mov esi, [.self]
get edx, esi, TCheckbox:Action
test edx, edx
jz .get_normal
get eax, edx, TAction:Caption
stdcall StrDupMem, eax
mov [.caption], eax
get [.checked], edx, TAction:Checked
jmp .get_enabled
.get_normal:
get [.caption], esi, TCheckbox:Caption
get [.checked], esi, TCheckbox:Checked
.get_enabled:
get [.enabled], esi, TCheckbox:Enabled
.paint_it:
get eax, esi, TWindow:Canvas
mov [.canvas], eax
mov eax, [esi+TCheckbox._state]
cmp [.enabled], 0
jne .state_ok
mov eax, cbsDisabled
.state_ok:
mov edi, [GUI.clCheckboxBack+4*eax] ; background color
get ecx, esi, TCheckbox:height
mov edx, [GUI.cbIconSize]
sub ecx, edx
sar ecx, 1
mov [.bounds.x], 0
mov [.bounds.y], ecx
mov [.bounds.width], edx
mov [.bounds.height], edx
mov eax, [GUI.clDialogBk]
and eax, $00ffffff
or eax, $01000000
stdcall DrawSolidRect, [.canvas], 0, 0, [esi+TCheckbox._width], [esi+TCheckbox._height], eax
lea eax, [.bounds]
mov ebx, [GUI.borderCheckbox]
cmp [.enabled], 0
jne .border_ok
or ebx, bxDisabled
.border_ok:
stdcall DrawBoxDefault, [.canvas], eax, edi, ebx, [GUI.boxBorderWidth]
mov [.bounds.x], 0
mov [.bounds.y], ecx
mov [.bounds.width], edx
mov [.bounds.height], edx
; first draw the icon and then resize bounds for the text.
cmp [.checked], 0
je .icon_ok
mov eax, [GUI.iconCheckedGray]
cmp [.enabled], 0
je .draw_icon
mov eax, [GUI.iconChecked]
.draw_icon:
stdcall BlendImage, [.canvas], [.bounds.x], [.bounds.y], eax, 0, 0, [eax+TImage.width], [eax+TImage.height]
.icon_ok:
mov ecx, [.bounds.width]
mov edx, [esi+TCheckbox._width]
mov ebx, [esi+TCheckbox._height]
add ecx, [GUI.cbMargin]
sub edx, ecx
mov eax, [.caption]
test eax, eax
jz .textok
mov edi, [GUI.clCheckboxTxt]
cmp [.enabled], 0
jne .txt_color_ok
mov edi, [GUI.clCheckboxTxtGray]
.txt_color_ok:
stdcall DrawTextBox, [.canvas], eax, ecx, 0, edx, ebx, 0, dtfAlignLeft or dtfAlignMiddle, [GUI.DefaultFont], edi
stdcall StrDel, eax
.textok:
cmp esi, [__FocusedWindow]
jne .not_focused
mov eax, [.bounds.y]
add eax, 15
stdcall DrawSolidRect, [.canvas], 0, eax, 13, 2, [GUI.clBorderFocused]
.not_focused:
inherited
popad
return
endp
method TCheckbox.EventMouseEnter
begin
mov eax, [.self]
mov [eax+TCheckbox._state], cbsHovered
exec eax, TCheckbox:Refresh
inherited
return
endp
method TCheckbox.EventMouseLeave
begin
mov eax, [.self]
mov [eax+TCheckbox._state], cbsNeutral
exec eax, TCheckbox:Refresh
inherited
return
endp
method TCheckbox.EventButtonPress
begin
push eax
mov eax, [.self]
mov [eax+TCheckbox._state], cbsPressed
get eax, [.self], TCheckbox:Checked
xor eax, 1
set [.self], TCheckbox:Checked, eax
get eax, [.self], TCheckbox:OnClick
test eax, eax
jz .finish
stdcall eax, [.self], [.button]
.finish:
exec [.self], TCheckbox:Refresh
pop eax
return
endp
method TCheckbox.EventButtonRelease
begin
pushad
mov esi, [.self]
mov [esi+TCheckbox._state], cbsHovered
exec esi, TCheckbox:Refresh
popad
return
endp
method TCheckbox.EventKeyPress
begin
push ecx
cmp [.utf8], ' '
jne .finish
mov ecx, [.self]
cmp [ecx+TCheckbox._state], cbsPressed
je .finish
exec ecx, TWindow:EventButtonPress, mbLeft, [.kbdState], 0, 0
mov [ecx+TCheckbox._state], cbsPressed
exec ecx, TWindow:Refresh
.finish:
inherited [.utf8], [.scancode], [.kbdState]
pop ecx
return
endp
method TCheckbox.EventKeyRelease
begin
push ecx
mov ecx, [.self]
mov [ecx+TCheckbox._state], cbsNeutral
exec ecx, TWindow:Refresh
pop ecx
return
endp
method TCheckbox.GetChecked
begin
push ecx edx
mov edx, [.self]
mov ecx, [edx+TCheckbox.__action]
jecxz .native
get eax, ecx, TAction:Checked
jmp .finish
.native:
mov eax, [edx+TCheckbox._checked]
.finish:
pop edx ecx
return
endp
method TCheckbox.SetChecked
begin
pushad
mov ecx, [.self]
mov eax, [.value]
get edx, ecx, TCheckbox:Checked
cmp eax, edx
je .finish
cmp [ecx+TCheckbox.__action], 0
je .action_ok
set [ecx+TCheckbox.__action], TAction:Checked, eax
.action_ok:
mov [ecx+TCheckbox._checked], eax
exec ecx, TWindow:Refresh
.finish:
popad
return
endp
endmodule
|
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | ; Dependencies: ; ; Notes: Represents single line edit control. ;_________________________________________________________________________________________ module "TEdit library" | | > > | | > | | > > > > > > > | > > > > > > > > > > | | > > > > > > < < | > | | > > > | > | > > > > > | > > > | > > > > > > > > < < | > > > > | > | | | < | | | | > | | < < | < < > | < < | | | | < < < | < | < < < < < < | < | < < < < < < < | < | < | < < < < < | < < < < < < | < < | < < < | < < < | < < < < < < < < < < < < < < < < < < < | < < < > | | | | | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 |
; Dependencies:
;
; Notes: Represents single line edit control.
;_________________________________________________________________________________________
module "TEdit library"
object TEdit, TWindow
._Text dd ?
._Len dd ? ; the length of the string in characters. (UTF-8)
._Start dd ? ; Where the string begins to be displayed in the edit window.
._Pos dd ? ; Position of the caret in the string.
._Sel dd ? ; Position of the selction in the string.
._need_refresh dd ?
._MarginLeft dd ?
._MarginRight dd ?
param .Text, .GetText, .SetText
param .MarginLeft, ._MarginLeft, ._MarginLeft
param .MarginRight, ._MarginRight, ._MarginRight
param .CaretPos, ._Pos, .SetCaretPos
method .Create, .parent
method .Destroy
method .GetText
method .SetText, .value
method .SetCaretPos, .value
method .HitTest, .x, .y ; returns the position inside the string.
; system event methods
method .UpdateCaretPos
method .Paint
method .EventKeyPress, .utf8, .scancode, .kbdState
method .EventKeyRelease, .scancode, .kbdState
method .EventFocusIn
method .EventFocusOut
endobj
method TEdit.Create
begin
push ecx eax
inherited [.parent]
stdcall StrNew
mov ecx, [.self]
mov [ecx+TEdit._Text], eax
mov [ecx+TEdit._cursor], mcText
mov [ecx+TEdit.__want_focus], TRUE
mov [ecx+TEdit._need_refresh], TRUE
pop eax ecx
return
endp
method TEdit.Destroy
begin
mov eax, [.self]
stdcall StrDel, [eax+TEdit._Text]
return
endp
method TEdit.GetText
begin
mov eax, [.self]
stdcall StrDup, [eax+TEdit._Text]
return
endp
method TEdit.SetText
begin
push esi eax
mov esi, [.self]
mov [esi+TEdit._Start], 0
mov [esi+TEdit._Pos], 0
mov [esi+TEdit._Sel], 0
lea eax, [esi+TEdit._Text]
stdcall SetString, eax, [.value]
stdcall StrLenUtf8, [esi+TEdit._Text], -1
mov [esi+TEdit._Len], eax
exec esi, TEdit:Refresh
pop eax esi
return
endp
method TEdit.Paint
.bounds TBounds
.selbeg dd ?
.selend dd ?
.clBack dd ?
.border dd ?
begin
pushad
mov esi, [.self]
exec esi, TEdit:__UpdateCanvas
mov eax, [GUI.clEditBk]
mov ecx, [GUI.editBorder]
cmp esi, [__FocusedWindow]
jne @f
mov eax, [GUI.clEditBkFocused]
mov ecx, [GUI.editBorderFocused]
@@:
mov [.clBack], eax
mov [.border], ecx
; selection sort positions.
mov eax, [esi+TEdit._Pos]
mov ecx, [esi+TEdit._Sel]
cmp eax,ecx
jle @f
xchg eax, ecx
@@:
mov [.selbeg], eax
mov [.selend], ecx
; drawing bounds
mov ecx, [esi+TEdit._width]
mov eax, [esi+TEdit._height]
mov [.bounds.x], 0
mov [.bounds.y], 0
mov [.bounds.width], ecx
mov [.bounds.height], eax
lea eax, [.bounds]
stdcall [DrawBox], [esi+TWindow._canvas], eax, [.clBack], [.border], [GUI.boxBorderWidth]
mov eax, [GUI.boxBorderWidth]
add [.bounds.x], eax
add [.bounds.y], eax
shl eax, 1
sub [.bounds.width], eax
sub [.bounds.height], eax
mov eax, [esi+TEdit._MarginLeft]
mov ecx, [esi+TEdit._MarginRight]
add [.bounds.x], eax
sub [.bounds.width], eax
sub [.bounds.width], ecx
cmp [.bounds.width], 0
jle .enddraw
stdcall StrOffsUtf8, [esi+TEdit._Text], [esi+TEdit._Start]
mov edi, eax
stdcall DrawTextBox, [esi+TEdit._canvas], edi, [.bounds.x], [.bounds.y], [.bounds.width], [.bounds.height], 0, dtfAlignLeft or dtfAlignMiddle or dtfSingleLine, [GUI.DefaultFont], [GUI.clEditTxt]
; determine the selection
mov eax, [.selbeg]
mov ecx, [esi+TEdit._MarginLeft]
sub eax, [esi+TEdit._Start]
jle .xsel_ok
stdcall StrOffsUtf8, edi, eax
sub eax, edi
stdcall GetTextBounds, edi, eax, [GUI.DefaultFont]
mov ecx, eax
.xsel_ok:
mov eax, [.selend]
sub eax, [esi+TEdit._Start]
jle .enddraw
stdcall StrOffsUtf8, edi, eax
sub eax, edi
stdcall GetTextBounds, edi, eax, [GUI.DefaultFont]
mov edx, [.bounds.width]
add edx, [.bounds.x]
cmp eax, edx
cmovg eax, edx
sub eax, ecx
add ecx, [.bounds.x]
stdcall BlendSolidRect, [esi+TWindow._canvas], ecx, [.bounds.y], eax, [.bounds.height], [GUI.clEditSel]
.enddraw:
inherited
popad
return
endp
method TEdit.EventKeyPress ;, .utf8, .scancode, .kbdState
.time dd ?
begin
pushad
stdcall GetTimestamp
mov [.time], eax
mov esi, [.self]
get ebx, esi, TEdit:CaretPos
mov eax, [.utf8]
test eax, eax
jz .no_char
cmp eax, $20
jb .no_char
cmp eax, $7f
je .no_char
push eax
call .ClearSelection
stdcall StrPtr, [esi+TEdit._Text]
mov ecx, eax
stdcall StrOffsUtf8, eax, ebx
sub ecx, eax
neg ecx
pop eax
stdcall StrCharInsert, [esi+TEdit._Text], eax, ecx
inc [esi+TEdit._Len]
mov [.kbdState], 0
inc [esi+TEdit._need_refresh]
jmp .right
.no_char:
mov eax, [.scancode]
cmp eax, keyLeftNumpad
je .left
cmp eax, keyLeft
je .left
cmp eax, keyRightNumpad
|
| ︙ | ︙ | |||
317 318 319 320 321 322 323 |
cmp eax, keyBackSpace
je .backdel
jmp .finish
.left:
| | < | < | | < | | < < > | < < > | < | < | | < > | < < < < | | < < < < < < | < < | < < | < | < < | < < < < < < < < < < < < < < < < < < < < < | < < < < | < < < | < < < < < < < | < < < < < < < < < | < < | | < < < < < < < < < < < < < < | | | | | | < | | < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 |
cmp eax, keyBackSpace
je .backdel
jmp .finish
.left:
cmp ebx, 0
jle .endmove
dec ebx
jmp .endmove
.right:
cmp ebx, [esi+TEdit._Len]
jae .endmove
inc ebx
jmp .endmove
.home:
xor ebx, ebx
jmp .endmove
.end:
mov ebx, [esi+TEdit._Len]
jmp .endmove
.backdel:
call .ClearSelection
jnc .endmove
cmp ebx, 0
jle .endmove
dec ebx
.del:
call .ClearSelection
jnc .endmove
cmp ebx, [esi+TEdit._Len]
jge .finish ; can't delete after the end of string.
stdcall StrPtr, [esi+TEdit._Text]
mov ecx, eax
stdcall StrOffsUtf8, eax, ebx
sub eax, ecx
stdcall StrSplit, [esi+TEdit._Text], eax
mov ebx, eax
stdcall StrPtr, ebx
stdcall DecodeUtf8, [eax]
stdcall StrCopyPart, ebx, ebx, edx, -1
stdcall StrCat, [esi+TEdit._Text], ebx
stdcall StrDel, ebx
dec [esi+TEdit._Len]
.endmove:
mov eax, [esi+TEdit._Pos]
test [.kbdState], maskShift
jnz .set_pos
mov [esi+TEdit._Sel], ebx
.set_pos:
set esi, TEdit:CaretPos, ebx
cmp [esi+TEdit._need_refresh], 0
je .finish
exec esi, TEdit:Update
mov [esi+TEdit._need_refresh], 0
.finish:
stdcall GetTimestamp
sub eax, [.time]
OutputValue "Key press:", eax, 10, 4
popad
return
.ClearSelection:
mov ecx, [esi+TEdit._Sel]
cmp ebx, [esi+TEdit._Sel]
je .noselection ; there is no selection.
jl @f
xchg ebx, ecx ; ebx=beg_selection; ecx=end_selection
@@:
add [esi+TEdit._Len], ebx
sub [esi+TEdit._Len], ecx
mov [esi+TEdit._Sel], ebx
push -1
stdcall StrOffsUtf8, [esi+TEdit._Text], ecx
push eax
stdcall StrOffsUtf8, [esi+TEdit._Text], ebx
push eax
stdcall StrPtr, [esi+TEdit._Text]
sub [esp], eax ; begin of the selection
sub [esp+4], eax
mov eax, [esp]
sub [esp+4], eax ; length of the selection
stdcall StrSplit, [esi+TEdit._Text] ; position from the stack
mov ecx, eax
stdcall StrCopyPart, ecx, ecx ; pos and length from the stack.
stdcall StrCat, [esi+TEdit._Text], ecx
stdcall StrDel, ecx
clc
retn
.noselection:
stc
retn
endp
method TEdit.EventKeyRelease ;, .scancode, .kbdState
begin
return
endp
method TEdit.SetCaretPos
begin
pushad
mov ecx, [.self]
mov eax, [.value]
cmp eax, [ecx+TEdit._Pos]
je .finish
mov [ecx+TEdit._Pos], eax
exec ecx, TEdit:UpdateCaretPos
.finish:
popad
return
endp
method TEdit.UpdateCaretPos
.refresh dd ?
begin
pushad
mov esi, [.self]
xor eax, eax
mov [.refresh], eax
mov eax, [esi+TEdit._Pos]
cmp eax, [esi+TEdit._Start]
jge .compute_x
; scroll the text
and eax, $fffffff8
mov [esi+TEdit._Start], eax
inc [.refresh]
.compute_x:
stdcall StrPtr, [esi+TEdit._Text]
mov edi, eax
stdcall StrOffsUtf8, edi, [esi+TEdit._Pos]
mov ecx, eax
stdcall StrOffsUtf8, edi, [esi+TEdit._Start]
sub ecx, eax ; offset to char under cursor.
.leftok:
mov edi, eax ; StrOffsUtf8 returns pointer to start of the text.
mov eax, ecx
jecxz @f
stdcall GetTextBounds, edi, ecx, [GUI.DefaultFont]
@@:
lea ecx, [eax+1] ; x coordinate of the cursor.
add ecx, [esi+TEdit._MarginLeft]
mov eax, [esi+TEdit._width]
sub eax, [esi+TEdit._MarginRight]
sub eax, ecx
cmp eax, 1
jge .caretok
mov eax, [esi+TEdit._Start]
add eax, 8
cmp eax, [esi+TEdit._Len]
jle @f
mov eax, [esi+TEdit._Len]
@@:
mov [esi+TEdit._Start], eax
inc [.refresh]
jmp .compute_x
.caretok:
cmp [.refresh], 0
je .canvas_ok
exec esi, TEdit:Paint
inc [esi+TEdit._need_refresh]
.canvas_ok:
mov edx, [esi+TEdit._height]
sub edx, 4
add ecx, [GUI.boxBorderWidth]
stdcall CaretChange, ecx, 2, 1, edx
popad
return
endp
method TEdit.HitTest
begin
return
endp
method TEdit.EventFocusIn
begin
stdcall CaretAttach, [.self]
stdcall CaretShow, TRUE
exec [.self], TEdit:UpdateCaretPos
return
endp
method TEdit.EventFocusOut
begin
stdcall CaretShow, FALSE
inherited
return
endp
;method TEdit.SysEventHandler
;.changes dd ?
;.prevpos dd ?
;.PosChanged = 1
;.NeedRefresh = 2
;.ShowCaret = 4
;begin
; push eax ebx ecx edx esi edi
;
; mov [.changes], 0
; mov esi, [.self]
; mov ebx, [.pEvent]
; mov eax, [ebx+TSysEvent.event]
;
; cmp eax, seKbdKeyPress
; je .keypress
;
; cmp eax, seFocusIn
; je .focusin
;
; cmp eax, seFocusOut
; je .focusout
;
; inherited [.pEvent]
;
;.finish:
; pop edi esi edx ecx ebx eax
; return
;
;;............................................................................................
;
;.focusin:
; mov [esi+TEdit._Focused], TRUE
; stdcall CaretAttach, esi
; or [.changes], .PosChanged or .ShowCaret
; jmp .endmove
;
;.focusout:
; stdcall CaretShow, FALSE
; mov [esi+TEdit._Focused], FALSE
; or [.changes], .PosChanged
; jmp .endmove
;
;;............................................................................................
;
;.keypress:
;; mov eax, [ebx+TKeyboardEvent.kbdStatus]
;; OutputRegister regEAX, 16
;
; mov eax, [esi+TEdit._Pos]
; mov [.prevpos], eax
;
; mov eax, [ebx+TKeyboardEvent.key]
; test eax, eax
; jz .no_char
;
; cmp eax, $20
; jb .no_char
;
; cmp eax, $7f
; je .no_char
;
; push eax
;
; call .ClearSelection
;
; stdcall StrPtr, [esi+TEdit._Text]
; mov ecx, eax
; stdcall StrOffsUtf8, eax, [esi+TEdit._Pos]
; sub ecx, eax
; neg ecx
;
; pop eax
; stdcall StrCharInsert, [esi+TEdit._Text], eax, ecx
; inc [esi+TEdit._Len]
;
; mov [ebx+TKeyboardEvent.kbdStatus], 0
; or [.changes], .NeedRefresh
; jmp .right
;
;.no_char:
; mov eax, [ebx+TKeyboardEvent.scancode]
;
; cmp eax, keyLeftNumpad
; je .left
; cmp eax, keyLeft
; je .left
;
; cmp eax, keyRightNumpad
; je .right
; cmp eax, keyRight
; je .right
;
; cmp eax, keyHomeNumpad
; je .home
; cmp eax, keyHome
; je .home
;
; cmp eax, keyEndNumpad
; je .end
; cmp eax, keyEnd
; je .end
;
; cmp eax, keyDelNumpad
; je .del
; cmp eax, keyDelete
; je .del
;
; cmp eax, keyBackSpace
; je .backdel
;
; jmp .finish
;
;.left:
; cmp [esi+TEdit._Pos], 0
; jle .endmove
;
; or [.changes], .PosChanged
; dec [esi+TEdit._Pos]
; jmp .endmove
;
;.right:
; mov eax, [esi+TEdit._Pos]
; cmp eax, [esi+TEdit._Len]
; jae .finish
;
; or [.changes], .PosChanged
; inc [esi+TEdit._Pos]
; jmp .endmove
;
;.home:
; mov [esi+TEdit._Pos], 0
; mov [esi+TEdit._Start], 0
; mov [.changes], .PosChanged or .NeedRefresh
; jmp .endmove
;
;.end:
; mov eax, [esi+TEdit._Len]
; mov [esi+TEdit._Pos], eax
; or [.changes], .PosChanged
; jmp .endmove
;
;.backdel:
; call .ClearSelection
; jnc .endmove
;
; cmp [esi+TEdit._Pos], 0
; jle .endmove
;
; or [.changes], .PosChanged
; dec [esi+TEdit._Pos]
;
;.del:
; call .ClearSelection
; jnc .endmove
;
; mov eax, [esi+TEdit._Pos]
; cmp eax, [esi+TEdit._Len]
; jae .finish ; can't delete after the end of string.
;
; stdcall StrPtr, [esi+TEdit._Text]
;
; mov ecx, eax
; stdcall StrOffsUtf8, eax, [esi+TEdit._Pos]
; sub eax, ecx
;
; stdcall StrSplit, [esi+TEdit._Text], eax
; mov ebx, eax
;
; stdcall StrPtr, ebx
; stdcall DecodeUtf8, [eax]
;
; stdcall StrCopyPart, ebx, ebx, edx, -1
; stdcall StrCat, [esi+TEdit._Text], ebx
; stdcall StrDel, ebx
;
; dec [esi+TEdit._Len]
; or [.changes], .NeedRefresh
;
;.endmove:
; mov ebx, [.pEvent]
; mov eax, [esi+TEdit._Pos]
; cmp [ebx+TSysEvent.event], seKbdKeyPress
; jne .setselection
;
; test [ebx+TKeyboardEvent.kbdStatus], maskShift
; jnz .refresh
;
;.setselection:
; mov ecx, [.prevpos]
; cmp ecx, [esi+TEdit._Sel]
; je @f
; or [.changes], .NeedRefresh
;@@:
; mov [esi+TEdit._Sel], eax
;
; test [.changes], .NeedRefresh
; jz .caretmove
;
;.refresh:
; mov [esi+TEdit._fShadowReady], 0
; exec [.self], TEdit:Refresh
;
;.caretmove:
; cmp [esi+TEdit._Focused], 0
; je .finish
;
; test [.changes], .PosChanged
; jz .showcaret
;
; mov eax, [esi+TEdit._Pos]
; cmp eax, [esi+TEdit._Start]
; jl .scroll
;
; stdcall StrPtr, [esi+TEdit._Text]
; mov edi, eax
;
; stdcall StrOffsUtf8, edi, [esi+TEdit._Pos]
; mov ecx, eax
;
; stdcall StrOffsUtf8, edi, [esi+TEdit._Start]
; sub ecx, eax ; offset to char under cursor.
; jns .leftok
;
;.scroll:
; mov eax, [esi+TEdit._Start]
; sub eax, 8
; test eax, eax
; jns @f
; xor eax, eax
;@@:
; mov [esi+TEdit._Start], eax
; mov [.changes], .PosChanged or .NeedRefresh
; jmp .endmove
;
;.leftok:
; mov edi, eax ; pointer to start of the text.
;
; stdcall AllocateContext, [esi+TEdit.handle]
; push eax
;
; stdcall GetTextBounds, eax, edi, ecx, 0
; lea ecx, [eax+2] ; x coordinate of the cursor.
; add ecx, [esi+TEdit._MarginLeft]
;
; stdcall ReleaseContext ; from the stack.
;
; mov eax, [esi+TEdit._width]
; sub eax, [esi+TEdit._MarginRight]
; sub eax, ecx
; cmp eax, 2
; jge .caretok
;
; mov eax, [esi+TEdit._Start]
; add eax, 8
; cmp eax, [esi+TEdit._Len]
; jle @f
; mov eax, [esi+TEdit._Len]
;@@:
; mov [esi+TEdit._Start], eax
;
; mov [.changes], .PosChanged or .NeedRefresh
; jmp .endmove
;
;
;.caretok:
; mov edx, [esi+TEdit._height]
; sub edx, 4
;
; stdcall CaretChange, ecx, 2, 1, edx
;
;.showcaret:
; test [.changes], .ShowCaret
; jz .finish
;
; stdcall CaretShow, TRUE
; jmp .finish
;
;;............................................................................................
;
;
;.ClearSelection:
; mov eax, [esi+TEdit._Pos]
; mov ecx, [esi+TEdit._Sel]
; cmp eax, [esi+TEdit._Sel]
; je .noselection ; there is no selection.
; jg @f
; xchg eax, ecx ; eax=end_selection; ecx=beg_selection
;@@:
; add [esi+TEdit._Len], ecx
; sub [esi+TEdit._Len], eax
; mov [esi+TEdit._Pos], ecx
; mov [esi+TEdit._Sel], ecx
;
; push -1
; stdcall StrOffsUtf8, [esi+TEdit._Text], eax
; push eax
; stdcall StrOffsUtf8, [esi+TEdit._Text], ecx
; push eax
; stdcall StrPtr, [esi+TEdit._Text]
; sub [esp], eax ; begin of the selection
; sub [esp+4], eax
; mov eax, [esp]
; sub [esp+4], eax ; length of the selection
;
; stdcall StrSplit, [esi+TEdit._Text] ; position from the stack
; mov ecx, eax
; stdcall StrCopyPart, ecx, ecx ; pos and length from the stack.
; stdcall StrCat, [esi+TEdit._Text], ecx
; stdcall StrDel, ecx
;
; or [.changes], .PosChanged or .NeedRefresh
; clc
; retn
;
;.noselection:
; stc
; retn
;endp
endmodule
; stdcall DecodeUtf8, [edi]
; jc .finish
;
|
| ︙ | ︙ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | ; _______________________________________________________________________________________ ;| | ;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." | ;|_______________________________________________________________________________________| ; ; Description: TForm object class ; ; Target OS: Any ; ; Dependencies: ; ; Notes: Represents form window that to serve as parent window for other controls. ;_________________________________________________________________________________________ module "TForm library" mrNone = 0 mrOK = 1 mrCancel = 2 mrAbort = 3 mrRetry = 4 mrIgnore = 5 mrYes = 6 mrNo = 7 mrMaybe = 8 object TForm, TWindow ._modal_result dd ? ._OnClose dd ? ; On close window event handler. param .ModalResult, ._modal_result, ._modal_result param .OnClose, ._OnClose, ._OnClose | > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > | | < < < < < < < < < < < < < < < < > > | > > > | > > | > > > > > | | > > > > > > | | | > > > > > > | | > > | > > > | | > > > > | > | | > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < | > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 |
; _______________________________________________________________________________________
;| |
;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." |
;|_______________________________________________________________________________________|
;
; Description: TForm object class
;
; Target OS: Any
;
; Dependencies:
;
; Notes: Represents form window that to serve as parent window for other controls.
;_________________________________________________________________________________________
module "TForm library"
mrNone = 0
mrOK = 1
mrCancel = 2
mrAbort = 3
mrRetry = 4
mrIgnore = 5
mrYes = 6
mrNo = 7
mrMaybe = 8
object TForm, TWindow
._modal_result dd ?
._OnClose dd ? ; On close window event handler.
._p_split_grid dd ?
._p_split_template dd ?
._drag_splitter dd ?
param .ModalResult, ._modal_result, ._modal_result
param .OnClose, ._OnClose, ._OnClose
param .SplitGrid, ._p_split_grid, .SetSplitGrid
method .__RealignSplitGrid
method .SetSplitGrid, .value
method .AttachControlToCell, .pWindow, .idCell
method .SetWidth, .value
method .SetHeight, .value
method .EventMouseMove, .x, .y, .kbdState
method .EventButtonPress, .button, .kbdState, .x, .y
method .EventButtonRelease, .button, .kbdState, .x, .y
method .EventResize, .newWidth, .newHeight
method .CloseRequest, .reason
method .Paint
endobj
;----------------------------------------------------------------------
; Interface for TForm.OnClose user handler.
; Arguments:
; .self - pointer to the TForm object
; .reason - the reason for the close request.
;
; Returns:
; CF = 1 - Ignore the request. The form will not be closed.
; CF = 0 - Destroy the object.
;
; If the OnClose event handler is not set, the form will be destroyed.
;----------------------------------------------------------------------
interface TForm.OnClose, .self, .reason
; OS independent code.
method TForm.Paint
begin
pushad
mov esi, [.self]
get edi, esi, TWindow:Canvas
stdcall DrawSolidRect, edi, 0, 0, [esi+TWindow._width], [esi+TWindow._height], [GUI.clDialogBk]
mov ebx, [esi+TForm._p_split_grid]
test ebx, ebx
jz .finish
lea ebx, [ebx+TArray.array]
stdcall DrawSplitters, edi, ebx
.finish:
inherited
popad
return
endp
method TForm.EventResize ;, .newWidth, .newHeight
begin
inherited [.newWidth], [.newHeight]
exec [.self], TForm:__RealignSplitGrid
return
endp
method TForm.SetWidth
begin
inherited [.value]
exec [.self], TForm:__RealignSplitGrid
return
endp
method TForm.SetHeight
begin
inherited [.value]
exec [.self], TForm:__RealignSplitGrid
return
endp
method TForm.CloseRequest ;, .reason
begin
push eax
get eax, [.self], TForm:OnClose
test eax, eax
jz .destroy
stdcall eax, [.self], [.reason]
jc .finish
.destroy:
destroy [.self]
.finish:
pop eax
return
endp
; sets the splitgrid from a template.
method TForm.SetSplitGrid
begin
pushad
mov esi, [.self]
mov edx, [.value]
cmp edx, [esi+TForm._p_split_template]
je .finish
mov [esi+TForm._p_split_template], edx
mov ecx, [esi+TForm._p_split_grid]
test ecx, ecx
jz .old_ok
stdcall FreeMem, ecx
.old_ok:
test edx, edx
jz .finish
stdcall ReadSplitGridTemplate, edx
mov [esi+TForm._p_split_grid], eax
exec esi, TForm:__RealignSplitGrid
.finish:
popad
return
endp
method TForm.AttachControlToCell;, .pWindow, .idCell
begin
pushad
mov esi, [.self]
mov edi, [esi+TForm._p_split_grid]
test edi, edi
jz .finish
mov eax, [.idCell]
cmp eax, [edi+TArray.count]
jae .finish
imul eax, sizeof.TSplitRect
lea edi, [edi+TArray.array+eax]
push [.pWindow]
pop [edi+TSplitRect.pWindow]
exec [.self], TForm:__RealignSplitGrid
.finish:
popad
return
endp
method TForm.__RealignSplitGrid
.rect RECT
begin
pushad
mov esi, [.self]
mov ebx, [esi+TForm._p_split_grid]
test ebx, ebx
jz .finish
lea ebx, [ebx+TArray.array]
xor eax, eax
get ecx, esi, TWindow:width
get edx, esi, TWindow:height
mov [.rect.left], eax
mov [.rect.top], eax
mov [.rect.right], ecx
mov [.rect.bottom], edx
lea eax, [.rect]
stdcall RealignGrid, ebx, eax
exec esi, TWindow:Refresh
.finish:
popad
return
endp
method TForm.EventMouseMove ;, .x, .y, .kbdState
begin
pushad
mov ebx, [.self]
mov esi, [ebx+TForm._drag_splitter]
test esi, esi
jz .find_splitter
mov ecx, [esi+TSplitRect.type]
and ecx, stVert
mov eax, [.x+ecx] ; the respective coordinate.
sub eax, [esi+TSplitRect.rect.left+ecx]
test [esi+TSplitRect.type], stOriginBR
jz .sizeok
mov edx, [esi+TSplitRect.rect.right+ecx]
sub edx, [esi+TSplitRect.rect.left+ecx]
sub eax, edx
neg eax
sub eax, [esi+TSplitRect.spWidth]
.sizeok:
test [esi+TSplitRect.type], stRelative
jz .posok
cdq
mov ebx, $8000
imul ebx
mov ebx, [esi+ecx+TSplitRect.rect.right]
sub ebx, [esi+ecx+TSplitRect.rect.left] ; size of rect (x or y depending on type)
idiv ebx
.posok:
mov [esi+TSplitRect.pos], eax
stdcall RealignGrid, esi, esi
exec [.self], TWindow:RectChanged, esi
exec [.self], TWindow:Refresh
.finish:
popad
inherited [.x], [.y], [.kbdState]
return
.find_splitter:
mov edi, [ebx+TForm._p_split_grid]
test edi, edi
jnz .found
.set_default:
mov ecx, [ebx+TForm._cursor]
jmp .setit
.found:
lea edi, [edi+TArray.array]
lea eax, [.x]
stdcall FindSplitter, edi, eax
jnc .set_default
test [eax+TSplitRect.type], stJustGap
jnz .finish
mov ecx, mcSizeH
test [eax+TSplitRect.type], stVert
jz .setit
mov ecx, mcSizeV
.setit:
stdcall GetStockCursor, ecx
get edx, ebx, TWindow:OSWindow
stdcall SetMouseCursor, [edx+TWindow.handle], eax
jmp .finish
endp
method TForm.EventButtonPress ;, .button, .kbdState, .x, .y
.pnt POINT
.cliprect RECT
begin
pushad
mov esi, [.self]
mov ebx, [esi+TForm._p_split_grid]
test ebx, ebx
jz .finish
lea ebx, [ebx+TArray.array]
mov eax, [.x]
mov ecx, [.y]
mov [.pnt.x], eax
mov [.pnt.y], ecx
lea eax, [.pnt]
stdcall FindSplitter, ebx, eax
jnc .finish
test [eax+TSplitRect.type], stJustGap
jnz .finish
mov [esi+TForm._drag_splitter], eax
stdcall SetMouseCapture, esi
.finish:
popad
inherited [.button], [.kbdState], [.x], [.y]
return
endp
method TForm.EventButtonRelease ;, .button, .kbdState, .x, .y
begin
push eax
mov eax, [.self]
mov [eax+TForm._drag_splitter], 0
stdcall SetMouseCapture, 0
.finish:
pop eax
inherited [.button], [.kbdState], [.x], [.y]
return
endp
endmodule
|
| ︙ | ︙ | |||
19 20 21 22 23 24 25 26 27 28 29 | iaCenter = 2 iaStretchH = 3 iaTop = $0 iaBottom = $100 iaMiddle = $200 iaStrechV = $300 object TImageLabel, TWindow ._ImageAlign dd ? ._Image dd ? | > < < < < < | > < < < < < < < < < < < < < < < | | < < < < | < < | < < < < < | | < < < < < | < < < < < > > > > > > > > > > > > > > > | > > > > | > > < | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
iaCenter = 2
iaStretchH = 3
iaTop = $0
iaBottom = $100
iaMiddle = $200
iaStrechV = $300
object TImageLabel, TWindow
._ImageAlign dd ?
._Image dd ?
param .ImageAlign, ._ImageAlign, .SetImageAlign ; image align flags.
param .Image, ._Image, .SetImage ; TImage object
method .SetImageAlign, .value
method .SetImage, .value
method .Paint
endobj
method TImageLabel.SetImageAlign
begin
push eax
mov eax, [.self]
push [.value]
pop [eax+TImageLabel._ImageAlign]
exec eax, TWindow:Refresh
pop eax
return
endp
method TImageLabel.SetImage
begin
push eax
mov eax, [.self]
push [.value]
pop [eax+TImageLabel._Image]
exec eax, TWindow:Refresh
pop eax
return
endp
method TImageLabel.Paint
begin
pushad
mov esi, [.self]
exec esi, TWindow:__UpdateCanvas
mov edi, [esi+TWindow._canvas]
mov ecx, [esi+TImageLabel._width]
mov edx, [esi+TImageLabel._height]
xor eax, eax
stdcall DrawSolidRect, edi, eax, eax, ecx, edx, eax ; clear with transparency.
mov eax, [esi+TImageLabel._ImageAlign]
mov esi, [esi+TImageLabel._Image]
test esi, esi
jz .finish
sub ecx, [esi+TImage.width]
sub edx, [esi+TImage.height]
cmp al, iaRight
je .x_ok
cmp al, iaCenter
je .x_center
xor ecx, ecx
jmp .x_ok
.x_center:
sar ecx, 1
.x_ok:
cmp ah, iaBottom /256
je .y_ok
cmp ah, iaMiddle / 256
je .y_center
xor edx, edx
jmp .y_ok
.y_center:
sar edx, 1
.y_ok:
xor eax, eax
; stdcall BlendImage, edi, ecx, edx, esi, eax, eax, [esi+TImage.width], [esi+TImage.height]
stdcall CopyImageRect, edi, ecx, edx, esi, eax, eax, [esi+TImage.width], [esi+TImage.height]
.finish:
popad
return
endp
endmodule
|
| ︙ | ︙ | |||
9 10 11 12 13 14 15 16 17 | ; ; Dependencies: ; ; Notes: Not finished. ;_________________________________________________________________________________________ module "TLabel library" object TLabel, TWindow | > > > | > | > > > | > > > > > > > > > > > > > > > > < | > < < | < < < < < < | < < < < < | | > > | > > > > > > > > > > > | | | | < < < | > > > > | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
;
; Dependencies:
;
; Notes: Not finished.
;_________________________________________________________________________________________
module "TLabel library"
object TLabel, TWindow
; private fields
._textalign dd ?
; parameters
param .TextAlign, ._textalign, .SetTextAlign ; text align flags.
; parameter methods
method .SetTextAlign, .value
; other methods
method .Create, .parent
method .Paint
endobj
method TLabel.Create
begin
push eax ecx
inherited [.parent]
mov eax, [.self]
mov [eax+TLabel._textalign], dtfAlignLeft or dtfAlignMiddle or dtfCRLF or dtfWordWrap
pop ecx eax
return
endp
method TLabel.SetTextAlign
begin
push eax
mov eax, [.self]
push [.value]
pop [eax+TLabel._textalign]
exec eax, TWindow:Refresh
pop eax
return
endp
method TLabel.Paint
.bounds TBounds
begin
pushad
mov esi, [.self]
exec esi, TWindow:__UpdateCanvas
xor edx, edx
mov ecx, [esi+TLabel._width]
mov eax, [esi+TLabel._height]
mov [.bounds.x], edx
mov [.bounds.y], edx
mov [.bounds.width], ecx
mov [.bounds.height], eax
lea eax, [.bounds]
stdcall [DrawBox], [esi+TWindow._canvas], eax, [GUI.clLabelBk], bxNone, [GUI.boxBorderWidth]
mov eax, [GUI.btnMarginX]
mov ecx, [GUI.btnMarginY]
add [.bounds.x], eax
add [.bounds.y], ecx
shl eax, 1
shl ecx, 1
sub [.bounds.width], eax
sub [.bounds.height], ecx
get eax, esi, TWindow:Caption
test eax, eax
jz .finish
stdcall DrawTextBox, [esi+TWindow._canvas], eax, [.bounds.x], [.bounds.y], [.bounds.width], [.bounds.height], 2, [esi+TLabel._textalign], [GUI.DefaultFont], [GUI.clLabelTxt]
stdcall StrDel, eax
.finish:
inherited
popad
return
endp
endmodule
|
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | ; ; Dependencies: ; ; Notes: Represents main menu or popup menu objects. ;_________________________________________________________________________________________ module "TMenu library" | | > > > > | | | > > > | | | | > > > > | > > > | > | > > > | > | > | > > | > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | > > > > | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | > > > > | > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | | > | | > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 |
;
; Dependencies:
;
; Notes: Represents main menu or popup menu objects.
;_________________________________________________________________________________________
module "TMenu library"
mitSeparator = 0
mitAction = 1
mitSubmenu = 2
mitString = 3 ; contains simple text string can't have accelerator and icons.
struct TMenuItem
.type dd ?
.item dd ? ; different for the different types of items: NULL, pointer to TAction, pointer to TMenu, handle of string.
ends
object TMenu, TWindow
._p_items dd ?
._selected dd ?
.__caller dd ?
.__icon_size dd ?
param .Selected, ._selected, .SetSelected
param .Items, ._p_items, .SetItems
param .LineHeight, .GetLineHeight, NONE
method .GetLineHeight
method .SetSelected, .value
method .SetItems, .menu_template
method .SetVisible, .value
method .AddItem, .Type, .Item
method .Paint
method .Create, .Parent
method .Destroy
method .Show, .parent, .x, .y
method .EventButtonPress, .button, .kbdState, .x, .y
method .EventMouseMove, .x, .y, .kbdState
endobj
method TMenu.Create
begin
stdcall CreateArray, 8
push eax
mov eax, [.self]
pop [eax+TMenu._p_items]
mov [eax+TMenu.__want_focus], 0
mov [eax+TMenu._selected], -1
inherited 0
set [.self], TWindow:border, borderNone
return
endp
method TMenu.Destroy
begin
mov eax, [.self]
stdcall FreeMem, [eax+TMenu._p_items]
return
endp
method TMenu.GetLineHeight
begin
pushad
mov esi, [.self]
stdcall GetFontMetrics, [GUI.DefaultFont]
mov ecx, [esi+TMenu.__icon_size]
mov edx, [GUI.menuIconMargin]
add ecx, edx
cmp eax, ecx
cmovb eax, ecx
mov [esp+4*regEAX], eax
popad
return
endp
method TMenu.SetItems
begin
pushad
popad
return
endp
method TMenu.AddItem
begin
pushad
mov esi, [.self]
mov edx, [esi+TMenu._p_items]
stdcall AddArrayItems, edx, 1
pushd [.Type]
pushd [.Item]
popd [eax+TMenuItem.item]
popd [eax+TMenuItem.type]
mov [esi+TMenu._p_items], edx
popad
return
endp
method TMenu.SetVisible ;
.max dd ?
.str dd ?
begin
pushad
mov esi, [.self]
cmp [.value], FALSE
je .switch_off
get edx, esi, TMenu:Items
mov ecx, [edx+TArray.count]
test ecx, ecx
jnz .compute_width
stdcall GetTextBounds, "Empty menu", 10, [GUI.DefaultFont]
add eax, 20
jmp .set_width
.compute_width:
mov [.max], 0
mov [esi+TMenu.__icon_size], 0
.loop:
dec ecx
js .end_width
lea ebx, [edx+TArray.array+8*ecx] ; pointer to TMenuItem
cmp [ebx+TMenuItem.type], mitSeparator
je .loop
cmp [ebx+TMenuItem.type], mitAction
je .action
cmp [ebx+TMenuItem.type], mitSubmenu
je .submenu
; it is string.
stdcall StrDup, [ebx+TMenuItem.item]
push eax
jmp .str_width
.submenu:
get eax, [ebx+TMenuItem.item], TMenu:Caption
push eax
stdcall StrCat, eax, txt " >"
jmp .str_width
.action:
get eax, [ebx+TMenuItem.item], TAction:Icon
test eax, eax
jz .icon_ok
mov eax, [eax+TImage.height]
cmp eax, [esi+TMenu.__icon_size]
jbe .icon_ok
mov [esi+TMenu.__icon_size], eax
.icon_ok:
get eax, [ebx+TMenuItem.item], TAction:AccelStr
push eax
get edi, [ebx+TMenuItem.item], TAction:Caption
stdcall StrCat, eax, edi
.str_width:
stdcall StrPtr, eax
push edx
stdcall GetTextBounds, eax, [eax+string.len], [GUI.DefaultFont]
pop edx
stdcall StrDel ; from the stack
cmp eax, [.max]
jbe .loop
mov [.max], eax
jmp .loop
.end_width:
; here compute the size of the menu and set .width and .height fields.
mov edx, [GUI.iconMenuChecked]
mov eax, [edx+TImage.width]
add eax, [esi+TMenu.__icon_size]
add eax, [.max]
add eax, [GUI.menuMinTextDist]
mov edx, [GUI.menuIconMargin]
lea edx, [3*edx]
add eax, edx
mov edx, [GUI.boxBorderWidth]
lea eax, [eax+2*edx]
.set_width:
set esi, TWindow:width, eax
get ecx, esi, TMenu:LineHeight
get edx, esi, TMenu:Items
mov eax, [edx+TArray.count]
imul eax, ecx
test eax, eax
jnz @f
add eax, ecx
@@:
mov ecx, [GUI.boxBorderWidth]
lea eax, [eax+2*ecx]
mov ecx, [GUI.menuIconMargin]
lea eax, [eax+2*ecx]
set esi, TWindow:height, eax
.finish:
popad
inherited [.value]
return
.switch_off:
xor ecx, ecx
mov eax, [esi+TMenu.__caller]
test eax, eax
jz .set_active
istype eax, TMenu
cmove ecx, eax
je .set_active
; remove capture.
stdcall SetMouseCapture, ecx ; ecx is 0 here!!!
.set_active:
mov [__ActiveMenu], ecx
jmp .finish
endp
method TMenu.Paint
.bounds TBounds
.y dd ?
.yTxt dd ?
.xTxt dd ?
.clTxt dd ?
.line dd ?
.canvas dd ?
; item parameters, depend on the item type.
.text dd ?
.accel dd ?
.icon dd ?
.check dd ?
.enabled dd ?
.subicon dd ?
begin
pushad
mov esi, [.self]
get ebx, esi, TWindow:Canvas
mov [.canvas], ebx
xor eax, eax
mov [.bounds.x], eax
mov [.bounds.y], eax
mov eax, [ebx+TImage.width]
mov ecx, [ebx+TImage.height]
mov [.bounds.width], eax
mov [.bounds.height], ecx
get eax, esi, TMenu:LineHeight
mov [.line], eax
lea eax, [.bounds]
stdcall [DrawBox], [.canvas], eax, [GUI.clMenuBack], [GUI.borderMenu], [GUI.boxBorderWidth]
get edi, esi, TMenu:Items
test edi, edi
jz .end_loop
; compute the text base line.
stdcall GetFontMetrics, [GUI.DefaultFont]
mov ecx, [.line]
sub ecx, eax
lea ecx, [ecx+2*ebx]
sar ecx, 1
mov [.yTxt], ecx
mov ecx, [GUI.boxBorderWidth]
add ecx, [GUI.menuIconMargin]
mov [.y], ecx
add [.yTxt], ecx
mov ecx, [GUI.menuIconMargin]
lea ecx, [3*ecx]
mov eax, [esi+TMenu.__icon_size]
add ecx, eax
add ecx, [GUI.boxBorderWidth]
mov eax, [GUI.iconMenuChecked]
add ecx, [eax+TImage.width]
mov [.xTxt], ecx
xor ecx, ecx
cmp [edi+TArray.count], ecx
je .empty_menu
.loop:
cmp ecx, [edi+TArray.count]
jae .end_loop
lea edx, [edi+TArray.array + 8*ecx] ; pointer to TMenuItem
mov eax, [edx+TMenuItem.type]
cmp eax, mitSeparator
je .draw_separator
cmp eax, mitAction
je .action
cmp eax, mitSubmenu
je .submenu
cmp eax, mitString
jne .next_item
.string:
stdcall StrDup, [edx+TMenuItem.item]
mov [.text], eax
xor eax, eax
mov [.accel], eax
mov [.icon], eax
mov [.check], eax
mov [.subicon], eax
inc eax
mov [.enabled], eax
jmp .draw_background
.submenu:
get eax, [edx+TMenuItem.item], TMenu:Caption
mov [.text], eax
get eax, [edx+TMenuItem.item], TMenu:Enabled
mov [.enabled], eax
mov ebx, [GUI.menuSubIconGray]
test eax, eax
jz @f
mov ebx, [GUI.menuSubIcon]
cmp ecx, [esi+TMenu._selected]
jne @f
mov ebx, [GUI.menuSubIconSel]
@@:
mov [.subicon], ebx
xor eax, eax
mov [.icon], eax
mov [.check], eax
mov [.accel], eax
jmp .draw_background
.action:
mov [.subicon], 0
get eax, [edx+TMenuItem.item], TAction:Caption
mov [.text], eax
get eax, [edx+TMenuItem.item], TAction:AccelStr
mov [.accel], eax
get eax, [edx+TMenuItem.item], TAction:Enabled
mov [.enabled], eax
get eax, [edx+TMenuItem.item], TAction:Icon
mov [.icon], eax
get eax, [edx+TMenuItem.item], TAction:Checked
mov [.check], eax
jmp .draw_background
.draw_separator:
mov eax, [.bounds.x]
mov ebx, [.bounds.width]
mov edx, [GUI.menuIconMargin]
add eax, edx
sub ebx, edx
sub ebx, edx
; stdcall DrawSolidRect, [.canvas], eax, [.y], ebx, 1, $ffff0000
;
; mov edx, [.line]
; add edx, [.y]
; dec edx
;
; stdcall DrawSolidRect, [.canvas], eax, edx, ebx, 1, $ffff0000
mov edx, [.line]
add edx, [.y]
add edx, [.y]
sar edx, 1
stdcall DrawSolidRect, [.canvas], eax, edx, ebx, 1, [GUI.clBorderDark]
inc edx
stdcall DrawSolidRect, [.canvas], eax, edx, ebx, 1, [GUI.clBorderLight]
jmp .next_item
; draw the background
.draw_background:
cmp ecx, [esi+TMenu._selected]
jne .selected_ok
cmp [.enabled], 0
je .selected_ok
stdcall DrawSolidRect, [.canvas], [.bounds.x], [.y], [.bounds.width], [.line], [GUI.clEditSel]
.selected_ok:
; draw the icon
cmp [.icon], 0
je .icon_ok
mov ebx, [GUI.iconMenuChecked]
mov eax, [ebx+TImage.width]
add eax, [GUI.menuIconMargin]
add eax, [GUI.menuIconMargin]
add eax, [GUI.boxBorderWidth] ; x-coordinate
mov ebx, [.icon]
test ebx, ebx
jz .icon_ok
mov edx, [.line]
sub edx, [ebx+TImage.height]
add edx, [.y]
add edx, [.y]
sar edx, 1
stdcall BlendImage, [.canvas], eax, edx, ebx, 0, 0, [ebx+TImage.width], [ebx+TImage.height]
.icon_ok:
; draw the checkbox
cmp [.check], 0
je .draw_text
mov eax, [GUI.menuIconMargin]
add eax, [GUI.boxBorderWidth]
mov ebx, [GUI.iconMenuChecked]
cmp [.enabled], 0
jne .check_ok
mov ebx, [GUI.iconMenuCheckedGray]
.check_ok:
mov edx, [.line]
sub edx, [ebx+TImage.height]
add edx, [.y]
add edx, [.y]
sar edx, 1
stdcall BlendImage, [.canvas], eax, edx, ebx, 0, 0, [ebx+TImage.width], [ebx+TImage.height]
.draw_text:
mov eax, [GUI.clMenuTextGray]
cmp [.enabled], 0
je .txt_color_ok
mov eax, [GUI.clMenuText]
cmp ecx, [esi+TMenu._selected]
jne .txt_color_ok
mov eax, [GUI.clEditSelTxt]
.txt_color_ok:
mov [.clTxt], eax
push eax
push [GUI.DefaultFont]
push [.yTxt]
pushd [.xTxt]
stdcall StrLen, [.text]
push eax
stdcall StrPtr, [.text]
stdcall DrawString, [.canvas], eax ; remaining from the stack
stdcall StrDel, [.text]
; draw the submenu arrow
mov ebx, [.subicon]
test ebx, ebx
jz .draw_accelerator
mov eax, [.bounds.width]
sub eax, [ebx+TImage.width]
sub eax, [GUI.menuIconMargin]
mov edx, [.line]
sub edx, [ebx+TImage.height]
add edx, [.y]
add edx, [.y]
sar edx, 1
stdcall BlendImage, [.canvas], eax, edx, ebx, 0, 0, [ebx+TImage.width], [ebx+TImage.height]
jmp .next_item
; draw the accelerator
.draw_accelerator:
cmp [.accel], 0
je .next_item
stdcall StrPtr, [.accel]
push eax
stdcall GetTextBounds, eax, [eax+string.len], [GUI.DefaultFont]
mov edx, [.bounds.width]
sub edx, [GUI.boxBorderWidth]
sub edx, [GUI.menuIconMargin]
sub edx, eax
pop eax
stdcall DrawString, [.canvas], eax, [eax+string.len], edx, [.yTxt], [GUI.DefaultFont], [.clTxt]
stdcall StrDel, [.accel]
.next_item:
mov eax, [.line]
add [.y], eax
add [.yTxt], eax
inc ecx
jmp .loop
.end_loop:
popad
return
.empty_menu:
stdcall DrawString, [.canvas], "Empty menu", 10, 10, 14, [GUI.DefaultFont], [GUI.clMenuText]
stdcall FilterDisabled, [.canvas], FALSE
jmp .end_loop
endp
method TMenu.Show
begin
pushad
mov esi, [.self]
mov edi, [.parent]
istype edi, TMenu
je .capture_ok
stdcall SetMouseCapture, edi
.capture_ok:
exec edi, TWindow:ClientToScreenXY, [.x], [.y]
mov [esi+TWindow._x], ecx
mov [esi+TWindow._y], edx
mov [esi+TMenu._selected], 0
mov [esi+TMenu.__caller], edi
mov [__ActiveMenu], esi
set esi, TMenu:Visible, TRUE
popad
return
endp
proc AcceleratorToStr, .pFastKey
begin
push ecx edx
mov edx, [.pFastKey]
test edx, edx
jz .empty
mov eax, [edx+TFastKey.key] ; scan code
xor ecx, ecx ; utf8
test eax, eax
js @f
xchg ecx, eax
@@:
and eax, $7fffffff
stdcall CreateKeyName, ecx, eax, [edx+TFastKey.flags]
jnc .finish
.empty:
stdcall StrNew
stc
.finish:
pop edx ecx
return
endp
method TMenu.SetSelected
begin
pushad
mov esi, [.self]
mov ecx, [.value]
cmp ecx, [esi+TMenu._selected]
je .finish
get edi, esi, TMenu:Items
test edi, edi
jz .finish
cmp ecx, [edi+TArray.count]
jae .finish
mov [esi+TMenu._selected], ecx
exec esi, TWindow:Refresh
lea edx, [edi+TArray.array+8*ecx]
cmp [edx+TMenuItem.type], mitSubmenu
jne .hide_old
get eax, [edx+TMenuItem.item], TMenu:Enabled
test eax, eax
jz .finish
get ebx, esi, TMenu:LineHeight
imul ebx, ecx
mov eax, [esi+TMenu._width]
sub eax, [GUI.menuIconMargin]
exec [edx+TMenuItem.item], TMenu:Show, esi, eax, ebx
jmp .finish
.hide_old:
cmp [__ActiveMenu], esi
je .finish
set [__ActiveMenu], TWindow:Visible, FALSE
mov [__ActiveMenu], esi
.finish:
popad
return
endp
method TMenu.EventMouseMove
begin
pushad
mov esi, [.self]
mov ecx, [.x]
mov edx, [.y]
sub ecx, [esi+TMenu._x]
js .check_caller
sub edx, [esi+TMenu._y]
js .check_caller
cmp ecx, [esi+TMenu._width]
jge .check_caller
cmp edx, [esi+TMenu._height]
jge .check_caller
sub edx, [GUI.boxBorderWidth]
js .exit
sub edx, [GUI.menuIconMargin]
js .exit
get ecx, esi, TMenu:LineHeight
mov eax, edx
cdq
idiv ecx
set esi, TMenu:Selected, eax
.exit:
popad
return
.check_caller:
mov esi, [esi+TMenu.__caller]
test esi, esi
jz .exit
istype esi, TMenu
jne .exit
exec esi, TMenu:EventMouseMove, [.x], [.y], [.kbdState]
jmp .exit
endp
method TMenu.EventButtonPress
begin
pushad
mov esi, [.self]
mov ecx, [.x]
mov edx, [.y]
sub ecx, [esi+TMenu._x]
js .check_caller
sub edx, [esi+TMenu._y]
js .check_caller
cmp ecx, [esi+TMenu._width]
jge .check_caller
cmp edx, [esi+TMenu._height]
jge .check_caller
mov ecx, [esi+TMenu._selected]
mov edx, [esi+TMenu._p_items]
cmp ecx, [edx+TArray.count]
jae .finish
lea edi, [edx+TArray.array+8*ecx]
cmp [edi+TMenuItem.type], mitSeparator
je .finish
cmp [edi+TMenuItem.type], mitString
je .finish ; temporary, until I decide what to do with the string items.
cmp [edi+TMenuItem.type], mitSubmenu
je .finish
cmp [edi+TMenuItem.type], mitAction
jne .finish
get eax, [edi+TMenuItem.item], TAction:Enabled
test eax, eax
jz .finish
call .hideall
exec [edi+TMenuItem.item], TAction:Execute, [.self] ; execute the action.
.finish:
popad
return
.check_caller:
set esi, TMenu:Visible, FALSE ; hide the menu
mov esi, [esi+TMenu.__caller]
test esi, esi
jz .finish
istype esi, TMenu
jne .finish
mov [esi+TMenu._selected], -1
exec esi, TMenu:EventMouseMove, [.x], [.y], [.kbdState]
exec esi, TMenu:EventButtonPress, [.button], [.kbdState], [.x], [.y]
jmp .finish
.hideall:
cmp [__ActiveMenu], 0
jne @f
retn
@@:
set [__ActiveMenu], TMenu:Visible, FALSE ; hide the menu
jmp .hideall
endp
endmodule
|
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
| ︙ | ︙ | |||
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
._mxAccess TMutex ; access mutex. Procedures from objects.asm will use it to ensure thread safety.
end if
._OnCreate dd ?
._OnDestroy dd ?
._ptrVar dd ?
; parameters
param .OnCreate, ._OnCreate, ._OnCreate
param .OnDestroy, ._OnDestroy, ._OnDestroy
param .ptrVar, ._ptrVar, ._ptrVar
; methods
| > > > > > > | > | > > < < < | < | < < < < < < < < < < < < < < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 |
._mxAccess TMutex ; access mutex. Procedures from objects.asm will use it to ensure thread safety.
end if
._OnCreate dd ?
._OnDestroy dd ?
._ptrVar dd ?
.__Parent dd ?
.__pChildren dd ? ; pointer to TArray of pointers to children windows.
; parameters
param .Parent, .__Parent, .SetParent
param .Children, .__pChildren, NONE
param .OnCreate, ._OnCreate, ._OnCreate
param .OnDestroy, ._OnDestroy, ._OnDestroy
param .ptrVar, ._ptrVar, ._ptrVar
; methods
method .Create, .parent
method .Destroy
method .SetParent, .value
method .AddChild, .objchild
method .RemoveChild, .objchild
endobj
interface TObject.OnCreate, .self
interface TObject.OnDestroy, .self
method TObject.Create
begin
if defined options.Threads & options.Threads
push eax
mov eax, [.self]
lea eax, [eax+TObject._mxAccess]
stdcall MutexCreate, 0, eax
stdcall MutexRelease, eax
pop eax
end if
set [.self], TWindow:Parent, [.parent]
return
endp
method TObject.Destroy
begin
pushad
mov esi, [.self]
get ecx, esi, TObject:OnDestroy
jecxz .event_ok
push esi
stdcall dword ecx, [.self]
pop esi
.event_ok:
get ecx, esi, TObject:ptrVar
jecxz .varok
mov dword [ecx], 0
.varok:
; destroy all children
get ebx, esi, TWindow:Children
test ebx, ebx
jz .end_children
mov ecx, [ebx+TArray.count]
.loop:
dec ecx
js .end_children
destroy [ebx+TArray.array+4*ecx]
jmp .loop
.end_children:
if defined options.Threads & options.Threads
lea ecx, [esi+TObject._mxAccess]
stdcall MutexDestroy, ecx
end if
popad
return
endp
;_________________________________________________________________________________________
method TObject.AddChild
begin
pushad
mov esi, [.self]
mov ebx, [.objchild]
istype ebx, TObject
jne .not_window
mov edx, [esi+TObject.__pChildren]
test edx, edx
jnz .array_ok
stdcall CreateArray, 4
mov edx, eax
.array_ok:
stdcall AddArrayItems, edx, 1
mov [eax], ebx
mov [esi+TObject.__pChildren], edx
clc
popad
return
.not_window:
stc
popad
return
endp
;_________________________________________________________________________________________
;----------------------------------------------------------------------
; Returns:
; CF = 1 - if the object specified was not found as a window child.
; CF = 0 - the child was removed from the list of childrens.
;----------------------------------------------------------------------
method TObject.RemoveChild
begin
push edx esi
mov esi, [.self]
mov edx, [esi+TObject.__pChildren]
stdcall ListIndexOf, edx, [.objchild]
jc .finish
stdcall DeleteArrayItems, edx, eax, 1
cmp [edx+TArray.count], 0
jne .store
stdcall FreeMem, edx
xor edx, edx
.store:
mov [esi+TObject.__pChildren], edx
clc
.finish:
pop esi edx
return
endp
;_________________________________________________________________________________________
method TObject.SetParent
begin
pushad
mov esi, [.self]
mov edi, [.value]
cmp edi, [esi+TObject.__Parent] ; if the parent is already set to the same value, ignore.
je .finish
cmp [esi+TWindow.__Parent], 0
je .parent_ok
exec [esi+TObject.__Parent], TObject:RemoveChild, esi ; remove the window from the old parent.
mov [esi+TObject.__Parent], edi ; store the new parent.
.parent_ok:
test edi, edi
jz .finish
exec edi, TObject:AddChild, esi
.finish:
mov [esi+TObject.__Parent], edi
popad
return
endp
endmodule
|
| ︙ | ︙ | |||
17 18 19 20 21 22 23 | object TProgress, TWindow ._Pos dd ? ._Max dd ? ._Color dd ? param .Pos, ._Pos, .SetPos param .Max, ._Max, .SetMax | < | > | > > > > > > > > > > > | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
object TProgress, TWindow
._Pos dd ?
._Max dd ?
._Color dd ?
param .Pos, ._Pos, .SetPos
param .Max, ._Max, .SetMax
method .Step
method .SetPos, .value
method .SetMax, .value
method .Create, .pParent
method .Paint
endobj
method TProgress.Create
begin
mov eax, [.self]
mov [eax+TProgress.__want_focus], FALSE
inherited [.pParent]
return
endp
method TProgress.Step
begin
push eax ecx
mov eax, [.self]
mov ecx, [eax+TProgress._Pos]
|
| ︙ | ︙ | |||
83 84 85 86 87 88 89 |
.finish:
pop ecx eax
return
endp
| < < < < < < < < < < < < < < < < < | > | < < < < < | < < < < < < < | < < < < < < | < < < < | > > | 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
.finish:
pop ecx eax
return
endp
method TProgress.Paint
.bounds TBounds
begin
pushad
mov esi, [.self]
exec esi, TWindow:__UpdateCanvas
mov [.bounds.x], 0
mov [.bounds.y], 0
mov eax, [esi+TProgress._width]
mov ecx, [esi+TProgress._height]
mov [.bounds.width], eax
mov [.bounds.height], ecx
lea eax, [.bounds]
stdcall [DrawBox], [esi+TProgress._canvas], eax, [GUI.clProgressBk], [GUI.progressBorder], [GUI.boxBorderWidth]
mov eax, [esi+TProgress._Pos]
mov ecx, [esi+TProgress._Max]
test ecx, ecx
jnz @f
inc ecx
@@:
cmp eax, ecx
jle @f
mov eax, ecx
@@:
imul eax, [.bounds.width]
cdq
idiv ecx
stdcall DrawSolidRect, [esi+TProgress._canvas], [.bounds.x], [.bounds.y], eax, [.bounds.height], [GUI.clProgressBar]
inherited
popad
return
endp
endmodule
|
| ︙ | ︙ | |||
20 21 22 23 24 25 26 | .Pos dd ? ._Drag dd ? ends | | > > > | | > > | | > | > < < > | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > | | > > > > | > > | > > > > | > | > > > > < > | > > | > > > | | | | | | > | | > > > > > > > > > | | > > > > | | | | > > > | | | | | | | > > > | | | > | | | > > | < < | | | > > | > | | | | | | < > | < < > | | | > | | | > | < < | > > < < < < < | < < < | | < < < < < < | < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < | < | < < < < | < | < < | < < < < < | < < < < | < < < < | < < < < < < < < < < < < < < < < < < < < < < < < | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 |
.Pos dd ?
._Drag dd ?
ends
object TScrollbar, TWindow
._HScroller TScrollbar
._VScroller TScrollbar
param .HMax, ._HScroller.Max, ._HScroller.Max
param .HPos, ._HScroller.Pos, ._HScroller.Pos
param .HPage, ._HScroller.Page, ._HScroller.Page
param .VMax, ._VScroller.Max, ._VScroller.Max
param .VPos, ._VScroller.Pos, ._VScroller.Pos
param .VPage, ._VScroller.Page, ._VScroller.Page
method .Paint
method .EventMouseMove, .x, .y, .kbdState
method .EventButtonPress, .button, .kbdState, .x, .y
method .EventButtonRelease, .button, .kbdState, .x, .y
endobj
;_________________________________________________________________________________________
method TScrollWindow.Paint
.canvas dd ?
.recth TBounds
.rectv TBounds
.rectx TBounds
begin
pushad
mov esi, [.self]
exec esi, TWindow:__UpdateCanvas
mov eax, [esi+TWindow._canvas]
mov [.canvas], eax
xor eax, eax
mov [.recth.x], eax
mov [.rectv.y], eax
mov eax, [esi+TWindow._width]
mov edx, [esi+TWindow._height]
sub eax, [scrollWidth]
sub edx, [scrollWidth]
mov [.rectv.x], eax
mov [.recth.y], edx
inc edx
inc eax
mov [.rectx.y], edx
mov [.rectx.x], eax
mov eax, [scrollWidth]
mov [.recth.height], eax
mov [.rectv.width], eax
dec eax
mov [.rectx.width], eax
mov [.rectx.height], eax
mov eax, [esi+TWindow._width]
mov edx, [esi+TWindow._height]
sub eax, [scrollWidth]
sub edx, [scrollWidth]
mov [.recth.width], eax
mov [.rectv.height], edx
lea eax, [.rectx]
stdcall DrawBoxDefault, [.canvas], eax, [clDialogBk], bxNone, 0
lea eax, [.recth]
stdcall DrawBoxDefault, [.canvas], eax, [clScrollBk], bxSunken or bxNoFill, 0
lea eax, [.rectv]
stdcall DrawBoxDefault, [.canvas], eax, [clScrollBk], bxSunken or bxNoFill, 0
lea eax, [esi+TScrollWindow._HScroller]
stdcall _SliderPixels, eax, [.recth.width]
push esi
stdcall DrawSolidRect, [.canvas], [.recth.x], [.recth.y], eax, [.recth.height], [clScrollBk]
mov esi, [.recth.width]
sub esi, eax
sub esi, edx
add eax, [.recth.x]
lea edi, [eax+edx]
stdcall DrawSolidRect, [.canvas], edi, [.recth.y], esi, [.recth.height], [clScrollBk]
pop esi
mov [.rectx.x], eax
mov [.rectx.width], edx
push [.recth.y] [.recth.height]
pop [.rectx.height] [.rectx.y]
lea eax, [.rectx]
stdcall [DrawSlider], [.canvas], eax, [clScrollSlider], sliderHorizontal
lea eax, [esi+TScrollWindow._VScroller]
stdcall _SliderPixels, eax, [.rectv.height]
push esi
stdcall DrawSolidRect, [.canvas], [.rectv.x], [.rectv.y], [.rectv.width], eax, [clScrollBk]
mov esi, [.rectv.height]
sub esi, eax
sub esi, edx
add eax, [.rectv.y]
lea edi, [eax+edx]
stdcall DrawSolidRect, [.canvas], [.rectv.x], edi, [.rectv.width], esi, [clScrollBk]
pop esi
mov [.rectx.y], eax
mov [.rectx.height], edx
push [.rectv.x] [.rectv.width]
pop [.rectx.width] [.rectx.x]
lea eax, [.rectx]
stdcall [DrawSlider], [.canvas], eax, [clScrollSlider], sliderVertical
inherited
popad
return
endp
method TScrollWindow.EventMouseMove
begin
pushad
mov esi, [.self]
stdcall __ScrollSetCursor, esi, [.x], [.y]
lea edi, [esi+TScrollWindow._HScroller]
mov eax, [.x]
mov ecx, [esi+TScrollWindow._width]
mov edx, scrollX
cmp [edi+TScrollbar._Drag], 0
jne .found
lea edi, [esi+TScrollWindow._VScroller]
mov eax, [.y]
mov ecx, [esi+TScrollWindow._height]
mov edx, scrollY
cmp [edi+TScrollbar._Drag], 0
je .continue
.found:
sub ecx, [scrollWidth]
sub eax, 2
sub eax, [edi+TScrollbar._Drag]
stdcall _SetSliderPos, edi, eax, ecx
jc .finish
exec [.self], TWindow:EventScroll, edx, scTrack, [edi+TScrollbar.Pos] ;method .EventScroll, .direction, .command, .value
exec [.self], TWindow:Refresh
.continue:
.finish:
inherited [.x], [.y], [.kbdState]
popad
return
endp
method TScrollWindow.EventButtonPress
begin
pushad
mov esi, [.self]
stdcall __ScrollSetCursor, esi, [.x], [.y]
cmp [.button], mbLeft
jne .finish
stdcall _WhatScrollbar, esi, [.x], [.y]
jc .finish ; not found
; here ecx=height of the scrollbar
; edi= ptr to TScrollbar structure
; ebx= coordinate of the mouse in the scrollbar
stdcall _SliderPixels, edi, ecx
sub ebx, eax
jl .before
cmp ebx, edx
jg .after
; inside the slider - capture the mouse.
mov [edi+TScrollbar._Drag], ebx
stdcall SetMouseCapture, esi
.finish:
inherited [.button], [.kbdState], [.x], [.y]
popad
return
.before:
.after:
popad
return
endp
method TScrollWindow.EventButtonRelease
begin
pushad
mov esi, [.self]
stdcall __ScrollSetCursor, esi, [.x], [.y]
xor eax, eax
mov [esi+TScrollWindow._HScroller._Drag], eax
mov [esi+TScrollWindow._VScroller._Drag], eax
stdcall SetMouseCapture, eax
popad
return
endp
; returns:
; eax - position in pixels
; edx - size in pixels
proc _SliderPixels, .pScrollbar, .length
begin
push ecx esi
mov ecx, [.pScrollbar]
; page size in pixels.
mov esi, [ecx+TScrollbar.Max]
mov eax, [.length]
add esi, [ecx+TScrollbar.Page]
test esi, esi
jz .lengthok
imul [ecx+TScrollbar.Page]
idiv esi
.lengthok:
cmp eax, [minSliderHeight]
jge @f
mov eax, [minSliderHeight]
@@:
cmp eax, [.length]
jle @f
mov eax, [.length]
@@:
push eax
; position in pixels
sub eax, [.length]
mov esi, [ecx+TScrollbar.Max]
test esi, esi
jnz @f
inc esi
@@:
neg eax
mul [ecx+TScrollbar.Pos]
div esi
pop edx ; width
pop esi ecx
return
endp
proc __ScrollSetCursor, .window, .x, .y
begin
pushad
mov esi, [.window]
mov eax, [esi+TWindow._cursor]
stdcall _WhatScrollbar, esi, [.x], [.y]
jc @f
mov eax, mcArrow
@@:
mov [esi+TWindow._cursor], eax
test eax, $ffffff00
jnz @f
stdcall GetStockCursor, eax
@@:
get edx, esi, TWindow:OSWindow
stdcall SetMouseCursor, edx, eax
popad
return
endp
proc _SetSliderPos, .pScrollbar, .x, .lengthpx
begin
push eax ecx edx
mov ecx, [.pScrollbar]
|
| ︙ | ︙ | |||
325 326 327 328 329 330 331 |
.zero:
xor eax, eax
jmp .ok2
endp
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | | 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 |
.zero:
xor eax, eax
jmp .ok2
endp
; returns:
; ecx = height of the scrollbar
; edi = ptr to TScrollbar structure
; ebx = coordinate of the mouse in the scrollbar
;
; CF=1 if the cursor is not in scrollbar
proc _WhatScrollbar, .window, .x, .y
begin
push eax edx esi
mov esi, [.window]
mov eax, [esi+TWindow._width]
mov edx, [esi+TWindow._height]
sub eax, [scrollWidth]
sub edx, [scrollWidth]
cmp [.x], eax
jl .checkh
cmp [.y], edx
jg .notfound ; we are in the dead square.
|
| ︙ | ︙ | |||
455 456 457 458 459 460 461 462 463 464 465 466 467 |
.notfound:
stc
pop esi edx eax
return
endp
endmodule
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 |
.notfound:
stc
pop esi edx eax
return
endp
;;_________________________________________________________________________________________
;
;
;method TScrollWindow.SysEventHandler
; .event TScrollEvent
;begin
; push eax ebx edx esi edi
; mov esi, [.self]
; mov ecx, [.pEvent]
;
; cmp [ecx+TSysEvent.event], seMouseBtnPress
; je .btnpress
;
; cmp [ecx+TSysEvent.event], seMouseBtnRelease
; je .btnrelease
;
; cmp [ecx+TSysEvent.event], seMouseMove
; je .mousemove
;
;.continue:
; inherited [.pEvent]
;
;.finish:
; pop edi esi edx ebx eax
; return
;
;
;;.........................................................................................
;
;.btnpress:
; stdcall __ScrollSetCursor, esi, [ecx+TMouseButtonEvent.x], [ecx+TMouseButtonEvent.y]
;
; cmp [ecx+TMouseButtonEvent.Button], mbLeft
; jne .continue
;
; stdcall _WhatScrollbar, esi, [ecx+TMouseButtonEvent.x], [ecx+TMouseButtonEvent.y]
; jc .continue ; not found
;
;; here ecx=height of the scrollbar
;; edi= ptr to TScrollbar structure
;; ebx= coordinate of the mouse in the scrollbar
;
; stdcall _SliderPixels, edi, ecx
; sub ebx, eax
; jl .before
; cmp ebx, edx
; jg .after
;
;; inside the slider - capture the mouse.
; mov [edi+TScrollbar._Drag], ebx
; stdcall MouseCapture, [esi+TWindow.handle]
; jmp .continue
;
;.before:
;.after:
; jmp .continue
;
;;.........................................................................................
;
;.btnrelease:
; stdcall __ScrollSetCursor, esi, [ecx+TMouseButtonEvent.x], [ecx+TMouseButtonEvent.y]
;
; xor eax, eax
; mov [esi+TScrollWindow._HScroller._Drag], eax
; mov [esi+TScrollWindow._VScroller._Drag], eax
;
; stdcall MouseCapture, eax
; jmp .continue
;
;;.........................................................................................
;
;.mousemove:
; mov ecx, [.pEvent]
; stdcall __ScrollSetCursor, esi, [ecx+TMouseMoveEvent.x], [ecx+TMouseMoveEvent.y]
;
; mov ecx, [.pEvent]
; lea edi, [esi+TScrollWindow._HScroller]
; mov eax, [ecx+TMouseMoveEvent.x]
; mov ecx, [esi+TScrollWindow._width]
; mov [.event.ScrollBar], scrollX
; cmp [edi+TScrollbar._Drag], 0
; jne .found
;
; mov ecx, [.pEvent]
; lea edi, [esi+TScrollWindow._VScroller]
; mov eax, [ecx+TMouseMoveEvent.y]
; mov ecx, [esi+TScrollWindow._height]
; mov [.event.ScrollBar], scrollY
; cmp [edi+TScrollbar._Drag], 0
;
; je .continue
;
;
;.found:
; mov [.event.event], seScroll
; mov [.event.ScrollCmd], scTrack
;
; sub ecx, ScrollBarWidth
; sub eax, 2
; sub eax, [edi+TScrollbar._Drag]
; stdcall _SetSliderPos, edi, eax, ecx
; jc .endmove
;
; mov eax, [edi+TScrollbar.Pos]
; mov [.event.Value], eax
;
; lea eax, [.event]
;
; exec esi, TWindow:SysEventHandler, eax
; jnc .finish
;
;; ?????? Do we need this?
;; execute esi, TScrollWindow.Refresh
;
;.endmove:
; clc
; jmp .finish
;
;endp
;
;
;;_________________________________________________________________________________________
;
;
;method TScrollWindow._RedrawShadow
; .recth TBounds
; .rectv TBounds
; .rectx TBounds
;
; .context dd ?
;begin
; pushad
; mov esi, [.self]
;
; get ebx, esi, TScrollWindow:FreeArea
;
; mov eax, [esi+TScrollWindow._pShadow]
; stdcall AllocateContext, [eax+TBackBuffer.raster]
; mov [.context], eax
;
; mov eax, [ebx+TBounds.x]
; mov edx, [ebx+TBounds.y]
; mov [.recth.x], eax
; mov [.rectv.y], edx
;
; add eax, [ebx+TBounds.width]
; add edx, [ebx+TBounds.height]
; mov [.rectv.x], eax
; mov [.recth.y], edx
;
; inc edx
; inc eax
; mov [.rectx.y], edx
; mov [.rectx.x], eax
;
; mov [.recth.height], ScrollBarWidth
; mov [.rectv.width], ScrollBarWidth
; mov [.rectx.width], ScrollBarWidth-1
; mov [.rectx.height], ScrollBarWidth-1
;
; mov eax, [ebx+TBounds.width]
; mov edx, [ebx+TBounds.height]
; inc eax
; inc edx
; mov [.recth.width], eax
; mov [.rectv.height], edx
;
; lea eax, [.rectx]
; stdcall DrawBoxDefault, [.context], eax, [clDialogBk], bxNone
;
; lea eax, [.recth]
; stdcall [DrawBox], [.context], eax, [clScrollBk], bxSunken or bxNoFill
;
; lea eax, [.rectv]
; stdcall [DrawBox], [.context], eax, [clScrollBk], bxSunken or bxNoFill
;
; lea eax, [esi+TScrollWindow._HScroller]
; stdcall _SliderPixels, eax, [.recth.width]
;
; push esi
; stdcall DrawFillRect, [.context], [.recth.x], [.recth.y], eax, [.recth.height], [clScrollBk]
; mov esi, [.recth.width]
; sub esi, eax
; sub esi, edx
;
; add eax, [.recth.x]
; lea edi, [eax+edx]
; stdcall DrawFillRect, [.context], edi, [.recth.y], esi, [.recth.height], [clScrollBk]
; pop esi
;
; mov [.rectx.x], eax
;
; mov [.rectx.width], edx
; push [.recth.y] [.recth.height]
; pop [.rectx.height] [.rectx.y]
;
; lea eax, [.rectx]
; stdcall [DrawSlider], [.context], eax, [clScrollSlider], sliderHorizontal
;
; lea eax, [esi+TScrollWindow._VScroller]
; stdcall _SliderPixels, eax, [.rectv.height]
;
; push esi
; stdcall DrawFillRect, [.context], [.rectv.x], [.rectv.y], [.rectv.width], eax, [clScrollBk]
; mov esi, [.rectv.height]
; sub esi, eax
; sub esi, edx
;
; add eax, [.rectv.y]
; lea edi, [eax+edx]
; stdcall DrawFillRect, [.context], [.rectv.x], edi, [.rectv.width], esi, [clScrollBk]
; pop esi
;
; mov [.rectx.y], eax
;
; mov [.rectx.height], edx
; push [.rectv.x] [.rectv.width]
; pop [.rectx.width] [.rectx.x]
;
; lea eax, [.rectx]
; stdcall [DrawSlider], [.context], eax, [clScrollSlider], sliderVertical
;
; stdcall ReleaseContext, [.context]
; stc
; popad
; return
;endp
;
;
;
;
;method TScrollWindow.GetFreeArea
;begin
; inherited
;
; sub [eax+TBounds.width], ScrollBarWidth
; jns @f
; mov [eax+TBounds.width], 0
;@@:
; sub [eax+TBounds.height], ScrollBarWidth
; jns @f
; mov [eax+TBounds.height], 0
;@@:
; return
;endp
;
;
;;_________________________________________________________________________________________
;
;
;
;proc _SetSliderPos, .pScrollbar, .x, .lengthpx
;begin
; push eax ecx edx
;
; mov ecx, [.pScrollbar]
; stdcall _SliderPixels, [.pScrollbar], [.lengthpx]
;
; sub [.lengthpx], edx
; jz .zero
;
; mov eax, [ecx+TScrollbar.Max]
; imul [.x]
; idiv [.lengthpx]
;
; cmp eax, 0
; jge .ok
; mov eax, 0
;.ok:
; cmp eax, [ecx+TScrollbar.Max]
; jle .ok2
; mov eax, [ecx+TScrollbar.Max]
;.ok2:
; cmp [ecx+TScrollbar.Pos], eax
; stc
; je @f
; clc
;@@:
; mov [ecx+TScrollbar.Pos], eax
; pop edx ecx eax
; return
;
;.zero:
; xor eax, eax
; jmp .ok2
;endp
;
;
;
;; returns:
;; eax - position in pixels
;; edx - size in pixels
;
;proc _SliderPixels, .pScrollbar, .length
;begin
; push ecx esi
;
; mov ecx, [.pScrollbar]
;
;; page size in pixels.
; mov esi, [ecx+TScrollbar.Max]
; mov eax, [.length]
; add esi, [ecx+TScrollbar.Page]
; test esi, esi
; jz .lengthok
;
; imul [ecx+TScrollbar.Page]
; idiv esi
;
;.lengthok:
; cmp eax, MinScrollBarWidth
; jge @f
; mov eax, MinScrollBarWidth
;@@:
; cmp eax, [.length]
; jle @f
; mov eax, [.length]
;@@:
; push eax
;
;; position in pixels
;
; sub eax, [.length]
; mov esi, [ecx+TScrollbar.Max]
; test esi, esi
; jnz @f
; inc esi
;@@:
; neg eax
; mul [ecx+TScrollbar.Pos]
; div esi
;
; pop edx ; width
;
; pop esi ecx
; return
;endp
;
;
;proc __ScrollSetCursor, .window, .x, .y
;begin
; pushad
;
; mov esi, [.window]
; mov eax, [esi+TWindow._cursor]
; stdcall _WhatScrollbar, esi, [.x], [.y]
; jc @f
;
; mov eax, mcArrow
;@@:
; mov [esi+TWindow._cursor], eax
; test eax, $ffffff00
; jnz @f
; stdcall GetStockCursor, eax
;@@:
; stdcall SetMouseCursor, eax
;
; popad
; return
;endp
;
;
;
;; returns:
;; ecx = height of the scrollbar
;; edi = ptr to TScrollbar structure
;; ebx = coordinate of the mouse in the scrollbar
;;
;; CF=1 if the cursor is not in scrollbar
;
;proc _WhatScrollbar, .window, .x, .y
;begin
; push eax edx esi
;
; mov esi, [.window]
;
;
; mov eax, [.x]
; mov edx, [.y]
;
; mov eax, [esi+TWindow._width]
; mov edx, [esi+TWindow._height]
;
; sub eax, ScrollBarWidth
; sub edx, ScrollBarWidth
;
; cmp [.x], eax
; jl .checkh
;
; cmp [.y], edx
; jg .notfound ; we are in the dead square.
;
;; mouse in vscrollbar
; mov ebx, [.y]
; mov ecx, edx
; lea edi, [esi+TScrollWindow._VScroller]
; jmp .found
;
;.checkh:
; cmp [.y], edx
; jl .notfound ; in the client area
;
;; mouse in hscrollbar
; mov ebx, [.x]
; mov ecx, eax
; lea edi, [esi+TScrollWindow._HScroller]
;
;.found:
; clc
; pop esi edx eax
; return
;
;.notfound:
; stc
; pop esi edx eax
; return
;endp
endmodule
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 |
; _______________________________________________________________________________________
;| |
;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." |
;|_______________________________________________________________________________________|
;
; Description: TScrollWindow object class
;
; Target OS: Any
;
; Dependencies:
;
; Notes: TScrollWindow is window that may have scrollers to scroll the client area.
;_________________________________________________________________________________________
module "TScrollWindow library"
sbkHorizontal = 0
sbkVertical = 1
object TScrollbar, TWindow
._pos dd ?
._page dd ?
._max dd ?
._kind dd ?
._drag_ofs dd ?
._state dd ?
param .Kind, ._kind, .SetKind
param .Pos, ._pos, .SetPos
param .Page, ._page, .SetPage
param .Max, ._max, .SetMax
method .SetKind, .value
method .SetPos, .value
method .SetPage, .value
method .SetMax, .value
method .Paint
method .EventMouseMove, .x, .y, .kbdState
method .EventButtonPress, .button, .kbdState, .x, .y
method .EventButtonRelease, .button, .kbdState, .x, .y
method .EventMouseEnter
method .EventMouseLeave
endobj
;_________________________________________________________________________________________
method TScrollbar.SetKind ;, .value
begin
mov eax, [.self]
push [.value]
pop [eax+TScrollbar._kind]
exec eax, TScrollbar:Refresh
return
endp
;_________________________________________________________________________________________
method TScrollbar.SetPos ;, .value
begin
push eax ecx
mov ecx, [.self]
mov eax, [.value]
cmp eax, [ecx+TScrollbar._pos]
je .finish
mov [ecx+TScrollbar._pos], eax
exec ecx, TScrollbar:Refresh
.finish:
pop ecx eax
return
endp
;_________________________________________________________________________________________
method TScrollbar.SetPage ;, .value
begin
push eax ecx
mov ecx, [.self]
mov eax, [.value]
cmp eax, [ecx+TScrollbar._page]
je .finish
mov [ecx+TScrollbar._page], eax
exec ecx, TScrollbar:Refresh
.finish:
pop ecx eax
return
endp
;_________________________________________________________________________________________
method TScrollbar.SetMax ;, .value
begin
push eax ecx
mov ecx, [.self]
mov eax, [.value]
cmp eax, [ecx+TScrollbar._max]
je .finish
mov [ecx+TScrollbar._max], eax
exec ecx, TScrollbar:Refresh
.finish:
pop ecx eax
return
endp
;_________________________________________________________________________________________
method TScrollbar.Paint
.canvas dd ?
.rect TBounds
begin
pushad
mov esi, [.self]
get ebx, esi, TScrollbar:Canvas
xor eax, eax
mov ecx, [ebx+TImage.width]
mov edx, [ebx+TImage.height]
mov [.rect.x], eax
mov [.rect.y], eax
mov [.rect.width], ecx
mov [.rect.height], edx
mov edi, [esi+TScrollbar._state]
stdcall DrawSolidRect, ebx, eax, eax, [ebx+TImage.width], [ebx+TImage.height], [GUI.clScrollBk+4*edi]
mov ecx, [esi+TScrollbar._kind]
mov edx, [esi+TScrollbar._width + 4*ecx] ; sbkHorizontal = 0; sbkVertical = 1
stdcall _SliderPixels, esi, edx
mov [.rect.x + 4*ecx], eax
mov [.rect.width + 4*ecx], edx
lea eax, [.rect]
stdcall DrawBoxDefault, ebx, eax, [GUI.clScrollSlider+4*edi], [GUI.borderScroll], [GUI.boxBorderWidth]
inherited
popad
return
endp
method TScrollbar.EventMouseMove
begin
pushad
mov esi, [.self]
mov edx, [esi+TScrollbar._kind]
cmp [esi+TScrollbar._drag_ofs], 0
je .finish
mov eax, [.x + 4*edx]
mov ecx, [esi+TScrollbar._width + 4*edx]
sub eax, [edi+TScrollbar._drag_ofs]
stdcall _SetSliderPos, edi, eax, ecx
jc .finish
get eax, esi, TWindow:Parent
exec eax, TWindow:EventScroll, edx, scTrack, [edi+TScrollbar._pos] ;method .EventScroll, .direction, .command, .value
exec esi, TWindow:Refresh
.finish:
inherited [.x], [.y], [.kbdState]
popad
return
endp
method TScrollbar.EventButtonPress
begin
pushad
cmp [.button], mbLeft
jne .finish
mov esi, [.self]
mov ebx, [esi+TScrollbar._kind]
stdcall _SliderPixels, esi, [esi+TScrollbar._width + 4*ebx]
mov edi, [.x+ 4*ebx]
sub edi, eax
jl .before
cmp edi, edx
jg .after
; inside the slider - capture the mouse.
mov [esi+TScrollbar._drag_ofs], edi
stdcall SetMouseCapture, esi
.finish:
inherited [.button], [.kbdState], [.x], [.y]
popad
return
.before:
.after:
jmp .finish
endp
method TScrollbar.EventButtonRelease
begin
pushad
mov esi, [.self]
xor eax, eax
mov [esi+TScrollbar._drag_ofs], eax
stdcall SetMouseCapture, eax
popad
return
endp
; returns:
; eax - position in pixels
; edx - size in pixels
proc _SliderPixels, .pScrollbar, .length
begin
push ecx esi
mov ecx, [.pScrollbar]
; page size in pixels.
mov esi, [ecx+TScrollbar._max]
mov eax, [.length]
add esi, [ecx+TScrollbar._page]
test esi, esi
jz .lengthok
imul [ecx+TScrollbar._page]
idiv esi
.lengthok:
cmp eax, [GUI.minSliderHeight]
jge @f
mov eax, [GUI.minSliderHeight]
@@:
cmp eax, [.length]
jle @f
mov eax, [.length]
@@:
push eax
; position in pixels
sub eax, [.length]
mov esi, [ecx+TScrollbar._max]
test esi, esi
jnz @f
inc esi
@@:
neg eax
mul [ecx+TScrollbar._pos]
div esi
pop edx ; width
pop esi ecx
return
endp
proc _SetSliderPos, .pScrollbar, .x, .lengthpx
begin
push eax ecx edx
mov ecx, [.pScrollbar]
stdcall _SliderPixels, [.pScrollbar], [.lengthpx]
sub [.lengthpx], edx
jz .zero
mov eax, [ecx+TScrollbar._max]
imul [.x]
idiv [.lengthpx]
cmp eax, 0
jge .ok
mov eax, 0
.ok:
cmp eax, [ecx+TScrollbar._max]
jle .ok2
mov eax, [ecx+TScrollbar._max]
.ok2:
cmp [ecx+TScrollbar._pos], eax
stc
je @f
clc
@@:
mov [ecx+TScrollbar._pos], eax
pop edx ecx eax
return
.zero:
xor eax, eax
jmp .ok2
endp
method TScrollbar.EventMouseEnter
begin
mov eax, [.self]
mov [eax+TScrollbar._state], 1
exec eax, TWindow:Refresh
inherited
return
endp
method TScrollbar.EventMouseLeave
begin
mov eax, [.self]
mov [eax+TScrollbar._state], 0
exec eax, TWindow:Refresh
inherited
return
endp
endmodule
|
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | ; Target OS: Any ; ; Dependencies: ; Notes: ;_________________________________________________________________________________________ module "TreeView library" | < < < < < < < < | > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | > > > > | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > | > > > | > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > | > > > > > > > > > | > > > > > > > > > > > > | > > | > > > > | > | > > > > > > | > > | > > | > > > > > > > > > > > | > > > > > > | > | > > > | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | > > > > > > > > > > > > > > > > > > | > > > | > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 |
; Target OS: Any
;
; Dependencies:
; Notes:
;_________________________________________________________________________________________
module "TreeView library"
; tree-view item state flags.
tvisExpanded = 1
tvisSelected = 2
; iterate visible items flags
iifViewport = 1 ; iterate only items that are in the viewport of the control.
; if not set, the items that are "visible" because of the expanded parent items
; will cause callback call as well.
; TTreeView:HitTest return flags
tvhtNone = 0
tvhtExpandIcon = 1
tvhtItemIcon = 2
tvhtItemText = 3
struct TTreeViewItem
.level dd ? ; the level of the element in the tree.
.caption dd ? ; hString of the name.
.state dd ? ; one or more state flags.
.imgNormal dd ? ; index to the icon for normal state
.iSelected dd ? ; index to the icon for selected state
.UserData dd ? ; the user data attached to the item.
align 32
.shift = 5
ends
object TTreeView, TWindow
._items dd ? ; TArray with TTreeViewItem elements.
._index dd ? ; TArray with dword index to the displayable items of ._items array.
._start_view dd ? ; in the index array.
._focused dd ?
._line_height dd ?
._text_offset dd ?
._margin_top dd ?
._margin_left dd ?
.YScroller dd ?
._on_focused_change dd ?
param .StartView, ._start_view, .SetStartView
param .OnFocusItem, ._on_focused_change, ._on_focused_change
param .FocusedItem, ._focused, .SetFocused
method .SetStartView, .value
method .SetFocused, .value
method .Create, .parent
method .Destroy
method .ClearSelection, .mask
method .IterateVisibleItems, .start_item, .flags, .callback, .user
method .HitTest, .x, .y
method .__UpdateCanvas
method .__RebuildIndex
method .Paint
method .EventKeyPress, .utf8, .scancode, .kbdState
method .EventButtonPress, .button, .kbdState, .x, .y
method .EventScroll, .direction, .command, .value
endobj
interface TTreeView.IterateCallback, .pTreeView, .pItem, .yItem, .user
interface TTreeView.OnFocusItem, .pTreeView, .pItem
method TTreeView.Create ; .parent
begin
pushad
mov esi, [.self]
stdcall CreateArray, sizeof.TTreeViewItem
mov [esi+TTreeView._items], eax
stdcall CreateArray, 4
mov [esi+TTreeView._index], eax
mov [esi+TTreeView._margin_top], 4
mov [esi+TTreeView._margin_left], 4
stdcall GetFontMetrics, [GUI.DefaultFont]
add eax, 4
add ebx, 2
mov [esi+TTreeView._line_height], eax
mov [esi+TTreeView._text_offset], ebx
create edi, TScrollbar, [.self]
set edi, TScrollbar:Kind, sbkVertical
set edi, TScrollbar:width, [GUI.scrollWidth]
mov [esi+TTreeView.YScroller], edi
mov [esi+TTreeView.__want_focus], 1
inherited [.parent]
popad
return
endp
method TTreeView.Destroy
begin
push ebx
mov ebx, [.self]
set ebx, TTreeView:Visible, FALSE ; in order to not try to update the view.
stdcall FreeMem, [ebx+TTreeView._index]
stdcall FreeMem, [ebx+TTreeView._items]
pop ebx
inherited
return
endp
method TTreeView.__UpdateCanvas
.count dd ?
begin
inherited
pushad
; now update the scroller size and position.
mov esi, [.self]
mov ecx, [esi+TTreeView._width]
mov edx, [esi+TTreeView._height]
mov eax, ecx
sub eax, [GUI.scrollWidth]
sub eax, [GUI.boxBorderWidth]
sub edx, [GUI.boxBorderWidth]
sub edx, [GUI.boxBorderWidth]
js .finish
set [esi+TTreeView.YScroller], TScrollbar:x, eax
set [esi+TTreeView.YScroller], TScrollbar:y, [GUI.boxBorderWidth]
set [esi+TTreeView.YScroller], TScrollbar:height, edx
mov eax, [esi+TTreeView._height]
mov ecx, [esi+TTreeView._line_height]
cdq
div ecx
test eax, eax
jz @f
inc eax
@@:
mov ebx, [esi+TTreeView._index]
test ebx, ebx
jz .finish
mov ebx, [ebx+TArray.count]
sub ebx, eax
inc ebx
set [esi+TTreeView.YScroller], TScrollbar:Page, eax
set [esi+TTreeView.YScroller], TScrollbar:Max, ebx
cmp eax, ebx
setl al
movzx eax, al
set [esi+TTreeView.YScroller], TScrollbar:Visible, eax
.finish:
popad
return
endp
method TTreeView.__RebuildIndex
begin
pushad
mov esi, [.self]
mov ecx, [esi+TTreeView._index]
jecxz @f
stdcall FreeMem, ecx
@@:
stdcall CreateArray, 4
mov [esi+TTreeView._index], eax
xor eax, eax
lea edx, [esi+TTreeView._index]
exec esi, TTreeView:IterateVisibleItems, eax, eax, TTreeView.__AddIndex, edx
popad
return
endp
proc TTreeView.__AddIndex as TTreeView.IterateCallback
begin
mov esi, [.pTreeView]
mov esi, [esi+TTreeView._items]
lea esi, [esi+TArray.array]
mov edi, [.user]
mov ebx, [.pItem]
sub ebx, esi
shr ebx, TTreeViewItem.shift
stdcall AddArrayItems, [edi], 1
mov [edi], edx
mov [eax], ebx
clc
return
endp
method TTreeView.Paint
.bounds TBounds
.end_item dd ?
begin
pushad
mov esi, [.self]
get ebx, esi, TWindow:Canvas
xor eax, eax
mov [.bounds.x], eax
mov [.bounds.y], eax
mov ecx, [esi+TTreeView._width]
mov edx, [esi+TTreeView._height]
mov [.bounds.width], ecx
mov [.bounds.height], edx
lea eax, [.bounds]
stdcall [DrawBox], [esi+TTreeView._canvas], eax, [GUI.clTreeViewBack], bxNone, 0
mov eax, [esi+TTreeView._items]
mov ebx, [eax+TArray.count]
shl ebx, TTreeViewItem.shift
lea ebx, [eax+TArray.array+ebx]
mov [.end_item], ebx
mov edi, [esi+TTreeView._index]
mov ecx, [esi+TTreeView._start_view]
mov edx, [esi+TTreeView._margin_top]
.loop:
cmp ecx, [edi+TArray.count]
jae .end_paint
mov eax, [edi+TArray.array + 4*ecx]
shl eax, TTreeViewItem.shift
add eax, [esi+TTreeView._items]
add eax, TArray.array
xor ebx, ebx
cmp ecx, [esi+TTreeView._focused]
sete bl
push ebx ; .focused argument
lea ebx, [eax+sizeof.TTreeViewItem]
cmp ebx, [.end_item]
jb @f
xor ebx, ebx
@@:
stdcall TTreeView.__PaintOneItem, esi, eax, ebx, [esi+TTreeView._line_height], [esi+TTreeView._line_height], edx ; the last argument from the stack.
inc ecx
add edx, [esi+TTreeView._line_height]
cmp edx, [esi+TTreeView._height]
jb .loop
.end_paint:
lea eax, [.bounds]
mov ecx, [GUI.tvBorder]
or ecx, bxNoFill
stdcall [DrawBox], [esi+TTreeView._canvas], eax, [GUI.clTreeViewBack], ecx, [GUI.boxBorderWidth]
inherited
popad
return
endp
proc TTreeView.__PaintOneItem, .pTreeView, .pItem, .pNextItem, .hsize, .vsize, .y, .focused
.back dd ?
.text dd ?
begin
pushad
mov edx, [.y]
mov esi, [.pItem]
mov edi, [.pTreeView]
mov ecx, [esi+TTreeViewItem.level]
imul ecx, [.hsize]
add ecx, [edi+TTreeView._margin_left] ; left margin.
mov eax, [GUI.clTreeViewText]
mov ebx, [GUI.clTreeViewBack]
test [esi+TTreeViewItem.state], tvisSelected
jz @f
mov eax, [GUI.clTreeSelectedTxt]
mov ebx, [GUI.clTreeSelected]
@@:
cmp [.focused], 0
je @f
mov eax, [GUI.clTreeFocusedTxt]
mov ebx, [GUI.clTreeFocused]
@@:
mov [.text], eax
mov [.back], ebx
; draw state icon
mov eax, [.pNextItem]
test eax, eax
jz .state_icon_ok
mov eax, [eax+TTreeViewItem.level]
cmp eax, [esi+TTreeViewItem.level]
jle .state_icon_ok
mov ebx, [esi+TTreeViewItem.state]
and ebx, tvisExpanded
mov ebx, [GUI.tvIcons+8*ebx] ; TImage with the expand/collapse icon
push ecx edx
; center the icon
mov eax, [edi+TTreeView._line_height]
sub eax, [ebx+TImage.width]
sar eax, 1
add ecx, eax
mov eax, [edi+TTreeView._line_height]
sub eax, [ebx+TImage.height]
sar eax, 1
add edx, eax
;.draw_state:
stdcall BlendImage, [edi+TTreeView._canvas], ecx, edx, ebx, 0, 0, [ebx+TImage.width], [ebx+TImage.height]
pop edx ecx
.state_icon_ok:
add ecx, [.hsize]
; draw item icon
mov ebx, [esi+TTreeViewItem.imgNormal]
test ebx, ebx
jz .icon_ok
push ecx edx
; center the icon
mov eax, [edi+TTreeView._line_height]
sub eax, [ebx+TImage.width]
sar eax, 1
add ecx, eax
mov eax, [edi+TTreeView._line_height]
sub eax, [ebx+TImage.height]
sar eax, 1
add edx, eax
stdcall BlendImage, [edi+TTreeView._canvas], ecx, edx, ebx, 0, 0, [ebx+TImage.width], [ebx+TImage.height]
pop edx ecx
add ecx, [edi+TTreeView._line_height]
.icon_ok:
push edx
stdcall StrPtr, [esi+TTreeViewItem.caption]
stdcall GetTextBounds, eax, [eax+string.len], [GUI.DefaultFont]
pop edx
add eax, 4
stdcall DrawSolidRect, [edi+TTreeView._canvas], ecx, edx, eax, [.vsize], [.back]
add edx, [edi+TTreeView._text_offset]
add ecx, 2
stdcall StrPtr, [esi+TTreeViewItem.caption]
stdcall DrawString, [edi+TTreeView._canvas], eax, [eax+string.len], ecx, edx, [GUI.DefaultFont], [.text]
popad
return
endp
method TTreeView.EventKeyPress ;, .utf8, .scancode, .kbdState
begin
pushad
mov esi, [.self]
mov eax, [.utf8]
test eax, eax
jz .no_char
; search the treeview???
popad
return
.no_char:
mov eax, [.scancode]
cmp eax, keyUpNumpad
je .up
cmp eax, keyUp
je .up
cmp eax, keyDownNumpad
je .down
cmp eax, keyDown
je .down
cmp eax, keyPgUpNumpad
je .pgup
cmp eax, keyPgUp
je .pgup
cmp eax, keyPgDnNumpad
je .pgdn
cmp eax, keyPgDown
je .pgdn
popad
return
.up:
mov edx, 1
jmp .moveup
.pgup:
get edx, [esi+TTreeView.YScroller], TScrollbar:Page
dec edx
.moveup:
mov ebx, [esi+TTreeView._focused]
test [.kbdState], maskShift
jnz .sel_up_ok
exec esi, TTreeView:ClearSelection, not tvisSelected
.sel_up_ok:
sub ebx, edx
jns @f
xor ebx, ebx
@@:
set esi, TTreeView:FocusedItem, ebx
cmp ebx, [esi+TTreeView._start_view]
jae .refresh
set esi, TTreeView:StartView, ebx
jmp .finish
.refresh:
exec esi, TTreeView:Refresh
.finish:
popad
return
.down:
mov edx, 1
jmp .move_down
.pgdn:
get edx, [esi+TTreeView.YScroller], TScrollbar:Page
dec edx
.move_down:
mov edi, [esi+TTreeView._index]
mov ebx, [esi+TTreeView._focused]
add ebx, edx
cmp ebx, [edi+TArray.count]
jb .posok
mov ebx, [edi+TArray.count]
dec ebx
.posok:
test [.kbdState], maskShift
jnz .sel_dn_ok
exec esi, TTreeView:ClearSelection, not tvisSelected
.sel_dn_ok:
set esi, TTreeView:FocusedItem, ebx
get ecx, [esi+TTreeView.YScroller], TScrollbar:Page
sub ecx, 2
sub ebx, ecx
cmp ebx, [esi+TTreeView._start_view]
jle .refresh
set esi, TTreeView:StartView, ebx
jmp .finish
endp
method TTreeView.EventButtonPress ;, .button, .kbdState, .x, .y
begin
pushad
mov esi, [.self]
exec esi, TTreeView:HitTest, [.x], [.y]
cmp eax, tvhtNone
je .finish2
cmp eax, tvhtExpandIcon
je .expand_collapse
test [.kbdState], maskCtrl
jnz @f
exec esi, TTreeView:ClearSelection, not tvisSelected
@@:
set esi, TTreeView:FocusedItem, ecx
jmp .finish
.expand_collapse:
xor [edx+TTreeViewItem.state], tvisExpanded
exec esi, TTreeView:__RebuildIndex
.finish:
exec [.self], TWindow:Refresh
.finish2:
popad
return
endp
method TTreeView.EventScroll
begin
pushad
mov esi, [.self]
cmp [.command], scWheelUp
je .scrollup
cmp [.command], scWheelDn
je .scrolldn
cmp [.command], scTrack
jne .finish
set esi, TTreeView:StartView, [.value]
.finish:
popad
return
.scrollup:
get eax, esi, TTreeView:StartView
dec eax
jns @f
xor eax, eax
@@:
set esi, TTreeView:StartView, eax
jmp .finish
.scrolldn:
get ecx, [esi+TTreeView.YScroller], TScrollbar:Max
get eax, esi, TTreeView:StartView
inc eax
cmp eax, ecx
jbe @f
dec eax
@@:
set [.self], TTreeView:StartView, eax
jmp .finish
return
endp
method TTreeView.SetStartView ;, .value
begin
pushad
mov esi, [.self]
mov ebx, [.value]
mov [esi+TTreeView._start_view], ebx
set [esi+TTreeView.YScroller], TScrollbar:Pos, ebx
exec [.self], TWindow:Refresh
popad
return
endp
method TTreeView.IterateVisibleItems
.end dd ?
.min_item dd ?
.maxy dd ?
begin
pushad
mov esi, [.self]
mov eax, [esi+TTreeView._height]
mov [.maxy], eax
mov eax, [esi+TTreeView._items]
mov eax, [eax+TArray.count]
mov ecx, [.start_item]
mov edx, [esi+TTreeView._start_view]
shl eax, TTreeViewItem.shift
shl ecx, TTreeViewItem.shift
shl edx, TTreeViewItem.shift
add eax, [esi+TTreeView._items]
add ecx, [esi+TTreeView._items]
add edx, [esi+TTreeView._items]
lea eax, [eax+TArray.array]
lea ecx, [ecx+TArray.array]
lea edx, [edx+TArray.array]
mov [.end], eax
mov [.min_item], edx
xor edx, edx
dec edx ; current level = $ffffffff - unsigned cmp
xor edi, edi ; current Y coordinate.
add edi, [esi+TTreeView._margin_top] ; top margin.
.item_loop:
cmp ecx, [.end]
jae .end_items
cmp [ecx+TTreeViewItem.level], edx
ja .next_item
je .equal
; below
mov edx, [ecx+TTreeViewItem.level]
.equal:
test [ecx+TTreeViewItem.state], tvisExpanded
jz .visible
inc edx
.visible:
test [.flags], iifViewport
jz .yes
cmp ecx, [.min_item]
jb .next_item
cmp edi, [.maxy]
ja .end_items
.yes:
pushad
stdcall [.callback], esi, ecx, edi, [.user]
popad
jc .found
add edi, [esi+TTreeView._line_height]
.next_item:
add ecx, sizeof.TTreeViewItem
jmp .item_loop
.end_items:
clc
popad
return
.found:
mov [esp+regEAX*4], ecx
popad
return
endp
method TTreeView.HitTest
.index dd ?
begin
pushad
mov esi, [.self]
mov eax, [.y]
sub eax, [esi+TTreeView._margin_top]
xor edx, edx
mov ecx, [esi+TTreeView._line_height]
mov [.index], edx
div ecx
add eax, [esi+TTreeView._start_view]
mov ebx, [esi+TTreeView._index]
cmp eax, [ebx+TArray.count]
jae .not_found
mov [.index], eax
mov edi, [ebx+4*eax+TArray.array] ; index
mov ebx, [esi+TTreeView._items]
cmp edi, [ebx+TArray.count]
jae .not_found
shl edi, TTreeViewItem.shift
lea edi, [ebx+TArray.array + edi] ; edi - pointer to the pointed item.
mov edx, [edi+TTreeViewItem.level]
imul edx, [esi+TTreeView._line_height]
add edx, [esi+TTreeView._margin_left]
cmp [.x], edx
jb .finish
add edx, [esi+TTreeView._line_height]
mov eax, tvhtExpandIcon
cmp [.x], edx
jb .finish
add edx, [esi+TTreeView._line_height]
mov eax, tvhtItemIcon
cmp [.x], edx
jb .finish
mov eax, tvhtItemText
.finish:
mov [esp+regEDX*4], edi
mov [esp+regEAX*4], eax
mov eax, [.index]
mov [esp+regECX*4], eax
popad
return
.not_found:
xor edi, edi
mov eax, tvhtNone
jmp .finish
endp
method TTreeView.ClearSelection
begin
pushad
mov esi, [.self]
mov esi, [esi+TTreeView._items]
lea edi, [esi+TArray.array]
mov ecx, [esi+TArray.count]
mov ebx, [.mask]
.loop:
dec ecx
js .finish
and [edi+TTreeViewItem.state], ebx
add edi, sizeof.TTreeViewItem
jmp .loop
.finish:
popad
return
endp
method TTreeView.SetFocused ;, .value
begin
pushad
mov esi, [.self]
mov edi, [esi+TTreeView._items]
mov ecx, [.value]
cmp [esi+TTreeView._focused], ecx
je .finish
mov [esi+TTreeView._focused], ecx
xor ebx, ebx
cmp ecx, [edi+TArray.count]
jae .no_selection
shl ecx, TTreeViewItem.shift
lea ebx, [edi+TArray.array+ecx]
or [ebx+TTreeViewItem.state], tvisSelected
.no_selection:
mov eax, [esi+TTreeView._on_focused_change]
test eax, eax
jz .finish
stdcall eax, esi, ebx ; interface TTreeView.OnFocusItem, .pTreeView, .pItem
.finish:
popad
return
endp
endmodule
|
| ︙ | ︙ | |||
11 12 13 14 15 16 17 18 | ; ; Notes: TWindow is the common ancestor of all visible on the screen controls. ; This file contains only OS independent part of the library and includes ; the OS dependent files. ;_________________________________________________________________________________________ module "TWindow library" | > > | | > > > > > > > | > > > > > | > > > > | > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | > > | > > > > | > | > | > > | > > > | > > | > | > > > > > > | | | > | | | | > > | > | > > > > | > > | > > > > > > > > > > > > > > > > > | > > | > | | | | | | | | | | | | > > > > > > > > > > > > > > > > > | > | > > | | > > | > > > | > > > | > > | > | > | | > | > | > < < < > < | < | | < | < | > | > > > > > | > > | > > > | > | > > > > > > > > > > > > > > > > > > > > > > < < < < < < < < < < < < < < < < < < < < > > | > > | > > | | | | | | > | > | | < > > | > | < | | > | | > | | > > > | > | > > > > > > > > > > > > > | | | > | | > | | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 |
;
; Notes: TWindow is the common ancestor of all visible on the screen controls.
; This file contains only OS independent part of the library and includes
; the OS dependent files.
;_________________________________________________________________________________________
module "TWindow library"
; Interfaces for the OS dependent procedures
; NOTICE: Some of them are not needed, so can be removed.
;-----------------------------------------------------------------------------------------
; Creates OS window, according to the content of TWindow structure [.pWindow]
;
; Notice, that this OS windows are created ONLY for the visible top level windows.
;
;-----------------------------------------------------------------------------------------
interface _CreateWindow, .pWindow
;-----------------------------------------------------------------------------------------
; Destroy the OS window. The OS windows are actually destroyed when invisible and then
; recreated when needed.
;-----------------------------------------------------------------------------------------
interface _DestroyWindow, .hwnd
;-----------------------------------------------------------------------------------------
; Converts the client coordinates to screen coordinates.
;-----------------------------------------------------------------------------------------
interface _ClientToScreen, .hwnd, .x, .y
;-----------------------------------------------------------------------------------------
; Changes the visibility of the window.
;-----------------------------------------------------------------------------------------
interface _ShowWindow, .hwnd, .flag
interface _RefreshWindowRect, .hwnd, .x, .y, .width, .height
interface _SetWindowTextUtf8, .hwnd, .ptrUtf8
interface _SetModalTowards, .hwnd, .hwndParent
interface _FinalizeModal, .hwnd, .hwndParent
interface _GetWindowStruct, .hwin
interface _SetWindowStruct, .hwin, .value
; probably not needed, but will keep them for some time.
;interface _SetWindowBorder, .hwnd, .brdType
;interface _GetWindowBounds, .hwnd, .pBounds
;interface _SetWindowBounds, .hwnd, .pBounds
;interface _CreateNullWindow
;interface _GetParent, .hwnd
;interface _GetChildren, .hwnd
;interface _GetVisible, .hwnd
;interface _SetFocus, .hwnd
;interface _AddChild, .hwnd, .child
;interface _GetWindowTextUtf8, .hwnd, .ptrUtf8
;interface _EnableWindow, .hwnd, .flag
;interface _SetTransientTowards, .hwnd, .hwndParent
include '%TargetOS%/windows.asm'
; Border kind of window.
borderNone = 0
borderFull = 1
borderModal = 2
borderToolbox = 3
object TWindow, TObject
.handle dd ? ; it is handle to the system provided window.
._x dd ?
._y dd ?
._width dd ?
._height dd ?
._border dd ? ; has meaning only for the top level windows!
._visible dd ?
._cursor dd ? ; mouse cursor.
._caption dd ? ; string handle with window caption.
._enabled dd ?
.__want_focus dd ?
.__action dd ?
.__main dd ? ; this is the window that is main for this window. has meaning only for top level windows.
; window canvas
._screen dd ? ; TImage containing the image of the window with all children composited.
._invalid_rect RECT ; the rectangle that need to be repainted.
._canvas dd ? ; TImage containing the image of the window only.
._screen_invalid dd ?
._canvas_invalid dd ?
; window user event handlers
._OnPaint dd ?
._OnScroll dd ?
._OnKeyPressed dd ?
; parameters
param .OSWindow, .GetOSWindow, NONE ; the first window down the tree, that has window handle.
param .Action, .__action, .SetAction
param .x, ._x, ._x
param .y, ._y, ._y
param .width, ._width, .SetWidth
param .height, ._height, .SetHeight
param .border, ._border, ._border
param ._MainWindow, .__main, .__main
param .Cursor, ._cursor, ._cursor
param .Visible, ._visible, .SetVisible
param .Caption, .GetCaption, .SetCaption
param .Enabled, .GetEnabled, .SetEnabled
param .GlobalEnabled, .GetGlobalEnabled, NONE
param .WantFocus, .__want_focus, NONE
param .ImgScreen, .GetImgScreen, NONE
param .Canvas, .GetCanvas, NONE
param .OnPaint, ._OnPaint, .SetOnPaint
param .OnScroll, ._OnScroll, ._OnScroll
param .OnKeyPressed, ._OnKeyPressed, ._OnKeyPressed
param .SplitCell, NONE, .SetSplitCell
; private methods
method .__UpdateHandle
method .__UpdateFocus
method .__UpdateCanvas
method .__UpdateScreen
; parameter methods
method .SetParent, .value
method .SetAction, .value
method .UpdateAction, .action ; to be defined only for controls that can be attached to TAction
method .SetWidth, .value
method .SetHeight, .value
method .GetEnabled
method .SetEnabled, .value
method .GetGlobalEnabled
method .GetCaption
method .SetCaption, .value
method .SetVisible, .value
method .SetOnPaint, .value
method .SetSplitCell, .value
method .GetImgScreen
method .GetCanvas
method .GetOSWindow
; other methods
method .Create, .parent
method .Destroy
; Parent/child methods definitions of abstract methods, inherited from TObject
method .ChildByXY, .x, .y, .onlyenabled
method .RectChanged, .pRect ; invalidates the rectangle, so all children windows in this rectangle are
; to be redrawn. Called from the children window on any visual changes.
; notice, that if the child changed the size ot position, it needs special
; processing of the rectangle. Actually the changed rectangle is the
; bounding rectangle of the new and old rectangles.
method .ClientToScreenXY, .x, .y
; Painting methods
method .Paint ; Paints itself on the .Canvas TImage
method .Refresh
method .Update
method .RefreshAll
; System event methods
method .EventFocusIn
method .EventFocusOut
method .EventResize, .newWidth, .newHeight
method .EventMove, .newX, .newY
method .EventMouseEnter
method .EventMouseLeave
method .EventMouseMove, .x, .y, .kbdState
method .EventButtonPress, .button, .kbdState, .x, .y
method .EventButtonRelease, .button, .kbdState, .x, .y
method .EventScroll, .direction, .command, .value
method .EventKeyPress, .utf8, .scancode, .kbdState
method .EventKeyRelease, .scancode, .kbdState
method .CloseRequest, .reason
endobj
interface TWindow.OnPaint, .self, .canvas
interface TWindow.OnScroll, .self, .direction, .command, .value
interface TWindow.OnKeyPressed, .self, .utf8, .scancode, .kbdState
; OS independent code.
;_________________________________________________________________________________________
method TWindow.Create
begin
inherited [.parent]
set [.self], TWindow:Enabled, TRUE
set [.self], TWindow:Cursor, mcArrow
set [.self], TWindow:border, borderFull
return
endp
;_________________________________________________________________________________________
method TWindow.Destroy
begin
pushad
mov esi, [.self]
; hide the window, destroy the handle and remove the focus.
mov [esi+TWindow._visible], 0
exec esi, TWindow:__UpdateHandle
exec esi, TWindow:__UpdateFocus
cmp esi, [__LastPointedWindow]
jne @f
mov [__LastPointedWindow], 0
@@:
; detach from action if any
mov ecx, [esi+TWindow.__action]
jecxz @f
exec ecx, TAction:Detach, esi
@@:
; destroy the canvas and screen images if any.
mov ecx, [esi+TWindow._canvas]
jecxz .canvas_ok
stdcall DestroyImage, ecx
.canvas_ok:
mov ecx, [esi+TWindow._screen]
jecxz .screen_ok
stdcall DestroyImage, ecx
.screen_ok:
; free the string handles
stdcall StrDel, [esi+TWindow._caption]
popad
inherited
return
endp
;_________________________________________________________________________________________
method TWindow.SetAction
begin
pushad
mov esi, [.self]
mov ecx, [.value]
mov edx, [esi+TWindow.__action]
cmp ecx, edx
je .finish
mov [esi+TWindow.__action], ecx
test edx, edx
jz .old_ok
exec edx, TAction:Detach, esi
.old_ok:
test ecx, ecx
jz .new_ok
exec ecx, TAction:Attach, esi
.new_ok:
getm eax, esi, TWindow:UpdateAction
test eax, eax
jz .finish
stdcall eax, esi, ecx
.finish:
popad
return
endp
;_________________________________________________________________________________________
method TWindow.SetWidth
begin
push ecx eax
mov ecx, [.self]
mov eax, [.value]
xchg eax, [ecx+TWindow._width]
cmp eax, [ecx+TWindow._width]
je .finish
exec ecx, TWindow:Paint
.finish:
pop eax ecx
return
endp
method TWindow.SetHeight
begin
push ecx eax
mov ecx, [.self]
mov eax, [.value]
xchg eax, [ecx+TWindow._height]
cmp eax, [ecx+TWindow._height]
je .finish
exec ecx, TWindow:Paint
.finish:
pop eax ecx
return
endp
;_________________________________________________________________________________________
|
| ︙ | ︙ | |||
249 250 251 252 253 254 255 |
return
endp
;_________________________________________________________________________________________
| < < < < < < < < < < < < < < < < < < < < > > > > > > > > | | | < < | < < | < < < < < < < < < < | < > | | > > | > | > | > > | > > > > > | > | > | > | > | > > > > > > > > > > > > > | > > | | > | | | > > > > | > | > | > | | > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > | > > | > | > > > > > > > > > > > | > > > > > > > > | > > | > > > > > > > > < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > | > > > > > > > > > > > > > > > > > > > > > > | | > > > | > > | > | | > > > | | > > > | > > | > > > > > > > > > > | | > | | > | | > > > | > | | > > > > > > > > > > > > > > > > > > | > > | > > > > > > > > > > > > > > | | | > > > > > > > > > | | > > | > > > > > > | > > > | > > > | > | | | | | > | > > > > | | > > > > > > > > > > > > > | | > > > > > > > > | > | > > > | < < | > | | | | < < | | < | < < < < < < < | > > | | < > | < | > > | < < < > | < < > | | < < < < > > | | | | | | < | | | > > | | > > | > | | | < < | | | < < < | < | < < | | > | < | > | | < | | < < | > | < < < < < > > | | > > > | | > > | | > > | > > | > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > | | | > > | | | > > > > | | | | | > > > > > > > > > | 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 |
return
endp
;_________________________________________________________________________________________
method TWindow.SetCaption
begin
push eax esi
mov esi, [.self]
lea eax, [esi+TWindow._caption]
stdcall SetString, eax, [.value]
stdcall StrPtr, [eax]
cmp [esi+TWindow.handle], 0
je @f
stdcall _SetWindowTextUtf8, [esi+TWindow.handle], eax
@@:
exec esi, TWindow:Refresh
pop esi eax
return
endp
;_________________________________________________________________________________________
method TWindow.SetVisible
begin
push eax esi
mov esi, [.self]
mov eax, [.value]
xchg [esi+TWindow._visible], eax
cmp [esi+TWindow._visible], eax
je .finish
exec esi, TWindow:__UpdateFocus
exec esi, TWindow:__UpdateHandle
exec esi, TWindow:Refresh
.finish:
pop esi eax
return
endp
;_________________________________________________________________________________________
method TWindow.SetOnPaint
begin
push eax esi
mov esi, [.self]
mov eax, [.value]
xchg [esi+TWindow._OnPaint], eax
cmp [esi+TWindow._OnPaint], eax
je .finish
exec esi, TWindow:Refresh
.finish:
pop esi eax
return
endp
;_________________________________________________________________________________________
method TWindow.SetSplitCell
begin
push eax
get eax, [.self], TWindow:Parent
istype eax, TForm
jne .finish
exec eax, TForm:AttachControlToCell, [.self], [.value]
.finish:
pop eax
return
endp
;_________________________________________________________________________________________
method TWindow.GetGlobalEnabled
begin
push ecx
mov ecx, [.self]
get eax, ecx, TWindow:Action
test eax, eax
jz .action_ok
get eax, eax, TAction:Enabled
jmp .check_parent
.action_ok:
mov eax, [ecx+TWindow._enabled]
.check_parent:
test eax, eax
jz .finish
get ecx, [.self], TWindow:Parent
jecxz .finish
get eax, ecx, TWindow:GlobalEnabled
.finish:
pop ecx
return
endp
;_________________________________________________________________________________________
method TWindow.GetEnabled
begin
push ecx
mov ecx, [.self]
get eax, ecx, TWindow:Action
test eax, eax
jz .action_ok
get eax, eax, TAction:Enabled
jmp .finish
.action_ok:
mov eax, [ecx+TWindow._enabled]
.finish:
pop ecx
return
endp
method TWindow.SetEnabled
begin
push ecx
mov ecx, [.self]
push [.value]
pop [ecx+TWindow._enabled]
exec ecx, TWindow:__UpdateFocus
exec ecx, TWindow:Refresh
pop ecx
return
endp
;_________________________________________________________________________________________
;
; returns the pointer of the image TWindow.ImgScreen but only after ensuring that the
; contained image is valid.
method TWindow.GetImgScreen
.dest RECT
.xSrc dd ?
.ySrc dd ?
begin
pushad
mov esi, [.self]
exec esi, TWindow:__UpdateScreen
mov edx, [esi+TWindow._screen]
test edx, edx
jnz .process_screen
mov edx, [esi+TWindow._canvas]
jmp .end_loop
.process_screen:
mov eax, [esi+TWindow._invalid_rect.right]
mov ecx, [esi+TWindow._invalid_rect.bottom]
sub eax, [esi+TWindow._invalid_rect.left]
jz .finish
sub ecx, [esi+TWindow._invalid_rect.top]
jz .finish
get ebx, esi, TWindow:Canvas
; start with the background.
stdcall CopyImageRect, edx, [esi+TWindow._invalid_rect.left], [esi+TWindow._invalid_rect.top], ebx, [esi+TWindow._invalid_rect.left], [esi+TWindow._invalid_rect.top], eax, ecx
; then blend the children windows
lea edi, [esi+TWindow._invalid_rect] ; EDI = invalid rect.
get ebx, esi, TObject:Children
test ebx, ebx
jz .end_loop
xor ecx, ecx
cmp ecx, [ebx+TArray.count]
je .end_loop
.children_loop:
mov esi, [ebx+4*ecx+TArray.array]
istype esi, TWindow
jne .next_child
get eax, esi, TWindow:Visible
test eax, eax
jz .next_child
push [esi+TWindow._x] [esi+TWindow._y] [esi+TWindow._width] [esi+TWindow._height]
pop [.dest.bottom] [.dest.right] [.dest.top] [.dest.left]
mov eax, [.dest.left]
add [.dest.right], eax
mov eax, [.dest.top]
add [.dest.bottom], eax
lea eax, [.dest]
stdcall RectIntersect, eax, eax, edi
jc .next_child ; the rectangles does not intersect, so the child should not to be painted.
mov eax, [.dest.left]
sub [.dest.right], eax
sub eax, [esi+TWindow._x]
mov [.xSrc], eax
mov eax, [.dest.top]
sub [.dest.bottom], eax
sub eax, [esi+TWindow._y]
mov [.ySrc], eax
get eax, esi, TWindow:ImgScreen
stdcall BlendImage, edx, [.dest.left], [.dest.top], eax, [.xSrc], [.ySrc], [.dest.right], [.dest.bottom]
.next_child:
inc ecx
cmp ecx, [ebx+TArray.count]
jne .children_loop
.end_loop:
mov esi, [.self]
get eax, esi, TWindow:Enabled
test eax, eax
jnz .dis_ok
; stdcall FilterDisabled, edx, [esi+TWindow.handle]
.dis_ok:
xor eax, eax
mov [esi+TWindow._invalid_rect.left], eax
mov [esi+TWindow._invalid_rect.top], eax
mov [esi+TWindow._invalid_rect.right], eax
mov [esi+TWindow._invalid_rect.bottom], eax
.finish:
mov [esp+4*regEAX], edx
popad
return
endp
;_________________________________________________________________________________________
method TWindow.GetCanvas
begin
exec [.self], TWindow:__UpdateCanvas
mov eax, [.self]
mov eax, [eax+TWindow._canvas]
return
endp
;_________________________________________________________________________________________
method TWindow.GetOSWindow
begin
push esi
mov esi, [.self]
.loop:
cmp [esi+TWindow.handle], 0
jne .finish
get esi, esi, TWindow:Parent
test esi, esi
jnz .loop
.finish:
mov eax, esi
pop esi
return
endp
;_________________________________________________________________________________________
method TWindow.Paint
.rect RECT
begin
pushad
mov esi, [.self]
get eax, esi, TWindow:OnPaint
test eax, eax
jz .user_paint_ok
get ecx, esi, TWindow:Canvas
stdcall eax, esi, ecx ; user OnPaint handler.
.user_paint_ok:
xor ecx, ecx
mov eax, [esi+TWindow._width]
mov edx, [esi+TWindow._height]
mov [.rect.left], ecx
mov [.rect.top], ecx
mov [.rect.right], eax
mov [.rect.bottom], edx
lea eax, [.rect]
exec esi, TWindow:RectChanged, eax
popad
return
endp
;_________________________________________________________________________________________
method TWindow.Refresh
.rect RECT
begin
exec [.self], TWindow:Paint
exec [.self], TWindow:Update
return
endp
method TWindow.RefreshAll
begin
pushad
get esi, [.self], TObject:Children
test esi, esi
jz .end_loop
mov ecx, [esi+TArray.count]
.loop:
dec ecx
js .end_loop
istype [esi+TArray.array+4*ecx], TWindow
jne .loop
exec [esi+TArray.array+4*ecx], TWindow:RefreshAll
jmp .loop
.end_loop:
exec [.self], TWindow:Refresh
popad
return
endp
method TWindow.Update
.rect RECT
begin
pushad
mov esi, [.self]
xor ecx, ecx
mov eax, [esi+TWindow._width]
mov edx, [esi+TWindow._height]
mov [.rect.left], ecx
mov [.rect.top], ecx
mov [.rect.right], eax
mov [.rect.bottom], edx
.loop:
lea eax, [.rect]
exec esi, TWindow:RectChanged, eax
mov eax, [esi+TWindow._x]
mov edx, [esi+TWindow._y]
add [.rect.left], eax
add [.rect.top], edx
add [.rect.right], eax
add [.rect.bottom], edx
get ecx, esi, TWindow:Parent
jecxz .refresh
mov esi, ecx
jmp .loop
.refresh:
cmp [esi+TWindow.handle], 0
je .finish
mov eax, [esi+TWindow._invalid_rect.right]
mov edx, [esi+TWindow._invalid_rect.bottom]
sub eax, [esi+TWindow._invalid_rect.left]
sub edx, [esi+TWindow._invalid_rect.top]
stdcall _RefreshWindowRect, [esi+TWindow.handle], [esi+TWindow._invalid_rect.left], [esi+TWindow._invalid_rect.top], eax, edx
.finish:
popad
return
endp
;_________________________________________________________________________________________
;---------------------------------------------------------------------------------
; Arguments:
; .self
; .x
; .y
;
; Returns:
; eax - pointer to TWindow
; ecx - X coordinates, translated to the client coordinates of the child.
; edx - Y coordinates, translated to the client coordinates of the child.
;
; If children window was not found, the method returns:
; eax = [.self]
; ecx = [.x]
; edx = [.y]
;---------------------------------------------------------------------------------
method TWindow.ChildByXY
begin
push ebx esi edi
mov eax, [.self]
mov ecx, [.x]
mov edx, [.y]
mov esi, [eax+TObject.__pChildren]
test esi, esi
jz .finish
mov edi, [esi+TArray.count]
lea esi, [esi+TArray.array]
.loop:
dec edi
js .finish
mov ebx, [esi+4*edi]
istype ebx, TWindow
jne .loop
sub ecx, [ebx+TWindow._x]
jl .no2
sub edx, [ebx+TWindow._y]
jl .no
cmp ecx, [ebx+TWindow._width]
jge .no
cmp edx, [ebx+TWindow._height]
jge .no
cmp [.onlyenabled], FALSE
je .enabled_ok
push eax
get eax, ebx, TWindow:GlobalEnabled
test eax, eax
pop eax
jz .no
.enabled_ok:
pushad
get esi, ebx, TWindow:Canvas
mov eax, edx
imul eax, [esi+TImage.width]
shl eax, 2
add eax, [esi+TImage.pPixels]
cmp byte [eax+4*ecx+3], 0 ; the alpha value under the pointer
popad
jne .yes
.no:
add edx, [ebx+TWindow._y]
.no2:
add ecx, [ebx+TWindow._x]
jmp .loop
.yes:
mov eax, ebx
exec eax, TWindow:ChildByXY, ecx, edx, [.onlyenabled]
.finish:
pop edi esi ebx
return
endp
;_________________________________________________________________________________________
;
; Includes the passed rectangle in the invalid rectangle. Later this rectangle will need
; to be repainted, but only when the screen image is required.
;
method TWindow.RectChanged ;, .pRect
.client RECT
begin
push eax ecx
xor eax, eax
mov [.client.left], eax
mov [.client.top], eax
mov eax, [.self]
push [eax+TWindow._height] [eax+TWindow._width]
pop [.client.right] [.client.bottom]
mov ecx, [eax+TWindow._invalid_rect.right]
sub ecx, [eax+TWindow._invalid_rect.left]
jz .copy
mov ecx, [eax+TWindow._invalid_rect.bottom]
sub ecx, [eax+TWindow._invalid_rect.top]
jnz .add
.copy:
lea eax, [eax+TWindow._invalid_rect]
stdcall RectCopy, eax, [.pRect]
jmp .intersect
.add:
lea eax, [eax+TWindow._invalid_rect]
stdcall RectBounding, eax, eax, [.pRect]
.intersect:
lea ecx, [.client]
stdcall RectIntersect, eax, eax, ecx
pop ecx eax
return
endp
;_________________________________________________________________________________________
method TWindow.SetParent
begin
inherited [.value]
exec [.self], TWindow:__UpdateHandle ; create/destroy handle of the OS window, according to the window state.
return
endp
;_________________________________________________________________________________________
method TWindow.__UpdateHandle
begin
pushad
mov esi, [.self]
xor ecx, ecx
cmp [esi+TWindow._visible], ecx
je .no_handle
get eax, esi, TWindow:Parent
test eax, eax
jnz .no_handle
; need handle
cmp [esi+TWindow.handle], ecx
jne .finish ; the window needs OS handle and has one.
; The window has no handle, but needs it.
stdcall _CreateWindow, esi
mov [esi+TWindow.handle], eax
; stdcall _CreateNullWindow
; mov [esi+TWindow.handle], eax
; mov ebx, eax
; stdcall _SetWindowStruct, ebx, esi
; stdcall StrPtr, [esi+TWindow._caption]
; stdcall _SetWindowTextUtf8, ebx, eax
; lea eax, [esi+TWindow._x]
; stdcall _SetWindowBounds, ebx, eax
; stdcall _SetWindowBorder, ebx, [esi+TWindow._border]
stdcall _ShowWindow, eax, TRUE
.finish:
popad
return
.no_handle:
cmp [esi+TWindow.handle], ecx
je .finish ; no need for handle and there is no such.
; stdcall _ShowWindow, [esi+TWindow.handle], 0
stdcall _DestroyWindow, [esi+TWindow.handle] ; destroy not needed window handle.
mov [esi+TWindow.handle], ecx
jmp .finish
endp
method TWindow.__UpdateFocus
begin
mov eax, [.self]
cmp eax, [__FocusedWindow]
jne .finish
get eax, [.self], TWindow:Visible
test eax, eax
jz .clear
get eax, [.self], TWindow:Enabled
test eax, eax
jz .clear
get eax, [.self], TWindow:WantFocus
test eax, eax
jz .clear
.finish:
return
.clear:
mov [__FocusedWindow], 0
exec [.self], TWindow:EventFocusOut
return
endp
method TWindow.__UpdateCanvas
begin
pushad
mov esi, [.self]
mov edi, [esi+TWindow._canvas]
mov ecx, [esi+TWindow._width]
mov edx, [esi+TWindow._height]
test edi, edi
jz .create_new
cmp [edi+TImage.width], ecx
jne .destroy_img
cmp [edi+TImage.height], edx
je .imageok
.destroy_img:
stdcall DestroyImage, edi
.create_new:
stdcall CreateImage, ecx, edx
mov [esi+TWindow._canvas], eax
.imageok:
popad
return
endp
method TWindow.__UpdateScreen
begin
pushad
mov esi, [.self]
mov edi, [esi+TWindow._screen]
mov ecx, [esi+TWindow._width]
mov edx, [esi+TWindow._height]
test edi, edi
jz .create_new
cmp [edi+TImage.width], ecx
jne .destroy_img
cmp [edi+TImage.height], edx
je .imageok
.destroy_img:
stdcall DestroyImage, edi
.create_new:
mov eax, [esi+TWindow.__pChildren]
test eax, eax
jz .imageok
cmp [eax+TArray.count], 0
je .imageok
stdcall CreateImage, ecx, edx
mov [esi+TWindow._screen], eax
xor eax, eax
mov [esi+TWindow._invalid_rect.left], eax
mov [esi+TWindow._invalid_rect.top], eax
mov [esi+TWindow._invalid_rect.right], ecx
mov [esi+TWindow._invalid_rect.bottom], edx
.imageok:
popad
return
endp
; System events methods
method TWindow.EventResize ;, .newWidth, .newHeight
begin
pushad
mov esi, [.self]
mov eax, [.newWidth]
mov ecx, [.newHeight]
cmp eax, [esi+TWindow._width]
jne .update
cmp ecx, [esi+TWindow._height]
je .finish
.update:
mov [esi+TWindow._width], eax
mov [esi+TWindow._height], ecx
exec esi, TWindow:Paint
.finish:
popad
return
endp
method TWindow.EventMove ;, .newX, .newY
begin
push esi
mov esi, [.self]
push [.newX] [.newY]
pop [esi+TWindow._y] [esi+TWindow._x]
pop esi
return
endp
method TWindow.EventMouseEnter
begin
push esi edx
mov esi, [.self]
get edx, esi, TWindow:OSWindow
stdcall GetStockCursor, [esi+TWindow._cursor]
stdcall SetMouseCursor, [edx+TWindow.handle], eax
pop edx esi
return
endp
method TWindow.EventMouseLeave
begin
return
endp
method TWindow.EventMouseMove ;, .x, .y, .kbdState
begin
return
endp
method TWindow.EventButtonPress ;, .button, .kbdState, .x, .y
begin
return
endp
method TWindow.EventButtonRelease ;, .button, .kbdState, .x, .y
begin
return
endp
method TWindow.EventScroll ;, .direction, .command, .value
begin
mov eax, [.self]
cmp [eax+TWindow._OnScroll], 0
je .finish
pushad
stdcall [eax+TWindow._OnScroll], [.self], [.direction], [.command], [.value]
popad
.finish:
return
endp
method TWindow.CloseRequest ;, .reason
begin
return
endp
method TWindow.EventKeyPress ;, .utf8, .scancode, .kbdState
begin
mov eax, [.self]
cmp [eax+TWindow._OnKeyPressed], 0
je .finish
pushad
stdcall [eax+TWindow._OnKeyPressed], [.self], [.utf8], [.scancode], [.kbdState]
popad
.finish:
return
endp
method TWindow.EventKeyRelease ;, .kbdState
begin
return
endp
method TWindow.EventFocusIn
begin
exec [.self], TWindow:Refresh
return
endp
method TWindow.EventFocusOut
begin
exec [.self], TWindow:Refresh
return
endp
; Utility procedures.
method TWindow.ClientToScreenXY; , .window, .x, .y
begin
push eax esi
mov ecx, [.x]
mov edx, [.y]
mov esi, [.self]
.loop:
get eax, esi, TWindow:Parent
test eax, eax
jz .os_win
add ecx, [esi+TWindow._x]
add edx, [esi+TWindow._y]
mov esi, eax
jmp .loop
.os_win:
mov eax, [esi+TWindow.handle]
test eax, eax
jz .finish
stdcall _ClientToScreen, eax, ecx, edx
.finish:
pop esi eax
return
endp
method TWindow.UpdateAction
begin
exec [.self], TWindow:Refresh
return
endp
endmodule
|
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | ; Target OS: Win32 ; ; Dependencies: ; ; Notes: Organize the main message/event loop needed by every GUI engine. ;_________________________________________________________________________________________ | > > > > | > | < < < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > | < | > | | > < < < < < < < < < < < < < < < < < < | | < | < < < < < < < | < > > > | > > | > < < < < < | > > | > | > > > > | > > > > > > > > > > > > > > > > > > > > > | | | | | | | < < | | < < | < > | < < < < < < < | | | < < < < < | | > | | > > > | > > > | < < < < < | < | | < < < < < < > > > > > > > > > > > > > | > | > | > | > > > > > > > > > > > | > > > > > > > > | < < | < | < < < < < < < < | | < | < < | < | > > | > > > | | | | | > > | < < | | | < < | > | | > > > > | < | < | < < < < < | < < < | < < | < < < < < | | < < < < < < < < | < < | < < < < < < < < < > > > | < | > < < | < > > > > > > > > > | > | > | > > > > | | | > > > | > > | > > > | > | > > > > > | > | > | > > | > > > > > > > > > > > > > > > | > > > > > > > > < > > > > | > | > > | | | < | < < < | | | < < < < < < < | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 |
; Target OS: Win32
;
; Dependencies:
;
; Notes: Organize the main message/event loop needed by every GUI engine.
;_________________________________________________________________________________________
body ProcessSystemEvents
.msg MSG
.msg2 MSG
begin
push ecx edx esi edi
.msgloop:
lea esi, [.msg]
xor eax, eax
invoke PeekMessageW, esi, eax, eax, eax, PM_REMOVE
test eax, eax
jz .exitok
cmp [.msg.message], WM_QUIT
je .terminate
cmp [.msg.message], WM_TIMER
jne .timer_ok
xor eax, eax
stdcall __TimerProc, eax, eax, eax, eax
jmp .msgloop
.timer_ok:
cmp [.msg.message], WM_MOUSEMOVE
jne .move_ok
.loop:
invoke PeekMessageW, esi, [.msg.hwnd], WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE
test eax, eax
jnz .loop
jmp .processit
.move_ok:
cmp [.msg.message], WM_KEYDOWN
jne .processit
; cleaning the message queue from the keyboard autorepeat messages.
lea edi, [.msg2]
.loop2:
invoke PeekMessageW, edi, [.msg.hwnd], WM_KEYDOWN, WM_KEYDOWN, PM_NOREMOVE
test eax, eax
jz .processit
mov eax, [.msg2.wParam]
mov ecx, [.msg2.lParam]
cmp eax, [.msg.wParam]
jne .processit
cmp ecx, [.msg.lParam]
jne .processit
invoke PeekMessageW, edi, [.msg.hwnd], WM_KEYDOWN, WM_KEYDOWN, PM_REMOVE
jmp .loop2
.processit:
stdcall __ProcessOneSystemEvent, [.msg.hwnd], [.msg.message], [.msg.wParam], [.msg.lParam]
jnc .msgloop
invoke DefWindowProcW, [.msg.hwnd], [.msg.message], [.msg.wParam], [.msg.lParam]
; invoke TranslateMessage, esi
; invoke DispatchMessageW, esi
jmp .msgloop
.exitok:
clc
pop edi esi edx ecx
return
.terminate:
mov eax, [.msg.wParam]
stc
pop edi esi edx ecx
return
endp
proc WaitForSystemEvent
begin
push eax ecx edx
invoke WaitMessage
pop edx ecx eax
return
endp
;----------------------------------------------------------------------------------------------------------
; This procedure makes following:
; 1. Takes as arguments one windows message
; 2. Analizes the message and finds the target child window for it (only top level windows receive messages)
; 3. Calls the respective event handling method of the target window object.
; 4. returns CF=0 if the event was properly processed.
; 5. returns CF=1 if the event was not processed.
;
; The event can be not processed in the following cases:
; 1. The window that receives the message is not FreshLib object.
; 2. The respective event handler refuse to process the event (return CF=1)
;----------------------------------------------------------------------------------------------------------
proc __ProcessOneSystemEvent, .hwnd, .wmsg, .wparam, .lparam
begin
pushad
stdcall _GetWindowStruct, [.hwnd]
test eax, eax
jz .ondefault
mov esi, eax
dispatch [.wmsg]
.ondefault:
popad
stc
return
.ret_null:
xor eax, eax
.processed:
mov [esp+4*regEAX], eax
popad
clc
return
;.........................................................................................
oncase WM_ACTIVATE
oncase WM_CANCELMODE
cmp [__ActiveMenu], 0
je .ondefault
.hideall:
set [__ActiveMenu], TWindow:Visible, FALSE
cmp [__ActiveMenu], 0
jne .hideall
jmp .ret_null
;.........................................................................................
oncase WM_MOUSEWHEEL
locals
.point POINT
endl
movsx ecx, word [.lparam]
movsx edx, word [.lparam+2]
mov [.point.x], ecx
mov [.point.y], edx
lea eax, [.point]
invoke ScreenToClient, [.hwnd], eax
mov ecx, [.point.y]
shl ecx, 16
mov cx, word [.point.x]
mov [.lparam], ecx
movsx ecx, word [.lparam]
movsx edx, word [.lparam+2]
call .get_mouse_target
mov eax, [.wparam]
sar eax, 16
mov ecx, scWheelUp
test eax, eax
jns @f
mov ecx, scWheelDn
neg eax
@@:
mov ebx, 120
cdq
div ebx
exec edi, TWindow:EventScroll, scrollY, ecx, eax
jmp .ret_null
;.........................................................................................
oncase WM_WINDOWPOSCHANGED
locals
.rect RECT
endl
mov ebx, [.lparam]
test [ebx+WINDOWPOS.flags], SWP_NOMOVE
jnz .move_ok
exec esi, TWindow:EventMove, [ebx+WINDOWPOS.x], [ebx+WINDOWPOS.y]
.move_ok:
test [ebx+WINDOWPOS.flags], SWP_NOSIZE
jnz .ret_null
lea eax, [.rect]
invoke GetClientRect, [esi+TWindow.handle], eax
exec esi, TWindow:EventResize, [.rect.right], [.rect.bottom]
jmp .ret_null
;.........................................................................................
oncase WM_SYSKEYDOWN
oncase WM_SYSKEYUP
oncase WM_KEYDOWN
oncase WM_KEYUP
locals
.keyboard rb 256
.unicode rw 16
.utf8buff rb 16
.scancode dd ?
endl
lea ebx, [.keyboard]
invoke GetKeyboardState, ebx
mov eax, [.lparam]
mov ecx, eax
shr eax, 16
and ecx, $80000000
and eax, $ff
mov [.scancode], eax
mov dword [.utf8buff], 0
or eax, ecx
lea edx, [.unicode]
invoke ToUnicode, [.wparam], eax, ebx, edx, 16, 0
xor ecx, ecx
test eax, eax
jz .key_translated ; the key can not be translated.
js .key_translated ; it is a dead key. What we have to do???
lea edx, [.utf8buff]
xor ecx, ecx
mov [edx], ecx
mov [edx+4], ecx
lea ecx, [.unicode]
invoke WideCharToMultiByte, CP_UTF8, 0, ecx, eax, edx, 8, 0, 0
.key_translated:
xor eax, eax
cmp [__FocusedWindow], eax
jz .ondefault
test [.keyboard+VK_CONTROL], $80
jz @f
or eax, maskCtrl
@@:
test [.keyboard+VK_SHIFT], $80
jz @f
or eax, maskShift
@@:
test [.keyboard+VK_MENU], $80
jz @f
or eax, maskAlt
@@:
test [.keyboard+VK_SCROLL], $01
jz @f
or eax, maskScrLk
@@:
test [.keyboard+VK_CAPITAL], $01
jz @f
or eax, maskCapsLock
@@:
test [.keyboard+VK_LBUTTON], $80
jz @f
or eax, maskBtnLeft
@@:
test [.keyboard+VK_RBUTTON], $80
jz @f
or eax, maskBtnRight
@@:
test [.keyboard+VK_MBUTTON], $80
jz @f
or eax, maskBtnMiddle
@@:
cmp [.wmsg], WM_KEYUP
je .key_up
cmp [.wmsg], WM_SYSKEYUP
je .key_up
;.key_down:
exec [__FocusedWindow], TWindow:EventKeyPress, dword [.utf8buff], [.scancode], eax
jmp .end_key_msg
.key_up:
exec [__FocusedWindow], TWindow:EventKeyRelease, [.scancode], eax
.end_key_msg:
cmp [.wmsg], WM_SYSKEYDOWN
je .ondefault
cmp [.wmsg], WM_SYSKEYUP
je .ondefault
jmp .ret_null
;.........................................................................................
oncase WM_SETFOCUS
stdcall __SearchWindowToFocus, esi
mov [__FocusedWindow], eax
test eax, eax
jz .ret_null
exec eax, TWindow:EventFocusIn
jmp .ret_null
;.........................................................................................
oncase WM_KILLFOCUS
xor ebx, ebx
xchg [__FocusedWindow], ebx
test ebx, ebx
jz .ret_null
exec ebx, TWindow:EventFocusOut
jmp .ret_null
;.........................................................................................
oncase WM_MOUSEMOVE
movsx ecx, word [.lparam]
movsx edx, word [.lparam+2]
stdcall ServeMenuMouseMove, [.hwnd], ecx, edx, 0
jc .ret_null
call .get_mouse_target
get eax, edi, TWindow:Enabled
test eax, eax
jz .ret_null
cmp edi, [__LastPointedWindow]
je .move_event
cmp [__LastPointedWindow], 0
je .leave_ok
exec [__LastPointedWindow], TWindow:EventMouseLeave
.leave_ok:
mov [__LastPointedWindow], edi
exec edi, TWindow:EventMouseEnter
.move_event:
exec edi, TWindow:EventMouseMove, ecx, edx, 0
jmp .ret_null
;.........................................................................................
oncase WM_PAINT
locals
.ps PAINTSTRUCT
.hdc dd ?
endl
get edi, esi, TWindow:ImgScreen
lea eax, [.ps]
invoke BeginPaint, [.hwnd], eax
mov [.hdc], eax
mov ecx, [.ps.rcPaint.right]
mov edx, [.ps.rcPaint.bottom]
sub ecx, [.ps.rcPaint.left]
sub edx, [.ps.rcPaint.top]
stdcall DrawImageRect, [.hdc], edi, [.ps.rcPaint.left], [.ps.rcPaint.top], [.ps.rcPaint.left], [.ps.rcPaint.top], ecx, edx
lea eax, [.ps]
invoke EndPaint, [.hwnd], eax
jmp .ret_null
;.........................................................................................
oncase WM_CLOSE
DebugMsg "Close request."
get eax, [pApplication], TApplication:MainWindow
test eax, eax
jz @f
cmp [eax], esi
jne @f
DebugMsg "Quit message posted."
invoke PostQuitMessage, 0
@@:
exec esi, TWindow:CloseRequest, cerFromUser
jmp .ret_null
oncase WM_DESTROY
mov [esi+TWindow.handle], 0
jmp .ondefault
;.........................................................................................
oncase WM_LBUTTONUP
oncase WM_RBUTTONUP
oncase WM_MBUTTONUP
movsx ecx, word [.lparam]
movsx edx, word [.lparam+2]
call .get_mouse_target
get eax, edi, TWindow:Enabled
test eax, eax
jz .ret_null
mov ebx, [.wmsg]
sub ebx, WM_LBUTTONDOWN
movzx ebx, byte [.__mouse_button_table+ebx]
stdcall __KeyStatus, [.wparam]
exec edi, TWindow:EventButtonRelease, ebx, eax, ecx, edx
jmp .ret_null
oncase WM_LBUTTONDOWN
oncase WM_RBUTTONDOWN
oncase WM_MBUTTONDOWN
locals
.kbdState dd ?
endl
movsx ecx, word [.lparam]
movsx edx, word [.lparam+2]
mov ebx, [.wmsg]
sub ebx, WM_LBUTTONDOWN
movzx ebx, byte [.__mouse_button_table+ebx]
stdcall __KeyStatus, [.wparam]
mov [.kbdState], eax
stdcall ServeMenuButtonPress, [.hwnd], ebx, eax, ecx, edx
jc .ret_null
call .get_mouse_target
get eax, edi, TWindow:Enabled
test eax, eax
jz .ret_null
; deal with focus
cmp edi, [__FocusedWindow]
je .focusok
get eax, edi, TWindow:WantFocus
test eax, eax
jz .focusok
mov eax, [__FocusedWindow]
mov [__FocusedWindow], edi
test eax, eax
jz @f
exec eax, TWindow:EventFocusOut
@@:
exec edi, TWindow:EventFocusIn
.focusok:
exec edi, TWindow:EventButtonPress, ebx, [.kbdState], ecx, edx
jmp .ret_null
; Double clicks are not supported for now...
;oncase WM_LBUTTONDBLCLK
;oncase WM_RBUTTONDBLCLK
;oncase WM_MBUTTONDBLCLK
enddispatch
.get_mouse_target:
mov edi, [__MouseTarget]
test edi, edi
jz .search_target_move
stdcall __GetRelativeXY, edi, ecx, edx
jmp .target_move
.search_target_move:
exec esi, TWindow:ChildByXY, ecx, edx, FALSE
mov edi, eax
.target_move:
retn
.__mouse_button_table db mbLeft, mbLeft, mbLeft
db mbRight, mbRight, mbRight
db mbMiddle, mbMiddle, mbMiddle
endp
;.........................................................................................
proc __KeyStatus, .status
|
| ︙ | ︙ | |||
512 513 514 515 516 517 518 |
@@:
test [.status], MK_MBUTTON
jz @f
or eax, maskBtnMiddle
@@:
test [.status], MK_SHIFT
jz @f
| | > | 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 |
@@:
test [.status], MK_MBUTTON
jz @f
or eax, maskBtnMiddle
@@:
test [.status], MK_SHIFT
jz @f
or eax, maskShift
@@:
test [.status], MK_CONTROL
jz @f
or eax, maskCtrl
@@:
return
endp
|
| ︙ | ︙ | |||
16 17 18 19 20 21 22 |
uglobal
if used hInstance
hInstance dd ?
end if
endg
| | < < < | 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
uglobal
if used hInstance
hInstance dd ?
end if
endg
method TApplication.__create
begin
invoke GetModuleHandleW, 0
mov [hInstance], eax
clc
return
endp
|
| ︙ | ︙ | |||
11 12 13 14 15 16 17 | ; ; Notes: ;_________________________________________________________________________________________ ; ToDo: Arbitrary mouse cursors, B&W for the begining. | | > > | > | | > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
;
; Notes:
;_________________________________________________________________________________________
; ToDo: Arbitrary mouse cursors, B&W for the begining.
proc SetMouseCursor, .hWindow, .hCursor
begin
push ecx edx
invoke SetCursor, [.hCursor]
pop edx ecx
return
endp
proc GetStockCursor, .index
begin
push ecx edx
mov eax, [.index]
cmp eax, mcCount
jb @f
xor eax, eax
@@:
movzx eax, [_cursors+2*eax]
invoke LoadCursorW, 0, eax
pop edx ecx
return
endp
if used _cursors
_cursors dw IDC_ARROW, IDC_IBEAM, IDC_CROSS, IDC_SIZEWE, IDC_SIZENS, IDC_SIZENWSE, IDC_SIZENESW, IDC_WAIT, IDC_HAND, IDC_HAND, IDC_ARROW
end if
proc __MouseCapture, .hwnd
begin
push eax ecx edx
cmp [.hwnd], 0
je .release
DebugMsg "Mouse captured!"
invoke SetCapture, [.hwnd]
.finish:
pop edx ecx eax
return
.release:
|
| ︙ | ︙ |
| ︙ | ︙ | |||
23 24 25 26 27 28 29 | ;_________________________________________________________________________________________ ; ; Registers common window class ; Call only once ;_________________________________________________________________________________________ | | | < < < > | > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > | > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | < < < < < < < < < | < < | | | | < < < | < < < | | | < < < < < < < < < > > > > > > | > | > > > | > | > > | > | | | < < < | < < < < < < < < < < | < < < < < < < < < < | < < < < < < < | | < < | < < < < < < | < < < | | | | < | < < < < | < | < < < < | < < | < < | < < < < < < < < < < < < < < < < < | < < < < | < < < < | < | < | < < < < < < < | < < < < < < < < < < < < | | < | < < < < | < < < < < < < < < < < < < < < < < < < < | | | > > > > > > | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > | > > > > | | 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 |
;_________________________________________________________________________________________
;
; Registers common window class
; Call only once
;_________________________________________________________________________________________
if used _CreateWindow
initialize __RegisterWindowClass
.wc WNDCLASS
begin
xor eax, eax
lea edi, [.wc]
mov ecx, sizeof.WNDCLASS / 4
rep stosd
mov [.wc.style], CS_PARENTDC; or CS_DBLCLKS ;or CS_VREDRAW or CS_HREDRAW
mov [.wc.lpfnWndProc], __CommonWindowProc
mov [.wc.cbWndExtra], nWindowExtraBytes
mov eax,[hInstance]
mov [.wc.hInstance],eax
mov [.wc.lpszClassName], cWindowClassName
lea eax, [.wc]
invoke RegisterClassW, eax
return
endp
end if
;_________________________________________________________________________________________
body _CreateWindow
.pwc dd ?
.charlen dd ?
.style dd ?
.exstyle dd ?
.rect RECT
begin
pushad
mov esi, [.pWindow]
mov [.pwc], 0
cmp [esi+TWindow._caption], 0
je .caption_ok
stdcall StrLen, [esi+TWindow._caption]
lea ecx, [eax*4]
stdcall GetMem, ecx
mov [.pwc], eax
stdcall StrPtr, [esi+TWindow._caption]
invoke MultiByteToWideChar, CP_UTF8, 0, eax, -1, [.pwc], ecx
mov [.charlen], eax
.caption_ok:
; now styles
mov eax, [esi+TWindow._border]
and eax, $3
mov ecx, [.styles+4*eax]
mov edx, [.exstyles+4*eax]
mov [.style], ecx
mov [.exstyle], edx
; the coordinates and size
xor eax, eax
mov [.rect.left], eax
mov [.rect.top], eax
mov ecx, [esi+TWindow._width]
mov edx, [esi+TWindow._height]
mov [.rect.right], ecx
mov [.rect.bottom], edx
lea eax, [.rect]
invoke AdjustWindowRectEx, eax, [.style], 0, [.exstyle]
mov ecx, [.rect.right]
mov edx, [.rect.bottom]
sub ecx, [.rect.left]
sub edx, [.rect.top]
; the owner
mov eax, [esi+TWindow.__main]
test eax, eax
jz .owner_ok
mov eax, [eax+TWindow.handle]
.owner_ok:
invoke CreateWindowExW, [.exstyle], cWindowClassName, [.pwc], [.style], [esi+TWindow._x], [esi+TWindow._y], ecx, edx, eax, 0, [hInstance], 0
mov [esp+4*regEAX], eax
invoke SetWindowLongW, eax, ofsWindowStruct, esi
stdcall FreeMem, [.pwc]
popad
return
.styles dd WS_POPUP
dd WS_BORDER or WS_CAPTION or WS_SYSMENU or WS_SIZEBOX or WS_MINIMIZEBOX or WS_MAXIMIZEBOX
dd WS_CAPTION or WS_SYSMENU
dd WS_BORDER or WS_CAPTION or WS_SYSMENU or WS_SIZEBOX
.exstyles dd WS_EX_TOPMOST or WS_EX_TOOLWINDOW or WS_EX_NOACTIVATE
dd WS_EX_APPWINDOW
dd WS_EX_DLGMODALFRAME
dd WS_EX_TOOLWINDOW
endp
;_________________________________________________________________________________________
body _DestroyWindow
begin
push eax ecx edx
invoke DestroyWindow, [.hwnd]
pop edx ecx eax
return
endp
;_________________________________________________________________________________________
body _ClientToScreen
begin
push eax
lea eax, [.x]
invoke ClientToScreen, [.hwnd], eax
mov ecx, [.x]
mov edx, [.y]
pop eax
return
endp
;_________________________________________________________________________________________
body _ShowWindow
begin
pushad
mov ebx, SW_HIDE
cmp [.flag], 0
je .com_ok
mov ebx, SW_SHOWNOACTIVATE
invoke GetWindowLongW, [.hwnd], GWL_STYLE
test eax, WS_POPUP
jnz .com_ok
mov ebx, SW_SHOWNORMAL
.com_ok:
invoke ShowWindow, [.hwnd], ebx
popad
return
endp
;_________________________________________________________________________________________
body _RefreshWindowRect
;.rect RECT
begin
push eax ecx edx ebx
; WAY 1 - direct paint on the window surface, without sending any messages.
invoke GetDC, [.hwnd]
mov ebx, eax
stdcall _GetWindowStruct, [.hwnd]
get eax, eax, TWindow:ImgScreen
stdcall DrawImageRect, ebx, eax, [.x], [.y], [.x], [.y], [.width], [.height]
invoke ReleaseDC, [.hwnd], ebx
;; Needed for WAY2 and WAY3
;
; mov eax, [.x]
; mov ecx, [.y]
; mov [.rect.left], eax
; mov [.rect.top], ecx
; add eax, [.width]
; add ecx, [.height]
; mov [.rect.right], eax
; mov [.rect.bottom], ecx
;; WAY2 - generates messages before returning.
;
; lea eax, [.rect]
; xor ecx, ecx
; invoke RedrawWindow, [.hwnd], eax, ecx, RDW_UPDATENOW or RDW_INVALIDATE or RDW_NOERASE
;; WAY3 - returns immediately and posts messages to the queue
; lea eax, [.rect]
; xor ecx, ecx
; invoke InvalidateRect, [.hwnd], eax, ecx
pop ebx edx ecx eax
return
endp
;_________________________________________________________________________________________
;
; Returns the window TObject structure, from the window handle.
;_________________________________________________________________________________________
body _GetWindowStruct
begin
push ecx edx
invoke GetWindowLongW, [.hwin], ofsWindowStruct
pop edx ecx
return
endp
;_________________________________________________________________________________________
body _SetWindowStruct
begin
push eax ecx edx
invoke SetWindowLongW, [.hwin], ofsWindowStruct, [.value]
pop edx ecx eax
return
endp
;_________________________________________________________________________________________
body _SetWindowTextUtf8
.pwc dd ?
.charlen dd ?
begin
push eax ecx edx
cmp [.ptrUtf8], 0
je .finish
stdcall StrLen, [.ptrUtf8]
lea ecx, [eax*4]
stdcall GetMem, ecx
mov [.pwc], eax
invoke MultiByteToWideChar, CP_UTF8, 0, [.ptrUtf8], -1, [.pwc], ecx
mov [.charlen], eax
invoke SendMessageW, [.hwnd], WM_SETTEXT, 0, [.pwc]
stdcall FreeMem, [.pwc]
.finish:
pop edx ecx eax
return
endp
;_________________________________________________________________________________________
body _SetModalTowards
begin
push eax ecx edx
invoke SetWindowLongW, [.hwnd], GWL_HWNDPARENT, [.hwndParent]
invoke EnableWindow, [.hwndParent], FALSE
pop edx ecx eax
return
endp
;_________________________________________________________________________________________
body _FinalizeModal
begin
push eax ecx edx
invoke EnableWindow, [.hwndParent], TRUE
invoke SetFocus, [.hwndParent]
pop edx ecx eax
return
endp
;_________________________________________________________________________________________
proc __CommonWindowProc, .hwnd, .wmsg, .wparam, .lparam
begin
stdcall __ProcessOneSystemEvent, [.hwnd], [.wmsg], [.wparam], [.lparam] ; sometimes windows calls winproc directly instead of using postmessage.
jnc .finish
invoke DefWindowProcW, [.hwnd], [.wmsg], [.wparam], [.lparam]
.finish:
return
endp
|
| ︙ | ︙ | |||
19 20 21 22 23 24 25 | include 'sysevents.asm' include 'mouse.asm' include 'textcaret.asm' ; OS independent support code | < < < | | > | > > < | | < < > > > > > > > > > | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
include 'sysevents.asm'
include 'mouse.asm'
include 'textcaret.asm'
; OS independent support code
; Limited support for the old visual editor. Contains only macro definitions.
;include 'OldTemplates.inc'
; OS independent components
include 'TObject.asm'
include 'TApplication.asm'
include 'TAction.asm'
include 'TActionList.asm'
include 'TWindow.asm'
include 'TScrollbar.asm'
include 'TForm.asm'
include 'TButton.asm'
include 'TCheckbox.asm'
include 'TEdit.asm'
include 'TLabel.asm'
include 'TImageLabel.asm'
include 'TMenu.asm'
include 'TProgressbar.asm'
include 'TTreeView.asm'
;include 'TGrid.asm'
include 'dialogs.asm'
include 'SplitGrid.asm'
; OS independent main procedures.
include 'Main.asm'
; OS independent template engine.
include 'ObjTemplates.asm'
; Way to change the GUI themes in Runtime.
include 'themes.asm'
match theme, ThemeGUI {
include 'themes/'#`theme#'.asm'
}
;include 'themes/flat_gui.asm'
;include 'themes/win_gui.asm'
|
| ︙ | ︙ | |||
11 12 13 14 15 16 17 | ; ; Notes: ;_________________________________________________________________________________________ module "Common dialogs library" iglobal | | | | | < | | | | | | | | | | | | | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
;
; Notes:
;_________________________________________________________________________________________
module "Common dialogs library"
iglobal
getfile _DlgIconError, '%lib%/gui/images/error.png'
getfile _DlgIconInformation, '%lib%/gui/images/information.png'
getfile _DlgIconQuestion, '%lib%/gui/images/question.png'
getfile _DlgIconWarning, '%lib%/gui/images/warning.png'
if used _CommonDialogTemplate
_CommonDialogTemplate:
ObjTemplate tfParent or tfEnd, TForm, frmCommonDialog, x = 200, y = 100, width = 480, height = 100, border = borderModal
ObjTemplate tfChild, TImageLabel, .imgIcon, x = 4, y = 4, width = 70, height = 70, Visible = TRUE, ImageAlign = iaCenter or iaMiddle
ObjTemplate tfChild, TLabel, .LblText, x = 74, y = 4, width = 10, height = 10, TextAlign = dtfAlignLeft or dtfAlignMiddle or dtfWordWrap or dtfCRLF, Visible = TRUE
ObjTemplate tfChild, TButton, .btnOK, x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter or dtfAlignMiddle, Caption = 'OK', ModalResult = mrOK
ObjTemplate tfChild, TButton, .btnCancel, x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter or dtfAlignMiddle, Caption = 'Cancel', ModalResult = mrCancel
ObjTemplate tfChild, TButton, .btnAbort, x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter or dtfAlignMiddle, Caption = 'Abort', ModalResult = mrAbort
ObjTemplate tfChild, TButton, .btnRetry, x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter or dtfAlignMiddle, Caption = 'Retry', ModalResult = mrRetry
ObjTemplate tfChild, TButton, .btnIgnore, x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter or dtfAlignMiddle, Caption = 'Ignore', ModalResult = mrIgnore
ObjTemplate tfChild, TButton, .btnYes, x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter or dtfAlignMiddle, Caption = 'Yes', ModalResult = mrYes
ObjTemplate tfChild, TButton, .btnNo, x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter or dtfAlignMiddle, Caption = 'No', ModalResult = mrNo
ObjTemplate tfChild, TButton, .btnMaybe, x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter or dtfAlignMiddle, Caption = 'Maybe', ModalResult = mrMaybe
ObjTemplate tfEnd, TButton, .btnHelp, x = 0, y = 0, width = 64, height = 24, TextAlign = dtfAlignCenter or dtfAlignMiddle, Caption = 'Help', ModalResult = mrNone
end if
endg
; buttons flags used:
smbOK = $01
smbCancel = $02
|
| ︙ | ︙ | |||
59 60 61 62 63 64 65 | proc ShowMessage, .parent, .icon, .hTitle, .hMessage, .maskButtons .xrow dd ? .yrow dd ? .hicon dd ? | < > > | 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
proc ShowMessage, .parent, .icon, .hTitle, .hMessage, .maskButtons
.xrow dd ?
.yrow dd ?
.hicon dd ?
begin
push ebx ecx edx esi
stdcall CreateFromTemplate, _CommonDialogTemplate, 0
set [frmCommonDialog], TWindow:_MainWindow, [.parent]
; First set the position and size of the dialog box, depending on the flags, and the size of the message.
; Set the message text:
set [frmCommonDialog.LblText], TLabel:Caption, [.hMessage]
; Set the message title:
|
| ︙ | ︙ | |||
95 96 97 98 99 100 101 |
get eax, ebx, TForm:width
cmp eax, edx
jge .widthok
lea eax, [edx+32]
set ebx, TForm:width, eax
| < | 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
get eax, ebx, TForm:width
cmp eax, edx
jge .widthok
lea eax, [edx+32]
set ebx, TForm:width, eax
.widthok:
sub eax, edx
sar eax, 1 ; eax is the begin X coordinate of the row
mov [.xrow], eax
|
| ︙ | ︙ | |||
118 119 120 121 122 123 124 |
test [.maskButtons], ecx
jz @f
mov esi, [edx]
set [esi], TButton:x, [.xrow]
set [esi], TButton:y, [.yrow]
| < | | < < < < < < > > | > | > < > | 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
test [.maskButtons], ecx
jz @f
mov esi, [edx]
set [esi], TButton:x, [.xrow]
set [esi], TButton:y, [.yrow]
set [esi], TButton:Visible, TRUE
add [.xrow], 64+16
@@:
add edx, 4
shl ecx, 1
cmp ecx, smbMaxButton
jbe .btnLoop
; set the icon
mov eax, [.icon]
cmp eax, .iconCount
jb @f
xor eax, eax
@@:
stdcall CreateImagePNG, [.iconTable+4*eax], [.iconSizes+4*eax]
mov [.hicon], eax
set [frmCommonDialog.imgIcon], TImageLabel:Image, eax
; set the text position and size.
mov ecx, [.yrow]
sub ecx, 8
set [frmCommonDialog.LblText], TLabel:height, ecx
set [frmCommonDialog.imgIcon], TImageLabel:height, ecx
get eax, [frmCommonDialog], TForm:width
get ecx, [frmCommonDialog.LblText], TLabel:x
sub eax, ecx
set [frmCommonDialog.LblText], TLabel:width, eax
; exec [frmCommonDialog.LblText], TWindow:Refresh
; exec [frmCommonDialog.imgIcon], TWindow:Refresh
stdcall ShowModal, ebx, [.parent]
destroy ebx
stdcall DestroyImage, [.hicon]
pop esi edx ecx ebx
return
.btnTable dd frmCommonDialog.btnOK, \
frmCommonDialog.btnCancel, \
frmCommonDialog.btnAbort, \
frmCommonDialog.btnRetry, \
frmCommonDialog.btnIgnore, \
frmCommonDialog.btnYes, \
frmCommonDialog.btnNo, \
frmCommonDialog.btnMaybe, \
frmCommonDialog.btnHelp
.iconTable dd _DlgIconError, _DlgIconInformation, _DlgIconQuestion, _DlgIconWarning
.iconCount = ($ - .iconTable)/4
.iconSizes dd _DlgIconError.size, _DlgIconInformation.size, _DlgIconQuestion.size, _DlgIconWarning.size
endp
proc InputString, .parent
begin
|
| ︙ | ︙ |
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="13"
height="13"
viewBox="0 0 13 13"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="check.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/checkbox/check.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview39"
showgrid="false"
inkscape:zoom="43.153846"
inkscape:cx="2.6648841"
inkscape:cy="6.5"
inkscape:current-layer="Capa_1" /><g
id="g3"
transform="matrix(0.22441969,0,0,0.22441969,1.4999414,1.5000527)"
style="fill:#0000ff;fill-opacity:1"><g
id="g5"
style="fill:#0000ff;fill-opacity:1"><path
d="m 23.297,38.74 c -1.17,1.588 -2.992,2.564 -4.962,2.661 -1.97,0.098 -3.878,-0.696 -5.198,-2.162 L 1.308,26.112 c -1.88,-2.085 -1.713,-5.299 0.372,-7.179 2.087,-1.88 5.299,-1.712 7.179,0.374 l 8.369,9.288 c 0.124,0.138 0.304,0.212 0.489,0.203 0.186,-0.009 0.356,-0.102 0.467,-0.25 L 35.386,5.217 c 1.665,-2.26 4.847,-2.741 7.108,-1.075 2.259,1.666 2.739,4.848 1.073,7.107 L 23.297,38.74 Z"
id="path7"
inkscape:connector-curvature="0"
style="fill:#0000ff;fill-opacity:1" /></g></g><g
id="g9"
transform="translate(0,-31.560001)" /><g
id="g11"
transform="translate(0,-31.560001)" /><g
id="g13"
transform="translate(0,-31.560001)" /><g
id="g15"
transform="translate(0,-31.560001)" /><g
id="g17"
transform="translate(0,-31.560001)" /><g
id="g19"
transform="translate(0,-31.560001)" /><g
id="g21"
transform="translate(0,-31.560001)" /><g
id="g23"
transform="translate(0,-31.560001)" /><g
id="g25"
transform="translate(0,-31.560001)" /><g
id="g27"
transform="translate(0,-31.560001)" /><g
id="g29"
transform="translate(0,-31.560001)" /><g
id="g31"
transform="translate(0,-31.560001)" /><g
id="g33"
transform="translate(0,-31.560001)" /><g
id="g35"
transform="translate(0,-31.560001)" /><g
id="g37"
transform="translate(0,-31.560001)" /></svg>
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="13"
height="13"
viewBox="0 0 13 13"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="check_flat.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/checkbox/check_flat.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview39"
showgrid="false"
inkscape:zoom="43.153846"
inkscape:cx="6.5"
inkscape:cy="6.5"
inkscape:current-layer="Capa_1" /><g
id="g9"
transform="translate(0,-31.560001)" /><g
id="g11"
transform="translate(0,-31.560001)" /><g
id="g13"
transform="translate(0,-31.560001)" /><g
id="g15"
transform="translate(0,-31.560001)" /><g
id="g17"
transform="translate(0,-31.560001)" /><g
id="g19"
transform="translate(0,-31.560001)" /><g
id="g21"
transform="translate(0,-31.560001)" /><g
id="g23"
transform="translate(0,-31.560001)" /><g
id="g25"
transform="translate(0,-31.560001)" /><g
id="g27"
transform="translate(0,-31.560001)" /><g
id="g29"
transform="translate(0,-31.560001)" /><g
id="g31"
transform="translate(0,-31.560001)" /><g
id="g33"
transform="translate(0,-31.560001)" /><g
id="g35"
transform="translate(0,-31.560001)" /><g
id="g37"
transform="translate(0,-31.560001)" /><rect
style="fill:#e74c3c;fill-opacity:1;stroke:none;stroke-width:1.02100003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4169"
width="5"
height="5"
x="4"
y="4" /></svg>
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="13"
height="13"
viewBox="0 0 13 13"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="check_flat_gray.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/checkbox/check_flat_gray.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview39"
showgrid="false"
inkscape:zoom="96.432248"
inkscape:cx="4.7837691"
inkscape:cy="6.4536542"
inkscape:current-layer="Capa_1" /><g
id="g9"
transform="translate(0,-31.560001)" /><g
id="g11"
transform="translate(0,-31.560001)" /><g
id="g13"
transform="translate(0,-31.560001)" /><g
id="g15"
transform="translate(0,-31.560001)" /><g
id="g17"
transform="translate(0,-31.560001)" /><g
id="g19"
transform="translate(0,-31.560001)" /><g
id="g21"
transform="translate(0,-31.560001)" /><g
id="g23"
transform="translate(0,-31.560001)" /><g
id="g25"
transform="translate(0,-31.560001)" /><g
id="g27"
transform="translate(0,-31.560001)" /><g
id="g29"
transform="translate(0,-31.560001)" /><g
id="g31"
transform="translate(0,-31.560001)" /><g
id="g33"
transform="translate(0,-31.560001)" /><g
id="g35"
transform="translate(0,-31.560001)" /><g
id="g37"
transform="translate(0,-31.560001)" /><rect
style="fill:#6f6f6f;fill-opacity:1;stroke:none;stroke-width:1.02100003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4169"
width="5"
height="5"
x="4"
y="4" /></svg>
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="13"
height="13"
viewBox="0 0 13 13"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="check_gray.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/checkbox/check_gray.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview39"
showgrid="false"
inkscape:zoom="43.153846"
inkscape:cx="2.6648841"
inkscape:cy="6.5"
inkscape:current-layer="Capa_1" /><g
id="g3"
transform="matrix(0.22441969,0,0,0.22441969,1.4999414,1.5000527)"
style="fill:#404040;fill-opacity:1"><g
id="g5"
style="fill:#404040;fill-opacity:1"><path
d="m 23.297,38.74 c -1.17,1.588 -2.992,2.564 -4.962,2.661 -1.97,0.098 -3.878,-0.696 -5.198,-2.162 L 1.308,26.112 c -1.88,-2.085 -1.713,-5.299 0.372,-7.179 2.087,-1.88 5.299,-1.712 7.179,0.374 l 8.369,9.288 c 0.124,0.138 0.304,0.212 0.489,0.203 0.186,-0.009 0.356,-0.102 0.467,-0.25 L 35.386,5.217 c 1.665,-2.26 4.847,-2.741 7.108,-1.075 2.259,1.666 2.739,4.848 1.073,7.107 L 23.297,38.74 Z"
id="path7"
inkscape:connector-curvature="0"
style="fill:#404040;fill-opacity:1" /></g></g><g
id="g9"
transform="translate(0,-31.560001)" /><g
id="g11"
transform="translate(0,-31.560001)" /><g
id="g13"
transform="translate(0,-31.560001)" /><g
id="g15"
transform="translate(0,-31.560001)" /><g
id="g17"
transform="translate(0,-31.560001)" /><g
id="g19"
transform="translate(0,-31.560001)" /><g
id="g21"
transform="translate(0,-31.560001)" /><g
id="g23"
transform="translate(0,-31.560001)" /><g
id="g25"
transform="translate(0,-31.560001)" /><g
id="g27"
transform="translate(0,-31.560001)" /><g
id="g29"
transform="translate(0,-31.560001)" /><g
id="g31"
transform="translate(0,-31.560001)" /><g
id="g33"
transform="translate(0,-31.560001)" /><g
id="g35"
transform="translate(0,-31.560001)" /><g
id="g37"
transform="translate(0,-31.560001)" /></svg>
|
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="8"
height="16"
viewBox="0 0 8 16"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="check.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/check.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview39"
showgrid="false"
inkscape:zoom="35.0625"
inkscape:cx="-0.7201426"
inkscape:cy="8"
inkscape:current-layer="Capa_1"
inkscape:snap-page="true" /><g
id="g3"
transform="matrix(0.17953575,0,0,0.1795327,-4.6834361e-5,4.0001102)"
style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><g
id="g5"
style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><path
d="m 23.297,38.74 c -1.17,1.588 -2.992,2.564 -4.962,2.661 -1.97,0.098 -3.878,-0.696 -5.198,-2.162 L 1.308,26.112 c -1.88,-2.085 -1.713,-5.299 0.372,-7.179 2.087,-1.88 5.299,-1.712 7.179,0.374 l 8.369,9.288 c 0.124,0.138 0.304,0.212 0.489,0.203 0.186,-0.009 0.356,-0.102 0.467,-0.25 L 35.386,5.217 c 1.665,-2.26 4.847,-2.741 7.108,-1.075 2.259,1.666 2.739,4.848 1.073,7.107 L 23.297,38.74 Z"
id="path7"
inkscape:connector-curvature="0"
style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g></g><g
id="g9"
transform="translate(0,-28.560001)" /><g
id="g11"
transform="translate(0,-28.560001)" /><g
id="g13"
transform="translate(0,-28.560001)" /><g
id="g15"
transform="translate(0,-28.560001)" /><g
id="g17"
transform="translate(0,-28.560001)" /><g
id="g19"
transform="translate(0,-28.560001)" /><g
id="g21"
transform="translate(0,-28.560001)" /><g
id="g23"
transform="translate(0,-28.560001)" /><g
id="g25"
transform="translate(0,-28.560001)" /><g
id="g27"
transform="translate(0,-28.560001)" /><g
id="g29"
transform="translate(0,-28.560001)" /><g
id="g31"
transform="translate(0,-28.560001)" /><g
id="g33"
transform="translate(0,-28.560001)" /><g
id="g35"
transform="translate(0,-28.560001)" /><g
id="g37"
transform="translate(0,-28.560001)" /></svg>
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="7"
height="16"
viewBox="0 0 7 16"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="check_flat.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/check_flat.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview39"
showgrid="false"
inkscape:zoom="33.519231"
inkscape:cx="-0.93746414"
inkscape:cy="8"
inkscape:current-layer="Capa_1"
inkscape:snap-page="true" /><g
id="g3"
transform="matrix(0.17953575,0,0,0.1795327,-4.6834361e-5,4.0001102)"
style="fill:#e67e22;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><g
id="g5"
style="fill:#e67e22;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g><g
id="g9"
transform="translate(0,-28.560001)" /><g
id="g11"
transform="translate(0,-28.560001)" /><g
id="g13"
transform="translate(0,-28.560001)" /><g
id="g15"
transform="translate(0,-28.560001)" /><g
id="g17"
transform="translate(0,-28.560001)" /><g
id="g19"
transform="translate(0,-28.560001)" /><g
id="g21"
transform="translate(0,-28.560001)" /><g
id="g23"
transform="translate(0,-28.560001)" /><g
id="g25"
transform="translate(0,-28.560001)" /><g
id="g27"
transform="translate(0,-28.560001)" /><g
id="g29"
transform="translate(0,-28.560001)" /><g
id="g31"
transform="translate(0,-28.560001)" /><g
id="g33"
transform="translate(0,-28.560001)" /><g
id="g35"
transform="translate(0,-28.560001)" /><g
id="g37"
transform="translate(0,-28.560001)" /><rect
style="fill:#e74c3c;fill-opacity:1;stroke:none;stroke-width:1.02100003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4169"
width="7"
height="7"
x="0"
y="4.5" /></svg>
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="7"
height="16"
viewBox="0 0 7 16"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="check_flat_gray.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/check_flat_gray.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview39"
showgrid="false"
inkscape:zoom="33.519231"
inkscape:cx="-0.93746414"
inkscape:cy="8"
inkscape:current-layer="Capa_1"
inkscape:snap-page="true" /><g
id="g3"
transform="matrix(0.17953575,0,0,0.1795327,-4.6834361e-5,4.0001102)"
style="fill:#e67e22;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><g
id="g5"
style="fill:#e67e22;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g><g
id="g9"
transform="translate(0,-28.560001)" /><g
id="g11"
transform="translate(0,-28.560001)" /><g
id="g13"
transform="translate(0,-28.560001)" /><g
id="g15"
transform="translate(0,-28.560001)" /><g
id="g17"
transform="translate(0,-28.560001)" /><g
id="g19"
transform="translate(0,-28.560001)" /><g
id="g21"
transform="translate(0,-28.560001)" /><g
id="g23"
transform="translate(0,-28.560001)" /><g
id="g25"
transform="translate(0,-28.560001)" /><g
id="g27"
transform="translate(0,-28.560001)" /><g
id="g29"
transform="translate(0,-28.560001)" /><g
id="g31"
transform="translate(0,-28.560001)" /><g
id="g33"
transform="translate(0,-28.560001)" /><g
id="g35"
transform="translate(0,-28.560001)" /><g
id="g37"
transform="translate(0,-28.560001)" /><rect
style="fill:#6e6e6e;fill-opacity:1;stroke:none;stroke-width:1.02100003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4169"
width="7"
height="7"
x="0"
y="4.5" /></svg>
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="8"
height="16"
viewBox="0 0 8 16"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="check_gray.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/check_gray.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview39"
showgrid="false"
inkscape:zoom="35.0625"
inkscape:cx="-0.7201426"
inkscape:cy="8"
inkscape:current-layer="Capa_1"
inkscape:snap-page="true" /><g
id="g3"
transform="matrix(0.17953575,0,0,0.1795327,-4.6834361e-5,4.0001102)"
style="fill:#3f3f3f;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><g
id="g5"
style="fill:#3f3f3f;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><path
d="m 23.297,38.74 c -1.17,1.588 -2.992,2.564 -4.962,2.661 -1.97,0.098 -3.878,-0.696 -5.198,-2.162 L 1.308,26.112 c -1.88,-2.085 -1.713,-5.299 0.372,-7.179 2.087,-1.88 5.299,-1.712 7.179,0.374 l 8.369,9.288 c 0.124,0.138 0.304,0.212 0.489,0.203 0.186,-0.009 0.356,-0.102 0.467,-0.25 L 35.386,5.217 c 1.665,-2.26 4.847,-2.741 7.108,-1.075 2.259,1.666 2.739,4.848 1.073,7.107 L 23.297,38.74 Z"
id="path7"
inkscape:connector-curvature="0"
style="fill:#3f3f3f;fill-opacity:1;stroke:none;stroke-width:4.55629396;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g></g><g
id="g9"
transform="translate(0,-28.560001)" /><g
id="g11"
transform="translate(0,-28.560001)" /><g
id="g13"
transform="translate(0,-28.560001)" /><g
id="g15"
transform="translate(0,-28.560001)" /><g
id="g17"
transform="translate(0,-28.560001)" /><g
id="g19"
transform="translate(0,-28.560001)" /><g
id="g21"
transform="translate(0,-28.560001)" /><g
id="g23"
transform="translate(0,-28.560001)" /><g
id="g25"
transform="translate(0,-28.560001)" /><g
id="g27"
transform="translate(0,-28.560001)" /><g
id="g29"
transform="translate(0,-28.560001)" /><g
id="g31"
transform="translate(0,-28.560001)" /><g
id="g33"
transform="translate(0,-28.560001)" /><g
id="g35"
transform="translate(0,-28.560001)" /><g
id="g37"
transform="translate(0,-28.560001)" /></svg>
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="6"
height="11"
viewBox="0 0 5.9999999 11"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="submenu.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/submenu.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata42"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs40" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1061"
id="namedview38"
showgrid="false"
inkscape:zoom="51"
inkscape:cx="-0.24509804"
inkscape:cy="5.5"
inkscape:window-x="-4"
inkscape:window-y="-4"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" /><g
id="g3"
transform="matrix(0.02139037,0,0,0.03081232,-0.81818182,1.9073486e-6)"
style="fill:#000000;fill-opacity:1"><g
id="play-arrow"
style="fill:#000000;fill-opacity:1"><polygon
points="38.25,0 38.25,357 318.75,178.5 "
id="polygon6"
style="fill:#000000;fill-opacity:1" /></g></g><g
id="g8"
transform="translate(-7.9999995,-339)" /><g
id="g10"
transform="translate(-7.9999995,-339)" /><g
id="g12"
transform="translate(-7.9999995,-339)" /><g
id="g14"
transform="translate(-7.9999995,-339)" /><g
id="g16"
transform="translate(-7.9999995,-339)" /><g
id="g18"
transform="translate(-7.9999995,-339)" /><g
id="g20"
transform="translate(-7.9999995,-339)" /><g
id="g22"
transform="translate(-7.9999995,-339)" /><g
id="g24"
transform="translate(-7.9999995,-339)" /><g
id="g26"
transform="translate(-7.9999995,-339)" /><g
id="g28"
transform="translate(-7.9999995,-339)" /><g
id="g30"
transform="translate(-7.9999995,-339)" /><g
id="g32"
transform="translate(-7.9999995,-339)" /><g
id="g34"
transform="translate(-7.9999995,-339)" /><g
id="g36"
transform="translate(-7.9999995,-339)" /></svg>
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="6"
height="11"
viewBox="0 0 5.9999999 11"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="submenugray.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/submenugray.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata42"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs40" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1061"
id="namedview38"
showgrid="false"
inkscape:zoom="51"
inkscape:cx="3"
inkscape:cy="5.5"
inkscape:window-x="-4"
inkscape:window-y="-4"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" /><g
id="g3"
transform="matrix(0.02139037,0,0,0.03081232,-0.81818182,1.9073486e-6)"
style="fill:#95a5a6;fill-opacity:1"><g
id="play-arrow"
style="fill:#95a5a6;fill-opacity:1"><polygon
points="318.75,178.5 38.25,0 38.25,357 "
id="polygon6"
style="fill:#95a5a6;fill-opacity:1" /></g></g><g
id="g8"
transform="translate(-7.9999994,-339)" /><g
id="g10"
transform="translate(-7.9999994,-339)" /><g
id="g12"
transform="translate(-7.9999994,-339)" /><g
id="g14"
transform="translate(-7.9999994,-339)" /><g
id="g16"
transform="translate(-7.9999994,-339)" /><g
id="g18"
transform="translate(-7.9999994,-339)" /><g
id="g20"
transform="translate(-7.9999994,-339)" /><g
id="g22"
transform="translate(-7.9999994,-339)" /><g
id="g24"
transform="translate(-7.9999994,-339)" /><g
id="g26"
transform="translate(-7.9999994,-339)" /><g
id="g28"
transform="translate(-7.9999994,-339)" /><g
id="g30"
transform="translate(-7.9999994,-339)" /><g
id="g32"
transform="translate(-7.9999994,-339)" /><g
id="g34"
transform="translate(-7.9999994,-339)" /><g
id="g36"
transform="translate(-7.9999994,-339)" /></svg>
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="6"
height="10.999998"
viewBox="0 0 5.9999999 10.999998"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="submenusel.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/menu/submenusel.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata42"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs40" /><sodipodi:namedview
pagecolor="#0000ff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1061"
id="namedview38"
showgrid="false"
inkscape:zoom="51.000009"
inkscape:cx="3"
inkscape:cy="5.499999"
inkscape:window-x="-4"
inkscape:window-y="-4"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" /><g
id="g3"
transform="matrix(0.02139037,0,0,0.03081232,-0.81818182,-1.4734863e-7)"
style="fill:#ffffff;fill-opacity:1"><g
id="play-arrow"
style="fill:#ffffff;fill-opacity:1"><polygon
points="38.25,0 38.25,357 318.75,178.5 "
id="polygon6"
style="fill:#ffffff;fill-opacity:1" /></g></g><g
id="g8"
transform="translate(-7.9999995,-339)" /><g
id="g10"
transform="translate(-7.9999995,-339)" /><g
id="g12"
transform="translate(-7.9999995,-339)" /><g
id="g14"
transform="translate(-7.9999995,-339)" /><g
id="g16"
transform="translate(-7.9999995,-339)" /><g
id="g18"
transform="translate(-7.9999995,-339)" /><g
id="g20"
transform="translate(-7.9999995,-339)" /><g
id="g22"
transform="translate(-7.9999995,-339)" /><g
id="g24"
transform="translate(-7.9999995,-339)" /><g
id="g26"
transform="translate(-7.9999995,-339)" /><g
id="g28"
transform="translate(-7.9999995,-339)" /><g
id="g30"
transform="translate(-7.9999995,-339)" /><g
id="g32"
transform="translate(-7.9999995,-339)" /><g
id="g34"
transform="translate(-7.9999995,-339)" /><g
id="g36"
transform="translate(-7.9999995,-339)" /></svg>
|
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
viewBox="0 0 310.285 310.285"
style="enable-background:new 0 0 310.285 310.285;"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="error.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/svg/error.png"
inkscape:export-xdpi="13.92"
inkscape:export-ydpi="13.92"><metadata
id="metadata39"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs37" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview35"
showgrid="false"
inkscape:zoom="1.6820764"
inkscape:cx="60.913725"
inkscape:cy="152.51297"
inkscape:current-layer="Capa_1" /><rect
style="fill:#ffffff;fill-opacity:1"
id="rect4167"
width="183.70152"
height="198.56412"
x="67.773376"
y="57.62109" /><path
d="M264.845,45.441C235.542,16.139,196.582,0,155.143,0S74.743,16.139,45.44,45.441C16.138,74.743,0,113.703,0,155.143 c0,41.439,16.138,80.399,45.44,109.701c29.303,29.303,68.262,45.44,109.702,45.44s80.399-16.138,109.702-45.44 c29.302-29.302,45.44-68.262,45.44-109.701C310.285,113.703,294.147,74.743,264.845,45.441z M189.702,157.985l38.669,38.669 c3.12,3.119,3.12,8.194,0,11.313l-22.333,22.333c-1.507,1.507-3.516,2.337-5.657,2.337c-2.141,0-4.15-0.83-5.657-2.337 l-38.669-38.669c-0.748-0.746-2.08-0.746-2.829,0l-38.669,38.669c-1.507,1.507-3.516,2.337-5.657,2.337 c-2.141,0-4.149-0.83-5.657-2.336l-22.333-22.334c-1.507-1.507-2.337-3.516-2.337-5.656c0-2.142,0.83-4.15,2.337-5.657 l38.669-38.669c0.766-0.767,0.766-2.063-0.001-2.829l-40.302-40.302c-1.507-1.507-2.337-3.516-2.337-5.657 c0-2.141,0.83-4.149,2.337-5.656l22.333-22.333c1.507-1.507,3.516-2.337,5.657-2.337c2.141,0,4.149,0.83,5.656,2.337l40.303,40.303 c0.749,0.747,2.081,0.746,2.828,0l40.303-40.303c1.507-1.507,3.516-2.337,5.657-2.337c2.141,0,4.149,0.83,5.656,2.337l22.333,22.333 c1.507,1.507,2.337,3.516,2.337,5.656c0,2.142-0.83,4.15-2.337,5.658l-40.302,40.301 C188.936,155.923,188.936,157.219,189.702,157.985z"
id="path3"
style="fill:#e74c3c;fill-opacity:1" /><g
id="g5" /><g
id="g7" /><g
id="g9" /><g
id="g11" /><g
id="g13" /><g
id="g15" /><g
id="g17" /><g
id="g19" /><g
id="g21" /><g
id="g23" /><g
id="g25" /><g
id="g27" /><g
id="g29" /><g
id="g31" /><g
id="g33" /></svg>
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
viewBox="0 0 315.772 315.772"
style="enable-background:new 0 0 315.772 315.772;"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="information.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/svg/information.png"
inkscape:export-xdpi="13.68"
inkscape:export-ydpi="13.68"><metadata
id="metadata39"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs37" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview35"
showgrid="false"
inkscape:zoom="1.6528479"
inkscape:cx="61.990908"
inkscape:cy="155.20997"
inkscape:current-layer="Capa_1" /><rect
style="fill:#ffffff;fill-opacity:1"
id="rect4167"
width="183.70152"
height="222.76477"
x="60.613361"
y="8.9693317" /><path
d="M287.355,0H28.173C17.145,0,8.386,8.472,8.386,19.5v213.822c0,11.028,8.759,19.678,19.787,19.678h67.628 c5.514,0,9.585,4.809,9.585,10.322V302.5c0,9.169,5.476,13.272,10.697,13.272c3.053,0,6.293-1.282,9.423-3.813l62.314-50.482 c5.483-4.431,16.527-8.478,23.576-8.478h75.959c11.028,0,20.031-8.649,20.031-19.678V19.5C307.386,8.472,298.383,0,287.355,0z M182.904,92.834l-26.124,90.563c-1.422,5.357-2.131,8.91-2.131,10.657c0,0.877,0.381,1.75,1.148,2.624 c0.763,0.876,1.583,1.311,2.459,1.311c1.529,0,3.005-0.656,4.427-1.967c3.781-3.067,8.186-8.43,13.213-16.087 c0.347-0.529,1.496-1.585,2.16-0.987l2.682,1.532c0.665,0.574,0.253,1.403-0.021,1.869c-13.096,22.234-26.977,33.347-41.643,33.347 c-5.685,0-10.222-1.614-13.608-4.836c-3.389-3.222-5.083-7.296-5.083-12.215c0-3.279,0.763-7.432,2.295-12.46l18.363-63.123 c1.747-6.009,2.623-10.546,2.623-13.608c0-1.967-0.848-3.714-2.541-5.246c-1.696-1.529-3.963-2.296-6.804-2.296 c-0.579,0-1.185,0.009-1.817,0.028c-0.922,0.026-2.655-0.706-2.359-1.632c0.25-0.779,0.509-1.617,0.618-2.063 c0.507-2.068,5.213-2.185,5.213-2.185l36.527-5.887c0,0,2.912-0.558,4.984-0.558c1.587,0,3.096,0.014,4.127,0 C184.41,89.577,182.904,92.834,182.904,92.834z M189.408,61.987c-3.827,3.771-8.418,5.656-13.772,5.656 c-5.247,0-9.755-1.885-13.526-5.656c-3.771-3.771-5.656-8.333-5.656-13.69c0-5.354,1.857-9.944,5.574-13.772 c3.715-3.825,8.251-5.739,13.608-5.739c5.464,0,10.083,1.914,13.854,5.739c3.771,3.828,5.656,8.419,5.656,13.772 C195.146,53.654,193.232,58.216,189.408,61.987z"
id="path3"
style="fill:#3498db;fill-opacity:1" /><g
id="g5" /><g
id="g7" /><g
id="g9" /><g
id="g11" /><g
id="g13" /><g
id="g15" /><g
id="g17" /><g
id="g19" /><g
id="g21" /><g
id="g23" /><g
id="g25" /><g
id="g27" /><g
id="g29" /><g
id="g31" /><g
id="g33" /></svg>
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
viewBox="0 0 45.333 45.333"
style="enable-background:new 0 0 45.333 45.333;"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="question.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/svg/question.png"
inkscape:export-xdpi="95.290001"
inkscape:export-ydpi="95.290001"><metadata
id="metadata41"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs39" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview37"
showgrid="false"
inkscape:zoom="11.513094"
inkscape:cx="8.8995661"
inkscape:cy="22.282322"
inkscape:current-layer="Capa_1" /><g
id="g3"
style="fill:#2ecc71;fill-opacity:1"><path
style="fill:#2ecc71;fill-opacity:1"
d="M38.291,4.927c-1.2-1.142-1.792-1.316-1.3-0.481c0.302,0.513,0.555,1.039,0.757,1.58 c0.543,1.457,0.815,2.814,0.815,4.074c0,2.087-0.272,3.803-0.815,5.15c-0.545,1.347-1.217,2.499-2.021,3.454 c-0.805,0.957-1.694,1.772-2.672,2.445c-0.978,0.675-1.903,1.347-2.771,2.021c-0.87,0.674-1.641,1.445-2.315,2.314 c-0.353,0.455-0.637,0.97-0.853,1.544c-0.344,0.915-0.419,2.27-0.419,2.954s-1.97,1.238-4.399,1.238s-4.399-0.657-4.399-1.467 v-1.467c0.131-1.867,0.488-3.432,1.075-4.693c0.587-1.26,1.271-2.336,2.053-3.227c0.783-0.889,1.607-1.662,2.477-2.314 c0.868-0.652,1.673-1.303,2.412-1.956c0.739-0.652,1.337-1.369,1.793-2.151c0.456-0.782,0.661-1.759,0.619-2.933 c0-1.999-0.488-3.476-1.466-4.433c-0.978-0.956-2.338-1.434-4.074-1.434c-1.174,0-2.184,0.228-3.033,0.684 c-0.847,0.456-1.542,1.065-2.085,1.826c-0.545,0.76-0.946,1.651-1.206,2.672c-0.134,0.525-0.234,1.07-0.299,1.635 c-0.105,0.912-2.237,1.658-4.883,1.658s-4.8-1.489-4.475-3.282c0.201-1.109,0.498-2.166,0.89-3.171 c0.759-1.956,1.825-3.651,3.193-5.085c0.047-0.05,0.098-0.096,0.148-0.142c0.084-0.076-1.022,0.527-2.327,1.548 C3.409,7.636,0,14.09,0,21.344c0,10.014,6.496,18.507,15.503,21.505c1.572,0.523,2.256,0.143,1.852-0.834 c-0.238-0.576-0.37-1.205-0.37-1.866c0-2.772,2.291-5.019,5.116-5.019s5.116,2.247,5.116,5.019c0,0.716-0.155,1.395-0.434,2.009 c-0.472,1.042,0.127,1.51,1.728,1.084c9.685-2.577,16.822-11.402,16.822-21.899C45.336,14.882,42.63,9.055,38.291,4.927z"
id="path5" /></g><g
id="g7" /><g
id="g9" /><g
id="g11" /><g
id="g13" /><g
id="g15" /><g
id="g17" /><g
id="g19" /><g
id="g21" /><g
id="g23" /><g
id="g25" /><g
id="g27" /><g
id="g29" /><g
id="g31" /><g
id="g33" /><g
id="g35" /></svg>
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
viewBox="0 0 356.484 356.484"
style="enable-background:new 0 0 356.484 356.484;"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="warning.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/svg/warning.png"
inkscape:export-xdpi="12.12"
inkscape:export-ydpi="12.12"><metadata
id="metadata39"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs37" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview35"
showgrid="false"
inkscape:zoom="1.4640855"
inkscape:cx="15.341685"
inkscape:cy="166.40318"
inkscape:current-layer="Capa_1" /><path
style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="M 162.55881,58.687198 C 26.637788,317.55186 27.320808,318.9179 27.320808,318.9179 l 299.845872,5.46416 -1.36604,0 -124.9927,-262.962781 2.04906,1.36604"
id="path3367"
inkscape:connector-curvature="0" /><path
d="M354.239,321.64L189.847,22.478c-2.79-5.078-7.01-7.991-11.578-7.991c-4.584,0-8.824,2.931-11.631,8.04L2.245,321.64 c-2.749,5.002-2.984,10.138-0.646,14.09c2.356,3.983,7.023,6.267,12.806,6.267H342.08c5.782,0,10.449-2.284,12.806-6.267 C357.224,331.778,356.988,326.642,354.239,321.64z M154.064,93.621c0.922-0.955,2.166-1.624,3.504-1.624h40.897 c1.338,0,2.581,0.669,3.501,1.624c0.92,0.955,1.4,2.289,1.35,3.627l-5.174,139.618c-0.102,2.735-2.411,5.132-5.147,5.132h-30.298 c-2.738,0-5.043-2.363-5.138-5.099l-4.851-139.584C152.661,95.977,153.143,94.575,154.064,93.621z M178.188,315.435 c-15.386,0-26.988-12.19-26.988-28.355c0-16.36,11.455-28.697,26.646-28.697c15.689,0,26.646,11.801,26.646,28.697 C204.491,303.775,193.675,315.435,178.188,315.435z"
id="path3"
style="fill:#f1c40f;fill-opacity:1" /><g
id="g5" /><g
id="g7" /><g
id="g9" /><g
id="g11" /><g
id="g13" /><g
id="g15" /><g
id="g17" /><g
id="g19" /><g
id="g21" /><g
id="g23" /><g
id="g25" /><g
id="g27" /><g
id="g29" /><g
id="g31" /><g
id="g33" /></svg>
|
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="10.999998"
height="11"
viewBox="0 0 10.999998 11"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="down.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/treeview/down.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata42"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs40" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1061"
id="namedview38"
showgrid="false"
inkscape:zoom="28.828239"
inkscape:cx="-11.563886"
inkscape:cy="3.3388835"
inkscape:window-x="-4"
inkscape:window-y="-4"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" /><g
id="g3"
transform="matrix(0,0.03565062,-0.03081232,0,10.999998,-0.86363513)"
style="fill:#95a5a6;fill-opacity:1"><g
id="play-arrow"
style="fill:#95a5a6;fill-opacity:1"><polygon
points="318.75,178.5 38.25,0 38.25,357 "
id="polygon6"
style="fill:#95a5a6;fill-opacity:1" /></g></g><g
id="g8"
transform="translate(-178.5,-165.60715)" /><g
id="g10"
transform="translate(-178.5,-165.60715)" /><g
id="g12"
transform="translate(-178.5,-165.60715)" /><g
id="g14"
transform="translate(-178.5,-165.60715)" /><g
id="g16"
transform="translate(-178.5,-165.60715)" /><g
id="g18"
transform="translate(-178.5,-165.60715)" /><g
id="g20"
transform="translate(-178.5,-165.60715)" /><g
id="g22"
transform="translate(-178.5,-165.60715)" /><g
id="g24"
transform="translate(-178.5,-165.60715)" /><g
id="g26"
transform="translate(-178.5,-165.60715)" /><g
id="g28"
transform="translate(-178.5,-165.60715)" /><g
id="g30"
transform="translate(-178.5,-165.60715)" /><g
id="g32"
transform="translate(-178.5,-165.60715)" /><g
id="g34"
transform="translate(-178.5,-165.60715)" /><g
id="g36"
transform="translate(-178.5,-165.60715)" /></svg>
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="11"
height="11"
viewBox="0 0 11 11"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="right.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/gui/images/treeview/right.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata42"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs40" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1061"
id="namedview38"
showgrid="false"
inkscape:zoom="49.506957"
inkscape:cx="1.8287641"
inkscape:cy="4.8854653"
inkscape:window-x="-4"
inkscape:window-y="-4"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" /><g
id="g3"
transform="matrix(0.03565062,0,0,0.03081232,-0.86363622,1.9073486e-6)"
style="fill:#95a5a6;fill-opacity:1"><g
id="play-arrow"
style="fill:#95a5a6;fill-opacity:1"><polygon
points="38.25,0 38.25,357 318.75,178.5 "
id="polygon6"
style="fill:#95a5a6;fill-opacity:1" /></g></g><g
id="g8"
transform="translate(-7.4999994,-339)" /><g
id="g10"
transform="translate(-7.4999994,-339)" /><g
id="g12"
transform="translate(-7.4999994,-339)" /><g
id="g14"
transform="translate(-7.4999994,-339)" /><g
id="g16"
transform="translate(-7.4999994,-339)" /><g
id="g18"
transform="translate(-7.4999994,-339)" /><g
id="g20"
transform="translate(-7.4999994,-339)" /><g
id="g22"
transform="translate(-7.4999994,-339)" /><g
id="g24"
transform="translate(-7.4999994,-339)" /><g
id="g26"
transform="translate(-7.4999994,-339)" /><g
id="g28"
transform="translate(-7.4999994,-339)" /><g
id="g30"
transform="translate(-7.4999994,-339)" /><g
id="g32"
transform="translate(-7.4999994,-339)" /><g
id="g34"
transform="translate(-7.4999994,-339)" /><g
id="g36"
transform="translate(-7.4999994,-339)" /></svg>
|
cannot compute difference between binary files
cannot compute difference between binary files
| ︙ | ︙ | |||
17 18 19 20 21 22 23 24 | mcText = 1 mcCross = 2 mcSizeH = 3 mcSizeV = 4 mcSizeUL_LR = 5 mcSizeLL_UR = 6 mcWait = 7 | > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
mcText = 1
mcCross = 2
mcSizeH = 3
mcSizeV = 4
mcSizeUL_LR = 5
mcSizeLL_UR = 6
mcWait = 7
mcHand = 8
mcDragHand = 9
mcPencil = 10
mcCount = 11
proc SetMouseCapture, .window
begin
pushad
xor edi, edi
mov esi, [.window]
cmp [.window], edi
je .setit
get edi, esi, TWindow:OSWindow
mov edi, [edi+TWindow.handle]
.setit:
mov [__MouseTarget], esi
stdcall __MouseCapture, edi
popad
return
endp
include '%TargetOS%/mouse.asm'
endmodule
|
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
| ︙ | ︙ | |||
9 10 11 12 13 14 15 | ; ; Dependencies: ; ; Notes: ;_________________________________________________________________________________________ module "System events library" | < < < < < < < < < < < < < | | < < | < < < < | < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < | | < | | | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
;
; Dependencies:
;
; Notes:
;_________________________________________________________________________________________
module "System events library"
mbLeft = 1
mbMiddle = 2
mbRight = 3
mbScrollUp = 4
mbScrollDn = 5
maskBtnLeft = $0100
maskBtnMiddle = $0200
maskBtnRight = $0400
maskShift = $1
maskCapsLock = $2
maskCtrl = $4
maskAlt = $8
maskScrLk = $10
; These are scan codes for the non character keys. They are OS dependent and should be used by
; their names.
include '%TargetOS%/keycodes.inc'
scTrack = 1
scUp = 2
scDown = 3
scWheelUp = 4
scWheelDn = 5
scrollX = 0
scrollY = 1
cerFromUser = 0 ; user pressed X button on the window header, pressed alt+F4 from the keyboard, or choose "Close" from the title menu.
cerFromProgram = 1 ; Method Close was executed from the program.
; creates and returns a string with the textual identifier of the pressed/released key.
proc CreateKeyName, .utf8, .scancode, .kbdStatus
begin
push ebx ecx esi edi
stdcall StrNew
mov ebx, eax
test [.kbdStatus], maskCtrl
jz @f
stdcall StrCharCat, ebx, 'Ctrl'
stdcall StrCharCat, ebx, '+'
@@:
test [.kbdStatus], maskAlt
jz @f
stdcall StrCharCat, ebx, 'Alt+'
@@:
test [.kbdStatus], maskShift
jz @f
stdcall StrCharCat, ebx, 'Shif'
stdcall StrCharCat, ebx, 't+'
@@:
mov ecx, [.utf8]
jecxz .searchlist
cmp ecx, ' '
jne @f
mov ecx, 'Spc'
@@:
cmp ecx, ' '
|
| ︙ | ︙ | |||
208 209 210 211 212 213 214 |
.searchlist:
mov esi, __FunctionalKeyNames
.loop:
movzx ecx, word [esi]
jecxz .notfound
| | | | 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
.searchlist:
mov esi, __FunctionalKeyNames
.loop:
movzx ecx, word [esi]
jecxz .notfound
cmp ecx, [.scancode]
je .found
add esi, 4
jmp .loop
.found:
movsx eax, word [esi+2]
add esi, eax
stdcall StrCat, ebx, esi
jmp .exitok
.notfound:
stdcall StrDel, ebx
xor eax, eax
stc
jmp .finish
;.strkey db 'key', 0
endp
macro keynames lbl, [scancode, name] {
common
label lbl word
forward
|
| ︙ | ︙ | |||
285 286 287 288 289 290 291 |
keyF8, 'F8', \
keyF9, 'F9', \
keyF10, 'F10', \
keyF11, 'F11', \
keyF12, 'F12', \
keyCapsLock, 'CapsLock', \
keyShiftLeft, 'ShiftL', \
| | | | | | | | 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
keyF8, 'F8', \
keyF9, 'F9', \
keyF10, 'F10', \
keyF11, 'F11', \
keyF12, 'F12', \
keyCapsLock, 'CapsLock', \
keyShiftLeft, 'ShiftL', \
keyCtrlLeft, 'LeftCtrl', \
keyAltLeft, 'LeftAlt', \
keyAltRight, 'RightAlt', \
keyPopupMenu, 'PopupMenu', \
keyShiftRight, 'RightShift', \
keyCtrlRight, 'RightCtrl', \
keyBackSpace, 'BkSp'
end if
endg
endmodule
|
| ︙ | ︙ | |||
179 180 181 182 183 184 185 |
proc __CaretTimerProc, .timer
begin
cmp [Caret.pWindow], 0
je .exit
| | | 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
proc __CaretTimerProc, .timer
begin
cmp [Caret.pWindow], 0
je .exit
or eax, -1
xchg [Caret.sync], eax
test eax, eax
jnz .exit ; don't wait for lock.
cmp [Caret.visible], 0
je @f
mov eax, 2
|
| ︙ | ︙ | |||
209 210 211 212 213 214 215 |
mov eax, [Caret.state]
cmp eax, [.operation]
je .exit
cmp [Caret.pWindow], 0
je .exit
| < < < < | < < < < < < < > < < < | | < < < > > > > > > | 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 |
mov eax, [Caret.state]
cmp eax, [.operation]
je .exit
cmp [Caret.pWindow], 0
je .exit
xor eax, 1
mov [Caret.state], eax
mov ecx, [Caret.timer]
mov eax, [CaretTimes+4*eax]
mov [ecx+TTimer.interval], eax
mov [ecx+TTimer.value], 0
jz .clean
push $ffFF0000
push [Caret.Pos.height] [Caret.Pos.width] [Caret.Pos.y] [Caret.Pos.x]
push [Caret.Pos.height] [Caret.Pos.width] [Caret.Pos.y] [Caret.Pos.x]
pop [Caret.OldPos.x] [Caret.OldPos.y] [Caret.OldPos.width] [Caret.OldPos.height]
mov eax, [Caret.pWindow]
get esi, [Caret.pWindow], TWindow:Canvas
stdcall DrawSolidRect, esi ; arguments from the stack
exec [Caret.pWindow], TWindow:Update
.exit:
pop esi ecx
return
.clean:
exec [Caret.pWindow], TWindow:Refresh ; cleans the caret by repainting the whole window? - not good solution, actually!!!
jmp .exit
endp
endmodule
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 |
; _______________________________________________________________________________________
;| |
;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." |
;|_______________________________________________________________________________________|
;
; Description: This file contains procedures and data, that form the appearance of the
; FreshLib GUI application. Colors, control borders, backgrownd drawing etc.
;
; Target OS: Any
;
; Dependencies:
;
; Notes: The user should be able to change these settings and if he uses external
; procedures, then the code from this library should not be compiled.
;_________________________________________________________________________________________
module "Runtime GUI themes support"
; Box border type
bxNone = 0
bxRaised = 1
bxSunken = 2
bxFlat = 3
bxFocused = 4
bxNoFill = $80000000
bxDisabled = $40000000
struct TMetaHeader
.pData dd ? ; pointer to the NamedArray data fields.
.length dd ? ; total length of the NamedArray structure: fields+static data+meta data.
.count dd ? ; count of the TMetaFields following.
ends
struct TMetaField
.pName dd ?
.type dw ?
.len dw ? ; length of the field in dwords
.offset dd ? ; offset of the field, relative to the start of the array.
ends
;
; The NamedArray is a type of structure that contains
; the fields names together with the field values.
; This way, the values of the array can be write to
; text files and then restored in runtime, based not
; on the fields offsets (that can differ) but based on
; field names.
;
___natNUM = 0 ; NUM, Stored as decimal, signed.
___natHEX = 1 ; HEX, Stored as hex, unsigned.
___natTXT = 2 ; TXT, Stored as string. Needs postprocessing.
___natFONT = 3 ; FONT, Stored as multivalue: face, size, flags, etc.
___natPNG = 4 ; PNG, Stored as a hex array. Need postprocessing.
___natFILE = 5 ; FILE, Stored as a hex array.
macro NamedArray lbl, [name, type, value] {
common
local ..fake_lbl
label ..fake_lbl dword
label lbl dword
; data fields
forward
local ..len, ..fake_name
..len = 0
label ..fake_name dword
if used lbl#.#name | (defined options.WholeTheme & options.WholeTheme)
label lbl#.#name dword
irp val, value \{
..len = ..len + 1
if (type eq NUM)|(type eq HEX)
dd val
else
if type eq TXT
if val eqtype 1
dd val
else
dd 0 ; will be changed later in the macro
end if
else
if (type eq FONT) | (type eq PNG)
dd 0 ; will be changed later in the macro.
dd 0
else
if type eq FILE
dd 0 ; pointer to data
else
Error! Unknown `type type.
end if
end if
end if
end if
\}
end if
; data for the strings, images, files, etc.
forward
local ..index
..index = 0
irp val, value \{
\local ..dta, ..len
if used lbl\#.\#name | (defined options.WholeTheme & options.WholeTheme)
if type eq TXT
if ~ val eqtype 1
..dta db val
db 0
end if
end if
if type eq FONT
match face : size : weight : flags, val \\{ ; For the Linux port, this structure is enough and not need FontCreate call.
\\local ..font_face
..dta dd ..font_face ; font face string
dd size ; NUM
dd weight ; NUM
dd flags ; HEX
..font_face db face, 0
\\}
..index = ..index + 4
end if
if type eq PNG
dd ..len
..dta file val
..len = $ - ..dta
..index = ..index + 4
end if
if type eq FILE
dd ..len
..dta file val
..len = $ - ..dta
end if
if defined ..dta
store dword ..dta at ..fake_name + ..index
end if
end if
..index = ..index + 4
\}
; Header of the meta data.
common
local ..cnt, ..total, ..fake_meta
..cnt = 0
if used lbl#.#meta | (defined options.WholeTheme & options.WholeTheme)
label lbl#.#meta dword
label ..fake_meta dword
dd ..fake_lbl
dd lbl#.#size
dd ..total
; metadata
forward
local ..namestr
; array with the fields names and offsets.
if defined lbl#.#name
dd ..namestr
dw ___nat#type
dw ..len ; dwords
dd ..fake_name - ..fake_lbl
..cnt = ..cnt + 1
end if
; field names
forward
if used ..namestr | (defined options.WholeTheme & options.WholeTheme)
..namestr db `name, 0
end if
; Initialization code
common
end if
if used lbl#.#Init | (defined options.WholeTheme & options.WholeTheme)
lbl#.#Init:
forward
local ..index
..index = 0
irp val, value \{
if used lbl\#.\#name | (defined options.WholeTheme & options.WholeTheme)
if type eq FONT
mov eax, [..fake_name+..index+4]
stdcall FontCreate, [eax+__TFont.hFontFace], [eax+__TFont.height], [eax+__TFont.weight], [eax+__TFont.flags]
mov [..fake_name+..index], eax
..index = ..index + 4
end if
if (type eq PNG)
mov eax, [..fake_name+..index+4]
stdcall CreateImagePNG, eax, [eax-4]
mov [..fake_name+..index], eax
..index = ..index + 4
end if
end if
..index = ..index + 4
\}
common
retn
end if
common
lbl#.#size = $ - ..fake_lbl
..total = ..cnt
}
; Serializes the NamedArray to a string.
; .pMeta - poitner to the meta data of the named array structure.
proc NamedArrayToString, .pMeta
.array dd ?
.data2string dd ?
.datalen dd ?
begin
pushad
mov esi, [.pMeta]
stdcall StrNew
mov edi, eax
lodsd
mov [.array], eax
lodsd ; TMetaHeader.length
lodsd
mov ecx, eax ; count of the meta records.
.loop:
dec ecx
js .end_loop
lodsd ; pointer to the field name.
stdcall StrCat, edi, eax
stdcall StrCharCat, edi, " = "
lodsw ; data type
movzx eax, ax
push [.data_handlers+4*eax]
push [.data_len+4*eax]
pop [.datalen]
pop [.data2string]
lodsw
movzx edx, ax ; number of sub values
lodsd ; offset, relative to [.array]
mov ebx, eax
add ebx, [.array] ; pointer to the values
.loop2:
dec edx
js .end_loop2
stdcall [.data2string], ebx
push eax
stdcall StrCat, edi, eax
stdcall StrDel ; from the stack
add ebx, [.datalen]
test edx, edx
jz .loop2
stdcall StrCharCat, edi, ", "
jmp .loop2
.end_loop2:
stdcall StrCharCat, edi, $0a0d
jmp .loop
.end_loop:
mov [esp+regEAX*4], edi
popad
return
.data_handlers dd __DataToNum, __DataToHex, __DataToTxt, __DataToFont, __DataToPng, __DataToFile
.data_len dd 4, 4, 4, 8, 8, 4
endp
proc __DataToNum, .pData
begin
mov eax, [.pData]
stdcall NumToStr, [eax], ntsDec or ntsSigned
return
endp
proc __DataToHex, .pData
begin
mov eax, [.pData]
stdcall NumToStr, [eax], ntsHex or ntsUnsigned
stdcall StrCharInsert, eax, '$', 0
return
endp
proc __DataToTxt, .pData
begin
mov eax, [.pData]
stdcall StrDupMem, [eax]
stdcall StrSetQuotes, eax, 0
return
endp
proc __DataToFont, .pData
begin
push esi ebx
mov esi, [.pData]
mov esi, [esi+4]
stdcall StrDup, [esi+__TFont.hFontFace] ; face name
stdcall StrSetQuotes, eax, 0
mov ebx, eax
stdcall StrCharCat, ebx, " : "
stdcall NumToStr, [esi+__TFont.height], ntsDec or ntsUnsigned ; size
stdcall StrCat, ebx, eax
stdcall StrDel, eax
stdcall StrCharCat, ebx, " : "
stdcall NumToStr, [esi+__TFont.weight], ntsDec or ntsUnsigned ; weight
stdcall StrCat, ebx, eax
stdcall StrDel, eax
stdcall StrCharCat, ebx, " : $"
stdcall NumToStr, [esi+__TFont.flags], ntsHex or ntsUnsigned ; flags
stdcall StrCat, ebx, eax
stdcall StrDel, eax
mov eax, ebx
pop ebx esi
return
endp
proc __DataToPng, .pData
begin
pushad
mov esi, [.pData]
mov esi, [esi+4] ; pointer to the compressed file.
mov ecx, [esi-4] ; length
jmp __DataToFile.convert_file
endp
proc __DataToFile, .pData
begin
pushad
mov esi, [.pData]
mov esi, [esi] ; pointer to the compressed file.
mov ecx, [esi-4] ; length
.convert_file:
stdcall NumToStr, ecx, ntsDec or ntsUnsigned
mov ebx, eax
stdcall StrCharCat, ebx, ":"
stdcall EncodeBase64, esi, ecx
push eax
stdcall StrCat, ebx, eax
stdcall StrDel ; from the stack
mov [esp+regEAX*4], ebx
popad
return
endp
proc StringToNamedArray, .pMeta, .hString
.string2data dd ?
.free_data dd ?
.data_start dd ?
.data_end dd ?
begin
pushad
mov esi, [.pMeta]
mov eax, [esi+TMetaHeader.pData]
mov [.data_start], eax
add eax, [esi+TMetaHeader.length]
mov [.data_end], eax
stdcall StrSplitList, [.hString], $0a, FALSE
mov esi, eax
xor ecx, ecx
.loop:
cmp ecx, [esi+TArray.count]
jae .end_loop
stdcall StrSplitList, [esi+TArray.array+4*ecx], "=", FALSE
mov edi, eax
cmp [edi+TArray.count], 2
jne .next_line
stdcall __SearchName, [.pMeta], [edi+TArray.array]
test eax, eax
jz .free1
push esi ecx
mov ebx, eax
stdcall StrSplitList, [edi+TArray.array+4], ',', FALSE
mov edx, eax
movzx ecx, [ebx+TMetaField.len]
cmp ecx, [edx+TArray.count]
jb .free2 ; there is no place to restore this parameter.
movzx eax, [ebx+TMetaField.type]
push [.data_handlers+4*eax]
push [.free_handlers+4*eax]
pop [.free_data]
pop [.string2data]
mov esi, [ebx+TMetaField.offset]
add esi, [.data_start] ; pointer to the data field.
xor ecx, ecx
.loop2:
cmp ecx, [edx+TArray.count]
jae .free2
call [.free_data]
stdcall [.string2data], [edx+TArray.array+4*ecx]
inc ecx
jmp .loop2
.free2:
stdcall ListFree, edx, StrDel
pop ecx esi
.free1:
stdcall ListFree, edi, StrDel
.next_line:
inc ecx
jmp .loop
.end_loop:
stdcall ListFree, esi, StrDel
popad
return
.data_handlers dd __NumToData, __NumToData, __TxtToData, __FontToData, __PngToData, __FileToData
.free_handlers dd .end_free, .end_free, .free_txt, .free_font, .free_png, .free_file
.check_ptr:
test eax, eax
jz .out
cmp eax, [.data_start]
jb .out
cmp eax, [.data_end]
ja .out
;in
stc
retn
.out:
clc
retn
.free_txt:
stdcall StrDel, [esi]
retn
.free_font:
stdcall FontDestroy, [esi]
mov eax, [esi+4]
call .check_ptr
jc .end_free
stdcall StrDel, [eax+__TFont.hFontFace]
retn
.free_png:
stdcall DestroyImage, [esi]
mov eax, [esi+4]
.free_ptr:
sub eax, 4
call .check_ptr
jc .end_free
stdcall FreeMem, eax
.end_free:
retn
.free_file:
mov eax, [esi]
jmp .free_ptr
endp
proc __NumToData, .hString
begin
stdcall StrToNumEx, [.hString]
mov [esi], eax
add esi, 4
return
endp
proc __TxtToData, .hString
begin
stdcall StrDup, [.hString]
stdcall StrClipQuotes, eax
mov [esi], eax
add esi, 4
return
endp
proc __FontToData, .hString
begin
push ebx ecx edx edi
xor eax, eax
mov [esi], eax
mov edi, [esi+4] ; pointer to the font parameters.
stdcall StrSplitList, [.hString], ":", FALSE
mov edx, eax
cmp [edx+TArray.count], 4
jne .finish
stdcall StrClipQuotes, [edx+TArray.array]
stdcall StrDup, [edx+TArray.array]
mov [edi+__TFont.hFontFace], eax
stdcall StrToNumEx, [edx+TArray.array+4] ; size
mov [edi+__TFont.height], eax
mov ebx, eax
stdcall StrToNumEx, [edx+TArray.array+8] ; weight
mov [edi+__TFont.weight], eax
mov ecx, eax
stdcall StrToNumEx, [edx+TArray.array+12] ; flags
mov [edi+__TFont.flags], eax
mov edi, eax
stdcall StrPtr, [edx+TArray.array]
stdcall FontCreate, eax, ebx, ecx, edi
stdcall ListFree, edx, StrDel
mov [esi], eax
add esi, 8
.finish:
pop edi edx ecx ebx
return
endp
proc __PngToData, .hString
begin
push edx
stdcall StrSplitList, [.hString], ":", FALSE
mov edx, eax
cmp [edx+TArray.count], 2
jne .finish
stdcall DecodeBase64, [edx+TArray.array+4]
mov [esi+4], eax
stdcall CreateImagePNG, eax, [eax-4]
mov [esi], eax
.finish:
add esi, 8
pop edx
return
endp
proc __FileToData, .hString
begin
push edx
stdcall StrSplitList, [.hString], ":", FALSE
mov edx, eax
cmp [edx+TArray.count], 2
jne .finish
stdcall DecodeBase64, [edx+TArray.array+4]
mov [esi], eax
.finish:
add esi, 4
pop edx
return
endp
; returns a pointer to the parameter description block: name, count, offset.
proc __SearchName, .pMeta, .hName
begin
push esi ecx
mov esi, [.pMeta]
mov ecx, [esi+TMetaHeader.count]
add esi, sizeof.TMetaHeader
.search:
dec ecx
js .not_found
stdcall StrCompCase, [esi+TMetaField.pName], [.hName]
jc .found
add esi, sizeof.TMetaField
jmp .search
.not_found:
xor esi, esi
.found:
mov eax, esi
pop ecx esi
return
endp
iglobal
; drawing functions.
var DrawBox = DrawBoxDefault
var DrawSlider = DrawSliderDefault
var DrawSplitter = DrawSplitterDefault
endg
proc DrawBoxDefault, .pImage, .pBounds, .bkground, .border, .brd_width
begin
pushad
mov esi, [.pBounds]
mov edx, [.border]
and edx, $ff
jz .borderok
mov eax, [GUI.clBorderLight]
mov ecx, [GUI.clBorderDark]
test [.border], bxDisabled
jz .enabled_ok
mov eax, [GUI.clBorderLightGray]
mov ecx, [GUI.clBorderDarkGray]
.enabled_ok:
cmp edx, bxRaised
je .colorok
xchg eax, ecx
cmp edx, bxSunken
je .colorok
mov eax, [GUI.clBorderNeutralGray]
test [.border], bxDisabled
jnz .flat_ok
mov eax, [GUI.clBorderNeutral]
.flat_ok:
mov ecx, eax
cmp edx, bxFlat
je .colorok
mov eax, [GUI.clBorderFocused]
mov ecx, eax
.colorok:
mov ebx, [.brd_width]
; left border line
stdcall DrawSolidRect, [.pImage], [esi+TBounds.x],[esi+TBounds.y], ebx, [esi+TBounds.height], eax
; top
add [esi+TBounds.x], ebx
sub [esi+TBounds.width], ebx
stdcall DrawSolidRect, [.pImage], [esi+TBounds.x], [esi+TBounds.y], [esi+TBounds.width], ebx, eax
; right
sub [esi+TBounds.width], ebx
add [esi+TBounds.y], ebx
sub [esi+TBounds.height], ebx
mov edx, [esi+TBounds.width]
add edx, [esi+TBounds.x]
stdcall DrawSolidRect, [.pImage], edx, [esi+TBounds.y], ebx, [esi+TBounds.height], ecx
; bottom
sub [esi+TBounds.height], ebx
mov edx, [esi+TBounds.y]
add edx, [esi+TBounds.height]
stdcall DrawSolidRect, [.pImage], [esi+TBounds.x], edx, [esi+TBounds.width], ebx, ecx
.borderok:
bt [.border], 31
jc .fillok
stdcall DrawSolidRect, [.pImage], [esi+TBounds.x], [esi+TBounds.y], [esi+TBounds.width], [esi+TBounds.height], [.bkground]
.fillok:
popad
return
endp
sliderHorizontal = 0
sliderVertical = 1
proc DrawSliderDefault, .pImage, .pBounds, .bkground, .type
begin
stdcall DrawBoxDefault, [.pImage], [.pBounds], [.bkground], [scrollBorder], 2
return
endp
proc DrawSplitterDefault, .pImage, .pRect, .type
begin
pushad
mov esi, [.pRect]
mov eax, [esi+RECT.right]
mov ecx, [esi+RECT.bottom]
sub eax, [esi+RECT.left]
sub ecx, [esi+RECT.top]
stdcall DrawSolidRect, [.pImage], [esi+RECT.left], [esi+RECT.top], eax, ecx, [GUI.clSplitter]
popad
return
endp
proc DrawSplitterDefault2, .pImage, .pRect, .type
.bounds TBounds
begin
pushad
mov esi, [.pRect]
mov eax, [esi+RECT.left]
mov ecx, [esi+RECT.top]
mov edx, [esi+RECT.right]
mov ebx, [esi+RECT.bottom]
sub edx, eax
sub ebx, ecx
mov [.bounds.x], eax
mov [.bounds.y], ecx
mov [.bounds.width], edx
mov [.bounds.height], ebx
lea eax, [.bounds]
stdcall DrawBoxDefault, [.pImage], eax, [GUI.clDialogBk], bxSunken, [GUI.boxBorderWidth]
popad
return
endp
endmodule
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
; _______________________________________________________________________________________
;| |
;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." |
;|_______________________________________________________________________________________|
;
; Description: This file contains procedures and data, that form the appearance of the
; FreshLib GUI application. Colors, control borders, backgrownd drawing etc.
;
; Target OS: Any
;
; Dependencies:
;
; Notes: The user should be able to change these settings and if he uses external
; procedures, then the code from this library should not be compiled.
;_________________________________________________________________________________________
module "GUI theme data and code library"
; Named theme colors
; cyan
clTurquoise = $ff1abc9c
clGreenSea = $ff16A085
; green
clEmerald = $ff2ecc71
clNephritis = $ff27ae60
; blue
clPetermann = $ff3498db
clBelizeHole = $ff2980b9
; purple
clAmethyst = $ff9b59b6
clWisteria = $ff8e44ad
; black
clWetAsphalt = $ff34495e
clMidnight = $ff2c3e50
; gray
clConcrete = $ff95a5a6
clAsbestos = $ff7f8c8d
; light gray / white
clClouds = $ffecf0f1
clSilver = $ffbdc3c7
clWhite = $ffffffff
; Yellow / orange
clSunflower = $fff1c40f
clOrange = $fff39c12
; Brown / orange
clCarrot = $ffe67e22
clPumpkin = $ffd35400
; Red
clAlizarin = $ffe74c3c
clPomegranate = $ffc0392b
iglobal
NamedArray GUI, \
\
\ ; Widgets border colors and width
clBorderNeutral, HEX, clTurquoise, \
clBorderLight, HEX, clTurquoise, \
clBorderDark, HEX, clTurquoise, \
clBorderNeutralGray, HEX, $ff606060, \
clBorderLightGray, HEX, $ff606060, \
clBorderDarkGray, HEX, $ff606060, \
clBorderFocused, HEX, clAlizarin, \
\
boxBorderWidth, NUM, 2, \
\
\ ; TButton colors and styles. The multivalue fields are for Neutral, Hovered and Pressed states.
\
clBtnBk, HEX, <clTurquoise, $ff48c9b0, clGreenSea, $807b7b7b>, \
clBtnTxt, HEX, <clWhite, clWhite, clSilver, $80ffffff>, \
btnBorder, NUM, <bxNone, bxNone, bxNone, bxNone>, \
btnPressedOfsX, NUM, 0, \
btnPressedOfsY, NUM, 0, \
btnMarginX, NUM, 8, \
btnMarginY, NUM, 8, \
\
\ ; TEdit colors and styles.
\
clEditBk, HEX, clClouds, \
clEditBkFocused, HEX, clClouds, \
clEditTxt, HEX, $ff000000, \
clEditSel, HEX, clBelizeHole and $00ffffff or $60000000, \
clEditSelTxt, HEX, $ffffffff, \
editBorder, NUM, bxFlat, \
editBorderFocused, NUM, bxFlat, \
\
\ ; Dialog boxes and TForm color and styles
\
clDialogBk, HEX, clClouds, \
clDialogTxt, HEX, $ff000000, \
clSplitter, HEX, clWetAsphalt, \
\
\ ; TProgress colors and styles
\
clProgressBk, HEX, clClouds, \
clProgressBar, HEX, clTurquoise, \
progressBorder, NUM, bxFlat, \
\
\ ; TScrollbar colors and styles
\
clScrollBk, HEX, <clSilver and $3fffffff, clSilver and $a0ffffff>, \
clScrollSlider, HEX, <clAsbestos and $7fffffff, clTurquoise>, \
borderScroll, NUM, bxNone, \
scrollWidth, NUM, 12, \
minSliderHeight, NUM, 12, \
\
\ ; TLabel colors and styles
\
clLabelBk, HEX, $00000000, \
clLabelTxt, HEX, $ff000000, \
\
\ ; TTreeView colors and styles.
\
clTreeViewBack, HEX, clClouds, \
clTreeViewText, HEX, $ff000000, \
clTreeSelected, HEX, clBelizeHole, \
clTreeSelectedTxt, HEX, clWhite, \
clTreeFocused, HEX, clPumpkin, \
clTreeFocusedTxt, HEX, clWhite, \
\
tvBorder, NUM, bxFlat, \
\
tvIcons, PNG, <"%lib%/gui/images/treeview/right.png", "%lib%/gui/images/treeview/down.png">, \
\
\ ; TMenu colors and styles
\
clMenuBack, HEX, clClouds, \
clMenuText, HEX, $ff000000, \
clMenuTextGray, HEX, $90000000, \
borderMenu, NUM, bxFlat, \
menuIconMargin, NUM, 4, \
menuMinTextDist, NUM, 32, \
menuSubIcon, PNG, "%lib%/gui/images/menu/submenu.png", \
menuSubIconSel, PNG, "%lib%/gui/images/menu/submenusel.png", \
menuSubIconGray, PNG, "%lib%/gui/images/menu/submenugray.png", \
\
\ ; Menu graphics
\
iconMenuChecked, PNG, "%lib%/gui/images/menu/check_flat.png", \
iconMenuCheckedGray, PNG, "%lib%/gui/images/menu/check_flat_gray.png", \
\
\ ; Checkbox colors
\
clCheckboxBack, HEX, <$ffe0e0e0, $ffffffff, $ffc0c0c0, $80c0c0c0>, \
clCheckboxTxt, HEX, $ff000000, \
clCheckboxTxtGray, HEX, $ff606060, \
cbIconSize, NUM, 13, \
cbMargin, NUM, 2, \
borderCheckbox, NUM, bxFlat, \
iconChecked, PNG, "%lib%/gui/images/checkbox/check_flat.png", \
iconCheckedGray, PNG, "%lib%/gui/images/checkbox/check_flat_gray.png", \
\
\ ; Default font
\
DefaultFont, FONT, "Liberation Sans": 13 : fwDemibold : 0
endg
endmodule
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
; _______________________________________________________________________________________
;| |
;| ..::FreshLib::.. Free, open source. Licensed under "BSD 2-clause" license." |
;|_______________________________________________________________________________________|
;
; Description: This file contains procedures and data, that form the appearance of the
; FreshLib GUI application. Colors, control borders, backgrownd drawing etc.
;
; Target OS: Any
;
; Dependencies:
;
; Notes: The user should be able to change these settings and if he uses external
; procedures, then the code from this library should not be compiled.
;_________________________________________________________________________________________
module "GUI theme data and code library"
; Theme colors and other parameters as margins, offsets, fonts, etc.
iglobal
NamedArray GUI, \
\
\ ; Widgets border colors and width
clBorderNeutral, HEX, $ffa0a0a0, \
clBorderLight, HEX, $ffffffff, \
clBorderDark, HEX, $ff404040, \
clBorderNeutralGray, HEX, $ff909090, \
clBorderLightGray, HEX, $ffe0e0e0, \
clBorderDarkGray, HEX, $ff808080, \
clBorderFocused, HEX, $ffff8000, \
\
boxBorderWidth, NUM, 1, \
\
\ ; TButton colors and styles. The multivalue fields are for Neutral, Hovered and Pressed states.
\
clBtnBk, HEX, <$ffd4d0c8, $ffe0e0e0, $ffa0a0a0, $80d4d0c8>, \
clBtnTxt, HEX, <$ff000000, $ff000000, $ff000000, $ff606060>, \
btnBorder, NUM, <bxRaised, bxRaised, bxSunken>, \
btnPressedOfsX, NUM, 1, \
btnPressedOfsY, NUM, 1, \
btnMarginX, NUM, 8, \
btnMarginY, NUM, 8, \
\
\ ; TEdit colors and styles.
\
clEditBk, HEX, $ffffffff, \
clEditBkFocused, HEX, $ffffffff, \
clEditTxt, HEX, $ff000000, \
clEditSel, HEX, $600a246c, \
clEditSelTxt, HEX, $ffffffff, \
editBorder, NUM, bxSunken, \
editBorderFocused, NUM, bxSunken, \
\
\ ; Dialog boxes and TForm color and styles
\
clDialogBk, HEX, $ffd4d0c8, \
clDialogTxt, HEX, $ff000000, \
clSplitter, HEX, $ff606060, \
\
\ ; TProgress colors and styles
\
clProgressBk, HEX, $ffd4d0c8, \
clProgressBar, HEX, $ff0a246c, \
progressBorder, NUM, bxSunken, \
\
\ ; TScrollbar colors and styles
\
clScrollBk, HEX, <$3f808080, $a0d4d0c8>, \
clScrollSlider, HEX, <$7fd4d0c8, $ffd4d0c8>, \
borderScroll, NUM, bxRaised, \
scrollWidth, NUM, 16, \
minSliderHeight, NUM, 16, \
\
\ ; TLabel colors and styles
\
clLabelBk, HEX, $00ffffff, \
clLabelTxt, HEX, $ff000000, \
\
\ ; TTreeView colors and styles.
\
clTreeViewBack, HEX, $ffffffff, \
clTreeViewText, HEX, $ff000000, \
clTreeSelected, HEX, $ff0a246c, \
clTreeSelectedTxt, HEX, $ffffffff, \
clTreeFocused, HEX, $ff0a246c, \
clTreeFocusedTxt, HEX, $ffffff00, \
\
tvBorder, NUM, bxSunken, \
\
tvIcons, PNG, <"%lib%/gui/images/treeview/plus.png", "%lib%/gui/images/treeview/minus.png">, \
\
\ ; TMenu colors and styles
\
clMenuBack, HEX, $ffd4d0c8, \
clMenuText, HEX, $ff000000, \
clMenuTextGray, HEX, $80000000, \
borderMenu, NUM, bxRaised, \
menuIconMargin, NUM, 4, \
menuMinTextDist, NUM, 32, \
menuSubIcon, PNG, "%lib%/gui/images/menu/submenu.png", \
menuSubIconSel, PNG, "%lib%/gui/images/menu/submenusel.png", \
menuSubIconGray, PNG, "%lib%/gui/images/menu/submenugray.png", \
\
\ ; Menu graphics
\
iconMenuChecked, PNG, "%lib%/gui/images/menu/check.png", \
iconMenuCheckedGray,PNG, "%lib%/gui/images/menu/check_gray.png", \
\
\ ; Checkbox colors
\
clCheckboxBack, HEX, <$ffffffff, $ffffffff, $ffffffff, $ffc0c0c0>, \
clCheckboxTxt, HEX, $ff000000, \
clCheckboxTxtGray, HEX, $ff808080, \
cbIconSize, NUM, 13, \
cbMargin, NUM, 2, \
borderCheckbox, NUM, bxSunken, \
iconChecked, PNG, "%lib%/gui/images/checkbox/check.png", \
iconCheckedGray, PNG, "%lib%/gui/images/checkbox/check_gray.png", \
\
\ ; Default font
\
DefaultFont, FONT, "Liberation Sans":13:fwNormal:0
endg
endmodule
|
| ︙ | ︙ | |||
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
;
; Notes:
;_________________________________________________________________________________________
import_proto 'libfontconfig.so.1', \
FcInitLoadConfigAndFonts, <VOID>, 'FcInitLoadConfigAndFonts', \
FcPatternCreate, <VOID>, 'FcPatternCreate', \
FcObjectSetBuild, <.first, ...>, 'FcObjectSetBuild', \
FcFontList, <.config, .pPattern, .ObjSet>, 'FcFontList', \
FcPatternGetString, <.pPattern, .obj, .n, .pBuffer>, 'FcPatternGetString', \
FcPatternGetInteger, <.pPattern, .obj, .n, .pInt>, 'FcPatternGetInteger', \
FcFontSetDestroy, <.pFontSet>, 'FcFontSetDestroy', \
FcNameParse, <.name>, 'FcNameParse', \
FcConfigSubstitute, <.config, .pattern, .matchkind>, 'FcConfigSubstitute', \
FcDefaultSubstitute, <.pattern>, 'FcDefaultSubstitute', \
FcFontMatch, <.config, .pattern, .pResult>, 'FcFontMatch', \
| > > | > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
;
; Notes:
;_________________________________________________________________________________________
import_proto 'libfontconfig.so.1', \
FcInit, <VOID>, 'FcInit', \
FcFini, <VOID>, 'FcFini', \
FcInitLoadConfigAndFonts, <VOID>, 'FcInitLoadConfigAndFonts', \
FcPatternCreate, <VOID>, 'FcPatternCreate', \
FcObjectSetBuild, <.first, ...>, 'FcObjectSetBuild', \
FcFontList, <.config, .pPattern, .ObjSet>, 'FcFontList', \
FcPatternGetString, <.pPattern, .obj, .n, .pBuffer>, 'FcPatternGetString', \
FcPatternGetInteger, <.pPattern, .obj, .n, .pInt>, 'FcPatternGetInteger', \
FcFontSetDestroy, <.pFontSet>, 'FcFontSetDestroy', \
FcNameParse, <.name>, 'FcNameParse', \
FcConfigSubstitute, <.config, .pattern, .matchkind>, 'FcConfigSubstitute', \
FcDefaultSubstitute, <.pattern>, 'FcDefaultSubstitute', \
FcFontMatch, <.config, .pattern, .pResult>, 'FcFontMatch', \
FcPatternDestroy, <.pattern>, 'FcPatternDestroy', \
FcPatternPrint, <.pattern>, 'FcPatternPrint'
|
| ︙ | ︙ | |||
30 31 32 33 34 35 36 37 38 39 40 41 42 |
.max_bytes, .requester, .req_data, .pManager>, 'FTC_Manager_New', \
FTC_Manager_LookupFace, <.manager, .face_id, .pFace>, 'FTC_Manager_LookupFace', \
FTC_Manager_LookupSize, <.manager, .scaler, .pSize>, 'FTC_Manager_LookupSize', \
FTC_Manager_RemoveFaceID, <.manager, .face_id>, 'FTC_Manager_RemoveFaceID', \
FTC_ImageCache_New, <.manager, .pImageCache>, 'FTC_ImageCache_New', \
FTC_ImageCache_Lookup, <.cache, .type, .glyph_index, \
.pGlyph, .pNode>, 'FTC_ImageCache_Lookup', \
FTC_CMapCache_New, <.manager, .pCMapCache>, 'FTC_CMapCache_New', \
FTC_CMapCache_Lookup, <.cache, .face_id, .cmap_index, .char_code>, 'FTC_CMapCache_Lookup'
| > > | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
.max_bytes, .requester, .req_data, .pManager>, 'FTC_Manager_New', \
FTC_Manager_LookupFace, <.manager, .face_id, .pFace>, 'FTC_Manager_LookupFace', \
FTC_Manager_LookupSize, <.manager, .scaler, .pSize>, 'FTC_Manager_LookupSize', \
FTC_Manager_RemoveFaceID, <.manager, .face_id>, 'FTC_Manager_RemoveFaceID', \
FTC_ImageCache_New, <.manager, .pImageCache>, 'FTC_ImageCache_New', \
FTC_ImageCache_Lookup, <.cache, .type, .glyph_index, \
.pGlyph, .pNode>, 'FTC_ImageCache_Lookup', \
FTC_ImageCache_LookupScaler, <.cache, .scaler, .load_flags, \
.gindex, .pGlyph, .pNode>, 'FTC_ImageCache_LookupScaler', \
FTC_CMapCache_New, <.manager, .pCMapCache>, 'FTC_CMapCache_New', \
FTC_CMapCache_Lookup, <.cache, .face_id, .cmap_index, .char_code>, 'FTC_CMapCache_Lookup'
|
| ︙ | ︙ | |||
44 45 46 47 48 49 50 |
XBlackPixelOfScreen ,<NONE>, 'XBlackPixelOfScreen', \
XCellsOfScreen ,<NONE>, 'XCellsOfScreen', \
XChangeActivePointerGrab ,<NONE>, 'XChangeActivePointerGrab', \
XChangeGC ,<NONE>, 'XChangeGC', \
XChangeKeyboardControl ,<NONE>, 'XChangeKeyboardControl', \
XChangeKeyboardMapping ,<NONE>, 'XChangeKeyboardMapping', \
XChangePointerControl ,<NONE>, 'XChangePointerControl', \
| | | | | 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
XBlackPixelOfScreen ,<NONE>, 'XBlackPixelOfScreen', \
XCellsOfScreen ,<NONE>, 'XCellsOfScreen', \
XChangeActivePointerGrab ,<NONE>, 'XChangeActivePointerGrab', \
XChangeGC ,<NONE>, 'XChangeGC', \
XChangeKeyboardControl ,<NONE>, 'XChangeKeyboardControl', \
XChangeKeyboardMapping ,<NONE>, 'XChangeKeyboardMapping', \
XChangePointerControl ,<NONE>, 'XChangePointerControl', \
XChangeProperty ,<.display, .wnd, .property, .type, .format, .mode, .pData, .n_elements>, 'XChangeProperty', \
XChangeSaveSet ,<NONE>, 'XChangeSaveSet', \
XChangeWindowAttributes ,<.display, .hwnd, .valmask, .pSetWinAttr>, 'XChangeWindowAttributes', \
XCheckIfEvent ,<NONE>, 'XCheckIfEvent', \
XCheckMaskEvent ,<NONE>, 'XCheckMaskEvent', \
XCheckTypedEvent ,<.display, .event_type, .pEvent>, 'XCheckTypedEvent', \
XCheckTypedWindowEvent ,<NONE>, 'XCheckTypedWindowEvent', \
XCheckWindowEvent ,<NONE>, 'XCheckWindowEvent', \
XCirculateSubwindows ,<NONE>, 'XCirculateSubwindows', \
XCirculateSubwindowsDown ,<NONE>, 'XCirculateSubwindowsDown', \
XCirculateSubwindowsUp ,<NONE>, 'XCirculateSubwindowsUp', \
XClearArea ,<.display, .window, .x, .y, .width, .height, .exposures>, 'XClearArea', \
XClearWindow ,<NONE>, 'XClearWindow', \
XClipBox ,<NONE>, 'XClipBox', \
XCloseDisplay ,<NONE>, 'XCloseDisplay', \
XCloseIM ,<NONE>, 'XCloseIM', \
XCloseOM ,<NONE>, 'XCloseOM', \
XConfigureWindow ,<NONE>, 'XConfigureWindow', \
XConnectionNumber ,<NONE>, 'XConnectionNumber', \
XContextDependentDrawing ,<NONE>, 'XContextDependentDrawing', \
XContextualDrawing ,<NONE>, 'XContextualDrawing', \
XConvertCase ,<NONE>, 'XConvertCase', \
XConvertSelection ,<.display, .selection, .target, .property, .requestor, .time>, 'XConvertSelection', \
XCopyArea ,<NONE>, 'XCopyArea', \
XCopyColormapAndFree ,<NONE>, 'XCopyColormapAndFree', \
XCopyGC ,<NONE>, 'XCopyGC', \
XCopyPlane ,<NONE>, 'XCopyPlane', \
XCreateBitmapFromData ,<NONE>, 'XCreateBitmapFromData', \
XCreateColormap ,<NONE>, 'XCreateColormap', \
XCreateFontCursor ,<NONE>, 'XCreateFontCursor', \
XCreateFontSet ,<NONE>, 'XCreateFontSet', \
XCreateGC ,<.display, .drawable, .mask, .pValues>, 'XCreateGC', \
XCreateGlyphCursor ,<NONE>, 'XCreateGlyphCursor', \
XCreateIC ,<NONE>, 'XCreateIC', \
XCreateImage ,<NONE>, 'XCreateImage', \
XCreateOC ,<NONE>, 'XCreateOC', \
XCreatePixmap ,<NONE>, 'XCreatePixmap', \
XCreatePixmapCursor ,<NONE>, 'XCreatePixmapCursor', \
XCreatePixmapFromBitmapData ,<NONE>, 'XCreatePixmapFromBitmapData', \
|
| ︙ | ︙ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 |
; gdiplus.dll API calls (ASCII)
import_proto gdiplus, \
GdipAddPathArc, <NONE>, 'GdipAddPathArc', \
GdipAddPathArcI, <NONE>, 'GdipAddPathArcI', \
GdipAddPathBezier, <NONE>, 'GdipAddPathBezier', \
GdipAddPathBezierI, <NONE>, 'GdipAddPathBezierI', \
GdipAddPathBeziers, <NONE>, 'GdipAddPathBeziers', \
GdipAddPathBeziersI, <NONE>, 'GdipAddPathBeziersI', \
GdipAddPathClosedCurve, <NONE>, 'GdipAddPathClosedCurve', \
GdipAddPathClosedCurve2, <NONE>, 'GdipAddPathClosedCurve2', \
GdipAddPathClosedCurve2I, <NONE>, 'GdipAddPathClosedCurve2I', \
GdipAddPathClosedCurveI, <NONE>, 'GdipAddPathClosedCurveI', \
GdipAddPathCurve, <NONE>, 'GdipAddPathCurve', \
GdipAddPathCurve2, <NONE>, 'GdipAddPathCurve2', \
GdipAddPathCurve2I, <NONE>, 'GdipAddPathCurve2I', \
GdipAddPathCurve3, <NONE>, 'GdipAddPathCurve3', \
GdipAddPathCurve3I, <NONE>, 'GdipAddPathCurve3I', \
GdipAddPathCurveI, <NONE>, 'GdipAddPathCurveI', \
GdipAddPathEllipse, <NONE>, 'GdipAddPathEllipse', \
GdipAddPathEllipseI, <NONE>, 'GdipAddPathEllipseI', \
GdipAddPathLine, <NONE>, 'GdipAddPathLine', \
GdipAddPathLine2, <NONE>, 'GdipAddPathLine2', \
GdipAddPathLine2I, <NONE>, 'GdipAddPathLine2I', \
GdipAddPathLineI, <NONE>, 'GdipAddPathLineI', \
GdipAddPathPath, <NONE>, 'GdipAddPathPath', \
GdipAddPathPie, <NONE>, 'GdipAddPathPie', \
GdipAddPathPieI, <NONE>, 'GdipAddPathPieI', \
GdipAddPathPolygon, <NONE>, 'GdipAddPathPolygon', \
GdipAddPathPolygonI, <NONE>, 'GdipAddPathPolygonI', \
GdipAddPathRectangle, <NONE>, 'GdipAddPathRectangle', \
GdipAddPathRectangleI, <NONE>, 'GdipAddPathRectangleI', \
GdipAddPathRectangles, <NONE>, 'GdipAddPathRectangles', \
GdipAddPathRectanglesI, <NONE>, 'GdipAddPathRectanglesI', \
GdipAddPathString, <NONE>, 'GdipAddPathString', \
GdipAddPathStringI, <NONE>, 'GdipAddPathStringI', \
GdipAlloc, <NONE>, 'GdipAlloc', \
GdipBeginContainer, <NONE>, 'GdipBeginContainer', \
GdipBeginContainer2, <NONE>, 'GdipBeginContainer2', \
GdipBeginContainerI, <NONE>, 'GdipBeginContainerI', \
GdipBitmapApplyEffect, <NONE>, 'GdipBitmapApplyEffect', \
GdipBitmapConvertFormat, <NONE>, 'GdipBitmapConvertFormat', \
GdipBitmapCreateApplyEffect, <NONE>, 'GdipBitmapCreateApplyEffect', \
GdipBitmapGetHistogram, <NONE>, 'GdipBitmapGetHistogram', \
GdipBitmapGetHistogramSize, <NONE>, 'GdipBitmapGetHistogramSize', \
GdipBitmapGetPixel, <NONE>, 'GdipBitmapGetPixel', \
GdipBitmapLockBits, <NONE>, 'GdipBitmapLockBits', \
GdipBitmapSetPixel, <NONE>, 'GdipBitmapSetPixel', \
GdipBitmapSetResolution, <NONE>, 'GdipBitmapSetResolution', \
GdipBitmapUnlockBits, <NONE>, 'GdipBitmapUnlockBits', \
GdipClearPathMarkers, <NONE>, 'GdipClearPathMarkers', \
GdipCloneBitmapArea, <NONE>, 'GdipCloneBitmapArea', \
GdipCloneBitmapAreaI, <NONE>, 'GdipCloneBitmapAreaI', \
GdipCloneBrush, <NONE>, 'GdipCloneBrush', \
GdipCloneCustomLineCap, <NONE>, 'GdipCloneCustomLineCap', \
GdipCloneFont, <NONE>, 'GdipCloneFont', \
GdipCloneFontFamily, <NONE>, 'GdipCloneFontFamily', \
GdipCloneImage, <NONE>, 'GdipCloneImage', \
GdipCloneImageAttributes, <NONE>, 'GdipCloneImageAttributes', \
GdipCloneMatrix, <NONE>, 'GdipCloneMatrix', \
GdipClonePath, <NONE>, 'GdipClonePath', \
GdipClonePen, <NONE>, 'GdipClonePen', \
GdipCloneRegion, <NONE>, 'GdipCloneRegion', \
GdipCloneStringFormat, <NONE>, 'GdipCloneStringFormat', \
GdipClosePathFigure, <NONE>, 'GdipClosePathFigure', \
GdipClosePathFigures, <NONE>, 'GdipClosePathFigures', \
GdipCombineRegionPath, <NONE>, 'GdipCombineRegionPath', \
GdipCombineRegionRect, <NONE>, 'GdipCombineRegionRect', \
GdipCombineRegionRectI, <NONE>, 'GdipCombineRegionRectI', \
GdipCombineRegionRegion, <NONE>, 'GdipCombineRegionRegion', \
GdipComment, <NONE>, 'GdipComment', \
GdipConvertToEmfPlus, <NONE>, 'GdipConvertToEmfPlus', \
GdipConvertToEmfPlusToFile, <NONE>, 'GdipConvertToEmfPlusToFile', \
GdipConvertToEmfPlusToStream, <NONE>, 'GdipConvertToEmfPlusToStream', \
GdipCreateAdjustableArrowCap, <NONE>, 'GdipCreateAdjustableArrowCap', \
GdipCreateBitmapFromDirectDrawSurface, <NONE>, 'GdipCreateBitmapFromDirectDrawSurface', \
GdipCreateBitmapFromFile, <NONE>, 'GdipCreateBitmapFromFile', \
GdipCreateBitmapFromFileICM, <NONE>, 'GdipCreateBitmapFromFileICM', \
GdipCreateBitmapFromGdiDib, <NONE>, 'GdipCreateBitmapFromGdiDib', \
GdipCreateBitmapFromGraphics, <NONE>, 'GdipCreateBitmapFromGraphics', \
GdipCreateBitmapFromHBITMAP, <NONE>, 'GdipCreateBitmapFromHBITMAP', \
GdipCreateBitmapFromHICON, <NONE>, 'GdipCreateBitmapFromHICON', \
GdipCreateBitmapFromResource, <NONE>, 'GdipCreateBitmapFromResource', \
GdipCreateBitmapFromScan0, <NONE>, 'GdipCreateBitmapFromScan0', \
GdipCreateBitmapFromStream, <NONE>, 'GdipCreateBitmapFromStream', \
GdipCreateBitmapFromStreamICM, <NONE>, 'GdipCreateBitmapFromStreamICM', \
GdipCreateCachedBitmap, <NONE>, 'GdipCreateCachedBitmap', \
GdipCreateCustomLineCap, <NONE>, 'GdipCreateCustomLineCap', \
GdipCreateEffect, <NONE>, 'GdipCreateEffect', \
GdipCreateFont, <NONE>, 'GdipCreateFont', \
GdipCreateFontFamilyFromName, <NONE>, 'GdipCreateFontFamilyFromName', \
GdipCreateFontFromDC, <NONE>, 'GdipCreateFontFromDC', \
GdipCreateFontFromLogfontA, <NONE>, 'GdipCreateFontFromLogfontA', \
GdipCreateFontFromLogfontW, <NONE>, 'GdipCreateFontFromLogfontW', \
GdipCreateFromHDC, <NONE>, 'GdipCreateFromHDC', \
GdipCreateFromHDC2, <NONE>, 'GdipCreateFromHDC2', \
GdipCreateFromHWND, <NONE>, 'GdipCreateFromHWND', \
GdipCreateFromHWNDICM, <NONE>, 'GdipCreateFromHWNDICM', \
GdipCreateHBITMAPFromBitmap, <NONE>, 'GdipCreateHBITMAPFromBitmap', \
GdipCreateHICONFromBitmap, <NONE>, 'GdipCreateHICONFromBitmap', \
GdipCreateHalftonePalette, <NONE>, 'GdipCreateHalftonePalette', \
GdipCreateHatchBrush, <NONE>, 'GdipCreateHatchBrush', \
GdipCreateImageAttributes, <NONE>, 'GdipCreateImageAttributes', \
GdipCreateLineBrush, <NONE>, 'GdipCreateLineBrush', \
GdipCreateLineBrushFromRect, <NONE>, 'GdipCreateLineBrushFromRect', \
GdipCreateLineBrushFromRectI, <NONE>, 'GdipCreateLineBrushFromRectI', \
GdipCreateLineBrushFromRectWithAngle, <NONE>, 'GdipCreateLineBrushFromRectWithAngle', \
GdipCreateLineBrushFromRectWithAngleI, <NONE>, 'GdipCreateLineBrushFromRectWithAngleI', \
GdipCreateLineBrushI, <NONE>, 'GdipCreateLineBrushI', \
GdipCreateMatrix, <NONE>, 'GdipCreateMatrix', \
GdipCreateMatrix2, <NONE>, 'GdipCreateMatrix2', \
GdipCreateMatrix3, <NONE>, 'GdipCreateMatrix3', \
GdipCreateMatrix3I, <NONE>, 'GdipCreateMatrix3I', \
GdipCreateMetafileFromEmf, <NONE>, 'GdipCreateMetafileFromEmf', \
GdipCreateMetafileFromFile, <NONE>, 'GdipCreateMetafileFromFile', \
GdipCreateMetafileFromStream, <NONE>, 'GdipCreateMetafileFromStream', \
GdipCreateMetafileFromWmf, <NONE>, 'GdipCreateMetafileFromWmf', \
GdipCreateMetafileFromWmfFile, <NONE>, 'GdipCreateMetafileFromWmfFile', \
GdipCreatePath, <NONE>, 'GdipCreatePath', \
GdipCreatePath2, <NONE>, 'GdipCreatePath2', \
GdipCreatePath2I, <NONE>, 'GdipCreatePath2I', \
GdipCreatePathGradient, <NONE>, 'GdipCreatePathGradient', \
GdipCreatePathGradientFromPath, <NONE>, 'GdipCreatePathGradientFromPath', \
GdipCreatePathGradientI, <NONE>, 'GdipCreatePathGradientI', \
GdipCreatePathIter, <NONE>, 'GdipCreatePathIter', \
GdipCreatePen1, <NONE>, 'GdipCreatePen1', \
GdipCreatePen2, <NONE>, 'GdipCreatePen2', \
GdipCreateRegion, <NONE>, 'GdipCreateRegion', \
GdipCreateRegionHrgn, <NONE>, 'GdipCreateRegionHrgn', \
GdipCreateRegionPath, <NONE>, 'GdipCreateRegionPath', \
GdipCreateRegionRect, <NONE>, 'GdipCreateRegionRect', \
GdipCreateRegionRectI, <NONE>, 'GdipCreateRegionRectI', \
GdipCreateRegionRgnData, <NONE>, 'GdipCreateRegionRgnData', \
GdipCreateSolidFill, <NONE>, 'GdipCreateSolidFill', \
GdipCreateStreamOnFile, <NONE>, 'GdipCreateStreamOnFile', \
GdipCreateStringFormat, <NONE>, 'GdipCreateStringFormat', \
GdipCreateTexture, <NONE>, 'GdipCreateTexture', \
GdipCreateTexture2, <NONE>, 'GdipCreateTexture2', \
GdipCreateTexture2I, <NONE>, 'GdipCreateTexture2I', \
GdipCreateTextureIA, <NONE>, 'GdipCreateTextureIA', \
GdipCreateTextureIAI, <NONE>, 'GdipCreateTextureIAI', \
GdipDeleteBrush, <NONE>, 'GdipDeleteBrush', \
GdipDeleteCachedBitmap, <NONE>, 'GdipDeleteCachedBitmap', \
GdipDeleteCustomLineCap, <NONE>, 'GdipDeleteCustomLineCap', \
GdipDeleteEffect, <NONE>, 'GdipDeleteEffect', \
GdipDeleteFont, <NONE>, 'GdipDeleteFont', \
GdipDeleteFontFamily, <NONE>, 'GdipDeleteFontFamily', \
GdipDeleteGraphics, <NONE>, 'GdipDeleteGraphics', \
GdipDeleteMatrix, <NONE>, 'GdipDeleteMatrix', \
GdipDeletePath, <NONE>, 'GdipDeletePath', \
GdipDeletePathIter, <NONE>, 'GdipDeletePathIter', \
GdipDeletePen, <NONE>, 'GdipDeletePen', \
GdipDeletePrivateFontCollection, <NONE>, 'GdipDeletePrivateFontCollection', \
GdipDeleteRegion, <NONE>, 'GdipDeleteRegion', \
GdipDeleteStringFormat, <NONE>, 'GdipDeleteStringFormat', \
GdipDisposeImage, <NONE>, 'GdipDisposeImage', \
GdipDisposeImageAttributes, <NONE>, 'GdipDisposeImageAttributes', \
GdipDrawArc, <NONE>, 'GdipDrawArc', \
GdipDrawArcI, <NONE>, 'GdipDrawArcI', \
GdipDrawBezier, <NONE>, 'GdipDrawBezier', \
GdipDrawBezierI, <NONE>, 'GdipDrawBezierI', \
GdipDrawBeziers, <NONE>, 'GdipDrawBeziers', \
GdipDrawBeziersI, <NONE>, 'GdipDrawBeziersI', \
GdipDrawCachedBitmap, <NONE>, 'GdipDrawCachedBitmap', \
GdipDrawClosedCurve, <NONE>, 'GdipDrawClosedCurve', \
GdipDrawClosedCurve2, <NONE>, 'GdipDrawClosedCurve2', \
GdipDrawClosedCurve2I, <NONE>, 'GdipDrawClosedCurve2I', \
GdipDrawClosedCurveI, <NONE>, 'GdipDrawClosedCurveI', \
GdipDrawCurve, <NONE>, 'GdipDrawCurve', \
GdipDrawCurve2, <NONE>, 'GdipDrawCurve2', \
GdipDrawCurve2I, <NONE>, 'GdipDrawCurve2I', \
GdipDrawCurve3, <NONE>, 'GdipDrawCurve3', \
GdipDrawCurve3I, <NONE>, 'GdipDrawCurve3I', \
GdipDrawCurveI, <NONE>, 'GdipDrawCurveI', \
GdipDrawDriverString, <NONE>, 'GdipDrawDriverString', \
GdipDrawEllipse, <NONE>, 'GdipDrawEllipse', \
GdipDrawEllipseI, <NONE>, 'GdipDrawEllipseI', \
GdipDrawImage, <NONE>, 'GdipDrawImage', \
GdipDrawImageFX, <NONE>, 'GdipDrawImageFX', \
GdipDrawImageI, <NONE>, 'GdipDrawImageI', \
GdipDrawImagePointRect, <NONE>, 'GdipDrawImagePointRect', \
GdipDrawImagePointRectI, <NONE>, 'GdipDrawImagePointRectI', \
GdipDrawImagePoints, <NONE>, 'GdipDrawImagePoints', \
GdipDrawImagePointsI, <NONE>, 'GdipDrawImagePointsI', \
GdipDrawImagePointsRect, <NONE>, 'GdipDrawImagePointsRect', \
GdipDrawImagePointsRectI, <NONE>, 'GdipDrawImagePointsRectI', \
GdipDrawImageRect, <NONE>, 'GdipDrawImageRect', \
GdipDrawImageRectI, <NONE>, 'GdipDrawImageRectI', \
GdipDrawImageRectRect, <NONE>, 'GdipDrawImageRectRect', \
GdipDrawImageRectRectI, <NONE>, 'GdipDrawImageRectRectI', \
GdipDrawLine, <NONE>, 'GdipDrawLine', \
GdipDrawLineI, <NONE>, 'GdipDrawLineI', \
GdipDrawLines, <NONE>, 'GdipDrawLines', \
GdipDrawLinesI, <NONE>, 'GdipDrawLinesI', \
GdipDrawPath, <NONE>, 'GdipDrawPath', \
GdipDrawPie, <NONE>, 'GdipDrawPie', \
GdipDrawPieI, <NONE>, 'GdipDrawPieI', \
GdipDrawPolygon, <NONE>, 'GdipDrawPolygon', \
GdipDrawPolygonI, <NONE>, 'GdipDrawPolygonI', \
GdipDrawRectangle, <NONE>, 'GdipDrawRectangle', \
GdipDrawRectangleI, <NONE>, 'GdipDrawRectangleI', \
GdipDrawRectangles, <NONE>, 'GdipDrawRectangles', \
GdipDrawRectanglesI, <NONE>, 'GdipDrawRectanglesI', \
GdipDrawString, <NONE>, 'GdipDrawString', \
GdipEmfToWmfBits, <NONE>, 'GdipEmfToWmfBits', \
GdipEndContainer, <NONE>, 'GdipEndContainer', \
GdipEnumerateMetafileDestPoint, <NONE>, 'GdipEnumerateMetafileDestPoint', \
GdipEnumerateMetafileDestPointI, <NONE>, 'GdipEnumerateMetafileDestPointI', \
GdipEnumerateMetafileDestPoints, <NONE>, 'GdipEnumerateMetafileDestPoints', \
GdipEnumerateMetafileDestPointsI, <NONE>, 'GdipEnumerateMetafileDestPointsI', \
GdipEnumerateMetafileDestRect, <NONE>, 'GdipEnumerateMetafileDestRect', \
GdipEnumerateMetafileDestRectI, <NONE>, 'GdipEnumerateMetafileDestRectI', \
GdipEnumerateMetafileSrcRectDestPoint, <NONE>, 'GdipEnumerateMetafileSrcRectDestPoint', \
GdipEnumerateMetafileSrcRectDestPointI, <NONE>, 'GdipEnumerateMetafileSrcRectDestPointI', \
GdipEnumerateMetafileSrcRectDestPoints, <NONE>, 'GdipEnumerateMetafileSrcRectDestPoints', \
GdipEnumerateMetafileSrcRectDestPointsI, <NONE>, 'GdipEnumerateMetafileSrcRectDestPointsI', \
GdipEnumerateMetafileSrcRectDestRect, <NONE>, 'GdipEnumerateMetafileSrcRectDestRect', \
GdipEnumerateMetafileSrcRectDestRectI, <NONE>, 'GdipEnumerateMetafileSrcRectDestRectI', \
GdipFillClosedCurve, <NONE>, 'GdipFillClosedCurve', \
GdipFillClosedCurve2, <NONE>, 'GdipFillClosedCurve2', \
GdipFillClosedCurve2I, <NONE>, 'GdipFillClosedCurve2I', \
GdipFillClosedCurveI, <NONE>, 'GdipFillClosedCurveI', \
GdipFillEllipse, <NONE>, 'GdipFillEllipse', \
GdipFillEllipseI, <NONE>, 'GdipFillEllipseI', \
GdipFillPath, <NONE>, 'GdipFillPath', \
GdipFillPie, <NONE>, 'GdipFillPie', \
GdipFillPieI, <NONE>, 'GdipFillPieI', \
GdipFillPolygon, <NONE>, 'GdipFillPolygon', \
GdipFillPolygon2, <NONE>, 'GdipFillPolygon2', \
GdipFillPolygon2I, <NONE>, 'GdipFillPolygon2I', \
GdipFillPolygonI, <NONE>, 'GdipFillPolygonI', \
GdipFillRectangle, <NONE>, 'GdipFillRectangle', \
GdipFillRectangleI, <NONE>, 'GdipFillRectangleI', \
GdipFillRectangles, <NONE>, 'GdipFillRectangles', \
GdipFillRectanglesI, <NONE>, 'GdipFillRectanglesI', \
GdipFillRegion, <NONE>, 'GdipFillRegion', \
GdipFindFirstImageItem, <NONE>, 'GdipFindFirstImageItem', \
GdipFindNextImageItem, <NONE>, 'GdipFindNextImageItem', \
GdipFlattenPath, <NONE>, 'GdipFlattenPath', \
GdipFlush, <NONE>, 'GdipFlush', \
GdipFree, <NONE>, 'GdipFree', \
GdipGetAdjustableArrowCapFillState, <NONE>, 'GdipGetAdjustableArrowCapFillState', \
GdipGetAdjustableArrowCapHeight, <NONE>, 'GdipGetAdjustableArrowCapHeight', \
GdipGetAdjustableArrowCapMiddleInset, <NONE>, 'GdipGetAdjustableArrowCapMiddleInset', \
GdipGetAdjustableArrowCapWidth, <NONE>, 'GdipGetAdjustableArrowCapWidth', \
GdipGetAllPropertyItems, <NONE>, 'GdipGetAllPropertyItems', \
GdipGetBrushType, <NONE>, 'GdipGetBrushType', \
GdipGetCellAscent, <NONE>, 'GdipGetCellAscent', \
GdipGetCellDescent, <NONE>, 'GdipGetCellDescent', \
GdipGetClip, <NONE>, 'GdipGetClip', \
GdipGetClipBounds, <NONE>, 'GdipGetClipBounds', \
GdipGetClipBoundsI, <NONE>, 'GdipGetClipBoundsI', \
GdipGetCompositingMode, <NONE>, 'GdipGetCompositingMode', \
GdipGetCompositingQuality, <NONE>, 'GdipGetCompositingQuality', \
GdipGetCustomLineCapBaseCap, <NONE>, 'GdipGetCustomLineCapBaseCap', \
GdipGetCustomLineCapBaseInset, <NONE>, 'GdipGetCustomLineCapBaseInset', \
GdipGetCustomLineCapStrokeCaps, <NONE>, 'GdipGetCustomLineCapStrokeCaps', \
GdipGetCustomLineCapStrokeJoin, <NONE>, 'GdipGetCustomLineCapStrokeJoin', \
GdipGetCustomLineCapType, <NONE>, 'GdipGetCustomLineCapType', \
GdipGetCustomLineCapWidthScale, <NONE>, 'GdipGetCustomLineCapWidthScale', \
GdipGetDC, <NONE>, 'GdipGetDC', \
GdipGetDpiX, <NONE>, 'GdipGetDpiX', \
GdipGetDpiY, <NONE>, 'GdipGetDpiY', \
GdipGetEffectParameterSize, <NONE>, 'GdipGetEffectParameterSize', \
GdipGetEffectParameters, <NONE>, 'GdipGetEffectParameters', \
GdipGetEmHeight, <NONE>, 'GdipGetEmHeight', \
GdipGetEncoderParameterList, <NONE>, 'GdipGetEncoderParameterList', \
GdipGetEncoderParameterListSize, <NONE>, 'GdipGetEncoderParameterListSize', \
GdipGetFamily, <NONE>, 'GdipGetFamily', \
GdipGetFamilyName, <NONE>, 'GdipGetFamilyName', \
GdipGetFontCollectionFamilyCount, <NONE>, 'GdipGetFontCollectionFamilyCount', \
GdipGetFontCollectionFamilyList, <NONE>, 'GdipGetFontCollectionFamilyList', \
GdipGetFontHeight, <NONE>, 'GdipGetFontHeight', \
GdipGetFontHeightGivenDPI, <NONE>, 'GdipGetFontHeightGivenDPI', \
GdipGetFontSize, <NONE>, 'GdipGetFontSize', \
GdipGetFontStyle, <NONE>, 'GdipGetFontStyle', \
GdipGetFontUnit, <NONE>, 'GdipGetFontUnit', \
GdipGetGenericFontFamilyMonospace, <NONE>, 'GdipGetGenericFontFamilyMonospace', \
GdipGetGenericFontFamilySansSerif, <NONE>, 'GdipGetGenericFontFamilySansSerif', \
GdipGetGenericFontFamilySerif, <NONE>, 'GdipGetGenericFontFamilySerif', \
GdipGetHatchBackgroundColor, <NONE>, 'GdipGetHatchBackgroundColor', \
GdipGetHatchForegroundColor, <NONE>, 'GdipGetHatchForegroundColor', \
GdipGetHatchStyle, <NONE>, 'GdipGetHatchStyle', \
GdipGetHemfFromMetafile, <NONE>, 'GdipGetHemfFromMetafile', \
GdipGetImageAttributesAdjustedPalette, <NONE>, 'GdipGetImageAttributesAdjustedPalette', \
GdipGetImageBounds, <NONE>, 'GdipGetImageBounds', \
GdipGetImageDecoders, <NONE>, 'GdipGetImageDecoders', \
GdipGetImageDecodersSize, <NONE>, 'GdipGetImageDecodersSize', \
GdipGetImageDimension, <NONE>, 'GdipGetImageDimension', \
GdipGetImageEncoders, <NONE>, 'GdipGetImageEncoders', \
GdipGetImageEncodersSize, <NONE>, 'GdipGetImageEncodersSize', \
GdipGetImageFlags, <NONE>, 'GdipGetImageFlags', \
GdipGetImageGraphicsContext, <NONE>, 'GdipGetImageGraphicsContext', \
GdipGetImageHeight, <NONE>, 'GdipGetImageHeight', \
GdipGetImageHorizontalResolution, <NONE>, 'GdipGetImageHorizontalResolution', \
GdipGetImageItemData, <NONE>, 'GdipGetImageItemData', \
GdipGetImagePalette, <NONE>, 'GdipGetImagePalette', \
GdipGetImagePaletteSize, <NONE>, 'GdipGetImagePaletteSize', \
GdipGetImagePixelFormat, <NONE>, 'GdipGetImagePixelFormat', \
GdipGetImageRawFormat, <NONE>, 'GdipGetImageRawFormat', \
GdipGetImageThumbnail, <NONE>, 'GdipGetImageThumbnail', \
GdipGetImageType, <NONE>, 'GdipGetImageType', \
GdipGetImageVerticalResolution, <NONE>, 'GdipGetImageVerticalResolution', \
GdipGetImageWidth, <NONE>, 'GdipGetImageWidth', \
GdipGetInterpolationMode, <NONE>, 'GdipGetInterpolationMode', \
GdipGetLineBlend, <NONE>, 'GdipGetLineBlend', \
GdipGetLineBlendCount, <NONE>, 'GdipGetLineBlendCount', \
GdipGetLineColors, <NONE>, 'GdipGetLineColors', \
GdipGetLineGammaCorrection, <NONE>, 'GdipGetLineGammaCorrection', \
GdipGetLinePresetBlend, <NONE>, 'GdipGetLinePresetBlend', \
GdipGetLinePresetBlendCount, <NONE>, 'GdipGetLinePresetBlendCount', \
GdipGetLineRect, <NONE>, 'GdipGetLineRect', \
GdipGetLineRectI, <NONE>, 'GdipGetLineRectI', \
GdipGetLineSpacing, <NONE>, 'GdipGetLineSpacing', \
GdipGetLineTransform, <NONE>, 'GdipGetLineTransform', \
GdipGetLineWrapMode, <NONE>, 'GdipGetLineWrapMode', \
GdipGetLogFontA, <NONE>, 'GdipGetLogFontA', \
GdipGetLogFontW, <NONE>, 'GdipGetLogFontW', \
GdipGetMatrixElements, <NONE>, 'GdipGetMatrixElements', \
GdipGetMetafileDownLevelRasterizationLimit, <NONE>, 'GdipGetMetafileDownLevelRasterizationLimit', \
GdipGetMetafileHeaderFromEmf, <NONE>, 'GdipGetMetafileHeaderFromEmf', \
GdipGetMetafileHeaderFromFile, <NONE>, 'GdipGetMetafileHeaderFromFile', \
GdipGetMetafileHeaderFromMetafile, <NONE>, 'GdipGetMetafileHeaderFromMetafile', \
GdipGetMetafileHeaderFromStream, <NONE>, 'GdipGetMetafileHeaderFromStream', \
GdipGetMetafileHeaderFromWmf, <NONE>, 'GdipGetMetafileHeaderFromWmf', \
GdipGetNearestColor, <NONE>, 'GdipGetNearestColor', \
GdipGetPageScale, <NONE>, 'GdipGetPageScale', \
GdipGetPageUnit, <NONE>, 'GdipGetPageUnit', \
GdipGetPathData, <NONE>, 'GdipGetPathData', \
GdipGetPathFillMode, <NONE>, 'GdipGetPathFillMode', \
GdipGetPathGradientBlend, <NONE>, 'GdipGetPathGradientBlend', \
GdipGetPathGradientBlendCount, <NONE>, 'GdipGetPathGradientBlendCount', \
GdipGetPathGradientCenterColor, <NONE>, 'GdipGetPathGradientCenterColor', \
GdipGetPathGradientCenterPoint, <NONE>, 'GdipGetPathGradientCenterPoint', \
GdipGetPathGradientCenterPointI, <NONE>, 'GdipGetPathGradientCenterPointI', \
GdipGetPathGradientFocusScales, <NONE>, 'GdipGetPathGradientFocusScales', \
GdipGetPathGradientGammaCorrection, <NONE>, 'GdipGetPathGradientGammaCorrection', \
GdipGetPathGradientPath, <NONE>, 'GdipGetPathGradientPath', \
GdipGetPathGradientPointCount, <NONE>, 'GdipGetPathGradientPointCount', \
GdipGetPathGradientPresetBlend, <NONE>, 'GdipGetPathGradientPresetBlend', \
GdipGetPathGradientPresetBlendCount, <NONE>, 'GdipGetPathGradientPresetBlendCount', \
GdipGetPathGradientRect, <NONE>, 'GdipGetPathGradientRect', \
GdipGetPathGradientRectI, <NONE>, 'GdipGetPathGradientRectI', \
GdipGetPathGradientSurroundColorCount, <NONE>, 'GdipGetPathGradientSurroundColorCount', \
GdipGetPathGradientSurroundColorsWithCount, <NONE>, 'GdipGetPathGradientSurroundColorsWithCount', \
GdipGetPathGradientTransform, <NONE>, 'GdipGetPathGradientTransform', \
GdipGetPathGradientWrapMode, <NONE>, 'GdipGetPathGradientWrapMode', \
GdipGetPathLastPoint, <NONE>, 'GdipGetPathLastPoint', \
GdipGetPathPoints, <NONE>, 'GdipGetPathPoints', \
GdipGetPathPointsI, <NONE>, 'GdipGetPathPointsI', \
GdipGetPathTypes, <NONE>, 'GdipGetPathTypes', \
GdipGetPathWorldBounds, <NONE>, 'GdipGetPathWorldBounds', \
GdipGetPathWorldBoundsI, <NONE>, 'GdipGetPathWorldBoundsI', \
GdipGetPenBrushFill, <NONE>, 'GdipGetPenBrushFill', \
GdipGetPenColor, <NONE>, 'GdipGetPenColor', \
GdipGetPenCompoundArray, <NONE>, 'GdipGetPenCompoundArray', \
GdipGetPenCompoundCount, <NONE>, 'GdipGetPenCompoundCount', \
GdipGetPenCustomEndCap, <NONE>, 'GdipGetPenCustomEndCap', \
GdipGetPenCustomStartCap, <NONE>, 'GdipGetPenCustomStartCap', \
GdipGetPenDashArray, <NONE>, 'GdipGetPenDashArray', \
GdipGetPenDashCap197819, <NONE>, 'GdipGetPenDashCap197819', \
GdipGetPenDashCount, <NONE>, 'GdipGetPenDashCount', \
GdipGetPenDashOffset, <NONE>, 'GdipGetPenDashOffset', \
GdipGetPenDashStyle, <NONE>, 'GdipGetPenDashStyle', \
GdipGetPenEndCap, <NONE>, 'GdipGetPenEndCap', \
GdipGetPenFillType, <NONE>, 'GdipGetPenFillType', \
GdipGetPenLineJoin, <NONE>, 'GdipGetPenLineJoin', \
GdipGetPenMiterLimit, <NONE>, 'GdipGetPenMiterLimit', \
GdipGetPenMode, <NONE>, 'GdipGetPenMode', \
GdipGetPenStartCap, <NONE>, 'GdipGetPenStartCap', \
GdipGetPenTransform, <NONE>, 'GdipGetPenTransform', \
GdipGetPenUnit, <NONE>, 'GdipGetPenUnit', \
GdipGetPenWidth, <NONE>, 'GdipGetPenWidth', \
GdipGetPixelOffsetMode, <NONE>, 'GdipGetPixelOffsetMode', \
GdipGetPointCount, <NONE>, 'GdipGetPointCount', \
GdipGetPropertyCount, <NONE>, 'GdipGetPropertyCount', \
GdipGetPropertyIdList, <NONE>, 'GdipGetPropertyIdList', \
GdipGetPropertyItem, <NONE>, 'GdipGetPropertyItem', \
GdipGetPropertyItemSize, <NONE>, 'GdipGetPropertyItemSize', \
GdipGetPropertySize, <NONE>, 'GdipGetPropertySize', \
GdipGetRegionBounds, <NONE>, 'GdipGetRegionBounds', \
GdipGetRegionBoundsI, <NONE>, 'GdipGetRegionBoundsI', \
GdipGetRegionData, <NONE>, 'GdipGetRegionData', \
GdipGetRegionDataSize, <NONE>, 'GdipGetRegionDataSize', \
GdipGetRegionHRgn, <NONE>, 'GdipGetRegionHRgn', \
GdipGetRegionScans, <NONE>, 'GdipGetRegionScans', \
GdipGetRegionScansCount, <NONE>, 'GdipGetRegionScansCount', \
GdipGetRegionScansI, <NONE>, 'GdipGetRegionScansI', \
GdipGetRenderingOrigin, <NONE>, 'GdipGetRenderingOrigin', \
GdipGetSmoothingMode, <NONE>, 'GdipGetSmoothingMode', \
GdipGetSolidFillColor, <NONE>, 'GdipGetSolidFillColor', \
GdipGetStringFormatAlign, <NONE>, 'GdipGetStringFormatAlign', \
GdipGetStringFormatDigitSubstitution, <NONE>, 'GdipGetStringFormatDigitSubstitution', \
GdipGetStringFormatFlags, <NONE>, 'GdipGetStringFormatFlags', \
GdipGetStringFormatHotkeyPrefix, <NONE>, 'GdipGetStringFormatHotkeyPrefix', \
GdipGetStringFormatLineAlign, <NONE>, 'GdipGetStringFormatLineAlign', \
GdipGetStringFormatMeasurableCharacterRangeCount, <NONE>, 'GdipGetStringFormatMeasurableCharacterRangeCount', \
GdipGetStringFormatTabStopCount, <NONE>, 'GdipGetStringFormatTabStopCount', \
GdipGetStringFormatTabStops, <NONE>, 'GdipGetStringFormatTabStops', \
GdipGetStringFormatTrimming, <NONE>, 'GdipGetStringFormatTrimming', \
GdipGetTextContrast, <NONE>, 'GdipGetTextContrast', \
GdipGetTextRenderingHint, <NONE>, 'GdipGetTextRenderingHint', \
GdipGetTextureImage, <NONE>, 'GdipGetTextureImage', \
GdipGetTextureTransform, <NONE>, 'GdipGetTextureTransform', \
GdipGetTextureWrapMode, <NONE>, 'GdipGetTextureWrapMode', \
GdipGetVisibleClipBounds, <NONE>, 'GdipGetVisibleClipBounds', \
GdipGetVisibleClipBoundsI, <NONE>, 'GdipGetVisibleClipBoundsI', \
GdipGetWorldTransform, <NONE>, 'GdipGetWorldTransform', \
GdipGraphicsClear, <NONE>, 'GdipGraphicsClear', \
GdipGraphicsSetAbort, <NONE>, 'GdipGraphicsSetAbort', \
GdipImageForceValidation, <NONE>, 'GdipImageForceValidation', \
GdipImageGetFrameCount, <NONE>, 'GdipImageGetFrameCount', \
GdipImageGetFrameDimensionsCount, <NONE>, 'GdipImageGetFrameDimensionsCount', \
GdipImageGetFrameDimensionsList, <NONE>, 'GdipImageGetFrameDimensionsList', \
GdipImageRotateFlip, <NONE>, 'GdipImageRotateFlip', \
GdipImageSelectActiveFrame, <NONE>, 'GdipImageSelectActiveFrame', \
GdipImageSetAbort, <NONE>, 'GdipImageSetAbort', \
GdipInitializePalette, <NONE>, 'GdipInitializePalette', \
GdipInvertMatrix, <NONE>, 'GdipInvertMatrix', \
GdipIsClipEmpty, <NONE>, 'GdipIsClipEmpty', \
GdipIsEmptyRegion, <NONE>, 'GdipIsEmptyRegion', \
GdipIsEqualRegion, <NONE>, 'GdipIsEqualRegion', \
GdipIsInfiniteRegion, <NONE>, 'GdipIsInfiniteRegion', \
GdipIsMatrixEqual, <NONE>, 'GdipIsMatrixEqual', \
GdipIsMatrixIdentity, <NONE>, 'GdipIsMatrixIdentity', \
GdipIsMatrixInvertible, <NONE>, 'GdipIsMatrixInvertible', \
GdipIsOutlineVisiblePathPoint, <NONE>, 'GdipIsOutlineVisiblePathPoint', \
GdipIsOutlineVisiblePathPointI, <NONE>, 'GdipIsOutlineVisiblePathPointI', \
GdipIsStyleAvailable, <NONE>, 'GdipIsStyleAvailable', \
GdipIsVisibleClipEmpty, <NONE>, 'GdipIsVisibleClipEmpty', \
GdipIsVisiblePathPoint, <NONE>, 'GdipIsVisiblePathPoint', \
GdipIsVisiblePathPointI, <NONE>, 'GdipIsVisiblePathPointI', \
GdipIsVisiblePoint, <NONE>, 'GdipIsVisiblePoint', \
GdipIsVisiblePointI, <NONE>, 'GdipIsVisiblePointI', \
GdipIsVisibleRect, <NONE>, 'GdipIsVisibleRect', \
GdipIsVisibleRectI, <NONE>, 'GdipIsVisibleRectI', \
GdipIsVisibleRegionPoint, <NONE>, 'GdipIsVisibleRegionPoint', \
GdipIsVisibleRegionPointI, <NONE>, 'GdipIsVisibleRegionPointI', \
GdipIsVisibleRegionRect, <NONE>, 'GdipIsVisibleRegionRect', \
GdipIsVisibleRegionRectI, <NONE>, 'GdipIsVisibleRegionRectI', \
GdipLoadImageFromFile, <NONE>, 'GdipLoadImageFromFile', \
GdipLoadImageFromFileICM, <NONE>, 'GdipLoadImageFromFileICM', \
GdipLoadImageFromStream, <NONE>, 'GdipLoadImageFromStream', \
GdipLoadImageFromStreamICM, <NONE>, 'GdipLoadImageFromStreamICM', \
GdipMeasureCharacterRanges, <NONE>, 'GdipMeasureCharacterRanges', \
GdipMeasureDriverString, <NONE>, 'GdipMeasureDriverString', \
GdipMeasureString, <NONE>, 'GdipMeasureString', \
GdipMultiplyLineTransform, <NONE>, 'GdipMultiplyLineTransform', \
GdipMultiplyMatrix, <NONE>, 'GdipMultiplyMatrix', \
GdipMultiplyPathGradientTransform, <NONE>, 'GdipMultiplyPathGradientTransform', \
GdipMultiplyPenTransform, <NONE>, 'GdipMultiplyPenTransform', \
GdipMultiplyTextureTransform, <NONE>, 'GdipMultiplyTextureTransform', \
GdipMultiplyWorldTransform, <NONE>, 'GdipMultiplyWorldTransform', \
GdipNewInstalledFontCollection, <NONE>, 'GdipNewInstalledFontCollection', \
GdipNewPrivateFontCollection, <NONE>, 'GdipNewPrivateFontCollection', \
GdipPathIterCopyData, <NONE>, 'GdipPathIterCopyData', \
GdipPathIterEnumerate, <NONE>, 'GdipPathIterEnumerate', \
GdipPathIterGetCount, <NONE>, 'GdipPathIterGetCount', \
GdipPathIterGetSubpathCount, <NONE>, 'GdipPathIterGetSubpathCount', \
GdipPathIterHasCurve, <NONE>, 'GdipPathIterHasCurve', \
GdipPathIterIsValid, <NONE>, 'GdipPathIterIsValid', \
GdipPathIterNextMarker, <NONE>, 'GdipPathIterNextMarker', \
GdipPathIterNextMarkerPath, <NONE>, 'GdipPathIterNextMarkerPath', \
GdipPathIterNextPathType, <NONE>, 'GdipPathIterNextPathType', \
GdipPathIterNextSubpath, <NONE>, 'GdipPathIterNextSubpath', \
GdipPathIterNextSubpathPath, <NONE>, 'GdipPathIterNextSubpathPath', \
GdipPathIterRewind, <NONE>, 'GdipPathIterRewind', \
GdipPlayMetafileRecord, <NONE>, 'GdipPlayMetafileRecord', \
GdipPlayTSClientRecord, <NONE>, 'GdipPlayTSClientRecord', \
GdipPrivateAddFontFile, <NONE>, 'GdipPrivateAddFontFile', \
GdipPrivateAddMemoryFont, <NONE>, 'GdipPrivateAddMemoryFont', \
GdipRecordMetafile, <NONE>, 'GdipRecordMetafile', \
GdipRecordMetafileFileName, <NONE>, 'GdipRecordMetafileFileName', \
GdipRecordMetafileFileNameI, <NONE>, 'GdipRecordMetafileFileNameI', \
GdipRecordMetafileI, <NONE>, 'GdipRecordMetafileI', \
GdipRecordMetafileStream, <NONE>, 'GdipRecordMetafileStream', \
GdipRecordMetafileStreamI, <NONE>, 'GdipRecordMetafileStreamI', \
GdipReleaseDC, <NONE>, 'GdipReleaseDC', \
GdipRemovePropertyItem, <NONE>, 'GdipRemovePropertyItem', \
GdipResetClip, <NONE>, 'GdipResetClip', \
GdipResetImageAttributes, <NONE>, 'GdipResetImageAttributes', \
GdipResetLineTransform, <NONE>, 'GdipResetLineTransform', \
GdipResetPageTransform, <NONE>, 'GdipResetPageTransform', \
GdipResetPath, <NONE>, 'GdipResetPath', \
GdipResetPathGradientTransform, <NONE>, 'GdipResetPathGradientTransform', \
GdipResetPenTransform, <NONE>, 'GdipResetPenTransform', \
GdipResetTextureTransform, <NONE>, 'GdipResetTextureTransform', \
GdipResetWorldTransform, <NONE>, 'GdipResetWorldTransform', \
GdipRestoreGraphics, <NONE>, 'GdipRestoreGraphics', \
GdipReversePath, <NONE>, 'GdipReversePath', \
GdipRotateLineTransform, <NONE>, 'GdipRotateLineTransform', \
GdipRotateMatrix, <NONE>, 'GdipRotateMatrix', \
GdipRotatePathGradientTransform, <NONE>, 'GdipRotatePathGradientTransform', \
GdipRotatePenTransform, <NONE>, 'GdipRotatePenTransform', \
GdipRotateTextureTransform, <NONE>, 'GdipRotateTextureTransform', \
GdipRotateWorldTransform, <NONE>, 'GdipRotateWorldTransform', \
GdipSaveAdd, <NONE>, 'GdipSaveAdd', \
GdipSaveAddImage, <NONE>, 'GdipSaveAddImage', \
GdipSaveGraphics, <NONE>, 'GdipSaveGraphics', \
GdipSaveImageToFile, <NONE>, 'GdipSaveImageToFile', \
GdipSaveImageToStream, <NONE>, 'GdipSaveImageToStream', \
GdipScaleLineTransform, <NONE>, 'GdipScaleLineTransform', \
GdipScaleMatrix, <NONE>, 'GdipScaleMatrix', \
GdipScalePathGradientTransform, <NONE>, 'GdipScalePathGradientTransform', \
GdipScalePenTransform, <NONE>, 'GdipScalePenTransform', \
GdipScaleTextureTransform, <NONE>, 'GdipScaleTextureTransform', \
GdipScaleWorldTransform, <NONE>, 'GdipScaleWorldTransform', \
GdipSetAdjustableArrowCapFillState, <NONE>, 'GdipSetAdjustableArrowCapFillState', \
GdipSetAdjustableArrowCapHeight, <NONE>, 'GdipSetAdjustableArrowCapHeight', \
GdipSetAdjustableArrowCapMiddleInset, <NONE>, 'GdipSetAdjustableArrowCapMiddleInset', \
GdipSetAdjustableArrowCapWidth, <NONE>, 'GdipSetAdjustableArrowCapWidth', \
GdipSetClipGraphics, <NONE>, 'GdipSetClipGraphics', \
GdipSetClipHrgn, <NONE>, 'GdipSetClipHrgn', \
GdipSetClipPath, <NONE>, 'GdipSetClipPath', \
GdipSetClipRect, <NONE>, 'GdipSetClipRect', \
GdipSetClipRectI, <NONE>, 'GdipSetClipRectI', \
GdipSetClipRegion, <NONE>, 'GdipSetClipRegion', \
GdipSetCompositingMode, <NONE>, 'GdipSetCompositingMode', \
GdipSetCompositingQuality, <NONE>, 'GdipSetCompositingQuality', \
GdipSetCustomLineCapBaseCap, <NONE>, 'GdipSetCustomLineCapBaseCap', \
GdipSetCustomLineCapBaseInset, <NONE>, 'GdipSetCustomLineCapBaseInset', \
GdipSetCustomLineCapStrokeCaps, <NONE>, 'GdipSetCustomLineCapStrokeCaps', \
GdipSetCustomLineCapStrokeJoin, <NONE>, 'GdipSetCustomLineCapStrokeJoin', \
GdipSetCustomLineCapWidthScale, <NONE>, 'GdipSetCustomLineCapWidthScale', \
GdipSetEffectParameters, <NONE>, 'GdipSetEffectParameters', \
GdipSetEmpty, <NONE>, 'GdipSetEmpty', \
GdipSetImageAttributesCachedBackground, <NONE>, 'GdipSetImageAttributesCachedBackground', \
GdipSetImageAttributesColorKeys, <NONE>, 'GdipSetImageAttributesColorKeys', \
GdipSetImageAttributesColorMatrix, <NONE>, 'GdipSetImageAttributesColorMatrix', \
GdipSetImageAttributesGamma, <NONE>, 'GdipSetImageAttributesGamma', \
GdipSetImageAttributesNoOp, <NONE>, 'GdipSetImageAttributesNoOp', \
GdipSetImageAttributesOutputChannel, <NONE>, 'GdipSetImageAttributesOutputChannel', \
GdipSetImageAttributesOutputChannelColorProfile, <NONE>, 'GdipSetImageAttributesOutputChannelColorProfile', \
GdipSetImageAttributesRemapTable, <NONE>, 'GdipSetImageAttributesRemapTable', \
GdipSetImageAttributesThreshold, <NONE>, 'GdipSetImageAttributesThreshold', \
GdipSetImageAttributesToIdentity, <NONE>, 'GdipSetImageAttributesToIdentity', \
GdipSetImageAttributesWrapMode, <NONE>, 'GdipSetImageAttributesWrapMode', \
GdipSetImagePalette, <NONE>, 'GdipSetImagePalette', \
GdipSetInfinite, <NONE>, 'GdipSetInfinite', \
GdipSetInterpolationMode, <NONE>, 'GdipSetInterpolationMode', \
GdipSetLineBlend, <NONE>, 'GdipSetLineBlend', \
GdipSetLineColors, <NONE>, 'GdipSetLineColors', \
GdipSetLineGammaCorrection, <NONE>, 'GdipSetLineGammaCorrection', \
GdipSetLineLinearBlend, <NONE>, 'GdipSetLineLinearBlend', \
GdipSetLinePresetBlend, <NONE>, 'GdipSetLinePresetBlend', \
GdipSetLineSigmaBlend, <NONE>, 'GdipSetLineSigmaBlend', \
GdipSetLineTransform, <NONE>, 'GdipSetLineTransform', \
GdipSetLineWrapMode, <NONE>, 'GdipSetLineWrapMode', \
GdipSetMatrixElements, <NONE>, 'GdipSetMatrixElements', \
GdipSetMetafileDownLevelRasterizationLimit, <NONE>, 'GdipSetMetafileDownLevelRasterizationLimit', \
GdipSetPageScale, <NONE>, 'GdipSetPageScale', \
GdipSetPageUnit, <NONE>, 'GdipSetPageUnit', \
GdipSetPathFillMode, <NONE>, 'GdipSetPathFillMode', \
GdipSetPathGradientBlend, <NONE>, 'GdipSetPathGradientBlend', \
GdipSetPathGradientCenterColor, <NONE>, 'GdipSetPathGradientCenterColor', \
GdipSetPathGradientCenterPoint, <NONE>, 'GdipSetPathGradientCenterPoint', \
GdipSetPathGradientCenterPointI, <NONE>, 'GdipSetPathGradientCenterPointI', \
GdipSetPathGradientFocusScales, <NONE>, 'GdipSetPathGradientFocusScales', \
GdipSetPathGradientGammaCorrection, <NONE>, 'GdipSetPathGradientGammaCorrection', \
GdipSetPathGradientLinearBlend, <NONE>, 'GdipSetPathGradientLinearBlend', \
GdipSetPathGradientPath, <NONE>, 'GdipSetPathGradientPath', \
GdipSetPathGradientPresetBlend, <NONE>, 'GdipSetPathGradientPresetBlend', \
GdipSetPathGradientSigmaBlend, <NONE>, 'GdipSetPathGradientSigmaBlend', \
GdipSetPathGradientSurroundColorsWithCount, <NONE>, 'GdipSetPathGradientSurroundColorsWithCount', \
GdipSetPathGradientTransform, <NONE>, 'GdipSetPathGradientTransform', \
GdipSetPathGradientWrapMode, <NONE>, 'GdipSetPathGradientWrapMode', \
GdipSetPathMarker, <NONE>, 'GdipSetPathMarker', \
GdipSetPenBrushFill, <NONE>, 'GdipSetPenBrushFill', \
GdipSetPenColor, <NONE>, 'GdipSetPenColor', \
GdipSetPenCompoundArray, <NONE>, 'GdipSetPenCompoundArray', \
GdipSetPenCustomEndCap, <NONE>, 'GdipSetPenCustomEndCap', \
GdipSetPenCustomStartCap, <NONE>, 'GdipSetPenCustomStartCap', \
GdipSetPenDashArray, <NONE>, 'GdipSetPenDashArray', \
GdipSetPenDashCap197819, <NONE>, 'GdipSetPenDashCap197819', \
GdipSetPenDashOffset, <NONE>, 'GdipSetPenDashOffset', \
GdipSetPenDashStyle, <NONE>, 'GdipSetPenDashStyle', \
GdipSetPenEndCap, <NONE>, 'GdipSetPenEndCap', \
GdipSetPenLineCap197819, <NONE>, 'GdipSetPenLineCap197819', \
GdipSetPenLineJoin, <NONE>, 'GdipSetPenLineJoin', \
GdipSetPenMiterLimit, <NONE>, 'GdipSetPenMiterLimit', \
GdipSetPenMode, <NONE>, 'GdipSetPenMode', \
GdipSetPenStartCap, <NONE>, 'GdipSetPenStartCap', \
GdipSetPenTransform, <NONE>, 'GdipSetPenTransform', \
GdipSetPenUnit, <NONE>, 'GdipSetPenUnit', \
GdipSetPenWidth, <NONE>, 'GdipSetPenWidth', \
GdipSetPixelOffsetMode, <NONE>, 'GdipSetPixelOffsetMode', \
GdipSetPropertyItem, <NONE>, 'GdipSetPropertyItem', \
GdipSetRenderingOrigin, <NONE>, 'GdipSetRenderingOrigin', \
GdipSetSmoothingMode, <NONE>, 'GdipSetSmoothingMode', \
GdipSetSolidFillColor, <NONE>, 'GdipSetSolidFillColor', \
GdipSetStringFormatAlign, <NONE>, 'GdipSetStringFormatAlign', \
GdipSetStringFormatDigitSubstitution, <NONE>, 'GdipSetStringFormatDigitSubstitution', \
GdipSetStringFormatFlags, <NONE>, 'GdipSetStringFormatFlags', \
GdipSetStringFormatHotkeyPrefix, <NONE>, 'GdipSetStringFormatHotkeyPrefix', \
GdipSetStringFormatLineAlign, <NONE>, 'GdipSetStringFormatLineAlign', \
GdipSetStringFormatMeasurableCharacterRanges, <NONE>, 'GdipSetStringFormatMeasurableCharacterRanges', \
GdipSetStringFormatTabStops, <NONE>, 'GdipSetStringFormatTabStops', \
GdipSetStringFormatTrimming, <NONE>, 'GdipSetStringFormatTrimming', \
GdipSetTextContrast, <NONE>, 'GdipSetTextContrast', \
GdipSetTextRenderingHint, <NONE>, 'GdipSetTextRenderingHint', \
GdipSetTextureTransform, <NONE>, 'GdipSetTextureTransform', \
GdipSetTextureWrapMode, <NONE>, 'GdipSetTextureWrapMode', \
GdipSetWorldTransform, <NONE>, 'GdipSetWorldTransform', \
GdipShearMatrix, <NONE>, 'GdipShearMatrix', \
GdipStartPathFigure, <NONE>, 'GdipStartPathFigure', \
GdipStringFormatGetGenericDefault, <NONE>, 'GdipStringFormatGetGenericDefault', \
GdipStringFormatGetGenericTypographic, <NONE>, 'GdipStringFormatGetGenericTypographic', \
GdipTestControl, <NONE>, 'GdipTestControl', \
GdipTransformMatrixPoints, <NONE>, 'GdipTransformMatrixPoints', \
GdipTransformMatrixPointsI, <NONE>, 'GdipTransformMatrixPointsI', \
GdipTransformPath, <NONE>, 'GdipTransformPath', \
GdipTransformPoints, <NONE>, 'GdipTransformPoints', \
GdipTransformPointsI, <NONE>, 'GdipTransformPointsI', \
GdipTransformRegion, <NONE>, 'GdipTransformRegion', \
GdipTranslateClip, <NONE>, 'GdipTranslateClip', \
GdipTranslateClipI, <NONE>, 'GdipTranslateClipI', \
GdipTranslateLineTransform, <NONE>, 'GdipTranslateLineTransform', \
GdipTranslateMatrix, <NONE>, 'GdipTranslateMatrix', \
GdipTranslatePathGradientTransform, <NONE>, 'GdipTranslatePathGradientTransform', \
GdipTranslatePenTransform, <NONE>, 'GdipTranslatePenTransform', \
GdipTranslateRegion, <NONE>, 'GdipTranslateRegion', \
GdipTranslateRegionI, <NONE>, 'GdipTranslateRegionI', \
GdipTranslateTextureTransform, <NONE>, 'GdipTranslateTextureTransform', \
GdipTranslateWorldTransform, <NONE>, 'GdipTranslateWorldTransform', \
GdipVectorTransformMatrixPoints, <NONE>, 'GdipVectorTransformMatrixPoints', \
GdipVectorTransformMatrixPointsI, <NONE>, 'GdipVectorTransformMatrixPointsI', \
GdipWarpPath, <NONE>, 'GdipWarpPath', \
GdipWidenPath, <NONE>, 'GdipWidenPath', \
GdipWindingModeOutline, <NONE>, 'GdipWindingModeOutline', \
GdiplusNotificationHook, <NONE>, 'GdiplusNotificationHook', \
GdiplusNotificationUnhook, <NONE>, 'GdiplusNotificationUnhook', \
GdiplusShutdown, <NONE>, 'GdiplusShutdown', \
GdiplusStartup, <NONE>, 'GdiplusStartup'
|
| ︙ | ︙ | |||
34 35 36 37 38 39 40 |
else
virtual at ebp+8
..start:
forward
if ~arg eq ...
arg dd ?
else
| | | 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
else
virtual at ebp+8
..start:
forward
if ~arg eq ...
arg dd ?
else
label .more_arguments dword
end if
common
.__info.argsize = $ - ..start
end virtual
.__info.argtype = 2
end if
end if
|
| ︙ | ︙ | |||
67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
\\}
\forward
\local fstr
rept 1 i:func+1 \\{
func equ i
func\\#i equ fstr:cnt:iname:ename:arg
\\}
\}
macro __ImportAll \{
\common
\local strtab,strsz,symtab,rel,relsz,hash,tcnt, size1, size2
| > | 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
\\}
\forward
\local fstr
rept 1 i:func+1 \\{
func equ i
func\\#i equ fstr:cnt:iname:ename:arg
iname\\#.@here:
\\}
\}
macro __ImportAll \{
\common
\local strtab,strsz,symtab,rel,relsz,hash,tcnt, size1, size2
|
| ︙ | ︙ |
| ︙ | ︙ | |||
28 29 30 31 32 33 34 |
display 'A'+num-10
end if
}
macro _disp arg1, arg2
{
| < < < < < < < < | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
display 'A'+num-10
end if
}
macro _disp arg1, arg2
{
if arg2 eq
display arg1
else
local ..tmp, ..val
..tmp = arg1
virtual at 0
repeat 32
if ..tmp > 0
db ..tmp mod arg2
..tmp = ..tmp / arg2
end if
end repeat
|
| ︙ | ︙ |
| ︙ | ︙ | |||
206 207 208 209 210 211 212 |
}
__InitStringEngine
macro IncludeAllGlobals {
| | | | | | | | | | | | | | | | | | 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
}
__InitStringEngine
macro IncludeAllGlobals {
local ..start
align 4
..start = $
disp 3, 'Initialized data address: $', <..start, 16>, 13
IncludeIGlobals
DispSize 'Initialized data', ($ - ..start)
align 4
..start = $
disp 3, 'Strings address: $', <..start, 16>, 13
_IncludeAllStrings
DispSize 'String data', ($ - ..start)
align 4
..start = $
disp 3, 'I18n strings data:', <..start, 16>, 13
__IncludeI18nStrings
DispSize 'I18n strings data', ($ - ..start)
align 4
..start = $
disp 3, 'Uninitialized data address: $', <..start, 16>, 13
IncludeUGlobals
DispSize 'Uninitialized data', ($ - ..start)
align 4
..start = $
disp 3, 'I18n strings placeholders: $', <..start, 16>, 13
IncludeI18nLabels
DispSize 'I18n strings placeholders', ($ - ..start)
}
macro var expr {
common
match name==value, expr \{
|
| ︙ | ︙ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 |
cParamMask = $fffe0000
cMethodMask = $ffff0000
macro __search_method flag, num, count, list, cname, method {
define flag FALSE
rept count i:1 \{ match mname, method \\{ match class | name , list\\#i \\\{ match =mname, name \\\\{
define flag TRUE
num equ i
\\\\} \\\} \\} \}
}
macro object name, parent {
obj@name equ name
obj@parent equ parent
name#.param?num = 0
name#@count equ 0
match any, parent \{
name#@count equ parent#@count
rept parent\#@count i:1 \\{
name\\#@method\\#i equ parent\\#@method\\#i
match class | mname, parent\\#i \\\{
name\\\#mname = i or cMethodMask
; display 3, "Copy:", \\\`name,\\\`mname, ' = ', \\\`i, 13, 10
\\\}
\\}
\}
macro param paramname*, getval*, setval* \{
paramname = name#.param?num or cParamMask
name#.param?num = name#.param?num + 1
if getval eq NONE
paramname\#.get = -1
else
paramname\#.get = getval
end if
if setval eq NONE ; read only
paramname\#.set = -1
else
paramname\#.set = setval
end if
\}
macro method mname, [marg] \{
\common
\local f1, n1
name\#mname\#.arguments equ marg
define f1 FALSE
__search_method f1, n1, name\#@count, name\#@method, parent, mname
match =FALSE, f1 \\{
rept 1 x:name\\#@count+1 \\\{
name\\\#@count equ x
name\\\#@method\\\#x equ name | mname
; display 3,'New method:', \\\`name,\\\`mname, ' = ', \\\`x, 13, 10
methods.\\\#name\\\#mname\\\#.inherited equ NONE
\\\}
\\}
match =TRUE, f1 \\{
match num, n1 \\\{
match class | mmname, name\\\#@method\\\#num \\\\{
methods.\\\\#name\\\\#mname\\\\#.inherited equ methods.\\\\#class\\\\#mmname
\\\\}
name\\\#@method\\\#num equ name | mname
; display 3,'Redefinition:', \\\`name,\\\`mname, ' = ', \\\`num, 13, 10
\\\}
\\}
\}
macro abstract mname, [marg] \{
\common
method mname, marg
methods.\#name\#mname = 0
\}
macro name#@members \{
macro method mname, [marg] \\{ \\}
macro abstract mname, [marg] \\{ \\}
match any, parent \\{
parent\\#@members
\\}
purge method, abstract
}
endobj fix } obj_helper
macro obj_helper {
match name, obj@name \{
virtual at 0
name dd ? ; pointer to the methods table.
name\#@members
rept name\#@count i:1 \\{
match class | meth, name\\#@method\\#i \\\{
name\\\#meth = (i-1) or cMethodMask
; display 1, "Method constant", \\\`name,\\\`meth, " = ", \\\`i, 13, 10
\\\}
\\}
sizeof.\#name = $
end virtual
label vtables.\#name dword
if used vtables.\#name\#.parent | used vtables.\#name
.parent dd 0
end if
match parent, obj@parent \\{
if defined vtables.\\#parent\\#.parent & used vtables.\\#name ; in order to not use the address vtables.#parent
store dword vtables.\\#parent\\#.parent at .parent
end if
\\}
if used vtables.\#name
.mcount dd name\#@count ; methods count
rept name\#@count i:1 \\{
match class | meth, name\\#@method\\#i \\\{
dd methods.\\\#class\\\#meth
\\\}
\\}
end if
\}
purge method, param
restore obj@name, obj@parent
}
macro method name {
local f1, f2
define f1 TRUE
if used methods.#name
match =NONE, methods.#name#.inherited \{
define f1 FALSE
dd 0
\}
match =TRUE, f1 \{
dd methods.\#name\#.inherited
\}
end if
match =name#.arguments, name#.arguments \{
"Error! Method not defined in any object."
\}
f2 equ FALSE
match arguments, name#.arguments \{
f2 equ TRUE
proc methods.\#name, .self, arguments
\}
match =FALSE, f2 \{
proc methods.\#name, .self
\}
}
; Object manipulation macros. They all generate some assembly code and its syntax is
; designed to resemble the usual assembly language syntax. These macros are some
; kind of quasiinstructions.
; These macros uses FreshLib in order to allocate/deallocate dynamic memory.
macro create target, class, [arg] {
common
if ~target eq eax
push eax
end if
stdcall GetMem, sizeof.#class
mov dword [eax], vtables.#class
if ~target eq eax
mov target, eax
end if
reverse
if ~arg eq
pushx arg
end if
common
if defined class#.Create & (class#.Create and $ffff0000) = cMethodMask
exec eax, class#:Create
end if
if ~target eq eax
pop eax
end if
}
macro destroy ptrObj {
if defined TObject.Destroy & (TObject.Destroy and $ffff0000) = cMethodMask
push eax
exec ptrObj, TObject:Destroy
pop eax
end if
stdcall FreeMem, ptrObj
}
macro exec ptrobj, method, [arg] {
common
local ind
ind equ NONE
match class:meth, method \{
ind equ class\#.\#meth
\}
match =NONE, ind \{
disp 2, "Error! Invalid syntax. Use class:method.", 13, 10
err
\}
if defined ind & ~(ind and $ffff0000) = cMethodMask
match meth, ind \{
disp 2, 'Error! ', \`meth, ' is not a method.', 13, 10
err
\}
end if
reverse
if ~arg eq
pushx arg
end if
common
if ptrobj eqtype 1
pushd [ptrobj]
else
pushd ptrobj ; push .self argument
end if
if ptrobj eqtype eax
mov eax, [ptrobj]
else
if ptrobj eqtype 1
mov eax, [ptrobj]
mov eax, [eax]
else
mov eax, ptrobj
mov eax, [eax]
end if
end if
call dword [eax+8+4*(ind and $ffff)]
}
macro getm target, ptrobj, method {
local ind
ind equ NONE
match class:meth, method \{
ind equ class\#.\#meth
\}
match =NONE, ind \{
disp 2, "Error! Invalid syntax. Use class:method.", 13, 10
err
\}
if defined ind & ~(ind and $ffff0000) = cMethodMask
match meth, ind \{
disp 2, 'Error! ', \`meth, ' is not a method.', 13, 10
err
\}
end if
if ~target eq eax
push eax
end if
if ptrobj eqtype eax
mov eax, [ptrobj]
else
if ptrobj eqtype 1
mov eax, [ptrobj]
mov eax, [eax]
else
mov eax, ptrobj
mov eax, [eax]
end if
end if
push dword [eax+8+4*(ind and $ffff)]
pop target
if ~target eq eax
pop eax
end if
}
macro inherited [arg] {
common
if ~arg eq
reverse
pushx arg
common
end if
push [.self]
call dword [.__info.start-4]
}
macro get target, obj, param {
local flag
flag equ FALSE
match class:par, param \{
flag equ TRUE
\}
match =FALSE, flag \{
disp 2, "Error! Invalid syntax. Use class:method.", 13, 10
err
\}
match class:par, param \{
if class\#.\#par\#.get < sizeof.\#class ; field
if obj eqtype eax
if target eqtype eax
mov target, [obj+class\#.\#par\#.get]
else
pushd [obj+class\#.\#par\#.get]
popd target
end if
else
if ~target eq eax
push eax
end if
if obj eqtype 1
mov eax, [obj]
else
mov eax, obj
end if
if target eqtype eax
mov target, [eax+class\#.\#par\#.get]
else
pushd [eax+class\#.\#par\#.get]
popd target
end if
if ~target eq eax
pop eax
end if
end if
else ; by method
if ~target eq eax
push eax
end if
exec obj, class\#:\#par\#.get
if ~target eq eax
mov target, eax
pop eax
end if
end if
\}
}
macro set obj, param, value {
local flag
flag equ FALSE
match class:par, param \{
flag equ TRUE
\}
match =FALSE, flag \{
disp 2, "Error! Invalid syntax. Use class:method.", 13, 10
err
\}
match class:par, param \{
if class\#.\#par\#.set < sizeof.\#class ; field
if obj eqtype eax
if value eqtype eax
mov [obj+class\#.\#par\#.set], value
else
pushd value
popd [obj+class\#.\#par\#.set]
end if
else
if value eq eax
push ecx
mov ecx, obj
mov [ecx+class\#.\#par\#.set], value
pop ecx
else
push eax
mov eax, obj
if value eqtype eax
mov [eax+class\#.\#par\#.set], value
else
pushd value
popd [eax+class\#.\#par\#.set]
end if
pop eax
end if
end if
else ; by method
push eax
exec obj, class\#:\#par\#.set, value
pop eax
end if
\}
}
; returns ZF = 1 if the type matches
; returns ZF = 0 if the type does not matches.
macro istype ptrobj, class {
local ..itis, ..loop
push ecx
if ptrobj eqtype eax ; register
if ~ptrobj eq ecx
mov ecx, ptrobj
end if
else
mov ecx, ptrobj
end if
..loop:
mov ecx, [ecx] ; get vtable, or the parent vtable
jecxz ..itis ; if jump, ZF=0
cmp ecx, vtables.#class
jne ..loop
; here ZF = 1
..itis:
pop ecx
}
|
| ︙ | ︙ | |||
17 18 19 20 21 22 23 24 25 | include '_struct.inc' include '_stdcall.inc' include '_display.inc' include '_itext.inc' include '_globals.inc' include '_datamacros.inc' include '_dispatch.inc' include '%TargetOS%/allmacros.inc' | > | 17 18 19 20 21 22 23 24 25 26 | include '_struct.inc' include '_stdcall.inc' include '_display.inc' include '_itext.inc' include '_globals.inc' include '_datamacros.inc' include '_dispatch.inc' include '_realobjects.inc' include '%TargetOS%/allmacros.inc' |
| ︙ | ︙ | |||
28 29 30 31 32 33 34 |
int $80
popad
return
endp
| < < < < < < | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
int $80
popad
return
endp
proc GetTimestamp
begin
pushad
mov eax, 78
mov ebx, _timestamp
xor ecx, ecx
|
| ︙ | ︙ |
| ︙ | ︙ | |||
35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
invoke GetStdHandle, STD_ERROR_HANDLE
mov [debug_con_handle], eax
invoke SetConsoleTitleW, cConsoleTitle
return
endp
end if
maxConsoleWrite = 1024
proc Output, .ptrStr
.dummy dd ?
begin
pushad
| > > > > > > > > > > > > > > > | 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
invoke GetStdHandle, STD_ERROR_HANDLE
mov [debug_con_handle], eax
invoke SetConsoleTitleW, cConsoleTitle
return
endp
end if
if (defined options.DebugMode & options.DebugMode)
finalize FinishDebugConsole
.string rb 10
begin
invoke WriteFile, [STDERR], ___CloseMsg, ___CloseMsg.length, 0, 0
lea eax, [.string]
invoke ReadFile, [STDIN], eax, 1, 0, 0
return
endp
___CloseMsg text "Press ENTER to close."
end if
maxConsoleWrite = 1024
proc Output, .ptrStr
.dummy dd ?
begin
pushad
|
| ︙ | ︙ | |||
69 70 71 72 73 74 75 |
.finish:
popad
return
endp
| < < < < < < | 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
.finish:
popad
return
endp
proc GetTimestamp
begin
pushad
invoke GetTickCount
mov [esp+4*regEAX], eax
popad
|
| ︙ | ︙ |
| ︙ | ︙ | |||
10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
; Dependencies: Not dependent on other libraries.
;
; Notes: use options.DebugMode={1|0} to enable/disable debug output of this library.
;_________________________________________________________________________________________
module "Simple debug library"
SimpleDebugLoaded = 1
match =DBG_CHAR_NEWLINE, DBG_CHAR_NEWLINE {
DBG_CHAR_NEWLINE equ $0d, $0a
}
macro dbrk {
| > > > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
; Dependencies: Not dependent on other libraries.
;
; Notes: use options.DebugMode={1|0} to enable/disable debug output of this library.
;_________________________________________________________________________________________
module "Simple debug library"
SimpleDebugLoaded = 1
include "%TargetOS%/debug.asm"
match =DBG_CHAR_NEWLINE, DBG_CHAR_NEWLINE {
DBG_CHAR_NEWLINE equ $0d, $0a
}
macro dbrk {
|
| ︙ | ︙ | |||
48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
stdcall Output, ..msg
jmp ..skip
..msg db msg, DBG_CHAR_NEWLINE, 0
label ..skip
}
proc OutputMemory, .ptr, .size
begin
pushad
mov esi, [.ptr]
| > > > > > > > > > > > > > > > > | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
stdcall Output, ..msg
jmp ..skip
..msg db msg, DBG_CHAR_NEWLINE, 0
label ..skip
}
macro Output string {
if defined options.DebugMode & options.DebugMode = 1
stdcall Output, string
end if
}
macro OutputLn string {
if defined options.DebugMode & options.DebugMode = 1
stdcall Output, string
stdcall Output, <" ", DBG_CHAR_NEWLINE>
end if
}
proc OutputMemory, .ptr, .size
begin
pushad
mov esi, [.ptr]
|
| ︙ | ︙ | |||
145 146 147 148 149 150 151 |
macro OutputNumber number, radix, digits {
if defined options.DebugMode & options.DebugMode
stdcall OutputNumber, number, radix, digits
end if
}
| < < < < < < < < < | 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
macro OutputNumber number, radix, digits {
if defined options.DebugMode & options.DebugMode
stdcall OutputNumber, number, radix, digits
end if
}
proc OutputRegister, .reg, .radix
begin
pushad
cmp [.reg], 7
ja .exit
|
| ︙ | ︙ | |||
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 |
endg
proc __simpStrLength;, .pString
begin
mov ecx, [esp+4]
.scan:
cmp byte [ecx], 0
lea ecx, [ecx+1]
jne .scan
stc
sbb ecx, [esp+4]
retn 4
endp
;*****************************************************
; NumToStrF:
; Converts signed integer value to string.
| > > > > | 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 |
endg
proc __simpStrLength;, .pString
begin
mov ecx, [esp+4]
jecxz .ret
.scan:
cmp byte [ecx], 0
lea ecx, [ecx+1]
jne .scan
stc
sbb ecx, [esp+4]
.ret:
retn 4
endp
;*****************************************************
; NumToStrF:
; Converts signed integer value to string.
|
| ︙ | ︙ | |||
359 360 361 362 363 364 365 |
das
stosb
return
endp
| < < | 373 374 375 376 377 378 379 380 381 382 |
das
stosb
return
endp
endmodule
|
| ︙ | ︙ | |||
25 26 27 28 29 30 31 | faReadWrite = O_RDWR faOpenAlways = O_CREAT ; if the file does not exists it will be created. faCreateAlways = O_CREAT or O_TRUNC ; Creates new file always. If the file exists, truncates it. faCreateOnly = O_CREAT or O_EXCL ; Creates new file only if not exists, else error. | | | | | | | | | | | | | | | | | 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
faReadWrite = O_RDWR
faOpenAlways = O_CREAT ; if the file does not exists it will be created.
faCreateAlways = O_CREAT or O_TRUNC ; Creates new file always. If the file exists, truncates it.
faCreateOnly = O_CREAT or O_EXCL ; Creates new file only if not exists, else error.
if used STDIN | used STDOUT | used STDERR
initialize InitStdHandles
begin
if used STDIN
mov dword [__std_handle_in], 0
end if
if used STDOUT
mov dword [__std_handle_out], 1
end if
if used STDERR
mov dword [__std_handle_err], 2
end if
return
endp
end if
body FileOpenAccess
begin
push edx ecx ebx
|
| ︙ | ︙ |
| ︙ | ︙ | |||
22 23 24 25 26 27 28 |
__FlagTimerTerminate dd ?
end if
endg
if used TimerCreate
| | | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
__FlagTimerTerminate dd ?
end if
endg
if used TimerCreate
if ~(defined options.DebugMode.NoTimers & options.DebugMode.NoTimers)
initialize InitLinuxTimers
.action lnx_sigaction
.timer lnx_sigevent
.time lnx_itimerspec
begin
; set the signal handler.
|
| ︙ | ︙ | |||
54 55 56 57 58 59 60 |
mov [ecx+lnx_sigevent.notify], SIGEV_SIGNAL
mov [ecx+lnx_sigevent.signo], SIGALRM
mov [ecx+lnx_sigevent.value], 0 ; not used but must be set - the function fails without it...
mov edx, __InternalTimerID
int $80
| | | | > | > > > > > > > > > > > > > > > < < < < < < < < < < < < < | > > < > < < < | 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
mov [ecx+lnx_sigevent.notify], SIGEV_SIGNAL
mov [ecx+lnx_sigevent.signo], SIGALRM
mov [ecx+lnx_sigevent.value], 0 ; not used but must be set - the function fails without it...
mov edx, __InternalTimerID
int $80
DebugMsg 'Interval timer created.'
; then start a thread that will process timer expiration events.
stdcall ThreadCreate, __TimerHandler, 0
OutputValue 'Timer thread created. ID=$', eax, 16, 8
mov [__InternalTimerThread], eax
; start the timer
mov ebx, [__InternalTimerID]
mov eax, sys_timer_settime
lea edx, [.time]
mov [edx+lnx_itimerspec.it_interval.tv_sec], 0
mov [edx+lnx_itimerspec.it_interval.tv_nsec], __sys_time_slice*1000000
mov [edx+lnx_itimerspec.it_value.tv_sec], 0
mov [edx+lnx_itimerspec.it_value.tv_nsec], __sys_time_slice*1000000
xor esi, esi
int $80
DebugMsg 'Timer started'
return
endp
finalize FreeLinuxTimers
begin
; stop the timer
mov eax, sys_timer_delete
mov ebx, [__InternalTimerID]
int $80
DebugMsg 'Timer stopped.'
mov [__FlagTimerTerminate], 1
; signal the thread (because it is probably in waiting state.
match =native, LinuxThreads {
mov eax, sys_tkill
mov ebx, [__InternalTimerThread]
mov ecx, SIGRTMAX
int $80
}
match =posix, LinuxThreads {
cinvoke pthread_kill, [__InternalTimerThread], SIGRTMAX
}
cmp [__InternalTimerThread], 0
je .finish
; waiting to timer thread to finish. This is bad implementation,
; here should be timer wait with signal terminate on timeout.
@@:
stdcall Sleep, 10
cmp [__InternalTimerThread], 0
jne @b
.finish:
DebugMsg 'Timer thread terminated.'
return
endp
end if
end if
; This procedure is called by the system on every time quantum.
; It is Linux signal handler, so the actions this procedure can
; perform are limited.
proc __TimerProc, .signal
begin
push ebx edi
lea eax, [__ptrFirstTimer]
xor edi, edi
.loop:
mov eax, [eax+TTimer.next]
test eax, eax
jz .end_timers
|
| ︙ | ︙ | |||
168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
jge @b
jmp .loop
.end_timers:
test edi, edi
jz .exit
match =native, LinuxThreads {
mov eax, sys_tkill
mov ebx, [__InternalTimerThread]
mov ecx, SIGRTMAX
int $80
}
| > > | 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
jge @b
jmp .loop
.end_timers:
test edi, edi
jz .exit
; signal the timers thread is some timer is changed.
match =native, LinuxThreads {
mov eax, sys_tkill
mov ebx, [__InternalTimerThread]
mov ecx, SIGRTMAX
int $80
}
|
| ︙ | ︙ | |||
258 259 260 261 262 263 264 |
.end_list:
cmp [.remain], 0
jne .from_begin
; wait for signal
| | | 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 |
.end_list:
cmp [.remain], 0
jne .from_begin
; wait for signal
mov eax, sys_pause
int $80
jmp .from_begin
.quit:
mov [__InternalTimerThread], 0
stdcall Terminate, 0
|
| ︙ | ︙ |
| ︙ | ︙ | |||
22 23 24 25 26 27 28 |
__InternalTimerID dd ?
__InternalTimerThread dd ?
end if
endg
| | | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
__InternalTimerID dd ?
__InternalTimerThread dd ?
end if
endg
if used TimerCreate & ~ ( defined options.DebugMode.NoTimers & options.DebugMode.NoTimers )
initialize InitWin32Timers
begin
invoke SetTimer, 0, 0, __sys_time_slice, __TimerProc
mov [__InternalTimerID], eax
return
|
| ︙ | ︙ |
| ︙ | ︙ | |||
101 102 103 104 105 106 107 |
Istring5 itext <EN:'3. Translation tool (part of Fresh IDE) that allows to edit all such strings from one place.'>, \
<DE:'3. Translation-Tool (Teil von Fresh IDE), die alle diese Strings von einem Ort bearbeiten konnen.'>, \
<SP:'3. Herramienta de traducción (parte de Fresh IDE) que permite editar todas esas cadenas de un lugar.'>, \
<BG:'3. ИнÑтрумент за превод (чаÑÑ‚ от Fresh IDE) който позволÑва да Ñе редактират Ñтринговете за различни езици от едно мÑÑто.'>
| < < | 101 102 103 104 105 106 107 108 |
Istring5 itext <EN:'3. Translation tool (part of Fresh IDE) that allows to edit all such strings from one place.'>, \
<DE:'3. Translation-Tool (Teil von Fresh IDE), die alle diese Strings von einem Ort bearbeiten konnen.'>, \
<SP:'3. Herramienta de traducción (parte de Fresh IDE) que permite editar todas esas cadenas de un lugar.'>, \
<BG:'3. ИнÑтрумент за превод (чаÑÑ‚ от Fresh IDE) който позволÑва да Ñе редактират Ñтринговете за различни езици от едно мÑÑто.'>
|
cannot compute difference between binary files
cannot compute difference between binary files
| ︙ | ︙ | |||
19 20 21 22 23 24 25 |
iglobal
__TestData:
frmMainForm:
if used frmMainForm
ObjTemplate tfParent or tfEnd, TForm, frmMain, \
| | | | | | | | | | | | | | | | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
iglobal
__TestData:
frmMainForm:
if used frmMainForm
ObjTemplate tfParent or tfEnd, TForm, frmMain, \
x = 300, \
y = 250, \
width = 360, \
height = 240, \
Visible = TRUE, \
Caption = 'FreshLib minimal application test.'
ObjTemplate tfChild or tfEnd, TButton, btnOpenModal, \
x = 50, \
y = 50, \
width = 120, \
height = 75, \
Visible = TRUE, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfWordWrap , \
Caption = 'Click to check your assembly skills.', \
OnClick = OpenModalForm
end if
__TestDataSize = $ - __TestData
endg
|
| ︙ | ︙ |
| ︙ | ︙ | |||
38 39 40 41 42 43 44 | include '%lib%/freshlib.asm' ; use one and only one of the following files. ; ;include 'TestGroundSplitGrid.asm' | | | | | | | 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
include '%lib%/freshlib.asm'
; use one and only one of the following files.
;
;include 'TestGroundSplitGrid.asm'
;include 'TestGroundNull.asm' ; in order to check whether for compilation of dead code.
include 'TestGround.asm'
;include 'TestGroundComplex.asm'
;include 'TestGroundKeyboard.asm'
;include 'TestGroundFreshEdit.asm'
;include 'TestGroundConfig.asm'
;include 'TestGroundDirFunctions.asm'
;include 'TestGrids.asm'
;include 'TestTreeView.asm'
;include 'TestResizeEvents.asm'
if TargetOS eq Linux
; rb 343 ; this bytes simply make ELF file to be loadable.
; there is a bug somewhere in the ELF generator (FASM or possibly ELF macros)
; that makes some sizes of the ELF executable not loadable. (the Linux loader crashes with SEGFAULT)
end if
uglobal
; buffer rb 256
endg
iglobal
; The example from RFC-1951
; TestArray dw 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 2, 0, 4, 0, 4, 0
endg
; Main Program
start:
DebugMsg 'Before initializing.'
InitializeAll
|
| ︙ | ︙ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 |
; _______________________________________________________________________________________
;| |
;| ..:: Fresh IDE ::.. template project. |
;|_______________________________________________________________________________________|
;
; Description: FreshLib portable console application.
;
; Target OS: Any, supported by FreshLib
;
; Dependencies: FreshLib
;
; Notes:
;_________________________________________________________________________________________
include "%lib%/freshlib.inc"
@BinaryType GUI, compact
options.DebugMode = 1
options.DebugMode.NoTimers = 0
options.DebugMode.XSync = 0
options.DebugMode.XErrors =0
options.ShowSizes = 1
options.SkipZeroSizes = 0
ThemeGUI equ win_gui
include "%lib%/freshlib.asm"
iglobal
TemplateMainForm:
ObjTemplate tfParent or tfEnd, TForm, frmMain, \
x = 200, \
y = 200, \
width = 320, \
height = 240, \
OnCreate = FormOnCreate, \
OnClose = MainFormOnClose, \
OnDestroy = FormOnDestroy, \
Caption = 'Popup menu test'
ObjTemplate tfChild, TEdit, editTest, \
x = 10, y = 200, width = 300, height = 24, \
Text = "This is test TEdit control", \
Visible = TRUE
ObjTemplate tfParent, TActionList, ActionList1, \
ImgIcons = imgMenuList
ObjTemplate tfChild, TAction, actCheck, \
Caption = "Check it", HintText = "Action that can be checked and unchecked.", \
OnExecute = ActionOnCheck, \
IconIndex = 9
ObjTemplate tfChild, TAction, actNew, \
Caption = "New", HintText = "Create new file.", \
OnExecute = ActionOnExecute, \
IconIndex = 0
ObjTemplate tfChild, TAction, actOpen, \
Caption = "Open", HintText = "Open file for editing.", \
OnExecute = ActionOnExecute, \
IconIndex = 1
ObjTemplate tfChild, TAction, actClean, \
Caption = "Cleanup list", HintText = "Removes not existing files from the list.", \
OnExecute = ActionOnExecute, \
IconIndex = -1
ObjTemplate tfChild, TAction, actSave, \
Caption = "Save", HintText = "Save edited file to the disk.", \
OnExecute = ActionOnExecute, \
IconIndex = 2
ObjTemplate tfChild, TAction, actSaveAs, \
Caption = "Save As", HintText = "Save edited file with different name.", \
OnExecute = ActionOnExecute, \
IconIndex = 22
ObjTemplate tfChild, TAction, actSaveAll, \
Caption = "Save All", HintText = "Save all edited files to the disk.", \
OnExecute = ActionOnExecute, \
IconIndex = 23
ObjTemplate tfChild, TAction, actClose, \
Caption = "Close", HintText = "Close current edited file.", \
OnExecute = ActionOnExecute, \
IconIndex = 21
ObjTemplate tfChild, TAction, actCloseAll, \
Caption = "Close All", HintText = "Close all edited files and the project.", \
OnExecute = ActionOnExecute, \
IconIndex = 24
ObjTemplate tfChild or tfEnd, TAction, actExit, \
Caption = "Exit", HintText = "Exit Fresh IDE.", \
OnExecute = ActionOnExecute, \
IconIndex = -1
ObjTemplate tfChild, TButton, btnSkinWin, \
x = 60, y = 10, width = 84, height = 24, \
Caption = "Win skin", \
TextAlign = dtfAlignCenter or dtfAlignMiddle, \
Visible = TRUE, \
OnClick = SetWinSkin
ObjTemplate tfChild, TButton, btnSkinFlat, \
x = 146, y = 10, width = 84, height = 24, \
Caption = "Flat skin", \
TextAlign = dtfAlignCenter or dtfAlignMiddle, \
Visible = TRUE, \
OnClick = SetFlatSkin
ObjTemplate tfChild, TButton, btnOpenMenu, \
x = 10, \
y = 10, \
width = 32, \
height = 32, \
Icon = [iconMenu], \
IconPosition = iposCenter, \
Visible = TRUE, \
OnClick = OpenMenuClick, \
OnKeyPressed = ButtonKeyPressed
ObjTemplate tfChild, TButton, btnChangeAction1, \
x = 146, y = 52, width = 84, height = 24, \
Caption = "Set act. 1", \
TextAlign = dtfAlignCenter or dtfAlignMiddle, \
Visible = TRUE, \
OnClick = SetAction1
ObjTemplate tfChild, TButton, btnChangeAction1, \
x = 146, y = 78, width = 84, height = 24, \
Caption = "Set act. 2", \
TextAlign = dtfAlignCenter or dtfAlignMiddle, \
Visible = TRUE, \
OnClick = SetAction2
ObjTemplate tfChild, TButton, btnWithAction2, \
x = 10, y = 78, width = 100, height = 24, \
IconPosition = iposLeft, TextAlign = dtfAlignLeft or dtfAlignMiddle, \
Action = [actExit], \
Visible = TRUE
ObjTemplate tfChild, TButton, btnWithAction1, \
x = 10, y = 52, width = 100, height = 24, \
IconPosition = iposLeft, TextAlign = dtfAlignLeft or dtfAlignMiddle, \
Action = [actCheck], \
Visible = TRUE
ObjTemplate tfChild, TCheckbox, cbEnableDisable3, \
x = 10, y = 130, width = 130, height = 24, \
Caption = "Enable action", \
OnClick = EnableActionClick, \
Visible = TRUE
ObjTemplate tfChild, TCheckbox, cbEnableDisable2, \
x = 146, y = 130, width = 100, height = 24, \
Action = [actCheck], \
Visible = TRUE
ObjTemplate tfChild or tfEnd, TCheckbox, cbEnableDisable, \
x = 146, y = 104, width = 100, height = 24, \
Action = [actCheck], \
Visible = TRUE
TemplateMainMenu:
ObjTemplate tfEnd, TMenu, mainMenu, \
Visible = FALSE
TemplateSubMenu:
ObjTemplate tfEnd, TMenu, subMenu, \
Enabled = TRUE, \
Caption = "Reopen", \
Visible = FALSE
getfile imgMenu, "_test_images/menu.png"
dd imgMenuList.size
getfile imgMenuList, "_test_images/img_list.png"
getfile cfgFlat, "theme_flat.cfg"
dd 0
getfile cfgWin, "theme_win.cfg"
dd 0
endg
uglobal
iconMenu dd ?
endg
;rb 423
start:
InitializeAll
create [pApplication], TApplication
call GUI.Init
stdcall CreateFromTemplate, TemplateMainForm, 0
set [pApplication], TApplication:MainWindow, frmMain
set [frmMain], TWindow:Visible, TRUE ; must be set visible after creation, because it loads
; needed images in OnCreate event handler.
stdcall CreateFromTemplate, TemplateMainMenu, 0
stdcall CreateFromTemplate, TemplateSubMenu, 0
exec [mainMenu], TMenu:AddItem, mitAction, [actCheck]
exec [mainMenu], TMenu:AddItem, mitAction, [actNew]
exec [mainMenu], TMenu:AddItem, mitSubmenu, [subMenu]
exec [mainMenu], TMenu:AddItem, mitAction, [actOpen]
exec [mainMenu], TMenu:AddItem, mitSeparator,
exec [mainMenu], TMenu:AddItem, mitAction, [actSave]
exec [mainMenu], TMenu:AddItem, mitAction, [actSaveAs]
exec [mainMenu], TMenu:AddItem, mitAction, [actSaveAll]
exec [mainMenu], TMenu:AddItem, mitSeparator, 0
exec [mainMenu], TMenu:AddItem, mitAction, [actClose]
exec [mainMenu], TMenu:AddItem, mitAction, [actCloseAll]
exec [mainMenu], TMenu:AddItem, mitSeparator, 0
exec [mainMenu], TMenu:AddItem, mitAction, [actExit]
exec [actCheck], TAction:SetAccelerator, Ctrl+Shift, "N"
exec [actNew], TAction:SetAccelerator, Ctrl, "N"
exec [actOpen], TAction:SetAccelerator, Ctrl, "O"
exec [actSave], TAction:SetAccelerator, Ctrl, "S"
exec [actSaveAll], TAction:SetAccelerator, Ctrl+Shift, "S"
exec [actClose], TAction:SetAccelerator, Ctrl+fkScancode, keyF4
exec [actExit], TAction:SetAccelerator, Alt, "X"
set [actCheck], TAction:Checked, 1
set [actCheck], TAction:Enabled, 0
; set [cbEnableDisable2], TCheckbox:Enabled, 0
exec [subMenu], TMenu:AddItem, mitAction, [actClean]
exec [subMenu], TMenu:AddItem, mitSeparator, 0
exec [subMenu], TMenu:AddItem, mitString, "/home/johnfound/Fresh/source/Fresh.fpr"
exec [subMenu], TMenu:AddItem, mitString, "/home/johnfound/Fresh/source/Fresh.asm"
exec [subMenu], TMenu:AddItem, mitString, "/home/johnfound/Fresh/freshlib/freshlib.inc"
stdcall Run
FinalizeAll
stdcall TerminateAll, 0
; Sample event handlers. They work with other objects on the form.
proc FormOnCreate as TObject.OnCreate
begin
DebugMsg "Form OnCreate event handler."
stdcall CreateImagePNG, imgMenu, imgMenu.size
mov [iconMenu], eax
return
endp
proc FormOnDestroy as TObject.OnDestroy
begin
DebugMsg "MainForm destroy event handler."
return
endp
proc MainFormOnClose as TForm.OnClose
begin
DebugMsg "Main form OnClose event handler"
clc
return
endp
proc OpenMenuClick as TButton.OnClick
begin
exec [mainMenu], TMenu:Show, [btnOpenMenu], 0, 32
return
endp
proc ButtonKeyPressed as TWindow.OnKeyPressed
begin
stdcall CreateKeyName, [.utf8], [.scancode], [.kbdState]
push eax
stdcall StrPtr, eax
OutputLn eax
OutputValue " UTF-8: $", [.utf8], 16, 8
OutputValue "Scan code: $", [.scancode], 16, 8
OutputValue " State: $", [.kbdState], 16, 8
DebugMsg " "
stdcall StrDel
return
endp
proc SetWinSkin as TButton.OnClick
begin
stdcall StringToNamedArray, GUI.meta, cfgWin
exec [frmMain], TWindow:RefreshAll
return
endp
proc SetFlatSkin as TButton.OnClick
begin
stdcall StringToNamedArray, GUI.meta, cfgFlat
exec [frmMain], TWindow:RefreshAll
return
endp
proc ActionOnExecute as TAction.OnExecute
begin
mov esi, [.Action]
stdcall StrDupMem, 'Action "'
mov ebx, eax
get eax, [.Action], TAction:Caption
stdcall StrCat, ebx, eax
stdcall StrCat, ebx, '" executed from control $'
stdcall NumToStr, [.Ctrl], ntsHex or ntsFixedWidth + 8
stdcall StrCat, ebx, eax
stdcall StrDel, eax
stdcall ShowMessage, [frmMain], smiInformation, "Action execution", ebx, smbOK
stdcall StrDel, ebx
return
endp
proc ActionOnCheck as TAction.OnExecute
begin
get eax, [.Action], TAction:Checked
xor eax, 1
set [.Action], TAction:Checked, eax
return
endp
proc SetAction1 as TButton.OnClick
begin
set [btnWithAction1], TButton:Action, [actOpen]
set [btnWithAction2], TButton:Action, [actSaveAll]
return
endp
proc SetAction2 as TButton.OnClick
begin
set [btnWithAction1], TButton:Action, [actCheck]
set [btnWithAction2], TButton:Action, [actClose]
return
endp
proc EnableActionClick as TButton.OnClick
begin
get eax, [.self], TCheckbox:Checked
set [actCheck], TAction:Enabled, eax
return
endp
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 |
; _______________________________________________________________________________________
;| |
;| ..:: Fresh IDE ::.. template project. |
;|_______________________________________________________________________________________|
;
; Description: FreshLib portable console application.
;
; Target OS: Any, supported by FreshLib
;
; Dependencies: FreshLib
;
; Notes:
;_________________________________________________________________________________________
include "%lib%/freshlib.inc"
@BinaryType GUI, compact
options.DebugMode = 0
options.DebugMode.NoTimers = 0
options.DebugMode.XSync = 0
options.DebugMode.XErrors =0
options.ShowSizes = 1
options.SkipZeroSizes = 0
ThemeGUI equ flat_gui
include "%lib%/freshlib.asm"
iglobal
TemplateMainForm:
ObjTemplate tfParent or tfEnd, TForm, frmMain, \
x = 100, \
y = 50, \
width = 600, \
height = 520, \
OnCreate = FormOnCreate, \
OnClose = MainFormOnClose, \
OnDestroy = FormOnDestroy, \
Caption = 'The new GUI toolkit test form.'
ObjTemplate tfChild, TLabel, NONE, \
x = 10, y = 10, width = 200, height = 24, \
Caption = "Progress bar test:", \
Visible = TRUE
ObjTemplate tfChild, TProgress, Progress1, \
x = 38, y = 32, width = 200, height = 24, \
Max = 100, Pos = 70, \
Visible = TRUE
ObjTemplate tfChild, TButton, btnArrowLeft, \
x = 10, \
y = 32, \
width = 24, \
height = 24, \
Icon = [iconArrowLeft], \
IconPosition = iposCenter, \
Visible = TRUE, \
OnClick = ArrowLeftClick
ObjTemplate tfChild, TButton, btnArrowRight, \
x = 242, \
y = 32, \
width = 24, \
height = 24, \
Icon = [iconArrowRight], \
IconPosition = iposCenter, \
Visible = TRUE, \
OnClick = ArrowRightClick
ObjTemplate tfChild, TLabel, NONE, \
x = 10, y = 75, width = 200, height = 24, \
Caption = "Buttons test:", \
Visible = TRUE
ObjTemplate tfChild, TButton, btnDisabled, \
x = 448, \
y = 100, \
width = 128, \
height = 48, \
TextAlign = dtfAlignJustify or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = "Disabled", \
Icon = [iconTest1], \
IconPosition = iposLeft, \
Enabled = FALSE, \
Visible = TRUE
ObjTemplate tfChild, TButton, btnChild1, \
x = 10, \
y = 100, \
width = 407, \
height = 242, \
TextAlign = dtfAlignJustify or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = utf8_long, \
Icon = [iconTest1], \
IconPosition = iposLeft, \
Visible = TRUE, \
OnClick = Button1Click
ObjTemplate tfChild, TButton, btnChild2, \
x = 448, \
y = 160, \
width = 128, \
height = 48, \
TextAlign = dtfAlignJustify or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = utf8_string, \
Icon = [iconTest2], \
IconPosition = iposRight, \
Enabled = TRUE, \
Visible = TRUE, \
OnClick = Button2Click
ObjTemplate tfChild, TButton, btnChild3, \
x = 448, \
y = 220, \
width = 128, \
height = 122, \
TextAlign = dtfAlignCenter or dtfAlignBottom or dtfCRLF or dtfWordWrap,\
Caption = "Workers of the world, unite!", \
Icon = [iconTest3], \
IconPosition = iposCenter, \
Enabled = TRUE, \
Visible = TRUE
ObjTemplate tfChild, TButton, btnAlignLeft, \
x = 10, \
y = 350, \
width = 64, \
height = 32, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Left', \
Visible = TRUE, \
OnClick = LeftClick
ObjTemplate tfChild, TButton, btnAlignRight, \
x = 84, \
y = 350, \
width = 64, \
height = 32, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Right', \
Visible = TRUE, \
OnClick = RightClick
ObjTemplate tfChild, TButton, btnAlignCenter, \
x = 158, \
y = 350, \
width = 64, \
height = 32, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Center', \
Visible = TRUE, \
OnClick = CenterClick
ObjTemplate tfChild, TButton, btnAlignJust, \
x = 232, \
y = 350, \
width = 64, \
height = 32, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Justify', \
Visible = TRUE, \
OnClick = JustifyClick
ObjTemplate tfChild, TButton, btnAlignTop, \
x = 306, \
y = 350, \
width = 64, \
height = 32, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Top', \
Visible = TRUE, \
OnClick = TopClick
ObjTemplate tfChild, TButton, btnAlignMiddle, \
x = 380, \
y = 350, \
width = 64, \
height = 32, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Middle', \
Visible = TRUE, \
OnClick = MiddleClick
ObjTemplate tfChild, TButton, btnAlignBottom, \
x = 454, \
y = 350, \
width = 64, \
height = 32, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Bottom', \
Visible = TRUE, \
OnClick = BottomClick
ObjTemplate tfChild, TLabel, NONE, \
x = 10, y = 390, width = 200, height = 24, \
Caption = "Line editor test:", \
Visible = TRUE
ObjTemplate tfChild, TEdit, editTest, \
Text = "This is simple line editor.", \
x = 10, y=415, width=306, height=24, \
MarginLeft= 2, \
MarginRight= 2, \
Visible = TRUE
ObjTemplate tfChild, TLabel, NONE, \
x = 10, y = 445, width = 200, height = 24, \
Caption = "Message boxes test:", \
Visible = TRUE
ObjTemplate tfChild, TButton, btnMsgError, \
x = 10, \
y = 470, \
width = 72, \
height = 32, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Error', \
Visible = TRUE, \
OnClick = ErrorClick
ObjTemplate tfChild, TButton, btnMsgWarning, \
x = 88, \
y = 470, \
width = 72, \
height = 32, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Warning', \
Visible = TRUE, \
OnClick = WarningClick
ObjTemplate tfChild, TButton, btnMsgQuestion, \
x = 166, \
y = 470, \
width = 72, \
height = 32, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Question', \
Visible = TRUE, \
OnClick = QuestionClick
ObjTemplate tfChild or tfEnd, TButton, btnMsgInfo, \
x = 244, \
y = 470, \
width = 72, \
height = 32, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Info', \
Visible = TRUE, \
OnClick = InfoClick
getfile imgTestIcon1, '_test_images/speech.png'
getfile imgTestIcon2, '_test_images/globe.png'
getfile imgTestIcon3, '_test_images/star.png'
getfile imgArrowLeft, '_test_images/left.png'
getfile imgArrowRight, '_test_images/right.png'
getfile imgFolder, "_test_images/folder.png"
getfile imgFile, "_test_images/document.png"
include "UTF8_examples.asm"
endg
uglobal
iconTest1 dd ?
iconTest2 dd ?
iconTest3 dd ?
iconArrowLeft dd ?
iconArrowRight dd ?
iconFolder dd ?
iconFile dd ?
endg
;rb 423
start:
InitializeAll
create [pApplication], TApplication
call GUI.Init
stdcall CreateFromTemplate, TemplateMainForm, 0
set [pApplication], TApplication:MainWindow, frmMain
set [frmMain], TWindow:Visible, TRUE ; must be set visible after creation, because it loads
; needed images in OnCreate event handler.
stdcall Run
FinalizeAll
stdcall TerminateAll, 0
; Sample event handlers. They work with other objects on the form.
proc FormOnCreate as TObject.OnCreate
begin
DebugMsg "Form OnCreate event handler."
stdcall CreateImagePNG, imgTestIcon1, imgTestIcon1.size
mov [iconTest1], eax
stdcall CreateImagePNG, imgTestIcon2, imgTestIcon2.size
mov [iconTest2], eax
stdcall CreateImagePNG, imgTestIcon3, imgTestIcon3.size
mov [iconTest3], eax
stdcall CreateImagePNG, imgArrowLeft, imgArrowLeft.size
mov [iconArrowLeft], eax
stdcall CreateImagePNG, imgArrowRight, imgArrowRight.size
mov [iconArrowRight], eax
stdcall CreateImagePNG, imgFolder, imgFolder.size
mov [iconFolder], eax
stdcall CreateImagePNG, imgFile, imgFile.size
mov [iconFile], eax
return
endp
proc FormOnDestroy as TObject.OnDestroy
begin
DebugMsg "MainForm destroy event handler."
return
endp
proc LeftClick as TButton.OnClick
begin
get eax, [btnChild1], TButton:TextAlign
and eax, not dtfHAlignMask
or eax, dtfAlignLeft
set [btnChild1], TButton:TextAlign, eax
return
endp
proc RightClick as TButton.OnClick
begin
get eax, [btnChild1], TButton:TextAlign
and eax, not dtfHAlignMask
or eax, dtfAlignRight
set [btnChild1], TButton:TextAlign, eax
return
endp
proc CenterClick as TButton.OnClick
begin
get eax, [btnChild1], TButton:TextAlign
and eax, not dtfHAlignMask
or eax, dtfAlignCenter
set [btnChild1], TButton:TextAlign, eax
return
endp
proc JustifyClick as TButton.OnClick
begin
get eax, [btnChild1], TButton:TextAlign
and eax, not dtfHAlignMask
or eax, dtfAlignJustify
set [btnChild1], TButton:TextAlign, eax
return
endp
proc TopClick as TButton.OnClick
begin
get eax, [btnChild1], TButton:TextAlign
and eax, not dtfVAlignMask
or eax, dtfAlignTop
set [btnChild1], TButton:TextAlign, eax
return
endp
proc MiddleClick as TButton.OnClick
begin
get eax, [btnChild1], TButton:TextAlign
and eax, not dtfVAlignMask
or eax, dtfAlignMiddle
set [btnChild1], TButton:TextAlign, eax
return
endp
proc BottomClick as TButton.OnClick
begin
get eax, [btnChild1], TButton:TextAlign
and eax, not dtfVAlignMask
or eax, dtfAlignBottom
set [btnChild1], TButton:TextAlign, eax
return
endp
proc Button1Click as TButton.OnClick
begin
DebugMsg 'Button1 clicked'
return
endp
proc Button2Click as TButton.OnClick
begin
DebugMsg 'Button2 clicked'
return
endp
proc MainFormOnClose as TForm.OnClose
begin
DebugMsg "Main form OnClose event handler"
clc
return
endp
;proc PaintMainFormBG as TWindow.OnPaint
;begin
;
;; tile test background
; mov esi, [.self]
; mov edi, [.canvas]
; mov ebx, [imgTest]
; xor edx, edx
;
; test ebx, ebx
; jz .finish
;
;.yloop:
;
; xor ecx, ecx
;
;.xloop:
; stdcall BlendImage, edi, ecx, edx, ebx, 0, 0, [ebx+TImage.width], [ebx+TImage.height]
;
; add ecx, [ebx+TImage.width]
; cmp ecx, [edi+TImage.width]
; jb .xloop
;
; add edx, [ebx+TImage.height]
; cmp edx, [edi+TImage.height]
; jb .yloop
;
;.finish:
; return
;endp
proc ButtonPaint as TWindow.OnPaint
begin
stdcall DrawSolidRect, [.canvas], 40, 40, 140, 140, 0
return
endp
proc ArrowLeftClick as TButton.OnClick
begin
get eax, [Progress1], TProgress:Pos
dec eax
jns @f
mov eax, 100
@@:
set [Progress1], TProgress:Pos, eax
return
endp
proc ArrowRightClick as TButton.OnClick
begin
get eax, [Progress1], TProgress:Pos
inc eax
cmp eax, 100
jbe @f
xor eax, eax
@@:
set [Progress1], TProgress:Pos, eax
return
endp
proc ErrorClick as TButton.OnClick
begin
stdcall ShowMessage, [frmMain], smiError, "Dialog box test.", "This is test of common dialog boxes.", smbOK
return
endp
proc WarningClick as TButton.OnClick
begin
stdcall ShowMessage, [frmMain], smiWarning, "Dialog box test.", "This is test of common dialog boxes.", smbOK
return
endp
proc QuestionClick as TButton.OnClick
begin
stdcall ShowMessage, [frmMain], smiQuestion, "Dialog box test.", "This is test of common dialog boxes.", smbYes or smbNo or smbMaybe
return
endp
proc InfoClick as TButton.OnClick
begin
stdcall ShowMessage, [frmMain], smiInformation, "Dialog box test.", "This is test of common dialog boxes.", smbOK or smbCancel
return
endp
|
cannot compute difference between binary files
| ︙ | ︙ | |||
12 13 14 15 16 17 18 | ; Notes: ;_________________________________________________________________________________________ include "%lib%/freshlib.inc" @BinaryType GUI, compact | | | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ; Notes: ;_________________________________________________________________________________________ include "%lib%/freshlib.inc" @BinaryType GUI, compact options.DebugMode = 1 options.ShowSizes = 1 options.SkipZeroSizes = 1 options.DebugMode.XSync = 0 options.DebugMode.XErrors =0 include "%lib%/freshlib.asm" |
| ︙ | ︙ | |||
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
uglobal
ignore dd ?
endg
start:
InitializeAll
create [pApplication], TApplication
stdcall CreateFromTemplate, TemplateMainForm, 0
set [pApplication], TApplication:MainWindow, frmMain
stdcall Run
FinalizeAll
| > > > > | 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
uglobal
ignore dd ?
endg
start:
InitializeAll
create [pApplication], TApplication
stdcall TestBackground
stdcall CreateFromTemplate, TemplateMainForm, 0
set [pApplication], TApplication:MainWindow, frmMain
stdcall Run
FinalizeAll
|
| ︙ | ︙ | |||
140 141 142 143 144 145 146 |
proc Button1Click as TButton.OnClick
.img dd ?
begin
pushad
DebugMsg 'Button1 clicked'
| < < < < < < < < | 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
proc Button1Click as TButton.OnClick
.img dd ?
begin
pushad
DebugMsg 'Button1 clicked'
stdcall CreateImagePNG, pngBackground, sizeof.pngBackground
mov [.img], eax
mov edi, PngFiles
mov ecx, xStart
mov edx, yStart
|
| ︙ | ︙ | |||
179 180 181 182 183 184 185 |
jb .loop
mov ecx, xStart
add edx, yStep
jmp .loop
.finish_demo:
| | > > | > > > > > > > > | 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
jb .loop
mov ecx, xStart
add edx, yStep
jmp .loop
.finish_demo:
get ebx, [frmMain], TWindow:Canvas
mov esi, [.img]
stdcall BlendImage, ebx, 0, 0, esi, 0, 0, [esi+TImage.width], [esi+TImage.height]
; exec [frmMain], TWindow:Refresh
mov eax, [frmMain]
stdcall _RefreshWindow, [eax+TWindow.handle]
DebugMsg "Draw on window"
.end:
popad
return
endp
|
| ︙ | ︙ | |||
205 206 207 208 209 210 211 |
DebugMsg 'Button2 clicked'
stdcall FontCreate4, 'DejaVu', 20, 1000, 0
mov [.font], eax
mov eax, [frmMain]
| | | | 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
DebugMsg 'Button2 clicked'
stdcall FontCreate4, 'DejaVu', 20, 1000, 0
mov [.font], eax
mov eax, [frmMain]
stdcall __AllocateContext, [eax+TWindow.handle]
mov [.context], eax
stdcall __SetDrawMode, eax, cmCopy
stdcall CreateImagePNG, pngBackground, sizeof.pngBackground
mov [.bkgnd], eax
stdcall CreateImagePNG, pngBackground, sizeof.pngBackground
mov [.work], eax
|
| ︙ | ︙ | |||
391 392 393 394 395 396 397 |
stdcall DrawImage, [.context], [.bkgnd], 0, 0
stdcall DestroyImage, [.bkgnd]
stdcall DestroyImage, [.work]
stdcall DestroyImage, [.art]
| | | 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 |
stdcall DrawImage, [.context], [.bkgnd], 0, 0
stdcall DestroyImage, [.bkgnd]
stdcall DestroyImage, [.work]
stdcall DestroyImage, [.art]
stdcall __ReleaseContext, [.context]
stdcall FontDestroy2, [.font]
popad
return
.terminate:
pop eax
|
| ︙ | ︙ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 |
; _______________________________________________________________________________________
;| |
;| ..:: Fresh IDE ::.. template project. |
;|_______________________________________________________________________________________|
;
; Description: FreshLib portable console application.
;
; Target OS: Any, supported by FreshLib
;
; Dependencies: FreshLib
;
; Notes:
;_________________________________________________________________________________________
include "%lib%/freshlib.inc"
@BinaryType GUI, compact
options.DebugMode = 1
options.DebugMode.NoTimers = 0
options.DebugMode.XSync = 0
options.DebugMode.XErrors =0
options.ShowSizes = 1
options.SkipZeroSizes = 1
ThemeGUI equ flat_gui
include "%lib%/freshlib.asm"
iglobal
TemplateMainForm:
ObjTemplate tfParent or tfEnd, TForm, frmMain, \
x = 100, \
y = 50, \
width = 640, \
height = 480, \
OnCreate = FormOnCreate, \
OnClose = MainFormOnClose, \
OnDestroy = FormOnDestroy, \
SplitGrid = SplitTest, \
Caption = 'Split grids test form'
ObjTemplate tfChild, TEdit, editDir, \
Text = "/home", \
x = 10, y=10, width=370, height=24, \
MarginLeft= 2, \
MarginRight= 2, \
OnCreate = EditOnCreate, \
SplitCell = SplitTest.cellEdit, \
Visible = TRUE
ObjTemplate tfChild, TButton, btnArrowRight, \
x = 384, \
y = 10, \
width = 24, \
height = 24, \
Icon = [iconArrowRight], \
IconPosition = iposCenter, \
SplitCell = SplitTest.cellButton, \
Visible = TRUE, \
OnClick = ReadFolderClick
ObjTemplate tfChild, TLabel, lblEmpty, \
SplitCell = SplitTest.cellEmpty, \
Caption = utf8_long, \
TextAlign = dtfAlignJustify or dtfAlignTop or dtfCRLF or dtfWordWrap, \
Visible = TRUE
ObjTemplate tfChild or tfEnd, TTreeView, tvFolders, \
x = 10, y = 40, width = 200, height = 200, \
SplitCell = SplitTest.cellTree, \
\; OnFocusItem = TreeFocusItem, \
Visible = TRUE
include "UTF8_examples.asm"
SplitStart SplitTest
Split stVert, 6, 24, 16, 48
Split stHoriz or stOriginBR or stJustGap, 6, 64, 48, 200
Cell cellEdit
Cell cellButton
Split stHoriz or stRelative, 6, 16384, 3000, 29000
Cell cellTree
Cell cellEmpty
SplitEnd
if ThemeGUI eq win_gui
getfile imgArrowRight, '_test_images/right2.png'
getfile imgFolder, "_test_images/folder2.png"
getfile imgFile, "_test_images/document2.png"
end if
if ThemeGUI eq flat_gui
getfile imgArrowRight, '_test_images/right.png'
getfile imgFolder, "_test_images/folder.png"
getfile imgFile, "_test_images/document.png"
end if
endg
uglobal
iconArrowRight dd ?
iconFolder dd ?
iconFile dd ?
endg
;rb 423
start:
InitializeAll
create [pApplication], TApplication
stdcall GUI.Init
stdcall CreateFromTemplate, TemplateMainForm, 0
set [pApplication], TApplication:MainWindow, frmMain
set [frmMain], TWindow:Visible, TRUE ; must be set visible after creation, because it loads
; needed images in OnCreate event handler.
stdcall Run
FinalizeAll
stdcall TerminateAll, 0
; Sample event handlers. They work with other objects on the form.
proc FormOnCreate as TObject.OnCreate
begin
DebugMsg "Form OnCreate event handler."
stdcall CreateImagePNG, imgArrowRight, imgArrowRight.size
mov [iconArrowRight], eax
stdcall CreateImagePNG, imgFolder, imgFolder.size
mov [iconFolder], eax
stdcall CreateImagePNG, imgFile, imgFile.size
mov [iconFile], eax
return
endp
proc EditOnCreate as TObject.OnCreate
begin
if TargetOS eq Win32
set [editDir], TEdit:Text, txt "c:\"
else
set [editDir], TEdit:Text, txt "/home"
end if
return
endp
proc FormOnDestroy as TObject.OnDestroy
begin
DebugMsg "MainForm destroy event handler."
return
endp
proc MainFormOnClose as TForm.OnClose
begin
DebugMsg "Main form OnClose event handler"
clc
return
endp
proc TreeFocusItem as TTreeView.OnFocusItem
begin
mov ebx, [.pItem]
stdcall FileWriteString, [STDOUT], [ebx+TTreeViewItem.UserData]
stdcall FileWriteString, [STDOUT], <txt 13, 10>
; stdcall StrExtractExt, [ebx+TTreeViewItem.UserData]
; jc .finish
;
; stdcall StrCompNoCase, eax, txt ".txt"
; stdcall StrDel, eax
; jnc .finish
stdcall LoadBinaryFile, [ebx+TTreeViewItem.UserData]
jc .finish
push eax
set [lblEmpty], TLabel:Caption, eax
stdcall FreeMem ; from the stack
.finish:
return
endp
proc ReadFolderClick as TButton.OnClick
begin
pushad
get edi, [frmMain], TWindow:Cursor
stdcall GetStockCursor, mcWait
push eax
mov eax, [frmMain]
stdcall SetMouseCursor, [eax+TWindow.handle]
stdcall ProcessSystemEvents
mov esi, [tvFolders]
get ebx, [editDir], TEdit:Text
mov edx, [esi+TTreeView._items]
stdcall DeleteArrayItems, edx, 0, [edx+TArray.count]
stdcall ___DoReadDir, ebx, edx, -1
mov [esi+TTreeView._items], edx
jc .error
.finish:
stdcall StrDel, ebx
OutputValue "Files tree items:", [edx+TArray.count], 10, 8
exec [tvFolders], TTreeView:__RebuildIndex
exec [tvFolders], TWindow:Refresh
set [frmMain], TWindow:Cursor, edi
popad
return
.error:
stdcall GetErrorString, eax
push eax
stdcall ShowMessage, [frmMain], smiError, "File error", eax, smbOK
stdcall FreeErrorString ; from the stack
jmp .finish
endp
proc ___DoReadDir, .hDir, .pArray, .Level
begin
pushad
mov edx, [.pArray]
mov ebx, [.Level]
inc ebx
stdcall DirectoryRead, [.hDir]
jc .finish
mov esi, eax
xor ecx, ecx
stdcall SortDirArray, esi, fdsByType
.loop:
cmp ecx, [esi+TArray.count]
jae .end_loop
stdcall StrPtr, [esi+TArray.array + 8*ecx + TDirItem.hFilename]
cmp byte [eax], "."
je .next
; Output eax
; DebugMsg ""
stdcall StrDup, [.hDir]
stdcall StrCharCat, eax, "/"
stdcall StrCat, eax, [esi+TArray.array+8*ecx+TDirItem.hFilename]
push eax
stdcall AddArrayItems, edx, 1
push [esi+TArray.array + 8*ecx + TDirItem.hFilename] ; name
pop [eax+TTreeViewItem.caption]
pop [eax+TTreeViewItem.UserData] ; the full filename
mov [eax+TTreeViewItem.level], ebx
mov [eax+TTreeViewItem.state], tvisExpanded
push edx
mov edx, [iconFolder]
cmp [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
je @f
mov edx, [iconFile]
cmp [esi+TArray.array + 8*ecx + TDirItem.Type], ftFile
je @f
xor edx, edx
@@:
mov [eax+TTreeViewItem.imgNormal], edx
pop edx
cmp [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
jne .next
stdcall StrDup, [.hDir]
push eax
stdcall StrCharCat, eax, "/"
stdcall StrCat, eax, [esi+TArray.array + 8*ecx + TDirItem.hFilename]
stdcall ___DoReadDir, eax, edx, ebx
stdcall StrDel ; from the stack
.next:
inc ecx
jmp .loop
.end_loop:
stdcall FreeMem, esi
clc
xor eax, eax
.finish:
mov [esp+regEAX*4], eax
mov [esp+regEDX*4], edx
popad
return
endp
|
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 |
; _______________________________________________________________________________________
;| |
;| ..:: Fresh IDE ::.. template project. |
;|_______________________________________________________________________________________|
;
; Description: FreshLib portable console application.
;
; Target OS: Any, supported by FreshLib
;
; Dependencies: FreshLib
;
; Notes:
;_________________________________________________________________________________________
include "%lib%/freshlib.inc"
@BinaryType GUI, compact
options.DebugMode = 0
options.DebugMode.NoTimers = 0
options.DebugMode.XSync = 0
options.DebugMode.XErrors =0
options.ShowSizes = 1
options.SkipZeroSizes = 1
ThemeGUI equ flat_gui
include "%lib%/freshlib.asm"
iglobal
TemplateMainForm:
ObjTemplate tfParent or tfEnd, TForm, frmMain, \
x = 100, \
y = 50, \
width = 418, \
height = 510, \
OnCreate = FormOnCreate, \
OnClose = MainFormOnClose, \
OnDestroy = FormOnDestroy, \
Caption = 'The new GUI toolkit test form.'
ObjTemplate tfChild, TEdit, editDir, \
Text = "/home", \
x = 10, y=10, width=370, height=24, \
MarginLeft= 2, \
MarginRight= 2, \
OnCreate = EditOnCreate, \
Visible = TRUE
ObjTemplate tfChild, TButton, btnArrowRight, \
x = 384, \
y = 10, \
width = 24, \
height = 24, \
Icon = [iconArrowRight], \
IconPosition = iposCenter, \
Visible = TRUE, \
OnClick = ReadFolderClick
ObjTemplate tfChild or tfEnd, TTreeView, tvFolders, \
x = 10, y = 40, width = 400, height = 460, \
Visible = TRUE
if ThemeGUI eq win_gui
getfile imgArrowRight, '_test_images/right2.png'
getfile imgFolder, "_test_images/folder2.png"
getfile imgFile, "_test_images/document2.png"
end if
if ThemeGUI eq flat_gui
getfile imgArrowRight, '_test_images/right.png'
getfile imgFolder, "_test_images/folder.png"
getfile imgFile, "_test_images/document.png"
end if
endg
uglobal
iconArrowRight dd ?
iconFolder dd ?
iconFile dd ?
endg
;rb 423
start:
InitializeAll
create [pApplication], TApplication
stdcall GUI.Init
stdcall CreateFromTemplate, TemplateMainForm, 0
set [pApplication], TApplication:MainWindow, frmMain
set [frmMain], TWindow:Visible, TRUE ; must be set visible after creation, because it loads
; needed images in OnCreate event handler.
stdcall Run
FinalizeAll
stdcall TerminateAll, 0
; Sample event handlers. They work with other objects on the form.
proc FormOnCreate as TObject.OnCreate
begin
DebugMsg "Form OnCreate event handler."
stdcall CreateImagePNG, imgArrowRight, imgArrowRight.size
mov [iconArrowRight], eax
stdcall CreateImagePNG, imgFolder, imgFolder.size
mov [iconFolder], eax
stdcall CreateImagePNG, imgFile, imgFile.size
mov [iconFile], eax
return
endp
proc EditOnCreate as TObject.OnCreate
begin
if TargetOS eq Win32
set [editDir], TEdit:Text, txt "c:\"
else
set [editDir], TEdit:Text, txt "/home"
end if
return
endp
proc FormOnDestroy as TObject.OnDestroy
begin
DebugMsg "MainForm destroy event handler."
return
endp
proc MainFormOnClose as TForm.OnClose
begin
DebugMsg "Main form OnClose event handler"
clc
return
endp
proc ReadFolderClick as TButton.OnClick
begin
pushad
get edi, [frmMain], TWindow:Cursor
stdcall GetStockCursor, mcWait
push eax
mov eax, [frmMain]
stdcall SetMouseCursor, [eax+TWindow.handle]
stdcall ProcessSystemEvents
mov esi, [tvFolders]
get ebx, [editDir], TEdit:Text
mov edx, [esi+TTreeView._items]
stdcall DeleteArrayItems, edx, 0, [edx+TArray.count]
stdcall ___DoReadDir, ebx, edx, -1
mov [esi+TTreeView._items], edx
jc .error
.finish:
stdcall StrDel, ebx
OutputValue "Files tree items:", [edx+TArray.count], 10, 8
exec [tvFolders], TTreeView:__RebuildIndex
exec [tvFolders], TWindow:Refresh
set [frmMain], TWindow:Cursor, edi
popad
return
.error:
stdcall GetErrorString, eax
push eax
stdcall ShowMessage, [frmMain], smiError, "File error", eax, smbOK
stdcall FreeErrorString ; from the stack
jmp .finish
endp
proc ___DoReadDir, .hDir, .pArray, .Level
begin
pushad
mov edx, [.pArray]
mov ebx, [.Level]
inc ebx
stdcall DirectoryRead, [.hDir]
jc .finish
mov esi, eax
xor ecx, ecx
stdcall SortDirArray, esi, fdsByType
.loop:
cmp ecx, [esi+TArray.count]
jae .end_loop
stdcall StrPtr, [esi+TArray.array + 8*ecx + TDirItem.hFilename]
cmp byte [eax], "."
je .next
; Output eax
; DebugMsg ""
stdcall AddArrayItems, edx, 1
push [esi+TArray.array + 8*ecx + TDirItem.hFilename] ; name
pop [eax+TTreeViewItem.caption]
mov [eax+TTreeViewItem.level], ebx
mov [eax+TTreeViewItem.state], tvisExpanded
push edx
mov edx, [iconFolder]
cmp [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
je @f
mov edx, [iconFile]
cmp [esi+TArray.array + 8*ecx + TDirItem.Type], ftFile
je @f
xor edx, edx
@@:
mov [eax+TTreeViewItem.imgNormal], edx
pop edx
cmp [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
jne .next
stdcall StrDup, [.hDir]
push eax
stdcall StrCharCat, eax, "/"
stdcall StrCat, eax, [esi+TArray.array + 8*ecx + TDirItem.hFilename]
stdcall ___DoReadDir, eax, edx, ebx
stdcall StrDel ; from the stack
.next:
inc ecx
jmp .loop
.end_loop:
stdcall FreeMem, esi
clc
xor eax, eax
.finish:
mov [esp+regEAX*4], eax
mov [esp+regEDX*4], edx
popad
return
endp
|
| ︙ | ︙ | |||
58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
OnClick, Button2Click
endg
rb 423
start:
InitializeAll
create [pApplication], TApplication
stdcall CreateFromTemplate, TemplateMainForm, 0
set [pApplication], TApplication:MainWindow, frmMain
| > | 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
OnClick, Button2Click
endg
rb 423
start:
InitializeAll
create [pApplication], TApplication
stdcall CreateFromTemplate, TemplateMainForm, 0
set [pApplication], TApplication:MainWindow, frmMain
|
| ︙ | ︙ | |||
100 101 102 103 104 105 106 107 108 109 110 111 |
proc Button2Click as TButton.OnClick
.font dd ?
.width dd ?
.height dd ?
.y dd ?
begin
pushad
DebugMsg 'Button2 clicked'
| > | | > > > > | < < < | | > | < > | > > > > | > > | | > | | > | > | | 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
proc Button2Click as TButton.OnClick
.font dd ?
.width dd ?
.height dd ?
.y dd ?
.start dd ?
begin
pushad
DebugMsg 'Button2 clicked'
stdcall FontCreate4, 'Ubuntu', 16, 900, ffUnderline
mov [.font], eax
stdcall CreateImage, 1024, 600
mov esi, eax
mov edi, [frmMain]
stdcall AllocateContext, [edi+TWindow.handle]
mov edi, eax
stdcall DrawSolidRect, esi, 0, 0, 1024, 600, $ffd0d0d8
stdcall DrawSolidRect, esi, 320, 0, 320, 480, $ff0000ff
stdcall GetFontMetrics, [.font]
mov [.height], eax
stdcall GetTimestamp
mov [.start], eax
mov edx, 7
mov ecx, -100
mov ecx, 1000
mov [.y], 5
.loop:
; 85 characters text
; stdcall DrawString2, esi, 'uon ravo s s smpe ex, spaye y reeype rary usng reeype cace.', -1, 150, [.y], [.font], $ff000000
stdcall DrawString2, esi, 'Button BRAVO This is simple text, displayed by FreeType library using FreeType cache.', -1, 150, [.y], [.font], $ff000000
mov [.width], eax
mov edx, ebx
add ebx, [.y]
neg edx
; stdcall DrawSolidRect, esi, 150, ebx, eax, 1, $ffff0000
; stdcall DrawSolidRect, esi, 150, [.y], eax, 1, $ffff0000
; stdcall GetTextBounds2, 'Button BRAVO This is simple text, displayed by FreeType library using FreeType cache.', -1, [.font]
mov eax, [.height]
add [.y], eax
dec ecx
jnz .loop
stdcall GetTimestamp
sub eax, [.start]
stdcall NumToStr, eax, ntsUnsigned or ntsDec
push eax
stdcall StrPtr, eax
stdcall DrawString2, esi, eax, -1, 40, 500, [.font], $ff000000
stdcall StrDel ; from the stack
stdcall NumToStr, [.width], ntsDec or ntsSigned
push eax
stdcall StrPtr, eax
stdcall DrawString2, esi, eax, -1, 40, 520, [.font], $ff000000
stdcall StrDel ; from the stack
stdcall NumToStr, [.height], ntsDec or ntsUnsigned
push eax
stdcall StrPtr, eax
stdcall DrawString2, esi, eax, -1, 40, 540, [.font], $ff000000
stdcall StrDel ; from the stack
stdcall DrawImage, edi, esi, 0, 0
stdcall FontDestroy2, [.font]
popad
return
endp
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 |
; _______________________________________________________________________________________
;| |
;| ..:: Fresh IDE ::.. template project. |
;|_______________________________________________________________________________________|
;
; Description: FreshLib portable console application.
;
; Target OS: Any, supported by FreshLib
;
; Dependencies: FreshLib
;
; Notes:
;_________________________________________________________________________________________
include "%lib%/freshlib.inc"
@BinaryType GUI, compact
options.DebugMode = 0
options.DebugMode.NoTimers = 1
options.DebugMode.XSync = 0
options.DebugMode.XErrors =0
options.ShowSizes = 1
options.SkipZeroSizes = 0
options.WholeTheme = 1
ThemeGUI equ win_gui
include "%lib%/freshlib.asm"
iglobal
TemplateMainForm:
ObjTemplate tfParent or tfEnd, TForm, frmMain, \
x = 100, \
y = 50, \
width = 320, \
height = 520, \
OnCreate = FormOnCreate, \
OnClose = MainFormOnClose, \
OnDestroy = FormOnDestroy, \
Caption = 'The new GUI toolkit test form.'
ObjTemplate tfChild, TLabel, NONE, \
x = 10, y = 10, width=400, height = 19, \
Caption = "Load theme from file:", \
Visible = TRUE
ObjTemplate tfChild, TButton, btnTheme1, \
x = 10, \
y = 32, \
width = 90, \
height = 24, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = "Theme Win", \
Visible = TRUE, \
OnClick = LoadTheme1Click
ObjTemplate tfChild, TButton, btnTheme2, \
x = 102, \
y = 32, \
width = 90, \
height = 24, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = "Theme Flat", \
Visible = TRUE, \
OnClick = LoadTheme2Click
ObjTemplate tfChild, TLabel, NONE, \
x = 10, y = 393, width=400, height = 19, \
Caption = "Load/Save custom theme:", \
Visible = TRUE
ObjTemplate tfChild, TEdit, editTest, \
Text = "Theme.cfg", \
x = 10, y=415, width=168, height=24, \
MarginLeft= 2, \
MarginRight= 2, \
Visible = TRUE
ObjTemplate tfChild, TButton, btnThemeSave, \
x = 180, y = 415, width = 64, height = 24, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Save', \
Visible = TRUE, \
OnClick = SaveThemeClick
ObjTemplate tfChild, TButton, btnThemeLoad, \
x = 246, y = 415, width = 64, height = 24, \
TextAlign = dtfAlignCenter or dtfAlignMiddle or dtfCRLF or dtfWordWrap,\
Caption = 'Load', \
Visible = TRUE, \
OnClick = LoadThemeClick
ObjTemplate tfChild, TProgress, NONE, \
x = 10, y = 490, width = 300, height = 19, \
Max = 100, Pos = 30, \
Visible = TRUE
ObjTemplate tfChild or tfEnd, TTreeView, tvPreview, \
x = 10, y = 64, width = 300, height = 300, \
OnCreate = TreeOnCreate, \
Visible = TRUE
getfile imgFolder1, "_test_images/folder2.png"
getfile imgFile1, "_test_images/document2.png"
getfile imgFolder2, "_test_images/folder.png"
getfile imgFile2, "_test_images/document.png"
endg
uglobal
iconFolder dd ?
iconFile dd ?
endg
;rb 423
start:
InitializeAll
create [pApplication], TApplication
call GUI.Init
stdcall CreateFromTemplate, TemplateMainForm, 0
set [pApplication], TApplication:MainWindow, frmMain
set [frmMain], TWindow:Visible, TRUE ; must be set visible after creation, because it loads
; needed images in OnCreate event handler.
stdcall Run
FinalizeAll
stdcall TerminateAll, 0
; Sample event handlers. They work with other objects on the form.
proc FormOnCreate as TObject.OnCreate
begin
DebugMsg "Form OnCreate event handler."
if ThemeGUI eq win_gui
stdcall CreateIconSet1
else
stdcall CreateIconSet2
end if
return
endp
proc FreeIconSet
begin
xor ecx, ecx
cmp [iconFolder], ecx
je @f
stdcall DestroyImage, [iconFolder]
mov [iconFolder], ecx
@@:
cmp [iconFile], ecx
je @f
stdcall DestroyImage, [iconFile]
mov [iconFile], ecx
@@:
return
endp
proc CreateIconSet1
begin
stdcall FreeIconSet
stdcall CreateImagePNG, imgFolder1, imgFolder1.size
mov [iconFolder], eax
stdcall CreateImagePNG, imgFile1, imgFile1.size
mov [iconFile], eax
return
endp
proc CreateIconSet2
begin
stdcall FreeIconSet
stdcall CreateImagePNG, imgFolder2, imgFolder2.size
mov [iconFolder], eax
stdcall CreateImagePNG, imgFile2, imgFile2.size
mov [iconFile], eax
return
endp
proc TreeOnCreate as TObject.OnCreate
begin
stdcall LoadExampleTreeContent, [.self]
return
endp
proc FormOnDestroy as TObject.OnDestroy
begin
DebugMsg "MainForm destroy event handler."
return
endp
proc MainFormOnClose as TForm.OnClose
begin
DebugMsg "Main form OnClose event handler"
clc
return
endp
proc LoadTheme1Click as TButton.OnClick
begin
pushad
stdcall LoadBinaryFile, "./theme_win.cfg"
jc .finish
push eax
stdcall StringToNamedArray, GUI.meta, eax
stdcall FreeMem ; from the stack.
stdcall CreateIconSet1
stdcall LoadExampleTreeContent, [tvPreview]
exec [frmMain], TWindow:RefreshAll
.finish:
popad
return
endp
proc LoadTheme2Click as TButton.OnClick
begin
pushad
stdcall LoadBinaryFile, "./theme_flat.cfg"
jc .finish
push eax
stdcall StringToNamedArray, GUI.meta, eax
stdcall FreeMem ; from the stack.
stdcall CreateIconSet2
stdcall LoadExampleTreeContent, [tvPreview]
exec [frmMain], TWindow:RefreshAll
.finish:
popad
return
endp
proc SaveThemeClick as TButton.OnClick
begin
pushad
get ebx, [editTest], TEdit:Text
stdcall NamedArrayToString, GUI.meta
mov edi, eax
stdcall StrPtr, eax
mov esi, eax
stdcall StrPtr, ebx
stdcall SaveBinaryFile, eax, esi, [esi+string.len]
stdcall StrDel, ebx
stdcall StrDel, edi
popad
return
endp
proc LoadThemeClick as TButton.OnClick
begin
pushad
get ebx, [editTest], TEdit:Text
stdcall LoadBinaryFile, ebx
jc .finish
push eax
stdcall StringToNamedArray, GUI.meta, eax
stdcall FreeMem ; from the stack.
exec [frmMain], TWindow:RefreshAll
.finish:
stdcall StrDel, ebx
popad
return
endp
proc LoadExampleTreeContent, .pTreeView
begin
pushad
mov esi, [.pTreeView]
mov edx, [esi+TTreeView._items]
stdcall DeleteArrayItems, edx, 0, [edx+TArray.count]
stdcall ___DoReadDir, txt ".", edx, -1
mov [esi+TTreeView._items], edx
jc .error
.finish:
OutputValue "Files tree items:", [edx+TArray.count], 10, 8
exec [.pTreeView], TTreeView:__RebuildIndex
exec [.pTreeView], TWindow:Refresh
set [frmMain], TWindow:Cursor, edi
popad
return
.error:
stdcall GetErrorString, eax
push eax
stdcall ShowMessage, [frmMain], smiError, "File error", eax, smbOK
stdcall FreeErrorString ; from the stack
jmp .finish
endp
proc ___DoReadDir, .hDir, .pArray, .Level
begin
pushad
mov edx, [.pArray]
mov ebx, [.Level]
inc ebx
stdcall DirectoryRead, [.hDir]
jc .finish
mov esi, eax
xor ecx, ecx
stdcall SortDirArray, esi, fdsByType
.loop:
cmp ecx, [esi+TArray.count]
jae .end_loop
stdcall StrPtr, [esi+TArray.array + 8*ecx + TDirItem.hFilename]
cmp byte [eax], "."
je .next
; Output eax
; DebugMsg ""
stdcall AddArrayItems, edx, 1
push [esi+TArray.array + 8*ecx + TDirItem.hFilename] ; name
pop [eax+TTreeViewItem.caption]
mov [eax+TTreeViewItem.level], ebx
mov [eax+TTreeViewItem.state], tvisExpanded
push edx
mov edx, [iconFolder]
cmp [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
je @f
mov edx, [iconFile]
cmp [esi+TArray.array + 8*ecx + TDirItem.Type], ftFile
je @f
xor edx, edx
@@:
mov [eax+TTreeViewItem.imgNormal], edx
pop edx
cmp [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
jne .next
stdcall StrDup, [.hDir]
push eax
stdcall StrCharCat, eax, "/"
stdcall StrCat, eax, [esi+TArray.array + 8*ecx + TDirItem.hFilename]
stdcall ___DoReadDir, eax, edx, ebx
stdcall StrDel ; from the stack
.next:
inc ecx
jmp .loop
.end_loop:
stdcall FreeMem, esi
clc
xor eax, eax
.finish:
mov [esp+regEAX*4], eax
mov [esp+regEDX*4], edx
popad
return
endp
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 |
; _______________________________________________________________________________________
;| |
;| ..:: Fresh IDE ::.. template project. |
;|_______________________________________________________________________________________|
;
; Description: FreshLib portable console application.
;
; Target OS: Any, supported by FreshLib
;
; Dependencies: FreshLib
;
; Notes:
;_________________________________________________________________________________________
include "%lib%/freshlib.inc"
@BinaryType GUI, compact
options.DebugMode = 0
options.DebugMode.NoTimers = 1
options.DebugMode.XSync = 0
options.DebugMode.XErrors =0
options.ShowSizes = 1
options.SkipZeroSizes = 0
options.WholeTheme = 1
ThemeGUI equ
include "%lib%/freshlib.asm"
GUI fix ThemeFlat
include "%lib%/gui/themes/flat_gui.asm"
GUI fix ThemeWin
include "%lib%/gui/themes/win_gui.asm"
;rb 423
start:
InitializeAll
create [pApplication], TApplication, 0
call ThemeFlat.Init
call ThemeWin.Init
; Save flat theme
stdcall NamedArrayToString, ThemeFlat.meta
push eax
stdcall StrPtr, eax
mov esi, eax
stdcall SaveBinaryFile, "theme_flat.cfg", esi, [esi+string.len]
stdcall StrDel ; from the stack
; Save win theme
stdcall NamedArrayToString, ThemeWin.meta
push eax
stdcall StrPtr, eax
mov esi, eax
stdcall SaveBinaryFile, "theme_win.cfg", esi, [esi+string.len]
stdcall StrDel ; from the stack
destroy [pApplication]
FinalizeAll
stdcall TerminateAll, 0
; Sample event handlers. They work with other objects on the form.
proc FormOnCreate as TObject.OnCreate
begin
DebugMsg "Form OnCreate event handler."
if ThemeGUI eq win_gui
stdcall CreateIconSet1
else
stdcall CreateIconSet2
end if
return
endp
proc FreeIconSet
begin
xor ecx, ecx
cmp [iconFolder], ecx
je @f
stdcall DestroyImage, [iconFolder]
mov [iconFolder], ecx
@@:
cmp [iconFile], ecx
je @f
stdcall DestroyImage, [iconFile]
mov [iconFile], ecx
@@:
return
endp
proc CreateIconSet1
begin
stdcall FreeIconSet
stdcall CreateImagePNG, imgFolder1, imgFolder1.size
mov [iconFolder], eax
stdcall CreateImagePNG, imgFile1, imgFile1.size
mov [iconFile], eax
return
endp
proc CreateIconSet2
begin
stdcall FreeIconSet
stdcall CreateImagePNG, imgFolder2, imgFolder2.size
mov [iconFolder], eax
stdcall CreateImagePNG, imgFile2, imgFile2.size
mov [iconFile], eax
return
endp
proc TreeOnCreate as TObject.OnCreate
begin
stdcall LoadExampleTreeContent, [.self]
return
endp
proc FormOnDestroy as TObject.OnDestroy
begin
DebugMsg "MainForm destroy event handler."
return
endp
proc MainFormOnClose as TForm.OnClose
begin
DebugMsg "Main form OnClose event handler"
clc
return
endp
proc LoadTheme1Click as TButton.OnClick
begin
pushad
stdcall LoadBinaryFile, "./theme_win.cfg"
jc .finish
push eax
stdcall StringToNamedArray, GUI.meta, eax
stdcall FreeMem ; from the stack.
stdcall CreateIconSet1
stdcall LoadExampleTreeContent, [tvPreview]
exec [frmMain], TWindow:RefreshAll
.finish:
popad
return
endp
proc LoadTheme2Click as TButton.OnClick
begin
pushad
stdcall LoadBinaryFile, "./theme_flat.cfg"
jc .finish
push eax
stdcall StringToNamedArray, GUI.meta, eax
stdcall FreeMem ; from the stack.
stdcall CreateIconSet2
stdcall LoadExampleTreeContent, [tvPreview]
exec [frmMain], TWindow:RefreshAll
.finish:
popad
return
endp
proc SaveThemeClick as TButton.OnClick
begin
pushad
get ebx, [editTest], TEdit:Text
stdcall NamedArrayToString, GUI.meta
mov edi, eax
stdcall StrPtr, eax
mov esi, eax
stdcall StrPtr, ebx
stdcall SaveBinaryFile, eax, esi, [esi+string.len]
stdcall StrDel, ebx
stdcall StrDel, edi
popad
return
endp
proc LoadThemeClick as TButton.OnClick
begin
pushad
get ebx, [editTest], TEdit:Text
stdcall LoadBinaryFile, ebx
jc .finish
push eax
stdcall StringToNamedArray, GUI.meta, eax
stdcall FreeMem ; from the stack.
exec [frmMain], TWindow:RefreshAll
.finish:
stdcall StrDel, ebx
popad
return
endp
proc LoadExampleTreeContent, .pTreeView
begin
pushad
mov esi, [.pTreeView]
mov edx, [esi+TTreeView._items]
stdcall DeleteArrayItems, edx, 0, [edx+TArray.count]
stdcall ___DoReadDir, txt ".", edx, -1
mov [esi+TTreeView._items], edx
jc .error
.finish:
OutputValue "Files tree items:", [edx+TArray.count], 10, 8
exec [.pTreeView], TTreeView:__RebuildIndex
exec [.pTreeView], TWindow:Refresh
set [frmMain], TWindow:Cursor, edi
popad
return
.error:
stdcall GetErrorString, eax
push eax
stdcall ShowMessage, [frmMain], smiError, "File error", eax, smbOK
stdcall FreeErrorString ; from the stack
jmp .finish
endp
proc ___DoReadDir, .hDir, .pArray, .Level
begin
pushad
mov edx, [.pArray]
mov ebx, [.Level]
inc ebx
stdcall DirectoryRead, [.hDir]
jc .finish
mov esi, eax
xor ecx, ecx
stdcall SortDirArray, esi, fdsByType
.loop:
cmp ecx, [esi+TArray.count]
jae .end_loop
stdcall StrPtr, [esi+TArray.array + 8*ecx + TDirItem.hFilename]
cmp byte [eax], "."
je .next
; Output eax
; DebugMsg ""
stdcall AddArrayItems, edx, 1
push [esi+TArray.array + 8*ecx + TDirItem.hFilename] ; name
pop [eax+TTreeViewItem.caption]
mov [eax+TTreeViewItem.level], ebx
mov [eax+TTreeViewItem.state], tvisExpanded
push edx
mov edx, [iconFolder]
cmp [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
je @f
mov edx, [iconFile]
cmp [esi+TArray.array + 8*ecx + TDirItem.Type], ftFile
je @f
xor edx, edx
@@:
mov [eax+TTreeViewItem.imgNormal], edx
pop edx
cmp [esi+TArray.array + 8*ecx + TDirItem.Type], ftDirectory
jne .next
stdcall StrDup, [.hDir]
push eax
stdcall StrCharCat, eax, "/"
stdcall StrCat, eax, [esi+TArray.array + 8*ecx + TDirItem.hFilename]
stdcall ___DoReadDir, eax, edx, ebx
stdcall StrDel ; from the stack
.next:
inc ecx
jmp .loop
.end_loop:
stdcall FreeMem, esi
clc
xor eax, eax
.finish:
mov [esp+regEAX*4], eax
mov [esp+regEDX*4], edx
popad
return
endp
|
cannot compute difference between binary files
1 2 3 | utf8_string db $49, $C3, $B1, $74, $C3, $AB, $72, $6E, $C3, $A2, $74, $69, $C3, $B4, $6E, $C3, $A0, $6C, $69, $7A, $C3, $A6, $74, $69, $C3, $B8, $6E, $00 ; the word "Internationalization" written with different languages chars ; greek, cyrillic and latin in one text. | | | 1 2 3 4 5 |
utf8_string db $49, $C3, $B1, $74, $C3, $AB, $72, $6E, $C3, $A2, $74, $69, $C3, $B4, $6E, $C3, $A0, $6C, $69, $7A, $C3, $A6, $74, $69, $C3, $B8, $6E, $00 ; the word "Internationalization" written with different languages chars
; greek, cyrillic and latin in one text.
utf8_long file 'UnicodeSample.txt'
dd 0
|
|
| | | | | > > | 1 2 3 4 5 6 7 8 | Russian: Я могу еÑть Ñтекло, оно мне не вредит. Yoruba: Mo lè jeÌ© dÃgÃ, kò nà pa mà lára. Chinese: 我能åžä¸‹çŽ»ç’ƒè€Œä¸ä¼¤èº«ä½“。 Greek: ΜποÏÏŽ να φάω σπασμÎνα γυαλιά χωÏίς να πάθω τίποτα. Québécois: J'peux manger d'la vitre, ça m'fa pas mal. Ukrainian: Я можу Ñ—Ñти Ñкло, Ñ– воно мені не зашкодить. Това е един много дълъг параграф, в който Ñе говори за това, че мога да конÑумирам неорганични Ñиликатни аморфни материали без вреда за здравето или материалното ми положение. |
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="46.259px"
height="46.259px"
viewBox="0 0 46.259 46.259"
style="enable-background:new 0 0 46.259 46.259;"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="document.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/test_code0/_test_images/document.png"
inkscape:export-xdpi="31"
inkscape:export-ydpi="31"><metadata
id="metadata45"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs43" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview41"
showgrid="false"
inkscape:zoom="12.12737"
inkscape:cx="10.059889"
inkscape:cy="23.129499"
inkscape:current-layer="Capa_1" /><g
id="g3"
transform="matrix(0.9,0,0,0.9,2.3129,2.31295)"
style="fill:#9b59b6;fill-opacity:1"><g
id="g5"
style="fill:#9b59b6;fill-opacity:1"><path
d="m 35.043,13.514 c -3.405,0 -6.164,-2.749 -6.164,-6.153 l 0,-6.564 C 28.879,0.357 28.523,0 28.082,0 L 8.278,0 C 5.738,0 3.671,2.06 3.671,4.6 l 0,37.059 c 0,2.54 2.067,4.6 4.607,4.6 l 29.7,0 c 2.541,0 4.609,-2.06 4.609,-4.6 l 0,-27.348 c 0,-0.44 -0.355,-0.797 -0.797,-0.797 l -6.747,0 z"
id="path7"
inkscape:connector-curvature="0"
style="fill:#9b59b6;fill-opacity:1" /><path
d="m 35.043,10.395 5.519,0 c 0.321,0 0.612,-0.194 0.735,-0.493 C 41.42,9.604 41.351,9.261 41.122,9.034 39.106,7.03 35.36,3.31 33.352,1.327 33.123,1.101 32.782,1.035 32.485,1.159 32.19,1.282 31.997,1.572 31.997,1.893 l 0,5.468 c 0.001,1.665 1.38,3.034 3.046,3.034 z"
id="path9"
inkscape:connector-curvature="0"
style="fill:#9b59b6;fill-opacity:1" /></g></g><g
id="g11" /><g
id="g13" /><g
id="g15" /><g
id="g17" /><g
id="g19" /><g
id="g21" /><g
id="g23" /><g
id="g25" /><g
id="g27" /><g
id="g29" /><g
id="g31" /><g
id="g33" /><g
id="g35" /><g
id="g37" /><g
id="g39" /></svg>
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="841.5px"
height="841.5px"
viewBox="0 0 841.5 841.5"
style="enable-background:new 0 0 841.5 841.5;"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="folder.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/test_code0/_test_images/folder.png"
inkscape:export-xdpi="1.7112299"
inkscape:export-ydpi="1.7112299"><metadata
id="metadata45"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs43" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview41"
showgrid="false"
inkscape:zoom="0.66666667"
inkscape:cx="183"
inkscape:cy="420.75"
inkscape:current-layer="Capa_1" /><g
id="g3"
style="fill:#f39c12;fill-opacity:1;fill-rule:nonzero"><g
id="g5"
style="fill:#f39c12;fill-opacity:1;fill-rule:nonzero"><path
d="M460.8,143.4c-12.9-24.8-38.6-40.4-66.5-40.4H50c-27.6,0-50,22.4-50,50v26.8h479.7L460.8,143.4z"
id="path7"
style="fill:#f39c12;fill-opacity:1;fill-rule:nonzero" /><path
d="M791.6,224.8H0v463.7c0,27.601,22.4,50,50,50h741.5c27.6,0,50-22.399,50-50V274.8C841.6,247.2,819.2,224.8,791.6,224.8z"
id="path9"
style="fill:#f39c12;fill-opacity:1;fill-rule:nonzero" /></g></g><g
id="g11" /><g
id="g13" /><g
id="g15" /><g
id="g17" /><g
id="g19" /><g
id="g21" /><g
id="g23" /><g
id="g25" /><g
id="g27" /><g
id="g29" /><g
id="g31" /><g
id="g33" /><g
id="g35" /><g
id="g37" /><g
id="g39" /></svg>
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <?xml version="1.0" encoding="iso-8859-1"?> <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="493.578px" height="493.578px" viewBox="0 0 493.578 493.578" style="enable-background:new 0 0 493.578 493.578;" xml:space="preserve"> <g> <path d="M487.267,225.981c0-17.365-13.999-31.518-31.518-31.518H194.501L305.35,83.615c12.24-12.24,12.24-32.207,0-44.676 L275.592,9.18c-12.24-12.24-32.207-12.24-44.676,0L15.568,224.527c-6.12,6.12-9.256,14.153-9.256,22.262 c0,8.032,3.136,16.142,9.256,22.262l215.348,215.348c12.24,12.239,32.207,12.239,44.676,0l29.758-29.759 c12.24-12.24,12.24-32.207,0-44.676L194.501,299.498h261.094c17.366,0,31.519-14.153,31.519-31.519L487.267,225.981z"/> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> <g> </g> </svg> |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="92.833px"
height="92.833px"
viewBox="0 0 92.833 92.833"
style="enable-background:new 0 0 92.833 92.833;"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="menu.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/test_code0/_test_images/menu.png"
inkscape:export-xdpi="15.511725"
inkscape:export-ydpi="15.511725"><metadata
id="metadata47"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs45" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview43"
showgrid="false"
inkscape:zoom="8.7314773"
inkscape:cx="28.263787"
inkscape:cy="45.62978"
inkscape:current-layer="Capa_1" /><g
id="g3"><g
id="g5"><path
d="M89.834,1.75H3c-1.654,0-3,1.346-3,3v13.334c0,1.654,1.346,3,3,3h86.833c1.653,0,3-1.346,3-3V4.75 C92.834,3.096,91.488,1.75,89.834,1.75z"
id="path7" /><path
d="M89.834,36.75H3c-1.654,0-3,1.346-3,3v13.334c0,1.654,1.346,3,3,3h86.833c1.653,0,3-1.346,3-3V39.75 C92.834,38.096,91.488,36.75,89.834,36.75z"
id="path9" /><path
d="M89.834,71.75H3c-1.654,0-3,1.346-3,3v13.334c0,1.654,1.346,3,3,3h86.833c1.653,0,3-1.346,3-3V74.75 C92.834,73.095,91.488,71.75,89.834,71.75z"
id="path11" /></g></g><g
id="g13" /><g
id="g15" /><g
id="g17" /><g
id="g19" /><g
id="g21" /><g
id="g23" /><g
id="g25" /><g
id="g27" /><g
id="g29" /><g
id="g31" /><g
id="g33" /><g
id="g35" /><g
id="g37" /><g
id="g39" /><g
id="g41" /></svg>
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="493.578px"
height="493.578px"
viewBox="0 0 493.578 493.578"
style="enable-background:new 0 0 493.578 493.578;"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="right.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/test_code0/_test_images/right2.png"
inkscape:export-xdpi="2.9200001"
inkscape:export-ydpi="2.9200001"><metadata
id="metadata41"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs39" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview37"
showgrid="false"
inkscape:zoom="1.6422313"
inkscape:cx="246.789"
inkscape:cy="238.42327"
inkscape:current-layer="Capa_1" /><g
id="g3"
transform="matrix(-1,0,0,1,493.579,0)"
style="fill:#404040;fill-opacity:1"><path
d="m 487.267,225.981 c 0,-17.365 -13.999,-31.518 -31.518,-31.518 l -261.248,0 L 305.35,83.615 c 12.24,-12.24 12.24,-32.207 0,-44.676 L 275.592,9.18 c -12.24,-12.24 -32.207,-12.24 -44.676,0 L 15.568,224.527 c -6.12,6.12 -9.256,14.153 -9.256,22.262 0,8.032 3.136,16.142 9.256,22.262 l 215.348,215.348 c 12.24,12.239 32.207,12.239 44.676,0 L 305.35,454.64 c 12.24,-12.24 12.24,-32.207 0,-44.676 l -110.849,-110.466 261.094,0 c 17.366,0 31.519,-14.153 31.519,-31.519 l 0.153,-41.998 z"
id="path5"
inkscape:connector-curvature="0"
style="fill:#404040;fill-opacity:1" /></g><g
id="g7"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g9"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g11"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g13"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g15"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g17"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g19"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g21"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g23"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g25"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g27"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g29"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g31"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g33"
transform="matrix(-1,0,0,1,493.579,0)" /><g
id="g35"
transform="matrix(-1,0,0,1,493.579,0)" /></svg>
|
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
viewBox="0 0 88 88"
style="enable-background:new 0 0 88 88;"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="star-shape1.svg"
inkscape:export-filename="/work/asmwork/FreshFs/FreshLibGUI/freshlib/test_code0/_test_images/star.png"
inkscape:export-xdpi="122.72727"
inkscape:export-ydpi="122.72727"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview39"
showgrid="false"
inkscape:zoom="6.3068182"
inkscape:cx="43.603604"
inkscape:cy="44"
inkscape:current-layer="Capa_1" /><g
id="g3"
style="fill:#ffffff;fill-opacity:0.25098041"
inkscape:export-xdpi="122.73"
inkscape:export-ydpi="122.73"><g
id="g5"
style="fill:#ffffff;fill-opacity:0.25098041"><polygon
style="fill:#ffffff;fill-opacity:0.25098041"
points="44,0 55.939,33.612 88,33.612 61.842,53.351 71.193,88 44,67.226 16.809,88 26.158,53.351 0,33.612 32.061,33.612 "
id="polygon7" /></g></g><g
id="g9" /><g
id="g11" /><g
id="g13" /><g
id="g15" /><g
id="g17" /><g
id="g19" /><g
id="g21" /><g
id="g23" /><g
id="g25" /><g
id="g27" /><g
id="g29" /><g
id="g31" /><g
id="g33" /><g
id="g35" /><g
id="g37" /></svg>
|
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | clBorderNeutral = $FF1ABC9C clBorderLight = $FF1ABC9C clBorderDark = $FF1ABC9C clBorderNeutralGray = $FF606060 clBorderLightGray = $FF606060 clBorderDarkGray = $FF606060 clBorderFocused = $FFE74C3C boxBorderWidth = 2 clBtnBk = $FF1ABC9C, $FF48C9B0, $FF16A085, $807B7B7B clBtnTxt = $FFFFFFFF, $FFFFFFFF, $FFBDC3C7, $80FFFFFF btnBorder = 0, 0, 0, 0 btnPressedOfsX = 0 btnPressedOfsY = 0 btnMarginX = 8 btnMarginY = 8 clEditBk = $FFECF0F1 clEditBkFocused = $FFECF0F1 clEditTxt = $FF000000 clEditSel = $602980B9 clEditSelTxt = $FFFFFFFF editBorder = 3 editBorderFocused = 3 clDialogBk = $FFECF0F1 clDialogTxt = $FF000000 clSplitter = $FF34495E clProgressBk = $FFECF0F1 clProgressBar = $FF1ABC9C progressBorder = 3 clScrollBk = $3FBDC3C7, $A0BDC3C7 clScrollSlider = $7F7F8C8D, $FF1ABC9C borderScroll = 0 scrollWidth = 12 minSliderHeight = 12 clLabelBk = $0 clLabelTxt = $FF000000 clTreeViewBack = $FFECF0F1 clTreeViewText = $FF000000 clTreeSelected = $FF2980B9 clTreeSelectedTxt = $FFFFFFFF clTreeFocused = $FFD35400 clTreeFocusedTxt = $FFFFFFFF tvBorder = 3 tvIcons = 297:iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAMAAACecocUAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAEJQTFRFAAAAgICAkra2n5+fmaOjkqiolqamlaWllqWllKWnlaWllaSmlqWllaWllqWllaWmlaWmlaWmlaWmlaWmlaWmlaWml3PoaAAAABV0Uk5TAAIHCBkjLkFmbm9zd4Ciu8vM4uj9nlc1ogAAADhJREFUCJlj4OJhZoABXlEhDkY4W1RUkB3BFhXlZ0OwRUX4WOBsUVFhViziCPUC7Jjmc3IzwawFAEAMBLa48vXWAAAAAElFTkSuQmCC, 333:iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADKSURBVBiVhY+7TgJhFIS/+d3QmWDhE/gQhlfgAbb46U00aENMoKCgs5ZIRey49FpbmFhZm9iQ0FFaC2yGQjFcVna6Oec7l1FvMLgATijWV2LrGHFXREo0wmkp6QomBex0WS4/hDRN5xbtQ6Rx66Za/RaAbfWGozegkoO+X8V4Lsnh5x/ZuJm3NUhNSQYI62K9VnsVet5hny5jfPkb3Oxk8i2wXFuL1taVTXMd46fR42+qfj3Gj39hgKNs0QZmibNOXoY93Y/HZ3n1FeLFO3+97VjQAAAAAElFTkSuQmCC clMenuBack = $FFECF0F1 clMenuText = $FF000000 clMenuTextGray = $90000000 borderMenu = 3 menuIconMargin = 4 menuMinTextDist = 32 menuSubIcon = 206:iVBORw0KGgoAAAANSUhEUgAAAAYAAAALCAYAAABcUvyWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABLSURBVBiVjc+xDYBADATBeSQCIgqgYzJaoARSInqgH5MQvQ6JzezVyT7YMAgUdoxJFA5MSRQuzEkUbiztHXrOz8SvG/Gr2GNF65cP8X4dCPkfyx8AAAAASUVORK5CYII- menuSubIconSel = 207:iVBORw0KGgoAAAANSUhEUgAAAAYAAAALCAYAAABcUvyWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABMSURBVBiVjc+xDYAwEEPRCxIFFQOwcTpWyAi0VOzAPi8FXTgk3H5Z3w7smGKMJw1zBuDAkgG4sGYAbmwFXuKI87Pxy5GuSn9UlNHeAYWml41HdWNxAAAAAElFTkSuQmCC menuSubIconGray = 280:iVBORw0KGgoAAAANSUhEUgAAAAYAAAALCAYAAABcUvyWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACVSURBVBiVY5i6dOnEhoYGJgY0wMTAwJgnpqq6YObMmaxoEgwM/xkYY//w8K7tW7WKE0UCCnzZf//ZMXPVKn4GBgYGxqlLl/1HM/4q0x8WdwxLGRgYtP+x/JmPTeIq0x+WRHSJQyysLNaZ8WFPkSU2/2Rl8UgPC/sIdxUjw//FLF8+BxeFhX2HK5u2ZFnX////GdEtAgDKqy21io/rDwAAAABJRU5ErkJggg-- iconMenuChecked = 172:iVBORw0KGgoAAAANSUhEUgAAAAcAAAAQCAYAAADagWXwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAApSURBVBiVY2CgP2B87mPTgEuShYGBoR6XJBM+YwdCkoWBgaERnwJ6AwCTrAMDeKqy3AAAAABJRU5ErkJggg-- iconMenuCheckedGray = 172:iVBORw0KGgoAAAANSUhEUgAAAAcAAAAQCAYAAADagWXwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAApSURBVBiVY2CgP2DMy8trwCXJwsDAUI9LkgmfsQMhycLAwNCITwG9AQBg/wLetiFJMAAAAABJRU5ErkJggg-- clCheckboxBack = $FFE0E0E0, $FFFFFFFF, $FFC0C0C0, $80C0C0C0 clCheckboxTxt = $FF000000 clCheckboxTxtGray = $FF606060 cbIconSize = 13 cbMargin = 2 borderCheckbox = 3 iconChecked = 166:iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAjSURBVCiRY2AYfoARXeC5j81/dDHJLUdQ1DGRY9Mg1zQcAQAaUwQKOrN/dgAAAABJRU5ErkJggg-- iconCheckedGray = 166:iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAjSURBVCiRY2AYfoARXSA/P/8/utjEiRNR1DGRY9Mg1zQcAQAXqwQKOqarXQAAAABJRU5ErkJggg-- DefaultFont = 'Liberation Sans' : 13 : 4 : $0 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | clBorderNeutral = $FFA0A0A0 clBorderLight = $FFFFFFFF clBorderDark = $FF404040 clBorderNeutralGray = $FF909090 clBorderLightGray = $FFE0E0E0 clBorderDarkGray = $FF808080 clBorderFocused = $FFFF8000 boxBorderWidth = 1 clBtnBk = $FFD4D0C8, $FFE0E0E0, $FFA0A0A0, $80D4D0C8 clBtnTxt = $FF000000, $FF000000, $FF000000, $FF606060 btnBorder = 1, 1, 2 btnPressedOfsX = 1 btnPressedOfsY = 1 btnMarginX = 8 btnMarginY = 8 clEditBk = $FFFFFFFF clEditBkFocused = $FFFFFFFF clEditTxt = $FF000000 clEditSel = $600A246C clEditSelTxt = $FFFFFFFF editBorder = 2 editBorderFocused = 2 clDialogBk = $FFD4D0C8 clDialogTxt = $FF000000 clSplitter = $FF606060 clProgressBk = $FFD4D0C8 clProgressBar = $FF0A246C progressBorder = 2 clScrollBk = $3F808080, $A0D4D0C8 clScrollSlider = $7FD4D0C8, $FFD4D0C8 borderScroll = 1 scrollWidth = 16 minSliderHeight = 16 clLabelBk = $FFFFFF clLabelTxt = $FF000000 clTreeViewBack = $FFFFFFFF clTreeViewText = $FF000000 clTreeSelected = $FF0A246C clTreeSelectedTxt = $FFFFFFFF clTreeFocused = $FF0A246C clTreeFocusedTxt = $FFFFFF00 tvBorder = 2 tvIcons = 117:iVBORw0KGgoAAAANSUhEUgAAAAsAAAALAQMAAACTYuVlAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAAB1JREFUCNdjYGBgqD/A4ODA4AJG8TAGUAQozsAAAGXeBi6dny4xAAAAAElFTkSuQmCC, 114:iVBORw0KGgoAAAANSUhEUgAAAAsAAAALAQMAAACTYuVlAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAABpJREFUCNdjYGBgqD/A4OAARfEOCDZQnIEBAGTOBh7FK7i2AAAAAElFTkSuQmCC clMenuBack = $FFD4D0C8 clMenuText = $FF000000 clMenuTextGray = $80000000 borderMenu = 1 menuIconMargin = 4 menuMinTextDist = 32 menuSubIcon = 206:iVBORw0KGgoAAAANSUhEUgAAAAYAAAALCAYAAABcUvyWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABLSURBVBiVjc+xDYBADATBeSQCIgqgYzJaoARSInqgH5MQvQ6JzezVyT7YMAgUdoxJFA5MSRQuzEkUbiztHXrOz8SvG/Gr2GNF65cP8X4dCPkfyx8AAAAASUVORK5CYII- menuSubIconSel = 207:iVBORw0KGgoAAAANSUhEUgAAAAYAAAALCAYAAABcUvyWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABMSURBVBiVjc+xDYAwEEPRCxIFFQOwcTpWyAi0VOzAPi8FXTgk3H5Z3w7smGKMJw1zBuDAkgG4sGYAbmwFXuKI87Pxy5GuSn9UlNHeAYWml41HdWNxAAAAAElFTkSuQmCC menuSubIconGray = 280:iVBORw0KGgoAAAANSUhEUgAAAAYAAAALCAYAAABcUvyWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACVSURBVBiVY5i6dOnEhoYGJgY0wMTAwJgnpqq6YObMmaxoEgwM/xkYY//w8K7tW7WKE0UCCnzZf//ZMXPVKn4GBgYGxqlLl/1HM/4q0x8WdwxLGRgYtP+x/JmPTeIq0x+WRHSJQyysLNaZ8WFPkSU2/2Rl8UgPC/sIdxUjw//FLF8+BxeFhX2HK5u2ZFnX////GdEtAgDKqy21io/rDwAAAABJRU5ErkJggg-- iconMenuChecked = 246:iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQCAYAAAArij59AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABzSURBVCiRzc6xDUEBFIXhjxhAp6UUjSEkbwSjmIDEBFaxgNIYKEWhlKO5LxJ5r+aU9z85/+X3GfSjLDDug1NyJ5cuOCInErJBDmRHSpd9wSMZIuc6bElDXuRGJu3kjFyr9KzC6tu7JI/PUvfnc7Iu71/lDbA1NqOlVrCQAAAAAElFTkSuQmCC iconMenuCheckedGray = 299:iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQCAYAAAArij59AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACoSURBVCiRxY4hjgJBFAXrd2YMiiOsJTgEAvF7xqJJUGQvsQoPIcFhOAEWT7KTTPoCHAEJa1es7LcKNYOmbL3kFbwfeyXquh4Dw95BVVUfkq7AX+iRhaQTMJR0CO5+jDFun3eSNsBM0iWltC/MbApMYowKIaSc8xfwKMvyE8hB0gK4A+uc8xnAzFZN0/wAhJTSzczmwC8wAHZt2353yt195O5LoBP+bv4BnNI5/xB5g9MAAAAASUVORK5CYII- clCheckboxBack = $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFC0C0C0 clCheckboxTxt = $FF000000 clCheckboxTxtGray = $FF808080 cbIconSize = 13 cbMargin = 2 borderCheckbox = 2 iconChecked = 282:iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACXSURBVCiRzc89DgFhEIDhVy/Z0gEUolFIuIBCotNKFC6goHQdV9BxD41Cp1gVBRF5NRPZbMh+jcR08/NMZuDPwgm4A1upoAveQMF5CqiD+wAHMCs2M3AFdkpoHeAO9ssbF9E8g+2ozaImuPx0RhPMY+AIDsFr5Buw9u3+HngpbBc8gY2qx0fgI8ATHFSANxyDW3CaCH4YL0VGUkYKfrkaAAAAAElFTkSuQmCC iconCheckedGray = 404:iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAERSURBVCiRvdAhS0NhFIfx57zvhYUJBs0uGMTqB9h2LwMR7KJLbmAQP4FN8EOYBItNEAQx7N67G9UmliHKxbYomOS955iUaZgW/bcD51ce+K/Jb57iON5S1b5zbjfP81H0E0iSZEVVj0WkBqwCIzcNtNvtGVU9BWpm9uS9PwGIADqdzmwIYc97f5Gm6d2EOwKWzOzNe785GAxeABxAVVV94DCEkDebzWWAVqu1DXQBRGQ/y7KbLyGSJFlU1WtgzsyenXM7ZnYG1M3ssiiKdcA+kAPIsuzRzNaAVxFZMLMroA6MoyjqTYJPBFAUxa2IbAABwMxURLppmo6/B/KTR1mWD41G415E5oGD4XB4Pq3u3+8d34hqDI8BY9gAAAAASUVORK5CYII- DefaultFont = 'Liberation Sans' : 13 : 2 : $0 |