
;button's types
bt_check_text_type                 = 00000001b
bt_check_picture_type              = 00000010b
bt_check_picture_text_type         = 00000100b
bt_no_draw                         = 00001000b
bt_check_3D_type                   = 00010000b
bt_check_full_redraw               = 10000000b
bt_full_redraw_off                 = 01111111b

;button's flags
bt_crossing                        = 00000001b
bt_crossing_pressing               = 00000011b
bt_crossing_pressing_off           = 11111100b

bt_control_data_size               = 50

;****************************************************
;******************craete Button**********************
;****************************************************
;IN
;pointer to parend
;pointer to Buttton's structure
;OUT
;pointer to initialized Button's structure
align 4

craete_button:

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

      mov ebx,[esp+24+4] ;parend
      mov eax,[esp+24+8] ;control

      mov [PointerToStructureForButton],eax

      mov eax,control_header_size+bt_control_data_size
      call craete_control

      ;set all button's parameters in control
      mov ecx,dword button
      mov [eax],dword button

      mov ecx,bt_control_data_size
      mov esi,[PointerToStructureForButton]
      mov edi,eax
      add edi,control_header_size
      rep movsb

      mov ebx,[PointerToStructureForButton]
      xor ecx,ecx
      xor edx,edx
      xor esi,esi
      xor edi,edi
      mov cx,[ebx+2]   ;button x
      mov dx,[ebx+4]   ;button y
      mov si,[ebx+6]   ;button size x
      mov di,[ebx+8]   ;button size y

      call get_skin_height
      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 Button**********************
;****************************************************
;IN
;pointer to control of button
;message
;OUT
;not returned value
align 4

