Subversion Repositories Kolibri OS

Rev

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