Subversion Repositories Kolibri OS

Rev

Rev 532 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;    IMGVIEW.ASM
  2. ;
  3. ;    This program displays jpeg images. The window can be resized.
  4. ;
  5. ;    Version 0.0    END OF 2003
  6. ;                   Octavio Vega
  7. ;    Version 0.1    7th March 2004
  8. ;                   Mike Hibbett ( very small part! )
  9. ;    Version 0.11   7th April 2004
  10. ;                   Ville Turjanmaa ( 'set_as_bgr' function )
  11. ;    Version 0.12   29th May 2004
  12. ;                   Ivan Poddubny (correct "set_as_bgr"+parameters+boot+...)
  13. ;    Version 0.12   30 de mayo 2004
  14. ;                   Octavio Vega
  15. ;                   bugs correction and slideshow
  16. ;    version 0.13   3 de junio 2004
  17. ;                   Octavio Vega
  18. ;                   unos retoques
  19. ;    version 0.14   10th August 2004
  20. ;                   Mike Hibbett Added setting default colours
  21. ;    version 0.15   24th August 2006
  22. ;                   diamond (rewritten to function 70)
  23. ;    version 0.16   19th May 2007
  24. ;                   Mario79
  25. ;                   1) correction for changed function 15,
  26. ;                   2) use monochrome background if free memory there are less than 2 MB
  27. ;                   3) use COL0 - COL9 boot parameter
  28. ;                   0=black,1=white,2=green,3=lilas,4=grey
  29. ;                   5=light-blue,6=blue,7=salad,8=pink,9=yellow
  30. ;    version 0.17   17th June 2007
  31. ;                   diamond (background definition now uses shared memory)
  32.                  
  33.                memsize=20000h
  34.                org 0
  35.  PARAMS     =    memsize - 1024
  36.  
  37. appname equ 'Jpegview '
  38. version equ '0.17'
  39.  
  40. use32
  41.  
  42.                db     'MENUET01'              ; 8 byte id
  43.                dd     0x01                    ; header version
  44.                dd     START                   ; start of code
  45.                dd     I_END                   ; size of image
  46.                dd     memsize                 ; memory for app
  47.                dd     memsize - 1024           ; esp
  48.                dd     PARAMS , 0x0               ; I_Param , I_Icon
  49.  
  50. stack_size=4096 + 1024
  51.  
  52. include '..\..\..\macros.inc'
  53.  
  54. START:                          ; start of execution
  55.         mcall   68,11           ; initialize heap
  56.  
  57.     cmp     [PARAMS], byte 0
  58.     jne     check_parameters
  59.  
  60.     ; Calculate the 'free' memory available
  61.     ; to the application, and create the malloc block from it
  62.   .l1:
  63.     mov     ecx,memsize-fin-stack_size
  64.     mov     edi,fin
  65.     call    add_mem
  66.  
  67.     call    colorprecalc ;inicializa tablas usadas para pasar de ybr a bgr
  68.     call    draw_window
  69.     call    read_string.rs_done
  70.  
  71. still:
  72.     push still
  73.     mov ebx,100                ;1 second
  74.     mov  eax,23                 ; wait here for event
  75.     mcall
  76.     cmp  eax,1                  ; redraw request ?
  77.     je   draw_window
  78.     cmp  eax,2                  ; key in buffer ?
  79.     je   read_string
  80.     cmp  eax,3                  ; button in buffer ?
  81.     je   button
  82.     jmp display_next
  83.  
  84. button:                       ; BUTTON
  85.     mov  eax,17
  86.     mcall
  87.     cmp ah,3
  88.     je set_as_bgr2
  89.     cmp ah,2
  90.     je slideshow
  91.     cmp  ah,1                   ; CLOSE PROGRAM
  92.     jne  close_program.exit
  93. close_program:
  94.     mov  eax,-1
  95.     mcall
  96.   .exit:
  97.     ret
  98.  
  99.    ; Put a 'chunk' of the image on the window
  100. put_image:
  101.     pushad
  102.  
  103.     lea ebp,[edx+eax+7]
  104.     cmp  [winxs],bp
  105.     jc     .l1
  106.     lea ebp,[ecx+ebx+20+2+17]
  107.     cmp [winys],bp
  108.     jc     .l1
  109.  
  110.     add     eax,2  ; offset for boarder
  111.     add     ebx,2 ; offset for title bar
  112.     push    ax ; pox
  113.     push    bx ; pos
  114.     push    cx ; size
  115.     push    dx ; size
  116.     pop     ecx
  117.     pop     edx
  118.     mov     ebx,edi
  119.     mov     eax,7
  120.  
  121.     mcall                         ; Put image function
  122. .l1:
  123.     popad
  124.     ret
  125.  
  126.  
  127.  
  128. ;******************************************************************************
  129.  
  130. check_parameters:
  131.     cmp     [PARAMS], dword "BOOT" ; received BOOT parameter -> goto handler
  132.     je      boot_set_background
  133.     cmp     [PARAMS], word "CO"
  134.     jne     @f
  135.     cmp     [PARAMS+2], byte "L"
  136.     je      boot_set_background    
  137. @@:
  138.         cmp     byte [PARAMS], 1
  139.         jz      ipc_service
  140.     mov     edi, name_string       ; clear string with file name
  141.     mov     al,  0
  142.     mov     ecx, 100
  143.     rep     stosb
  144.  
  145.     mov     ecx, 100               ; calculate length of parameter string
  146.     mov     edi, PARAMS
  147.     repne   scasb
  148.     sub     edi, PARAMS
  149.     mov     ecx, edi
  150.  
  151.     mov     esi, PARAMS            ; copy parameters to file name
  152.     mov     edi, name_string
  153.     cld
  154.     rep     movsb
  155.  
  156.     jmp     START.l1       ; return to beggining of the progra
  157.  
  158. ;******************************************************************************
  159. boot_set_background:
  160.     mcall 18,16
  161.     cmp   eax,1024*2
  162.     jb    set_mono
  163.     mov     ecx,memsize-fin-stack_size  ; size
  164.     mov     edi,fin                     ; pointer
  165.     call    add_mem             ; mark memory from fin to 0x100000-1024 as free
  166.     call    colorprecalc        ; calculate colors
  167.     mov     esi,name_string
  168.     call    open
  169.     test    eax,eax
  170.     jz      close_program
  171.     call    jpeg_info
  172.     mov dword [jpeg_st],ebp
  173.     call    set_as_bgr2         ; set wallpaper
  174.     jmp     close_program       ; close the program right now
  175.  
  176. ;******************************************************************************
  177. set_mono:
  178.     mov     eax, 15
  179.     mov     ebx, 1
  180.     mov     ecx, 1
  181.     mov     edx, 1
  182.     mcall
  183.  
  184.     cmp     [PARAMS], dword "BOOT" ; received BOOT parameter -> goto handler
  185.     jne     @f
  186. .green:
  187.     mov     ecx,mono+6
  188.     jmp     .set
  189. @@:
  190. ;    cmp     [PARAMS], word "CO" ; received BOOT parameter -> goto handler
  191. ;    jne     .green
  192.     xor     ecx,ecx
  193.     mov     cl,[PARAMS+3]
  194.     sub     cl,0x30
  195.     cmp     ecx,0
  196.     jb      .green
  197.     cmp     ecx,9    
  198.     ja      .green
  199.     imul    ecx,3
  200.     add     ecx,mono
  201. .set:
  202.     mcall   15,5, ,0,3
  203.  
  204.     ; Stretch the image to fit
  205.     mov     eax, 15
  206.     mov     ebx, 4
  207.     mov     ecx, 1
  208.     mcall
  209.  
  210.     mov     eax, 15
  211.     mov     ebx, 3
  212.     mcall
  213.     jmp     close_program
  214.    
  215. mono:
  216.     db 0,0,0       ; black
  217.     db 255,255,255 ; white
  218.     db 128,128,0   ; green
  219.     db 240,202,166 ; lilas
  220.     db 192,192,192 ; grey
  221.     db 255,255,0   ; light-blue
  222.     db 255,0,0     ; blue
  223.     db 192,220,192 ; salad
  224.     db 255,0,255   ; pink
  225.     db 0,255,255   ; yellow
  226. ;******************************************************************************
  227.  
  228. set_as_bgr2:
  229.     mov ebp,dword[jpeg_st]
  230.     test    ebp,ebp
  231.     jz      .end
  232.    
  233.     mov     eax, 15
  234.     mov     ebx, 1
  235.     mov     ecx, [ebp + x_size]
  236.     mov     edx, [ebp + y_size]
  237.     mcall
  238.  
  239.         mov     ebx, 6
  240.         mcall
  241.         test    eax, eax
  242.         jz      .end
  243.         mov     [ipc_mem_out], eax
  244.  
  245.     mov     dword [ebp+draw_ptr],put_chunk_to_mem
  246.     call    jpeg_display
  247.  
  248.         mov     eax, 15
  249.         mov     ebx, 7
  250.         mov     ecx, [ipc_mem_out]
  251.         mcall
  252.  
  253.     ; Stretch the image to fit
  254.     mov     eax, 15
  255.     mov     ebx, 4
  256.     mov     ecx, 2
  257.     mcall
  258.  
  259.     mov     eax, 15
  260.     mov     ebx, 3
  261.     mcall
  262.  
  263.  
  264.  .end:
  265.     ret
  266.  
  267. ;******************************************************************************
  268.  
  269. ipc_service:
  270.         mov     esi, PARAMS+1
  271.         xor     eax, eax
  272.         xor     ecx, ecx
  273. @@:
  274.         lodsb
  275.         test    al, al
  276.         jz      @f
  277.         lea     ecx, [ecx*5]
  278.         lea     ecx, [ecx*2+eax-'0']
  279.         jmp     @b
  280. @@:
  281.         add     ecx, 16
  282.         mov     edx, ecx
  283.         mcall   68, 12
  284.         test    eax, eax
  285.         jnz     @f
  286. .exit:
  287.         mcall   -1
  288. @@:
  289.         mov     ecx, eax
  290.         and     dword [ecx], 0
  291.         mov     dword [ecx+4], 8
  292.         mov     [ipc_mem], ecx
  293.         mcall   60, 1
  294.         mcall   40, 1 shl 6
  295.         mcall   23, 500         ; wait up to 5 seconds for IPC message
  296.         test    eax, eax
  297.         jz      .exit
  298. ; we got message with JPEG data, now decode it
  299.         mov     eax, [ecx+12]
  300.         mov     [ipc_mem_size], eax
  301. ; init JPEG decoder
  302.     mov     ecx,memsize-fin-stack_size  ; size
  303.     mov     edi,fin                     ; pointer
  304.     call    add_mem             ; mark memory from fin to 0x100000-1024 as free
  305.     call    colorprecalc        ; calculate colors
  306. ; hook file functions
  307.         mov     ecx, 4
  308.         call    malloc
  309.         and     dword [edi], 0
  310.         lea     eax, [edi-file_handler.position]
  311.         mov     byte [read], 0xE9
  312.         mov     dword [read+1], read_from_mem - (read+5)
  313. ; decode
  314.     call    jpeg_info
  315.     mov     dword [jpeg_st],ebp
  316.     test    ebp,ebp
  317.     jz      .end
  318.  
  319.         mov     eax, [ebp + x_size]
  320.         mul     dword [ebp + y_size]
  321.         lea     eax, [eax*3+8]
  322.         mov     ecx, eax
  323.         mcall   68, 12
  324.         test    eax, eax
  325.         jz      .end
  326.         add     eax, 8
  327.         mov     [ipc_mem_out], eax
  328.         mov     ebx, [ebp + x_size]
  329.         mov     [eax-8], ebx
  330.         mov     ebx, [ebp + y_size]
  331.         mov     [eax-4], ebx
  332.  
  333.     mov     dword [ebp+draw_ptr],put_chunk_to_mem
  334.     call    jpeg_display
  335.  
  336. ; IPC response
  337.         mov     esi, [ebp + x_size]
  338.         imul    esi, [ebp + y_size]
  339.         lea     esi, [esi*3+8]
  340.         mov     edx, [ipc_mem_out]
  341.         sub     edx, 8
  342. .response:
  343.         mov     ecx, [ipc_mem]
  344.         mov     ecx, [ecx+8]
  345.         mcall   60,2
  346.  
  347.     jmp     close_program       ; close the program right now
  348.  
  349. .end:
  350.         mov     esi, 8
  351.         mov     edx, x_pointer  ; points to 2 null dwords
  352.         jmp     .response
  353.  
  354. read_from_mem:
  355. ; in: eax=handle, ecx=size, edi=pointer to buffer
  356. ; out: ecx=number of read bytes, buffer filled
  357.         pushad
  358.         mov     esi, [ipc_mem]
  359.         add     esi, 16
  360.         add     esi, [eax+file_handler.position]
  361.         add     ecx, [eax+file_handler.position]
  362.         cmp     ecx, [ipc_mem_size]
  363.         jb      @f
  364.         mov     ecx, [ipc_mem_size]
  365. @@:
  366.         sub     ecx, [eax+file_handler.position]
  367.         add     [eax+file_handler.position], ecx
  368.         rep     movsb
  369.         popad
  370.         ret
  371.  
  372. ;******************************************************************************
  373.  
  374. put_chunk_to_mem:
  375. ; in: (eax,ebx) = start coordinates of chunk
  376. ;     (ecx,edx) = sizes of chunk
  377. ;     edi -> chunk data
  378.         push    esi edi edx
  379.         mov     esi, edi
  380.         mov     edi, ebx
  381.         imul    edi, [ebp + x_size]
  382.         add     edi, eax
  383.         lea     edi, [edi*3]
  384.         add     edi, [ipc_mem_out]
  385. @@:
  386.         push    ecx edi
  387.         lea     ecx, [ecx*3]
  388.         rep     movsb
  389.         pop     edi ecx
  390.         add     edi, [ebp + x_size]
  391.         add     edi, [ebp + x_size]
  392.         add     edi, [ebp + x_size]
  393.         dec     edx
  394.         jnz     @b
  395.         pop     edx edi esi
  396.         ret
  397.  
  398. ;******************************************************************************
  399.  
  400.  
  401.  
  402. ;   *********************************************
  403. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  404. ;   *********************************************
  405.  
  406.  
  407. draw_window:
  408.  
  409.     mov  eax,48
  410.     mov  ebx,3
  411.     mov  ecx,sc
  412.     mov  edx,sizeof.system_colors
  413.     mcall
  414.  
  415.     mov  eax,12
  416.     mov  ebx,1
  417.     mcall
  418.  
  419.     ; Draw the window to the appropriate size - it may have
  420.     ; been resized by the user
  421.     cmp     [winxs], 0
  422.     jne     dw_001
  423.  
  424.     ; Give the screen some inital defaults
  425.     mov     [winxs], 400
  426.     mov     [winys], 300
  427.     mov     ax, 100
  428.     mov     [winxo], ax
  429.     mov     [winyo], ax
  430.     jmp     dw_002
  431.  
  432. dw_001:
  433.     mov     eax, 9
  434.     mov ebx, memsize - 1024
  435.     mov ecx, -1
  436.     mcall
  437.     mov     eax, [ebx + 34]
  438.     mov     [winxo], ax
  439.     mov     eax, [ebx + 38]
  440.     mov     [winyo], ax
  441.     mov     eax, [ebx + 42]
  442.     mov     [winxs], ax
  443.     mov     eax, [ebx + 46]
  444.     mov     [winys], ax
  445.  
  446. dw_002:
  447.         mov     ebx, dword [winxo-2]
  448.         mov     bx, [winxs]
  449.         mov     ecx, dword [winyo-2]
  450.         mov     cx, [winys]
  451.  
  452.     xor  eax,eax                   ; DRAW WINDOW
  453.     mov  edx,[sc.work]
  454.     or   edx,0x33000000
  455.     mov  edi,title                ; WINDOW LABEL
  456.     mcall
  457.  
  458.  
  459.     mov  eax,8                     ; BUTTON 2: slideshow
  460.     mov  ebx,57
  461.     mov  cx, [winys]
  462.     sub  cx, 39
  463.     shl  ecx, 16
  464.     add  ecx, 12
  465.     mov  esi, [sc.work_button]
  466.     mov  edx,2
  467.     mcall
  468.  
  469.     mov  eax,4                     ; Button text
  470.     movzx ebx, word [winys]
  471.     add   ebx, 3 shl 16 - 36
  472.     mov  ecx,[sc.work_button_text]
  473.     mov  edx,setname
  474.     mov  esi,setnamelen-setname
  475.     mcall
  476.  
  477.  
  478.     mov  eax,8                     ; BUTTON 3: set as background
  479.     mov  bx, [winxs]
  480.     sub  bx, 65
  481.     shl  ebx, 16
  482.     mov  bx,55
  483.     mov  cx, [winys]
  484.     sub  cx, 39
  485.     shl  ecx, 16
  486.     add  ecx, 12
  487.     mov  esi, [sc.work_button]
  488.     mov  edx,3
  489.     mcall
  490.  
  491.     mov  eax,4                     ; Button text
  492.     movzx ebx, word [winxs]
  493.     sub   ebx, 63
  494.     shl   ebx,16
  495.     mov   bx, word [winys]
  496.     sub   bx,36
  497.     mov  ecx,[sc.work_button_text]
  498.     mov  edx,setbgr
  499.     mov  esi,setbgrlen-setbgr
  500.     mcall
  501.     call    print_strings
  502.     call    load_image
  503.     mov     eax,12                    ; function 12:tell os about windowdraw
  504.     mov     ebx,2                     ; 2, end of draw
  505.     mcall
  506.  
  507.     ret
  508.  
  509.  
  510.  
  511.     ; Read in the image file name.
  512. read_string:
  513.     movzx edi,byte[name_string.cursor]
  514.     add     edi,name_string
  515.     mov     eax,2
  516.     mcall                        ; Get the key value
  517.     shr     eax,8
  518.     cmp     eax,13                      ; Return key ends input
  519.     je      .rs_done
  520.     cmp     eax,8
  521.     jnz     .nobsl
  522.     cmp     edi,name_string
  523.     je      .exit
  524.     dec     edi
  525.     mov     [edi],byte 0;'_'
  526.     dec     byte[name_string.cursor]
  527.     jmp     print_strings
  528. .exit:   ret
  529. .nobsl:
  530.     cmp     eax,31
  531.     jbe     .exit
  532.     cmp     eax,97
  533.     jb      .keyok
  534.     sub     eax,32
  535. .keyok:
  536.     mov ah,0
  537.     stosw
  538.     cmp edi,name_string.end
  539.     jnc print_strings
  540.     inc byte[name_string.cursor]
  541.     jmp    print_strings
  542. .rs_done:
  543.     call   print_strings
  544.     mov     esi,name_string
  545.     call    open
  546.     test    eax,eax
  547.     jz      .exit
  548.     call    jpeg_info
  549.     test    ebp,ebp
  550.     jz      close
  551.     xchg    [jpeg_st],ebp
  552.     call jpeg_close
  553.  
  554. load_image:
  555.  
  556.     mov     eax,13              ; clear picture area
  557.     movzx    ebx, word [winxs]
  558.     add     ebx, 1  shl 16 -10
  559.     movzx    ecx, word [winys]
  560.     sub     ecx, 40
  561.     add     ecx, 1  shl 16
  562.  
  563.     mov     edx,[sc.work]
  564.     mcall
  565.     mov    ebp,[jpeg_st]
  566.     test    ebp,ebp
  567.     jz      .exit
  568.     mov     dword [ebp+draw_ptr],put_image
  569.     jmp    jpeg_display
  570.  .exit: ret
  571.  
  572. print_strings:
  573.     pusha
  574.     mov     eax,13              ; clear text area
  575.     movzx   ebx, word [winxs]
  576.     add     ebx, 59 shl 16 -125
  577.     mov     cx, [winys]
  578.     sub     cx, 39
  579.     shl     ecx, 16
  580.     add     ecx, 12
  581.     mov     edx,0xffffff
  582.     mcall
  583.  
  584.     mov     eax,4               ;
  585.     movzx   ebx, word [winys]
  586.     add     ebx, 61 shl 16 - 37
  587.     mov     ecx,0x000000
  588.     mov     edx,name_string
  589.     mov     esi,60
  590.     mcall
  591.     popa
  592.     ret
  593.  
  594. slideshow:
  595.         cmp     [file_dir], 0
  596.         jnz     .exit
  597.         cmp     [jpeg_st], 0
  598.         jz      .exit
  599.         mov     esi, name_string
  600.         movzx   ecx, byte [name_string.cursor]
  601. .l1:
  602.         cmp     byte [esi+ecx], '/'
  603.         jz      .l2
  604.         loop    .l1
  605. .exit:
  606.         ret
  607. .l2:
  608.         mov     byte [esi+ecx], 0
  609.         call    open
  610.         mov     byte [esi+ecx], '/'
  611.         test    eax, eax
  612.         jz      .exit
  613.         test    byte [fileattr], 0x10
  614.         jz      .exit
  615.         mov     [file_dir], eax
  616.         inc     ecx
  617.         mov     [name_string.cursor], cl
  618. display_next:
  619.         mov     ebx, [file_dir]
  620.         test    ebx, ebx
  621.         jnz     @f
  622.         ret
  623. @@:
  624.         mov     byte [ebx], 1
  625.         mov     byte [ebx+12], 1
  626.         mov     dword [ebx+16], dirinfo
  627.         mov     eax, 70
  628.         mcall
  629.         mov     eax, [file_dir]
  630.         inc     dword [eax+4]
  631.         cmp     ebx, 1
  632.         jz      @f
  633.         mov     eax, [file_dir]
  634.         and     [file_dir], 0
  635.         jmp     close
  636. @@:
  637.         movzx   edi, byte [name_string.cursor]
  638.         add     edi, name_string
  639.         lea     esi, [dirinfo+32+40]
  640. @@:
  641.         lodsb
  642.         stosb
  643.         test    al, al
  644.         jnz     @b
  645.         mov     ecx, name_string.end
  646.         sub     ecx, edi
  647.         rep     stosb
  648.     call   print_strings
  649.     mov     esi,name_string
  650.     call    open
  651.     test    eax,eax
  652.     jz      display_next
  653.     call    jpeg_info
  654.     test    ebp,ebp
  655.     jnz     .l6
  656.     call close
  657.     jmp display_next
  658.    .l6:
  659.     mov dword[ebp+draw_ptr],put_image
  660.     push ebp
  661.     xchg [jpeg_st],ebp
  662.     call jpeg_close
  663.     pop ebp
  664.     jmp jpeg_display
  665.  
  666.  
  667. include 'filelib.asm'
  668. include 'memlib.asm'
  669. include 'jpeglib.asm'
  670.  
  671.  
  672. ; DATA AREA
  673.  
  674. wcolor          dd  0x000000
  675. title          db  appname,version,0
  676. setname          db  'SLIDESHOW'
  677. setnamelen:
  678.  
  679. setbgr           db  '   BGR  '
  680. setbgrlen:
  681.  
  682. x_pointer       dd  0
  683. x_offset        dd  0
  684. x_numofbytes    dd  0
  685. x_numofb2       dd  0
  686. x_counter       dd  0
  687. winxo           dw  0
  688. winyo           dw  0
  689. winxs           dw  0
  690. winys           dw  0
  691. jpeg_st         dd  0
  692. file_dir        dd  0
  693. name_string:    db '/sys/jpegview.jpg',0
  694. rb 256
  695.     .end:
  696.     .cursor: db 19
  697.     .cursor2: db 0
  698.  
  699. align 4
  700.  
  701. rgb16:          db 0,4,8,13,17,21,25,29,34,38,42,46,50,55,59,63
  702. rgb4:           db 0,21,42,63
  703.  
  704. include 'jpegdat.asm'
  705.  
  706. align 4
  707.  
  708. iniciomemoria:
  709.               dd -(iniciomemoria+4),-(iniciomemoria+4),(iniciomemoria+4),.l1,0
  710. .l1           dd 0
  711.  
  712. I_END:
  713. sc     system_colors
  714. ipc_mem dd ?
  715. ipc_mem_size dd ?
  716. ipc_mem_out dd ?
  717. fileattr: rb 40
  718. dirinfo: rb 32+304
  719. fin:
  720.