Subversion Repositories Kolibri OS

Rev

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

  1. use32
  2. org 0x0
  3.  
  4. db 'MENUET01'
  5. dd 0x01, START, I_END, F_END, stacktop, @PARAMS, 0x0
  6.  
  7. ;-----------------------------------------------------------------------------
  8.  
  9. FALSE = 0
  10. TRUE  = 1
  11. include '../../../config.inc'           ;for nightbuild
  12. include '../../../proc32.inc'
  13. include '../../../macros.inc'
  14. include 'dll.inc'
  15.  
  16. include '../../../develop/libraries/libs-dev/libio/libio.inc'
  17. include '../../../develop/libraries/libs-dev/libimg/libimg.inc'
  18.  
  19. ;include '../../../develop/libraries/box_lib/asm/trunk/opendial.mac'
  20. ;use_OpenDialog
  21. ;-----------------------------------------------------------------------------
  22.  
  23. START:
  24.     mcall   68, 11
  25.  
  26.     stdcall dll.Load, @IMPORT
  27.     or  eax, eax
  28.     jnz exit
  29.  
  30.     invoke  sort.START, 1
  31.  
  32.     mov ecx, 1  ; for 15.4: 1 = tile
  33.     cmp word [@PARAMS], '\T'
  34.     jz  set_bgr
  35.     inc ecx ; for 15.4: 2 = stretch
  36.     cmp word [@PARAMS], '\S'
  37.     jz  set_bgr
  38.  
  39.     cmp byte [@PARAMS], 0
  40.     jz @f
  41.     mov esi, @PARAMS
  42.     mov edi, path
  43.     mov ecx, 4096/4
  44.     rep movsd
  45.     mov byte [edi-1], 0
  46. @@:
  47. ; OpenDialog initialisation
  48.     push    dword OpenDialog_data
  49.     call    [OpenDialog_Init]
  50.  
  51. ; initialize keyboard handling
  52.     invoke  ini_get_shortcut, inifilename, aShortcuts, aNext, -1, next_mod
  53.     mov [next_key], eax
  54.     invoke  ini_get_shortcut, inifilename, aShortcuts, aPrev, -1, prev_mod
  55.     mov [prev_key], eax
  56.     mcall   66, 1, 1    ; set kbd mode to scancodes
  57.  
  58.     cmp byte [@PARAMS], 0
  59.     jnz params_given
  60.  
  61.     mov [OpenDialog_data.draw_window],draw_window_fake
  62.    
  63. ; OpenDialog Open
  64.     push    dword OpenDialog_data
  65.     call    [OpenDialog_Start]
  66.  
  67.     cmp [OpenDialog_data.status],1
  68.     jne exit
  69.  
  70.     mov [OpenDialog_data.draw_window],draw_window
  71.  
  72.     mov esi, path
  73.     mov edi, @PARAMS
  74.     mov ecx, 4096/4
  75.     rep movsd
  76.     mov byte [edi-1], 0
  77.     jmp params_given
  78.  
  79. set_bgr:
  80.     mcall   15, 4
  81.     mov eax, @PARAMS + 4
  82.     call    load_image
  83.     jc  exit
  84.  
  85.     call    set_as_bgr
  86.     jmp exit
  87.  
  88. params_given:
  89.  
  90.     mov esi, @PARAMS
  91.     push    esi
  92.     call    find_last_name_component
  93.  
  94.     pop eax
  95.     call    load_image
  96.     jc  exit
  97.     call    generate_header
  98.  
  99. ;-----------------------------------------------------------------------------
  100.  
  101. red:
  102.     call    draw_window
  103.  
  104. still:
  105.     mov eax, [image]
  106.     test    byte [eax + Image.Flags], Image.IsAnimated
  107.     push    10
  108.     pop eax
  109.     jz  @f
  110.     mcall   26, 9
  111.     mov edx, [cur_frame]
  112.     mov ebx, [cur_frame_time]
  113.     add ebx, [edx + Image.Delay]
  114.     sub ebx, eax
  115.     cmp ebx, [edx + Image.Delay]
  116.     ja  red_update_frame
  117.     test    ebx, ebx
  118.     jz  red_update_frame
  119.     push    23
  120.     pop eax
  121.   @@:
  122.     mcall
  123.     dec eax
  124.     js  red_update_frame
  125.     jz  red
  126.     dec eax
  127.     jnz button
  128.  
  129. key:
  130.     xor esi, esi
  131. keyloop:
  132.     mcall   2
  133.     test    al, al
  134.     jnz keyloopdone
  135.     shr eax, 8
  136.     mov ecx, eax
  137.     mcall   66, 3
  138.     mov edx, next_mod
  139.     call    check_shortcut
  140.     jz  .next
  141.     add edx, prev_mod - next_mod
  142.     call    check_shortcut
  143.     jnz keyloop
  144. .prev:
  145.     dec esi
  146.     jmp keyloop
  147. .next:
  148.     inc esi
  149.     jmp keyloop
  150. keyloopdone:
  151.     test    esi, esi
  152.     jz  still
  153. next_or_prev_handler:
  154.     call    next_or_prev_image
  155.     jmp red
  156.  
  157. red_update_frame:
  158.     mov eax, [cur_frame]
  159.     mov eax, [eax + Image.Next]
  160.     test    eax, eax
  161.     jnz @f
  162.     mov eax, [image]
  163.   @@:
  164.     mov [cur_frame], eax
  165.     mcall   26, 9
  166.     mov [cur_frame_time], eax
  167.     mcall   9, procinfo, -1
  168.     call    draw_cur_frame
  169.     jmp still
  170.  
  171. button:
  172.     mcall   17
  173.     shr eax, 8
  174.  
  175.     ; flip horizontally
  176.     cmp eax, 'flh'
  177.     jne @f
  178.  
  179.     invoke  img.flip, [image], FLIP_HORIZONTAL
  180.     jmp redraw_image
  181.  
  182.     ; flip vertically
  183.     @@: cmp eax, 'flv'
  184.     jne @f
  185.  
  186.     invoke  img.flip, [image], FLIP_VERTICAL
  187.     jmp redraw_image
  188.  
  189.     ; flip both horizontally and vertically
  190.     @@: cmp eax, 'flb'
  191.     jne @f
  192.  
  193.     invoke  img.flip, [image], FLIP_BOTH
  194.     jmp redraw_image
  195.  
  196.     ; rotate left
  197.     @@: cmp eax, 'rtl'
  198.     jne @f
  199.  
  200.     push    ROTATE_90_CCW
  201. .rotate_common:
  202.     invoke  img.rotate, [image]
  203.     mov eax, [image]
  204.     test    eax, eax    ; clear ZF flag
  205.     call    update_image_sizes
  206.     jmp redraw_image
  207.  
  208.     ; rotate right
  209.     @@: cmp eax, 'rtr'
  210.     jne @f
  211.  
  212.     push    ROTATE_90_CW
  213.     jmp .rotate_common
  214.  
  215.     ; open new file
  216.     @@: cmp eax, 'opn'
  217.     jne @f
  218.    
  219. ; OpenDialog Open
  220.     push    dword OpenDialog_data
  221.     call    [OpenDialog_Start]
  222.    
  223.     cmp [OpenDialog_data.status],1
  224.     jne still
  225.    
  226.     mov esi, path
  227.     mov edi, @PARAMS
  228.     push    edi
  229.     mov ecx, 4096/4
  230.     rep movsd
  231.     mov byte [edi-1], 0
  232.    
  233.     pop esi
  234.     push    esi
  235.     call    find_last_name_component
  236.  
  237.     pop eax
  238.     push    [image]
  239.     call    load_image
  240.     jc  .restore_old
  241.     call    generate_header
  242.    
  243.     invoke  img.destroy
  244.     call    free_directory
  245.     jmp red
  246.    
  247.     .restore_old:
  248.     pop [image]
  249.     call    init_frame
  250.     jmp still
  251.  
  252.     ; set background
  253.     @@:
  254.     cmp eax, 'bgr'
  255.     jne @f
  256.  
  257.     call    set_as_bgr
  258.     jmp still
  259.  
  260.     @@:
  261.  
  262.     or  esi, -1
  263.     cmp eax, 'bck'
  264.     jz  next_or_prev_handler
  265.     neg esi
  266.     cmp eax, 'fwd'
  267.     jz  next_or_prev_handler
  268.  
  269.     cmp eax, 1
  270.     jne still
  271.  
  272.   exit:
  273.     mcall   -1
  274.  
  275.   redraw_image = red
  276.  
  277. load_image:
  278.     and [img_data], 0
  279.     push    eax
  280.     invoke  file.open, eax, O_READ
  281.     or  eax, eax
  282.     jz  .error_pop
  283.     mov [fh], eax
  284.     invoke  file.size
  285.     mov [img_data_len], ebx
  286.     stdcall mem.Alloc, ebx
  287.     test    eax, eax
  288.     jz  .error_close
  289.     mov [img_data], eax
  290.     invoke  file.read, [fh], eax, [img_data_len]
  291.     cmp eax, -1
  292.     jz  .error_close
  293.     cmp eax, [img_data_len]
  294.     jnz .error_close
  295.     invoke  file.close, [fh]
  296.     inc eax
  297.     jz  .error
  298.  
  299. ; img.decode checks for img.is_img
  300. ;   invoke  img.is_img, [img_data], [img_data_len]
  301. ;   or  eax, eax
  302. ;   jz  exit
  303.     invoke  img.decode, [img_data], [img_data_len], 0
  304.     or  eax, eax
  305.     jz  .error
  306.     cmp [image], 0
  307.     pushf
  308.     mov [image], eax
  309.     call    init_frame
  310.     popf
  311.     call    update_image_sizes
  312.     call    free_img_data
  313.     clc
  314.     ret
  315.  
  316. .error_free:
  317.     invoke  img.destroy, [image]
  318.     jmp .error
  319.  
  320. .error_pop:
  321.     pop eax
  322.     jmp .error
  323. .error_close:
  324.     invoke  file.close, [fh]
  325. .error:
  326.     call    free_img_data
  327.     stc
  328.     ret
  329.  
  330. free_img_data:
  331.     mov eax, [img_data]
  332.     test    eax, eax
  333.     jz  @f
  334.     stdcall mem.Free, eax
  335. @@:
  336.     ret
  337.  
  338. update_image_sizes:
  339.     pushf
  340.     mov edx, [eax + Image.Width]
  341.     test    [eax + Image.Flags], Image.IsAnimated
  342.     jnz .not_in_row
  343.     push eax
  344. @@: cmp [eax + Image.Next], 0
  345.     jz  @f
  346.     mov eax, [eax + Image.Next]
  347.     add edx, [eax + Image.Width]
  348.     inc edx
  349.     jmp @b
  350. @@: pop eax
  351. .not_in_row:
  352.     mov [draw_width], edx
  353.     add edx, 19
  354.     cmp edx, 40 + 25*9
  355.     jae @f
  356.     mov edx, 40 + 25*9
  357. @@:
  358.     mov [wnd_width], edx
  359.     mov esi, [eax + Image.Height]
  360.     test    [eax + Image.Flags], Image.IsAnimated
  361.     jnz .max_equals_first
  362.     push eax
  363. @@: cmp [eax + Image.Next], 0
  364.     jz  @f
  365.     mov eax, [eax + Image.Next]
  366.     cmp esi, [eax + Image.Height]
  367.     jae @b
  368.     mov esi, [eax + Image.Height]
  369.     jmp @b
  370. @@: pop eax
  371. .max_equals_first:
  372.     mov [draw_height], esi
  373.     add esi, 44
  374.     mov [wnd_height], esi
  375.     popf
  376.     jz  .no_resize
  377.     mcall   48, 4
  378.     add esi, eax
  379.     mcall   67,-1,-1
  380. .no_resize:
  381.     ret
  382.  
  383. set_as_bgr:
  384.     mov esi, [image]
  385.     mov ecx, [esi + Image.Width]
  386.     mov edx, [esi + Image.Height]
  387.     mcall   15, 1
  388.  
  389.     mcall   15, 6
  390.     test    eax, eax
  391.     jz  @f
  392.  
  393.     push    eax
  394.     invoke  img.to_rgb2, esi, eax
  395.     pop ecx
  396.     mcall   15, 7
  397.  
  398. @@:
  399.     mcall   15, 3
  400.     ret
  401.  
  402. ; seek to ESI image files
  403. ; esi>0 means next file, esi<0 - prev file
  404. next_or_prev_image:
  405.     push    esi
  406.     call    load_directory
  407.     pop esi
  408.     mov ebx, [directory_ptr]
  409.     test    ebx, ebx
  410.     jz  .ret
  411.     cmp dword[ebx+4], 0
  412.     jz  .ret
  413.     mov eax, [cur_file_idx]
  414.     cmp eax, -1
  415.     jnz @f
  416.     test    esi, esi
  417.     jns @f
  418.     mov eax, [ebx+4]
  419. @@:
  420.     push    [image]
  421.     add eax, esi
  422. @@:
  423.     test    eax, eax
  424.     jns @f
  425.     add eax, [ebx+4]
  426.     jmp @b
  427. @@:
  428.     cmp eax, [ebx+4]
  429.     jb  @f
  430.     sub eax, [ebx+4]
  431.     jmp @b
  432. @@:
  433.     push    eax
  434. .scanloop:
  435.     push    eax ebx esi
  436.     imul    esi, eax, 304
  437.     add esi, [directory_ptr]
  438.     add esi, 32 + 40
  439.     mov edi, curdir
  440. @@:
  441.     inc edi
  442.     cmp byte [edi-1], 0
  443.     jnz @b
  444.     mov byte [edi-1], '/'
  445. @@:
  446.     lodsb
  447.     stosb
  448.     test    al, al
  449.     jnz @b
  450.     mov eax, curdir
  451.     call    load_image
  452.     pushf
  453.     mov esi, curdir
  454.     push    esi
  455.     mov edi, @PARAMS
  456.     mov ecx, 4096/4
  457.     rep movsd
  458.     mov byte [edi-1], 0
  459.     pop esi
  460. @@:
  461.     lodsb
  462.     test    al, al
  463.     jnz @b
  464. @@:
  465.     dec esi
  466.     cmp byte [esi], '/'
  467.     jnz @b
  468.     mov byte [esi], 0
  469.     popf
  470.     pop esi ebx eax
  471.     jnc .loadedok
  472.     test    esi, esi
  473.     js  .try_prev
  474. .try_next:
  475.     inc eax
  476.     cmp eax, [ebx+4]
  477.     jb  @f
  478.     xor eax, eax
  479. @@:
  480. .try_common:
  481.     cmp eax, [esp]
  482.     jz  .notfound
  483.     jmp .scanloop
  484. .try_prev:
  485.     dec eax
  486.     jns @f
  487.     mov eax, [ebx+4]
  488.     dec eax
  489. @@:
  490.     jmp .try_common
  491. .loadedok:
  492.     mov [cur_file_idx], eax
  493.     pop eax
  494.     invoke  img.destroy
  495.     call    generate_header
  496. .ret:
  497.     ret
  498. .notfound:
  499.     pop eax
  500.     pop [image]
  501.     call    init_frame
  502.     ret
  503.  
  504. load_directory:
  505.     cmp [directory_ptr], 0
  506.     jnz .ret
  507.     mov esi, @PARAMS
  508.     mov edi, curdir
  509.     mov ecx, [last_name_component]
  510.     sub ecx, esi
  511.     dec ecx
  512.     js  @f
  513.     rep movsb
  514. @@:
  515.     mov byte [edi], 0
  516.     mcall   68, 12, 0x1000
  517.     test    eax, eax
  518.     jz  .ret
  519.     mov ebx, readdir_fileinfo
  520.     mov dword [ebx+12], (0x1000 - 32) / 304
  521.     mov dword [ebx+16], eax
  522.     mcall   70
  523.     cmp eax, 6
  524.     jz  .dirok
  525.     test    eax, eax
  526.     jnz free_directory
  527.     mov edx, [directory_ptr]
  528.     mov ecx, [edx+8]
  529.     mov [readblocks], ecx
  530.     imul    ecx, 304
  531.     add ecx, 32
  532.     mcall   68, 20
  533.     test    eax, eax
  534.     jz  free_directory
  535.     mov [directory_ptr], eax
  536.     mcall   70, readdir_fileinfo
  537. .dirok:
  538.     cmp ebx, 0
  539.     jle free_directory
  540.     mov eax, [directory_ptr]
  541.     add eax, 32
  542.     mov edi, eax
  543.     push    0
  544. .dirskip:
  545.     push    eax
  546.     test    byte [eax], 18h
  547.     jnz .nocopy
  548.     lea esi, [eax+40]
  549.     mov ecx, esi
  550. @@:
  551.     lodsb
  552.     test    al, al
  553.     jnz @b
  554. @@:
  555.     dec esi
  556.     cmp esi, ecx
  557.     jb  .noext
  558.     cmp byte [esi], '.'
  559.     jnz @b
  560.     inc esi
  561.     mov ecx, [esi]
  562.     or  ecx, 0x202020
  563.     cmp ecx, 'jpg'
  564.     jz  .copy
  565.     cmp ecx, 'bmp'
  566.     jz  .copy
  567.     cmp ecx, 'gif'
  568.     jz  .copy
  569.     cmp ecx, 'png'
  570.     jz  .copy
  571.     cmp ecx, 'jpe'
  572.     jz  .copy
  573.     cmp ecx, 'ico'
  574.     jz  .copy
  575.     cmp ecx, 'cur'
  576.     jz  .copy
  577. ; dunkaist [
  578.     cmp ecx, 'pcx'
  579.     jz  .copy
  580.     cmp ecx, 'xcf'
  581.     jz  .copy
  582. ; dunkaist ]
  583.     cmp ecx, 'jpeg'
  584.     jz  @f
  585.     cmp ecx, 'jpeG'
  586.     jnz .nocopy
  587. @@:
  588.     cmp byte [esi+4], 0
  589.     jnz .nocopy
  590. .copy:
  591.     mov esi, [esp]
  592.     mov ecx, 304 / 4
  593.     rep movsd
  594.     inc dword [esp+4]
  595. .nocopy:
  596. .noext:
  597.     pop eax
  598.     add eax, 304
  599.     dec ebx
  600.     jnz .dirskip
  601.     mov eax, [directory_ptr]
  602.     pop ebx
  603.     mov [eax+4], ebx
  604.     test    ebx, ebx
  605.     jz  free_directory
  606.     push    0   ; sort mode
  607.     push    ebx
  608.     add eax, 32
  609.     push    eax
  610.     call    [SortDir]
  611.     xor eax, eax
  612.     mov edi, [directory_ptr]
  613.     add edi, 32 + 40
  614. .scan:
  615.     mov esi, [last_name_component]
  616.     push    edi
  617.     invoke  strcmpi
  618.     pop edi
  619.     jz  .found
  620.     inc eax
  621.     add edi, 304
  622.     dec ebx
  623.     jnz .scan
  624.     or  eax, -1
  625. .found:
  626.     mov [cur_file_idx], eax
  627. .ret:
  628.     ret
  629.  
  630. free_directory:
  631.     mcall   68, 13, [directory_ptr]
  632.     and [directory_ptr], 0
  633.     ret
  634.  
  635. ; in: esi->full name (e.g. /path/to/file.png)
  636. ; out: [last_name_component]->last component (e.g. file.png)
  637. find_last_name_component:
  638.     mov ecx, esi
  639. @@:
  640.     lodsb
  641.     test    al, al
  642.     jnz @b
  643. @@:
  644.     dec esi
  645.     cmp esi, ecx
  646.     jb  @f
  647.     cmp byte [esi], '/'
  648.     jnz @b
  649. @@:
  650.     inc esi
  651.     mov [last_name_component], esi
  652.     ret
  653.  
  654. init_frame:
  655.     push    eax
  656.     mov eax, [image]
  657.     mov [cur_frame], eax
  658.     test    byte [eax + Image.Flags], Image.IsAnimated
  659.     jz  @f
  660.     push    ebx
  661.     mcall   26, 9
  662.     pop ebx
  663.     mov [cur_frame_time], eax
  664. @@:
  665.     pop eax
  666.     ret
  667.  
  668. draw_window:
  669.     cmp [bFirstDraw], 0
  670.     jz  .posok
  671.     or  ecx, -1
  672.     mcall   9, procinfo
  673.  
  674.     cmp dword [ebx + 66], 0
  675.     jle .posok
  676.  
  677.     mov edx, ecx
  678.     mov esi, ecx
  679.     cmp dword [ebx + 42], 40 + 25 * 9
  680.     jae @f
  681.     mov edx, 40 + 25 * 9
  682. @@:
  683.     cmp dword [ebx + 46], 70
  684.     jae @f
  685.     mov esi, 70
  686. @@:
  687.     mov eax, edx
  688.     and eax, esi
  689.     cmp eax, -1
  690.     jz  @f
  691.     mov ebx, ecx
  692.     mcall   67
  693. @@:
  694.  
  695. .posok:
  696.     mcall   12, 1
  697.     mcall   48, 4
  698.     mov ebp, eax    ; save skin height
  699.     add eax, [wnd_height]
  700.     __mov   ebx, 100, 0
  701.     add ebx, [wnd_width]
  702.     lea ecx, [100*65536 + eax]
  703.     mcall   0, , , 0x73FFFFFF, 0, real_header
  704.  
  705.     mcall   9, procinfo, -1
  706.     mov [bFirstDraw], 1
  707.     cmp dword [ebx + 66], 0
  708.     jle .nodraw
  709.     mov ebx, [ebx + 62]
  710.     inc ebx
  711.     mcall   13, , <0, 35>, 0xFFFFFF
  712.     mov ecx, [procinfo + 66]
  713.     inc ecx
  714. ;    mov esi, [draw_height]          ; we can not use [draw_height] here because for *.ico files containing several frames
  715.     mov esi, [image]                 ; with different size window height should depend on maximum frame height, not the first one
  716.     mov esi, [esi+Image.Height]      ;
  717.     add esi, 35
  718.     sub ecx, esi
  719.     jbe @f
  720.     push    esi
  721.     shl esi, 16
  722.     add ecx, esi
  723.     pop esi
  724.     mcall
  725.     xor ecx, ecx
  726. @@:
  727.     add ecx, esi
  728.     add ecx, 35*10000h - 35
  729.     __mov   ebx, 0, 5
  730.     mcall
  731. ;    mov esi, [draw_width]           ; we can not use [draw_width] here because for *.ico files containing several frames
  732.     mov esi, [image]                 ; with different size window width should depend on the sum of width of all frames
  733.     mov esi, [esi + Image.Width]     ;
  734.     add esi, ebx
  735.     mov ebx, [procinfo+62]
  736.     inc ebx
  737.     sub ebx, esi
  738.     jbe @f
  739.     shl esi, 16
  740.     add ebx, esi
  741.     mcall
  742. @@:
  743.  
  744.     mov ebx, [procinfo + 62]
  745.     push    ebx
  746.     mcall   38, , <30, 30>, 0x007F7F7F
  747.     mcall   , <5 + 25 * 1, 5 + 25 * 1>, <0, 30>
  748.     mcall   , <10 + 25 * 3, 10 + 25 * 3>
  749.     mcall   , <15 + 25 * 4, 15 + 25 * 4>
  750.     pop ebx
  751.     sub ebx, 25 * 5 + 10
  752.     push    ebx
  753.     imul    ebx, 10001h
  754.     mcall
  755.  
  756.     mcall   8, <5 + 25 * 0, 20>, <5, 20>, 'opn'+40000000h
  757.     mcall   , <10 + 25 * 1, 20>, , 'bck'+40000000h
  758.     mcall   , <10 + 25 * 2, 20>, , 'fwd'+40000000h
  759.     mcall   , <15 + 25 * 3, 20>, , 'bgr'+40000000h
  760.     pop ebx
  761.     add ebx, 5
  762.     shl ebx, 16
  763.     mov bl, 20
  764.     mcall   , , , 'flh'+40000000h
  765.     add ebx, 25 * 65536
  766.     mcall   , , , 'flv'+40000000h
  767.     add ebx, 30 * 65536
  768.     mcall   , , , 'rtr'+40000000h
  769.     add ebx, 25 * 65536
  770.     mcall   , , , 'rtl'+40000000h
  771.     add ebx, 25 * 65536
  772.     mcall   , , , 'flb'+40000000h
  773.  
  774.     mov ebp, (numimages-1)*20
  775.  
  776.     mcall   65, buttons+openbtn*20, <20, 20>, <5 + 25 * 0, 5>, 8, palette
  777.     mcall   , buttons+backbtn*20, , <10 + 25 * 1, 5>
  778.     mcall   , buttons+forwardbtn*20, , <10 + 25 * 2, 5>
  779.     mcall   , buttons+bgrbtn*20, , <15 + 25 * 3, 5>
  780.     mov edx, [procinfo + 62]
  781.     sub edx, 25 * 5 + 4
  782.     shl edx, 16
  783.     mov dl, 5
  784.     mcall   , buttons+fliphorzbtn*20
  785.     add edx, 25 * 65536
  786.     mcall   , buttons+flipvertbtn*20
  787.     add edx, 30 * 65536
  788.     mcall   , buttons+rotcwbtn*20
  789.     add edx, 25 * 65536
  790.     mcall   , buttons+rotccwbtn*20
  791.     add edx, 25 * 65536
  792.     mcall   , buttons+rot180btn*20
  793.  
  794.     call    draw_cur_frame
  795.  
  796. .nodraw:
  797.     mcall   12, 2
  798.  
  799.     ret
  800.  
  801. draw_cur_frame:
  802.     push    0   ; ypos
  803.     push    0   ; xpos
  804.     mov eax, [procinfo+66]
  805.     sub eax, 34
  806.     push    eax ; max height
  807.     mov eax, [procinfo+62]
  808.     sub eax, 4
  809.     push    eax ; max width
  810.     push    35  ; y
  811.     push    5   ; x
  812.     push    [cur_frame]
  813.     call    [img.draw]
  814.     mov eax, [image]
  815.     test    [eax + Image.Flags], Image.IsAnimated
  816.     jnz .done
  817.     cmp [eax + Image.Next], 0
  818.     jnz .additional_frames
  819. .done:
  820.     ret
  821. .additional_frames:
  822.     mov ebx, [procinfo+62]
  823.     sub ebx, 4
  824.     jbe .done
  825.     push    5
  826.     pop esi
  827. .afloop:
  828.     sub ebx, [eax + Image.Width]
  829.     jbe .done
  830.     dec ebx
  831.     jz  .done
  832.     add esi, [eax + Image.Width]
  833.     mov eax, [eax + Image.Next]
  834.     push    eax
  835.     inc esi
  836.     push    0   ; ypos
  837.     push    0   ; xpos
  838.     mov ecx, [procinfo+66]
  839.     sub ecx, 34
  840.     push    ecx ; max height
  841.     push    ebx ; max width
  842.     push    35  ; y
  843.     push    esi ; x
  844.     push    eax ; image
  845.     call    [img.draw]
  846.     pop eax
  847.     cmp [eax + Image.Next], 0
  848.     jnz .afloop
  849.     ret
  850.  
  851. ; void* __stdcall mem.Alloc(unsigned size);
  852. mem.Alloc:
  853.     push    ebx ecx
  854.     mov ecx, [esp+12]
  855.     mcall   68, 12
  856.     pop ecx ebx
  857.     ret 4
  858.  
  859. ; void* __stdcall mem.ReAlloc(void* mptr, unsigned size);
  860. mem.ReAlloc:
  861.     push    ebx ecx edx
  862.     mov edx, [esp+16]
  863.     mov ecx, [esp+20]
  864.     mcall   68, 20
  865.     pop edx ecx ebx
  866.     ret 8
  867.  
  868. ; void __stdcall mem.Free(void* mptr);
  869. mem.Free:
  870.     push    ebx ecx
  871.     mov ecx, [esp+12]
  872.     mcall   68, 13
  873.     pop ecx ebx
  874.     ret 4
  875.  
  876. check_shortcut:
  877. ; in:   cl = scancode (from sysfn 2),
  878. ;   eax = state of modifiers (from sysfn 66.3),
  879. ;   edx -> shortcut descriptor
  880. ; out:  ZF set <=> fail
  881.     cmp cl, [edx+4]
  882.     jnz .not
  883.     push    eax
  884.     mov esi, [edx]
  885.     and esi, 0xF
  886.     and al, 3
  887.     call    dword [check_modifier_table+esi*4]
  888.     test    al, al
  889.     pop eax
  890.     jnz .not
  891.     push    eax
  892.     mov esi, [edx]
  893.     shr esi, 4
  894.     and esi, 0xF
  895.     shr al, 2
  896.     and al, 3
  897.     call    dword [check_modifier_table+esi*4]
  898.     test    al, al
  899.     pop eax
  900.     jnz .not
  901.     push    eax
  902.     mov esi, [edx]
  903.     shr esi, 8
  904.     and esi, 0xF
  905.     shr al, 4
  906.     and al, 3
  907.     call    dword [check_modifier_table+esi*4]
  908.     test    al, al
  909.     pop eax
  910. ;   jnz .not
  911. .not:
  912.     ret
  913.  
  914. check_modifier_0:
  915.     setnz   al
  916.     ret
  917. check_modifier_1:
  918.     setp    al
  919.     ret
  920. check_modifier_2:
  921.     cmp al, 3
  922.     setnz   al
  923.     ret
  924. check_modifier_3:
  925.     cmp al, 1
  926.     setnz   al
  927.     ret
  928. check_modifier_4:
  929.     cmp al, 2
  930.     setnz   al
  931.     ret
  932.  
  933. ; fills real_header with window title
  934. ; window title is generated as '<filename> - Kolibri Image Viewer'
  935. generate_header:
  936.     push    eax
  937.     mov esi, [last_name_component]
  938.     mov edi, real_header
  939. @@:
  940.     lodsb
  941.     test    al, al
  942.     jz  @f
  943.     stosb
  944.     cmp edi, real_header+256
  945.     jb  @b
  946. .overflow:
  947.     mov dword [edi-4], '...'
  948. .ret:
  949.     pop eax
  950.     ret
  951. @@:
  952.     mov esi, s_header
  953. @@:
  954.     lodsb
  955.     stosb
  956.     test    al, al
  957.     jz  .ret
  958.     cmp edi, real_header+256
  959.     jb  @b
  960.     jmp .overflow
  961. ;-----------------------------------------------------------------------------
  962.  
  963. s_header db ' - Kolibri Image Viewer', 0
  964.  
  965. ;-----------------------------------------------------------------------------
  966. ;-----------------------------------------------------------------------------
  967.  
  968. align 4
  969. @IMPORT:
  970.  
  971. library             \
  972.     libio  , 'libio.obj'  , \
  973.     libgfx , 'libgfx.obj' , \
  974.     libimg , 'libimg.obj' , \
  975.     libini , 'libini.obj' , \
  976.     sort   , 'sort.obj'   , \
  977.     proc_lib ,'proc_lib.obj'
  978.  
  979.  
  980. import  libio             , \
  981.     libio.init , 'lib_init'   , \
  982.     file.size  , 'file_size'  , \
  983.     file.open  , 'file_open'  , \
  984.     file.read  , 'file_read'  , \
  985.     file.close , 'file_close'
  986.  
  987. import  libgfx              , \
  988.     libgfx.init   , 'lib_init'  , \
  989.     gfx.open      , 'gfx_open'  , \
  990.     gfx.close     , 'gfx_close' , \
  991.     gfx.pen.color , 'gfx_pen_color' , \
  992.     gfx.line      , 'gfx_line'
  993.  
  994. import  libimg             , \
  995.     libimg.init , 'lib_init'   , \
  996.     img.is_img  , 'img_is_img' , \
  997.     img.to_rgb2 , 'img_to_rgb2', \
  998.     img.decode  , 'img_decode' , \
  999.     img.flip    , 'img_flip'   , \
  1000.     img.rotate  , 'img_rotate' , \
  1001.     img.destroy , 'img_destroy', \
  1002.     img.draw    , 'img_draw'
  1003.  
  1004. import  libini, \
  1005.     ini_get_shortcut, 'ini_get_shortcut'
  1006.  
  1007. import  sort, sort.START, 'START', SortDir, 'SortDir', strcmpi, 'strcmpi'
  1008.  
  1009. import  proc_lib, \
  1010.     OpenDialog_Init, 'OpenDialog_init', \
  1011.     OpenDialog_Start,'OpenDialog_start'
  1012.  
  1013. bFirstDraw  db  0
  1014. ;-----------------------------------------------------------------------------
  1015.  
  1016. virtual at 0
  1017. file 'kivicons.bmp':0xA,4
  1018. load offbits dword from 0
  1019. end virtual
  1020. numimages = 9
  1021. openbtn = 0
  1022. backbtn = 1
  1023. forwardbtn = 2
  1024. bgrbtn = 3
  1025. fliphorzbtn = 4
  1026. flipvertbtn = 5
  1027. rotcwbtn = 6
  1028. rotccwbtn = 7
  1029. rot180btn = 8
  1030.  
  1031. palette:
  1032.     file 'kivicons.bmp':0x36,offbits-0x36
  1033. buttons:
  1034.     file 'kivicons.bmp':offbits
  1035. repeat 10
  1036. y = % - 1
  1037. z = 20 - %
  1038. repeat numimages*5
  1039. load a dword from $ - numimages*20*20 + numimages*20*y + (%-1)*4
  1040. load b dword from $ - numimages*20*20 + numimages*20*z + (%-1)*4
  1041. store dword a at $ - numimages*20*20 + numimages*20*z + (%-1)*4
  1042. store dword b at $ - numimages*20*20 + numimages*20*y + (%-1)*4
  1043. end repeat
  1044. end repeat
  1045.  
  1046. inifilename db  '/sys/media/kiv.ini',0
  1047. aShortcuts  db  'Shortcuts',0
  1048. aNext       db  'Next',0
  1049. aPrev       db  'Prev',0
  1050.  
  1051. align 4
  1052. check_modifier_table:
  1053.     dd  check_modifier_0
  1054.     dd  check_modifier_1
  1055.     dd  check_modifier_2
  1056.     dd  check_modifier_3
  1057.     dd  check_modifier_4
  1058.  
  1059. ;---------------------------------------------------------------------
  1060. align 4
  1061. OpenDialog_data:
  1062. .type           dd 0
  1063. .procinfo       dd procinfo ;+4
  1064. .com_area_name      dd communication_area_name ;+8
  1065. .com_area       dd 0 ;+12
  1066. .opendir_pach       dd temp_dir_pach ;+16
  1067. .dir_default_pach   dd communication_area_default_pach ;+20
  1068. .start_path     dd open_dialog_path ;+24
  1069. .draw_window        dd draw_window ;+28
  1070. .status         dd 0 ;+32
  1071. .openfile_pach      dd path  ;openfile_pach ;+36
  1072. .filename_area      dd 0    ;+40
  1073. .filter_area        dd Filter
  1074. .x:
  1075. .x_size                 dw 420 ;+48 ; Window X size
  1076. .x_start                dw 10 ;+50 ; Window X position
  1077. .y:
  1078. .y_size                 dw 320 ;+52 ; Window y size
  1079. .y_start                dw 10 ;+54 ; Window Y position
  1080.  
  1081. communication_area_name:
  1082.     db 'FFFFFFFF_open_dialog',0
  1083.  
  1084. open_dialog_path:
  1085. if __nightbuild eq yes
  1086.     db '/sys/MANAGERS/opendial',0
  1087. else
  1088.     db '/sys/File Managers/opendial',0
  1089. end if
  1090. communication_area_default_pach:
  1091.     db '/rd/1',0
  1092.  
  1093. Filter:
  1094. dd Filter.end - Filter
  1095. .1:
  1096. db 'BMP',0
  1097. db 'GIF',0
  1098. db 'JPG',0
  1099. db 'JPEG',0
  1100. db 'JPE',0
  1101. db 'PNG',0
  1102. db 'ICO',0
  1103. db 'CUR',0
  1104. ; dunkaist [
  1105. db 'PCX',0
  1106. db 'XCF',0
  1107. ; dunkaist ]
  1108. .end:
  1109. db 0
  1110.  
  1111. draw_window_fake:
  1112.     ret
  1113. ;------------------------------------------------------------------------------
  1114. readdir_fileinfo:
  1115.     dd  1
  1116.     dd  0
  1117.     dd  0
  1118. readblocks dd   0
  1119. directory_ptr   dd  0
  1120. ;------------------------------------------------------------------------------
  1121. I_END:
  1122. curdir      rb  1024
  1123.  
  1124. align 4
  1125. img_data     dd ?
  1126. img_data_len dd ?
  1127. fh       dd ?
  1128. image        dd ?
  1129. wnd_width   dd  ?
  1130. wnd_height  dd  ?
  1131. draw_width  dd  ?
  1132. draw_height dd  ?
  1133. last_name_component dd  ?
  1134. cur_file_idx    dd  ?
  1135. cur_frame_time  dd  ?
  1136. cur_frame   dd  ?
  1137.  
  1138. next_mod    dd  ?
  1139. next_key    dd  ?
  1140. prev_mod    dd  ?
  1141. prev_key    dd  ?
  1142.  
  1143. procinfo:   rb  1024
  1144. path:       rb  4096  ;1024+16
  1145. real_header rb  256
  1146. @PARAMS rb 4096  ;512
  1147. ;---------------------------------------------------------------------
  1148. temp_dir_pach:
  1149.         rb 4096
  1150. ;---------------------------------------------------------------------
  1151.     rb 4096
  1152. stacktop:
  1153. ;---------------------------------------------------------------------
  1154. F_END:
  1155.