Subversion Repositories Kolibri OS

Rev

Rev 1922 | Rev 2389 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1004 diamond 1
use32
2
org 0x0
3
 
4
db 'MENUET01'
1470 mario79 5
dd 0x01, START, I_END, F_END, stacktop, @PARAMS, 0x0
1004 diamond 6
 
7
;-----------------------------------------------------------------------------
8
 
9
FALSE = 0
10
TRUE  = 1
1701 lrz 11
include '../../../config.inc'		;for nightbuild
1080 diamond 12
include '../../../proc32.inc'
13
include '../../../macros.inc'
1004 diamond 14
include 'dll.inc'
15
 
16
include '../../../develop/libraries/libs-dev/libio/libio.inc'
17
include '../../../develop/libraries/libs-dev/libimg/libimg.inc'
18
 
1511 mario79 19
;include '../../../develop/libraries/box_lib/asm/trunk/opendial.mac'
20
;use_OpenDialog
1004 diamond 21
;-----------------------------------------------------------------------------
22
 
23
START:
1570 dunkaist 24
    mcall   68, 11
1004 diamond 25
 
1570 dunkaist 26
    stdcall dll.Load, @IMPORT
27
    or  eax, eax
28
    jnz exit
1004 diamond 29
 
1570 dunkaist 30
    invoke  sort.START, 1
1016 diamond 31
 
1570 dunkaist 32
    mov ecx, 1  ; for 15.4: 1 = tile
33
    cmp word [@PARAMS], '\T'
34
    jz  set_bgr
35
    inc ecx ; for 15.4: 2 = stretch
36
    cmp word [@PARAMS], '\S'
37
    jz  set_bgr
1004 diamond 38
 
1594 mario79 39
    cmp byte [@PARAMS], 0
40
    jz @f
41
    mov esi, @PARAMS
42
    mov edi, path
43
    mov ecx, 4096/4
44
    rep movsd
45
    mov byte [edi-1], 0
46
@@:
47
; OpenDialog initialisation
48
    push    dword OpenDialog_data
49
    call    [OpenDialog_Init]
50
 
1427 diamond 51
; initialize keyboard handling
1570 dunkaist 52
    invoke  ini_get_shortcut, inifilename, aShortcuts, aNext, -1, next_mod
53
    mov [next_key], eax
54
    invoke  ini_get_shortcut, inifilename, aShortcuts, aPrev, -1, prev_mod
55
    mov [prev_key], eax
56
    mcall   66, 1, 1    ; set kbd mode to scancodes
1427 diamond 57
 
1570 dunkaist 58
    cmp byte [@PARAMS], 0
59
    jnz params_given
1004 diamond 60
 
1570 dunkaist 61
    mov [OpenDialog_data.draw_window],draw_window_fake
62
 
1511 mario79 63
; OpenDialog Open
1570 dunkaist 64
    push    dword OpenDialog_data
65
    call    [OpenDialog_Start]
1470 mario79 66
 
1570 dunkaist 67
    cmp [OpenDialog_data.status],1
68
    jne exit
1470 mario79 69
 
1570 dunkaist 70
    mov [OpenDialog_data.draw_window],draw_window
1470 mario79 71
 
1570 dunkaist 72
    mov esi, path
73
    mov edi, @PARAMS
74
    mov ecx, 4096/4
75
    rep movsd
76
    mov byte [edi-1], 0
77
    jmp params_given
1004 diamond 78
 
79
set_bgr:
1570 dunkaist 80
    mcall   15, 4
81
    mov eax, @PARAMS + 4
82
    call    load_image
83
    jc  exit
1004 diamond 84
 
1570 dunkaist 85
    call    set_as_bgr
86
    jmp exit
1004 diamond 87
 
88
params_given:
89
 
1570 dunkaist 90
    mov esi, @PARAMS
91
    push    esi
92
    call    find_last_name_component
1427 diamond 93
 
1570 dunkaist 94
    pop eax
95
    call    load_image
96
    jc  exit
97
    call    generate_header
1004 diamond 98
 
99
;-----------------------------------------------------------------------------
100
 
101
red:
1570 dunkaist 102
    call    draw_window
1004 diamond 103
 
104
still:
1570 dunkaist 105
    mov eax, [image]
106
    test    byte [eax + Image.Flags], Image.IsAnimated
107
    push    10
108
    pop eax
109
    jz  @f
110
    mcall   26, 9
111
    mov edx, [cur_frame]
112
    mov ebx, [cur_frame_time]
113
    add ebx, [edx + Image.Delay]
114
    sub ebx, eax
115
    cmp ebx, [edx + Image.Delay]
116
    ja  red_update_frame
117
    test    ebx, ebx
118
    jz  red_update_frame
119
    push    23
120
    pop eax
1080 diamond 121
  @@:
1570 dunkaist 122
    mcall
123
    dec eax
124
    js  red_update_frame
125
    jz  red
126
    dec eax
127
    jnz button
1004 diamond 128
 
1080 diamond 129
key:
1570 dunkaist 130
    xor esi, esi
1427 diamond 131
keyloop:
1570 dunkaist 132
    mcall   2
133
    test    al, al
134
    jnz keyloopdone
135
    shr eax, 8
136
    mov ecx, eax
137
    mcall   66, 3
138
    mov edx, next_mod
139
    call    check_shortcut
140
    jz  .next
141
    add edx, prev_mod - next_mod
