;    IMGVIEW.ASM
;
;    This program displays jpeg images. The window can be resized.
;
;    Version 0.0    END OF 2003
;                   Octavio Vega
;    Version 0.1    7th March 2004
;                   Mike Hibbett ( very small part! )
;    Version 0.11   7th April 2004
;                   Ville Turjanmaa ( 'set_as_bgr' function )
;    Version 0.12   29th May 2004
;                   Ivan Poddubny (correct "set_as_bgr"+parameters+boot+...)
;    Version 0.12   30 de mayo 2004
;                   Octavio Vega
;                   bugs correction and slideshow
;    version 0.13   3 de junio 2004
;                   Octavio Vega
;                   unos retoques
;    version 0.14   10th August 2004
;                   Mike Hibbett Added setting default colours
;    version 0.15   24th August 2006
;                   diamond (rewritten to function 70)
;

               memsize=20000h
               org 0
 PARAMS     =    memsize - 1024

appname equ 'Jpegview '
version equ '0.15'

use32

               db     'MENUET01'              ; 8 byte id
               dd     0x01                    ; header version
               dd     START                   ; start of code
               dd     I_END                   ; size of image
               dd     memsize                 ; memory for app
               dd     memsize - 1024           ; esp
               dd     PARAMS , 0x0               ; I_Param , I_Icon

stack_size=4096 + 1024

include 'macros.inc'

START:                          ; start of execution

    cmp     [PARAMS], byte 0
    jne     check_parameters

    ; Calculate the 'free' memory available
    ; to the application, and create the malloc block from it
  .l1:
    mov     ecx,memsize-fin-stack_size
    mov     edi,fin
    call    add_mem

    call    colorprecalc ;inicializa tablas usadas para pasar de ybr a bgr
    call    draw_window
    call    read_string.rs_done

still:
    push still
    mov ebx,100                ;1 second
    mov  eax,23                 ; wait here for event
    int  0x40
    cmp  eax,1                  ; redraw request ?
    je   draw_window
    cmp  eax,2                  ; key in buffer ?
    je   read_string
    cmp  eax,3                  ; button in buffer ?
    je   button
    jmp display_next

button:                       ; BUTTON
    mov  eax,17
    int  0x40
    cmp ah,3
    je set_as_bgr2
    cmp ah,2
    je slideshow
    cmp  ah,1                   ; CLOSE PROGRAM
    jne  close_program.exit
close_program:
    mov  eax,-1
    int  0x40
  .exit:
    ret

   ; Put a 'chunk' of the image on the window
put_image:
    pushad

    lea ebp,[edx+eax+7]
    cmp  [winxs],bp
    jc     .l1
    lea ebp,[ecx+ebx+20+2+17]
    cmp [winys],bp
    jc     .l1

    add     eax,2  ; offset for boarder
    add     ebx,2 ; offset for title bar
    push    ax ; pox
    push    bx ; pos
    push    cx ; size
    push    dx ; size
    pop     ecx
    pop     edx
    mov     ebx,edi
    mov     eax,7

    int     40h                         ; Put image function
.l1:
    popad
    ret



;******************************************************************************

check_parameters:
    cmp     [PARAMS], dword "BOOT" ; received BOOT parameter -> goto handler
    je      boot_set_background

    mov     edi, name_string       ; clear string with file name
    mov     al,  0
    mov     ecx, 100
    rep     stosb

    mov     ecx, 100               ; calculate length of parameter string
    mov     edi, PARAMS
    repne   scasb
    sub     edi, PARAMS
    mov     ecx, edi

    mov     esi, PARAMS            ; copy parameters to file name
    mov     edi, name_string
    cld
    rep     movsb

    jmp     START.l1       ; return to beggining of the progra

;******************************************************************************



boot_set_background:

    mov     ecx,memsize-fin-stack_size  ; size
    mov     edi,fin                     ; pointer
    call    add_mem             ; mark memory from fin to 0x100000-1024 as free
    call    colorprecalc        ; calculate colors
    mov     esi,name_string
    call    open
    test    eax,eax
    jz      close_program
    call    jpeg_info
    mov dword [jpeg_st],ebp
    call    set_as_bgr2         ; set wallpaper
    jmp     close_program       ; close the program right now

;******************************************************************************
;******************************************************************************

set_as_bgr2:
    mov ebp,dword[jpeg_st]
    test    ebp,ebp
    jz      .end

    mov     dword [ebp+draw_ptr],put_chunk_to_bgr
    call    jpeg_display
    mov     eax, 15
    mov     ebx, 1
    mov     ecx, [ebp + x_size]
    mov     edx, [ebp + y_size]
    int     0x40

    ; Stretch the image to fit
    mov     eax, 15
    mov     ebx, 4
    mov     ecx, 2
    int     0x40

    mov     eax, 15
    mov     ebx, 3
    int     0x40


 .end:
    ret