button:

      ;get message
      mov eax,[esp+8]

      ;get pointer to control of button
      mov esi,[esp+4]
      mov [PointerForButton],esi
      ;copy control to local control
      mov edi,dword Button
      mov ecx,control_header_size+bt_control_data_size
      cld
      rep movsb


      cmp [eax],dword 1
      jne no_redraw_all_button

      or [Button.type],bt_check_full_redraw
      no_redraw_all_button:

      cmp [eax],dword 2
      jne no_keys_button

      jmp exit_button
      no_keys_button:

      cmp [eax],dword 3
      jne no_pressed_button_button

      jmp exit_button
      no_pressed_button_button:

      cmp [eax],dword 6
      jne no_mouse_button

      mov esi,[eax+4]
      mov edi,[eax+8]
      mov ecx,[eax+12]
      mov [Button.mouseX],si
      mov [Button.mouseY],di
      mov [ButtonsOfMouse],ecx

      no_mouse_button:


      cmp [eax],dword -1
      jne no_delete_button

      jmp exit_button
      no_delete_button:

      ;load coordinats and size from control
      mov eax,[PointerForButton]
      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 zakladka
      mov [Button.x],bx
      mov [Button.y],cx
      mov [Button.width],dx
      mov [Button.height],si


      mov [Button.color2],0xffffff

      xor eax,eax
      mov al,[Button.type]
      and al,bt_check_full_redraw
      test al,al
      jz  no_redraw_button

      and [Button.type],bt_full_redraw_off

      mov esi,dword Button
      mov edi,[PointerForButton]
      add esi,control_header_size
      add edi,control_header_size
      mov ecx,2
      cld
      rep movsb

      ;if bit 3 is tru than no draw button
      mov al,[Button.type]
      and al,bt_no_draw
      test al,al
      jnz  no_draw_button

      ;generate colors tables
      mov eax,[Button.color1]
      mov ebx,0xffffff
      mov ecx,20
      mov edx,dword colors_table1
      call gradient

      xor eax,eax
      mov ebx,[Button.color1]
      mov ecx,20
      mov edx,dword colors_table2
      call gradient

      xor eax,eax
      mov al,[Button.type]

      and al,bt_check_3D_type
      test al,al
      jz no_3d_button

      ;draw gradient up rectangle
      mov eax,[Button.color1]
      mov ebx,[Button.color2]
      and eax,0xffffff
      and ebx,0xffffff
      xor ecx,ecx
      xor edx,edx
      xor esi,esi
      xor edi,edi
      mov cx,[Button.x]
      mov dx,[Button.y]
      mov si,[Button.width]
      mov di,[Button.height]
      add cx,1
      add dx,2
      sub si,1
      sub di,3
      call rectangle_gradient_up

      mov eax,[Button.color1]
      mov [Line.color],eax

      ;draw left vertical line
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y1],3
      add [Line.y2],ecx
      call DrawLine

      ;draw right vertical line
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add eax,esi
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y1],3
      add [Line.y2],ecx
      call DrawLine

      ;draw down 1 horizontal line
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add ebx,ecx
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x1],1
      sub esi,1
      add [Line.x2],esi
      call DrawLine

      ;draw up light horizontal rectangle
      xor ecx,ecx
      xor esi,esi
      mov si,[Button.height]
      mov di,[Button.width]
      mov eax,13
      mov bx,[Button.x]
      mov cx,[Button.y]
      mov edx,0xffffff
      add ebx,2
      add ecx,1
      shl ebx,16
      shl ecx,16
      sub edi,3
      add ebx,edi
      add ecx,2
      mcall

      ;draw left light vertical line
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor edx,edx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]

      ;calculate color
      mov dx,[Button.height]
      sub edx,3+2
      mov esi,[pointer+edx*3]
      and esi,0xffffff
      add eax,1
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      mov [Line.color],esi; dword 0xffffff
      add [Line.y1],2
      sub ecx,3
      add [Line.y2],ecx
      call DrawLine

      ;draw right light vertical line
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor edx,edx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]

      add ax,[Button.width]
      sub eax,1
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y1],2
      sub ecx,3
      add [Line.y2],ecx
      call DrawLine

      mov eax,[pointer+3*3]
      and eax,0xffffff
      mov [Button.color2],eax
      mov [Line.color],eax

      ;draw up light left vertical line 1
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y2],2
      call DrawLine

      ;draw up light right vertical line 1
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add eax,esi
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y2],2
      call DrawLine

      ;draw up light left vertical line 2
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add eax,1
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y2],1
      call DrawLine

      ;draw up light right vertical line 2
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add eax,esi
      sub eax,1
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y2],1
      call DrawLine

      ;draw up light horizontal line
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x1],2
      sub esi,2
      add [Line.x2],esi
      call DrawLine

      mov eax,[pointer+3*3]
      mov ebx,[pointer+3*9]
      and eax,0xffffff
      and ebx,0xffffff
      call calculate_average_color

      mov [Pixel.color],eax

      ;(x,y)
      xor eax,eax
      xor ebx,ebx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov [Pixel.x],eax
      mov [Pixel.y],ebx
      call DrawPixel

      ;(x+size_x,y)
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.width]
      add eax,ecx
      mov [Pixel.x],eax
      mov [Pixel.y],ebx
      call DrawPixel

      ;(x+1,y+1)
      xor eax,eax
      xor ebx,ebx
      mov ax,[Button.x]
      mov bx,[Button.y]
      add eax,1
      add ebx,1
      mov [Pixel.x],eax
      mov [Pixel.y],ebx
      call DrawPixel

      ;(x+size_x-1,y+1)
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.width]
      add eax,ecx
      sub eax,1
      add ebx,1
      mov [Pixel.x],eax
      mov [Pixel.y],ebx
      call DrawPixel

      ;(x,y+size_y)
      xor eax,eax
      xor ebx,ebx
      mov ax,[Button.x]
      mov bx,[Button.y]
      add bx,[Button.height]
      mov [Pixel.x],eax
      mov [Pixel.y],ebx
      call DrawPixel

      ;(x+size_x,y+size_y)
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.width]
      add eax,ecx
      add bx,[Button.height]
      mov [Pixel.x],eax
      mov [Pixel.y],ebx
      call DrawPixel

      ;(x+1,y+size_y-2)
      xor eax,eax
      xor ebx,ebx
      mov ax,[Button.x]
      mov bx,[Button.y]
      add eax,1
      add bx,[Button.height]
      sub ebx,2
      mov [Pixel.x],eax
      mov [Pixel.y],ebx
      call DrawPixel

      ;(x+size_x-1,y+size_y-2)
      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.width]
      add eax,ecx
      sub eax,1
      add bx,[Button.height]
      sub ebx,2
      mov [Pixel.x],eax
      mov [Pixel.y],ebx
      call DrawPixel

      no_3d_button:

      ;****************************
      ;*********2D button**********
      ;****************************
      xor eax,eax
      mov al,[Button.type]
      and al,bt_check_3D_type
      test al,al
      jnz no_2D_button

      mov edx,[colors_table1+18]
      and edx,0xffffff

      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      xor edi,edi
      mov si,[Button.width]
      mov di,[Button.height]
      mov eax,13
      mov bx,[Button.x]
      mov cx,[Button.y]
      add ebx,1
      add ecx,1
      sub si,1
      sub di,1
      shl ebx,16
      shl ecx,16
      add ebx,esi
      add ecx,edi
      mcall

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

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov si,[Button.width]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x2],esi
      call DrawLine

      mov eax,[colors_table2+8*3]
      and eax,0xffffff
      mov [Line.color],eax

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add eax,esi
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add ebx,ecx
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x2],esi
      call DrawLine

      no_2D_button:

      no_draw_button:

      ;check drawing text on the button
      xor eax,eax
      mov al,[Button.type]

      and al,bt_check_text_type
      test al,al
      jz no_button_only_with_text

       call DrawStringOnTheButton
       jmp end_case_button
      no_button_only_with_text:

      ;check drawing picture on the button
      xor eax,eax
      mov al,[Button.type]
      and al,bt_check_picture_type
      test al,al
      jz no_button_only_with_picture

        call DrawPictureOnTheButton
        jmp end_case_button
      no_button_only_with_picture:


      xor eax,eax
      mov al,[Button.type]
      and al,bt_check_picture_text_type
      test al,al
      jz no_button_with_text_and_picture

      ;draw string in coordinats (textX,textY)
      xor eax,eax
      xor ebx,ebx
      mov ax,[Button.textX]
      mov bx,[Button.textY]
      add ax,[Button.x]
      add bx,[Button.y]
      mov [Font.x],eax
      mov [Font.y],ebx
      call DrawString

      ;draw picture in coordinats (imageX,imageY)
      xor eax,eax
      xor ebx,ebx
      mov ax,[Button.imageX]
      mov bx,[Button.imageY]
      add ax,[Button.x]
      add bx,[Button.y]
      mov [xo],eax
      mov [x],eax
      mov [y],ebx

      xor esi,esi
      xor edi,edi
      mov si,[Button.imageSizeX]
      mov di,[Button.imageSizeY]
      mov ebp,[Button.image]

      xor eax,eax
      inc eax

        loop_y_image_:

          mov ebx,[xo]
          mov [x],ebx

          xor esi,esi
          mov si,[Button.imageSizeX]

          loop_x_image_:

             mov edx,[ebp]
             and edx,0xffffff
             cmp edx,[Button.transparentColor]
             je no_draw_pixel_

               mov ebx,[x]
               mov ecx,[y]
               mcall
             no_draw_pixel_:

             add ebp,3
             add [x],1
          dec esi
          jnz  loop_x_image_

          add [y],1
        dec edi
        jnz loop_y_image_

      no_button_with_text_and_picture:

      no_redraw_button:

      end_case_button:

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor edx,edx
      xor esi,esi
      xor edi,edi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.width]
      mov dx,[Button.height]
      mov si,[Button.mouseX]
      mov di,[Button.mouseY]
      call CheckCrossingBox

      cmp eax,0xffffff
      jne no_crossing

        xor ebx,ebx
        mov bl,[Button.type]
        and bl,bt_check_3D_type
        test bl,bl
        jz button_active_2D

         push eax
           mov eax,[ButtonsOfMouse]

           cmp eax,1
           je button_pressed_3d_

             xor eax,eax
             mov al,[Button.type]
             and al,bt_no_draw
             test al,al
             jnz no_draw_active_button_3d_

               call Draw3DActiveButton

             no_draw_active_button_3d_:

             mov [Button.flag],byte bt_crossing
           jmp exit_button_pressed_3d_

           button_pressed_3d_:

           xor eax,eax
           mov al,[Button.type]
           and al,bt_no_draw
           test al,al
           jnz no_draw_pressed_button_3d_

            call DrawPressed3DButton

           no_draw_pressed_button_3d_:

           mov [Button.flag],byte bt_crossing_pressing

           exit_button_pressed_3d_:

         pop eax

         ;save flag
         mov esi,dword Button
         mov edi,[PointerForButton]
         add esi,control_header_size
         add edi,control_header_size
         mov ecx,2
         cld
         rep movsb
         jmp no_crossing

        button_active_2D:

         push eax
           mov eax,[ButtonsOfMouse]

           cmp eax,1
           je button_pressed_2d

           xor eax,eax
           mov al,[Button.type]
           and al,bt_no_draw
           test al,al
           jnz no_active_button_2d_

            call Draw2DActiveButton

           no_active_button_2d_:

           mov [Button.flag],byte bt_crossing
           jmp exit_button_pressed_2d
           button_pressed_2d:

           xor eax,eax
           mov al,[Button.type]
           and al,bt_no_draw
           test al,al
           jnz no_draw_pressed_button_2d_

            call DrawPressed2DButton

           no_draw_pressed_button_2d_:

           mov [Button.flag],byte bt_crossing_pressing
           exit_button_pressed_2d:

         pop eax

         ;save flag
         mov esi,dword Button
         mov edi,[PointerForButton]
         add esi,control_header_size
         add edi,control_header_size
         mov ecx,2
         cld
         rep movsb
      no_crossing:

      cmp eax,0xffffff
      je yes_crossing
      xor ebx,ebx
      mov bl,[Button.flag]
      and bl,bt_crossing
      test bl,bl
      jz yes_crossing

        xor ebx,ebx
        mov bl,[Button.type]
        and bl,bt_check_3D_type
        test bl,bl
        jz button_put_2D

         push eax

         xor eax,eax
         mov al,[Button.type]
         and al,bt_no_draw
         test al,al
         jnz no_draw_button_active_3d__

          call Put3DActiveButton
         no_draw_button_active_3d__:

         pop eax

         and [Button.flag],bt_crossing_pressing_off
         mov esi,dword Button
         mov edi,[PointerForButton]
         add edi,control_header_size
         add esi,control_header_size
         mov ecx,2
         cld
         rep movsb
         jmp yes_crossing

        button_put_2D:

        push eax

        xor eax,eax
        mov al,[Button.type]
        and al,bt_no_draw
        test al,al
        jnz no_draw_button_active_2d__

         call Put2DActiveButton

        no_draw_button_active_2d__:

        pop eax

        and [Button.flag],bt_crossing_pressing_off
        mov esi,dword Button
        mov edi,[PointerForButton]
        add esi,control_header_size
        add edi,control_header_size
        mov ecx,2
        cld
        rep movsb
      yes_crossing:

      exit_button:

      ret 8

DrawStringOnTheButton:

      ;xor ebx,ebx
      mov ebx,[Button.text]
      call GetLengthString
      imul eax,6  ;[Font.sizeX]
      xor ebx,ebx
      mov bx,[Button.width]
      shr eax,1
      shr ebx,1
      sub ebx,eax
      xor eax,eax
      mov ax,[Button.x]
      add eax,ebx
      mov [Font.x],eax
      xor ebx,ebx
      mov bx,[Button.height]
      shr ebx,1
      sub ebx,3;[Font.sizeY]
      xor eax,eax
      mov ax,[Button.y]
      add eax,ebx
      mov [Font.y],eax
      call DrawString

      ret

DrawPictureOnTheButton:

        xor esi,esi
        xor edi,edi
        xor eax,eax
        xor ebx,ebx
        mov ax,[Button.height]
        mov bx,[Button.width]
        mov di,[Button.imageSizeY]
        mov si,[Button.imageSizeX]
        shr ax,1
        shr bx,1
        shr si,1
        shr di,1
        sub ax,di
        sub bx,si
        add ax,[Button.y]
        add bx,[Button.x]
        mov [xo],ebx
        mov [x],ebx
        mov [y],eax

        xor esi,esi
        xor edi,edi
        mov si,[Button.imageSizeX]
        mov di,[Button.imageSizeY]
        mov ebp,[Button.image]

        xor eax,eax
        inc eax

        loop_y_image:

           mov ebx,[xo]
           mov [x],ebx

          xor esi,esi
          mov si,[Button.imageSizeX]

          loop_x_image:

             mov edx,[ebp]
             and edx,0xffffff
             cmp edx,[Button.transparentColor]
             je no_draw_pixel

               mov ebx,[x]
               mov ecx,[y]
               mcall
             no_draw_pixel:

             add ebp,3
             add [x],1
          dec esi
          jnz  loop_x_image

          add [y],1
        dec edi
        jnz loop_y_image

      ret