142
    call    check_shortcut
143
    jnz keyloop
1427 diamond 144
.prev:
1570 dunkaist 145
    dec esi
146
    jmp keyloop
1427 diamond 147
.next:
1570 dunkaist 148
    inc esi
149
    jmp keyloop
1427 diamond 150
keyloopdone:
1570 dunkaist 151
    test    esi, esi
152
    jz  still
1427 diamond 153
next_or_prev_handler:
1570 dunkaist 154
    call    next_or_prev_image
155
    jmp red
1004 diamond 156
 
1080 diamond 157
red_update_frame:
1570 dunkaist 158
    mov eax, [cur_frame]
159
    mov eax, [eax + Image.Next]
160
    test    eax, eax
161
    jnz @f
162
    mov eax, [image]
1080 diamond 163
  @@:
1570 dunkaist 164
    mov [cur_frame], eax
165
    mcall   26, 9
166
    mov [cur_frame_time], eax
167
    mcall   9, procinfo, -1
168
    call    draw_cur_frame
169
    jmp still
1080 diamond 170
 
171
button:
1570 dunkaist 172
    mcall   17
173
    shr eax, 8
1004 diamond 174
 
1570 dunkaist 175
    ; flip horizontally
176
    cmp eax, 'flh'
177
    jne @f
1004 diamond 178
 
1570 dunkaist 179
    invoke  img.flip, [image], FLIP_HORIZONTAL
180
    jmp redraw_image
1004 diamond 181
 
1570 dunkaist 182
    ; flip vertically
183
    @@: cmp eax, 'flv'
184
    jne @f
1004 diamond 185
 
1570 dunkaist 186
    invoke  img.flip, [image], FLIP_VERTICAL
187
    jmp redraw_image
1004 diamond 188
 
1570 dunkaist 189
    ; flip both horizontally and vertically
190
    @@: cmp eax, 'flb'
191
    jne @f
1004 diamond 192
 
1570 dunkaist 193
    invoke  img.flip, [image], FLIP_BOTH
194
    jmp redraw_image
1004 diamond 195
 
1570 dunkaist 196
    ; rotate left
197
    @@: cmp eax, 'rtl'
198
    jne @f
1004 diamond 199
 
1570 dunkaist 200
    push    ROTATE_90_CCW
1004 diamond 201
.rotate_common:
1570 dunkaist 202
    invoke  img.rotate, [image]
203
    mov eax, [image]
204
    test    eax, eax    ; clear ZF flag
205
    call    update_image_sizes
206
    jmp redraw_image
1004 diamond 207
 
1570 dunkaist 208
    ; rotate right
209
    @@: cmp eax, 'rtr'
210
    jne @f
1004 diamond 211
 
1570 dunkaist 212
    push    ROTATE_90_CW
213
    jmp .rotate_common
1004 diamond 214
 
1570 dunkaist 215
    ; open new file
216
    @@: cmp eax, 'opn'
217
    jne @f
218
 
1511 mario79 219
; OpenDialog Open
1570 dunkaist 220
    push    dword OpenDialog_data
221
    call    [OpenDialog_Start]
222
 
223
    cmp [OpenDialog_data.status],1
224
    jne still
225
 
226
    mov esi, path
227
    mov edi, @PARAMS
228
    push    edi
229
    mov ecx, 4096/4
230
    rep movsd
231
    mov byte [edi-1], 0
232
 
233
    pop esi
234
    push    esi
235
    call    find_last_name_component
1475 diamond 236
 
1570 dunkaist 237
    pop eax
238
    push    [image]
239
    call    load_image
240
    jc  .restore_old
241
    call    generate_header
242
 
243
    invoke  img.destroy
244
    call    free_directory
245
    jmp red
246
 
1004 diamond 247
    .restore_old:
1570 dunkaist 248
    pop [image]
249
    call    init_frame
250
    jmp still
1004 diamond 251
 
1570 dunkaist 252
    ; set background
1016 diamond 253
    @@:
1570 dunkaist 254
    cmp eax, 'bgr'
255
    jne @f
1016 diamond 256
 
1570 dunkaist 257
    call    set_as_bgr
258
    jmp still
1016 diamond 259
 
260
    @@:
261
 
1570 dunkaist 262
    or  esi, -1
263
    cmp eax, 'bck'
264
    jz  next_or_prev_handler
265
    neg esi
266
    cmp eax, 'fwd'
267
    jz  next_or_prev_handler
1016 diamond 268
 
1570 dunkaist 269
    cmp eax, 1
270
    jne still
1004 diamond 271
 
272
  exit:
1570 dunkaist 273
    mcall   -1
1004 diamond 274
 
275
  redraw_image = red
276
 
277
load_image:
1570 dunkaist 278
    and [img_data], 0
279
    push    eax
280
    invoke  file.open, eax, O_READ
281
    or  eax, eax
282
    jz  .error_pop
283
    mov [fh], eax
284
    invoke  file.size
285
    mov [img_data_len], ebx
286
    stdcall mem.Alloc, ebx
287
    test    eax, eax
288
    jz  .error_close
289
    mov [img_data], eax
290
    invoke  file.read, [fh], eax, [img_data_len]
291
    cmp eax, -1
292
    jz  .error_close
293
    cmp eax, [img_data_len]
294
    jnz .error_close
295
    invoke  file.close, [fh]
296
    inc eax
297
    jz  .error
1004 diamond 298
 
