Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
8945 leency 1
format binary as ""
2
 
3
use32
4
org 0x0
5
 
6
db 'MENUET01'
7
dd 0x01, START, I_END, E_END, stacktop, __params, sys_path
8
 
9
;-----------------------------------------------------------------------------
10
 
11
__DEBUG__        = 0
12
__DEBUG_LEVEL__  = 1
13
 
14
LG_TRACE equ 1
15
 
16
include '../../../config.inc'
17
include '../../../proc32.inc'
18
include '../../../macros.inc'
19
include '../../../KOSfuncs.inc'
20
include '../../../dll.inc'
21
include '../../../debug-fdo.inc'
22
include '../../../develop/libraries/libs-dev/libimg/libimg.inc'
23
 
24
 
25
KEY_MOVE_PIXELS   = 50
26
SCROLL_WIDTH_SIZE = 15
27
AR_OFFSET         = 10
28
 
29
MIN_WINDOW_WIDTH  = 50+25*numimages
30
MIN_WINDOW_HEIGHT = 100
31
TOOLBAR_HEIGHT    = 31
32
CANVAS_PADDING    = 5
33
;-----------------------------------------------------------------------------
34
 
35
START:
36
        mcall   SF_SYS_MISC, SSF_HEAP_INIT
37
        mcall   SF_KEYBOARD, SSF_SET_INPUT_MODE, 1  ; set kbd mode to scancodes
38
        mcall   SF_SET_EVENTS_MASK, EVM_REDRAW or EVM_KEY or EVM_BUTTON or \
39
                EVM_MOUSE or EVM_MOUSE_FILTER
40
 
41
        stdcall dll.Load, @IMPORT
42
        or      eax, eax
43
        jnz     exit
44
 
45
        invoke  sort.START, 1
46
 
47
        mov     ecx, 1  ; for 15.4: 1 = tile
48
        cmp     word[__params], '\T'
49
        jz      set_bgr
50
        inc     ecx     ; for 15.4: 2 = stretch
51
        cmp     word[__params], '\S'
52
        jz      set_bgr
53
 
54
        cmp     byte[__params], 0
55
        jz      @f
56
        mov     esi, __params
57
        mov     edi, path
58
        mov     ecx, 4096/4
59
        rep movsd
60
        mov     byte[edi-1], 0
61
@@:
62
; OpenDialog initialisation
63
        push    dword OpenDialog_data
64
        call    [OpenDialog_Init]
65
 
66
; initialize keyboard handling
67
        invoke  ini_get_shortcut, inifilename, aKivSection, aNext, -1, next_mod
68
        mov     [next_key], eax
69
        invoke  ini_get_shortcut, inifilename, aKivSection, aPrev, -1, prev_mod
70
        mov     [prev_key], eax
71
        invoke  ini_get_shortcut, inifilename, aKivSection, aSlide, -1, slide_mod
72
        mov     [slide_key], eax
73
        invoke  ini_get_shortcut, inifilename, aKivSection, aTglbar, -1, tglbar_mod
74
        mov     [tglbar_key], eax
75
 
76
        invoke  ini_get_int, inifilename, aKivSection, aWinX, 100
77
        mov     [window.left], eax
78
        invoke  ini_get_int, inifilename, aKivSection, aWinY, 150
79
        mov     [window.top], eax
80
        invoke  ini_get_int, inifilename, aKivSection, aWinW, 0
81
        mov     [window.width], eax
82
        invoke  ini_get_int, inifilename, aKivSection, aWinH, 0
83
        mov     [window.height], eax
84
 
85
        cmp     byte[__params], 0
86
        jnz     params_given
87
 
88
        mov     [OpenDialog_data.draw_window], draw_window_fake
89
 
90
; OpenDialog Open
91
        push    dword OpenDialog_data
92
        call    [OpenDialog_Start]
93
 
94
        cmp     [OpenDialog_data.status], 1
95
        jnz     exit
96
 
97
        mov     [OpenDialog_data.draw_window], draw_window
98
 
99
        mov     esi, path
100
        mov     edi, __params
101
        mov     ecx, 4096/4
102
        rep movsd
103
        mov     byte[edi-1], 0
104
        jmp     params_given
105
 
106
set_bgr:
107
        mcall   SF_BACKGROUND_SET, SSF_MODE_BG
108
        stdcall load_image, __params+4
109
        jc      exit
110
        call    set_as_bgr
111
        jmp     exit
112
 
113
params_given:
114
        mov     esi, __params
115
        push    esi
116
        call    find_last_name_component
117
        call    load_directory
118
 
119
        pop     eax
120
        stdcall load_image, eax
121
        jc      exit
122
 
123
;-----------------------------------------------------------------------------
124
 
125
redraw_all:
126
        call    draw_window
127
 
128
still:
129
        mov     eax, [orig_image]
130
        test    [eax+Image.Flags], Image.IsAnimated
131
        movi    eax, SF_WAIT_EVENT
132
        jz      .wait_event
133
        mcall   SF_SYSTEM_GET, SSF_TIME_COUNT
134
        mov     edx, [cur_frame]
135
        mov     ebx, [cur_frame_time]
136
        add     ebx, [edx+Image.Delay]
137
        sub     ebx, eax
138
        cmp     ebx, [edx+Image.Delay]
139
        jna     @f
140
        call    red_update_frame
141
        jmp     still
142
@@:
143
        test    ebx, ebx
144
        jnz     @f
145
        call    red_update_frame
146
        jmp     still
147
@@:
148
        movi    eax, SF_WAIT_EVENT_TIMEOUT
149
.wait_event:
150
        mcall
151
        dec     eax
152
        jns     @f
153
        call    red_update_frame
154
        jmp     still
155
@@:
156
        jz      redraw_all
157
        dec     eax
158
        jz      key
159
        dec     eax
160
        jz      button
161
 
162
mouse:
163
        mov     eax, [need_scrollbar_v]
164
        add     eax, [need_scrollbar_h]
165
        test    eax, eax
166
        jz      .done
167
        mov     [pict_moved], 0
168
 
169
        invoke  scrollbar_vert_mouse, scroll_bar_data_vertical
170
        invoke  scrollbar_hort_mouse, scroll_bar_data_horizontal
171
        xor     ecx, ecx
172
        mov     eax, [scroll_bar_data_vertical.position]
173
        cmp     [pict.top], eax
174
        mov     [pict.top], eax
175
        setnz   cl
176
        mov     eax, [scroll_bar_data_horizontal.position]
177
        cmp     [pict.left], eax
178
        mov     [pict.left], eax
179
        setnz   ch
180
        test    ecx, ecx
181
        jz      @f
182
        call    draw_view
183
        call    draw_onimage_decorations
184
@@:
185
 
186
        ; check for scroll
187
        mcall   SF_MOUSE_GET, SSF_SCROLL_DATA
188
        test    eax, eax
189
        jz      .no_scroll
190
        movsx   ecx, ax
191
        shl     ecx, 4
192
        sar     eax, 16
193
        shl     eax, 4
194
        stdcall move_pictport, eax, ecx
195
        mov     [pict_moved], eax
196
        jmp     .mouse_done
197
.no_scroll:
198
 
199
        ; get cursor coordinates in window
200
        mcall   SF_MOUSE_GET, SSF_WINDOW_POSITION
201
        movsx   ebx, ax
202
        cmp     ebx, 0
203
        jge     @f
204
        add     eax, 0x10000
205
@@:
206
        mov     ecx, [mouse_pos]
207
        cmp     eax, ecx
208
        jz      .no_mouse_move
209
        mov     [mouse_pos], eax
210
 
211
        cmp     [pict_drag], 1
212
        jnz     .no_mouse_move
213
        sar     eax, 16
214
        movsx   edx, cx
215
        sar     ecx, 16
216
        sub     eax, ecx
217
        sub     ebx, edx
218
        neg     eax
219
        neg     ebx
220
        stdcall move_pictport, eax, ebx
221
        mov     [pict_moved], eax
222
        jmp     .no_mouse_move
223
.no_mouse_move:
224
 
225
        ; check buttons
226
        mcall   SF_MOUSE_GET, SSF_BUTTON
227
        mov     ecx, eax
228
        xor     ecx, [mouse_buttons]
229
        mov     [mouse_buttons], eax
230
        test    ecx, 0x01
231
        jz      .left_button_handled
232
        test    eax, 0x01
233
        jnz     .left_button_down
234
.left_button_up:
235
        mov     [pict_drag], 0
236
        jmp     .left_button_handled
237
.left_button_down:
238
        mov     ecx, [mouse_pos]
239
        movzx   edx, cx
240
        sar     ecx, 16
241
        mov     ebx, [canvas_abs_top]
242
        add     ebx, [view.top]
243
        cmp     ebx, edx
244
        jg      .left_click_pict_done
245
        add     ebx, [view.height]
246
        cmp     ebx, edx
247
        jl      .left_click_pict_done
248
        mov     ebx, [canvas_abs_left]
249
        add     ebx, [view.left]
250
        cmp     ebx, ecx
251
        jg      .left_click_pict_done
252
        add     ebx, [view.width]
253
        cmp     ebx, ecx
254
        jl      .left_click_pict_done
255
        mov     [pict_drag], 1
256
        jmp     .left_button_handled
257
.left_click_pict_done:
258
 
259
.left_button_handled:
260
.mouse_done:
261
        mov     eax, [pict_moved]
262
        test    eax, eax
263
        jz      .done
264
        stdcall update_scrollbars, eax
265
        call    draw_view
266
        call    draw_onimage_decorations
267
.done:
268
        jmp     still
269
 
270
key:
271
        xor     esi, esi
272
keyloop:
273
        mcall   SF_GET_KEY
274
        test    al, al
275
        jnz     keyloopdone
276
        shr     eax, 8
277
        mov     ecx, eax
278
        mcall   SF_KEYBOARD, SSF_GET_CONTROL_KEYS
279
        mov     edx, next_mod
280
        call    check_shortcut
281
        jz      .next
282
        add     edx, prev_mod-next_mod
283
        call    check_shortcut
284
        jz      .prev
285
        add     edx, slide_mod-prev_mod
286
        call    check_shortcut
287
        jz      .slide
288
        add     edx, tglbar_mod-slide_mod
289
        call    check_shortcut
290
        jz      .tglbar
291
 
292
        mov     edx, scale_none_mod
293
        call    check_shortcut
294
        jz      .set_scale_none
295
        add     edx, scale_fit_min_mod-scale_none_mod
296
        call    check_shortcut
297
        jz      .set_scale_fit_min
298
        add     edx, move_pictport_left_1_mod-scale_fit_min_mod
299
        call    check_shortcut
300
        jz      .move_pictport_left
301
        add     edx, move_pictport_left_2_mod-move_pictport_left_1_mod
302
        call    check_shortcut
303
        jz      .move_pictport_left
304
        add     edx, move_pictport_right_1_mod-move_pictport_left_2_mod
305
        call    check_shortcut
306
        jz      .move_pictport_right
307
        add     edx, move_pictport_right_2_mod-move_pictport_right_1_mod
308
        call    check_shortcut
309
        jz      .move_pictport_right
310
        add     edx, move_pictport_up_1_mod-move_pictport_right_2_mod
311
        call    check_shortcut
312
        jz      .move_pictport_up
313
        add     edx, move_pictport_up_2_mod-move_pictport_up_1_mod
314
        call    check_shortcut
315
        jz      .move_pictport_up
316
        add     edx, move_pictport_down_1_mod-move_pictport_up_2_mod
317
        call    check_shortcut
318
        jz      .move_pictport_down