Draw3DActiveButton:

      ;call calculate_average_color
      mov [Line.color],0xffffff;eax

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y1],3
      sub ecx,1
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add eax,esi
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y1],3
      sub ecx,1
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      add ebx,ecx
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x1],1
      xor ecx,ecx
      mov cx,[Button.width]
      sub ecx,1
      add [Line.x2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x1],1
      xor ecx,ecx
      mov cx,[Button.width]
      sub ecx,1
      add [Line.x2],ecx
      call DrawLine

      ret

Put3DActiveButton:

      mov eax,[Button.color1]
      mov ebx,0xffffff
      mov ecx,20
      mov edx,dword pointer
      call gradient

      mov eax,[pointer+3];[Button.color1]
      and eax,0xffffff
      mov [Line.color],eax

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y1],3
      sub ecx,1
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add eax,esi
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y1],3
      sub ecx,1
      add [Line.y2],ecx
      call DrawLine


      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      add ebx,ecx
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x1],1
      xor ecx,ecx
      mov cx,[Button.width]
      sub ecx,1
      add [Line.x2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x1],1
      xor ecx,ecx
      mov cx,[Button.width]
      sub ecx,1
      add [Line.x2],ecx
      call DrawLine

      ret

DrawPressed3DButton:


      mov eax,[Button.color1]
      mov ebx,0xffffff
      mov ecx,20
      mov edx,dword pointer
      call gradient

      mov edx,[pointer+3]
      and edx,0xffffff
      mov [Line.color],edx

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y1],3
      sub ecx,1
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add eax,esi
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y1],3
      sub ecx,1
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      add ebx,ecx
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x1],1
      xor ecx,ecx
      mov cx,[Button.width]
      sub ecx,1
      add [Line.x2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x1],1
      xor ecx,ecx
      mov cx,[Button.width]
      sub ecx,1
      add [Line.x2],ecx
      call DrawLine

      ret

