
pb_control_data_size              = 34
pb_redraw_all                     = 10000000b
pb_redraw_all_off                 = 01111111b
;pb_special_progress_on            = 00000001b
;pb_special_progress_off           = 11111110b

;****************************************************
;****************craete ProgressBar********************
;****************************************************
;IN
;pointer to parend
;pointer to ProgressBar's structure
;OUT
;pointer to initialized control
align 4

craete_progress_bar:

      push ebx
      push ecx
      push edx
      push esi
      push edi
      push ebp

      mov ebx,[esp+24+4]
      mov eax,[esp+24+8]

      mov [PointerToStructureForProgressBar],eax

      mov eax,control_header_size+pb_control_data_size
      call craete_control

      ;set all EditBox's parameters in control
      mov [eax],dword progress_bar

      mov ecx,pb_control_data_size
      mov esi,[PointerToStructureForProgressBar]
      mov edi,eax
      add edi,control_header_size
      rep movsb

      call get_skin_height

      mov ebx,[PointerToStructureForProgressBar]
      mov ecx,[ebx+10]  ;x
      mov edx,[ebx+14]  ;y
      mov esi,[ebx+18]  ;size x
      mov edi,[ebx+22]  ;size y
      add ecx,border_width
      add edx,[skin_height]
      ;copy information to control
      mov [eax+24],ecx
      mov [eax+28],edx
      mov [eax+32],esi
      mov [eax+36],edi

      pop ebp
      pop edi
      pop esi
      pop edx
      pop ecx
      pop ebx

      ret 8

;****************************************************
;*****************Draw ProgressBar********************
;****************************************************
;IN
;pointer to control of ProgressBar
;message
;OUT
;not returned value
align 4

progress_bar:

      ;get message
      mov eax,[esp+8]

      ;get pointer to control of button
      mov esi,[esp+4]
      mov [PointerForProgressBar],esi

      ;copy control to local control
      add esi,control_header_size
      mov edi,dword ProgressBar
      mov ecx,pb_control_data_size
      rep movsb


      push eax
      ;load coordinats and size from control
      mov eax,[PointerForProgressBar]
      mov ebx,[eax+24]           ;x
      mov ecx,[eax+28]           ;y
      mov edx,[eax+32]           ;size x
      mov esi,[eax+36]           ;size y
      ;set current coordinats and sizes in EeditBox
      mov [ProgressBar.x],ebx
      mov [ProgressBar.y],ecx
      mov [ProgressBar.sizex],edx
      mov [ProgressBar.sizey],esi

      pop eax


      cmp [eax],dword -1
      jne no_destroy_progress_bar

      jmp exit_progress_bar
      no_destroy_progress_bar:

      cmp [eax],dword 1
      jne no_redraw_all_progress_bar

         or [ProgressBar.type],pb_redraw_all

      no_redraw_all_progress_bar:

      cmp [eax],dword 3
      jne no_special_message_progress_bar

         xor eax,eax
         mov al,[ProgressBar.type]
         and al,activate_trap
         test al,al
         jz no_draw_progress_bar

           and [ProgressBar.type],deactivate_trap

           cmp [ProgressBar.progress],dword 0.02
           jae nofull_redraw
                call draw_all_progress_bar
           nofull_redraw:

           call draw_progress

         no_draw_progress_bar:
         jmp exit_progress_bar

      no_special_message_progress_bar:

      xor eax,eax
      mov al,[ProgressBar.type]
      and al,pb_redraw_all
      test al,al
      jz no_draw_all_progress_bar

         and [ProgressBar.type],pb_redraw_all_off

          call draw_all_progress_bar

         jmp exit_progress_bar

      no_draw_all_progress_bar:


      exit_progress_bar:

      mov edi,[PointerForProgressBar]
      add edi,control_header_size
      mov esi,dword ProgressBar
      mov ecx,pb_control_data_size
      rep movsb

      ret 8