299
; img.decode checks for img.is_img
1570 dunkaist 300
;   invoke  img.is_img, [img_data], [img_data_len]
301
;   or  eax, eax
302
;   jz  exit
303
    invoke  img.decode, [img_data], [img_data_len], 0
304
    or  eax, eax
305
    jz  .error
306
    cmp [image], 0
307
    pushf
308
    mov [image], eax
309
    call    init_frame
310
    popf
311
    call    update_image_sizes
312
    call    free_img_data
313
    clc
314
    ret
1004 diamond 315
 
316
.error_free:
1570 dunkaist 317
    invoke  img.destroy, [image]
318
    jmp .error
1004 diamond 319
 
320
.error_pop:
1570 dunkaist 321
    pop eax
322
    jmp .error
1004 diamond 323
.error_close:
1570 dunkaist 324
    invoke  file.close, [fh]
1004 diamond 325
.error:
1570 dunkaist 326
    call    free_img_data
327
    stc
328
    ret
1004 diamond 329
 
330
free_img_data:
1570 dunkaist 331
    mov eax, [img_data]
332
    test    eax, eax
333
    jz  @f
334
    stdcall mem.Free, eax
1004 diamond 335
@@:
1570 dunkaist 336
    ret
1004 diamond 337
 
338
update_image_sizes:
1570 dunkaist 339
    pushf
340
    mov edx, [eax + Image.Width]
2036 dunkaist 341
    test    [eax + Image.Flags], Image.IsAnimated
342
    jnz .not_in_row
343
    push eax
344
@@: cmp [eax + Image.Next], 0
345
    jz  @f
346
    mov eax, [eax + Image.Next]
347
    add edx, [eax + Image.Width]
348
    inc edx
349
    jmp @b
350
@@: pop eax
351
.not_in_row:
1570 dunkaist 352
    mov [draw_width], edx
353
    add edx, 19
354
    cmp edx, 40 + 25*9
355
    jae @f
356
    mov edx, 40 + 25*9
1004 diamond 357
@@:
1570 dunkaist 358
    mov [wnd_width], edx
359
    mov esi, [eax + Image.Height]
2036 dunkaist 360
    test    [eax + Image.Flags], Image.IsAnimated
361
    jnz .max_equals_first
362
    push eax
363
@@: cmp [eax + Image.Next], 0
364
    jz  @f
365
    mov eax, [eax + Image.Next]
366
    cmp esi, [eax + Image.Height]
367
    jae @b
368
    mov esi, [eax + Image.Height]
369
    jmp @b
370
@@: pop eax
371
.max_equals_first:
1570 dunkaist 372
    mov [draw_height], esi
373
    add esi, 44
374
    mov [wnd_height], esi
375
    popf
376
    jz  .no_resize
377
    mcall   48, 4
378
    add esi, eax
379
    mcall   67,-1,-1
1004 diamond 380
.no_resize:
1570 dunkaist 381
    ret
1004 diamond 382
 
1016 diamond 383
set_as_bgr:
1570 dunkaist 384
    mov esi, [image]
385
    mov ecx, [esi + Image.Width]
386
    mov edx, [esi + Image.Height]
387
    mcall   15, 1
1016 diamond 388
 
1570 dunkaist 389
    mcall   15, 6
390
    test    eax, eax
391
    jz  @f
1016 diamond 392
 
1570 dunkaist 393
    push    eax
394
    invoke  img.to_rgb2, esi, eax
395
    pop ecx
396
    mcall   15, 7
1016 diamond 397
 
398
@@:
1570 dunkaist 399
    mcall   15, 3
400
    ret
1016 diamond 401
 
1427 diamond 402
; seek to ESI image files
403
; esi>0 means next file, esi<0 - prev file
404
next_or_prev_image:
1570 dunkaist 405
    push    esi
406
    call    load_directory
407
    pop esi
408
    mov ebx, [directory_ptr]
409
    test    ebx, ebx
410
    jz  .ret
411
    cmp dword[ebx+4], 0
412
    jz  .ret
413
    mov eax, [cur_file_idx]
414
    cmp eax, -1
415
    jnz @f
416
    test    esi, esi
417
    jns @f
418
    mov eax, [ebx+4]
1016 diamond 419
@@:
1570 dunkaist 420
    push    [image]
421
    add eax, esi
1427 diamond 422
@@:
1570 dunkaist 423
    test    eax, eax
424
    jns @f
425
    add eax, [ebx+4]
426
    jmp @b
1016 diamond 427
@@:
1570 dunkaist 428
    cmp eax, [ebx+4]
429
    jb  @f
430
    sub eax, [ebx+4]
431
    jmp @b
1427 diamond 432
@@:
1570 dunkaist 433
    push    eax
1427 diamond 434
.scanloop:
1570 dunkaist 435
    push    eax ebx esi
436
    imul    esi, eax, 304
437
    add esi, [directory_ptr]
438
    add esi, 32 + 40
439
    mov edi, curdir
1016 diamond 440
@@:
1570 dunkaist 441
    inc edi
442
    cmp byte [edi-1], 0
443
    jnz @b
444
    mov byte [edi-1], '/'
1016 diamond 445
@@:
1570 dunkaist 446
    lodsb
447
    stosb
448
    test    al, al
449
    jnz @b
450
    mov eax, curdir
451
    call    load_image
452
    pushf
453
    mov esi, curdir
454
    push    esi
455
    mov edi, @PARAMS
