From the manual: Bounded tangent function of x, where x is an integer between -256 and 256, inclusive, and the value returned is an integer between -512 and 512, inclusive (Windows) or -1024 and 1024, inclusive (Mac OS)
Mistake in 3.0.4 documentation: This function is NOT implemented bounded! Unlike cos and sin which are bounded,
tan will go off-range.
You can test it with this small test filter:
R = cos(x) > 1024 || cos(x) < -1024 || cos(-x) > 1024 || cos(-x) < -1024 ? 255 : 0
G = tan(x) > 1024 || tan(x) < -1024 || tan(-x) > 1024 || tan(-x) < -1024 ? 255 : 0
B = sin(x) > 1024 || sin(x) < -1024 || sin(-x) > 1024 || sin(-x) < -1024 ? 255 : 0
or more to show only one example (works on Windows and Mac OS):
FilterFactory 3.0.4: tan(-768) == 167772 ? 255 : 0
Click here for a diagram of sin, cos, tan
Syntax
tan(x)
Original Machine Code (in OPER resource) of Filter Factory 3.0 and 3.0.4 for Photoshop/Win32
58 | pop eax (param_x) | |
8B D8 | mov ebx,eax | |
0B DB | or ebx,ebx | |
7D 02 | jnl +$02 (@@1) | |
F7 DB | neg ebx | |
@@1: | ||
81 E3 FF 03 00 00 | and ebx,$000003ff (1023) | |
0F BF 9C 5F 78 05 00 00 | movsx ebx,[edi+ebx*2+$00000578] (COS_LOOKUP) | |
2D 00 01 00 00 | sub eax,$00000100 (256) | |
79 02 | jns +$02 (@@2) | |
F7 D8 | neg eax | |
@@2: | ||
25 FF 03 00 00 | and eax,$000003ff (1023) | |
0F BF 84 47 78 05 00 00 | movsx eax,[edi+eax*2+$00000578] (COS_LOOKUP) | |
0B DB | or ebx,ebx | |
75 04 | jnz +$04 (@@3) | |
33 C0 | xor eax,eax | |
EB 06 | jmp +$06 (@@4) | |
@@3: | ||
C1 E0 0A | shl eax,$0a (10) | |
99 | cdq | |
F7 FB | idiv ebx | |
@@4: | ||
50 | push eax |
int factory_tan(int parm) { int v1 = parm; int v2 = v1 < 0 ? -v1 : v1; v2 &= 0x3ff; // 1023 v2 = COS_LOOKUP[v2]; v1 -= 256; if (v1 < 0) v1 = -v1; v1 &= 0x3ff; // 1023 v1 = COS_LOOKUP[v1]; if (v2 == 0) return 0; v1 = v1 << 10; // v1 *= 1024; return v1 / v2; }