;----------------------------------------------------------- ;-----instruments of panel(icon's instruments)-------------- ;----------------------------------------------------------- TakeButtonInstruments: mov eax,[Current_instrument] ;*************************brush 1*********************** cmp eax,40 jne no_brush1 mov [Brush_SizeX],4 mov [Brush_SizeY],4 mov [Number_Brush],0 mov ebx,[Last_instrument] mov [Current_instrument],ebx mov [line_width],1 jmp still no_brush1: ;*************************brush 2*********************** cmp eax,41 jne no_brush2 mov [Brush_SizeX],6 mov [Brush_SizeY],4 mov [Number_Brush],1 mov ebx,[Last_instrument] mov [Current_instrument],ebx mov [line_width],2 jmp still no_brush2: ;*************************brush 3*********************** cmp eax,42 jne no_brush3 mov [Brush_SizeX],8 mov [Brush_SizeY],7 mov [Number_Brush],2 mov ebx,[Last_instrument] mov [Current_instrument],ebx mov [line_width],3 jmp still no_brush3: ;************************brush 4************************ cmp eax,43 jne no_brush4 mov [Brush_SizeX],14 mov [Brush_SizeY],14 mov [Number_Brush],3 mov ebx,[Last_instrument] mov [Current_instrument],ebx mov [line_width],4 jmp still no_brush4: ;************************brush 5************************ cmp eax,44 jne no_brush5 mov [Brush_SizeX],6 mov [Brush_SizeY],6 mov [Number_Brush],4 mov ebx,[Last_instrument] mov [Current_instrument],ebx mov [line_width],5 jmp still no_brush5: ;*************************pensil************************ cmp eax,10 jne no_pensil mov al,[exit_from_work_arrea] test al,al jz no_exit_from_work_arrea and [Activate_instrument],0 and [exit_from_work_arrea],0 no_exit_from_work_arrea: mov al,[Activate_instrument] test al,al jnz no_activated_later call GetScreenCordinats mov eax,[ScreenX] mov ebx,[ScreenY] add eax,[PosX] add ebx,[PosY] mov [OldX],eax mov [OldY],ebx no_activated_later: mov eax,[MaxWorkScreen_SizeX] mov ebx,[MaxWorkScreen_SizeY] mov eax,[PointerToPicture] mov ebx,[ReserveArray] mov ecx,[Picture_SizeX] mov edx,[OldX] shl edx,16 add edx,[OldY] mov esi,[ScreenX] mov edi,[ScreenY] add esi,[PosX] add edi,[PosY] call calculate_line mov ecx,eax mov edx,[Color] mov esi,[Color] shr edx,16 xor ebx,ebx mov eax,[ReserveArray] pensil_next_pixel_draw: mov ebx,[eax] mov [ebx],si mov [ebx+2],dl add eax,4 dec ecx jnz pensil_next_pixel_draw mov eax,[ScreenX] mov ebx,[ScreenY] add eax,[PosX] add ebx,[PosY] mov [OldX],eax mov [OldY],ebx call MovePictureToWorkScreen mov [Activate_instrument],1 jmp still no_pensil: ;**********************pipetka************************** cmp eax,15 jne no_pipetka mov eax,[ScreenY] mov ebx,[Picture_SizeX] add eax,[PosY] imul eax,ebx add eax,[ScreenX] add eax,[PosX] lea eax,[eax+eax*2] add eax,[PointerToPicture] mov ebx,[eax] and ebx,0xffffff mov [Color],ebx mcall SF_DRAW_RECT, 136*65536+20, 65*65536+21, [Color] jmp still no_pipetka: ;**********************draw brush*********************** cmp eax,11 jne no_brush mov [Last_instrument],eax jmp no_lastik_ lastik_in: mov eax,[Color] mov [SColor],eax mov [Color],0xffffff no_lastik_: mov eax,[ScreenX] mov ebx,[ScreenY] mov ecx,[Brush_SizeX] mov edx,[Brush_SizeY] add eax,[PosX] add ebx,[PosY] add eax,ecx add ebx,edx cmp eax,[Picture_SizeX] jl no_max_pos_x mov eax,[Picture_SizeX] no_max_pos_x: cmp ebx,[Picture_SizeY] jl no_max_pos_y mov ebx,[Picture_SizeY] no_max_pos_y: cmp eax,ecx ja no_min_pos_x mov eax,[Brush_SizeX] no_min_pos_x: cmp ebx,edx ja no_min_pos_y mov ebx,[Brush_SizeY] no_min_pos_y: sub eax,[Brush_SizeX] sub ebx,[Brush_SizeY] mov [x],eax mov [y],ebx mov al,[exit_from_work_arrea] test al,al jz no_exit_from_work_arrea_brush and [Activate_instrument],0 and [exit_from_work_arrea],0 no_exit_from_work_arrea_brush: mov al,[Activate_instrument] test al,al jnz no_new_brush_xy mov eax,[x] mov ebx,[y] mov [OldX],eax mov [OldY],ebx mov [Activate_instrument],1 no_new_brush_xy: mov eax,[PointerToPicture] mov ebx,[ReserveArray] add ebx,4 mov ecx,[Picture_SizeX] mov edx,[OldX] shl edx,16 add edx,[OldY] mov esi,[x] mov edi,[y] call calculate_line mov ebx,[ReserveArray] mov [ebx],eax ;procedure drawing of brush mov ebx,[ReserveArray] mov ecx,[ebx] mov edx,[Color] mov esi,[Color] shr edx,16 add ebx,4 mov edi,[Number_Brush] imul edi,20*20 next_pixel_put_brush: mov eax,[ebx] push eax push ecx xor ebp,ebp and [counter2],0 vertical_width_brush: and [counter],0 horizontal_width_brush: xor ecx,ecx mov cl,byte[Brush_color+edi+ebp] test cl,cl jz no_draw_pixel_brush mov [eax],si mov [eax+2],dl no_draw_pixel_brush: add eax,3 inc ebp inc [counter] cmp [counter],20 jne horizontal_width_brush mov ecx,[Picture_SizeX] sub ecx,20 lea ecx,[ecx+ecx*2] add eax,ecx inc [counter2] cmp [counter2],20 jne vertical_width_brush pop ecx pop eax add ebx,4 dec ecx jnz next_pixel_put_brush mov eax,[x] mov ebx,[y] mov [OldX],eax mov [OldY],ebx mov al,[lastik_is_active] test al,al jz no_lastik_active mov eax,[SColor] mov [Color],eax and [lastik_is_active],0 no_lastik_active: call MovePictureToWorkScreen mov eax,[Current_instrument] mov [Last_instrument],eax jmp still no_brush: ;************************Flood Fill******************* cmp eax,14 jne no_FloodFill mov eax,[PointerToPicture] mov ebx,[PointerToEditBufer] mov ecx,[Picture_SizeX] imul ecx,[Picture_SizeY] lea ecx,[ecx+ecx*2] shl ecx,1 cmp ecx,mem_flood_f ja normal_size_of_bufer mov ebx,[ReserveArray] normal_size_of_bufer: add ebx,4 mov ecx,[Picture_SizeX] mov edx,[ScreenX] add edx,[PosX] shl edx,16 add edx,[ScreenY] add edx,[PosY] mov esi,[Picture_SizeX] dec esi shl esi,16 add esi,[Picture_SizeY] dec esi mov edi,[Color] call flood_fill call MovePictureToWorkScreen jmp still no_FloodFill: ;************************lastik************************* cmp eax,13 jne no_lastik mov [Last_instrument],eax mov [lastik_is_active],1 jmp lastik_in no_lastik: ;****************************************************** cmp eax,12 jne no_spray cmp [Activate_instrument],0 jne no_null_spray mov [Activate_instrument],1 jmp still no_null_spray: mov eax,[ScreenX] mov ebx,[ScreenY] mov ecx,[Brush_SizeX] mov edx,[Brush_SizeY] add eax,[PosX] add ebx,[PosY] add eax,ecx add ebx,edx cmp eax,[Picture_SizeX] jl no_max_pos_x_spray mov eax,[Picture_SizeX] no_max_pos_x_spray: cmp ebx,[Picture_SizeY] jl no_max_pos_y_spray mov ebx,[Picture_SizeY] no_max_pos_y_spray: cmp eax,ecx ja no_min_pos_x_spray mov eax,[Brush_SizeX] no_min_pos_x_spray: cmp ebx,edx ja no_min_pos_y_spray mov ebx,[Brush_SizeY] no_min_pos_y_spray: sub eax,[Brush_SizeX] sub ebx,[Brush_SizeY] mov edi,0;[Number_Brush] imul edi,20*20 mov [x],eax mov [y],ebx mov ebp,[Picture_SizeX] xor edx,edx brush_y_spray: xor ecx,ecx brush_x_spray: ;calculate position in array of spray mov esi,edx lea esi,[esi+esi*4] ;esi=esi*5 shl esi,2 ;esi=(esi*3)*4 add esi,ecx add esi,edi ;read byte from array xor eax,eax mov al,[Spray_color+esi] test eax,eax jz no_color_spray mov eax,[x] mov ebx,[y] add eax,ecx add ebx,edx imul ebx,ebp; ebp=[Picture_SizeX] add eax,ebx lea eax,[eax+eax*2] add eax,[PointerToPicture] mov ebx,[Color] mov [eax],bx shr ebx,16 mov [eax+2],bl no_color_spray: inc ecx cmp ecx,20 jl brush_x_spray inc edx cmp edx,20 jl brush_y_spray call MovePictureToWorkScreen jmp still no_spray: ;***********************palette************************* cmp eax,51 jne no_palette mov eax,20 mov ebx,100 mov ecx,32*10+32*5+7 mov edx,8*10+7*10 mov esi,1 call draw_volume_rectangle mov [x],20+5 mov [y],100+10 mov edi,256 xor esi,esi next_rectangle: mov ebx,[x] mov ecx,[y] mov edx,[palitra+esi] and edx,0xffffff shl ebx,16 shl ecx,16 add ebx,13 add ecx,13 mcall SF_DRAW_RECT add [x],15 cmp [x],20+15*32 jl no_new_line mov [x],20+5 add [y],15 no_new_line: add esi,4 dec edi jnz next_rectangle wait_events: call event cmp eax,1 je still cmp eax,2 jne no_keys mcall SF_GET_KEY no_keys: cmp eax,3 jne no_buttons mcall SF_GET_BUTTON no_buttons: cmp eax,6 jne wait_events call GetMouseClick test eax,eax jz wait_events call GetMouseCoordinats mov [x],20+5 mov [y],100+10 mov [counter],0 next_rectangle_column: mov eax,[x] mov ebx,[y] mov ecx,[MouseX] mov edx,[MouseY] mov esi,13 mov edi,13 call columnus test eax,eax jz no_columnus_color mov eax,[counter] shl eax,2 mov ebx,[palitra+eax] and ebx,0xffffff mov [Color],ebx no_columnus_color: add [x],15 cmp [x],20+15*32 jl no_new_line_column mov [x],20+5 add [y],15 no_new_line_column: inc [counter] cmp [counter],257 jne next_rectangle_column mcall SF_SLEEP,10 call drawwin mov eax,[Last_instrument] mov [Current_instrument],eax jmp still no_palette: ;************************draw line********************** cmp eax,16 jne no_line mov [Last_instrument],eax mov al,[Activate_instrument] test al,al jnz no_new_line_xy mov eax,[ScreenX] mov ebx,[ScreenY] add eax,[PosX] add ebx,[PosY] mov [OldX],eax mov [OldY],ebx mov [Activate_instrument],1 xor eax,eax mov ecx,mem_flood_f/4 mov edi,[ReserveArray] rep stosd jmp still no_new_line_xy: ;put saved pixels mov ebx,[ReserveArray] mov eax,[ebx] test eax,eax jz no_put_line_to_screen_line mov ecx,[ebx] add ebx,4 xor ebp,ebp next_color_put_line: ;put saved pixels in ReserveArray push ecx and [counter2],0 mov edi,[ebx] push edi vertical_width_put: and [counter],0 horizontal_width_put: mov edx,[ebx+4807*4+ebp] and edx,0xffffff mov [edi],dx shr edx,16 mov [edi+2],dl add edi,3 add ebp,4 inc [counter] cmp [counter],5 jne horizontal_width_put mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add edi,ecx inc [counter2] cmp [counter2],5 jne vertical_width_put pop edi pop ecx add ebx,4 dec ecx jnz next_color_put_line no_put_line_to_screen_line: ;calculate line mov ebx,[ReserveArray] add ebx,4 mov eax,[PointerToPicture] mov ecx,[Picture_SizeX] mov edx,[OldX] shl edx,16 add edx,[OldY] mov esi,[ScreenX] mov edi,[ScreenY] add esi,[PosX] add edi,[PosY] mov ebp,[Picture_SizeX] sub ebp,[line_width] cmp esi,ebp jl no_minimum_x_line mov esi,ebp no_minimum_x_line: mov ebp,[Picture_SizeY] sub ebp,[line_width] cmp edi,ebp jl no_minimum_y_line mov edi,ebp no_minimum_y_line: call calculate_line ;call calculate_rectangle mov [counter],eax ;save color pixels in ReserveArray mov eax,[counter] mov ebx,[ReserveArray] mov [ebx],eax mov ecx,[ebx] add ebx,4 xor ebp,ebp next_color_save_line: ;save color of pixel in ReserveArray push ecx and [counter2],0 mov edi,[ebx] vertical_width_save: and [counter],0 horizontal_width_save: mov eax,edi mov edx,[eax] and edx,0xffffff mov [ebx+4807*4+ebp],dx shr edx,16 mov [ebx+4807*4+2+ebp],dl add edi,3 add ebp,4 inc [counter] cmp [counter],5 jne horizontal_width_save mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add edi,ecx inc [counter2] cmp [counter2],5 jne vertical_width_save pop ecx add ebx,4 dec ecx jnz next_color_save_line ;draw calculated pixels on work arrea mov ebx,[ReserveArray] mov ecx,[ebx] mov edx,[Color] mov esi,[Color] shr edx,16 add ebx,4 mov edi,[line_width] dec edi imul edi,25 next_pixel_put_line: mov eax,[ebx] push eax push ecx xor ebp,ebp and [counter2],0 vertical_width: and [counter],0 horizontal_width: xor ecx,ecx mov cl,byte[width_pixels+edi+ebp] test cl,cl jz no_draw_pixel_line mov [eax],si mov [eax+2],dl no_draw_pixel_line: add eax,3 inc ebp inc [counter] cmp [counter],5 jne horizontal_width mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add eax,ecx inc [counter2] cmp [counter2],5 jne vertical_width pop ecx pop eax add ebx,4 dec ecx jnz next_pixel_put_line call MovePictureToWorkScreen jmp still no_line: ;*********************************DRAW RECTANGLE**************************** cmp eax,17 jne no_rectangle mov [Last_instrument],eax mov al,[Activate_instrument] test al,al jnz no_new_rectangle_xy mov eax,[ScreenX] mov ebx,[ScreenY] add eax,[PosX] add ebx,[PosY] mov [OldX],eax mov [OldY],ebx mov [Activate_instrument],1 xor eax,eax mov ecx,mem_flood_f/4 mov edi,[ReserveArray] rep stosd jmp still no_new_rectangle_xy: ;put saved pixels mov ebx,[ReserveArray] mov eax,[ebx] test eax,eax jz no_put_rectangle_to_screen_line mov ecx,[ebx] add ebx,4 xor ebp,ebp next_color_put_rectangle: ;put saved pixels in ReserveArray push ecx and [counter2],0 mov edi,[ebx] push edi vertical_width_put_rectangle: and [counter],0 horizontal_width_put_rectangle: mov edx,[ebx+4807*4+ebp] and edx,0xffffff mov [edi],dx shr edx,16 mov [edi+2],dl add edi,3 add ebp,4 inc [counter] cmp [counter],5 jne horizontal_width_put_rectangle mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add edi,ecx inc [counter2] cmp [counter2],5 jne vertical_width_put_rectangle pop edi pop ecx add ebx,4 dec ecx jnz next_color_put_rectangle no_put_rectangle_to_screen_line: ;calculate line mov ebx,[ReserveArray] add ebx,4 mov eax,[PointerToPicture] mov ecx,[Picture_SizeX] mov edx,[OldX] shl edx,16 add edx,[OldY] mov esi,[ScreenX] mov edi,[ScreenY] add esi,[PosX] add edi,[PosY] mov ebp,[Picture_SizeX] sub ebp,[line_width] cmp esi,ebp jl no_minimum_x_rectangle mov esi,ebp no_minimum_x_rectangle: mov ebp,[Picture_SizeY] sub ebp,[line_width] cmp edi,ebp jl no_minimum_y_rectangle mov edi,ebp no_minimum_y_rectangle: call calculate_rectangle mov [counter],eax ;save color pixels in ReserveArray mov eax,[counter] mov ebx,[ReserveArray] mov [ebx],eax mov ecx,[ebx] add ebx,4 xor ebp,ebp next_color_save_rectangle: ;save color of pixel in ReserveArray push ecx and [counter2],0 mov edi,[ebx] vertical_width_save_rectangle: and [counter],0 horizontal_width_save_rectangle: mov eax,edi mov edx,[eax] and edx,0xffffff mov [ebx+4807*4+ebp],dx shr edx,16 mov [ebx+4807*4+2+ebp],dl add edi,3 add ebp,4 inc [counter] cmp [counter],5 jne horizontal_width_save_rectangle mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add edi,ecx inc [counter2] cmp [counter2],5 jne vertical_width_save_rectangle pop ecx add ebx,4 dec ecx jnz next_color_save_rectangle ;draw calculated pixels on work arrea mov ebx,[ReserveArray] mov ecx,[ebx] mov edx,[Color] mov esi,[Color] shr edx,16 add ebx,4 mov edi,[line_width] dec edi imul edi,25 next_pixel_put_rectangle: mov eax,[ebx] push eax push ecx xor ebp,ebp and [counter2],0 vertical_width_rectangle: and [counter],0 horizontal_width_rectangle: xor ecx,ecx mov cl,byte[width_pixels_rectangle+edi+ebp] test cl,cl jz no_draw_pixel_rectangle mov [eax],si mov [eax+2],dl no_draw_pixel_rectangle: add eax,3 inc ebp inc [counter] cmp [counter],5 jne horizontal_width_rectangle mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add eax,ecx inc [counter2] cmp [counter2],5 jne vertical_width_rectangle pop ecx pop eax add ebx,4 dec ecx jnz next_pixel_put_rectangle call MovePictureToWorkScreen jmp still no_rectangle: ;*********************************DRAW CIRCLE**************************** cmp eax,18 jne no_circle mov [Last_instrument],eax mov al,[Activate_instrument] test al,al jnz no_new_circle_xy mov eax,[ScreenX] mov ebx,[ScreenY] add eax,[PosX] add ebx,[PosY] mov [OldX],eax mov [OldY],ebx mov [Activate_instrument],1 xor eax,eax mov ecx,mem_flood_f/4 mov edi,[ReserveArray] rep stosd jmp still no_new_circle_xy: ;put saved pixels mov ebx,[ReserveArray] mov eax,[ebx] test eax,eax jz no_put_line_to_screen_circle mov ecx,[ebx] add ebx,4 xor ebp,ebp next_color_put_circle: ;put saved pixels in ReserveArray push ecx and [counter2],0 mov edi,[ebx] push edi vertical_width_put_circle: and [counter],0 horizontal_width_put_circle: mov edx,[ebx+4807*4+ebp] and edx,0xffffff mov [edi],dx shr edx,16 mov [edi+2],dl add edi,3 add ebp,4 inc [counter] cmp [counter],5 jne horizontal_width_put_circle mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add edi,ecx inc [counter2] cmp [counter2],5 jne vertical_width_put_circle pop edi pop ecx add ebx,4 dec ecx jnz next_color_put_circle no_put_line_to_screen_circle: mov esi,[ScreenX] mov edi,[ScreenY] add esi,[PosX] add edi,[PosY] sub esi,[OldX] jns no_sign_x_circle neg esi shr esi,1 neg esi add esi,[OldX] jmp no_plus_sign_x_circle no_sign_x_circle: shr esi,1 add esi,[OldX] no_plus_sign_x_circle: sub edi,[OldY] jns no_sign_y_circle neg edi shr edi,1 neg edi add edi,[OldY] jmp no_plus_sign_y_circle no_sign_y_circle: shr edi,1 add edi,[OldY] no_plus_sign_y_circle: mov [x],esi mov [y],edi mov esi,[ScreenX] mov edi,[ScreenY] add esi,[PosX] add edi,[PosY] sub esi,[OldX] jns no_sign_x_circle_r neg esi no_sign_x_circle_r: sub edi,[OldY] jns no_sign_y_circle_r neg edi no_sign_y_circle_r: mov [Dx_],esi mov [Dy_],edi ;finit fild [Dx_] fmul st0,st0 fild [Dy_] fmul st0,st0 fadd st0,st1 fsqrt fistp [Radius] fistp [Icon_X] mov esi,[Radius] shr esi,1 cmp esi,0 jne no_null_radius mov [Radius],1 no_null_radius: mov [Radius],esi mov edi,[x] mov ebp,[y] add edi,esi add ebp,esi mov edx,[Picture_SizeX] sub edx,[line_width] cmp edi,edx jl no_limit_x_circle sub edi,edx sub [Radius],edi no_limit_x_circle: mov edx,[Picture_SizeY] sub edx,[line_width] cmp ebp,edx jl no_limit_y_circle sub ebp,edx sub [Radius],ebp no_limit_y_circle: mov edi,[x] mov ebp,[y] sub edi,[Radius] jns no_minimum_x_circle add [Radius],edi no_minimum_x_circle: sub ebp,[Radius] jns no_minimum_y_circle add [Radius],ebp no_minimum_y_circle: ;calculate circle mov ebx,[ReserveArray] add ebx,4 mov eax,[PointerToPicture] mov ecx,[Picture_SizeX] mov edx,[x] shl edx,16 add edx,[y] mov esi,[Radius] call calculate_circle mov [counter],eax ;save color pixels in ReserveArray mov eax,[counter] mov ebx,[ReserveArray] mov [ebx],eax mov ecx,[ebx] add ebx,4 xor ebp,ebp next_color_save_circle: ;save color of pixel in ReserveArray push ecx and [counter2],0 mov edi,[ebx] vertical_width_save_circle: and [counter],0 horizontal_width_save_circle: mov eax,edi mov edx,[eax] and edx,0xffffff mov [ebx+4807*4+ebp],dx shr edx,16 mov [ebx+4807*4+2+ebp],dl add edi,3 add ebp,4 inc [counter] cmp [counter],5 jne horizontal_width_save_circle mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add edi,ecx inc [counter2] cmp [counter2],5 jne vertical_width_save_circle pop ecx add ebx,4 dec ecx jnz next_color_save_circle ;draw calculated pixels on work arrea mov ebx,[ReserveArray] mov ecx,[ebx] mov edx,[Color] mov esi,[Color] shr edx,16 add ebx,4 mov edi,[line_width] dec edi imul edi,25 next_pixel_put_circle: mov eax,[ebx] push eax push ecx xor ebp,ebp and [counter2],0 vertical_width_circle: and [counter],0 horizontal_width_circle: xor ecx,ecx mov cl,byte[width_pixels+edi+ebp] test cl,cl jz no_draw_pixel_circle mov [eax],si mov [eax+2],dl no_draw_pixel_circle: add eax,3 inc ebp inc [counter] cmp [counter],5 jne horizontal_width_circle mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add eax,ecx inc [counter2] cmp [counter2],5 jne vertical_width_circle pop ecx pop eax add ebx,4 dec ecx jnz next_pixel_put_circle call MovePictureToWorkScreen jmp still no_circle: ;************************zoom 1************************* cmp eax,45 jne no_1_ mov [k],1 mov [Scroll1CoordinatX],9 mov [Scroll2CoordinatY],89 and [Current_instrument],0 call drawwin jmp still no_1_: ;*************************zoom 2************************ cmp eax,46 jne no_2_ mov [k],2 call drawwin mov [Scroll1CoordinatX],9 mov [Scroll2CoordinatY],89 and [Current_instrument],0 jmp still no_2_: ;*************************zoom 3************************ cmp eax,47 jne no_3_ mov [k],3 call drawwin mov [Scroll1CoordinatX],9 mov [Scroll2CoordinatY],89 and [Current_instrument],0 jmp still no_3_: ;*************************zoom 4************************ cmp eax,48 jne no_4_ mov [k],4 call drawwin mov [Scroll1CoordinatX],9 mov [Scroll2CoordinatY],89 and [Current_instrument],0 jmp still no_4_: ;************************zoom 8************************* cmp eax,49 jne no_8_ mov [k],8 call drawwin mov [Scroll1CoordinatX],9 mov [Scroll2CoordinatY],89 and [Current_instrument],0 jmp still no_8_: ;************************zoom 16************************ cmp eax,50 jne no_16_ mov [k],16 call drawwin mov [Scroll1CoordinatX],9 mov [Scroll2CoordinatY],89 and [Current_instrument],0 jmp still no_16_: ;***************allocation of a countour********************* cmp eax,21 jne no_allocation cmp [instrument_used],0 jnz instrument_not_finished_work mov al,[Activate_instrument] test al,al jnz no_new_allocation_xy mov eax,[ScreenX] mov ebx,[ScreenY] add eax,[PosX] add ebx,[PosY] mov [OldX],eax mov [OldY],ebx inc eax inc ebx mov [rectangular_shade_x],eax mov [rectangular_shade_y],ebx mov [Activate_instrument],1 mov [instrument_used],1 and [crossing],0 and [finishing_crossing],0 xor eax,eax mov ecx,mem_flood_f/4 mov edi,[ReserveArray] rep stosd jmp still no_new_allocation_xy: instrument_not_finished_work: mov al,[instrument_used] test al,al jz no_change_coordinats cmp [Activate_instrument],0 jnz no_change_coordinats ;save coordinates as old if crossing=0 cmp [crossing],0 jnz no_save_coordinate_of_crossing mov eax,[OldX] mov ebx,[OldY] cmp eax,[rectangular_shade_x] jl no_remove_x mov ecx,[rectangular_shade_x] mov [OldX],ecx ; OldX <-----> rectangulare_shade_x mov [rectangular_shade_x],eax no_remove_x: cmp ebx,[rectangular_shade_y] jl no_remove_y mov ecx,[rectangular_shade_y] mov [OldY],ecx ; OldY <-----> rectangulare_shade_y mov [rectangular_shade_y],ebx no_remove_y: mov eax,[ScreenX] mov ebx,[ScreenY] add eax,[PosX] add ebx,[PosY] mov [crossing_old_x],eax mov [crossing_old_y],ebx mov [crossing],1 mov eax,[OldX] mov ebx,[OldY] inc eax inc ebx mov [SpriteCoordinatX],eax mov [SpriteCoordinatY],ebx mov [SpriteOldCoordinatX],eax mov [SpriteOldCoordinatY],ebx mov esi,[rectangular_shade_x] mov edi,[rectangular_shade_y] sub esi,eax jns no_sign_sprite_size_x neg esi no_sign_sprite_size_x: sub edi,ebx jns no_sign_sprite_size_y neg edi no_sign_sprite_size_y: test esi,esi jnz no_null_sprite_x mov esi,1 no_null_sprite_x: test edi,edi jnz no_null_sprite_y mov edi,1 no_null_sprite_y: mov [SpriteSizeX],esi mov [SpriteSizeY],edi call SaveFonForSprite no_save_coordinate_of_crossing: cmp [crossing],0 je no_test_crossing_with_work_arrea ;if mouse situatad after allocation than exit push [ScreenX] push [ScreenY] call GetScreenCordinats mov eax,[OldX] mov ebx,[OldY] mov ecx,[ScreenX] mov edx,[ScreenY] mov esi,[SpriteSizeX] mov edi,[SpriteSizeY] add ecx,[PosX] add edx,[PosY] inc esi;eax inc edi;ebx call columnus test eax,eax jnz crossing_with_work_area mov [finishing_crossing],1 mov [register],1 crossing_with_work_area: pop [ScreenY] pop [ScreenX] no_test_crossing_with_work_arrea: mov eax,[ScreenX] mov ebx,[ScreenY] add eax,[PosX] add ebx,[PosY] mov ecx,eax mov edx,ebx sub eax,[crossing_old_x] ;dx=(x-oldx) sub ebx,[crossing_old_y] ;dy=(y-oldy) mov [crossing_old_x],ecx mov [crossing_old_y],edx add [OldX],eax ;x1=x1+dx add [OldY],ebx ;y1=y1+dy add [rectangular_shade_x],eax ;x2=x2+dx add [rectangular_shade_y],ebx ;y2+y2+dy mov eax,[OldX] mov ebx,[OldY] inc eax inc ebx mov [SpriteCoordinatX],eax mov [SpriteCoordinatY],ebx cmp [SpriteCoordinatX],0 jns no_null_sprite_coordinat_x mov [SpriteCoordinatX],1 no_null_sprite_coordinat_x: cmp [SpriteCoordinatY],0 jns no_null_sprite_coordinat_y mov [SpriteCoordinatY],1 no_null_sprite_coordinat_y: mov esi,[rectangular_shade_x] mov edi,[rectangular_shade_y] sub esi,[OldX] jns no_znak_size_of_rectangulare_crossing_x neg esi no_znak_size_of_rectangulare_crossing_x: sub edi,[OldY] jns no_znak_size_of_rectangulare_crossing_y neg edi no_znak_size_of_rectangulare_crossing_y: mov ecx,[OldX] mov edx,[OldY] sub ecx,[PosX] jns no_minimum_x_crossing mov ecx,0 add ecx,[PosX] mov [OldX],ecx add ecx,esi mov [rectangular_shade_x],ecx no_minimum_x_crossing: sub edx,[PosY] jns no_minimum_y_crossing mov edx,0 add edx,[PosY] mov [OldY],edx add edx,edi mov [rectangular_shade_y],edx no_minimum_y_crossing: mov ecx,[Picture_SizeX] sub ecx,esi cmp [OldX],ecx jl no_maximum_x_crossing dec ecx mov [OldX],ecx add ecx,esi mov [rectangular_shade_x],ecx no_maximum_x_crossing: mov edx,[Picture_SizeY] sub edx,edi cmp [OldY],edx jl no_maximum_y_crossing dec edx mov [OldY],edx add edx,edi mov [rectangular_shade_y],edx no_maximum_y_crossing: mov eax,[rectangular_shade_x] mov ebx,[rectangular_shade_y] sub eax,[PosX] sub ebx,[PosY] mov [ScreenX],eax mov [ScreenY],ebx no_change_coordinats: ;put saved pixels mov ebx,[ReserveArray] mov eax,[ebx] test eax,eax jz no_put_line_to_screen_allocation mov ecx,[ebx] add ebx,4 xor ebp,ebp next_color_put_allocation: ;put saved pixels in ReserveArray push ecx and [counter2],0 mov edi,[ebx] push edi vertical_width_put_allocation: and [counter],0 horizontal_width_put_allocation: mov edx,[ebx+4807*4+ebp] and edx,0xffffff mov [edi],dx shr edx,16 mov [edi+2],dl add edi,3 add ebp,4 inc [counter] cmp [counter],1;5 jne horizontal_width_put_allocation mov ecx,[Picture_SizeX] sub ecx,1;5 lea ecx,[ecx+ecx*2] add edi,ecx inc [counter2] cmp [counter2],1;5 jne vertical_width_put_allocation pop edi pop ecx add ebx,4 dec ecx jnz next_color_put_allocation no_put_line_to_screen_allocation: cmp [DrawSprite_flag],1 jne no_activate_put_fon_ cmp [Paste_flag],1 je no_put_fon___ call PutFonForSprite no_put_fon___: and [Paste_flag],0 no_activate_put_fon_: cmp [finishing_crossing],0 jz not_finish_from_instrument_crossing and [Activate_instrument],0 and [crossing],0 and [instrument_used],0 and [DrawSprite_flag],0 call MovePictureToWorkScreen jmp still not_finish_from_instrument_crossing: ;calculate line mov ebx,[ReserveArray] add ebx,4 mov eax,[PointerToPicture] mov ecx,[Picture_SizeX] mov edx,[OldX] shl edx,16 add edx,[OldY] mov esi,[ScreenX] mov edi,[ScreenY] add esi,[PosX] add edi,[PosY] mov ebp,[Picture_SizeX] dec ebp cmp esi,ebp jl no_minimum_x_allocation mov esi,ebp no_minimum_x_allocation: mov ebp,[Picture_SizeY] dec ebp cmp edi,ebp jl no_minimum_y_allocation mov edi,ebp no_minimum_y_allocation: call calculate_rectangle mov [counter],eax ;save color pixels in ReserveArray mov eax,[counter] mov ebx,[ReserveArray] mov [ebx],eax mov ecx,[ebx] add ebx,4 xor ebp,ebp next_color_save_allocation: ;save color of pixel in ReserveArray push ecx and [counter2],0 mov edi,[ebx] vertical_width_save_allocation: and [counter],0 horizontal_width_save_allocation: mov eax,edi mov edx,[eax] and edx,0xffffff mov [ebx+4807*4+ebp],dx shr edx,16 mov [ebx+4807*4+2+ebp],dl add edi,3 add ebp,4 inc [counter] cmp [counter],1;5 jne horizontal_width_save_allocation mov ecx,[Picture_SizeX] sub ecx,1;5 lea ecx,[ecx+ecx*2] add edi,ecx inc [counter2] cmp [counter2],1;5 jne vertical_width_save_allocation pop ecx add ebx,4 dec ecx jnz next_color_save_allocation cmp [DrawSprite_flag],1 jne no_save_fon_for_sprite_ ;save current coordinats as old mov eax,[SpriteCoordinatX] mov ebx,[SpriteCoordinatY] mov [SpriteOldCoordinatX],eax mov [SpriteOldCoordinatY],ebx call SaveFonForSprite no_save_fon_for_sprite_: ;draw calculated pixels on work arrea mov ebx,[ReserveArray] mov ecx,[ebx] add ebx,4 next_pixel_put_allocation: mov edx,0x1f3fff mov esi,edx shr edx,16 mov ebp,ecx and ebp,8 cmp ebp,8 jne black_color mov si,0xffff mov dl,0xff black_color: mov eax,[ebx] mov [eax],si mov [eax+2],dl add ebx,4 dec ecx jnz next_pixel_put_allocation cmp [DrawSprite_flag],1 jne no_activate_draw_sprite_ call DrawSprite no_activate_draw_sprite_: mov al,[instrument_used] test al,al jz no_change_coordinats cmp [Activate_instrument],0 jz no_save_shades mov eax,[ScreenX] mov ebx,[ScreenY] add eax,[PosX] add ebx,[PosY] mov [rectangular_shade_x],eax mov [rectangular_shade_y],ebx no_save_shades: call MovePictureToWorkScreen jmp still no_allocation: ;*************reflection from left to right****************** cmp eax,23 jne no_reflection_from_left_to_right mov ebp,[PointerToPicture] mov edx,[ReserveArray] mov esi,[Picture_SizeX] mov ebx,[Picture_SizeX] lea ebx,[ebx+ebx*2] shr esi,1 next_line_reflection_x: ;copy vertical line to array mov ecx,[Picture_SizeX] shr ecx,1 sub ecx,esi lea ecx,[ecx+ecx*2] add ecx,[PointerToPicture] mov edx,[ReserveArray] and edi,0 copy_to_array_line_reflection_y: xor eax,eax mov eax,[ecx] mov ebp,edi lea ebp,[ebp+ebp*2] mov [edx+ebp],ax shr eax,16 mov [edx+ebp+2],al add ecx,ebx inc edi cmp edi,[Picture_SizeY] jne copy_to_array_line_reflection_y mov ecx,[Picture_SizeX] shr ecx,1 mov ebp,ecx add ecx,esi dec ecx lea ecx,[ecx+ecx*2] add ecx,[PointerToPicture] sub ebp,esi lea ebp,[ebp+ebp*2] add ebp,[PointerToPicture] and edi,0 next_line_reflection_y: mov eax,[ecx] and eax,0xffffff mov [ebp],ax shr eax,16 mov [ebp+2],al add ebp,ebx add ecx,ebx inc edi cmp edi,[Picture_SizeY] jnz next_line_reflection_y ;copy vertical line from array to screen mov ecx,[Picture_SizeX] shr ecx,1 add ecx,esi dec ecx lea ecx,[ecx+ecx*2] add ecx,[PointerToPicture] mov edx,[ReserveArray] and edi,0 copy_from_array_to_screen_reflection_y: mov ebp,edi lea ebp,[ebp+ebp*2] xor eax,eax mov eax,[edx+ebp] mov [ecx],ax shr eax,16 mov [ecx+2],al add ecx,ebx inc edi cmp edi,[Picture_SizeY] jne copy_from_array_to_screen_reflection_y dec esi jnz next_line_reflection_x call MovePictureToWorkScreen jmp still no_reflection_from_left_to_right: ;*************reflection from up to down****************** cmp eax,24 jne no_reflection_from_up_to_down mov esi,[Picture_SizeX] mov edi,esi lea esi,[esi+esi*2] lea edi,[edi+edi*2] imul edi,[Picture_SizeY] mov edx,[ReserveArray] mov ecx,[Picture_SizeY] shr ecx,1 add edi,[PointerToPicture] sub edi,esi mov ebp,[PointerToPicture] next_lines_reflection: ;copy line xor ebx,ebx copy_line_1: xor eax,eax mov al,[edi+ebx] mov [edx+ebx],al inc ebx cmp ebx,esi jne copy_line_1 xor ebx,ebx copy_line_2: xor eax,eax mov al,[ebp+ebx] mov [edi+ebx],al inc ebx cmp ebx,esi jne copy_line_2 xor ebx,ebx copy_line_3: xor eax,eax mov al,[edx+ebx] mov [ebp+ebx],al inc ebx cmp ebx,esi jne copy_line_3 add ebp,esi sub edi,esi dec ecx jnz next_lines_reflection call MovePictureToWorkScreen jmp still no_reflection_from_up_to_down: ;*********************draw hard contour******************* cmp eax,20 jne no_kontur_ mov [Last_instrument],eax mov al,[Activate_instrument] test al,al jnz no_new_konture_xy mov al,[instrument_used] test al,al jz instrument_not_used mov eax,[used_OldX] mov ebx,[used_OldY] mov [OldX],eax mov [OldY],ebx jmp exit_used_instrument instrument_not_used: mov eax,[ScreenX] mov ebx,[ScreenY] add eax,[PosX] add ebx,[PosY] mov [OldX],eax mov [OldY],ebx exit_used_instrument: mov al,[instrument_used] test al,al jnz instrument_used_true mov [instrument_used],byte 1 instrument_used_true: mov [Activate_instrument],1 xor eax,eax mov ecx,mem_flood_f/4 mov edi,[ReserveArray] rep stosd no_new_konture_xy: ;put saved pixels mov ebx,[ReserveArray] mov eax,[ebx] test eax,eax jz no_put_line_to_screen_konture mov ecx,[ebx] add ebx,4 xor ebp,ebp next_color_put_konture: ;put saved pixels in ReserveArray push ecx and [counter2],0 mov edi,[ebx] push edi vertical_width_put_konture: and [counter],0 horizontal_width_put_konture: mov edx,[ebx+4807*4+ebp] and edx,0xffffff mov [edi],dx shr edx,16 mov [edi+2],dl add edi,3 add ebp,4 inc [counter] cmp [counter],5 jne horizontal_width_put_konture mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add edi,ecx inc [counter2] cmp [counter2],5 jne vertical_width_put_konture pop edi pop ecx add ebx,4 dec ecx jnz next_color_put_konture no_put_line_to_screen_konture: ;calculate line mov ebx,[ReserveArray] add ebx,4 mov eax,[PointerToPicture] mov ecx,[Picture_SizeX] mov edx,[OldX] shl edx,16 add edx,[OldY] mov esi,[ScreenX] mov edi,[ScreenY] add esi,[PosX] add edi,[PosY] mov ebp,[Picture_SizeX] sub ebp,[line_width] cmp esi,ebp jl no_minimum_x_konture mov esi,ebp no_minimum_x_konture: mov ebp,[Picture_SizeY] sub ebp,[line_width] cmp edi,ebp jl no_minimum_y_konture mov edi,ebp no_minimum_y_konture: call calculate_line ;call calculate_rectangle mov [counter],eax ;save color pixels in ReserveArray mov eax,[counter] mov ebx,[ReserveArray] mov [ebx],eax mov ecx,[ebx] add ebx,4 xor ebp,ebp next_color_save_konture: ;save color of pixel in ReserveArray push ecx and [counter2],0 mov edi,[ebx] vertical_width_save_konture: and [counter],0 horizontal_width_save_konture: mov eax,edi mov edx,[eax] and edx,0xffffff mov [ebx+4807*4+ebp],dx shr edx,16 mov [ebx+4807*4+2+ebp],dl add edi,3 add ebp,4 inc [counter] cmp [counter],5 jne horizontal_width_save_konture mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add edi,ecx inc [counter2] cmp [counter2],5 jne vertical_width_save_konture pop ecx add ebx,4 dec ecx jnz next_color_save_konture ;draw calculated pixels on work arrea mov ebx,[ReserveArray] mov ecx,[ebx] mov edx,[Color] mov esi,[Color] shr edx,16 add ebx,4 mov edi,[line_width] dec edi imul edi,25 next_pixel_put_konture: mov eax,[ebx] push eax push ecx xor ebp,ebp and [counter2],0 vertical_width_konture: and [counter],0 horizontal_width_konture: xor ecx,ecx mov cl,byte[width_pixels+edi+ebp] test cl,cl jz no_draw_pixel_konture mov [eax],si mov [eax+2],dl no_draw_pixel_konture: add eax,3 inc ebp inc [counter] cmp [counter],5 jne horizontal_width_konture mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add eax,ecx inc [counter2] cmp [counter2],5 jne vertical_width_konture pop ecx pop eax add ebx,4 dec ecx jnz next_pixel_put_konture mov eax,[ScreenX] mov ebx,[ScreenY] add eax,[PosX] add ebx,[PosY] mov [used_OldX],eax mov [used_OldY],ebx call MovePictureToWorkScreen jmp still no_kontur_: ;************************Draw ellips*********************** cmp eax,19 jne no_ellips mov [Last_instrument],eax mov al,[Activate_instrument] test al,al jnz no_new_ellips_xy mov eax,[ScreenX] mov ebx,[ScreenY] add eax,[PosX] add ebx,[PosY] mov [OldX],eax mov [OldY],ebx mov [Activate_instrument],1 xor eax,eax mov ecx,mem_flood_f/4 mov edi,[ReserveArray] rep stosd jmp still no_new_ellips_xy: ;put saved pixels mov ebx,[ReserveArray] mov eax,[ebx] test eax,eax jz no_put_line_to_screen_ellips mov ecx,[ebx] add ebx,4 xor ebp,ebp next_color_put_ellips: ;put saved pixels in ReserveArray push ecx and [counter2],0 mov edi,[ebx] push edi vertical_width_put_ellips: and [counter],0 horizontal_width_put_ellips: mov edx,[ebx+4807*4+ebp] and edx,0xffffff mov [edi],dx shr edx,16 mov [edi+2],dl add edi,3 add ebp,4 inc [counter] cmp [counter],5 jne horizontal_width_put_ellips mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add edi,ecx inc [counter2] cmp [counter2],5 jne vertical_width_put_ellips pop edi pop ecx add ebx,4 dec ecx jnz next_color_put_ellips no_put_line_to_screen_ellips: mov esi,[ScreenX] mov edi,[ScreenY] add esi,[PosX] add edi,[PosY] sub esi,[OldX] jns no_sign_x_ellips neg esi shr esi,1 neg esi add esi,[OldX] jmp no_plus_sign_x_ellips no_sign_x_ellips: shr esi,1 add esi,[OldX] no_plus_sign_x_ellips: sub edi,[OldY] jns no_sign_y_ellips neg edi shr edi,1 neg edi add edi,[OldY] jmp no_plus_sign_y_ellips no_sign_y_ellips: shr edi,1 add edi,[OldY] no_plus_sign_y_ellips: mov [x],esi mov [y],edi mov esi,[ScreenX] mov edi,[ScreenY] add esi,[PosX] add edi,[PosY] sub esi,[OldX] jns no_sign_x_ellips_r neg esi no_sign_x_ellips_r: sub edi,[OldY] jns no_sign_y_ellips_r neg edi no_sign_y_ellips_r: cmp edi,0 jnz no_null_a_ellips mov edi,1 no_null_a_ellips: shr esi,1 shr edi,1 mov [a_ellips],esi mov [b_ellips],edi mov edi,[x] mov ebp,[y] add edi,esi add ebp,esi mov edx,[Picture_SizeX] sub edx,[line_width] cmp edi,edx jl no_limit_x_ellips sub edi,edx sub [a_ellips],edi no_limit_x_ellips: mov edx,[Picture_SizeY] sub edx,[line_width] cmp ebp,edx jl no_limit_y_ellips sub ebp,edx sub [b_ellips],ebp no_limit_y_ellips: mov edi,[x] mov ebp,[y] sub edi,[a_ellips] jns no_minimum_x_ellips add [a_ellips],edi no_minimum_x_ellips: sub ebp,[b_ellips] jns no_minimum_y_ellips add [b_ellips],ebp no_minimum_y_ellips: ;calculate circle mov ebx,[ReserveArray] add ebx,4 mov eax,[PointerToPicture] mov ecx,[Picture_SizeX] mov edx,[x] shl edx,16 add edx,[y] mov esi,[a_ellips] shl esi,16 add esi,[b_ellips] call calculate_ellips mov [counter],eax ;save color pixels in ReserveArray mov eax,[counter] mov ebx,[ReserveArray] mov [ebx],eax mov ecx,[ebx] add ebx,4 xor ebp,ebp next_color_save_ellips: ;save color of pixel in ReserveArray push ecx and [counter2],0 mov edi,[ebx] vertical_width_save_ellips: and [counter],0 horizontal_width_save_ellips: mov eax,edi mov edx,[eax] and edx,0xffffff mov [ebx+4807*4+ebp],dx shr edx,16 mov [ebx+4807*4+2+ebp],dl add edi,3 add ebp,4 inc [counter] cmp [counter],5 jne horizontal_width_save_ellips mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add edi,ecx inc [counter2] cmp [counter2],5 jne vertical_width_save_ellips pop ecx add ebx,4 dec ecx jnz next_color_save_ellips ;draw calculated pixels on work arrea mov ebx,[ReserveArray] mov ecx,[ebx] mov edx,[Color] mov esi,[Color] shr edx,16 add ebx,4 mov edi,[line_width] dec edi imul edi,25 next_pixel_put_ellips: mov eax,[ebx] push eax push ecx xor ebp,ebp and [counter2],0 vertical_width_ellips: and [counter],0 horizontal_width_ellips: xor ecx,ecx mov cl,byte[width_pixels+edi+ebp] test cl,cl jz no_draw_pixel_ellips mov [eax],si mov [eax+2],dl no_draw_pixel_ellips: add eax,3 inc ebp inc [counter] cmp [counter],5 jne horizontal_width_ellips mov ecx,[Picture_SizeX] sub ecx,5 lea ecx,[ecx+ecx*2] add eax,ecx inc [counter2] cmp [counter2],5 jne vertical_width_ellips pop ecx pop eax add ebx,4 dec ecx jnz next_pixel_put_ellips call MovePictureToWorkScreen jmp still no_ellips: jmp still ret