;******************************************************************************

put_chunk_to_bgr:
    pushad

    mov     [x_pointer], edi
    mov     esi, ecx
    imul    esi, 3
    mov     [x_numofbytes], esi
    mov     ecx, [ebp + x_size]
    imul    ecx, ebx
    add     ecx, eax
    imul    ecx, 3
    mov     [x_offset], ecx
    mov     [x_counter], edx
    mov     eax, [ebp + x_size]
    imul    eax, 3
    mov     [x_numofb2], eax
 .new_string:
    mov     eax, 15
    mov     ebx, 5
    mov     ecx, [x_pointer]
    mov     edx, [x_offset]
    mov     esi, [x_numofbytes]
    int     0x40
    mov     eax, [x_numofbytes]
    add     [x_pointer], eax
    mov     eax, [x_numofb2]
    add     [x_offset], eax
    dec     [x_counter]
    jnz     .new_string

    popad
    ret

;******************************************************************************



;   *********************************************
;   *******  WINDOW DEFINITIONS AND DRAW ********
;   *********************************************


draw_window:

    mov  eax,48
    mov  ebx,3
    mov  ecx,sc
    mov  edx,sizeof.system_colors
    int  0x40

    mov  eax,12
    mov  ebx,1
    int  0x40

    ; Draw the window to the appropriate size - it may have
    ; been resized by the user
    cmp     [winxs], 0
    jne     dw_001

    ; Give the screen some inital defaults
    mov     [winxs], 400
    mov     [winys], 300
    mov     ax, 100
    mov     [winxo], ax
    mov     [winyo], ax
    jmp     dw_002

dw_001:
    mov     eax, 9
    mov ebx, memsize - 1024
    mov ecx, -1
    int     0x40
    mov     eax, [ebx + 34]
    mov     [winxo], ax
    mov     eax, [ebx + 38]
    mov     [winyo], ax
    mov     eax, [ebx + 42]
    mov     [winxs], ax
    mov     eax, [ebx + 46]
    mov     [winys], ax

dw_002:
        mov     ebx, dword [winxo-2]
        mov     bx, [winxs]
        mov     ecx, dword [winyo-2]
        mov     cx, [winys]

    xor  eax,eax                   ; DRAW WINDOW
    mov  edx,[sc.work]
    or   edx,0x33000000
    mov  edi,header                ; WINDOW LABEL
    int  0x40


    mov  eax,8                     ; BUTTON 2: slideshow
    mov  ebx,57
    mov  cx, [winys]
    sub  cx, 39
    shl  ecx, 16
    add  ecx, 12
    mov  esi, [sc.work_button]
    mov  edx,2
    int  0x40

    mov  eax,4                     ; Button text
    movzx ebx, word [winys]
    add   ebx, 3 shl 16 - 36
    mov  ecx,[sc.work_button_text]
    mov  edx,setname
    mov  esi,setnamelen-setname
    int  0x40


    mov  eax,8                     ; BUTTON 3: set as background
    mov  bx, [winxs]
    sub  bx, 65
    shl  ebx, 16
    mov  bx,55
    mov  cx, [winys]
    sub  cx, 39
    shl  ecx, 16
    add  ecx, 12
    mov  esi, [sc.work_button]
    mov  edx,3
    int  0x40

    mov  eax,4                     ; Button text
    movzx ebx, word [winxs]
    sub   ebx, 63
    shl   ebx,16
    mov   bx, word [winys]
    sub   bx,36
    mov  ecx,[sc.work_button_text]
    mov  edx,setbgr
    mov  esi,setbgrlen-setbgr
    int  0x40
    call    print_strings
    call    load_image
    mov     eax,12                    ; function 12:tell os about windowdraw
    mov     ebx,2                     ; 2, end of draw
    int     0x40

    ret



    ; Read in the image file name.
read_string:
    movzx edi,byte[name_string.cursor]
    add     edi,name_string
    mov     eax,2
    int     0x40                        ; Get the key value
    shr     eax,8
    cmp     eax,13                      ; Return key ends input
    je      .rs_done
    cmp     eax,8
    jnz     .nobsl
    cmp     edi,name_string
    je      .exit
    dec     edi
    mov     [edi],byte 0;'_'
    dec     byte[name_string.cursor]
    jmp     print_strings
.exit:   ret
.nobsl:
    cmp     eax,31
    jbe     .exit
    cmp     eax,97
    jb      .keyok
    sub     eax,32
.keyok:
    mov ah,0
    stosw
    cmp edi,name_string.end
    jnc print_strings
    inc byte[name_string.cursor]
    jmp    print_strings
.rs_done:
    call   print_strings
    mov     esi,name_string
    call    open
    test    eax,eax
    jz      .exit
    call    jpeg_info
    test    ebp,ebp
    jz      close
    xchg    [jpeg_st],ebp
    call jpeg_close

load_image:

    mov     eax,13              ; clear picture area
    movzx    ebx, word [winxs]
    add     ebx, 1  shl 16 -10
    movzx    ecx, word [winys]
    sub     ecx, 40
    add     ecx, 1  shl 16

    mov     edx,[sc.work]
    int     0x40
    mov    ebp,[jpeg_st]
    test    ebp,ebp
    jz      .exit
    mov     dword [ebp+draw_ptr],put_image
    jmp    jpeg_display
 .exit: ret

print_strings:
    pusha
    mov     eax,13              ; clear text area
    movzx   ebx, word [winxs]
    add     ebx, 59 shl 16 -125
    mov     cx, [winys]
    sub     cx, 39
    shl     ecx, 16
    add     ecx, 12
    mov     edx,0xffffff
    int     0x40

    mov     eax,4               ;
    movzx   ebx, word [winys]
    add     ebx, 61 shl 16 - 37
    mov     ecx,0x000000
    mov     edx,name_string
    mov     esi,60
    int     0x40
    popa
    ret

slideshow:
        cmp     [file_dir], 0
        jnz     .exit
        cmp     [jpeg_st], 0
        jz      .exit
        mov     esi, name_string
        movzx   ecx, byte [name_string.cursor]
.l1:
        cmp     byte [esi+ecx], '/'
        jz      .l2
        loop    .l1
.exit:
        ret
.l2:
        mov     byte [esi+ecx], 0
        call    open
        mov     byte [esi+ecx], '/'
        test    eax, eax
        jz      .exit
        test    byte [fileattr], 0x10
        jz      .exit
        mov     [file_dir], eax
        inc     ecx
        mov     [name_string.cursor], cl
display_next:
        mov     ebx, [file_dir]
        test    ebx, ebx
        jnz     @f
        ret
@@:
        mov     byte [ebx], 1
        mov     byte [ebx+12], 1
        mov     dword [ebx+16], dirinfo
        mov     eax, 70
        int     0x40
        mov     eax, [file_dir]
        inc     dword [eax+4]
        cmp     ebx, 1
        jz      @f
        mov     eax, [file_dir]
        and     [file_dir], 0
        jmp     close
@@:
        movzx   edi, byte [name_string.cursor]
        add     edi, name_string
        lea     esi, [dirinfo+32+40]
@@:
        lodsb
        stosb
        test    al, al
        jnz     @b
        mov     ecx, name_string.end
        sub     ecx, edi
        rep     stosb
    call   print_strings
    mov     esi,name_string
    call    open
    test    eax,eax
    jz      display_next
    call    jpeg_info
    test    ebp,ebp
    jnz     .l6
    call close
    jmp display_next
   .l6:
    mov dword[ebp+draw_ptr],put_image
    push ebp
    xchg [jpeg_st],ebp
    call jpeg_close
    pop ebp
    jmp jpeg_display


include 'filelib.asm'
include 'memlib.asm'
include 'jpeglib.asm'


; DATA AREA

wcolor          dd  0x000000
header          db  appname,version,0
setname          db  'SLIDESHOW'
setnamelen:

setbgr           db  '   BGR  '
setbgrlen:

x_pointer       dd  0
x_offset        dd  0
x_numofbytes    dd  0
x_numofb2       dd  0
x_counter       dd  0
winxo           dw  0
winyo           dw  0
winxs           dw  0
winys           dw  0
jpeg_st         dd  0
file_dir        dd  0
name_string:    db '/HD0/1/KOLIBRI/ETC/jpegview.jpg',0
rb 256
    .end:
    .cursor: db 19
    .cursor2: db 0

align 4

rgb16:          db 0,4,8,13,17,21,25,29,34,38,42,46,50,55,59,63
rgb4:           db 0,21,42,63

include 'jpegdat.asm'

align 4

iniciomemoria:
              dd -(iniciomemoria+4),-(iniciomemoria+4),(iniciomemoria+4),.l1,0
.l1           dd 0

fin:
I_END:
sc     system_colors
fileattr: rb 40
dirinfo: rb 32+304