456
    mov ecx, 4096/4
457
    rep movsd
458
    mov byte [edi-1], 0
459
    pop esi
1040 diamond 460
@@:
1570 dunkaist 461
    lodsb
462
    test    al, al
463
    jnz @b
1040 diamond 464
@@:
1570 dunkaist 465
    dec esi
466
    cmp byte [esi], '/'
467
    jnz @b
468
    mov byte [esi], 0
469
    popf
470
    pop esi ebx eax
471
    jnc .loadedok
472
    test    esi, esi
473
    js  .try_prev
1427 diamond 474
.try_next:
1570 dunkaist 475
    inc eax
476
    cmp eax, [ebx+4]
477
    jb  @f
478
    xor eax, eax
1016 diamond 479
@@:
1427 diamond 480
.try_common:
1570 dunkaist 481
    cmp eax, [esp]
482
    jz  .notfound
483
    jmp .scanloop
1427 diamond 484
.try_prev:
1570 dunkaist 485
    dec eax
486
    jns @f
487
    mov eax, [ebx+4]
488
    dec eax
1016 diamond 489
@@:
1570 dunkaist 490
    jmp .try_common
1427 diamond 491
.loadedok:
1570 dunkaist 492
    mov [cur_file_idx], eax
493
    pop eax
494
    invoke  img.destroy
495
    call    generate_header
1016 diamond 496
.ret:
1570 dunkaist 497
    ret
1016 diamond 498
.notfound:
1570 dunkaist 499
    pop eax
500
    pop [image]
501
    call    init_frame
502
    ret
1016 diamond 503
 
504
load_directory:
1570 dunkaist 505
    cmp [directory_ptr], 0
506
    jnz .ret
507
    mov esi, @PARAMS
508
    mov edi, curdir
509
    mov ecx, [last_name_component]
510
    sub ecx, esi
511
    dec ecx
512
    js  @f
513
    rep movsb
1427 diamond 514
@@:
1570 dunkaist 515
    mov byte [edi], 0
516
    mcall   68, 12, 0x1000
517
    test    eax, eax
518
    jz  .ret
519
    mov ebx, readdir_fileinfo
520
    mov dword [ebx+12], (0x1000 - 32) / 304
521
    mov dword [ebx+16], eax
522
    mcall   70
523
    cmp eax, 6
524
    jz  .dirok
525
    test    eax, eax
526
    jnz free_directory
527
    mov edx, [directory_ptr]
528
    mov ecx, [edx+8]
529
    mov [readblocks], ecx
530
    imul    ecx, 304
531
    add ecx, 32
532
    mcall   68, 20
533
    test    eax, eax
534
    jz  free_directory
535
    mov [directory_ptr], eax
536
    mcall   70, readdir_fileinfo
1016 diamond 537
.dirok:
1570 dunkaist 538
    cmp ebx, 0
539
    jle free_directory
540
    mov eax, [directory_ptr]
541
    add eax, 32
542
    mov edi, eax
543
    push    0
1016 diamond 544
.dirskip:
1570 dunkaist 545
    push    eax
546
    test    byte [eax], 18h
547
    jnz .nocopy
548
    lea esi, [eax+40]
549
    mov ecx, esi
1016 diamond 550
@@:
1570 dunkaist 551
    lodsb
552
    test    al, al
553
    jnz @b
1016 diamond 554
@@:
1570 dunkaist 555
    dec esi
556
    cmp esi, ecx
557
    jb  .noext
558
    cmp byte [esi], '.'
559
    jnz @b
560
    inc esi
561
    mov ecx, [esi]
562
    or  ecx, 0x202020
563
    cmp ecx, 'jpg'
564
    jz  .copy
565
    cmp ecx, 'bmp'
566
    jz  .copy
567
    cmp ecx, 'gif'
568
    jz  .copy
569
    cmp ecx, 'png'
570
    jz  .copy
571
    cmp ecx, 'jpe'
572
    jz  .copy
573
    cmp ecx, 'ico'
574
    jz  .copy
575
    cmp ecx, 'cur'
576
    jz  .copy
1575 dunkaist 577
; dunkaist [
578
    cmp ecx, 'pcx'
579
    jz  .copy
1922 dunkaist 580
    cmp ecx, 'xcf'
581
    jz  .copy
1575 dunkaist 582
; dunkaist ]
1570 dunkaist 583
    cmp ecx, 'jpeg'
584
    jz  @f
585
    cmp ecx, 'jpeG'
586
    jnz .nocopy
1016 diamond 587
@@:
1570 dunkaist 588
    cmp byte [esi+4], 0
589
    jnz .nocopy
1016 diamond 590
.copy:
1570 dunkaist 591
    mov esi, [esp]
592
    mov ecx, 304 / 4
593
    rep movsd
594
    inc dword [esp+4]
1016 diamond 595
.nocopy:
596
.noext:
1570 dunkaist 597
    pop eax
598
    add eax, 304
599
    dec ebx
600
    jnz .dirskip
601
    mov eax, [directory_ptr]
602
    pop ebx
603
    mov [eax+4], ebx
604
    test    ebx, ebx
605
    jz  free_directory
606
    push    0   ; sort mode
607
    push    ebx
608
    add eax, 32
609
    push    eax
610
    call    [SortDir]
611
    xor eax, eax
612
    mov edi, [directory_ptr]
613
    add edi, 32 + 40