319
        add     edx, move_pictport_down_2_mod-move_pictport_down_1_mod
320
        call    check_shortcut
321
        jz      .move_pictport_down
322
 
323
        cmp     cl, 1 ; Esc
324
        jz      .esc
325
        jmp     keyloop
326
.esc:
327
        test    [bSlideShow], 1
328
        jz      keyloop
329
        jmp     .slide
330
.tglbar:
331
        bt      [window_style], 25
332
        jnc     @f
333
        mov     [bToggleToolbar], 1
334
        xor     [bShowToolbar], 1
335
@@:
336
        jmp     keyloop
337
.slide:
338
        call    slide_show
339
        jmp     keyloop
340
.set_scale_none:
341
        mov     eax, LIBIMG_SCALE_NONE
342
        call    set_scale_mode
343
        jz      @f
344
        call    recalc_canvas
345
@@:
346
        jmp     keyloop
347
.set_scale_fit_min:
348
        mov     eax, LIBIMG_SCALE_FIT_MIN
349
        call    set_scale_mode
350
        jz      @f
351
        call    recalc_work
352
@@:
353
        jmp     keyloop
354
.move_pictport_left:
355
        stdcall move_pictport, -KEY_MOVE_PIXELS, 0
356
        stdcall update_scrollbars, eax
357
        call    draw_view
358
        call    draw_onimage_decorations
359
        jmp     keyloop
360
.move_pictport_right:
361
        stdcall move_pictport, KEY_MOVE_PIXELS, 0
362
        stdcall update_scrollbars, eax
363
        call    draw_view
364
        call    draw_onimage_decorations
365
        jmp     keyloop
366
.move_pictport_up:
367
        stdcall move_pictport, 0, -KEY_MOVE_PIXELS
368
        stdcall update_scrollbars, eax
369
        call    draw_view
370
        call    draw_onimage_decorations
371
        jmp     keyloop
372
.move_pictport_down:
373
        stdcall move_pictport, 0, KEY_MOVE_PIXELS
374
        stdcall update_scrollbars, eax
375
        call    draw_view
376
        call    draw_onimage_decorations
377
        jmp     keyloop
378
.prev:
379
        dec     esi
380
        jmp     keyloop
381
.next:
382
        inc     esi
383
        jmp     keyloop
384
keyloopdone:
385
        test    esi, esi
386
        jnz     next_or_prev_handler
387
        test    [bToggleSlideShow], 1
388
        jnz     redraw_all
389
        test    [bToggleToolbar], 1
390
        stdcall recalc_client
391
        jnz     redraw_all
392
        test    [bScaleModeChanged], 1
393
        mov     [bScaleModeChanged], 0
394
        jnz     redraw_all
395
        test    [bNewImage], 1
396
        mov     [bNewImage], 0
397
        jnz     redraw_all
398
        jmp     still
399
next_or_prev_handler:
400
        call    next_or_prev_image
401
        jmp     redraw_all
402
 
403
red_update_frame:
404
        mov     eax, [cur_frame]
405
        mov     eax, [eax+Image.Next]
406
        test    eax, eax
407
        jnz     @f
408
        mov     eax, [cur_image]
409
@@:
410
        mov     [cur_frame], eax
411
        mcall   SF_SYSTEM_GET, SSF_TIME_COUNT
412
        mov     [cur_frame_time], eax
413
        call    draw_view
414
        ret
415
 
416
button:
417
        mcall   SF_GET_BUTTON
418
        shr     eax, 8
419
 
420
        ; flip horizontally
421
        cmp     eax, 'flh'
422
        jnz     .not_flh
423
 
424
        mov     eax, [cur_image]
425
        cmp     eax, [orig_image]
426
        jz      @f
427
        invoke  img.flip, [cur_image], FLIP_HORIZONTAL
428
@@:
429
        invoke  img.flip, [orig_image], FLIP_HORIZONTAL
430
        jmp     redraw_all
431
 
432
        ; flip vertically
433
.not_flh:
434
        cmp     eax, 'flv'
435
        jnz     .not_flv
436
 
437
        mov     eax, [cur_image]
438
        cmp     eax, [orig_image]
439
        jz      @f
440
        invoke  img.flip, [cur_image], FLIP_VERTICAL
441
@@:
442
        invoke  img.flip, [orig_image], FLIP_VERTICAL
443
        jmp     redraw_all
444
 
445
        ; flip both horizontally and vertically
446
.not_flv:
447
        cmp     eax, 'flb'
448
        jnz     .not_flb
449
 
450
        mov     eax, [cur_image]
451
        cmp     eax, [orig_image]
452
        jz      @f
453
        invoke  img.flip, [cur_image], FLIP_BOTH
454
@@:
455
        invoke  img.flip, [orig_image], FLIP_BOTH
456
        jmp     redraw_all
457
 
458
        ; rotate left
459
.not_flb:
460
        cmp     eax, 'rtl'
461
        jnz     .not_rtl
462
 
463
        push    ROTATE_90_CCW
464
.rotate_common:
465
        mov     eax, [cur_image]
466
        cmp     eax, [orig_image]
467
        jz      @f
468
        push    dword[esp]
469
        invoke  img.rotate, [cur_image]
470
@@:
471
        invoke  img.rotate, [orig_image]
472
        mov     [bNewImage], 1
473
        jmp     redraw_all
474
 
475
        ; rotate right
476
.not_rtl:
477
        cmp     eax, 'rtr'
478
        jnz     .not_rtr
479
 
480
        push    ROTATE_90_CW
481
        jmp     .rotate_common
482
 
483
        ; open new file
484
.not_rtr:
485
        cmp     eax, 'opn'
486
        jnz     @f
487
 
488
; OpenDialog Open
489
        push    dword OpenDialog_data
490
        call    [OpenDialog_Start]
491
 
492
        cmp     [OpenDialog_data.status], 1
493
        jnz     still
494
 
495
        mov     esi, path
496
        mov     edi, __params
497
        push    edi
498
        mov     ecx, 4096/4
499
        rep movsd
500
        mov     byte[edi-1], 0
501
 
502
        pop     esi
503
        push    esi
504
        call    find_last_name_component
505
 
506
        pop     eax
507
        push    [cur_image]
508
        stdcall load_image, eax
509
        jc      .restore_old
510
        call    free_directory
511
        jmp     redraw_all
512
 
513
.restore_old:
514
        pop     eax
515
        jmp     still
516
 
517
        ; set background
518
@@:
519
        cmp     eax, 'bgr'
520
        jnz     @f
521
 
522
        mcall   SF_BACKGROUND_SET, SSF_MODE_BG, 2 ; stretch by default
523
        call    set_as_bgr
524
        jmp     still
525
 
526
@@:
527
        cmp     eax, 'sld'
528
        jnz     @f
529
 
530
        call    slide_show
531
        jmp     redraw_all
532
 
533
@@:
534
        cmp     eax, 'scl'
535
        jnz     .not_scl
536
        mov     eax, LIBIMG_SCALE_NONE
537
        cmp     [scale_mode], LIBIMG_SCALE_NONE
538
        jnz     @f
539
        mov     eax, LIBIMG_SCALE_FIT_MIN
540
@@:
541
        call    set_scale_mode
542
        jz      @f
543
        call    recalc_work
544
@@:
545
        jmp     redraw_all
546
.not_scl:
547
        or      esi, -1
548
        cmp     eax, 'bck'
549
        jz      next_or_prev_handler
550
        neg     esi
551
        cmp     eax, 'fwd'
552
        jz      next_or_prev_handler
553
 
554
        cmp     eax, 1
555
        jnz     still
556
 
557
exit:
558
        invoke  ini_set_int, inifilename, aKivSection, aWinX, [window.left]
559
        invoke  ini_set_int, inifilename, aKivSection, aWinY, [window.top]
560
        invoke  ini_set_int, inifilename, aKivSection, aWinW, [window.width]
561
        invoke  ini_set_int, inifilename, aKivSection, aWinH, [window.height]
562
        mcall   -1
563
 
564
 
565
proc load_image _filename
566
        push    ebx esi edi
567
        invoke  img.from_file, [_filename]
568
        test    eax, eax
569
        jz      .error
570
        mov     ebx, eax
571
 
572
        test    [eax+Image.Flags], Image.IsAnimated
573
        jnz     @f
574
        cmp     [eax+Image.Next], 0
575
        jz      @f
576
        stdcall merge_icons_to_single_img, eax
577
        test    eax, eax
578
        jz      .error_destroy
579
@@:
580
        stdcall init_frame, eax
581
        clc
582
        jmp     .exit
583
 
584
.error_destroy:
585
        invoke  img.destroy, ebx
586
        xor     eax, eax
587
.error:
588
        stc
589
.exit:
590
        pop     edi esi ebx
591
        ret
592
endp
593
 
594
 
595
; in:  eax -- pointer to image
596
; out: fill pict structure
597
proc calculate_picture_size
598
        mov     edx, [eax+Image.Width]
599
        test    [eax+Image.Flags], Image.IsAnimated
600
        jnz     .not_in_row
601
        push    eax
602
@@:
603
        cmp     [eax+Image.Next], 0
604
        jz      @f
605
        mov     eax, [eax+Image.Next]
606
        add     edx, [eax+Image.Width]
607
        inc     edx
608
        jmp     @b
609
@@:
610
        pop     eax
611
.not_in_row:
612
        mov     [pict.width], edx
613
        add     edx, 19
614
        cmp     edx, 50+25*numimages
615
        jae     @f
616
        mov     edx, 50+25*numimages
617
@@:
618
        mov     esi, [eax+Image.Height]
619
        test    [eax+Image.Flags], Image.IsAnimated
620
        jnz     .max_equals_first
621
        push    eax
622
@@:
623
        cmp     [eax+Image.Next], 0
624
        jz      @f
625
        mov     eax, [eax+Image.Next]
626
        cmp     esi, [eax+Image.Height]
627
        jae     @b
628
        mov     esi, [eax+Image.Height]
629
        jmp     @b
630
@@:
631
        pop     eax
632
.max_equals_first:
633
        mov     [pict.height], esi
634
        ret
635
endp
636
 
637
 
638
; in:  [orig_image]
639
proc set_as_bgr
640
        mov     esi, [orig_image]
641
        mov     ecx, [esi+Image.Width]
642
        mov     edx, [esi+Image.Height]
643
        mcall   SF_BACKGROUND_SET, SSF_SIZE_BG
644
        mcall   SF_BACKGROUND_SET, SSF_MAP_BG
645
        test    eax, eax
646
        jz      @f
647
 
648
        push    eax
649
        invoke  img.to_rgb2, esi, eax
650
        pop     ecx
651
        mcall   SF_BACKGROUND_SET, SSF_UNMAP_BG
652
 
653
@@:
654
        mcall   SF_BACKGROUND_SET, SSF_REDRAW_BG
655
        ; save to file eskin.ini
656
        xor     al, al
657
        mov     ecx, 1024
658
        mov     edi, sys_path+2
659
        repne scasb
660
        sub     edi, sys_path+3
661
        invoke  ini_set_str, inifileeskin, amain, aprogram, sys_path+2, edi
662
        ; add param '\S__'
663
        cmp     word[__params], '\T'
664
        jz      @f
665
        cmp     word[__params], '\S'
666
        je      @f
667
        mov     esi, __params+4096-8
668
        mov     edi, __params+4096-4
669
        mov     ecx, 4096/4-1
670
        std
671
        rep movsd
672
        cld
673
        mov     dword[__params], '\S__'
674
@@:
675
        xor     al, al
676
        mov     ecx, 4096
677
        mov     edi, __params
678
        repne scasb
679
        sub     edi, __params+1