Draw2DActiveButton:

      mov edx,[colors_table1]
      and edx,0xffffff
      ;mov [Button.color2],edx

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      mov [Line.color],edx
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov si,[Button.width]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x2],esi
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add eax,esi
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add ebx,ecx
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x2],esi
      call DrawLine

      ret

Put2DActiveButton:

      mov edx,[pointer+15*3]
      and edx,0xffffff

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      mov [Line.color],edx
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov si,[Button.width]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x2],esi
      call DrawLine

      mov edx,[colors_table2+8*3]
      and edx,0xffffff

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add eax,esi
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      mov [Line.color],edx
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add ebx,ecx
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x2],esi
      call DrawLine

      ret

DrawPressed2DButton:

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      and [Line.color],0
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      ;mov cx,[Button.height]
      mov si,[Button.width]
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x2],esi
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add eax,esi
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      mov [Line.color],0xffffff
      add [Line.y2],ecx
      call DrawLine

      xor eax,eax
      xor ebx,ebx
      xor ecx,ecx
      xor esi,esi
      mov ax,[Button.x]
      mov bx,[Button.y]
      mov cx,[Button.height]
      mov si,[Button.width]
      add ebx,ecx
      mov [Line.x1],eax
      mov [Line.x2],eax
      mov [Line.y1],ebx
      mov [Line.y2],ebx
      add [Line.x2],esi
      call DrawLine

      ret
