Subversion Repositories Kolibri OS

Rev

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

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