680
        invoke  ini_set_str, inifileeskin, amain, aparam, __params, edi
681
        ret
682
endp
683
 
684
proc slide_show
685
        push    ebx esi edi
686
        mov     [bToggleSlideShow], 1
687
        btc     [window_style], 25
688
        xor     [bSlideShow], 1
689
        jnz     .to_fullscreen
690
        ; back from fullscreen
691
        movzx   eax, [bShowToolbarSave]
692
        mov     [bShowToolbar], al
693
        mov     [canvas_padding], CANVAS_PADDING
694
        mov     [bg_color], 0x00ffffff
695
        mcall   SF_CHANGE_WINDOW, [window_save.left], [window_save.top], [window_save.width], [window_save.height]
696
        jmp     .done
697
.to_fullscreen:
698
        stdcall copy_box, window, window_save
699
        movzx   eax, [bShowToolbar]
700
        mov     [bShowToolbarSave], al
701
        mov     [bShowToolbar], 0
702
        mov     [canvas_padding], 0
703
        mov     [bg_color], 0x00000000
704
        mcall   SF_GET_SCREEN_SIZE
705
        mov     edx, eax
706
        shr     edx, 16
707
        movzx   eax, ax
708
        mov     esi, eax
709
        mcall   SF_CHANGE_WINDOW, 0, 0, ,
710
        mov     eax, LIBIMG_SCALE_FIT_MIN
711
        call    set_scale_mode
712
 
713
.done:
714
        pop     edi esi ebx
715
        ret
716
endp
717
 
718
 
719
; seek to ESI image files
720
; esi>0 means next file, esi<0-prev file
721
proc next_or_prev_image
722
locals
723
        files_cnt       dd ?
724
        file_idx        dd ?
725
endl
726
        push    ebx esi edi
727
        push    esi
728
        call    load_directory
729
        pop     esi
730
        mov     eax, [directory_ptr]
731
        mov     eax, [eax+4]
732
        mov     [files_cnt], eax
733
        cmp     [directory_ptr], 0
734
        jz      .ret
735
        cmp     [files_cnt], 0 ; number of files
736
        jz      .ret
737
        mov     eax, [cur_file_idx]
738
        cmp     eax, -1
739
        jnz     @f
740
        test    esi, esi
741
        jns     @f
742
        mov     eax, [files_cnt]
743
@@:
744
        add     eax, esi
745
@@:
746
        test    eax, eax
747
        jns     @f
748
        add     eax, [files_cnt]
749
        jmp     @b
750
@@:
751
        cmp     eax, [files_cnt]
752
        jb      @f
753
        sub     eax, [files_cnt]
754
        jmp     @b
755
@@:
756
        mov     [file_idx], eax
757
.scanloop:
758
        push    eax esi
759
        imul    esi, eax, 304
760
        add     esi, [directory_ptr]
761
        add     esi, 32+40
762
        mov     edi, curdir
763
@@:
764
        inc     edi
765
        cmp     byte[edi-1], 0
766
        jnz     @b
767
        mov     byte[edi-1], '/'
768
@@:
769
        lodsb
770
        stosb
771
        test    al, al
772
        jnz     @b
773
        mov     esi, curdir
774
        push    esi
775
        mov     edi, __params
776
        mov     ecx, 4096/4
777
        rep movsd
778
        mov     byte[edi-1], 0
779
        pop     esi
780
        stdcall load_image, curdir
781
        pushfd
782
@@:
783
        lodsb
784
        test    al, al
785
        jnz     @b
786
@@:
787
        dec     esi
788
        cmp     byte[esi], '/'
789
        jnz     @b
790
        mov     byte[esi], 0
791
        popfd
792
        pop     esi eax
793
        jnc     .loadedok
794
        test    esi, esi
795
        js      .try_prev
796
.try_next:
797
        inc     eax
798
        cmp     eax, [files_cnt]
799
        jb      @f
800
        xor     eax, eax
801
@@:
802
.try_common:
803
        cmp     eax, [file_idx]
804
        jz      .notfound
805
        jmp     .scanloop
806
.try_prev:
807
        dec     eax
808
        jns     @f
809
        mov     eax, [files_cnt]
810
        dec     eax
811
@@:
812
        jmp     .try_common
813
.loadedok:
814
        mov     [cur_file_idx], eax
815
.ret:
816
        pop     edi esi ebx
817
        ret
818
.notfound:
819
        pop     edi esi ebx
820
        ret
821
endp
822
 
823
 
824
load_directory:
825
        cmp     [directory_ptr], 0
826
        jnz     .ret
827
        mov     esi, __params
828
        mov     edi, curdir
829
        mov     ecx, [last_name_component]
830
        sub     ecx, esi
831
        dec     ecx
832
        js      @f
833
        rep movsb
834
@@:
835
        mov     byte[edi], 0
836
        mcall   68, 12, 0x1000
837
        test    eax, eax
838
        jz      .ret
839
        mov     ebx, readdir_fileinfo
840
        mov     dword[ebx+12], (0x1000-32) / 304      ; blocks to read
841
        mov     dword[ebx+16], eax      ; where to store
842
        mcall   70
843
        cmp     eax, 6  ; read ok, but there are more files
844
        jz      .dirok
845
        test    eax, eax
846
        jnz     free_directory
847
        mov     edx, [directory_ptr]
848
        mov     ecx, [edx+8]            ; total number of files
849
        mov     [readblocks], ecx
850
        imul    ecx, 304        ; try to read entire dir, FIXME
851
        add     ecx, 32         ; plus header
852
        mcall   68, 20          ; realloc
853
        test    eax, eax
854
        jz      free_directory
855
        mov     [directory_ptr], eax
856
        mcall   70, readdir_fileinfo
857
.dirok:
858
        cmp     ebx, 0
859
        jle     free_directory
860
        mov     eax, [directory_ptr]
861
        mov     edi, [eax+8]  ; total number of files
862
        mov     [files_num], edi
863
        add     eax, 32         ; skip header
864
        mov     edi, eax
865
        push    0
866
.dirskip:
867
        push    eax
868
        test    byte[eax], 0x18 ; volume label or folder
869
        jnz     .nocopy
870
        lea     esi, [eax+40]   ; name
871
        mov     ecx, esi
872
@@:
873
        lodsb
874
        test    al, al
875
        jnz     @b
876
@@:
877
        dec     esi
878
        cmp     esi, ecx
879
        jb      .noext
880
        cmp     byte[esi], '.'
881
        jnz     @b
882
        inc     esi
883
        mov     ecx, [esi]
884
        cmp     byte[esi+3], 0
885
        jnz     .not_3
886
        or      ecx, 0x202020
887
        cmp     ecx, 'jpg'
888
        jz      .copy
889
        cmp     ecx, 'bmp'
890
        jz      .copy
891
        cmp     ecx, 'gif'
892
        jz      .copy
893
        cmp     ecx, 'png'
894
        jz      .copy
895
        cmp     ecx, 'jpe'
896
        jz      .copy
897
        cmp     ecx, 'ico'
898
        jz      .copy
899
        cmp     ecx, 'cur'
900
        jz      .copy
901
        cmp     ecx, 'tga'
902
        jz      .copy
903
        cmp     ecx, 'pcx'
904
        jz      .copy
905
        cmp     ecx, 'xcf'
906
        jz      .copy
907
        cmp     ecx, 'pbm'
908
        jz      .copy
909
        cmp     ecx, 'pgm'
910
        jz      .copy
911
        cmp     ecx, 'pnm'
912
        jz      .copy
913
        cmp     ecx, 'ppm'
914
        jz      .copy
915
        cmp     ecx, 'tif'
916
        jz      .copy
917
        cmp     ecx, 'xbm'
918
        jz      .copy
919
.not_3:
920
        cmp     byte[esi+4], 0
921
        jnz     .nocopy
922
        or      ecx, 0x20202020
923
        cmp     ecx, 'tiff'
924
        jz      @f
925
        cmp     ecx, 'wbmp'
926
        jz      @f
927
        cmp     ecx, 'webp'
928
        jz      @f
929
        cmp     ecx, 'jpeg'
930
        jnz     .nocopy
931
@@:
932
        cmp     byte[esi+4], 0
933
        jnz     .nocopy
934
.copy:
935
        mov     esi, [esp]
936
        mov     ecx, 304 / 4
937
        rep movsd
938
        inc     dword[esp+4]
939
.nocopy:
940
.noext:
941
        pop     eax
942
        add     eax, 304
943
        dec     ebx
944
        jnz     .dirskip
945
        mov     eax, [directory_ptr]
946
        pop     ebx
947
        mov     [eax+4], ebx
948
        test    ebx, ebx
949
        jz      free_directory
950
        push    0   ; sort mode
951
        push    ebx
952
        add     eax, 32
953
        push    eax
954
        call    [SortDir]
955
        xor     eax, eax
956
        mov     edi, [directory_ptr]
957
        add     edi, 32+40    ; name
958
.scan:
959
        mov     esi, [last_name_component]
960
        push    edi
961
        invoke  strcmpi
962
        pop     edi
963
        jz      .found
964
        inc     eax
965
        add     edi, 304
966
        dec     ebx
967
        jnz     .scan
968
        or      eax, -1
969
.found:
970
        mov     [cur_file_idx], eax
971
.ret:
972
        ret
973
 
974
free_directory:
975
        mcall   68, 13, [directory_ptr]
976
        and     [directory_ptr], 0
977
        ret
978
 
979
 
980
; in: esi->full name (e.g. /path/to/file.png)
981
; out: [last_name_component]->last component (e.g. file.png)
982
proc find_last_name_component
983
        mov     ecx, esi
984
@@:
985
        lodsb
986
        test    al, al
987
        jnz     @b
988
@@:
989
        dec     esi
990
        cmp     esi, ecx
991
        jb      @f
992
        cmp     byte[esi], '/'
993
        jnz     @b
994
@@:
995
        inc     esi
996
        mov     [last_name_component], esi
997
        ret
998
endp
999
 
1000
 
1001
proc init_frame uses ebx edx, _img
1002
        mov     eax, [orig_image]
1003
        cmp     eax, [_img]
1004
        jz      .exit
1005
        test    eax, eax
1006
        jz      .freed
1007
        cmp     eax, [cur_image]
1008
        jz      @f
1009
        invoke  img.destroy, [orig_image]
1010
@@:
1011
        invoke  img.destroy, [cur_image]
1012
.freed:
1013
 
1014
        mov     [bNewImage], 1
1015
        mov     eax, [_img]
1016
        mov     [orig_image], eax
1017
        mov     [cur_image], eax
1018
        mov     [cur_frame], eax
1019
        test    byte[eax+Image.Flags], Image.IsAnimated
1020
        jz      @f
1021
        push    ebx
1022
        mcall   SF_SYSTEM_GET, SSF_TIME_COUNT
1023
        pop     ebx
1024
        mov     [cur_frame_time], eax
1025
@@:
1026
        mov     [pict.top], 0
1027
        mov     [pict.left], 0
1028
.exit:
1029
        ret
1030
endp
1031
 
1032
 
1033
proc draw_window
1034
        test    [bFirstWinDraw], 1
1035
        jnz     .min_size_ok
1036
 
1037
        mcall   SF_THREAD_INFO, procinfo, -1
1038
        xor     eax, eax
1039
        mov     edx, -1
1040
        mov     esi, -1
1041
        cmp     [procinfo.wnd_state], 0x04
1042
        je      .min_size_ok
1043
        cmp     [procinfo.box.width], MIN_WINDOW_WIDTH
1044
        ja      @f
1045
        mov     edx, MIN_WINDOW_WIDTH
