Range of magnitudes with the image, where mmin is always 0 and M is always one half the diagonal size of the image
Syntax
M
Synonyms
mmax
Original Machine Code (in OPER resource) of Filter Factory 3.0 and 3.0.4 for Photoshop/Win32
8B 47 48 | mov eax,[edi+$48] (X) | . |
8B 5F 54 | mov ebx,[edi+$54] (Y) | . |
2B 47 44 | sub eax,[edi+$44] (xmin) | . |
2B 5F 50 | sub ebx,[edi+$50] (ymin) | . |
D1 F8 | sar eax,1 | a = (X-xmin)/2; |
D1 FB | sar ebx,1 | b = (Y-ymin)/2; |
3B C3 | cmp eax,ebx | . |
75 07 | jnz +$07 (@@1) | if (a!=b) goto @@1; |
B8 0A 6A 00 00 | mov eax,$00006a0a (27146) | a = 27146; // proportion for a==b . Imaginary C2M_LOOKUP[1024] |
EB 11 | jmp +$11 (@@3) | goto @@3; |
@@1: | @@1: // a!=b | |
7E 01 | jle +$01 (@@2) | if (a<=b) goto @@2; // effective: a<b ? |
93 | xchg eax,ebx | tmp=a; a=b; b=tmp; |
@@2: | @@2: // a<=b, effektiv a<b ? | |
C1 E0 0A | shl eax,$0a (10) | a *= 1024; |
99 | cdq | d = (a<0) ? -1 : 0; |
F7 F3 | div ebx | a /= b; |
0F B7 84 47 78 15 00 00 | movzx eax,[edi+eax*2+$00001578] (C2M_LOOKUP) | a = C2M_LOOKUP[a]; |
@@3: | @@3: | |
F7 E3 | mul ebx | a *= b; |
0F AC D0 10 | shrd eax,edx,$10 (16) | Shift EAX right by 16 bits Store lower 16 bits of EDX into the upper 16 bits of EAX |
03 C3 | add eax,ebx | a += b; |
50 | push eax | return res; |
int X, xmin, Y, ymin; int factory_M() { int eax, ebx; eax = (X - xmin) >> 1; ebx = (Y - ymin) >> 1; if (eax == ebx) { eax = 27146; // 27146/65536 == sqrt(2)-1 } else { if (eax > ebx) { int xxx = eax; eax = ebx; ebx = xxx; } eax = eax << 10; eax /= ebx; eax = C2M_LOOKUP[eax]; } eax = ((int64_t)eax * (int64_t)ebx) >> 16; eax += ebx; return eax; }
3.00a (beta version) and 3.00b (internal build) did internally calculate (X-xmin) instead of (X-xmin)/2, and (Y-ymin) instead of (Y-ymin)/2.
Version 3.00a (beta version) and 3.00b (internal build) | Version 3.00 (final) and 3.0.4 |
mov eax,DWORD PTR [edi+0x48] ; X mov ebx,DWORD PTR [edi+0x54] ; Y sub eax,DWORD PTR [edi+0x44] ; xmin sub ebx,DWORD PTR [edi+0x50] ; ymin cmp eax,ebx jne @@1 mov eax,0x6a0a ; 27146/65536 == sqrt(2)-1 jmp @@3 @@1: jle @@2 xchg ebx,eax @@2: shl eax,0xa cdq div ebx movzx eax,WORD PTR [edi+eax*2+0x1578] ; C2M_LOOKUP @@3: mul ebx shrd eax,edx,0x10 add eax,ebx push eax |
mov eax,DWORD PTR [edi+0x48] ; X mov ebx,DWORD PTR [edi+0x54] ; Y sub eax,DWORD PTR [edi+0x44] ; xmin sub ebx,DWORD PTR [edi+0x50] ; ymin sar eax,1 ; added eax = (X-xmin)/2 sar ebx,1 ; added ebx = (Y-ymin)/2 cmp eax,ebx jne @@1 mov eax,0x6a0a ; 27146/65536 == sqrt(2)-1 jmp @@3 @@1: jle @@2 xchg ebx,eax @@2: shl eax,0xa cdq div ebx movzx eax,WORD PTR [edi+eax*2+0x1578] ; C2M_LOOKUP @@3: mul ebx shrd eax,edx,0x10 add eax,ebx push eax |