Subversion Repositories Kolibri OS

Rev

Rev 7660 | Rev 7784 | 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     [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.  
  258. key:
  259.         xor     esi, esi
  260. keyloop:
  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:
  329.         mov     eax, LIBIMG_SCALE_NONE
  330.         call    set_scale_mode
  331.         jz      @f
  332.         call    recalc_canvas
  333.     @@:
  334.         jmp     keyloop
  335.   .set_scale_fit_min:
  336.         mov     eax, LIBIMG_SCALE_FIT_MIN
  337.         call    set_scale_mode
  338.         jz      @f
  339.         call    recalc_work
  340.     @@:
  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
  372. keyloopdone:
  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
  387. next_or_prev_handler:
  388.         call    next_or_prev_image
  389.         jmp     redraw_all
  390.  
  391. red_update_frame:
  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
  403.  
  404. button:
  405.         mcall   SF_GET_BUTTON
  406.         shr     eax, 8
  407.  
  408.         ; flip horizontally
  409.         cmp     eax, 'flh'
  410.         jnz     .not_flh
  411.  
  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
  419.  
  420.         ; flip vertically
  421.   .not_flh:
  422.         cmp     eax, 'flv'
  423.         jnz     .not_flv
  424.  
  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
  432.  
  433.         ; flip both horizontally and vertically
  434.   .not_flv:
  435.         cmp     eax, 'flb'
  436.         jnz     .not_flb
  437.  
  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
  445.  
  446.         ; rotate left
  447.   .not_flb:
  448.         cmp     eax, 'rtl'
  449.         jnz     .not_rtl
  450.  
  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
  461.  
  462.         ; rotate right
  463.   .not_rtl:
  464.         cmp     eax, 'rtr'
  465.         jnz     .not_rtr
  466.  
  467.         push    ROTATE_90_CW
  468.         jmp     .rotate_common
  469.  
  470.         ; open new file
  471.   .not_rtr:
  472.         cmp     eax, 'opn'
  473.         jnz     @f
  474.  
  475. ; OpenDialog Open
  476.         push    dword OpenDialog_data
  477.         call    [OpenDialog_Start]
  478.  
  479.         cmp     [OpenDialog_data.status], 1
  480.         jnz     still
  481.  
  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
  488.  
  489.         pop     esi
  490.         push    esi
  491.         call    find_last_name_component
  492.  
  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
  505.     @@:
  506.         cmp     eax, 'bgr'
  507.         jnz     @f
  508.  
  509.         mcall   SF_BACKGROUND_SET, SSF_MODE_BG, 2 ; stretch by default
  510.         call    set_as_bgr
  511.         jmp     still
  512.  
  513.     @@:
  514.         cmp     eax, 'sld'
  515.         jnz     @f
  516.  
  517.         call    slide_show
  518.         jmp     redraw_all
  519.  
  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
  527.  
  528.         cmp     eax, 1
  529.         jnz     still
  530.  
  531. exit:
  532.         mcall   -1
  533.  
  534.  
  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
  541.  
  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
  553.  
  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
  563.  
  564.  
  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
  605. endp
  606.  
  607.  
  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
  617.  
  618.         push    eax
  619.         invoke  img.to_rgb2, esi, eax
  620.         pop     ecx
  621.         mcall   SF_BACKGROUND_SET, SSF_UNMAP_BG
  622.  
  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
  653.  
  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, ,
  680.         mov     eax, LIBIMG_SCALE_FIT_MIN
  681.         call    set_scale_mode
  682.  
  683.   .done:
  684.         pop     edi esi ebx
  685.         ret
  686. endp
  687.  
  688.  
  689. ; seek to ESI image files
  690. ; esi>0 means next file, esi<0 - prev file
  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
  792.  
  793.  
  794. load_directory:
  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
  889.   .not_3:
  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
  943.  
  944. free_directory:
  945.         mcall   68, 13, [directory_ptr]
  946.         and     [directory_ptr], 0
  947.         ret
  948.  
  949.  
  950. ; in: esi->full name (e.g. /path/to/file.png)
  951. ; out: [last_name_component]->last component (e.g. file.png)
  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
  969.  
  970.  
  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:
  984.  
  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
  1003.  
  1004.  
  1005. proc draw_window
  1006.         test    [bFirstWinDraw], 1
  1007.         jnz     .min_size_ok
  1008.  
  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.     @@:
  1027.  
  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
  1041.  
  1042.         mcall   SF_THREAD_INFO, procinfo, -1
  1043.         test    [procinfo.wnd_state], 0x04
  1044.         jnz     .nodraw
  1045.  
  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
  1063.  
  1064.   .recalc:
  1065.         stdcall recalc_window
  1066.   .recalc_done:
  1067.  
  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
  1075.  
  1076.         ret
  1077. endp
  1078.  
  1079.  
  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
  1105.  
  1106.   .scale_none:
  1107.  
  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
  1120.  
  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
  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
  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
  1493.  
  1494.  
  1495. check_modifier_0:
  1496.         setnz   al
  1497.         ret
  1498. check_modifier_1:
  1499.         setp    al
  1500.         ret
  1501. check_modifier_2:
  1502.         cmp     al, 3
  1503.         setnz   al
  1504.         ret
  1505. check_modifier_3:
  1506.         cmp     al, 1
  1507.         setnz   al
  1508.         ret
  1509. check_modifier_4:
  1510.         cmp     al, 2
  1511.         setnz   al
  1512.         ret
  1513.  
  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] <filename> - 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.  
  1774. ; eax: new scaling mode
  1775. ; z/Z - not/changed
  1776. proc set_scale_mode
  1777.         cmp     eax, [scale_mode]
  1778.         mov     [scale_mode], eax
  1779.         setnz   [bScaleModeChanged]
  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.  
  2171. ;-----------------------------------------------------------------------------
  2172. DATA
  2173.  
  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
  2206.  
  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.  
  2214. ;-----------------------------------------------------------------------------
  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
  2248. ;-----------------------------------------------------------------------------
  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. ;-----------------------------------------------------------------------------
  2283. align 4
  2284. @IMPORT:
  2285.  
  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'
  2293.  
  2294.  
  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'
  2301.  
  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'
  2314.  
  2315. import libini                               , \
  2316.         ini_get_shortcut, 'ini_get_shortcut', \
  2317.         ini_set_str,      'ini_set_str'
  2318.  
  2319. import sort                  ,\
  2320.         sort.START, 'START'  ,\
  2321.         SortDir   , 'SortDir',\
  2322.         strcmpi   , 'strcmpi'
  2323.  
  2324. import proc_lib                             ,\
  2325.         OpenDialog_Init , 'OpenDialog_init' ,\
  2326.         OpenDialog_Start, 'OpenDialog_start'
  2327.  
  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'
  2333.  
  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
  2342. ;-----------------------------------------------------------------------------
  2343.  
  2344. virtual at 0
  2345. file 'kivicons.bmp':0xA,4
  2346. load offbits dword from 0
  2347. end virtual
  2348. numimages = 10
  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
  2358. slidebtn = 9
  2359.  
  2360. palette:
  2361.     file 'kivicons.bmp':0x36,offbits-0x36
  2362. buttons:
  2363.     file 'kivicons.bmp':offbits
  2364. repeat 10
  2365. y = % - 1
  2366. z = 20 - %
  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
  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
  2372. end repeat
  2373. end repeat
  2374.  
  2375. inifilename db  '/sys/settings/app.ini',0
  2376. aShortcuts  db  'Kiv',0
  2377. aNext       db  'Next',0
  2378. aPrev       db  'Prev',0
  2379. aSlide      db  'SlideShow',0
  2380. aTglbar     db  'ToggleBar',0
  2381.  
  2382. inifileeskin db '/sys/settings/eskin.ini',0
  2383. amain       db 'bg',0
  2384. aprogram    db 'program',0
  2385. aparam      db 'param',0
  2386.  
  2387. align 4
  2388. check_modifier_table:
  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
  2394.  
  2395. ;---------------------------------------------------------------------
  2396. align 4
  2397. OpenDialog_data:
  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
  2410. .x:
  2411. .x_size                 dw 420                                  ; +48 ; Window X size
  2412. .x_start                dw 10                                   ; +50 ; Window X position
  2413. .y:
  2414. .y_size                 dw 320                                  ; +52 ; Window y size
  2415. .y_start                dw 10                                   ; +54 ; Window Y position
  2416.  
  2417. communication_area_name:
  2418.     db 'FFFFFFFF_open_dialog',0
  2419.  
  2420. open_dialog_path:
  2421. if __nightbuild eq yes
  2422.     db '/sys/MANAGERS/opendial',0
  2423. else
  2424.     db '/sys/File Managers/opendial',0
  2425. end if
  2426. communication_area_default_path:
  2427.     db '/rd/1',0
  2428.  
  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
  2440. db 'TGA',0
  2441. db 'PCX',0
  2442. db 'XCF',0
  2443. db 'PBM',0
  2444. db 'PGM',0
  2445. db 'PNM',0
  2446. db 'PPM',0
  2447. db 'TIF',0
  2448. db 'TIFF',0
  2449. db 'WBMP',0
  2450. db 'WEBP',0
  2451. db 'XBM',0
  2452. .end:
  2453. db 0
  2454.  
  2455. draw_window_fake:
  2456.     ret
  2457. ;------------------------------------------------------------------------------
  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.  
  2489. readdir_fileinfo:
  2490.     dd  1
  2491.     dd  0
  2492.     dd  0
  2493. readblocks dd   0
  2494. directory_ptr   dd  0
  2495. curdir          db 1024 dup (?)
  2496. ;------------------------------------------------------------------------------
  2497.  
  2498. I_END:
  2499. align 4
  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
  2508.  
  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
  2517.  
  2518.  
  2519. last_name_component rd 1
  2520. toolbar.height_old  rd 1
  2521.  
  2522. procinfo        process_information
  2523. align 16
  2524. path            rb 4096
  2525. window_header   rb 256
  2526. window_header_len rd 1
  2527. __params        rb 4096
  2528. ;---------------------------------------------------------------------
  2529. sys_path rb 1024
  2530. temp_dir_path:
  2531.         rb 4096
  2532. ;---------------------------------------------------------------------
  2533.     rb 4096
  2534. stacktop:
  2535. ;---------------------------------------------------------------------
  2536. E_END:
  2537.