1046
        inc     eax
1047
@@:
1048
        cmp     [procinfo.box.height], MIN_WINDOW_HEIGHT
1049
        ja      @f
1050
        mov     esi, MIN_WINDOW_HEIGHT
1051
        inc     eax
1052
@@:
1053
        test    eax, eax
1054
        jz      @f
1055
        mcall   SF_CHANGE_WINDOW, -1, -1, ,
1056
@@:
1057
 
1058
.min_size_ok:
1059
        test    [bNewImage], 1
1060
        jz      @f
1061
        call    generate_window_header
1062
@@:
1063
        cmp     [window.width], 0
1064
        jne     @f
1065
        mcall   SF_GET_SCREEN_SIZE
1066
        mov     ebx, eax
1067
        shr     ebx, 16         ; ebx = width
1068
        movzx   esi, ax         ; esi = height
1069
 
1070
        mov     eax, ebx
1071
        xor     edx, edx
1072
        mov     ebx, 3
1073
        div     ebx
1074
        imul    eax, 2
1075
        mov     [window.width], eax
1076
 
1077
        xor     edx, edx
1078
        mov     ebx, 4
1079
        div     ebx
1080
        mov     [window.left], eax
1081
 
1082
        mov     eax, esi
1083
        xor     edx, edx
1084
        mov     ebx, 3
1085
        div     ebx
1086
        imul    eax, 2
1087
        mov     [window.height], eax
1088
 
1089
        xor     edx, edx
1090
        mov     ebx, 4
1091
        div     ebx
1092
        mov     [window.top], eax
1093
@@:
1094
 
1095
        mcall   SF_REDRAW, SSF_BEGIN_DRAW
1096
        mov     ecx, [window.top]
1097
        shl     ecx, 16
1098
        mov     cx, word[window.height]
1099
        mov     ebx, [window.left]
1100
        shl     ebx, 16
1101
        mov     bx, word[window.width]
1102
        mcall   0, , , [window_style], 0, window_header
1103
 
1104
        mcall   SF_THREAD_INFO, procinfo, -1
1105
        test    [procinfo.wnd_state], 0x04
1106
        jnz     .nodraw
1107
 
1108
        stdcall copy_box, window, window_prev
1109
        stdcall copy_box, procinfo.box, window
1110
        test    [bFirstWinDraw], 1
1111
        jnz     .recalc
1112
        test    [bToggleSlideShow], 1
1113
        jnz     .recalc
1114
        mov     eax, [window.width]
1115
        cmp     eax, [window_prev.width]
1116
        jnz     .recalc
1117
        mov     eax, [window.height]
1118
        cmp     eax, [window_prev.height]
1119
        jnz     .recalc
1120
        test    [bNewImage], 1
1121
        jnz     .recalc
1122
        test    [bToggleToolbar], 1
1123
        jnz     .recalc
1124
        jmp     .recalc_done
1125
 
1126
.recalc:
1127
        stdcall recalc_window
1128
.recalc_done:
1129
 
1130
        stdcall draw_client
1131
.nodraw:
1132
        mcall   SF_REDRAW, SSF_END_DRAW
1133
        mov     [bFirstWinDraw], 0
1134
        mov     [bNewImage], 0
1135
        mov     [bToggleToolbar], 0
1136
        mov     [bToggleSlideShow], 0
1137
 
1138
        ret
1139
endp
1140
 
1141
 
1142
proc draw_view uses ebx esi edi
1143
        cmp     [scale_mode], LIBIMG_SCALE_FIT_MIN
1144
        jnz     .scale_none
1145
        mov     ecx, [cur_frame]
1146
        mov     eax, [ecx+Image.Width]
1147
        cmp     eax, [view.width]
1148
        jnz     .scale
1149
        mov     eax, [ecx+Image.Height]
1150
        cmp     eax, [view.height]
1151
        jnz     .scale
1152
        jmp     .draw
1153
.scale:
1154
        mov     eax, [orig_image]
1155
        cmp     eax, [cur_image]
1156
        jz      @f
1157
        invoke  img.destroy, [cur_image]
1158
        mov     eax, [orig_image]
1159
@@:
1160
        invoke  img.scale, eax, 0, 0, [eax+Image.Width], [eax+Image.Height], 0, LIBIMG_SCALE_STRETCH, LIBIMG_INTER_DEFAULT, [view.width], [view.height]
1161
        test    eax, eax
1162
;FIXME
1163
        mov     [cur_image], eax
1164
        mov     [cur_frame], eax        ; FIXME index
1165
        jmp     .draw
1166
 
1167
.scale_none:
1168
 
1169
.draw:
1170
        push    [pict.top]
1171
        push    [pict.left]
1172
        push    [view.height]
1173
        push    [view.width]
1174
        push    [view_abs_top]  ; ypos
1175
        push    [view_abs_left] ; xpos
1176
        invoke  img.draw, [cur_frame]
1177
.done:
1178
        ret
1179
endp
1180
 
1181
proc draw_scale_button
1182
        pushad
1183
        mcall   65, buttons+scalebtn*20, <20,20>, [scale_button_xy], 8, palette
1184
        mov     ebx, [scale_button_xy]
1185
        add     ebx, 0x00050006
1186
        ; print letter(s) corresponding to the current scaling mode
1187
        mov     edi, 2
1188
        mov     [scale_button_letter], 'x1'
1189
        cmp     [scale_mode], LIBIMG_SCALE_NONE
1190
        jz      @f
1191
        add     ebx, 0x00020001
1192
        mov     edi, 1
1193
        mov     [scale_button_letter], 'W'
1194
;        cmp     [scale_mode], LIBIMG_SCALE_FIT_MIN
1195
@@:
1196
        mcall   4, , 0x800000ff, scale_button_letter
1197
        popad
1198
        ret
1199
endp
1200
 
1201
proc draw_toolbar uses ebx esi edi
1202
        cmp     [toolbar.height], 0
1203
        jz      .quit
1204
        mov     ebx, [toolbar_abs_left]
1205
        shl     ebx, 16
1206
        add     ebx, [toolbar.width]
1207
        inc     ebx
1208
        mov     ecx, [toolbar_abs_top]
1209
        shl     ecx, 16
1210
        add     ecx, [toolbar.height]
1211
        mcall   13, , , [bg_color]
1212
        mov     ebx, [toolbar_abs_left]
1213
        shl     ebx, 16
1214
        add     ebx, [toolbar_abs_left]
1215
        add     ebx, [toolbar.width]
1216
        mov     ecx, [toolbar_abs_top]
1217
        shl     ecx, 16
1218
        add     ecx, [toolbar_abs_top]
1219
        add     ecx, (30 SHL 16)+30
1220
        mcall   38, , , 0x007F7F7F
1221
        mov     ebx, [toolbar_abs_left]
1222
        shl     ebx, 16
1223
        add     ebx, [toolbar_abs_left]
1224
        add     ebx, ((5+25*1) SHL 16)+(5+25*1)
1225
        mov     ecx, [toolbar_abs_top]
1226
        shl     ecx, 16
1227
        add     ecx, [toolbar_abs_top]
1228
        add     ecx, [toolbar.height]
1229
        mcall
1230
        add     ebx, ((5+25*2) SHL 16)+(5+25*2)
1231
        mcall
1232
        add     ebx, ((5+25*2) SHL 16)+(5+25*2)
1233
        mcall
1234
        add     ebx, ((5+25*1) SHL 16)+(5+25*1)
1235
        mcall
1236
        mov     ebx, [toolbar_abs_left]
1237
        add     ebx, [toolbar.width]
1238
        sub     ebx, 25*5+10
1239
        shl     ebx, 16
1240
        add     ebx, [toolbar_abs_left]
1241
        add     ebx, [toolbar.width]
1242
        sub     ebx, 25*5+10
1243
        mcall
1244
 
1245
        mov     ebx, [toolbar_abs_left]
1246
        shl     ebx, 16
1247
        add     ebx, ((4+25*0) SHL 16)+21
1248
        mov     ecx, [toolbar_abs_top]
1249
        shl     ecx, 16
1250
        add     ecx, (4 SHL 16)+21
1251
        mcall   SF_DEFINE_BUTTON, , , 'opn'+40000000h
1252
        add     ebx, (5+25*1) SHL 16
1253
        mcall    , , , 'bck'+40000000h
1254
        add     ebx, (0+25*1) SHL 16
1255
        mcall    , , , 'fwd'+40000000h
1256
        add     ebx, (5+25*1) SHL 16
1257
        mcall    , , , 'bgr'+40000000h
1258
        add     ebx, (0+25*1) SHL 16
1259
        mcall    , , , 'sld'+40000000h
1260
        add     ebx, (5+25*1) SHL 16
1261
        mcall    , , , 'scl'+40000000h
1262
        mov     ebx, [toolbar_abs_left]
1263
        add     ebx, [toolbar.width]
1264
        sub     ebx, 25*5+10
1265
        add     ebx, 5
1266
        shl     ebx, 16
1267
        mov     bl, 21
1268
        mcall   , , , 'flh'+40000000h
1269
        add     ebx, 25 SHL 16
1270
        mcall   , , , 'flv'+40000000h
1271
        add     ebx, 30 SHL 16
1272
        mcall   , , , 'rtr'+40000000h
1273
        add     ebx, 25 SHL 16
1274
        mcall   , , , 'rtl'+40000000h
1275
        add     ebx, 25 SHL 16
1276
        mcall   , , , 'flb'+40000000h
1277
 
1278
        mov     ebp, (numimages-1)*20
1279
 
1280
        mov     edx, [toolbar_abs_left]
1281
        shl     edx, 16
1282
        add     edx, [toolbar_abs_top]
1283
        add     edx, ((5+25*0) SHL 16)+5
1284
        mcall   65, buttons+openbtn   *20, <20, 20>, , 8, palette
1285
        add     edx, ((5+25*1) SHL 16)+0
1286
        mcall     , buttons+backbtn   *20
1287
        add     edx, ((0+25*1) SHL 16)+0
1288
        mcall     , buttons+forwardbtn*20
1289
        add     edx, ((5+25*1) SHL 16)+0
1290
        mcall     , buttons+bgrbtn    *20
1291
        add     edx, ((0+25*1) SHL 16)+0
1292
        mcall     , buttons+slidebtn  *20
1293
        add     edx, ((5+25*1) SHL 16)+0
1294
;        mcall     , buttons+scalebtn  *20
1295
        mov     [scale_button_xy], edx
1296
        call    draw_scale_button
1297
        mov     edx, [client_abs_left]
1298
        add     edx, [client.width]
1299
        sub     edx, 25*5+4
1300
        shl     edx, 16
1301
        add     edx, [client_abs_top]
1302
        add     edx, 5
1303
        mcall   , buttons+fliphorzbtn*20
1304
        add     edx, 25*65536
1305
        mcall   , buttons+flipvertbtn*20
1306
        add     edx, 30*65536
1307
        mcall   , buttons+rotcwbtn*20
1308
        add     edx, 25*65536
1309
        mcall   , buttons+rotccwbtn*20
1310
        add     edx, 25*65536
1311
        mcall   , buttons+rot180btn*20
1312
 
1313
.quit:
1314
        ret
1315
endp
1316
 
1317
 
1318
proc draw_canvas
1319
        push    ebx esi edi
1320
 
1321
        mov     ebx, [canvas_abs_left]
1322
        shl     ebx, 16
1323
        add     ebx, [canvas.width]
1324
        mov     ecx, [canvas_abs_top]
1325
        shl     ecx, 16
1326
        add     ecx, [view.top]
1327
;mov edx, 0xff0000
1328
        mcall   13, , , [bg_color]
1329
        mcall   13
1330
        mov     ecx, [view_abs_top]
1331
        add     ecx, [view.height]
1332
        shl     ecx, 16
1333
        add     ecx, [canvas.height]
1334
        sub     ecx, [view.top]
1335
        sub     ecx, [view.height]
1336
;mov edx, 0x00ff00
1337
        mcall   13, , , [bg_color]
1338
        mcall   13
1339
        mov     ebx, [canvas_abs_left]
1340
        shl     ebx, 16
1341
        add     ebx, [view.left]
1342
        mov     ecx, [canvas_abs_top]
1343
        shl     ecx, 16
1344
        add     ecx, [canvas.height]
1345
;mov edx, 0x0000ff
1346
;bg_color
1347
        mcall
1348
        mov     ebx, [view_abs_left]
1349
        add     ebx, [view.width]
1350
        shl     ebx, 16
1351
        mov     eax, [canvas.width]
1352
        sub     eax, [view.left]
1353
        sub     ebx, [view.width]
1354
        add     ebx, eax
1355
;mov edx, 0xffff00
1356
;bg_color
1357
        mcall   13
1358
@@:
1359
 
1360
        call    draw_view
1361
 
1362
        pop     edi esi ebx
1363
        ret
1364
endp
1365
 
1366
 
1367
proc draw_client
1368
        push    ebx esi edi
1369
 
1370
        test    [bShowToolbar], 1
1371
        jz      .toolbar_done
1372
        call    draw_toolbar
1373
.toolbar_done:
1374
        call    draw_work
1375
 
1376
        pop     edi esi ebx
1377
        ret
1378
endp
1379
 
1380
 
1381
proc draw_work
1382
        push    ebx esi edi
1383
 
1384
        mov     ebx, [work_abs_left]
1385
        shl     ebx, 16
1386
        add     ebx, [work.width]
1387
        inc     ebx
1388
        mov     ecx, [work_abs_top]
1389
        shl     ecx, 16
1390
        add     ecx, [canvas.top]
1391
;        mcall   13, , , 0xff0000
1392
        mcall   13, , , [bg_color]
1393
        mov     eax, [canvas.height]
1394
        ror     ecx, 16
1395
        add     ecx, eax
1396
        add     ecx, [canvas_padding]
1397
        ror     ecx, 16
1398
;        mcall   13, , , 0x00ff00
1399
        mcall   13, , , [bg_color]
1400
;        mcall   13
1401
 
1402
        mov     ebx, [work_abs_left]
1403
        shl     ebx, 16
1404
        add     ebx, [canvas.left]
1405
        mov     ecx, [work_abs_top]
1406
        add     ecx, [canvas_padding]
1407
        shl     ecx, 16
1408
        add     ecx, [canvas.height]
1409
;        mcall   13, , , 0x0000ff
1410
        mcall   13, , , [bg_color]
1411
;        mcall
1412
        mov     eax, [canvas.width]
1413
        ror     ebx, 16
1414
        add     ebx, eax
1415
        add     ebx, [canvas_padding]
1416
        ror     ebx, 16
1417
;        mcall   13, , , 0xffff00
1418
        mcall   13, , , [bg_color]
1419
;        mcall   13
1420
 
1421
        call    draw_canvas
1422
        call    draw_onimage_decorations
1423
 
1424
        mov     eax, 13
1425
        cmp     [need_scrollbar_v], 1
1426
        jnz     @f
1427
        cmp     [need_scrollbar_h], 1
1428
        jnz     @f
1429
        mov     ebx, [work_abs_left]
1430
        add     ebx, [work.width]
1431
        sub     ebx, SCROLL_WIDTH_SIZE
1432
        shl     ebx, 16
1433
        add     ebx, SCROLL_WIDTH_SIZE
1434
        inc     ebx
1435
        mov     ecx, [work_abs_top]
1436
        add     ecx, [work.height]
1437
        sub     ecx, SCROLL_WIDTH_SIZE
1438
        shl     ecx, 16
1439
        add     ecx, SCROLL_WIDTH_SIZE
1440
        inc     ecx
1441
        mov     edx, [bg_color]
1442
;        mov     edx, 0x00ffff
1443
        mcall
1444
@@:
1445
 
1446
        cmp     [need_scrollbar_v], 0
1447
        jz      .v_scrollbar_done
1448
        mov     eax, [client.left]
1449
        add     eax, [client.width]
1450
        sub     eax, SCROLL_WIDTH_SIZE
1451
        mov     [scroll_bar_data_vertical.start_x], ax
1452
        mov     eax, [toolbar.height]
1453
        add     eax, [client.top]
1454
        mov     [scroll_bar_data_vertical.start_y], ax
1455
        mov     eax, [canvas.height]
1456
        add     eax, [canvas_padding]
1457
        add     eax, [canvas_padding]
1458
        mov     [scroll_bar_data_vertical.size_y], ax
1459
        mov     [scroll_bar_data_vertical.all_redraw], 1
1460
        invoke  scrollbar_vert_draw, scroll_bar_data_vertical
1461
.v_scrollbar_done:
1462
 
1463
        cmp     [need_scrollbar_h], 0
1464
        jz      .h_scrollbar_done
1465
        mov     eax, [client.left]
1466
        mov     [scroll_bar_data_horizontal.start_x], ax
1467
        mov     eax, [client.top]
1468
        add     eax, [client.height]
1469
        sub     eax, SCROLL_WIDTH_SIZE
1470
        mov     [scroll_bar_data_horizontal.start_y], ax
1471
        mov     eax, [canvas.width]
1472
        add     eax, [canvas_padding]
1473
        add     eax, [canvas_padding]
1474
        mov     [scroll_bar_data_horizontal.size_x], ax
1475
        mov     [scroll_bar_data_horizontal.all_redraw], 1
1476
        invoke  scrollbar_hort_draw, scroll_bar_data_horizontal
1477
.h_scrollbar_done:
1478
 
1479
        pop     edi esi ebx
1480
        ret
1481
endp
1482
 
1483
 
1484
proc draw_onimage_decorations
1485
        bt      [window_style], 25
1486
        jc      @f
1487
        ; draw fullscreen decorations on image
1488
        call    draw_filename
1489
        call    draw_fullscreen_controls
1490
@@:
1491
        ret
1492
endp
1493
 
1494
 
1495
proc draw_filename
1496
        push    esi
1497
        mcall   4, <100, 65>, 0x40ffffff, window_header, [window_header_len], 0x008800
1498
        pop     esi
1499
        ret
1500
endp
1501
 
1502
 
1503
proc draw_fullscreen_controls
1504
        push    esi
1505
        mov     ebx, [canvas.width]
1506
        shr     ebx, 1
1507
        add     ebx, [canvas.left]
1508
        sub     ebx, 22
1509
        shl     ebx, 16
1510
        add     ebx, 20
1511
        mov     ecx, [canvas.height]
1512
        shr     ecx, 3
1513
        neg     ecx
1514
        add     ecx, [canvas.height]
1515
        add     ecx, [canvas.top]
1516
        shl     ecx, 16
1517
        add     ecx, 20
1518
        mcall   8, , , 'bck'+40000000h
1519
        add     ebx, 25 SHL 16
1520
        mcall   8, , , 'fwd'+40000000h
1521
        mov     edx, [canvas.width]
1522
        shr     edx, 1
1523
        add     edx, [canvas.left]
1524
        sub     edx, 22
1525
        shl     edx, 16
1526
        add     edx, [canvas.height]
1527
        shr     dx, 3
1528
        neg     dx
1529
        add     dx, word[canvas.height]
1530
        add     edx, [canvas.top]
1531
        mcall   65, buttons+backbtn*20, <20, 20>, , 8, palette
1532
        add     edx, 25 SHL 16
1533
        mcall   65, buttons+forwardbtn*20,      , , 8,
1534
        pop     esi
1535
        ret
1536
endp
1537
 
1538
 
1539
proc check_shortcut
1540
; in:   cl = scancode (from sysfn 2),
1541
;   eax = state of modifiers (from sysfn 66.3),
1542
;   edx -> shortcut descriptor
1543
; out:  ZF set <=> fail
1544
        cmp     cl, [edx+4]
1545
        jnz     .not
1546
        push    eax
1547
        mov     esi, [edx]
1548
        and     esi, 0xf
1549
        and     al, 3
1550
        call    dword[check_modifier_table+esi*4]
1551
        test    al, al
1552
        pop     eax
1553
        jnz     .not
1554
        push    eax
1555
        mov     esi, [edx]
1556
        shr     esi, 4
1557
        and     esi, 0xf
1558
        shr     al, 2
1559
        and     al, 3
1560
        call    dword[check_modifier_table+esi*4]
1561
        test    al, al
1562
        pop     eax
1563
        jnz     .not
1564
        push    eax
1565
        mov     esi, [edx]
1566
        shr     esi, 8
1567
        and     esi, 0xf
1568
        shr     al, 4
1569
        and     al, 3
1570
        call    dword[check_modifier_table+esi*4]
1571
        test    al, al
1572
        pop     eax
1573
;       jnz     .not
1574
.not:
1575
        ret
1576
endp
1577
 
1578
 
1579
check_modifier_0:
1580
        setnz   al
1581
        ret
1582
check_modifier_1:
1583
        setp    al
1584
        ret
1585
check_modifier_2:
1586
        cmp     al, 3
1587
        setnz   al
1588
        ret
1589
check_modifier_3:
1590
        cmp     al, 1
1591
        setnz   al
1592
        ret
1593
check_modifier_4:
1594
        cmp     al, 2
1595
        setnz   al
1596
        ret
1597
 
1598
; >edi = destination string
1599
; >eax = number
1600
proc bin2dec
1601
        push    ebx ecx edx esi
1602
 
1603
        mov     ebx, 10
1604
        xor     ecx, ecx
1605
@@:
1606
        xor     edx, edx
1607
        div     ebx
1608
        push    edx
1609
        inc     ecx
1610
        test    eax, eax
1611
        jnz     @b
1612
 
1613
@@:
1614
        pop     eax
1615
        add     eax, '0'
1616
        stosb
1617
        inc     [window_header_len]
1618
        dec     ecx
1619
        jnz     @b
1620
 
1621
        pop     esi edx ecx ebx
1622
        ret
1623
endp
1624
 
1625
 
1626
; fills window_header with window title
1627
; window title is generated as '[k/n]  - Kolibri Image Viewer'
1628
; n = total files in dir
1629
; k = current file index
1630
proc generate_window_header
1631
        push    eax ebx esi edi
1632
        mov     esi, [last_name_component]
1633
        mov     edi, window_header
1634
        mov     [window_header_len], 4    ; [,/,],
1635
 
1636
        mov     byte[edi], '['
1637
        inc     edi
1638
        mov     eax, [cur_file_idx]
1639
        inc     eax
1640
        call    bin2dec
1641
        mov     byte[edi], '/'
1642
        inc     edi
1643
        mov     eax, [directory_ptr]
1644
        mov     eax, [eax+4]
1645
        call    bin2dec
1646
        mov     word[edi], '] '
1647
        add     edi, 2
1648
 
1649
        ; add filename
1650
.next_symbol:
1651
        lodsb
1652
        test    al, al
1653
        jz      @f
1654
        stosb
1655
        inc     [window_header_len]
1656
        cmp     edi, window_header+256
1657
        jb      .next_symbol
1658
.overflow:
1659
        mov     dword[edi-4], '...'
1660
.ret:
1661
        pop     edi esi ebx eax
1662
        ret
1663
@@:
1664
        mov     esi, s_header