1016 diamond 614
.scan:
1570 dunkaist 615
    mov esi, [last_name_component]
616
    push    edi
617
    invoke  strcmpi
618
    pop edi
619
    jz  .found
620
    inc eax
621
    add edi, 304
622
    dec ebx
623
    jnz .scan
624
    or  eax, -1
1016 diamond 625
.found:
1570 dunkaist 626
    mov [cur_file_idx], eax
1016 diamond 627
.ret:
1570 dunkaist 628
    ret
1016 diamond 629
 
630
free_directory:
1570 dunkaist 631
    mcall   68, 13, [directory_ptr]
632
    and [directory_ptr], 0
633
    ret
1016 diamond 634
 
1427 diamond 635
; in: esi->full name (e.g. /path/to/file.png)
636
; out: [last_name_component]->last component (e.g. file.png)
637
find_last_name_component:
1570 dunkaist 638
    mov ecx, esi
1427 diamond 639
@@:
1570 dunkaist 640
    lodsb
641
    test    al, al
642
    jnz @b
1427 diamond 643
@@:
1570 dunkaist 644
    dec esi
645
    cmp esi, ecx
646
    jb  @f
647
    cmp byte [esi], '/'
648
    jnz @b
1427 diamond 649
@@:
1570 dunkaist 650
    inc esi
651
    mov [last_name_component], esi
652
    ret
1427 diamond 653
 
1080 diamond 654
init_frame:
1570 dunkaist 655
    push    eax
656
    mov eax, [image]
657
    mov [cur_frame], eax
658
    test    byte [eax + Image.Flags], Image.IsAnimated
659
    jz  @f
660
    push    ebx
661
    mcall   26, 9
662
    pop ebx
663
    mov [cur_frame_time], eax
1080 diamond 664
@@:
1570 dunkaist 665
    pop eax
666
    ret
1080 diamond 667
 
1004 diamond 668
draw_window:
1570 dunkaist 669
    cmp [bFirstDraw], 0
670
    jz  .posok
671
    or  ecx, -1
672
    mcall   9, procinfo
1040 diamond 673
 
1570 dunkaist 674
    cmp dword [ebx + 66], 0
675
    jle .posok
1040 diamond 676
 
1570 dunkaist 677
    mov edx, ecx
678
    mov esi, ecx
679
    cmp dword [ebx + 42], 40 + 25 * 9
680
    jae @f
681
    mov edx, 40 + 25 * 9
1040 diamond 682
@@:
1570 dunkaist 683
    cmp dword [ebx + 46], 70
684
    jae @f
685
    mov esi, 70
1040 diamond 686
@@:
1570 dunkaist 687
    mov eax, edx
688
    and eax, esi
689
    cmp eax, -1
690
    jz  @f
691
    mov ebx, ecx
692
    mcall   67
1040 diamond 693
@@:
694
 
695
.posok:
1570 dunkaist 696
    mcall   12, 1
697
    mcall   48, 4
698
    mov ebp, eax    ; save skin height
699
    add eax, [wnd_height]
700
    __mov   ebx, 100, 0
701
    add ebx, [wnd_width]
702
    lea ecx, [100*65536 + eax]
703
    mcall   0, , , 0x73FFFFFF, 0, real_header
1004 diamond 704
 
1570 dunkaist 705
    mcall   9, procinfo, -1
706
    mov [bFirstDraw], 1
707
    cmp dword [ebx + 66], 0
708
    jle .nodraw
709
    mov ebx, [ebx + 62]
710
    inc ebx
711
    mcall   13, , <0, 35>, 0xFFFFFF
712
    mov ecx, [procinfo + 66]
713
    inc ecx
2036 dunkaist 714
;    mov esi, [draw_height]          ; we can not use [draw_height] here because for *.ico files containing several frames
715
    mov esi, [image]                 ; with different size window height should depend on maximum frame height, not the first one
716
    mov esi, [esi+Image.Height]      ;
1570 dunkaist 717
    add esi, 35
718
    sub ecx, esi
719
    jbe @f
720
    push    esi
721
    shl esi, 16
722
    add ecx, esi
723
    pop esi
724
    mcall
725
    xor ecx, ecx
1040 diamond 726
@@:
1570 dunkaist 727
    add ecx, esi
728
    add ecx, 35*10000h - 35
729
    __mov   ebx, 0, 5
730
    mcall
2036 dunkaist 731
;    mov esi, [draw_width]           ; we can not use [draw_width] here because for *.ico files containing several frames
732
    mov esi, [image]                 ; with different size window width should depend on the sum of width of all frames
733
    mov esi, [esi + Image.Width]     ;
1570 dunkaist 734
    add esi, ebx
735
    mov ebx, [procinfo+62]
736
    inc ebx
737
    sub ebx, esi
738
    jbe @f
739
    shl esi, 16
740
    add ebx, esi
741
    mcall
1040 diamond 742
@@:
1004 diamond 743
 
1570 dunkaist 744
    mov ebx, [procinfo + 62]
745
    push    ebx
746
    mcall   38, , <30, 30>, 0x007F7F7F
747
    mcall   , <5 + 25 * 1, 5 + 25 * 1>, <0, 30>
748
    mcall   , <10 + 25 * 3, 10 + 25 * 3>
749
    mcall   , <15 + 25 * 4, 15 + 25 * 4>
750
    pop ebx
751
    sub ebx, 25 * 5 + 10
752
    push    ebx