draw_all_progress_bar:

         mov eax,[ProgressBar.color3]
         mov ebx,dword 0xffffff
         mov ecx,20
         mov edx,dword colors_table1
         call gradient

         mov eax,13
         mov ebx,[ProgressBar.x]
         mov ecx,[ProgressBar.y]
         mov edx,[ProgressBar.color1]
         shl ebx,16
         shl ecx,16
         add ebx,[ProgressBar.sizex]
         add ecx,[ProgressBar.sizey]
         mcall

         mov eax,[ProgressBar.x]
         mov ebx,[ProgressBar.y]
         add eax,[ProgressBar.sizex]
         add ebx,[ProgressBar.sizey]
         mov [v],eax    ;v=x+sizex
         mov [v2],ebx   ;v2=y+sizey

         ;dark lines
         mov eax,[ProgressBar.color3]
         and eax,0xffffff
         mov [Line.color],eax
         mov [Pixel.color],eax

         ;(x+1,y)-(x+sizex-1,y)
         mov eax,[ProgressBar.x]
         mov ebx,[ProgressBar.y]
         mov ecx,[v]
         add eax,1
         sub ecx,1
         mov [Line.x1],eax
         mov [Line.x2],ecx
         mov [Line.y1],ebx
         mov [Line.y2],ebx
         call DrawLine

         ;(x+sizex,y+1)-(x+sizex,y+sizey-1)
         mov eax,[v]
         mov ebx,[v2]
         mov ecx,[ProgressBar.y]
         add ecx,1
         sub ebx,1
         mov [Line.x1],eax
         mov [Line.x2],eax
         mov [Line.y1],ecx
         mov [Line.y2],ebx
         call DrawLine

         ;(x+1,y+sizey)-(x+sizex-1,y+sizey)
         mov eax,[ProgressBar.x]
         mov ebx,[v]
         mov ecx,[v2]
         add eax,1
         sub ebx,1
         mov [Line.x1],eax
         mov [Line.x2],ebx
         mov [Line.y1],ecx
         mov [Line.y2],ecx
         call DrawLine

         ;(x,y+1)-(x,y_sizey-1)
         mov eax,[ProgressBar.x]
         mov ebx,[ProgressBar.y]
         mov ecx,[v2]
         add ebx,1
         sub ecx,1
         mov [Line.x1],eax
         mov [Line.x2],eax
         mov [Line.y1],ebx
         mov [Line.y2],ecx
         call DrawLine

         ;(x+1,y+1)-(x+1,y+2)
         mov eax,[ProgressBar.x]
         mov ebx,[ProgressBar.y]
         mov ecx,ebx
         add eax,1
         add ebx,1
         add ecx,2
         mov [Line.x1],eax
         mov [Line.x2],eax
         mov [Line.y1],ebx
         mov [Line.y2],ecx
         call DrawLine

         ;(x+2,y+1)
         mov eax,[ProgressBar.x]
         mov ebx,[ProgressBar.y]
         add eax,2
         add ebx,1
         mov [Pixel.x],eax
         mov [Pixel.y],ebx
         call DrawPixel

         ;(x+1,y+sizey-1)-(x+1,y+sizey-2)
         mov eax,[ProgressBar.x]
         mov ebx,[v2]
         mov ecx,ebx
         add eax,1
         sub ebx,1
         sub ecx,2
         mov [Line.x1],eax
         mov [Line.x2],eax
         mov [Line.y1],ebx
         mov [Line.y2],ecx
         call DrawLine

         ;(x+2,y+sizey-1)
         mov eax,[ProgressBar.x]
         mov ebx,[v2]
         add eax,2
         sub ebx,1
         mov [Pixel.x],eax
         mov [Pixel.y],ebx
         call DrawPixel

         ;(x+sizex-1,y+1)-(x+sizex-1,y+2)
         mov eax,[v]
         mov ebx,[ProgressBar.y]
         mov ecx,ebx
         sub eax,1
         add ebx,1
         add ecx,2
         mov [Line.x1],eax
         mov [Line.x2],eax
         mov [Line.y1],ebx
         mov [Line.y2],ecx
         call DrawLine

         ;(x+sizex-2,y+1)
         mov eax,[v]
         mov ebx,[ProgressBar.y]
         sub eax,2
         add ebx,1
         mov [Pixel.x],eax
         mov [Pixel.y],ebx
         call DrawPixel

         ;(x+sizex-1,y+sizey-2)-(x+sizex-1,y+sizey-1)
         mov eax,[v]
         mov ebx,[v2]
         mov ecx,ebx
         sub eax,1
         sub ebx,2
         sub ecx,1
         mov [Line.x1],eax
         mov [Line.x2],eax
         mov [Line.y1],ebx
         mov [Line.y2],ecx
         call DrawLine

         ;(x+sizex-2,y+sizey-1)
         mov eax,[v]
         mov ebx,[v2]
         sub eax,2
         sub ebx,1
         mov [Pixel.x],eax
         mov [Pixel.y],ebx
         call DrawPixel

         mov eax,[colors_table1+10*3]
         and eax,0xffffff
         mov [Line.color],eax
         mov [Pixel.color],eax

         ;(x+3,y+1)-(x+sizex-3,y+1)
         mov eax,[ProgressBar.x]
         mov ebx,[v]
         mov ecx,[ProgressBar.y]
         add ecx,1
         add eax,3
         sub ebx,3
         mov [Line.x1],eax
         mov [Line.x2],ebx
         mov [Line.y1],ecx
         mov [Line.y2],ecx
         call DrawLine

         ;(x+2,y+2)
         mov eax,[ProgressBar.x]
         mov ebx,[ProgressBar.y]
         add eax,2
         add ebx,2
         mov [Pixel.x],eax
         mov [Pixel.y],ebx
         call DrawPixel

         ;(x+sizex-1,y+3)-(x+sizex-1,y+sizey-3)
         mov eax,[v]
         mov ebx,[v2]
         mov ecx,[ProgressBar.y]
         sub eax,1
         sub ebx,3
         add ecx,3
         mov [Line.x1],eax
         mov [Line.x2],eax
         mov [Line.y1],ecx
         mov [Line.y2],ebx
         call DrawLine

         ;(x+sizex-2,y+2)
         mov eax,[v]
         mov ebx,[ProgressBar.y]
         sub eax,2
         add ebx,2
         mov [Pixel.x],eax
         mov [Pixel.y],ebx
         call DrawPixel

         ;(x+3,y+sizey-1)-(x+sizex-3,y+sizey-1)
         mov eax,[ProgressBar.x]
         mov ebx,[v]
         mov ecx,[v2]
         sub ebx,3
         sub ecx,1
         add eax,3
         mov [Line.x1],eax
         mov [Line.x2],ebx
         mov [Line.y1],ecx
         mov [Line.y2],ecx
         call DrawLine

         ;(x+sizex-2,y+sizey-2)
         mov eax,[v]
         mov ebx,[v2]
         sub eax,2
         sub ebx,2
         mov [Pixel.x],eax
         mov [Pixel.y],ebx
         call DrawPixel

         ;(x+1,y+3)-(x+1,y+sizey-3)
         mov eax,[ProgressBar.x]
         mov ebx,[ProgressBar.y]
         mov ecx,[v2]
         add eax,1
         add ebx,3
         sub ecx,3
         mov [Line.x1],eax
         mov [Line.x2],eax
         mov [Line.y1],ebx
         mov [Line.y2],ecx
         call DrawLine

         ;(x+2,y+sizey-2)
         mov eax,[ProgressBar.x]
         mov ebx,[v2]
         add eax,2
         sub ebx,2
         mov [Pixel.x],eax
         mov [Pixel.y],ebx
         call DrawPixel

         ret

draw_progress:

         cmp [ProgressBar.progress],dword 0.02
         jae min_size_ok

         mov [ProgressBar.progress],dword 0.02
         min_size_ok:

         cmp [ProgressBar.progress],dword 1.0
         jle max_size_ok

         mov [ProgressBar.progress],dword 1.0
         max_size_ok:

         mov eax,[ProgressBar.sizex]
         sub eax,6
         mov [v2],eax

         fld [ProgressBar.progress]
         fild [v2]
         fmul st0,st1
         fistp [v3]
         fstp st0

         mov eax,[ProgressBar.color2]
         mov ebx,0xffffff
         mov ecx,[ProgressBar.x]
         mov edx,[ProgressBar.y]
         mov esi,[v3]
         mov edi,[ProgressBar.sizey]
         sub edi,4
         shr edi,1
         add ecx,3
         add edx,1

         call rectangle_gradient_up

         mov eax,[ProgressBar.color2]
         mov ebx,0xffffff
         mov ecx,[ProgressBar.x]
         mov edx,[ProgressBar.y]
         mov esi,[v3]
         mov edi,[ProgressBar.sizey]
         sub edi,4
         shr edi,1
         add ecx,3
         add edx,2
         add edx,edi

         call rectangle_gradient_down

         ret