1665
@@:
1666
        lodsb
1667
        stosb
1668
        test    al, al
1669
        jz      .ret
1670
        cmp     edi, window_header+256
1671
        jb      @b
1672
        jmp     .overflow
1673
endp
1674
 
1675
 
1676
proc scale_none_calc
1677
        push    ebx
1678
 
1679
        mov     [scale_mode], LIBIMG_SCALE_NONE
1680
 
1681
        mov     eax, [cur_image]
1682
        cmp     eax, [orig_image]
1683
        jz      @f
1684
        invoke  img.destroy, eax
1685
@@:
1686
        mov     eax, [orig_image]
1687
        mov     [cur_image], eax
1688
        mov     [cur_frame], eax
1689
        mov     ebx, eax
1690
 
1691
        mov     [need_scrollbar_v], 0
1692
        mov     [need_scrollbar_h], 0
1693
 
1694
        mov     eax, [ebx+Image.Width]
1695
        cmp     eax, [canvas.width]
1696
        jbe     @f
1697
        sub     [canvas.height], SCROLL_WIDTH_SIZE+1
1698
        mov     [need_scrollbar_h], 1
1699
@@:
1700
        mov     eax, [ebx+Image.Height]
1701
        cmp     eax, [canvas.height]
1702
        jbe     @f
1703
        sub     [canvas.width], SCROLL_WIDTH_SIZE+1
1704
        mov     [need_scrollbar_v], 1
1705
@@:
1706
        cmp     [need_scrollbar_h], 1
1707
        jz      @f
1708
        mov     eax, [ebx+Image.Width]
1709
        cmp     eax, [canvas.width]
1710
        jbe     @f
1711
        sub     [canvas.height], SCROLL_WIDTH_SIZE+1
1712
        mov     [need_scrollbar_h], 1
1713
@@:
1714
 
1715
 
1716
        mov     eax, [ebx+Image.Width]
1717
        cmp     eax, [canvas.width]
1718
        jbe     @f
1719
        mov     eax, [canvas.width]
1720
@@:
1721
        mov     [view.width], eax
1722
        mov     [pict.width], eax
1723
 
1724
        mov     eax, [ebx+Image.Height]
1725
        cmp     eax, [canvas.height]
1726
        jbe     @f
1727
        mov     eax, [canvas.height]
1728
@@:
1729
        mov     [view.height], eax
1730
        mov     [pict.height], eax
1731
 
1732
        mov     eax, [canvas.width]
1733
        sub     eax, [view.width]
1734
        sar     eax, 1
1735
        mov     [view.left], eax
1736
        mov     eax, [canvas.height]
1737
        sub     eax, [view.height]
1738
        sar     eax, 1
1739
        mov     [view.top], eax
1740
 
1741
        mov     eax, [ebx+Image.Width]
1742
        sub     eax, [pict.width]
1743
        sar     eax, 1
1744
        mov     [pict.left], eax
1745
        mov     eax, [ebx+Image.Height]
1746
        sub     eax, [pict.height]
1747
        sar     eax, 1
1748
        mov     [pict.top], eax
1749
 
1750
 
1751
        mov     eax, [ebx+Image.Height]
1752
        mov     [scroll_bar_data_vertical.max_area], eax
1753
        mov     eax, [pict.height]
1754
        mov     [scroll_bar_data_vertical.cur_area], eax
1755
        mov     eax, [pict.top]
1756
        mov     [scroll_bar_data_vertical.position], eax
1757
 
1758
        mov     eax, [ebx+Image.Width]
1759
        mov     [scroll_bar_data_horizontal.max_area], eax
1760
        mov     eax, [pict.width]
1761
        mov     [scroll_bar_data_horizontal.cur_area], eax
1762
        mov     eax, [pict.left]
1763
        mov     [scroll_bar_data_horizontal.position], eax
1764
 
1765
        pop     ebx
1766
        ret
1767
endp
1768
 
1769
 
1770
proc scale_fit_min_calc
1771
        push    ebx
1772
 
1773
        mov     [need_scrollbar_v], 0
1774
        mov     [need_scrollbar_h], 0
1775
        mov     [scroll_bar_data_vertical.position], 0
1776
        mov     [scroll_bar_data_horizontal.position], 0
1777
 
1778
        mov     eax, [orig_image]
1779
        cmp     [eax+Image.Type], Image.bpp24
1780
        jz      @f
1781
        cmp     [eax+Image.Type], Image.bpp32
1782
        jz      @f
1783
        cmp     [eax+Image.Type], Image.bpp8g
1784
        jz      @f
1785
        invoke  img.convert, eax, 0, Image.bpp24, 0, 0
1786
        test    eax, eax
1787
;       jz      .error
1788
        push    eax
1789
        invoke  img.destroy, [orig_image]
1790
        pop     eax
1791
        mov     [orig_image], eax
1792
        mov     [cur_image], eax
1793
        mov     [cur_frame], eax
1794
@@:
1795
 
1796
        mov     eax, [orig_image]
1797
        mov     ecx, [eax+Image.Height]
1798
        mov     eax, [eax+Image.Width]
1799
        cmp     eax, [canvas.width]
1800
        ja      .get_size
1801
        cmp     ecx, [canvas.height]
1802
        ja      .get_size
1803
        jmp     .got_size
1804
.get_size:
1805
        invoke  img.get_scaled_size, eax, ecx, LIBIMG_SCALE_FIT_MIN, [canvas.width], [canvas.height]
1806
.got_size:
1807
 
1808
        mov     [pict.top], 0
1809
        mov     [pict.left], 0
1810
 
1811
        cmp     eax, [canvas.width]
1812
        jbe     @f
1813
        mov     eax, [canvas.width]
1814
@@:
1815
        mov     [view.width], eax
1816
        mov     [pict.width], eax
1817
        neg     eax
1818
        add     eax, [canvas.width]
1819
        shr     eax, 1
1820
        mov     [view.left], eax
1821
 
1822
        mov     eax, ecx
1823
        cmp     eax, [canvas.height]
1824
        jbe     @f
1825
        mov     eax, [canvas.height]
1826
@@:
1827
        mov     [view.height], eax
1828
        mov     [pict.height], eax
1829
        neg     eax
1830
        add     eax, [canvas.height]
1831
        shr     eax, 1
1832
        mov     [view.top], eax
1833
 
1834
 
1835
        pop     ebx
1836
        ret
1837
endp
1838
 
1839
 
1840
; eax: new scaling mode
1841
; z/Z - not/changed
1842
proc set_scale_mode
1843
        cmp     eax, [scale_mode]
1844
        mov     [scale_mode], eax
1845
        setnz   [bScaleModeChanged]
1846
        ret
1847
endp
1848
 
1849
proc move_pictport _dx, _dy
1850
locals
1851
        new_left dd ?
1852
        new_top  dd ?
1853
endl
1854
        push    ebx ecx
1855
 
1856
        mov     ebx, [cur_image]
1857
.x:
1858
        mov     eax, [pict.left]
1859
        add     eax, [_dx]
1860
        cmp     eax, 0
1861
        jge     @f
1862
        mov     [new_left], 0
1863
        jmp     .xdone
1864
@@:
1865
        mov     ecx, eax
1866
        add     eax, [pict.width]
1867
        cmp     eax, [ebx+Image.Width]
1868
        ja      @f
1869
        mov     [new_left], ecx
1870
        jmp     .xdone
1871
@@:
1872
        mov     eax, [ebx+Image.Width]
1873
        sub     eax, [pict.width]
1874
        mov     [new_left], eax
1875
        jmp     .xdone
1876
.xdone:
1877
 
1878
.y:
1879
        mov     eax, [pict.top]
1880
        add     eax, [_dy]
1881
        cmp     eax, 0
1882
        jge     @f
1883
        mov     [new_top], 0
1884
        jmp     .ydone
1885
@@:
1886
        mov     ecx, eax
1887
        add     eax, [pict.height]
1888
        cmp     eax, [ebx+Image.Height]
1889
        ja      @f
1890
        mov     [new_top], ecx
1891
        jmp     .ydone
1892
@@:
1893
        mov     eax, [ebx+Image.Height]
1894
        sub     eax, [pict.height]
1895
        mov     [new_top], eax
1896
        jmp     .ydone
1897
.ydone:
1898
 
1899
        xor     eax, eax
1900
        mov     ecx, [new_left]
1901
        mov     edx, [new_top]
1902
 
1903
        cmp     ecx, [pict.left]
1904
        setnz   al
1905
        shl     eax, 8
1906
 
1907
        cmp     edx, [pict.top]
1908
        setnz   al
1909
 
1910
        mov     [pict.left], ecx
1911
        mov     [pict.top], edx
1912
 
1913
        pop     ecx ebx
1914
        ret
1915
endp
1916
 
1917
 
1918
proc update_scrollbars _xxhv
1919
        mov     eax, [_xxhv]
1920
 
1921
        test    ah, ah
1922
        jz      .no_h_scroll
1923
        push    eax
1924
        mov     [scroll_bar_data_horizontal.all_redraw], 0
1925
        mov     eax, [pict.left]
1926
        mov     [scroll_bar_data_horizontal.position], eax
1927
        invoke  scrollbar_hort_draw, scroll_bar_data_horizontal
1928
        pop     eax
1929
.no_h_scroll:
1930
        test    al, al
1931
        jz      .no_v_scroll
1932
        push    eax
1933
        mov     [scroll_bar_data_vertical.all_redraw], 0
1934
        mov     eax, [pict.top]
1935
        mov     [scroll_bar_data_vertical.position], eax
1936
        invoke  scrollbar_vert_draw, scroll_bar_data_vertical
1937
        pop     eax
1938
.no_v_scroll:
1939
 
1940
        ret
1941
endp
1942
 
1943
 
1944
proc merge_icons_to_single_img _img
1945
        push    ebx esi edi
1946
 
1947
        mov     edx, [_img]
1948
        mov     eax, [edx+Image.Width]
1949
        mov     ecx, [edx+Image.Height]
1950
.next:
1951
        cmp     [edx+Image.Next], 0
1952
        jz      .got_sizes
1953
        inc     eax
1954
        mov     edx, [edx+Image.Next]
1955
        add     eax, [edx+Image.Width]
1956
        cmp     ecx, [edx+Image.Height]
1957
        jae     @f
1958
        mov     ecx, [edx+Image.Height]
1959
@@:
1960
        jmp     .next
1961
 
1962
.got_sizes:
1963
        invoke  img.create, eax, ecx, Image.bpp32
1964
        test    eax, eax
1965
        jz      .error
1966
        mov     ebx, eax
1967
 
1968
        mov     eax, [bg_color]
1969
        mov     edi, [ebx+Image.Data]
1970
        mov     ecx, [ebx+Image.Width]
1971
        imul    ecx, [ebx+Image.Height]
1972
        rep stosd
1973
 
1974
        mov     eax, [_img]
1975
        cmp     [eax+Image.Type], Image.bpp32
1976
        jz      @f
1977
        invoke  img.convert, eax, 0, Image.bpp32, 0, 0
1978
        test    eax, eax
1979
        jz      .error
1980
        push    eax
1981
        invoke  img.destroy, [_img]
1982
        pop     eax
1983
@@:
1984
        mov     esi, eax
1985
        xor     edi, edi
1986
.next_img:
1987
        stdcall put_img_on_img, ebx, esi, edi, 0
1988
        add     edi, [esi+Image.Width]
1989
        inc     edi
1990
        cmp     [esi+Image.Next], 0
1991
        jz      @f
1992
        mov     esi, [esi+Image.Next]
1993
        jmp     .next_img
1994
@@:
1995
        invoke  img.destroy, esi
1996
        mov     eax, ebx
1997
        jmp     .quit
1998
 
1999
.error:
2000
        xor     eax, eax
2001
.quit:
2002
        pop     edi esi ebx
2003
        ret
2004
endp
2005
 
2006
 
2007
proc put_img_on_img _bottom, _top, _x, _y
2008
locals
2009
        img_height dd ?
2010
endl
2011
        push    ebx esi edi
2012
 
2013
        mov     ebx, [_bottom]
2014
        mov     edx, [_top]
2015
        mov     eax, [edx+Image.Height]
2016
        mov     [img_height], eax
2017
        mov     esi, [edx+Image.Data]
2018
        mov     edi, [ebx+Image.Data]
2019
        mov     eax, [_y]
2020
        imul    eax, [ebx+Image.Width]
2021
        add     eax, [_x]
2022
        shl     eax, 2
2023
        add     edi, eax
2024
.next_line:
2025
        mov     ecx, [edx+Image.Width]
2026
        rep movsd
2027
        mov     eax, [ebx+Image.Width]
2028
        sub     eax, [edx+Image.Width]
2029
        shl     eax, 2
2030
        add     edi, eax
2031
        dec     [img_height]
2032
        jnz     .next_line
2033
 
2034
        pop     edi esi ebx
2035
        ret
2036
endp
2037
 
2038
 
2039
proc copy_box _src, _dst
2040
        pushad
2041
 
2042
        mov     esi, [_src]
2043
        mov     edi, [_dst]
2044
        mov     ecx, 4
2045
        rep movsd
2046
 
2047
        popad
2048
        ret
2049
endp
2050
 
2051
 
2052
proc cmp_box _a, _b
2053
        pushad
2054
 
2055
        mov     esi, [_a]
2056
        mov     edi, [_b]
2057
        mov     ecx, 4
2058
        rep cmpsd
2059
 
2060
        popad
2061
        ret
2062
endp
2063
 
2064
 
2065
proc recalc_client
2066
        stdcall copy_box, toolbar, toolbar_prev
2067
        mov     [toolbar.left], 0
2068
        mov     [toolbar.top], 0
2069
        mov     eax, [client.width]
2070
        mov     [toolbar.width], eax
2071
        mov     [toolbar.height], 0
2072
        cmp     [bShowToolbar], 1
2073
        jnz     @f
2074
        mov     [toolbar.height], TOOLBAR_HEIGHT
2075
@@:
2076
 
2077
        mov     eax, [toolbar.top]
2078
        add     eax, [client_abs_top]
2079
        mov     [toolbar_abs_top], eax
2080
        mov     eax, [toolbar.left]
2081
        add     eax, [client_abs_left]
2082
        mov     [toolbar_abs_left], eax
2083
 
2084
        test    [bFirstWinDraw], 1
2085
        jnz     .recalc_toolbar
2086
        stdcall cmp_box, toolbar, toolbar_prev
2087
        jnz     .recalc_toolbar
2088
        test    [bNewImage], 1
2089
        jnz     .recalc_toolbar
2090
        jmp     .recalc_toolbar_done
2091
.recalc_toolbar:
2092
        stdcall recalc_toolbar
2093
.recalc_toolbar_done:
2094
 
2095
        stdcall copy_box, work, work_prev
2096
        xor     ecx, ecx
2097
        test    [bShowToolbar], 1
2098
        jz      @f
2099
        mov     ecx, [toolbar.height]
2100
@@:
2101
        mov     eax, ecx
2102
        mov     [work.top], eax
2103
        mov     eax, [client.height]
2104
        sub     eax, ecx
2105
        mov     [work.height], eax
2106
        mov     [work.left], 0
2107
        mov     eax, [client.width]
2108
        mov     [work.width], eax
2109
 
2110
        mov     eax, [work.top]
2111
        add     eax, [client_abs_top]
2112
        mov     [work_abs_top], eax
2113
        mov     eax, [work.left]
2114
        add     eax, [client_abs_left]
2115
        mov     [work_abs_left], eax
2116
 
2117
        test    [bFirstWinDraw], 1
2118
        jnz     .recalc_work
2119
        test    [bNewImage], 1
2120
        jnz     .recalc_work
2121
        stdcall cmp_box, work, work_prev
2122
        jnz     .recalc_work
2123
        jmp     .recalc_work_done
2124
.recalc_work:
2125
        stdcall recalc_work
2126
.recalc_work_done:
2127
 
2128
        ret
2129
endp
2130
 
2131
 
2132
proc recalc_toolbar
2133
 
2134
        ret
2135
endp
2136
 
2137
 
2138
proc recalc_window
2139
        stdcall copy_box, client, client_prev
2140
        test    [bSlideShow], 1
2141
        jz      .no_slide_show
2142
.slide_show:
2143
        mov     [client.left], 0
2144
        mov     [client.top], 0
2145
        mov     eax, [procinfo.box.width]
2146
        mov     [client.width], eax
2147
        mov     eax, [procinfo.box.height]
2148
        mov     [client.height], eax
2149
        jmp     .calc_abs
2150
.no_slide_show:
2151
        mcall   SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
2152
        mov     [client.top], eax
2153
        neg     eax
2154
        add     eax, [procinfo.box.height]
2155
        sub     eax, 5
2156
        mov     [client.height], eax
2157
        mov     [client.left], 5
2158
        mov     eax, [procinfo.box.width]
2159
        sub     eax, 10
2160
        mov     [client.width], eax
2161
 
2162
.calc_abs:
2163
        mov     eax, [client.top]
2164
        mov     [client_abs_top], eax
2165
        mov     eax, [client.left]
2166
        mov     [client_abs_left], eax
2167
 
2168
        stdcall cmp_box, client, client_prev
2169
        jnz     .recalc_client
2170
        test    [bNewImage], 1
2171
        jnz     .recalc_client
2172
        test    [bToggleToolbar], 1
2173
        jnz     .recalc_client
2174
        jmp     .recalc_client_done
2175
.recalc_client:
2176
        stdcall recalc_client
2177
.recalc_client_done:
2178
 
2179
        ret
2180
endp
2181
 
2182
 
2183
proc recalc_work
2184
        stdcall copy_box, canvas, canvas_prev
2185
        mov     eax, [work.left]
2186
        add     eax, [canvas_padding]
2187
        mov     [canvas.left], eax
2188
        mov     eax, [work.width]
2189
        sub     eax, [canvas_padding]
2190
        sub     eax, [canvas_padding]
2191
        inc     eax
2192
        mov     [canvas.width], eax
2193
        mov     eax, [canvas_padding]
2194
        mov     [canvas.top], eax
2195
        mov     eax, [work.height]
2196
        sub     eax, [canvas_padding]
2197
        sub     eax, [canvas_padding]
2198
        inc     eax
2199
        mov     [canvas.height], eax
2200
 
2201
        mov     eax, [canvas.top]
2202
        add     eax, [work_abs_top]
2203
        mov     [canvas_abs_top], eax
2204
        mov     eax, [canvas.left]
2205
        add     eax, [work_abs_left]
2206
        mov     [canvas_abs_left], eax
2207
 
2208
        test    [bFirstWinDraw], 1
2209
        jnz     .recalc_canvas
2210
        test    [bNewImage], 1
2211
        jnz     .recalc_canvas
2212
        stdcall cmp_box, canvas, canvas_prev
2213
        jnz     .recalc_canvas
2214
        cmp     [bScaleModeChanged], 0
2215
        jnz     .recalc_canvas
2216
        jmp     .recalc_canvas_done
2217
.recalc_canvas:
2218
        stdcall recalc_canvas
2219
.recalc_canvas_done:
2220
        ret
2221
endp
2222
 
2223
 
2224
proc recalc_canvas
2225
        stdcall copy_box, view, view_prev
2226
        mov     eax, [scale_mode]
2227
        call    [scale_mode_calc+eax*4]
2228
 
2229
        mov     eax, [view.top]
2230
        add     eax, [canvas_abs_top]
2231
        mov     [view_abs_top], eax
2232
        mov     eax, [view.left]
2233
        add     eax, [canvas_abs_left]
2234
        mov     [view_abs_left], eax
2235
 
2236
        ret
2237
endp
2238
 
2239
;-----------------------------------------------------------------------------
2240
DATA
2241
 
2242
s_header        db ' - Kolibri Image Viewer',0
2243
window_style    dd 0x53FFFFFF
2244
window          BOX 100, 150, 0, 0  ; left top width height
2245
window_prev     BOX 0, 0, 0, 0
2246
window_save     BOX 0, 0, 0, 0  ; restore after slide show
2247
client          BOX 0, 0, 0, 0
2248
client_prev     BOX 0, 0, 0, 0
2249
client_abs_top  dd ?
2250
client_abs_left dd ?
2251
toolbar         BOX 0, 0, 0, 0
2252
toolbar_prev    BOX 0, 0, 0, 0
2253
toolbar_abs_top dd ?
2254
toolbar_abs_left dd ?
2255
work            BOX 0, 0, 0, 0
2256
work_prev       BOX 0, 0, 0, 0
2257
work_abs_top    dd ?
2258
work_abs_left   dd ?
2259
canvas          BOX 0, 0, 0, 0
2260
canvas_prev     BOX 0, 0, 0, 0
2261
canvas_abs_top  dd ?
2262
canvas_abs_left dd ?
2263
view            BOX -1, -1, 0, 0
2264
view_prev       BOX -1, -1, 0, 0
2265
view_abs_top    dd ?
2266
view_abs_left   dd ?
2267
pict            BOX 0, 0, 0, 0
2268
canvas_padding  dd 5
2269
bg_color        dd 0x00ffffff
2270
scale_mode      dd LIBIMG_SCALE_FIT_MIN
2271
pict_drag       dd 0
2272
scroll_v_drag   dd 0
2273
scroll_h_drag   dd 0
2274
 
2275
mouse_buttons    dd 0
2276
mouse_pos        dd 0
2277
need_scrollbar_v dd 0
2278
need_scrollbar_h dd 0
2279
 
2280
pict_moved      dd 0
2281
 
