DrawLine: mov eax,38 mov ebx,[Line.x1] mov ecx,[Line.y1] mov edx,[Line.color] shl ebx,16 shl ecx,16 add ebx,[Line.x2] add ecx,[Line.y2] mcall ret DrawPixel: xor eax,eax inc al mov ebx,[Pixel.x] mov ecx,[Pixel.y] mov edx,[Pixel.color] mcall ret RectangleContour: mov eax,38 mov ebx,[Rectangle.x] mov ecx,[Rectangle.y] mov edx,[Rectangle.color] mov esi,ebx mov edi,ecx shl ebx,16 shl ecx,16 add ebx,esi add ecx,edi add ebx,[Rectangle.width] mcall mov eax,38 mov ebx,[Rectangle.x] mov ecx,[Rectangle.y] mov edx,[Rectangle.color] add ecx,[Rectangle.height] mov esi,ebx mov edi,ecx shl ebx,16 shl ecx,16 add ebx,esi add ecx,edi add ebx,[Rectangle.width] mcall mov eax,38 mov ebx,[Rectangle.x] mov ecx,[Rectangle.y] mov edx,[Rectangle.color] mov esi,ebx mov edi,ecx shl ebx,16 shl ecx,16 add ebx,esi add ecx,edi add ecx,[Rectangle.height] mcall mov eax,38 mov ebx,[Rectangle.x] mov ecx,[Rectangle.y] mov edx,[Rectangle.color] add ebx,[Rectangle.width] mov esi,ebx mov edi,ecx shl ebx,16 shl ecx,16 add ebx,esi add ecx,edi add ecx,[Rectangle.height] mcall ret ;eax -first color ;ebx- second color ;OUT ;eax - averege color calculate_average_color: and eax,0xffffff and ebx,0xffffff mov [b_min],al mov [b_max],bl shr eax,8 shr ebx,8 mov [g_min],al mov [g_max],bl shr eax,8 shr ebx,8 mov [r_min],al mov [r_max],bl xor eax,eax xor ebx,ebx mov al,[r_max] mov bl,[r_min] add eax,ebx shr eax,1 mov [r],al xor eax,eax xor ebx,ebx mov al,[g_max] mov bl,[g_min] add eax,ebx shr eax,1 mov [g],al xor eax,eax xor ebx,ebx mov al,[b_max] mov bl,[b_min] add eax,ebx shr eax,1 mov [b],al xor eax,eax mov al,[r] shl eax,8 mov al,[g] shl eax,8 mov al,[b] ret ;eax -color ;ebx- sub value ;OUT ;eax - sabved color calculate_sabved_color: and eax,0xffffff mov [b],al shr eax,8 mov [g],al shr eax,8 mov [r],al sub [r],bl sub [g],bl sub [b],bl xor eax,eax mov al,[r] shl eax,8 mov al,[g] shl eax,8 mov al,[b] ret DrawString: mov ebx,[Button.text] call GetLengthString mov esi,eax mov eax,4 mov ebx,[Font.x] shl ebx,16 add ebx,[Font.y] mov ecx,[Button.textcolor] mov edx,[Button.text] mcall ret ;eax -first color ;ebx- second color ;ecx- x coordinat of rectangle ;edx- y coordinat of rectangle ;esi- rectangle size x ;edi- rectangle size y rectangle_gradient_right: mov [line_coordinat_x],ecx mov [line_coordinat_y],edx mov [line_size_x],esi mov [line_size_y],edi mov ecx,esi mov edx,dword pointer call gradient mov ecx,[line_coordinat_y] shl ecx,16 add ecx,[line_coordinat_y] add ecx,[line_size_y] mov eax,[line_size_x] add [line_coordinat_x],eax mov esi,dword pointer mov edi,[line_size_x] next_vertical_line_draw_right: mov eax,38 mov ebx,[line_coordinat_x] shl ebx,16 add ebx,[line_coordinat_x] mov edx,[esi] and edx,0xffffff mcall add esi,3 sub [line_coordinat_x],1 dec edi jnz next_vertical_line_draw_right ret ;eax -first color ;ebx- second color ;ecx- x coordinat of rectangle ;edx- y coordinat of rectangle ;esi- rectangle size x ;edi- rectangle size y rectangle_gradient_left: mov [line_coordinat_x],ecx mov [line_coordinat_y],edx mov [line_size_x],esi mov [line_size_y],edi mov ecx,esi mov edx,dword pointer call gradient mov ecx,[line_coordinat_y] shl ecx,16 add ecx,[line_coordinat_y] add ecx,[line_size_y] mov esi,dword pointer mov edi,[line_size_x] next_vertical_line_draw_left: mov eax,38 mov ebx,[line_coordinat_x] shl ebx,16 add ebx,[line_coordinat_x] mov edx,[esi] and edx,0xffffff mcall add esi,3 add [line_coordinat_x],1 dec edi jnz next_vertical_line_draw_left ret ;eax -first color ;ebx- second color ;ecx- x coordinat of rectangle ;edx- y coordinat of rectangle ;esi- rectangle size x ;edi- rectangle size y rectangle_gradient_up: mov [line_coordinat_x],ecx mov [line_coordinat_y],edx mov [line_size_x],esi mov [line_size_y],edi mov ecx,edi mov edx,dword pointer call gradient mov ebx,[line_coordinat_x] shl ebx,16 add ebx,[line_coordinat_x] add ebx,[line_size_x] mov eax,[line_size_y] add [line_coordinat_y],eax mov esi,dword pointer mov edi,[line_size_y] next_horizontal_line_draw_up: mov eax,38 mov ecx,[line_coordinat_y] shl ecx,16 add ecx,[line_coordinat_y] mov edx,[esi] and edx,0xffffff mcall add esi,3 sub [line_coordinat_y],1 dec edi jnz next_horizontal_line_draw_up ret ;eax -first color ;ebx- second color ;ecx- x coordinat of rectangle ;edx- y coordinat of rectangle ;esi- rectangle size x ;edi- rectangle size y rectangle_gradient_down: mov [line_coordinat_x],ecx mov [line_coordinat_y],edx mov [line_size_x],esi mov [line_size_y],edi mov ecx,edi mov edx,dword pointer call gradient mov ebx,[line_coordinat_x] shl ebx,16 add ebx,[line_coordinat_x] add ebx,[line_size_x] mov esi,dword pointer mov edi,[line_size_y] next_horizontal_line_draw_down: mov eax,38 mov ecx,[line_coordinat_y] shl ecx,16 add ecx,[line_coordinat_y] mov edx,[esi] and edx,0xffffff mcall add esi,3 add [line_coordinat_y],1 dec edi jnz next_horizontal_line_draw_down ret ;eax -first color ;ebx- second color ;ecx- length of line ;edx- pointer to memory for colors of gradient gradient: mov [length],ecx and eax,0xffffff and eax,0xffffff mov [b_min],al mov [b_max],bl shr eax,8 shr ebx,8 mov [g_min],al mov [g_max],bl shr eax,8 shr ebx,8 mov [r_min],al mov [r_max],bl mov eax,[length] dec eax mov [v],eax fild [v] xor eax,eax mov al,[r_max] sub al,[r_min] mov [v],eax fild [v] fdiv st0,st1 fstp [step_r] xor eax,eax mov al,[g_max] sub al,[g_min] mov [v],eax fild [v] fdiv st0,st1 fstp [step_g] xor eax,eax mov al,[b_max] sub al,[b_min] mov [v],eax fild [v] fdiv st0,st1 fstp [step_b] fstp [v] xor eax,eax mov al,[r_min] mov [r],al mov [v],eax fild [v] fstp [r_f] xor eax,eax mov al,[g_min] mov [g],al mov [v],eax fild [v] fstp [g_f] xor eax,eax mov al,[b_min] mov [b],al mov [v],eax fild [v] fstp [b_f] next_gradient_color_save: xor ebx,ebx xor eax,eax mov al,[r] mov bl,al shl eax,8 mov al,[g] shl eax,8 mov al,[b] mov [edx],ax mov [edx+2],bl fld [step_r] fld [r_f] fadd st0,st1 fst [r_f] fistp [v] xor eax,eax mov eax,[v] mov [r],al fstp [v] fld [step_g] fld [g_f] fadd st0,st1 fst [g_f] fistp [v] xor eax,eax mov eax,[v] mov [g],al fstp [v] fld [step_b] fld [b_f] fadd st0,st1 fst [b_f] fistp [v] xor eax,eax mov eax,[v] mov [b],al fstp [v] add edx,3 dec ecx jnz next_gradient_color_save ret ;IN ;NON ;OUT ;variable [skin_height] get_skin_height: pushad mov eax,48 mov ebx,4 int 0x40 mov [skin_height],eax popad ret ;eax - x ;ebx - y ;ecx - size x ;edx - size y ;esi - pointer to memory for rectangle SaveFonForRectangle: mov [Rectangle.x],eax mov [Rectangle.y],ebx mov [Rectangle.width],ecx mov [Rectangle.height],edx mov [PointerToMem],esi ;get bytes per string mov eax,61 mov ebx,2 mcall mov [BitsPerPixel],eax mov eax,61 mov ebx,3 mcall mov [BytesPerString],eax ;get window coordinats mov eax,9 mov ebx,dword IPC_table or ecx,-1 mcall mov eax,dword[IPC_table+34] mov ebx,dword[IPC_table+38] ;mov ecx,dword[IPC_table+42] ;mov edx,dword[IPC_table+46] ;mov [WindowCoordinatX],eax ;mov [WindowCoordinatY],ebx ;mov [WindowSizeX],ecx ;mov [WindowSizeY],edx add eax,[Rectangle.x] add ebx,[Rectangle.y] imul ebx,[BytesPerString] mov esi,[Rectangle.width] cmp [BitsPerPixel],24 jne no_24 lea eax,[eax+eax*2] lea esi,[esi+esi*2] mov edi,3 jmp exit_bits_per_pixel no_24: shl eax,2 shl esi,2 mov edi,4 exit_bits_per_pixel: add eax,ebx mov ebx,[BytesPerString] sub ebx,esi mov [offset],ebx mov esi,[PointerToMem] mov edx,[Rectangle.height] next_string_pixels_save: mov ecx,[Rectangle.width] next_pixel_save: mov ebx,[gs:eax] and ebx,0xffffff mov [esi],bx shr ebx,16 mov [esi+2],bl add esi,3 add eax,edi dec ecx jnz next_pixel_save add eax,[offset] dec edx jnz next_string_pixels_save exit_: ret