📄 q cir earth.asm
字号:
lop2:
sub esi,4
pop ecx
dec ecx
jnz @b
ret
_initTable endp
_SetBmp proc uses ebx esi edi @hDc
local @lpTable3
sub esp,4
ppp:
;---------------------------------------------------------
;对1024*512的位图提取512*512
;---------------------------------------------------------
mov edi,lpMem1
mov esi,lpMem
mov ecx,8
rep movsd
mov edi,lpMem1
mov esi,lpMem
mov dword ptr[edi+18],512
mov dword ptr[edi+22],512
sub lpOffset,3;lpOffset为提取1024*512起始线(0~1023)
cmp lpOffset,1023*3;乘3后为起始象素
jb @f
mov lpOffset,1023*3
@@:
add edi,36h
add esi,36h
mov ecx,512
@@:
mov edx,lpOffset
mov ebx,512
lp:
mov eax,esi
cmp edx,1023*3
jb lpa
mov edx,0
lpa:
add eax,edx
mov eax,dword ptr[eax]
mov dword ptr[edi],eax
add edx,3
add edi,3
dec ebx
jnz lp
add esi,1024*3
dec ecx
jnz @b
;---------------------------------------------------------
;对水平和垂直线进行缩放(透视处理512*512转326*326)
;---------------------------------------------------------
mov edi,lpMem2
mov esi,lpMem1
mov ecx,8
rep movsd
mov edi,lpMem2
mov esi,lpMem1
mov dword ptr[edi+18],326
mov dword ptr[edi+22],326
add edi,dword ptr[edi+10]
add esi,dword ptr[esi+10]
lea edx,Table1
mov dword ptr[esp],ebp
mov ebp,326
lp1:
mov esi,lpMem1
add esi,36h
add esi,dword ptr[edx]
add edx,4
lea ebx,Table2
mov ecx,326
@@:
mov eax,esi
add eax,dword ptr[ebx]
mov eax,dword ptr[eax]
mov dword ptr[edi],eax
add ebx,4
add edi,3
dec ecx
jnz @b
add edi,2
dec ebp
jnz lp1
mov ebp,dword ptr[esp]
;------------------------------------------------------------------
;对透视处理后的326*326转为一个圆形(从透视角度为一球形)
;------------------------------------------------------------------
mov edi,lpMem1
mov esi,lpMem2
mov dword ptr[edi+18],326
mov dword ptr[edi+22],326
add edi,dword ptr[edi+10]
mov eax,-1;把位图涂为白色
and edi,0fffffffch
mov ecx,326*327*3/4
rep stosd
mov edi,lpMem1
add edi,dword ptr[edi+10]
add esi,dword ptr[esi+10]
lea ebx,Rtable
lea eax,Table3
mov @lpTable3,eax
mov ecx,163
lp3:
mov dword ptr[esp],ecx
mov ecx,dword ptr[ebx]
add ebx,4
mov dword ptr[esp-4],ebx
mov eax,163
sub eax,ecx
mov ebx,3
mul ebx
add eax,edi
shl ecx,1
or ecx,ecx
jz @f
mov ebx,@lpTable3
lp2:
mov edx,esi
add edx,dword ptr[ebx]
mov edx,dword ptr[edx]
mov dword ptr[eax],edx
add ebx,4
add eax,3
dec ecx
jnz lp2
mov dword ptr[eax],0ffffffffh
mov @lpTable3,ebx
@@:
add edi,326*3+2;加2是因为位图326宽度的水平线与下一条水平线的距离
add esi,326*3+2;(距离=4-(宽度*3)%4;如果距离为4则距离变为0)
mov ebx,dword ptr[esp-4]
mov ecx,dword ptr[esp]
dec ecx
jnz lp3
mov ecx,163
lp4:
mov dword ptr[esp],ecx
mov ecx,dword ptr[ebx]
add ebx,4
mov dword ptr[esp-4],ebx
mov eax,163
sub eax,ecx
mov ebx,3
mul ebx
add eax,edi
shl ecx,1
or ecx,ecx
jz @f
mov ebx,@lpTable3
lp5:
mov edx,esi
add edx,dword ptr[ebx]
mov edx,dword ptr[edx]
mov dword ptr[eax],edx
add ebx,4
add eax,3
dec ecx
jnz lp5
mov dword ptr[eax],0ffffffffh;把右边的彩边去掉,如果没有这句会发现右边有一彩色镶边
mov @lpTable3,ebx
@@:
add edi,326*3+2
add esi,326*3+2
mov ebx,dword ptr[esp-4]
mov ecx,dword ptr[esp]
dec ecx
jnz lp4
;------------------------------------------------------
;输出转换后的图形
;------------------------------------------------------
mov edi,lpMem1
mov ebx,lpMem1
mov edx,lpMem1
add ebx,dword ptr[edi+10]
add edx,14
mov esi,0
sub esp,48
mov dword ptr[esp+44],esi;DIB_RGB_COLORS
mov dword ptr[esp+40],edx
mov dword ptr[esp+36],ebx
mov edx,dword ptr[edi+22]
mov dword ptr[esp+32],edx
mov dword ptr[esp+28],esi
mov dword ptr[esp+24],esi
mov dword ptr[esp+20],esi
mov dword ptr[esp+16],edx
mov edx,dword ptr[edi+18]
mov dword ptr[esp+12],edx
mov dword ptr[esp+8],10
mov dword ptr[esp+4],10
mov edx,@hDc
mov dword ptr[esp],edx
call SetDIBitsToDevice
;invoke SetDIBitsToDevice,@hDc,10,10,dword ptr[edi+18],dword ptr[edi+22],0,0,0,\
; dword ptr[edi+22],ebx,edx,DIB_RGB_COLORS
inc frame
cmp thjh,0
jz ppp
mov thjh,2
add esp,4
ret
_SetBmp endp
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
mov eax,uMsg
.if eax == WM_MOUSEMOVE
cmp moveJh,0
jz @@@
mov eax,lParam
shld ebx,eax,16
and eax,0ffffh
sub eax,mouX
sub ebx,mouY
add winRect.left,eax
add winRect.top,ebx
test winRect.left,80000000h
jz @f
mov winRect.left,0
@@:
test winRect.top,80000000h
jz @f
mov winRect.top,0
@@:
cmp winRect.left,20
ja @f
mov winRect.left,0
@@:
cmp winRect.top,20
ja @f
mov winRect.top,0
@@:
;--
mov eax,Xscreen
cmp winRect.left,eax
jb @f
mov winRect.left,eax
@@:
sub eax,20
cmp winRect.left,eax
jb @f
add eax,20
mov winRect.left,eax
@@:
mov eax,Yscreen
cmp winRect.top,eax
jb @f
mov winRect.top,eax
@@:
sub eax,20
cmp winRect.top,eax
jb @f
add eax,20
mov winRect.top,eax
@@:
invoke MoveWindow,hWnd,winRect.left,winRect.top,358,376,1
@@@:
.elseif eax == WM_TIMER
mov eax,frame
lea edi,buff
add edi,10
mov ecx,10
@@:
xor edx,edx
div ecx
add dl,30h
dec edi
mov byte ptr[edi],dl
or eax,eax
jnz @b
mov frame,0
invoke SetWindowText,hWnd,edi
.elseif eax == WM_LBUTTONDOWN
mov eax,lParam
shld ebx,eax,16
and eax,0ffffh
mov mouX,eax
mov mouY,ebx
invoke GetWindowRect,hWnd,addr winRect
mov moveJh,1
.elseif eax == WM_LBUTTONUP
mov moveJh,0
.elseif eax == WM_NCMOUSEMOVE
mov moveJh,0
.elseif eax == WM_RBUTTONUP
invoke SendMessage,hWnd,WM_CLOSE,0,0
.elseif eax == WM_CLOSE
invoke KillTimer,hWnd,1
mov thjh,1
invoke SetWindowText,hWnd,addr over
@@:
cmp thjh,2
je @f
invoke Sleep,1000
jmp @b
@@:
invoke GlobalFree,lpMem
invoke GlobalFree,lpMem1
invoke GlobalFree,lpMem2
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
.elseif eax == WM_CREATE
invoke CreateFile,addr BitMapAddr,GENERIC_READ,0,0,OPEN_EXISTING,0,0
cmp eax,-1
jne @f
invoke MessageBox,0,addr OpenError,0,0
invoke ExitProcess,0
@@:
mov hFile,eax
invoke GetFileSize,hFile,0
push eax
invoke GlobalAlloc,GMEM_ZEROINIT,eax
mov lpFile,eax
pop ebx
invoke ReadFile,hFile,lpFile,ebx,addr lpMem1,0
invoke GlobalAlloc,0,1024*513*3
mov lpMem,eax
invoke _prop,lpMem,lpFile,1024,512;将打开的位图强制转为1024*512便于处理
invoke _initTable ;初始化数据
invoke GlobalFree,lpFile
invoke CloseHandle,hFile
invoke GlobalAlloc,0,512*513*3
mov lpMem1,eax
invoke GlobalAlloc,0,326*327*3
mov lpMem2,eax
invoke SendMessage,hWnd,400h,0,0
mov dword ptr[buff+10],732fa1d6h;'帧/s'
mov byte ptr[buff+14],0
invoke SendMessage,hWnd,WM_TIMER,wParam,lParam
invoke SetTimer,hWnd,1,1000,0
invoke GetSystemMetrics,SM_CXSCREEN;获取屏幕水平分辨率
sub eax,358
mov Xscreen,eax
invoke GetSystemMetrics,SM_CYSCREEN;获取屏幕垂直分辨率
sub eax,376
mov Yscreen,eax
.elseif eax == WM_KEYDOWN
cmp wParam,1bh
jne @f
invoke SendMessage,hWnd,WM_CLOSE,wParam,lParam
@@:
.elseif eax == 400h
invoke GetDC,hWnd
mov hdc,eax
invoke CreateThread,0,0,offset _SetBmp,eax,1,0
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
_ProcWinMain endp
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,0,\
WS_SYSMENU or WS_MINIMIZEBOX,\
0,0,358,376,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret
_WinMain endp
start:
call _WinMain
invoke ExitProcess,NULL
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -