;---------------------------------------------------------- ;--------Move picture from array to work screeen----------- ;---------------------------------------------------------- MovePictureToWorkScreen: call cleare_screen mov eax,[Picture_SizeX] mov ebx,[Picture_SizeY] mov ecx,[MaxWorkScreen_SizeX] mov edx,[MaxWorkScreen_SizeY] mov esi,[k] imul eax,esi imul ebx,esi cmp eax,ecx jle lab1 mov eax,[MaxWorkScreen_SizeX] mov [WorkScreen_SizeX],eax jmp lab2 lab1: mov [WorkScreen_SizeX],eax lab2: cmp ebx,edx jle lab3 mov ebx,[MaxWorkScreen_SizeY] mov [WorkScreen_SizeY],ebx jmp lab4 lab3: mov [WorkScreen_SizeY],ebx lab4: mov eax,[WorkScreen_SizeX] mov ebx,[k] cdq idiv ebx mov [CounterX],eax mov eax,[WorkScreen_SizeY] cdq idiv ebx mov [CounterY],eax mov eax,[WorkScreen_SizeX] mov ecx,eax mov ebx,[k] cdq idiv ebx imul eax,ebx sub ecx,eax lea ecx,[ecx+ecx*2] mov eax,[WorkScreen_SizeX] mov ebx,[k] dec ebx imul eax,ebx lea eax,[eax+eax*2] add eax,ecx mov [OffsetYWorkScreen],eax mov ebx,[Picture_SizeX] mov eax,[CounterX] sub ebx,eax lea ebx,[ebx+ebx*2] mov [OffsetYPicture],ebx mov eax,[WorkScreen_SizeX] mov ebx,[k] sub eax,ebx lea eax,[eax+eax*2] mov [OffsetYBigPixel],eax mov eax,[PosX] mov ebx,[PosY] mov ecx,[Picture_SizeX] imul ecx,ebx add eax,ecx lea eax,[eax+eax*2] add eax,[PointerToPicture] mov ebx,[ScreenPointer] mov edi,[CounterY] ;if size of picture natural(mastab is 1) than move picture to work screen cmp [k],1 jne no_zoom_1_ screen_y_1: mov esi,[CounterX] screen_x_1: mov ecx,[eax] and ecx,0xffffff mov ebp,ecx shr ecx,16 mov [ebx],bp mov [ebx+2],cl add ebx,3; add eax,3 dec esi jnz screen_x_1 add eax,[OffsetYPicture] add ebx,[OffsetYWorkScreen] dec edi jnz screen_y_1 jmp fps no_zoom_1_: cmp [k],2 jne no_zoom_2 screen_y_2: mov esi,[CounterX] screen_x_2: mov ecx,[eax] and ecx,0xffffff mov ebp,ecx shr ecx,16 mov edx,ebx mov [edx],bp mov [edx+2],cl mov [edx+3],bp mov [edx+3+2],cl add edx,3*2 add edx,[OffsetYBigPixel] mov [edx],bp mov [edx+2],cl mov [edx+3],bp mov [edx+3+2],cl add edx,3*2 add edx,[OffsetYBigPixel] add ebx,3*2 add eax,3 dec esi jnz screen_x_2 add eax,[OffsetYPicture] add ebx,[OffsetYWorkScreen] dec edi jnz screen_y_2 jmp fps no_zoom_2: cmp [k],4 jne no_zoom_4 screen_y_4: mov esi,[CounterX] screen_x_4: mov ecx,[eax] and ecx,0xffffff mov ebp,ecx shr ecx,16 mov edx,ebx mov [edx],bp mov [edx+2],cl mov [edx+3],bp mov [edx+3+2],cl mov [edx+6],bp mov [edx+6+2],cl mov [edx+9],bp mov [edx+9+2],cl add edx,3*4 add edx,[OffsetYBigPixel] mov [edx],bp mov [edx+2],cl mov [edx+3],bp mov [edx+3+2],cl mov [edx+6],bp mov [edx+6+2],cl mov [edx+9],bp mov [edx+9+2],cl add edx,3*4 add edx,[OffsetYBigPixel] mov [edx],bp mov [edx+2],cl mov [edx+3],bp mov [edx+3+2],cl mov [edx+6],bp mov [edx+6+2],cl mov [edx+9],bp mov [edx+9+2],cl add edx,3*4 add edx,[OffsetYBigPixel] mov [edx],bp mov [edx+2],cl mov [edx+3],bp mov [edx+3+2],cl mov [edx+6],bp mov [edx+6+2],cl mov [edx+9],bp mov [edx+9+2],cl add edx,3*4 add edx,[OffsetYBigPixel] add ebx,4*3 add eax,3 dec esi jnz screen_x_4 add eax,[OffsetYPicture] add ebx,[OffsetYWorkScreen] dec edi jnz screen_y_4 jmp fps no_zoom_4: ;if zoom more than 4 screen_y: mov esi,[CounterX] screen_x: mov ecx,[eax] and ecx,0xffffff mov ebp,ecx shr ecx,16 ;--------------------------------------------------------- push ebx eax mov edx,[k] big_pixel_y: mov eax,[k] big_pixel_x: mov [ebx],bp mov [ebx+2],cl add ebx,3 dec eax jnz big_pixel_x add ebx,[OffsetYBigPixel] dec edx jnz big_pixel_y pop eax ebx ;--------------------------------------------------------- mov edx,[k] lea edx,[edx+edx*2] add ebx,edx add eax,3 dec esi jnz screen_x add eax,[OffsetYPicture] add ebx,[OffsetYWorkScreen] dec edi jnz screen_y fps: ;mcall 18,14 mov ebx,[ScreenPointer] mov ecx,[WorkScreen_SizeX] mov edx,[WorkScreen_SizeY] shl ecx,16 add ecx,edx mov edx,8*65536+20+15+49+5+1 mcall 7 ret ;---------------------------------------------------------- ;--------------------clear screen-------------------------- ;---------------------------------------------------------- cleare_screen: mov eax,[ScreenPointer] mov ebx,[WorkScreen_SizeX] imul ebx,[WorkScreen_SizeY] lea ebx,[ebx+ebx*2] shr ebx,3 inc ebx mov esi,0xffffff clear_screen_loop: mov [eax],esi mov [eax+3],esi mov [eax+6],si add eax,4+4 dec ebx jnz clear_screen_loop ret ;---------------------------------------------------------- ;-------------cleare work arrea(work screen)--------------- ;---------------------------------------------------------- cleare_work_arrea: mov eax,[PointerToPicture] mov ebx,[Picture_SizeX] imul ebx,[Picture_SizeY] lea ebx,[ebx+ebx*2] shr ebx,3 inc ebx mov esi,0xffffff clear_work_arrea_loop: mov [eax],esi mov [eax+3],esi mov [eax+6],si add eax,4+4 dec ebx jnz clear_work_arrea_loop ret ;----------------------------------------------------------- ;calculate position work screen on a picture ;----------------------------------------------------------- CalculatePositionScreen: mov eax,[Picture_SizeX] mov ebx,[Picture_SizeY] mov ecx,[CounterX] mov edx,[CounterY] sub eax,ecx sub ebx,edx cmp [PosX],eax jle no_limit_screen_x mov [PosX],eax no_limit_screen_x: cmp [PosY],ebx jle no_limit_screen_y mov [PosY],ebx no_limit_screen_y: cmp [PosX],0 jns no_minimum_screen_x mov [PosX],0 no_minimum_screen_x: cmp [PosY],0 jns no_minimum_screen_y mov [PosY],0 no_minimum_screen_y: ret ;----------------------------------------------------------- ;-----------calculate cordinats on work picture-------------- ;----------------------------------------------------------- GetScreenCordinats: mov eax,[MouseX] mov ebx,[MouseY] sub eax,9 sub ebx,87 mov ecx,[k] cdq idiv ecx mov [ScreenX],eax mov eax,ebx cdq idiv ecx mov [ScreenY],eax ret