753
    imul    ebx, 10001h
754
    mcall
1004 diamond 755
 
1570 dunkaist 756
    mcall   8, <5 + 25 * 0, 20>, <5, 20>, 'opn'+40000000h
757
    mcall   , <10 + 25 * 1, 20>, , 'bck'+40000000h
758
    mcall   , <10 + 25 * 2, 20>, , 'fwd'+40000000h
759
    mcall   , <15 + 25 * 3, 20>, , 'bgr'+40000000h
760
    pop ebx
761
    add ebx, 5
762
    shl ebx, 16
763
    mov bl, 20
764
    mcall   , , , 'flh'+40000000h
765
    add ebx, 25 * 65536
766
    mcall   , , , 'flv'+40000000h
767
    add ebx, 30 * 65536
768
    mcall   , , , 'rtr'+40000000h
769
    add ebx, 25 * 65536
770
    mcall   , , , 'rtl'+40000000h
771
    add ebx, 25 * 65536
772
    mcall   , , , 'flb'+40000000h
1004 diamond 773
 
1570 dunkaist 774
    mov ebp, (numimages-1)*20
1004 diamond 775
 
1570 dunkaist 776
    mcall   65, buttons+openbtn*20, <20, 20>, <5 + 25 * 0, 5>, 8, palette
777
    mcall   , buttons+backbtn*20, , <10 + 25 * 1, 5>
778
    mcall   , buttons+forwardbtn*20, , <10 + 25 * 2, 5>
779
    mcall   , buttons+bgrbtn*20, , <15 + 25 * 3, 5>
780
    mov edx, [procinfo + 62]
781
    sub edx, 25 * 5 + 4
782
    shl edx, 16
783
    mov dl, 5
784
    mcall   , buttons+fliphorzbtn*20
785
    add edx, 25 * 65536
786
    mcall   , buttons+flipvertbtn*20
787
    add edx, 30 * 65536
788
    mcall   , buttons+rotcwbtn*20
789
    add edx, 25 * 65536
790
    mcall   , buttons+rotccwbtn*20
791
    add edx, 25 * 65536
792
    mcall   , buttons+rot180btn*20
1004 diamond 793
 
1570 dunkaist 794
    call    draw_cur_frame
1004 diamond 795
 
1087 diamond 796
.nodraw:
1570 dunkaist 797
    mcall   12, 2
1040 diamond 798
 
1570 dunkaist 799
    ret
1004 diamond 800
 
1080 diamond 801
draw_cur_frame:
1570 dunkaist 802
    push    0   ; ypos
803
    push    0   ; xpos
804
    mov eax, [procinfo+66]
805
    sub eax, 34
806
    push    eax ; max height
807
    mov eax, [procinfo+62]
808
    sub eax, 4
809
    push    eax ; max width
810
    push    35  ; y
811
    push    5   ; x
812
    push    [cur_frame]
813
    call    [img.draw]
814
    mov eax, [image]
815
    test    [eax + Image.Flags], Image.IsAnimated
816
    jnz .done
817
    cmp [eax + Image.Next], 0
818
    jnz .additional_frames
1102 diamond 819
.done:
1570 dunkaist 820
    ret
1102 diamond 821
.additional_frames:
1570 dunkaist 822
    mov ebx, [procinfo+62]
823
    sub ebx, 4
824
    jbe .done
825
    push    5
826
    pop esi
1102 diamond 827
.afloop:
1570 dunkaist 828
    sub ebx, [eax + Image.Width]
829
    jbe .done
830
    dec ebx
831
    jz  .done
832
    add esi, [eax + Image.Width]
833
    mov eax, [eax + Image.Next]
834
    push    eax
835
    inc esi
836
    push    0   ; ypos
837
    push    0   ; xpos
838
    mov ecx, [procinfo+66]
839
    sub ecx, 34
840
    push    ecx ; max height
841
    push    ebx ; max width
842
    push    35  ; y
843
    push    esi ; x
844
    push    eax ; image
845
    call    [img.draw]
846
    pop eax
847
    cmp [eax + Image.Next], 0
848
    jnz .afloop
849
    ret
1080 diamond 850
 
1004 diamond 851
; void* __stdcall mem.Alloc(unsigned size);
852
mem.Alloc:
1570 dunkaist 853
    push    ebx ecx
854
    mov ecx, [esp+12]
855
    mcall   68, 12
856
    pop ecx ebx
857
    ret 4
1004 diamond 858
 
859
; void* __stdcall mem.ReAlloc(void* mptr, unsigned size);
860
mem.ReAlloc:
1570 dunkaist 861
    push    ebx ecx edx
862
    mov edx, [esp+16]
863
    mov ecx, [esp+20]
864
    mcall   68, 20
865
    pop edx ecx ebx
866
    ret 8
1004 diamond 867
 
868
; void __stdcall mem.Free(void* mptr);
869
mem.Free:
1570 dunkaist 870
    push    ebx ecx
871
    mov ecx, [esp+12]
872
    mcall   68, 13
873
    pop ecx ebx
874
    ret 4
1004 diamond 875
 
1427 diamond 876
check_shortcut:
1570 dunkaist 877
; in:   cl = scancode (from sysfn 2),
878
;   eax = state of modifiers (from sysfn 66.3),
879
;   edx -> shortcut descriptor
880
; out:  ZF set <=> fail
881
    cmp cl, [edx+4]
882
    jnz .not
883
    push    eax