2282
;-----------------------------------------------------------------------------
2283
align   4
2284
scroll_bar_data_vertical:
2285
.x:
2286
.size_x         dw SCROLL_WIDTH_SIZE
2287
.start_x        dw 1
2288
.y:
2289
.size_y         dw 100
2290
.start_y        dw 0
2291
.btn_high       dd SCROLL_WIDTH_SIZE
2292
.type           dd 0    ;+12
2293
.max_area       dd 100  ;+16
2294
.cur_area       dd 10   ;+20
2295
.position       dd 0    ;+24
2296
.bckg_col       dd 0xAAAAAA     ;+28
2297
.frnt_col       dd 0xCCCCCC     ;+32
2298
.line_col       dd 0    ;+36
2299
.redraw         dd 0    ;+40
2300
.delta          dw 0    ;+44
2301
.delta2         dw 0    ;+46
2302
.run_x:
2303
.r_size_x       dw 0    ;+48
2304
.r_start_x      dw 0    ;+50
2305
.run_y:
2306
.r_size_y       dw 0    ;+52
2307
.r_start_y      dw 0    ;+54
2308
.m_pos          dd 0    ;+56
2309
.m_pos_2        dd 0    ;+60
2310
.m_keys         dd 0    ;+64
2311
.run_size       dd 0    ;+68
2312
.position2      dd 0    ;+72
2313
.work_size      dd 0    ;+76
2314
.all_redraw     dd 0    ;+80
2315
.ar_offset      dd KEY_MOVE_PIXELS   ;+84
2316
;-----------------------------------------------------------------------------
2317
align   4
2318
scroll_bar_data_horizontal:
2319
.x:
2320
.size_x         dw 0    ;+0
2321
.start_x        dw 0    ;+2
2322
.y:
2323
.size_y         dw SCROLL_WIDTH_SIZE    ;+4
2324
.start_y        dw 0    ;+6
2325
.btn_high       dd SCROLL_WIDTH_SIZE    ;+8
2326
.type           dd 0    ;+12
2327
.max_area       dd 50   ;+16
2328
.cur_area       dd 50   ;+20
2329
.position       dd 0    ;+24
2330
.bckg_col       dd 0xAAAAAA     ;+28
2331
.frnt_col       dd 0xCCCCCC     ;+32
2332
.line_col       dd 0    ;+36
2333
.redraw         dd 0    ;+40
2334
.delta          dw 0    ;+44
2335
.delta2         dw 0    ;+46
2336
.run_x:
2337
.r_size_x       dw 0    ;+48
2338
.r_start_x      dw 0    ;+50
2339
.run_y:
2340
.r_size_y       dw 0    ;+52
2341
.r_start_y      dw 0    ;+54
2342
.m_pos          dd 0    ;+56
2343
.m_pos_2        dd 0    ;+60
2344
.m_keys         dd 0    ;+64
2345
.run_size       dd 0    ;+68
2346
.position2      dd 0    ;+72
2347
.work_size      dd 0    ;+76
2348
.all_redraw     dd 0    ;+80
2349
.ar_offset      dd KEY_MOVE_PIXELS      ;+84
2350
;-----------------------------------------------------------------------------
2351
align 4
2352
@IMPORT:
2353
 
2354
library                           \
2355
        libgfx  , 'libgfx.obj'  , \
2356
        libimg  , 'libimg.obj'  , \
2357
        libini  , 'libini.obj'  , \
2358
        sort    , 'sort.obj'    , \
2359
        proc_lib, 'proc_lib.obj', \
2360
        box_lib , 'box_lib.obj'
2361
 
2362
 
2363
import libgfx                         , \
2364
        libgfx.init  , 'lib_init'     , \
2365
        gfx.open     , 'gfx_open'     , \
2366
        gfx.close    , 'gfx_close'    , \
2367
        gfx.pen.color, 'gfx_pen_color', \
2368
        gfx.line     , 'gfx_line'
2369
 
2370
import libimg                                     , \
2371
        libimg.init        , 'lib_init'           , \
2372
        img.from_file      , 'img_from_file'      , \
2373
        img.to_rgb2        , 'img_to_rgb2'        , \
2374
        img.create         , 'img_create'         , \
2375
        img.flip           , 'img_flip'           , \
2376
        img.rotate         , 'img_rotate'         , \
2377
        img.destroy        , 'img_destroy'        , \
2378
        img.scale          , 'img_scale'          , \
2379
        img.get_scaled_size, 'img_get_scaled_size', \
2380
        img.convert        , 'img_convert'        , \
2381
        img.draw           , 'img_draw'
2382
 
2383
import libini                               , \
2384
        ini_get_shortcut, 'ini_get_shortcut', \
2385
        ini_get_int,      'ini_get_int',\
2386
        ini_set_int,      'ini_set_int',\
2387
        ini_set_str,      'ini_set_str'
2388
 
2389
import sort                  ,\
2390
        sort.START, 'START'  ,\
2391
        SortDir   , 'SortDir',\
2392
        strcmpi   , 'strcmpi'
2393
 
2394
import proc_lib                             ,\
2395
        OpenDialog_Init , 'OpenDialog_init' ,\
2396
        OpenDialog_Start, 'OpenDialog_start'
2397
 
2398
import box_lib                                   ,\
2399
        scrollbar_vert_draw , 'scrollbar_v_draw' ,\
2400
        scrollbar_vert_mouse, 'scrollbar_v_mouse',\
2401
        scrollbar_hort_draw , 'scrollbar_h_draw' ,\
2402
        scrollbar_hort_mouse, 'scrollbar_h_mouse'
2403
 
2404
bFirstWinDraw     db 1
2405
bSlideShow        db 0
2406
bToggleSlideShow  db 0
2407
bShowToolbar      db 1
2408
bShowToolbarSave  db 0  ; to restore state when return from slide show
2409
bToggleToolbar    db 0
2410
bScaleModeChanged db 0
2411
bNewImage         db 0
2412
;-----------------------------------------------------------------------------
2413
 
2414
virtual at 0
2415
file 'kivicons.bmp':0xA,4
2416
load offbits dword from 0
2417
end virtual
2418
numimages = 11
2419
openbtn = 0
2420
backbtn = 1
2421
forwardbtn = 2
2422
bgrbtn = 3
2423
fliphorzbtn = 4
2424
flipvertbtn = 5
2425
rotcwbtn = 6
2426
rotccwbtn = 7
2427
rot180btn = 8
2428
slidebtn = 9
2429
scalebtn = 10
2430
 
2431
palette:
2432
    file 'kivicons.bmp':0x36,offbits-0x36
2433
buttons:
2434
    file 'kivicons.bmp':offbits
2435
repeat 10
2436
y = %-1
2437
z = 20-%
2438
repeat numimages*5
2439
load a dword from $ - numimages*20*20 + numimages*20*y + (%-1)*4
2440
load b dword from $ - numimages*20*20 + numimages*20*z + (%-1)*4
2441
store  dword a at $ - numimages*20*20 + numimages*20*z + (%-1)*4
2442
store  dword b at $ - numimages*20*20 + numimages*20*y + (%-1)*4
2443
end repeat
2444
end repeat
2445
 
2446
inifilename db  '/sys/settings/app.ini',0
2447
aKivSection  db  'Kiv',0
2448
aNext       db  'Next',0
2449
aPrev       db  'Prev',0
2450
aSlide      db  'SlideShow',0
2451
aTglbar     db  'ToggleBar',0
2452
aWinX       db  'WinX',0
2453
aWinY       db  'WinY',0
2454
aWinW       db  'WinW',0
2455
aWinH       db  'WinH',0
2456
 
2457
inifileeskin db '/sys/settings/system.ini',0
2458
amain       db 'style',0
2459
aprogram    db 'bg_program',0
2460
aparam      db 'bg_param',0
2461
 
2462
align 4
2463
check_modifier_table:
2464
    dd  check_modifier_0
2465
    dd  check_modifier_1
2466
    dd  check_modifier_2
2467
    dd  check_modifier_3
2468
    dd  check_modifier_4
2469
 
2470
;---------------------------------------------------------------------
2471
align 4
2472
OpenDialog_data:
2473
.type                   dd 0
2474
.procinfo               dd procinfo                             ; +4
2475
.com_area_name          dd communication_area_name              ; +8
2476
.com_area               dd 0                                    ; +12
2477
.opendir_path           dd temp_dir_path                        ; +16
2478
.dir_default_path       dd communication_area_default_path      ; +20
2479
.start_path             dd open_dialog_path                     ; +24
2480
.draw_window            dd draw_window                          ; +28
2481
.status                 dd 0                                    ; +32
2482
.openfile_path          dd path                                 ; openfile_path ; +36
2483
.filename_area          dd 0                                    ; +40
2484
.filter_area            dd Filter
2485
.x:
2486
.x_size                 dw 420                                  ; +48 ; Window X size
2487
.x_start                dw 10                                   ; +50 ; Window X position
2488
.y:
2489
.y_size                 dw 320                                  ; +52 ; Window y size
2490
.y_start                dw 10                                   ; +54 ; Window Y position
2491
 
2492
communication_area_name:
2493
    db 'FFFFFFFF_open_dialog',0
2494
 
2495
open_dialog_path:
2496
if __nightbuild eq yes
2497
    db '/sys/MANAGERS/opendial',0
2498
else
2499
    db '/sys/File Managers/opendial',0
2500
end if
2501
communication_area_default_path:
2502
    db '/rd/1',0
2503
 
2504
Filter:
2505
dd Filter.end-Filter
2506
.1:
2507
db 'BMP',0
2508
db 'GIF',0
2509
db 'JPG',0
2510
db 'JPEG',0
2511
db 'JPE',0
2512
db 'PNG',0
2513
db 'ICO',0
2514
db 'CUR',0
2515
db 'TGA',0
2516
db 'PCX',0
2517
db 'XCF',0
2518
db 'PBM',0
2519
db 'PGM',0
2520
db 'PNM',0
2521
db 'PPM',0
2522
db 'TIF',0
2523
db 'TIFF',0
2524
db 'WBMP',0
2525
db 'WEBP',0
2526
db 'XBM',0
2527
.end:
2528
db 0
2529
 
2530
draw_window_fake:
2531
        ret
2532
;------------------------------------------------------------------------------
2533
scale_mode_calc dd scale_none_calc, 0, 0, 0, scale_fit_min_calc
2534
 
2535
scale_none_mod    dd 0
2536
scale_none_key    dd 13 ; '='
2537
scale_fit_min_mod dd 0
2538
scale_fit_min_key dd 17 ; 'w'
2539
 
2540
move_pictport_left_1_mod dd 0
2541
move_pictport_left_1_key dd 35 ; 'h'
2542
move_pictport_left_2_mod dd 0
2543
move_pictport_left_2_key dd 75 ; arrow left
2544
 
2545
move_pictport_right_1_mod dd 0
2546
move_pictport_right_1_key dd 38 ; 'l'
2547
move_pictport_right_2_mod dd 0
2548
move_pictport_right_2_key dd 77 ; arrow right
2549
 
2550
move_pictport_up_1_mod dd 0
2551
move_pictport_up_1_key dd 37 ; 'k'
2552
move_pictport_up_2_mod dd 0
2553
move_pictport_up_2_key dd 72 ; arrow up
2554
 
2555
move_pictport_down_1_mod dd 0
2556
move_pictport_down_1_key dd 36 ; 'j'
2557
move_pictport_down_2_mod dd 0
2558
move_pictport_down_2_key dd 80 ; arrow down
2559
 
2560
;shift_left_down_mod
2561
 
2562
;include_debug_strings
2563
 
2564
readdir_fileinfo:
2565
    dd  1
2566
    dd  0
2567
    dd  0
2568
readblocks dd   0
2569
directory_ptr   dd 0
2570
curdir          rb 1024
2571
;------------------------------------------------------------------------------
2572
 
2573
I_END:
2574
align 4
2575
img_data_len    rd 1
2576
fh              rd 1
2577
orig_image      rd 1
2578
cur_image       rd 1
2579
files_num       rd 1
2580
cur_file_idx    rd 1
2581
cur_frame_time  rd 1
2582
cur_frame       rd 1
2583
 
2584
next_mod          rd 1
2585
next_key          rd 1
2586
prev_mod          rd 1
2587
prev_key          rd 1
2588
slide_mod         rd 1
2589
slide_key         rd 1
2590
tglbar_mod        rd 1
2591
tglbar_key        rd 1
2592
 
2593
 
2594
last_name_component rd 1
2595
toolbar.height_old  rd 1
2596
 
2597
procinfo        process_information
2598
scale_button_xy dd ?
2599
scale_button_letter dd ?        ; i.e. 'x1',0
2600
align 16
2601
path            rb 4096
2602
window_header   rb 256
2603
window_header_len rd 1
2604
__params        rb 4096
2605
;---------------------------------------------------------------------
2606
sys_path rb 1024
2607
temp_dir_path:
2608
        rb 4096
2609
;---------------------------------------------------------------------
2610
    rb 4096
2611
stacktop:
2612
;---------------------------------------------------------------------
2613
E_END: