Subversion Repositories Kolibri OS

Rev

Rev 7784 | Rev 7862 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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