884
    mov esi, [edx]
885
    and esi, 0xF
886
    and al, 3
887
    call    dword [check_modifier_table+esi*4]
888
    test    al, al
889
    pop eax
890
    jnz .not
891
    push    eax
892
    mov esi, [edx]
893
    shr esi, 4
894
    and esi, 0xF
895
    shr al, 2
896
    and al, 3
897
    call    dword [check_modifier_table+esi*4]
898
    test    al, al
899
    pop eax
900
    jnz .not
901
    push    eax
902
    mov esi, [edx]
903
    shr esi, 8
904
    and esi, 0xF
905
    shr al, 4
906
    and al, 3
907
    call    dword [check_modifier_table+esi*4]
908
    test    al, al
909
    pop eax
910
;   jnz .not
1427 diamond 911
.not:
1570 dunkaist 912
    ret
1427 diamond 913
 
914
check_modifier_0:
1570 dunkaist 915
    setnz   al
916
    ret
1427 diamond 917
check_modifier_1:
1570 dunkaist 918
    setp    al
919
    ret
1427 diamond 920
check_modifier_2:
1570 dunkaist 921
    cmp al, 3
922
    setnz   al
923
    ret
1427 diamond 924
check_modifier_3:
1570 dunkaist 925
    cmp al, 1
926
    setnz   al
927
    ret
1427 diamond 928
check_modifier_4:
1570 dunkaist 929
    cmp al, 2
930
    setnz   al
931
    ret
1427 diamond 932
 
933
; fills real_header with window title
934
; window title is generated as ' - Kolibri Image Viewer'
935
generate_header:
1570 dunkaist 936
    push    eax
937
    mov esi, [last_name_component]
938
    mov edi, real_header
1427 diamond 939
@@:
1570 dunkaist 940
    lodsb
941
    test    al, al
942
    jz  @f
943
    stosb
944
    cmp edi, real_header+256
945
    jb  @b
1427 diamond 946
.overflow:
1570 dunkaist 947
    mov dword [edi-4], '...'
1427 diamond 948
.ret:
1570 dunkaist 949
    pop eax
950
    ret
1427 diamond 951
@@:
1570 dunkaist 952
    mov esi, s_header
1427 diamond 953
@@:
1570 dunkaist 954
    lodsb
955
    stosb
956
    test    al, al
957
    jz  .ret
958
    cmp edi, real_header+256
959
    jb  @b
960
    jmp .overflow
1004 diamond 961
;-----------------------------------------------------------------------------
962
 
1427 diamond 963
s_header db ' - Kolibri Image Viewer', 0
1004 diamond 964
 
965
;-----------------------------------------------------------------------------
966
;-----------------------------------------------------------------------------
967
 
968
align 4
969
@IMPORT:
970
 
1570 dunkaist 971
library             \
972
    libio  , 'libio.obj'  , \
973
    libgfx , 'libgfx.obj' , \
974
    libimg , 'libimg.obj' , \
975
    libini , 'libini.obj' , \
976
    sort   , 'sort.obj'   , \
977
    proc_lib ,'proc_lib.obj'
1004 diamond 978
 
1511 mario79 979
 
1570 dunkaist 980
import  libio             , \
981
    libio.init , 'lib_init'   , \
982
    file.size  , 'file_size'  , \
983
    file.open  , 'file_open'  , \
984
    file.read  , 'file_read'  , \
985
    file.close , 'file_close'
1004 diamond 986
 
1570 dunkaist 987
import  libgfx              , \
988
    libgfx.init   , 'lib_init'  , \
989
    gfx.open      , 'gfx_open'  , \
990
    gfx.close     , 'gfx_close' , \
991
    gfx.pen.color , 'gfx_pen_color' , \
992
    gfx.line      , 'gfx_line'
1004 diamond 993
 
1570 dunkaist 994
import  libimg             , \
995
    libimg.init , 'lib_init'   , \
996
    img.is_img  , 'img_is_img' , \
997
    img.to_rgb2 , 'img_to_rgb2', \
998
    img.decode  , 'img_decode' , \
999
    img.flip    , 'img_flip'   , \
1000
    img.rotate  , 'img_rotate' , \
1001
    img.destroy , 'img_destroy', \
1002
    img.draw    , 'img_draw'
1004 diamond 1003
 
1570 dunkaist 1004
import  libini, \
1005
    ini_get_shortcut, 'ini_get_shortcut'
1427 diamond 1006
 
1144 diamond 1007
import  sort, sort.START, 'START', SortDir, 'SortDir', strcmpi, 'strcmpi'
1016 diamond 1008
 
1570 dunkaist 1009
import  proc_lib, \
1010
    OpenDialog_Init, 'OpenDialog_init', \
1011
    OpenDialog_Start,'OpenDialog_start'
1511 mario79 1012
 
1570 dunkaist 1013
bFirstDraw  db  0
1004 diamond 1014
;-----------------------------------------------------------------------------
1015
 
1016 diamond 1016
virtual at 0
1017
file 'kivicons.bmp':0xA,4
1018
load offbits dword from 0
1019
end virtual
1020
numimages = 9
1021
openbtn = 0
1022
backbtn = 1
1023
forwardbtn = 2
1024
bgrbtn = 3
1025
fliphorzbtn = 4
1026
flipvertbtn = 5
1027
rotcwbtn = 6
1028
rotccwbtn = 7
1029
rot180btn = 8
1030
 
1004 diamond 1031
palette:
1570 dunkaist 1032
    file 'kivicons.bmp':0x36,offbits-0x36
1016 diamond 1033
buttons:
1570 dunkaist 1034
    file 'kivicons.bmp':offbits
1004 diamond 1035
repeat 10
1036
y = % - 1
1037
z = 20 - %
1016 diamond 1038
repeat numimages*5
1039
load a dword from $ - numimages*20*20 + numimages*20*y + (%-1)*4
1040
load b dword from $ - numimages*20*20 + numimages*20*z + (%-1)*4
1041
store dword a at $ - numimages*20*20 + numimages*20*z + (%-1)*4
1042
store dword b at $ - numimages*20*20 + numimages*20*y + (%-1)*4
1004 diamond 1043
end repeat
1044
end repeat
1045
 
1570 dunkaist 1046
inifilename db  '/sys/media/kiv.ini',0
1047
aShortcuts  db  'Shortcuts',0
1048
aNext       db  'Next',0
1049
aPrev       db  'Prev',0
1427 diamond 1050
 
1051
align 4
1052
check_modifier_table:
1570 dunkaist 1053
    dd  check_modifier_0
1054
    dd  check_modifier_1
1055
    dd  check_modifier_2
1056
    dd  check_modifier_3
1057
    dd  check_modifier_4
1427 diamond 1058
 
1470 mario79 1059
;---------------------------------------------------------------------
1060
align 4
1061
OpenDialog_data:
1570 dunkaist 1062
.type           dd 0
1063
.procinfo       dd procinfo ;+4
1064
.com_area_name      dd communication_area_name ;+8
1065
.com_area       dd 0 ;+12
1066
.opendir_pach       dd temp_dir_pach ;+16
1067
.dir_default_pach   dd communication_area_default_pach ;+20
1068
.start_path     dd open_dialog_path ;+24
1069
.draw_window        dd draw_window ;+28
1070
.status         dd 0 ;+32
1071
.openfile_pach      dd path  ;openfile_pach ;+36
1072
.filename_area      dd 0    ;+40
1073
.filter_area        dd Filter
1582 mario79 1074
.x:
1075
.x_size			dw 420 ;+48 ; Window X size
1076
.x_start		dw 10 ;+50 ; Window X position
1077
.y:
1078
.y_size			dw 320 ;+52 ; Window y size
1079
.y_start		dw 10 ;+54 ; Window Y position
1004 diamond 1080
 
1470 mario79 1081
communication_area_name:
1570 dunkaist 1082
    db 'FFFFFFFF_open_dialog',0
1701 lrz 1083
 
1470 mario79 1084
open_dialog_path:
1701 lrz 1085
if __nightbuild eq yes
1086
    db '/sys/MANAGERS/opendial',0
1087
else
1570 dunkaist 1088
    db '/sys/File Managers/opendial',0
1701 lrz 1089
end if
1470 mario79 1090
communication_area_default_pach:
1570 dunkaist 1091
    db '/rd/1',0
1004 diamond 1092
 
1470 mario79 1093
Filter:
1094
dd Filter.end - Filter
1095
.1:
1096
db 'BMP',0
1097
db 'GIF',0
1098
db 'JPG',0
1099
db 'JPEG',0
1100
db 'JPE',0
1101
db 'PNG',0
1102
db 'ICO',0
1103
db 'CUR',0
1575 dunkaist 1104
; dunkaist [
1570 dunkaist 1105
db 'PCX',0
1922 dunkaist 1106
db 'XCF',0
1575 dunkaist 1107
; dunkaist ]
1470 mario79 1108
.end:
1109
db 0
1004 diamond 1110
 
1470 mario79 1111
draw_window_fake:
1570 dunkaist 1112
    ret
1470 mario79 1113
;------------------------------------------------------------------------------
1016 diamond 1114
readdir_fileinfo:
1570 dunkaist 1115
    dd  1
1116
    dd  0
1117
    dd  0
1118
readblocks dd   0
1119
directory_ptr   dd  0
1470 mario79 1120
;------------------------------------------------------------------------------
1004 diamond 1121
I_END:
1570 dunkaist 1122
curdir      rb  1024
1016 diamond 1123
 
1124
align 4
1004 diamond 1125
img_data     dd ?
1126
img_data_len dd ?
1570 dunkaist 1127
fh       dd ?
1128
image        dd ?
1129
wnd_width   dd  ?
1130
wnd_height  dd  ?
1131
draw_width  dd  ?
1132
draw_height dd  ?
1133
last_name_component dd  ?
1134
cur_file_idx    dd  ?
1135
cur_frame_time  dd  ?
1136
cur_frame   dd  ?
1004 diamond 1137
 
1570 dunkaist 1138
next_mod    dd  ?
1139
next_key    dd  ?
1140
prev_mod    dd  ?
1141
prev_key    dd  ?
1004 diamond 1142
 
1570 dunkaist 1143
procinfo:   rb  1024
1144
path:       rb  4096  ;1024+16
1145
real_header rb  256
1470 mario79 1146
@PARAMS rb 4096  ;512
1147
;---------------------------------------------------------------------
1148
temp_dir_pach:
1149
        rb 4096
1150
;---------------------------------------------------------------------
1570 dunkaist 1151
    rb 4096
1470 mario79 1152
stacktop:
1153
;---------------------------------------------------------------------
1922 dunkaist 1154
F_END: