Subversion Repositories filter_foundry

Rev

Rev 502 | Rev 532 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 502 Rev 503
1
/*
1
/*
2
        This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
2
        This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
3
        Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.com.au
3
        Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.com.au
4
        Copyright (C) 2018-2021 Daniel Marschall, ViaThinkSoft
4
        Copyright (C) 2018-2022 Daniel Marschall, ViaThinkSoft
5
 
5
 
6
        This program is free software; you can redistribute it and/or modify
6
        This program is free software; you can redistribute it and/or modify
7
        it under the terms of the GNU General Public License as published by
7
        it under the terms of the GNU General Public License as published by
8
        the Free Software Foundation; either version 2 of the License, or
8
        the Free Software Foundation; either version 2 of the License, or
9
        (at your option) any later version.
9
        (at your option) any later version.
10
 
10
 
11
        This program is distributed in the hope that it will be useful,
11
        This program is distributed in the hope that it will be useful,
12
        but WITHOUT ANY WARRANTY; without even the implied warranty of
12
        but WITHOUT ANY WARRANTY; without even the implied warranty of
13
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
        GNU General Public License for more details.
14
        GNU General Public License for more details.
15
 
15
 
16
        You should have received a copy of the GNU General Public License
16
        You should have received a copy of the GNU General Public License
17
        along with this program; if not, write to the Free Software
17
        along with this program; if not, write to the Free Software
18
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
*/
19
*/
20
 
20
 
21
#ifdef MAC_ENV
21
#ifdef MAC_ENV
22
#include <fp.h>
22
#include <fp.h>
23
#endif
23
#endif
24
 
24
 
25
#include <math.h>
25
#include <math.h>
26
#include <stdlib.h>
26
#include <stdlib.h>
27
 
27
 
28
#ifndef PARSERTEST
28
#ifndef PARSERTEST
29
#include "ff.h"
29
#include "ff.h"
30
#else
30
#else
31
#define uint8_t unsigned char
31
#define uint8_t unsigned char
32
#define uint16_t unsigned short
32
#define uint16_t unsigned short
33
#define uint32_t unsigned int
33
#define uint32_t unsigned int
34
#define int32_t int
34
#define int32_t int
35
#endif
35
#endif
36
 
36
 
37
#include "funcs.h"
37
#include "funcs.h"
38
#include "y.tab.h"
38
#include "y.tab.h"
39
 
39
 
40
#include "node.h" // for symbol "var[]"
40
#include "node.h" // for symbol "var[]"
41
 
41
 
42
#define RINT //no rounding for now
42
#define RINT //no rounding for now
43
 
43
 
44
//#if TARGET_API_MAC_CARBON
44
//#if TARGET_API_MAC_CARBON
45
// this is another incompatibility between Classic stdclib and OS X stdclib
45
// this is another incompatibility between Classic stdclib and OS X stdclib
46
// ***FIXME: need to access real OS X includes for Carbon build
46
// ***FIXME: need to access real OS X includes for Carbon build
47
//#undef RAND_MAX
47
//#undef RAND_MAX
48
//#define RAND_MAX    0x7fffffff
48
//#define RAND_MAX    0x7fffffff
49
//#endif
49
//#endif
50
 
50
 
51
const int FACTORY_COS_LOOKUP[1024] = {
51
const int FACTORY_COS_LOOKUP[1024] = {
52
        16384, 16383, 16382, 16381, 16379, 16376, 16372, 16368, 16364, 16359, 16353, 16346, 16339, 16331, 16323,
52
        16384, 16383, 16382, 16381, 16379, 16376, 16372, 16368, 16364, 16359, 16353, 16346, 16339, 16331, 16323,
53
        16314, 16305, 16294, 16284, 16272, 16260, 16248, 16234, 16221, 16206, 16191, 16175, 16159, 16142, 16125,
53
        16314, 16305, 16294, 16284, 16272, 16260, 16248, 16234, 16221, 16206, 16191, 16175, 16159, 16142, 16125,
54
        16107, 16088, 16069, 16049, 16028, 16007, 15985, 15963, 15940, 15917, 15893, 15868, 15842, 15817, 15790,
54
        16107, 16088, 16069, 16049, 16028, 16007, 15985, 15963, 15940, 15917, 15893, 15868, 15842, 15817, 15790,
55
        15763, 15735, 15707, 15678, 15649, 15618, 15588, 15557, 15525, 15492, 15459, 15426, 15392, 15357, 15322,
55
        15763, 15735, 15707, 15678, 15649, 15618, 15588, 15557, 15525, 15492, 15459, 15426, 15392, 15357, 15322,
56
        15286, 15249, 15212, 15175, 15136, 15098, 15058, 15018, 14978, 14937, 14895, 14853, 14811, 14767, 14723,
56
        15286, 15249, 15212, 15175, 15136, 15098, 15058, 15018, 14978, 14937, 14895, 14853, 14811, 14767, 14723,
57
        14679, 14634, 14589, 14543, 14496, 14449, 14401, 14353, 14304, 14255, 14205, 14155, 14104, 14053, 14001,
57
        14679, 14634, 14589, 14543, 14496, 14449, 14401, 14353, 14304, 14255, 14205, 14155, 14104, 14053, 14001,
58
        13948, 13895, 13842, 13788, 13733, 13678, 13622, 13566, 13510, 13452, 13395, 13337, 13278, 13219, 13159,
58
        13948, 13895, 13842, 13788, 13733, 13678, 13622, 13566, 13510, 13452, 13395, 13337, 13278, 13219, 13159,
59
        13099, 13039, 12977, 12916, 12854, 12791, 12728, 12665, 12601, 12536, 12471, 12406, 12340, 12273, 12207,
59
        13099, 13039, 12977, 12916, 12854, 12791, 12728, 12665, 12601, 12536, 12471, 12406, 12340, 12273, 12207,
60
        12139, 12072, 12003, 11935, 11866, 11796, 11726, 11656, 11585, 11513, 11442, 11370, 11297, 11224, 11151,
60
        12139, 12072, 12003, 11935, 11866, 11796, 11726, 11656, 11585, 11513, 11442, 11370, 11297, 11224, 11151,
61
        11077, 11003, 10928, 10853, 10777, 10701, 10625, 10548, 10471, 10394, 10316, 10237, 10159, 10080, 10000,
61
        11077, 11003, 10928, 10853, 10777, 10701, 10625, 10548, 10471, 10394, 10316, 10237, 10159, 10080, 10000,
62
        9920, 9840, 9760, 9679, 9597, 9516, 9434, 9351, 9269, 9186, 9102, 9018, 8934, 8850, 8765, 8680, 8595,
62
        9920, 9840, 9760, 9679, 9597, 9516, 9434, 9351, 9269, 9186, 9102, 9018, 8934, 8850, 8765, 8680, 8595,
63
        8509, 8423, 8336, 8250, 8163, 8075, 7988, 7900, 7812, 7723, 7634, 7545, 7456, 7366, 7276, 7186, 7096,
63
        8509, 8423, 8336, 8250, 8163, 8075, 7988, 7900, 7812, 7723, 7634, 7545, 7456, 7366, 7276, 7186, 7096,
64
        7005, 6914, 6822, 6731, 6639, 6547, 6455, 6362, 6270, 6176, 6083, 5990, 5896, 5802, 5708, 5614, 5519,
64
        7005, 6914, 6822, 6731, 6639, 6547, 6455, 6362, 6270, 6176, 6083, 5990, 5896, 5802, 5708, 5614, 5519,
65
        5424, 5329, 5234, 5139, 5043, 4948, 4852, 4756, 4659, 4563, 4466, 4369, 4273, 4175, 4078, 3981, 3883,
65
        5424, 5329, 5234, 5139, 5043, 4948, 4852, 4756, 4659, 4563, 4466, 4369, 4273, 4175, 4078, 3981, 3883,
66
        3785, 3687, 3589, 3491, 3393, 3295, 3196, 3097, 2998, 2900, 2801, 2702, 2602, 2503, 2404, 2304, 2205,
66
        3785, 3687, 3589, 3491, 3393, 3295, 3196, 3097, 2998, 2900, 2801, 2702, 2602, 2503, 2404, 2304, 2205,
67
        2105, 2005, 1905, 1806, 1706, 1606, 1505, 1405, 1305, 1205, 1105, 1004, 904, 804, 703, 603, 502, 402,
67
        2105, 2005, 1905, 1806, 1706, 1606, 1505, 1405, 1305, 1205, 1105, 1004, 904, 804, 703, 603, 502, 402,
68
        301, 201, 100, -100, -201, -301, -402, -502, -603, -703, -804, -904, -1004, -1105, -1205, -1305, -1405,
68
        301, 201, 100, -100, -201, -301, -402, -502, -603, -703, -804, -904, -1004, -1105, -1205, -1305, -1405,
69
        -1505, -1606, -1706, -1806, -1905, -2005, -2105, -2205, -2304, -2404, -2503, -2602, -2702, -2801, -2900,
69
        -1505, -1606, -1706, -1806, -1905, -2005, -2105, -2205, -2304, -2404, -2503, -2602, -2702, -2801, -2900,
70
        -2998, -3097, -3196, -3295, -3393, -3491, -3589, -3687, -3785, -3883, -3981, -4078, -4175, -4273, -4369,
70
        -2998, -3097, -3196, -3295, -3393, -3491, -3589, -3687, -3785, -3883, -3981, -4078, -4175, -4273, -4369,
71
        -4466, -4563, -4659, -4756, -4852, -4948, -5043, -5139, -5234, -5329, -5424, -5519, -5614, -5708, -5802,
71
        -4466, -4563, -4659, -4756, -4852, -4948, -5043, -5139, -5234, -5329, -5424, -5519, -5614, -5708, -5802,
72
        -5896, -5990, -6083, -6176, -6270, -6362, -6455, -6547, -6639, -6731, -6822, -6914, -7005, -7096, -7186,
72
        -5896, -5990, -6083, -6176, -6270, -6362, -6455, -6547, -6639, -6731, -6822, -6914, -7005, -7096, -7186,
73
        -7276, -7366, -7456, -7545, -7634, -7723, -7812, -7900, -7988, -8075, -8163, -8250, -8336, -8423, -8509,
73
        -7276, -7366, -7456, -7545, -7634, -7723, -7812, -7900, -7988, -8075, -8163, -8250, -8336, -8423, -8509,
74
        -8595, -8680, -8765, -8850, -8934, -9018, -9102, -9186, -9269, -9351, -9434, -9516, -9597, -9679, -9760,
74
        -8595, -8680, -8765, -8850, -8934, -9018, -9102, -9186, -9269, -9351, -9434, -9516, -9597, -9679, -9760,
75
        -9840, -9920, -10000, -10080, -10159, -10237, -10316, -10394, -10471, -10548, -10625, -10701, -10777,
75
        -9840, -9920, -10000, -10080, -10159, -10237, -10316, -10394, -10471, -10548, -10625, -10701, -10777,
76
        -10853, -10928, -11003, -11077, -11151, -11224, -11297, -11370, -11442, -11513, -11585, -11656, -11726,
76
        -10853, -10928, -11003, -11077, -11151, -11224, -11297, -11370, -11442, -11513, -11585, -11656, -11726,
77
        -11796, -11866, -11935, -12003, -12072, -12139, -12207, -12273, -12340, -12406, -12471, -12536, -12601,
77
        -11796, -11866, -11935, -12003, -12072, -12139, -12207, -12273, -12340, -12406, -12471, -12536, -12601,
78
        -12665, -12728, -12791, -12854, -12916, -12977, -13039, -13099, -13159, -13219, -13278, -13337, -13395,
78
        -12665, -12728, -12791, -12854, -12916, -12977, -13039, -13099, -13159, -13219, -13278, -13337, -13395,
79
        -13452, -13510, -13566, -13622, -13678, -13733, -13788, -13842, -13895, -13948, -14001, -14053, -14104,
79
        -13452, -13510, -13566, -13622, -13678, -13733, -13788, -13842, -13895, -13948, -14001, -14053, -14104,
80
        -14155, -14205, -14255, -14304, -14353, -14401, -14449, -14496, -14543, -14589, -14634, -14679, -14723,
80
        -14155, -14205, -14255, -14304, -14353, -14401, -14449, -14496, -14543, -14589, -14634, -14679, -14723,
81
        -14767, -14811, -14853, -14895, -14937, -14978, -15018, -15058, -15098, -15136, -15175, -15212, -15249,
81
        -14767, -14811, -14853, -14895, -14937, -14978, -15018, -15058, -15098, -15136, -15175, -15212, -15249,
82
        -15286, -15322, -15357, -15392, -15426, -15459, -15492, -15525, -15557, -15588, -15618, -15649, -15678,
82
        -15286, -15322, -15357, -15392, -15426, -15459, -15492, -15525, -15557, -15588, -15618, -15649, -15678,
83
        -15707, -15735, -15763, -15790, -15817, -15842, -15868, -15893, -15917, -15940, -15963, -15985, -16007,
83
        -15707, -15735, -15763, -15790, -15817, -15842, -15868, -15893, -15917, -15940, -15963, -15985, -16007,
84
        -16028, -16049, -16069, -16088, -16107, -16125, -16142, -16159, -16175, -16191, -16206, -16221, -16234,
84
        -16028, -16049, -16069, -16088, -16107, -16125, -16142, -16159, -16175, -16191, -16206, -16221, -16234,
85
        -16248, -16260, -16272, -16284, -16294, -16305, -16314, -16323, -16331, -16339, -16346, -16353, -16359,
85
        -16248, -16260, -16272, -16284, -16294, -16305, -16314, -16323, -16331, -16339, -16346, -16353, -16359,
86
        -16364, -16368, -16372, -16376, -16379, -16381, -16382, -16383, -16384, -16384, -16383, -16382, -16381,
86
        -16364, -16368, -16372, -16376, -16379, -16381, -16382, -16383, -16384, -16384, -16383, -16382, -16381,
87
        -16379, -16376, -16372, -16368, -16364, -16359, -16353, -16346, -16339, -16331, -16323, -16314, -16305,
87
        -16379, -16376, -16372, -16368, -16364, -16359, -16353, -16346, -16339, -16331, -16323, -16314, -16305,
88
        -16294, -16284, -16272, -16260, -16248, -16234, -16221, -16206, -16191, -16175, -16159, -16142, -16125,
88
        -16294, -16284, -16272, -16260, -16248, -16234, -16221, -16206, -16191, -16175, -16159, -16142, -16125,
89
        -16107, -16088, -16069, -16049, -16028, -16007, -15985, -15963, -15940, -15917, -15893, -15868, -15842,
89
        -16107, -16088, -16069, -16049, -16028, -16007, -15985, -15963, -15940, -15917, -15893, -15868, -15842,
90
        -15817, -15790, -15763, -15735, -15707, -15678, -15649, -15618, -15588, -15557, -15525, -15492, -15459,
90
        -15817, -15790, -15763, -15735, -15707, -15678, -15649, -15618, -15588, -15557, -15525, -15492, -15459,
91
        -15426, -15392, -15357, -15322, -15286, -15249, -15212, -15175, -15136, -15098, -15058, -15018, -14978,
91
        -15426, -15392, -15357, -15322, -15286, -15249, -15212, -15175, -15136, -15098, -15058, -15018, -14978,
92
        -14937, -14895, -14853, -14811, -14767, -14723, -14679, -14634, -14589, -14543, -14496, -14449, -14401,
92
        -14937, -14895, -14853, -14811, -14767, -14723, -14679, -14634, -14589, -14543, -14496, -14449, -14401,
93
        -14353, -14304, -14255, -14205, -14155, -14104, -14053, -14001, -13948, -13895, -13842, -13788, -13733,
93
        -14353, -14304, -14255, -14205, -14155, -14104, -14053, -14001, -13948, -13895, -13842, -13788, -13733,
94
        -13678, -13622, -13566, -13510, -13452, -13395, -13337, -13278, -13219, -13159, -13099, -13039, -12977,
94
        -13678, -13622, -13566, -13510, -13452, -13395, -13337, -13278, -13219, -13159, -13099, -13039, -12977,
95
        -12916, -12854, -12791, -12728, -12665, -12601, -12536, -12471, -12406, -12340, -12273, -12207, -12139,
95
        -12916, -12854, -12791, -12728, -12665, -12601, -12536, -12471, -12406, -12340, -12273, -12207, -12139,
96
        -12072, -12003, -11935, -11866, -11796, -11726, -11656, -11585, -11513, -11442, -11370, -11297, -11224,
96
        -12072, -12003, -11935, -11866, -11796, -11726, -11656, -11585, -11513, -11442, -11370, -11297, -11224,
97
        -11151, -11077, -11003, -10928, -10853, -10777, -10701, -10625, -10548, -10471, -10394, -10316, -10237,
97
        -11151, -11077, -11003, -10928, -10853, -10777, -10701, -10625, -10548, -10471, -10394, -10316, -10237,
98
        -10159, -10080, -10000, -9920, -9840, -9760, -9679, -9597, -9516, -9434, -9351, -9269, -9186, -9102,
98
        -10159, -10080, -10000, -9920, -9840, -9760, -9679, -9597, -9516, -9434, -9351, -9269, -9186, -9102,
99
        -9018, -8934, -8850, -8765, -8680, -8595, -8509, -8423, -8336, -8250, -8163, -8075, -7988, -7900, -7812,
99
        -9018, -8934, -8850, -8765, -8680, -8595, -8509, -8423, -8336, -8250, -8163, -8075, -7988, -7900, -7812,
100
        -7723, -7634, -7545, -7456, -7366, -7276, -7186, -7096, -7005, -6914, -6822, -6731, -6639, -6547, -6455,
100
        -7723, -7634, -7545, -7456, -7366, -7276, -7186, -7096, -7005, -6914, -6822, -6731, -6639, -6547, -6455,
101
        -6362, -6270, -6176, -6083, -5990, -5896, -5802, -5708, -5614, -5519, -5424, -5329, -5234, -5139, -5043,
101
        -6362, -6270, -6176, -6083, -5990, -5896, -5802, -5708, -5614, -5519, -5424, -5329, -5234, -5139, -5043,
102
        -4948, -4852, -4756, -4659, -4563, -4466, -4369, -4273, -4175, -4078, -3981, -3883, -3785, -3687, -3589,
102
        -4948, -4852, -4756, -4659, -4563, -4466, -4369, -4273, -4175, -4078, -3981, -3883, -3785, -3687, -3589,
103
        -3491, -3393, -3295, -3196, -3097, -2998, -2900, -2801, -2702, -2602, -2503, -2404, -2304, -2205, -2105,
103
        -3491, -3393, -3295, -3196, -3097, -2998, -2900, -2801, -2702, -2602, -2503, -2404, -2304, -2205, -2105,
104
        -2005, -1905, -1806, -1706, -1606, -1505, -1405, -1305, -1205, -1105, -1004, -904, -804, -703, -603, -502,
104
        -2005, -1905, -1806, -1706, -1606, -1505, -1405, -1305, -1205, -1105, -1004, -904, -804, -703, -603, -502,
105
        -402, -301, -201, -100, 100, 201, 301, 402, 502, 603, 703, 804, 904, 1004, 1105, 1205, 1305, 1405, 1505,
105
        -402, -301, -201, -100, 100, 201, 301, 402, 502, 603, 703, 804, 904, 1004, 1105, 1205, 1305, 1405, 1505,
106
        1606, 1706, 1806, 1905, 2005, 2105, 2205, 2304, 2404, 2503, 2602, 2702, 2801, 2900, 2998, 3097, 3196,
106
        1606, 1706, 1806, 1905, 2005, 2105, 2205, 2304, 2404, 2503, 2602, 2702, 2801, 2900, 2998, 3097, 3196,
107
        3295, 3393, 3491, 3589, 3687, 3785, 3883, 3981, 4078, 4175, 4273, 4369, 4466, 4563, 4659, 4756, 4852,
107
        3295, 3393, 3491, 3589, 3687, 3785, 3883, 3981, 4078, 4175, 4273, 4369, 4466, 4563, 4659, 4756, 4852,
108
        4948, 5043, 5139, 5234, 5329, 5424, 5519, 5614, 5708, 5802, 5896, 5990, 6083, 6176, 6270, 6362, 6455,
108
        4948, 5043, 5139, 5234, 5329, 5424, 5519, 5614, 5708, 5802, 5896, 5990, 6083, 6176, 6270, 6362, 6455,
109
        6547, 6639, 6731, 6822, 6914, 7005, 7096, 7186, 7276, 7366, 7456, 7545, 7634, 7723, 7812, 7900, 7988,
109
        6547, 6639, 6731, 6822, 6914, 7005, 7096, 7186, 7276, 7366, 7456, 7545, 7634, 7723, 7812, 7900, 7988,
110
        8075, 8163, 8250, 8336, 8423, 8509, 8595, 8680, 8765, 8850, 8934, 9018, 9102, 9186, 9269, 9351, 9434,
110
        8075, 8163, 8250, 8336, 8423, 8509, 8595, 8680, 8765, 8850, 8934, 9018, 9102, 9186, 9269, 9351, 9434,
111
        9516, 9597, 9679, 9760, 9840, 9920, 10000, 10080, 10159, 10237, 10316, 10394, 10471, 10548, 10625, 10701,
111
        9516, 9597, 9679, 9760, 9840, 9920, 10000, 10080, 10159, 10237, 10316, 10394, 10471, 10548, 10625, 10701,
112
        10777, 10853, 10928, 11003, 11077, 11151, 11224, 11297, 11370, 11442, 11513, 11585, 11656, 11726, 11796,
112
        10777, 10853, 10928, 11003, 11077, 11151, 11224, 11297, 11370, 11442, 11513, 11585, 11656, 11726, 11796,
113
        11866, 11935, 12003, 12072, 12139, 12207, 12273, 12340, 12406, 12471, 12536, 12601, 12665, 12728, 12791,
113
        11866, 11935, 12003, 12072, 12139, 12207, 12273, 12340, 12406, 12471, 12536, 12601, 12665, 12728, 12791,
114
        12854, 12916, 12977, 13039, 13099, 13159, 13219, 13278, 13337, 13395, 13452, 13510, 13566, 13622, 13678,
114
        12854, 12916, 12977, 13039, 13099, 13159, 13219, 13278, 13337, 13395, 13452, 13510, 13566, 13622, 13678,
115
        13733, 13788, 13842, 13895, 13948, 14001, 14053, 14104, 14155, 14205, 14255, 14304, 14353, 14401, 14449,
115
        13733, 13788, 13842, 13895, 13948, 14001, 14053, 14104, 14155, 14205, 14255, 14304, 14353, 14401, 14449,
116
        14496, 14543, 14589, 14634, 14679, 14723, 14767, 14811, 14853, 14895, 14937, 14978, 15018, 15058, 15098,
116
        14496, 14543, 14589, 14634, 14679, 14723, 14767, 14811, 14853, 14895, 14937, 14978, 15018, 15058, 15098,
117
        15136, 15175, 15212, 15249, 15286, 15322, 15357, 15392, 15426, 15459, 15492, 15525, 15557, 15588, 15618,
117
        15136, 15175, 15212, 15249, 15286, 15322, 15357, 15392, 15426, 15459, 15492, 15525, 15557, 15588, 15618,
118
        15649, 15678, 15707, 15735, 15763, 15790, 15817, 15842, 15868, 15893, 15917, 15940, 15963, 15985, 16007,
118
        15649, 15678, 15707, 15735, 15763, 15790, 15817, 15842, 15868, 15893, 15917, 15940, 15963, 15985, 16007,
119
        16028, 16049, 16069, 16088, 16107, 16125, 16142, 16159, 16175, 16191, 16206, 16221, 16234, 16248, 16260,
119
        16028, 16049, 16069, 16088, 16107, 16125, 16142, 16159, 16175, 16191, 16206, 16221, 16234, 16248, 16260,
120
        16272, 16284, 16294, 16305, 16314, 16323, 16331, 16339, 16346, 16353, 16359, 16364, 16368, 16372, 16376,
120
        16272, 16284, 16294, 16305, 16314, 16323, 16331, 16339, 16346, 16353, 16359, 16364, 16368, 16372, 16376,
121
        16379, 16381, 16382, 16383, 16384 };
121
        16379, 16381, 16382, 16383, 16384 };
122
 
122
 
123
const uint16_t FACTORY_C2D_LOOKUP[1024] = {
123
const uint16_t FACTORY_C2D_LOOKUP[1024] = {
124
        64, 128, 191, 255, 319, 383, 447, 511, 575, 639, 703, 767, 831, 895, 959, 1023, 1087, 1151, 1215, 1279,
124
        64, 128, 191, 255, 319, 383, 447, 511, 575, 639, 703, 767, 831, 895, 959, 1023, 1087, 1151, 1215, 1279,
125
        1343, 1407, 1471, 1535, 1599, 1663, 1727, 1791, 1855, 1919, 1983, 2047, 2111, 2175, 2239, 2303, 2366,
125
        1343, 1407, 1471, 1535, 1599, 1663, 1727, 1791, 1855, 1919, 1983, 2047, 2111, 2175, 2239, 2303, 2366,
126
        2430, 2494, 2558, 2622, 2686, 2750, 2814, 2878, 2942, 3005, 3069, 3133, 3197, 3261, 3325, 3388, 3452,
126
        2430, 2494, 2558, 2622, 2686, 2750, 2814, 2878, 2942, 3005, 3069, 3133, 3197, 3261, 3325, 3388, 3452,
127
        3516, 3580, 3644, 3708, 3771, 3835, 3899, 3963, 4026, 4090, 4154, 4218, 4281, 4345, 4409, 4473, 4536,
127
        3516, 3580, 3644, 3708, 3771, 3835, 3899, 3963, 4026, 4090, 4154, 4218, 4281, 4345, 4409, 4473, 4536,
128
        4600, 4664, 4727, 4791, 4855, 4918, 4982, 5046, 5109, 5173, 5236, 5300, 5364, 5427, 5491, 5554, 5618,
128
        4600, 4664, 4727, 4791, 4855, 4918, 4982, 5046, 5109, 5173, 5236, 5300, 5364, 5427, 5491, 5554, 5618,
129
        5681, 5745, 5808, 5872, 5935, 5999, 6062, 6126, 6189, 6252, 6316, 6379, 6443, 6506, 6569, 6633, 6696,
129
        5681, 5745, 5808, 5872, 5935, 5999, 6062, 6126, 6189, 6252, 6316, 6379, 6443, 6506, 6569, 6633, 6696,
130
        6759, 6823, 6886, 6949, 7013, 7076, 7139, 7202, 7266, 7329, 7392, 7455, 7518, 7582, 7645, 7708, 7771,
130
        6759, 6823, 6886, 6949, 7013, 7076, 7139, 7202, 7266, 7329, 7392, 7455, 7518, 7582, 7645, 7708, 7771,
131
        7834, 7897, 7960, 8023, 8086, 8149, 8212, 8275, 8338, 8401, 8464, 8527, 8590, 8653, 8716, 8779, 8841,
131
        7834, 7897, 7960, 8023, 8086, 8149, 8212, 8275, 8338, 8401, 8464, 8527, 8590, 8653, 8716, 8779, 8841,
132
        8904, 8967, 9030, 9093, 9155, 9218, 9281, 9344, 9406, 9469, 9532, 9594, 9657, 9720, 9782, 9845, 9907,
132
        8904, 8967, 9030, 9093, 9155, 9218, 9281, 9344, 9406, 9469, 9532, 9594, 9657, 9720, 9782, 9845, 9907,
133
        9970, 10032, 10095, 10157, 10220, 10282, 10345, 10407, 10470, 10532, 10594, 10657, 10719, 10781, 10843,
133
        9970, 10032, 10095, 10157, 10220, 10282, 10345, 10407, 10470, 10532, 10594, 10657, 10719, 10781, 10843,
134
        10906, 10968, 11030, 11092, 11155, 11217, 11279, 11341, 11403, 11465, 11527, 11589, 11651, 11713, 11775,
134
        10906, 10968, 11030, 11092, 11155, 11217, 11279, 11341, 11403, 11465, 11527, 11589, 11651, 11713, 11775,
135
        11837, 11899, 11961, 12023, 12085, 12146, 12208, 12270, 12332, 12394, 12455, 12517, 12579, 12640, 12702,
135
        11837, 11899, 11961, 12023, 12085, 12146, 12208, 12270, 12332, 12394, 12455, 12517, 12579, 12640, 12702,
136
        12764, 12825, 12887, 12948, 13010, 13071, 13133, 13194, 13256, 13317, 13379, 13440, 13501, 13563, 13624,
136
        12764, 12825, 12887, 12948, 13010, 13071, 13133, 13194, 13256, 13317, 13379, 13440, 13501, 13563, 13624,
137
        13685, 13746, 13808, 13869, 13930, 13991, 14052, 14113, 14174, 14235, 14296, 14357, 14418, 14479, 14540,
137
        13685, 13746, 13808, 13869, 13930, 13991, 14052, 14113, 14174, 14235, 14296, 14357, 14418, 14479, 14540,
138
        14601, 14662, 14723, 14784, 14844, 14905, 14966, 15027, 15087, 15148, 15208, 15269, 15330, 15390, 15451,
138
        14601, 14662, 14723, 14784, 14844, 14905, 14966, 15027, 15087, 15148, 15208, 15269, 15330, 15390, 15451,
139
        15511, 15572, 15632, 15693, 15753, 15813, 15874, 15934, 15994, 16054, 16115, 16175, 16235, 16295, 16355,
139
        15511, 15572, 15632, 15693, 15753, 15813, 15874, 15934, 15994, 16054, 16115, 16175, 16235, 16295, 16355,
140
        16415, 16475, 16535, 16595, 16655, 16715, 16775, 16835, 16895, 16955, 17015, 17074, 17134, 17194, 17254,
140
        16415, 16475, 16535, 16595, 16655, 16715, 16775, 16835, 16895, 16955, 17015, 17074, 17134, 17194, 17254,
141
        17313, 17373, 17432, 17492, 17551, 17611, 17670, 17730, 17789, 17849, 17908, 17967, 18027, 18086, 18145,
141
        17313, 17373, 17432, 17492, 17551, 17611, 17670, 17730, 17789, 17849, 17908, 17967, 18027, 18086, 18145,
142
        18204, 18264, 18323, 18382, 18441, 18500, 18559, 18618, 18677, 18736, 18795, 18854, 18912, 18971, 19030,
142
        18204, 18264, 18323, 18382, 18441, 18500, 18559, 18618, 18677, 18736, 18795, 18854, 18912, 18971, 19030,
143
        19089, 19147, 19206, 19265, 19323, 19382, 19440, 19499, 19557, 19616, 19674, 19733, 19791, 19849, 19908,
143
        19089, 19147, 19206, 19265, 19323, 19382, 19440, 19499, 19557, 19616, 19674, 19733, 19791, 19849, 19908,
144
        19966, 20024, 20082, 20141, 20199, 20257, 20315, 20373, 20431, 20489, 20547, 20605, 20663, 20720, 20778,
144
        19966, 20024, 20082, 20141, 20199, 20257, 20315, 20373, 20431, 20489, 20547, 20605, 20663, 20720, 20778,
145
        20836, 20894, 20951, 21009, 21067, 21124, 21182, 21239, 21297, 21354, 21412, 21469, 21526, 21584, 21641,
145
        20836, 20894, 20951, 21009, 21067, 21124, 21182, 21239, 21297, 21354, 21412, 21469, 21526, 21584, 21641,
146
        21698, 21756, 21813, 21870, 21927, 21984, 22041, 22098, 22155, 22212, 22269, 22326, 22383, 22439, 22496,
146
        21698, 21756, 21813, 21870, 21927, 21984, 22041, 22098, 22155, 22212, 22269, 22326, 22383, 22439, 22496,
147
        22553, 22610, 22666, 22723, 22780, 22836, 22893, 22949, 23006, 23062, 23118, 23175, 23231, 23287, 23344,
147
        22553, 22610, 22666, 22723, 22780, 22836, 22893, 22949, 23006, 23062, 23118, 23175, 23231, 23287, 23344,
148
        23400, 23456, 23512, 23568, 23624, 23680, 23736, 23792, 23848, 23904, 23960, 24016, 24071, 24127, 24183,
148
        23400, 23456, 23512, 23568, 23624, 23680, 23736, 23792, 23848, 23904, 23960, 24016, 24071, 24127, 24183,
149
        24238, 24294, 24350, 24405, 24461, 24516, 24572, 24627, 24682, 24738, 24793, 24848, 24904, 24959, 25014,
149
        24238, 24294, 24350, 24405, 24461, 24516, 24572, 24627, 24682, 24738, 24793, 24848, 24904, 24959, 25014,
150
        25069, 25124, 25179, 25234, 25289, 25344, 25399, 25454, 25509, 25563, 25618, 25673, 25727, 25782, 25836,
150
        25069, 25124, 25179, 25234, 25289, 25344, 25399, 25454, 25509, 25563, 25618, 25673, 25727, 25782, 25836,
151
        25891, 25945, 26000, 26054, 26109, 26163, 26217, 26271, 26326, 26380, 26434, 26488, 26542, 26596, 26650,
151
        25891, 25945, 26000, 26054, 26109, 26163, 26217, 26271, 26326, 26380, 26434, 26488, 26542, 26596, 26650,
152
        26704, 26758, 26812, 26866, 26920, 26974, 27027, 27081, 27135, 27188, 27242, 27295, 27349, 27402, 27456,
152
        26704, 26758, 26812, 26866, 26920, 26974, 27027, 27081, 27135, 27188, 27242, 27295, 27349, 27402, 27456,
153
        27509, 27563, 27616, 27669, 27722, 27776, 27829, 27882, 27935, 27988, 28041, 28094, 28147, 28200, 28253,
153
        27509, 27563, 27616, 27669, 27722, 27776, 27829, 27882, 27935, 27988, 28041, 28094, 28147, 28200, 28253,
154
        28305, 28358, 28411, 28464, 28516, 28569, 28621, 28674, 28726, 28779, 28831, 28884, 28936, 28988, 29041,
154
        28305, 28358, 28411, 28464, 28516, 28569, 28621, 28674, 28726, 28779, 28831, 28884, 28936, 28988, 29041,
155
        29093, 29145, 29197, 29249, 29301, 29353, 29405, 29457, 29509, 29561, 29613, 29664, 29716, 29768, 29820,
155
        29093, 29145, 29197, 29249, 29301, 29353, 29405, 29457, 29509, 29561, 29613, 29664, 29716, 29768, 29820,
156
        29871, 29923, 29974, 30026, 30077, 30129, 30180, 30231, 30283, 30334, 30385, 30436, 30488, 30539, 30590,
156
        29871, 29923, 29974, 30026, 30077, 30129, 30180, 30231, 30283, 30334, 30385, 30436, 30488, 30539, 30590,
157
        30641, 30692, 30743, 30794, 30844, 30895, 30946, 30997, 31047, 31098, 31149, 31199, 31250, 31300, 31351,
157
        30641, 30692, 30743, 30794, 30844, 30895, 30946, 30997, 31047, 31098, 31149, 31199, 31250, 31300, 31351,
158
        31401, 31452, 31502, 31552, 31602, 31653, 31703, 31753, 31803, 31853, 31903, 31953, 32003, 32053, 32103,
158
        31401, 31452, 31502, 31552, 31602, 31653, 31703, 31753, 31803, 31853, 31903, 31953, 32003, 32053, 32103,
159
        32153, 32202, 32252, 32302, 32351, 32401, 32451, 32500, 32550, 32599, 32649, 32698, 32747, 32796, 32846,
159
        32153, 32202, 32252, 32302, 32351, 32401, 32451, 32500, 32550, 32599, 32649, 32698, 32747, 32796, 32846,
160
        32895, 32944, 32993, 33042, 33091, 33140, 33189, 33238, 33287, 33336, 33385, 33434, 33482, 33531, 33580,
160
        32895, 32944, 32993, 33042, 33091, 33140, 33189, 33238, 33287, 33336, 33385, 33434, 33482, 33531, 33580,
161
        33628, 33677, 33725, 33774, 33822, 33871, 33919, 33967, 34015, 34064, 34112, 34160, 34208, 34256, 34304,
161
        33628, 33677, 33725, 33774, 33822, 33871, 33919, 33967, 34015, 34064, 34112, 34160, 34208, 34256, 34304,
162
        34352, 34400, 34448, 34496, 34544, 34592, 34639, 34687, 34735, 34782, 34830, 34877, 34925, 34972, 35020,
162
        34352, 34400, 34448, 34496, 34544, 34592, 34639, 34687, 34735, 34782, 34830, 34877, 34925, 34972, 35020,
163
        35067, 35115, 35162, 35209, 35256, 35303, 35351, 35398, 35445, 35492, 35539, 35586, 35633, 35679, 35726,
163
        35067, 35115, 35162, 35209, 35256, 35303, 35351, 35398, 35445, 35492, 35539, 35586, 35633, 35679, 35726,
164
        35773, 35820, 35866, 35913, 35960, 36006, 36053, 36099, 36146, 36192, 36239, 36285, 36331, 36377, 36424,
164
        35773, 35820, 35866, 35913, 35960, 36006, 36053, 36099, 36146, 36192, 36239, 36285, 36331, 36377, 36424,
165
        36470, 36516, 36562, 36608, 36654, 36700, 36746, 36792, 36838, 36883, 36929, 36975, 37021, 37066, 37112,
165
        36470, 36516, 36562, 36608, 36654, 36700, 36746, 36792, 36838, 36883, 36929, 36975, 37021, 37066, 37112,
166
        37157, 37203, 37248, 37294, 37339, 37385, 37430, 37475, 37520, 37566, 37611, 37656, 37701, 37746, 37791,
166
        37157, 37203, 37248, 37294, 37339, 37385, 37430, 37475, 37520, 37566, 37611, 37656, 37701, 37746, 37791,
167
        37836, 37881, 37926, 37971, 38015, 38060, 38105, 38149, 38194, 38239, 38283, 38328, 38372, 38417, 38461,
167
        37836, 37881, 37926, 37971, 38015, 38060, 38105, 38149, 38194, 38239, 38283, 38328, 38372, 38417, 38461,
168
        38505, 38550, 38594, 38638, 38682, 38727, 38771, 38815, 38859, 38903, 38947, 38991, 39035, 39078, 39122,
168
        38505, 38550, 38594, 38638, 38682, 38727, 38771, 38815, 38859, 38903, 38947, 38991, 39035, 39078, 39122,
169
        39166, 39210, 39253, 39297, 39341, 39384, 39428, 39471, 39515, 39558, 39601, 39645, 39688, 39731, 39774,
169
        39166, 39210, 39253, 39297, 39341, 39384, 39428, 39471, 39515, 39558, 39601, 39645, 39688, 39731, 39774,
170
        39818, 39861, 39904, 39947, 39990, 40033, 40076, 40119, 40161, 40204, 40247, 40290, 40332, 40375, 40418,
170
        39818, 39861, 39904, 39947, 39990, 40033, 40076, 40119, 40161, 40204, 40247, 40290, 40332, 40375, 40418,
171
        40460, 40503, 40545, 40588, 40630, 40673, 40715, 40757, 40799, 40842, 40884, 40926, 40968, 41010, 41052,
171
        40460, 40503, 40545, 40588, 40630, 40673, 40715, 40757, 40799, 40842, 40884, 40926, 40968, 41010, 41052,
172
        41094, 41136, 41178, 41220, 41262, 41303, 41345, 41387, 41429, 41470, 41512, 41553, 41595, 41636, 41678,
172
        41094, 41136, 41178, 41220, 41262, 41303, 41345, 41387, 41429, 41470, 41512, 41553, 41595, 41636, 41678,
173
        41719, 41761, 41802, 41843, 41885, 41926, 41967, 42008, 42049, 42090, 42131, 42172, 42213, 42254, 42295,
173
        41719, 41761, 41802, 41843, 41885, 41926, 41967, 42008, 42049, 42090, 42131, 42172, 42213, 42254, 42295,
174
        42336, 42376, 42417, 42458, 42499, 42539, 42580, 42620, 42661, 42701, 42742, 42782, 42823, 42863, 42903,
174
        42336, 42376, 42417, 42458, 42499, 42539, 42580, 42620, 42661, 42701, 42742, 42782, 42823, 42863, 42903,
175
        42944, 42984, 43024, 43064, 43104, 43144, 43184, 43224, 43264, 43304, 43344, 43384, 43424, 43463, 43503,
175
        42944, 42984, 43024, 43064, 43104, 43144, 43184, 43224, 43264, 43304, 43344, 43384, 43424, 43463, 43503,
176
        43543, 43582, 43622, 43662, 43701, 43741, 43780, 43820, 43859, 43898, 43938, 43977, 44016, 44055, 44094,
176
        43543, 43582, 43622, 43662, 43701, 43741, 43780, 43820, 43859, 43898, 43938, 43977, 44016, 44055, 44094,
177
        44134, 44173, 44212, 44251, 44290, 44329, 44368, 44406, 44445, 44484, 44523, 44562, 44600, 44639, 44677,
177
        44134, 44173, 44212, 44251, 44290, 44329, 44368, 44406, 44445, 44484, 44523, 44562, 44600, 44639, 44677,
178
        44716, 44755, 44793, 44832, 44870, 44908, 44947, 44985, 45023, 45062, 45100, 45138, 45176, 45214, 45252,
178
        44716, 44755, 44793, 44832, 44870, 44908, 44947, 44985, 45023, 45062, 45100, 45138, 45176, 45214, 45252,
179
        45290, 45328, 45366, 45404, 45442, 45480, 45518, 45555, 45593, 45631, 45668, 45706, 45744, 45781, 45819,
179
        45290, 45328, 45366, 45404, 45442, 45480, 45518, 45555, 45593, 45631, 45668, 45706, 45744, 45781, 45819,
180
        45856, 45894, 45931, 45968, 46006, 46043, 46080, 46117, 46155, 46192, 46229, 46266, 46303, 46340, 46377,
180
        45856, 45894, 45931, 45968, 46006, 46043, 46080, 46117, 46155, 46192, 46229, 46266, 46303, 46340, 46377,
181
        46414, 46451, 46488, 46525, 46561, 46598, 46635, 46672, 46708, 46745, 46781, 46818, 46854, 46891, 46927,
181
        46414, 46451, 46488, 46525, 46561, 46598, 46635, 46672, 46708, 46745, 46781, 46818, 46854, 46891, 46927,
182
        46964, 47000, 47037, 47073, 47109, 47145, 47182, 47218, 47254, 47290, 47326, 47362, 47398, 47434, 47470,
182
        46964, 47000, 47037, 47073, 47109, 47145, 47182, 47218, 47254, 47290, 47326, 47362, 47398, 47434, 47470,
183
        47506, 47542, 47577, 47613, 47649, 47685, 47720, 47756, 47792, 47827, 47863, 47898, 47934, 47969, 48004,
183
        47506, 47542, 47577, 47613, 47649, 47685, 47720, 47756, 47792, 47827, 47863, 47898, 47934, 47969, 48004,
184
        48040, 48075, 48110, 48146, 48181, 48216, 48251, 48286, 48322, 48357, 48392, 48427, 48462, 48496, 48531,
184
        48040, 48075, 48110, 48146, 48181, 48216, 48251, 48286, 48322, 48357, 48392, 48427, 48462, 48496, 48531,
185
        48566, 48601, 48636, 48671, 48705, 48740, 48775, 48809, 48844, 48878, 48913, 48947, 48982, 49016, 49051,
185
        48566, 48601, 48636, 48671, 48705, 48740, 48775, 48809, 48844, 48878, 48913, 48947, 48982, 49016, 49051,
186
        49085, 49119, 49154, 49188, 49222, 49256, 49290, 49324, 49359, 49393, 49427, 49461, 49495, 49528, 49562,
186
        49085, 49119, 49154, 49188, 49222, 49256, 49290, 49324, 49359, 49393, 49427, 49461, 49495, 49528, 49562,
187
        49596, 49630, 49664, 49698, 49731, 49765, 49799, 49832, 49866, 49899, 49933, 49966, 50000, 50033, 50067,
187
        49596, 49630, 49664, 49698, 49731, 49765, 49799, 49832, 49866, 49899, 49933, 49966, 50000, 50033, 50067,
188
        50100, 50133, 50167, 50200, 50233, 50266, 50299, 50333, 50366, 50399, 50432, 50465, 50498, 50531, 50564,
188
        50100, 50133, 50167, 50200, 50233, 50266, 50299, 50333, 50366, 50399, 50432, 50465, 50498, 50531, 50564,
189
        50597, 50629, 50662, 50695, 50728, 50760, 50793, 50826, 50858, 50891, 50924, 50956, 50989, 51021, 51053,
189
        50597, 50629, 50662, 50695, 50728, 50760, 50793, 50826, 50858, 50891, 50924, 50956, 50989, 51021, 51053,
190
        51086, 51118, 51151, 51183, 51215, 51247, 51280, 51312, 51344, 51376, 51408, 51440, 51472 };
190
        51086, 51118, 51151, 51183, 51215, 51247, 51280, 51312, 51344, 51376, 51408, 51440, 51472 };
191
 
191
 
192
const uint16_t FACTORY_C2M_LOOKUP[1024] = {
192
const uint16_t FACTORY_C2M_LOOKUP[1024] = {
193
        32, 32, 32, 32, 32, 32, 33, 33, 33, 34, 35, 35, 36, 37, 38, 39, 39, 41, 42, 43, 44, 45, 47, 48, 49, 51,
193
        32, 32, 32, 32, 32, 32, 33, 33, 33, 34, 35, 35, 36, 37, 38, 39, 39, 41, 42, 43, 44, 45, 47, 48, 49, 51,
194
        53, 54, 56, 58, 60, 62, 63, 66, 68, 70, 72, 74, 77, 79, 81, 84, 87, 89, 92, 95, 98, 100, 103, 106, 110,
194
        53, 54, 56, 58, 60, 62, 63, 66, 68, 70, 72, 74, 77, 79, 81, 84, 87, 89, 92, 95, 98, 100, 103, 106, 110,
195
        113, 116, 119, 123, 126, 129, 133, 137, 140, 144, 148, 152, 155, 159, 163, 167, 172, 176, 180, 184, 189,
195
        113, 116, 119, 123, 126, 129, 133, 137, 140, 144, 148, 152, 155, 159, 163, 167, 172, 176, 180, 184, 189,
196
        193, 198, 202, 207, 212, 217, 221, 226, 231, 236, 241, 246, 252, 257, 262, 268, 273, 279, 284, 290, 295,
196
        193, 198, 202, 207, 212, 217, 221, 226, 231, 236, 241, 246, 252, 257, 262, 268, 273, 279, 284, 290, 295,
197
        301, 307, 313, 319, 325, 331, 337, 343, 350, 356, 362, 369, 375, 382, 388, 395, 402, 409, 415, 422, 429,
197
        301, 307, 313, 319, 325, 331, 337, 343, 350, 356, 362, 369, 375, 382, 388, 395, 402, 409, 415, 422, 429,
198
        436, 443, 451, 458, 465, 473, 480, 487, 495, 503, 510, 518, 526, 534, 542, 549, 558, 566, 574, 582, 590,
198
        436, 443, 451, 458, 465, 473, 480, 487, 495, 503, 510, 518, 526, 534, 542, 549, 558, 566, 574, 582, 590,
199
        599, 607, 615, 624, 633, 641, 650, 659, 667, 676, 685, 694, 703, 712, 722, 731, 740, 750, 759, 768, 778,
199
        599, 607, 615, 624, 633, 641, 650, 659, 667, 676, 685, 694, 703, 712, 722, 731, 740, 750, 759, 768, 778,
200
        788, 797, 807, 817, 827, 837, 847, 857, 867, 877, 887, 897, 908, 918, 928, 939, 950, 960, 971, 982, 992,
200
        788, 797, 807, 817, 827, 837, 847, 857, 867, 877, 887, 897, 908, 918, 928, 939, 950, 960, 971, 982, 992,
201
        1003, 1014, 1025, 1036, 1047, 1059, 1070, 1081, 1092, 1104, 1115, 1127, 1138, 1150, 1162, 1174, 1185, 1197,
201
        1003, 1014, 1025, 1036, 1047, 1059, 1070, 1081, 1092, 1104, 1115, 1127, 1138, 1150, 1162, 1174, 1185, 1197,
202
        1209, 1221, 1233, 1245, 1258, 1270, 1282, 1294, 1307, 1319, 1332, 1344, 1357, 1370, 1383, 1395, 1408, 1421,
202
        1209, 1221, 1233, 1245, 1258, 1270, 1282, 1294, 1307, 1319, 1332, 1344, 1357, 1370, 1383, 1395, 1408, 1421,
203
        1434, 1447, 1460, 1474, 1487, 1500, 1514, 1527, 1540, 1554, 1568, 1581, 1595, 1609, 1622, 1636, 1650, 1664,
203
        1434, 1447, 1460, 1474, 1487, 1500, 1514, 1527, 1540, 1554, 1568, 1581, 1595, 1609, 1622, 1636, 1650, 1664,
204
        1678, 1692, 1707, 1721, 1735, 1749, 1764, 1778, 1793, 1807, 1822, 1837, 1852, 1866, 1881, 1896, 1911, 1926,
204
        1678, 1692, 1707, 1721, 1735, 1749, 1764, 1778, 1793, 1807, 1822, 1837, 1852, 1866, 1881, 1896, 1911, 1926,
205
        1941, 1956, 1972, 1987, 2002, 2018, 2033, 2048, 2064, 2080, 2095, 2111, 2127, 2143, 2159, 2174, 2190, 2207,
205
        1941, 1956, 1972, 1987, 2002, 2018, 2033, 2048, 2064, 2080, 2095, 2111, 2127, 2143, 2159, 2174, 2190, 2207,
206
        2223, 2239, 2255, 2271, 2288, 2304, 2321, 2337, 2354, 2370, 2387, 2404, 2420, 2437, 2454, 2471, 2488, 2505,
206
        2223, 2239, 2255, 2271, 2288, 2304, 2321, 2337, 2354, 2370, 2387, 2404, 2420, 2437, 2454, 2471, 2488, 2505,
207
        2522, 2540, 2557, 2574, 2592, 2609, 2626, 2644, 2662, 2679, 2697, 2715, 2732, 2750, 2768, 2786, 2804, 2822,
207
        2522, 2540, 2557, 2574, 2592, 2609, 2626, 2644, 2662, 2679, 2697, 2715, 2732, 2750, 2768, 2786, 2804, 2822,
208
        2840, 2859, 2877, 2895, 2913, 2932, 2950, 2969, 2987, 3006, 3025, 3043, 3062, 3081, 3100, 3119, 3138, 3157,
208
        2840, 2859, 2877, 2895, 2913, 2932, 2950, 2969, 2987, 3006, 3025, 3043, 3062, 3081, 3100, 3119, 3138, 3157,
209
        3176, 3195, 3214, 3234, 3253, 3272, 3292, 3311, 3331, 3351, 3370, 3390, 3410, 3430, 3449, 3469, 3489, 3509,
209
        3176, 3195, 3214, 3234, 3253, 3272, 3292, 3311, 3331, 3351, 3370, 3390, 3410, 3430, 3449, 3469, 3489, 3509,
210
        3529, 3550, 3570, 3590, 3610, 3631, 3651, 3672, 3692, 3713, 3733, 3754, 3775, 3795, 3816, 3837, 3858, 3879,
210
        3529, 3550, 3570, 3590, 3610, 3631, 3651, 3672, 3692, 3713, 3733, 3754, 3775, 3795, 3816, 3837, 3858, 3879,
211
        3900, 3921, 3942, 3964, 3985, 4006, 4027, 4049, 4070, 4092, 4113, 4135, 4157, 4178, 4200, 4222, 4244, 4266,
211
        3900, 3921, 3942, 3964, 3985, 4006, 4027, 4049, 4070, 4092, 4113, 4135, 4157, 4178, 4200, 4222, 4244, 4266,
212
        4288, 4310, 4332, 4354, 4376, 4399, 4421, 4443, 4466, 4488, 4510, 4533, 4556, 4578, 4601, 4624, 4647, 4669,
212
        4288, 4310, 4332, 4354, 4376, 4399, 4421, 4443, 4466, 4488, 4510, 4533, 4556, 4578, 4601, 4624, 4647, 4669,
213
        4692, 4715, 4738, 4761, 4784, 4808, 4831, 4854, 4877, 4901, 4924, 4948, 4971, 4995, 5018, 5042, 5066, 5089,
213
        4692, 4715, 4738, 4761, 4784, 4808, 4831, 4854, 4877, 4901, 4924, 4948, 4971, 4995, 5018, 5042, 5066, 5089,
214
        5113, 5137, 5161, 5185, 5209, 5233, 5257, 5281, 5306, 5330, 5354, 5378, 5403, 5427, 5452, 5476, 5501, 5526,
214
        5113, 5137, 5161, 5185, 5209, 5233, 5257, 5281, 5306, 5330, 5354, 5378, 5403, 5427, 5452, 5476, 5501, 5526,
215
        5550, 5575, 5600, 5625, 5650, 5675, 5700, 5725, 5750, 5775, 5800, 5825, 5851, 5876, 5901, 5927, 5952, 5978,
215
        5550, 5575, 5600, 5625, 5650, 5675, 5700, 5725, 5750, 5775, 5800, 5825, 5851, 5876, 5901, 5927, 5952, 5978,
216
        6003, 6029, 6055, 6080, 6106, 6132, 6158, 6184, 6210, 6236, 6262, 6288, 6314, 6340, 6367, 6393, 6419, 6446,
216
        6003, 6029, 6055, 6080, 6106, 6132, 6158, 6184, 6210, 6236, 6262, 6288, 6314, 6340, 6367, 6393, 6419, 6446,
217
        6472, 6499, 6525, 6552, 6578, 6605, 6632, 6658, 6685, 6712, 6739, 6766, 6793, 6820, 6847, 6874, 6901, 6929,
217
        6472, 6499, 6525, 6552, 6578, 6605, 6632, 6658, 6685, 6712, 6739, 6766, 6793, 6820, 6847, 6874, 6901, 6929,
218
        6956, 6983, 7011, 7038, 7066, 7093, 7121, 7148, 7176, 7204, 7231, 7259, 7287, 7315, 7343, 7371, 7399, 7427,
218
        6956, 6983, 7011, 7038, 7066, 7093, 7121, 7148, 7176, 7204, 7231, 7259, 7287, 7315, 7343, 7371, 7399, 7427,
219
        7455, 7483, 7511, 7539, 7568, 7596, 7624, 7653, 7681, 7710, 7738, 7767, 7796, 7824, 7853, 7882, 7911, 7940,
219
        7455, 7483, 7511, 7539, 7568, 7596, 7624, 7653, 7681, 7710, 7738, 7767, 7796, 7824, 7853, 7882, 7911, 7940,
220
        7968, 7997, 8026, 8055, 8085, 8114, 8143, 8172, 8201, 8231, 8260, 8289, 8319, 8348, 8378, 8407, 8437, 8467,
220
        7968, 7997, 8026, 8055, 8085, 8114, 8143, 8172, 8201, 8231, 8260, 8289, 8319, 8348, 8378, 8407, 8437, 8467,
221
        8496, 8526, 8556, 8586, 8616, 8646, 8675, 8705, 8736, 8766, 8796, 8826, 8856, 8886, 8917, 8947, 8977, 9008,
221
        8496, 8526, 8556, 8586, 8616, 8646, 8675, 8705, 8736, 8766, 8796, 8826, 8856, 8886, 8917, 8947, 8977, 9008,
222
        9038, 9069, 9099, 9130, 9161, 9191, 9222, 9253, 9284, 9315, 9345, 9376, 9407, 9438, 9469, 9501, 9532, 9563,
222
        9038, 9069, 9099, 9130, 9161, 9191, 9222, 9253, 9284, 9315, 9345, 9376, 9407, 9438, 9469, 9501, 9532, 9563,
223
        9594, 9625, 9657, 9688, 9719, 9751, 9782, 9814, 9845, 9877, 9909, 9940, 9972, 10004, 10036, 10068, 10099,
223
        9594, 9625, 9657, 9688, 9719, 9751, 9782, 9814, 9845, 9877, 9909, 9940, 9972, 10004, 10036, 10068, 10099,
224
        10131, 10163, 10195, 10227, 10259, 10292, 10324, 10356, 10388, 10421, 10453, 10485, 10518, 10550, 10583,
224
        10131, 10163, 10195, 10227, 10259, 10292, 10324, 10356, 10388, 10421, 10453, 10485, 10518, 10550, 10583,
225
        10615, 10648, 10680, 10713, 10746, 10778, 10811, 10844, 10877, 10910, 10943, 10976, 11009, 11042, 11075,
225
        10615, 10648, 10680, 10713, 10746, 10778, 10811, 10844, 10877, 10910, 10943, 10976, 11009, 11042, 11075,
226
        11108, 11141, 11174, 11208, 11241, 11274, 11308, 11341, 11374, 11408, 11441, 11475, 11509, 11542, 11576,
226
        11108, 11141, 11174, 11208, 11241, 11274, 11308, 11341, 11374, 11408, 11441, 11475, 11509, 11542, 11576,
227
        11610, 11643, 11677, 11711, 11745, 11779, 11813, 11847, 11881, 11915, 11949, 11983, 12017, 12051, 12085,
227
        11610, 11643, 11677, 11711, 11745, 11779, 11813, 11847, 11881, 11915, 11949, 11983, 12017, 12051, 12085,
228
        12120, 12154, 12188, 12223, 12257, 12292, 12326, 12361, 12395, 12430, 12465, 12499, 12534, 12569, 12604,
228
        12120, 12154, 12188, 12223, 12257, 12292, 12326, 12361, 12395, 12430, 12465, 12499, 12534, 12569, 12604,
229
        12638, 12673, 12708, 12743, 12778, 12813, 12848, 12883, 12918, 12954, 12989, 13024, 13059, 13095, 13130,
229
        12638, 12673, 12708, 12743, 12778, 12813, 12848, 12883, 12918, 12954, 12989, 13024, 13059, 13095, 13130,
230
        13165, 13201, 13236, 13272, 13307, 13343, 13379, 13414, 13450, 13486, 13521, 13557, 13593, 13629, 13665,
230
        13165, 13201, 13236, 13272, 13307, 13343, 13379, 13414, 13450, 13486, 13521, 13557, 13593, 13629, 13665,
231
        13701, 13736, 13772, 13809, 13845, 13881, 13917, 13953, 13989, 14025, 14062, 14098, 14134, 14171, 14207,
231
        13701, 13736, 13772, 13809, 13845, 13881, 13917, 13953, 13989, 14025, 14062, 14098, 14134, 14171, 14207,
232
        14244, 14280, 14317, 14353, 14390, 14426, 14463, 14500, 14536, 14573, 14610, 14647, 14684, 14721, 14758,
232
        14244, 14280, 14317, 14353, 14390, 14426, 14463, 14500, 14536, 14573, 14610, 14647, 14684, 14721, 14758,
233
        14794, 14831, 14869, 14906, 14943, 14980, 15017, 15054, 15091, 15129, 15166, 15203, 15241, 15278, 15316,
233
        14794, 14831, 14869, 14906, 14943, 14980, 15017, 15054, 15091, 15129, 15166, 15203, 15241, 15278, 15316,
234
        15353, 15391, 15428, 15466, 15503, 15541, 15579, 15616, 15654, 15692, 15730, 15767, 15805, 15843, 15881,
234
        15353, 15391, 15428, 15466, 15503, 15541, 15579, 15616, 15654, 15692, 15730, 15767, 15805, 15843, 15881,
235
        15919, 15957, 15995, 16033, 16071, 16109, 16147, 16186, 16224, 16262, 16300, 16339, 16377, 16416, 16454,
235
        15919, 15957, 15995, 16033, 16071, 16109, 16147, 16186, 16224, 16262, 16300, 16339, 16377, 16416, 16454,
236
        16492, 16531, 16569, 16608, 16646, 16685, 16724, 16762, 16801, 16840, 16879, 16917, 16956, 16995, 17034,
236
        16492, 16531, 16569, 16608, 16646, 16685, 16724, 16762, 16801, 16840, 16879, 16917, 16956, 16995, 17034,
237
        17073, 17112, 17151, 17190, 17229, 17268, 17307, 17346, 17385, 17425, 17464, 17503, 17542, 17582, 17621,
237
        17073, 17112, 17151, 17190, 17229, 17268, 17307, 17346, 17385, 17425, 17464, 17503, 17542, 17582, 17621,
238
        17660, 17700, 17739, 17779, 17818, 17858, 17897, 17937, 17977, 18016, 18056, 18096, 18135, 18175, 18215,
238
        17660, 17700, 17739, 17779, 17818, 17858, 17897, 17937, 17977, 18016, 18056, 18096, 18135, 18175, 18215,
239
        18255, 18295, 18335, 18375, 18415, 18455, 18495, 18535, 18575, 18615, 18655, 18695, 18735, 18776, 18816,
239
        18255, 18295, 18335, 18375, 18415, 18455, 18495, 18535, 18575, 18615, 18655, 18695, 18735, 18776, 18816,
240
        18856, 18896, 18937, 18977, 19017, 19058, 19098, 19139, 19179, 19220, 19260, 19301, 19342, 19382, 19423,
240
        18856, 18896, 18937, 18977, 19017, 19058, 19098, 19139, 19179, 19220, 19260, 19301, 19342, 19382, 19423,
241
        19464, 19505, 19545, 19586, 19627, 19668, 19709, 19750, 19791, 19832, 19873, 19914, 19955, 19996, 20037,
241
        19464, 19505, 19545, 19586, 19627, 19668, 19709, 19750, 19791, 19832, 19873, 19914, 19955, 19996, 20037,
242
        20078, 20119, 20160, 20202, 20243, 20284, 20325, 20367, 20408, 20450, 20491, 20532, 20574, 20615, 20657,
242
        20078, 20119, 20160, 20202, 20243, 20284, 20325, 20367, 20408, 20450, 20491, 20532, 20574, 20615, 20657,
243
        20699, 20740, 20782, 20823, 20865, 20907, 20949, 20990, 21032, 21074, 21116, 21158, 21199, 21241, 21283,
243
        20699, 20740, 20782, 20823, 20865, 20907, 20949, 20990, 21032, 21074, 21116, 21158, 21199, 21241, 21283,
244
        21325, 21367, 21409, 21451, 21493, 21536, 21578, 21620, 21662, 21704, 21746, 21789, 21831, 21873, 21916,
244
        21325, 21367, 21409, 21451, 21493, 21536, 21578, 21620, 21662, 21704, 21746, 21789, 21831, 21873, 21916,
245
        21958, 22000, 22043, 22085, 22128, 22170, 22213, 22255, 22298, 22341, 22383, 22426, 22468, 22511, 22554,
245
        21958, 22000, 22043, 22085, 22128, 22170, 22213, 22255, 22298, 22341, 22383, 22426, 22468, 22511, 22554,
246
        22597, 22639, 22682, 22725, 22768, 22811, 22854, 22897, 22940, 22983, 23026, 23069, 23112, 23155, 23198,
246
        22597, 22639, 22682, 22725, 22768, 22811, 22854, 22897, 22940, 22983, 23026, 23069, 23112, 23155, 23198,
247
        23241, 23284, 23328, 23371, 23414, 23457, 23501, 23544, 23587, 23631, 23674, 23717, 23761, 23804, 23848,
247
        23241, 23284, 23328, 23371, 23414, 23457, 23501, 23544, 23587, 23631, 23674, 23717, 23761, 23804, 23848,
248
        23891, 23935, 23978, 24022, 24066, 24109, 24153, 24197, 24240, 24284, 24328, 24372, 24415, 24459, 24503,
248
        23891, 23935, 23978, 24022, 24066, 24109, 24153, 24197, 24240, 24284, 24328, 24372, 24415, 24459, 24503,
249
        24547, 24591, 24635, 24679, 24723, 24767, 24811, 24855, 24899, 24943, 24987, 25031, 25075, 25120, 25164,
249
        24547, 24591, 24635, 24679, 24723, 24767, 24811, 24855, 24899, 24943, 24987, 25031, 25075, 25120, 25164,
250
        25208, 25252, 25297, 25341, 25385, 25430, 25474, 25518, 25563, 25607, 25652, 25696, 25741, 25785, 25830,
250
        25208, 25252, 25297, 25341, 25385, 25430, 25474, 25518, 25563, 25607, 25652, 25696, 25741, 25785, 25830,
251
        25874, 25919, 25964, 26008, 26053, 26098, 26142, 26187, 26232, 26277, 26322, 26366, 26411, 26456, 26501,
251
        25874, 25919, 25964, 26008, 26053, 26098, 26142, 26187, 26232, 26277, 26322, 26366, 26411, 26456, 26501,
252
        26546, 26591, 26636, 26681, 26726, 26771, 26816, 26861, 26906, 26951, 26997, 27042, 27087, 27132 };
252
        26546, 26591, 26636, 26681, 26726, 26771, 26816, 26861, 26906, 26951, 26997, 27042, 27087, 27132 };
253
 
253
 
254
// -------------------------------------------------------------------------------------------
254
// -------------------------------------------------------------------------------------------
255
 
255
 
256
extern uint8_t slider[];
256
extern uint8_t slider[];
257
extern value_type cell[], var[];
257
extern value_type cell[], var[];
258
extern unsigned char* image_ptr;
258
extern unsigned char* image_ptr;
259
 
259
 
260
// -------------------------------------------------------------------------------------------
260
// -------------------------------------------------------------------------------------------
261
 
261
 
262
void init_trigtab() {
262
void init_trigtab() {
263
#ifdef PARSERTEST
263
#ifdef PARSERTEST
264
        return;
264
        return;
265
#else
265
#else
266
        int i;
266
        int i;
267
 
267
 
268
        if (gdata == NULL) return; // should not happen
268
        if (gdata == NULL) return; // should not happen
269
 
269
 
270
        if (gdata->costab == NULL) {
270
        if (gdata->costab == NULL) {
271
                gdata->costab = (double*)malloc(sizeof(double) * COSTABSIZE);
271
                gdata->costab = (double*)malloc(sizeof(double) * COSTABSIZE);
272
                if (gdata->costab) {
272
                if (gdata->costab) {
273
                        for (i = 0; i < COSTABSIZE; ++i) {
273
                        for (i = 0; i < COSTABSIZE; ++i) {
274
                                gdata->costab[i] = cos(FFANGLE(i));
274
                                gdata->costab[i] = cos(FFANGLE(i));
275
                        }
275
                        }
276
                }
276
                }
277
        }
277
        }
278
 
278
 
279
        if (gdata->tantab == NULL) {
279
        if (gdata->tantab == NULL) {
280
                gdata->tantab = (double*)malloc(sizeof(double) * TANTABSIZE);
280
                gdata->tantab = (double*)malloc(sizeof(double) * TANTABSIZE);
281
                if (gdata->tantab) {
281
                if (gdata->tantab) {
282
                        for (i = 0; i < TANTABSIZE; ++i) {
282
                        for (i = 0; i < TANTABSIZE; ++i) {
283
                                if (i >= TANTABSIZE / 2) {
283
                                if (i >= TANTABSIZE / 2) {
284
                                        /* the last '-1' in the expression '512-i-1' is for FilterFactory compatibility, and to avoid the undefined pi/2 area */
284
                                        /* the last '-1' in the expression '512-i-1' is for FilterFactory compatibility, and to avoid the undefined pi/2 area */
285
                                        gdata->tantab[i] = -gdata->tantab[TANTABSIZE - i - 1];
285
                                        gdata->tantab[i] = -gdata->tantab[TANTABSIZE - i - 1];
286
                                }
286
                                }
287
                                else {
287
                                else {
288
                                        gdata->tantab[i] = tan(FFANGLE(i));
288
                                        gdata->tantab[i] = tan(FFANGLE(i));
289
                                }
289
                                }
290
                        }
290
                        }
291
                }
291
                }
292
        }
292
        }
293
#endif
293
#endif
294
}
294
}
295
 
295
 
296
// -------------------------------------------------------------------------------------------
296
// -------------------------------------------------------------------------------------------
297
 
297
 
298
/* Channel z for the input pixel at coordinates x,y.
298
/* Channel z for the input pixel at coordinates x,y.
299
 * Coordinates are relative to the input image data (pb->inData) */
299
 * Coordinates are relative to the input image data (pb->inData) */
300
static value_type rawsrc(value_type x, value_type y, value_type z) {
300
static value_type rawsrc(value_type x, value_type y, value_type z) {
301
#ifdef PARSERTEST
301
#ifdef PARSERTEST
302
        return 0;
302
        return 0;
303
#else
303
#else
304
        if (HAS_BIG_DOC(gpb)) {
304
        if (HAS_BIG_DOC(gpb)) {
305
                if (x < BIGDOC_IN_RECT(gpb).left)
305
                if (x < BIGDOC_IN_RECT(gpb).left)
306
                        x = BIGDOC_IN_RECT(gpb).left;
306
                        x = BIGDOC_IN_RECT(gpb).left;
307
                else if (x >= BIGDOC_IN_RECT(gpb).right)
307
                else if (x >= BIGDOC_IN_RECT(gpb).right)
308
                        x = BIGDOC_IN_RECT(gpb).right - 1;
308
                        x = BIGDOC_IN_RECT(gpb).right - 1;
309
                if (y < BIGDOC_IN_RECT(gpb).top)
309
                if (y < BIGDOC_IN_RECT(gpb).top)
310
                        y = BIGDOC_IN_RECT(gpb).top;
310
                        y = BIGDOC_IN_RECT(gpb).top;
311
                else if (y >= BIGDOC_IN_RECT(gpb).bottom)
311
                else if (y >= BIGDOC_IN_RECT(gpb).bottom)
312
                        y = BIGDOC_IN_RECT(gpb).bottom - 1;
312
                        y = BIGDOC_IN_RECT(gpb).bottom - 1;
313
                return ((unsigned char*)gpb->inData)[(long)gpb->inRowBytes * (y - BIGDOC_IN_RECT(gpb).top)
313
                return ((unsigned char*)gpb->inData)[(long)gpb->inRowBytes * (y - BIGDOC_IN_RECT(gpb).top)
314
                        + (long)nplanes * (x - BIGDOC_IN_RECT(gpb).left) + z];
314
                        + (long)nplanes * (x - BIGDOC_IN_RECT(gpb).left) + z];
315
        } else {
315
        } else {
316
                if (x < IN_RECT(gpb).left)
316
                if (x < IN_RECT(gpb).left)
317
                        x = IN_RECT(gpb).left;
317
                        x = IN_RECT(gpb).left;
318
                else if (x >= IN_RECT(gpb).right)
318
                else if (x >= IN_RECT(gpb).right)
319
                        x = IN_RECT(gpb).right - 1;
319
                        x = IN_RECT(gpb).right - 1;
320
                if (y < IN_RECT(gpb).top)
320
                if (y < IN_RECT(gpb).top)
321
                        y = IN_RECT(gpb).top;
321
                        y = IN_RECT(gpb).top;
322
                else if (y >= IN_RECT(gpb).bottom)
322
                else if (y >= IN_RECT(gpb).bottom)
323
                        y = IN_RECT(gpb).bottom - 1;
323
                        y = IN_RECT(gpb).bottom - 1;
324
                return ((unsigned char*)gpb->inData)[(long)gpb->inRowBytes * (y - IN_RECT(gpb).top)
324
                return ((unsigned char*)gpb->inData)[(long)gpb->inRowBytes * (y - IN_RECT(gpb).top)
325
                        + (long)nplanes * (x - IN_RECT(gpb).left) + z];
325
                        + (long)nplanes * (x - IN_RECT(gpb).left) + z];
326
        }
326
        }
327
#endif
327
#endif
328
}
328
}
329
 
329
 
330
// -------------------------------------------------------------------------------------------
330
// -------------------------------------------------------------------------------------------
331
 
331
 
332
/* src(x,y,z) Channel z for the pixel at coordinates x,y.
332
/* src(x,y,z) Channel z for the pixel at coordinates x,y.
333
 * Coordinates are relative to filtered area (selection). */
333
 * Coordinates are relative to filtered area (selection). */
334
 
334
 
335
value_type ff_src(value_type x, value_type y, value_type z) {
335
value_type ff_src(value_type x, value_type y, value_type z) {
336
#ifdef PARSERTEST
336
#ifdef PARSERTEST
337
        return 0;
337
        return 0;
338
#else
338
#else
339
        if (z < 0 || z >= var['Z']) return 0;
339
        if (z < 0 || z >= var['Z']) return 0;
340
        if (x < 0)
340
        if (x < 0)
341
                x = 0;
341
                x = 0;
342
        else if (x >= var['X'])
342
        else if (x >= var['X'])
343
                x = var['X'] - 1;
343
                x = var['X'] - 1;
344
        if (y < 0)
344
        if (y < 0)
345
                y = 0;
345
                y = 0;
346
        else if (y >= var['Y'])
346
        else if (y >= var['Y'])
347
                y = var['Y'] - 1;
347
                y = var['Y'] - 1;
348
        return image_ptr[(long)gpb->inRowBytes * y + (long)nplanes * x + z];
348
        return image_ptr[(long)gpb->inRowBytes * y + (long)nplanes * x + z];
349
#endif
349
#endif
350
}
350
}
351
 
351
 
352
// -------------------------------------------------------------------------------------------
352
// -------------------------------------------------------------------------------------------
353
 
353
 
354
/* r2x(d,m) x displacement of the pixel m units away, at an angle of d,
354
/* r2x(d,m) x displacement of the pixel m units away, at an angle of d,
355
   from an arbitrary center */
355
   from an arbitrary center */
356
 
356
 
357
value_type factory_r2x(value_type d, value_type m) {
357
value_type factory_r2x(value_type d, value_type m) {
358
        // https://misc.daniel-marschall.de/projects/filter_factory/function_r2x.html
358
        // https://misc.daniel-marschall.de/projects/filter_factory/function_r2x.html
359
#ifdef PARSERTEST
359
#ifdef PARSERTEST
360
        return 0;
360
        return 0;
361
#else
361
#else
362
        int eax = m;
362
        int eax = m;
363
        int ebx = d;
363
        int ebx = d;
364
        ebx &= 1023;
364
        ebx &= 1023;
365
        ebx = FACTORY_COS_LOOKUP[ebx];
365
        ebx = FACTORY_COS_LOOKUP[ebx];
366
        return (((int64_t)eax * (int64_t)ebx) + 8191) >> 14;
366
        return (((int64_t)eax * (int64_t)ebx) + 8191) >> 14;
367
#endif
367
#endif
368
}
368
}
369
 
369
 
370
value_type foundry_r2x(value_type d, value_type m) {
370
value_type foundry_r2x(value_type d, value_type m) {
371
#ifdef PARSERTEST
371
#ifdef PARSERTEST
372
        return 0;
372
        return 0;
373
#else
373
#else
374
        return (value_type)RINT(m * gdata->costab[abs(d) % COSTABSIZE]);
374
        return (value_type)RINT(m * gdata->costab[abs(d) % COSTABSIZE]);
375
#endif
375
#endif
376
}
376
}
377
 
377
 
378
value_type ff_r2x(value_type d, value_type m) {
378
value_type ff_r2x(value_type d, value_type m) {
379
#ifdef use_filterfactory_implementation_r2x
379
#ifdef use_filterfactory_implementation_r2x
380
        return factory_r2x(d, m);
380
        return factory_r2x(d, m);
381
#else
381
#else
382
        return foundry_r2x(d, m);
382
        return foundry_r2x(d, m);
383
#endif
383
#endif
384
}
384
}
385
 
385
 
386
// -------------------------------------------------------------------------------------------
386
// -------------------------------------------------------------------------------------------
387
 
387
 
388
/* r2y(d,m) y displacement of the pixel m units away, at an angle of d,
388
/* r2y(d,m) y displacement of the pixel m units away, at an angle of d,
389
   from an arbitrary center */
389
   from an arbitrary center */
390
 
390
 
391
value_type factory_r2y(value_type d, value_type m) {
391
value_type factory_r2y(value_type d, value_type m) {
392
#ifdef PARSERTEST
392
#ifdef PARSERTEST
393
        return 0;
393
        return 0;
394
#else
394
#else
395
        // https://misc.daniel-marschall.de/projects/filter_factory/function_r2y.html
395
        // https://misc.daniel-marschall.de/projects/filter_factory/function_r2y.html
396
        return factory_r2x(d - 256, m);
396
        return factory_r2x(d - 256, m);
397
#endif
397
#endif
398
}
398
}
399
 
399
 
400
value_type foundry_r2y(value_type d, value_type m) {
400
value_type foundry_r2y(value_type d, value_type m) {
401
#ifdef PARSERTEST
401
#ifdef PARSERTEST
402
        return 0;
402
        return 0;
403
#else
403
#else
404
        return (value_type)RINT(m * gdata->costab[abs(d - 256) % COSTABSIZE]);
404
        return (value_type)RINT(m * gdata->costab[abs(d - 256) % COSTABSIZE]);
405
#endif
405
#endif
406
}
406
}
407
 
407
 
408
value_type ff_r2y(value_type d, value_type m) {
408
value_type ff_r2y(value_type d, value_type m) {
409
#ifdef use_filterfactory_implementation_r2y
409
#ifdef use_filterfactory_implementation_r2y
410
        return factory_r2y(d, m);
410
        return factory_r2y(d, m);
411
#else
411
#else
412
        return foundry_r2y(d, m);
412
        return foundry_r2y(d, m);
413
#endif
413
#endif
414
}
414
}
415
 
415
 
416
// -------------------------------------------------------------------------------------------
416
// -------------------------------------------------------------------------------------------
417
 
417
 
418
/* rad(d,m,z) Channel z in the source image, which is m units away,
418
/* rad(d,m,z) Channel z in the source image, which is m units away,
419
        at an angle of d, from the center of the image */
419
        at an angle of d, from the center of the image */
420
 
420
 
421
value_type factory_rad(value_type d, value_type m, value_type z) {
421
value_type factory_rad(value_type d, value_type m, value_type z) {
422
#ifdef PARSERTEST
422
#ifdef PARSERTEST
423
        return 0;
423
        return 0;
424
#else
424
#else
425
        // https://misc.daniel-marschall.de/projects/filter_factory/function_rad.html
425
        // https://misc.daniel-marschall.de/projects/filter_factory/function_rad.html
426
 
426
 
427
        const int xmin = 0;
427
        const int xmin = 0;
428
        const int ymin = 0;
428
        const int ymin = 0;
429
        const int zmin = 0;
429
        const int zmin = 0;
430
 
430
 
431
        int eax, ebx, ecx;
431
        int eax, ebx, ecx;
432
 
432
 
433
        ebx = FACTORY_COS_LOOKUP[d & 1023];
433
        ebx = FACTORY_COS_LOOKUP[d & 1023];
434
        eax = (((int64_t)m * (int64_t)ebx) + 8191) >> 14;
434
        eax = (((int64_t)m * (int64_t)ebx) + 8191) >> 14;
435
        ecx = ((var['X'] - xmin) >> 1) + eax;
435
        ecx = ((var['X'] - xmin) >> 1) + eax;
436
        if (ecx < 0) {
436
        if (ecx < 0) {
437
                ecx = 0;
437
                ecx = 0;
438
        }
438
        }
439
        else {
439
        else {
440
                eax = var['X'];
440
                eax = var['X'];
441
                if (ecx >= eax) {
441
                if (ecx >= eax) {
442
                        ecx = eax - 1;
442
                        ecx = eax - 1;
443
                }
443
                }
444
        }
444
        }
445
 
445
 
446
        ebx = FACTORY_COS_LOOKUP[(d - 256) & 1023];
446
        ebx = FACTORY_COS_LOOKUP[(d - 256) & 1023];
447
        eax = (((int64_t)m * (int64_t)ebx) + 8191) >> 14;
447
        eax = (((int64_t)m * (int64_t)ebx) + 8191) >> 14;
448
        ebx = ((var['Y'] - ymin) >> 1) + eax;
448
        ebx = ((var['Y'] - ymin) >> 1) + eax;
449
        if (ebx < 0) {
449
        if (ebx < 0) {
450
                ebx = 0;
450
                ebx = 0;
451
        }
451
        }
452
        else {
452
        else {
453
                eax = var['Y'];
453
                eax = var['Y'];
454
                if (ebx >= eax) {
454
                if (ebx >= eax) {
455
                        ebx = eax - 1;
455
                        ebx = eax - 1;
456
                }
456
                }
457
        }
457
        }
458
 
458
 
459
        // Now return pixel [x=ecx,y=ebx,z=esi] from the source image!
459
        // Now return pixel [x=ecx,y=ebx,z=esi] from the source image!
460
        //return ff_src(ecx, ebx, z);
460
        //return ff_src(ecx, ebx, z);
461
        ebx *= gpb->inRowBytes;
461
        ebx *= gpb->inRowBytes;
462
        ecx *= var['Z'] - zmin;
462
        ecx *= var['Z'] - zmin;
463
        return image_ptr[z + ebx + ecx];
463
        return image_ptr[z + ebx + ecx];
464
#endif
464
#endif
465
}
465
}
466
 
466
 
467
value_type foundry_rad(value_type d, value_type m, value_type z) {
467
value_type foundry_rad(value_type d, value_type m, value_type z) {
468
#ifdef PARSERTEST
468
#ifdef PARSERTEST
469
        return 0;
469
        return 0;
470
#else
470
#else
471
        return ff_src(foundry_r2x(d, m) + var['X'] / 2, foundry_r2y(d, m) + var['Y'] / 2, z);
471
        return ff_src(foundry_r2x(d, m) + var['X'] / 2, foundry_r2y(d, m) + var['Y'] / 2, z);
472
#endif
472
#endif
473
}
473
}
474
 
474
 
475
value_type ff_rad(value_type d, value_type m, value_type z) {
475
value_type ff_rad(value_type d, value_type m, value_type z) {
476
#ifdef use_filterfactory_implementation_rad
476
#ifdef use_filterfactory_implementation_rad
477
        return factory_rad(d, m, z);
477
        return factory_rad(d, m, z);
478
#else
478
#else
479
        return foundry_rad(d, m, z);
479
        return foundry_rad(d, m, z);
480
#endif
480
#endif
481
}
481
}
482
 
482
 
483
// -------------------------------------------------------------------------------------------
483
// -------------------------------------------------------------------------------------------
484
 
484
 
485
/* ctl(i) Value of slider i, where i is an integer between 0 and 7, inclusive */
485
/* ctl(i) Value of slider i, where i is an integer between 0 and 7, inclusive */
486
value_type ff_ctl(value_type i) {
486
value_type ff_ctl(value_type i) {
487
#ifdef PARSERTEST
487
#ifdef PARSERTEST
488
        return 0;
488
        return 0;
489
#else
489
#else
490
        return i >= 0 && i <= 7 ? slider[i] : 0;
490
        return i >= 0 && i <= 7 ? slider[i] : 0;
491
#endif
491
#endif
492
}
492
}
493
 
493
 
494
// -------------------------------------------------------------------------------------------
494
// -------------------------------------------------------------------------------------------
495
 
495
 
496
/* val(i,a,b) Value of slider i, mapped onto the range a to b */
496
/* val(i,a,b) Value of slider i, mapped onto the range a to b */
497
 
497
 
498
value_type val_factory(value_type i, value_type a, value_type b) {
498
value_type val_factory(value_type i, value_type a, value_type b) {
499
#ifdef PARSERTEST
499
#ifdef PARSERTEST
500
        return 0;
500
        return 0;
501
#else
501
#else
502
        if (i < 0 || i > 7) return 0;
502
        if (i < 0 || i > 7) return 0;
503
        return ((long)slider[i] * (b - a)) / 255 + a;
503
        return ((long)slider[i] * (b - a)) / 255 + a;
504
#endif
504
#endif
505
}
505
}
506
 
506
 
507
value_type val_foundry(value_type i, value_type a, value_type b) {
507
value_type val_foundry(value_type i, value_type a, value_type b) {
508
#ifdef PARSERTEST
508
#ifdef PARSERTEST
509
        return 0;
509
        return 0;
510
#else
510
#else
511
        return ((long)ff_ctl(i) * (b - a)) / 255 + a;
511
        return ((long)ff_ctl(i) * (b - a)) / 255 + a;
512
#endif
512
#endif
513
}
513
}
514
 
514
 
515
value_type ff_val(value_type i, value_type a, value_type b) {
515
value_type ff_val(value_type i, value_type a, value_type b) {
516
        // The only difference is the handling of invalid values of "i"
516
        // The only difference is the handling of invalid values of "i"
517
#ifdef use_filterfactory_implementation_val
517
#ifdef use_filterfactory_implementation_val
518
        return val_factory(i, a, b);
518
        return val_factory(i, a, b);
519
#else
519
#else
520
        return val_foundry(i, a, b);
520
        return val_foundry(i, a, b);
521
#endif
521
#endif
522
}
522
}
523
 
523
 
524
// -------------------------------------------------------------------------------------------
524
// -------------------------------------------------------------------------------------------
525
 
525
 
526
/* map(i,n) Item n from mapping table i, where i is an integer between
526
/* map(i,n) Item n from mapping table i, where i is an integer between
527
        0 and 3, inclusive, and n is and integer between 0 and 255,
527
        0 and 3, inclusive, and n is and integer between 0 and 255,
528
        inclusive */
528
        inclusive */
529
value_type ff_map(value_type i, value_type n) {
529
value_type ff_map(value_type i, value_type n) {
530
#ifdef PARSERTEST
530
#ifdef PARSERTEST
531
        return 0;
531
        return 0;
532
#else
532
#else
533
        value_type H, L;
533
        value_type H, L;
534
        const int i2 = i << 1;
534
        const int i2 = i << 1;
535
 
535
 
536
        // This is how Filter Factory for Windows implements it:
536
        // This is how Filter Factory for Windows implements it:
537
        if (i < 0) return 0;
537
        if (i < 0) return 0;
538
        if (i > 3) return 0;
538
        if (i > 3) return 0;
539
        H = slider[i2]; // ctl(2i)
539
        H = slider[i2]; // ctl(2i)
540
        L = slider[i2 + 1]; // ctl(2i+1)
540
        L = slider[i2 + 1]; // ctl(2i+1)
541
        if (n < 0) n = 0;
541
        if (n < 0) n = 0;
542
        if (n > 255) n = 255; // Note: MacFF probably does "return 255" if n>255 (see testcases/map1_factory_win.png)
542
        if (n > 255) n = 255; // Note: MacFF probably does "return 255" if n>255 (see testcases/map1_factory_win.png)
543
 
543
 
544
        if (H == L) {
544
        if (H == L) {
545
                // This is undocumented in Filter Factory! (Taken from Windows implementation)
545
                // This is undocumented in Filter Factory! (Taken from Windows implementation)
546
                if (n < H) return 0;
546
                if (n < H) return 0;
547
                if (n >= L) return 255;
547
                if (n >= L) return 255;
548
        } else if (L > H) {
548
        } else if (L > H) {
549
                // This is undocumented in Filter Factory! (Taken from Windows implementation)
549
                // This is undocumented in Filter Factory! (Taken from Windows implementation)
550
                if (n <= H) return 255;
550
                if (n <= H) return 255;
551
                if (n >= L) return 0;
551
                if (n >= L) return 0;
552
        } else {
552
        } else {
553
                if (n <= L) return 0;
553
                if (n <= L) return 0;
554
                if (n >= H) return 255;
554
                if (n >= H) return 255;
555
        }
555
        }
556
        return (n - L) * 255 / (H - L);
556
        return (n - L) * 255 / (H - L);
557
 
557
 
558
        // This is the original formula used by GIMP User Filter v0.8 (uf-pcode.h).
558
        // This is the original formula used by GIMP User Filter v0.8 (uf-pcode.h).
559
        // It was used in Filter Foundry till version 1.7.0.16, inclusive.
559
        // It was used in Filter Foundry till version 1.7.0.16, inclusive.
560
        /*
560
        /*
561
        value_type H = ff_ctl(i * 2);
561
        value_type H = ff_ctl(i * 2);
562
        value_type L = ff_ctl(i * 2 + 1);
562
        value_type L = ff_ctl(i * 2 + 1);
563
        return abs(((long)n * (L - H) / 255) + H);
563
        return abs(((long)n * (L - H) / 255) + H);
564
        */
564
        */
565
#endif
565
#endif
566
 
566
 
567
}
567
}
568
 
568
 
569
// -------------------------------------------------------------------------------------------
569
// -------------------------------------------------------------------------------------------
570
 
570
 
571
/* min(a,b) Lesser of a and b */
571
/* min(a,b) Lesser of a and b */
572
value_type ff_min(value_type a, value_type b) {
572
value_type ff_min(value_type a, value_type b) {
573
#ifdef PARSERTEST
573
#ifdef PARSERTEST
574
        return 0;
574
        return 0;
575
#else
575
#else
576
        return a < b ? a : b;
576
        return a < b ? a : b;
577
#endif
577
#endif
578
}
578
}
579
 
579
 
580
// -------------------------------------------------------------------------------------------
580
// -------------------------------------------------------------------------------------------
581
 
581
 
582
/* max(a,b) Greater of a and b */
582
/* max(a,b) Greater of a and b */
583
value_type ff_max(value_type a, value_type b) {
583
value_type ff_max(value_type a, value_type b) {
584
#ifdef PARSERTEST
584
#ifdef PARSERTEST
585
        return 0;
585
        return 0;
586
#else
586
#else
587
        return a > b ? a : b;
587
        return a > b ? a : b;
588
#endif
588
#endif
589
}
589
}
590
 
590
 
591
// -------------------------------------------------------------------------------------------
591
// -------------------------------------------------------------------------------------------
592
 
592
 
593
/* abs(a) Absolute value of a */
593
/* abs(a) Absolute value of a */
594
value_type ff_abs(value_type a) {
594
value_type ff_abs(value_type a) {
595
#ifdef PARSERTEST
595
#ifdef PARSERTEST
596
        return 0;
596
        return 0;
597
#else
597
#else
598
        return abs(a);
598
        return abs(a);
599
#endif
599
#endif
600
}
600
}
601
 
601
 
602
// -------------------------------------------------------------------------------------------
602
// -------------------------------------------------------------------------------------------
603
 
603
 
604
/* add(a,b,c) Sum of a and b, or c, whichever is lesser */
604
/* add(a,b,c) Sum of a and b, or c, whichever is lesser */
605
value_type ff_add(value_type a, value_type b, value_type c) {
605
value_type ff_add(value_type a, value_type b, value_type c) {
606
#ifdef PARSERTEST
606
#ifdef PARSERTEST
607
        return 0;
607
        return 0;
608
#else
608
#else
609
        return ff_min(a + b, c);
609
        return ff_min(a + b, c);
610
#endif
610
#endif
611
}
611
}
612
 
612
 
613
// -------------------------------------------------------------------------------------------
613
// -------------------------------------------------------------------------------------------
614
 
614
 
615
/* sub(a,b,c) Difference of a and b, or c, whichever is greater */
615
/* sub(a,b,c) Difference of a and b, or c, whichever is greater */
616
value_type ff_sub(value_type a, value_type b, value_type c) {
616
value_type ff_sub(value_type a, value_type b, value_type c) {
617
#ifdef PARSERTEST
617
#ifdef PARSERTEST
618
        return 0;
618
        return 0;
619
#else
619
#else
620
        return ff_max(ff_dif(a, b), c);
620
        return ff_max(ff_dif(a, b), c);
621
#endif
621
#endif
622
}
622
}
623
 
623
 
624
// -------------------------------------------------------------------------------------------
624
// -------------------------------------------------------------------------------------------
625
 
625
 
626
/* dif(a,b) Absolute value of the difference of a and b */
626
/* dif(a,b) Absolute value of the difference of a and b */
627
value_type ff_dif(value_type a, value_type b) {
627
value_type ff_dif(value_type a, value_type b) {
628
#ifdef PARSERTEST
628
#ifdef PARSERTEST
629
        return 0;
629
        return 0;
630
#else
630
#else
631
        return abs(a - b);
631
        return abs(a - b);
632
#endif
632
#endif
633
}
633
}
634
 
634
 
635
// -------------------------------------------------------------------------------------------
635
// -------------------------------------------------------------------------------------------
636
 
636
 
637
/* rnd(a,b) Random number between a and b, inclusive */
637
/* rnd(a,b) Random number between a and b, inclusive */
638
 
638
 
639
struct factoryRngState {
639
struct factoryRngState {
640
        uint16_t index1;
640
        uint16_t index1;
641
        uint16_t index2;
641
        uint16_t index2;
642
        uint32_t seedTable[56];
642
        uint32_t seedTable[56];
643
        uint32_t seed;
643
        uint32_t seed;
644
        uint32_t seedSave;
644
        uint32_t seedSave;
645
} gFactoryRngState;
645
} gFactoryRngState;
646
 
646
 
647
void factory_fill_rnd_lookup(uint32_t seed, struct factoryRngState* state) {
647
void factory_fill_rnd_lookup(uint32_t seed, struct factoryRngState* state) {
648
#ifdef PARSERTEST
648
#ifdef PARSERTEST
649
        return;
649
        return;
650
#else
650
#else
651
        // Algorithm of Filter Factory
651
        // Algorithm of Filter Factory
652
        // Filter Factory uses Donald E.Knuth's subtractive
652
        // Filter Factory uses Donald E.Knuth's subtractive
653
        // random number generator algorithm ("ran3"), which has been published
653
        // random number generator algorithm ("ran3"), which has been published
654
        // in Page 283 of "The Art of Computer Programming, volume 2: Seminumerical Algorithms",
654
        // in Page 283 of "The Art of Computer Programming, volume 2: Seminumerical Algorithms",
655
        // Addison-Wesley, Reading, MA, second edition, 1981.
655
        // Addison-Wesley, Reading, MA, second edition, 1981.
656
        // https://www.cec.uchile.cl/cinetica/pcordero/MC_libros/NumericalRecipesinC.pdf (PDF Page 307)
656
        // https://www.cec.uchile.cl/cinetica/pcordero/MC_libros/NumericalRecipesinC.pdf (PDF Page 307)
657
 
657
 
658
        long mj, mk;
658
        long mj, mk;
659
        int i, ii, k;
659
        int i, ii, k;
660
 
660
 
661
        // 161803398 = 1.61803398 * 10^8 ~= phi * 10^8
661
        // 161803398 = 1.61803398 * 10^8 ~= phi * 10^8
662
        mj = 161803398 - (seed & 0x7fff);
662
        mj = 161803398 - (seed & 0x7fff);
663
        state->seedTable[55] = mj;
663
        state->seedTable[55] = mj;
664
 
664
 
665
        mk = 1;
665
        mk = 1;
666
        ii = 0;
666
        ii = 0;
667
        for (i = 1; i <= 54; ++i) {
667
        for (i = 1; i <= 54; ++i) {
668
                if ((ii += 21) >= 55) ii -= 55; // ii = (21*i)%55;
668
                if ((ii += 21) >= 55) ii -= 55; // ii = (21*i)%55;
669
                state->seedTable[ii] = mk;
669
                state->seedTable[ii] = mk;
670
                mk = mj - mk;
670
                mk = mj - mk;
671
                mj = state->seedTable[ii];
671
                mj = state->seedTable[ii];
672
        }
672
        }
673
 
673
 
674
        for (k = 1; k <= 4; ++k) {
674
        for (k = 1; k <= 4; ++k) {
675
                ii = 30;
675
                ii = 30;
676
                for (i = 1; i <= 55; ++i) {
676
                for (i = 1; i <= 55; ++i) {
677
                        if ((ii += 1) >= 55) ii -= 55;
677
                        if ((ii += 1) >= 55) ii -= 55;
678
                        state->seedTable[i] -= state->seedTable[1 + ii]; // 1 + (i+30)%55
678
                        state->seedTable[i] -= state->seedTable[1 + ii]; // 1 + (i+30)%55
679
                }
679
                }
680
        }
680
        }
681
 
681
 
682
        state->seedSave = seed;
682
        state->seedSave = seed;
683
 
683
 
684
        return;
684
        return;
685
#endif
685
#endif
686
}
686
}
687
 
687
 
688
uint32_t factory_rnd(uint32_t a, uint32_t b, struct factoryRngState* state) {
688
uint32_t factory_rnd(uint32_t a, uint32_t b, struct factoryRngState* state) {
689
#ifdef PARSERTEST
689
#ifdef PARSERTEST
690
        return 0;
690
        return 0;
691
#else
691
#else
692
        uint32_t mj; // Note: This must be "uint32_t". With "long" (as described by Knuth), it won't match FilterFactory's algorithm
692
        uint32_t mj; // Note: This must be "uint32_t". With "long" (as described by Knuth), it won't match FilterFactory's algorithm
693
        int range;
693
        int range;
694
 
694
 
695
        if (state->seed != state->seedSave) {
695
        if (state->seed != state->seedSave) {
696
                // (Intentional) behavior of Filter Foundry
696
                // (Intentional) behavior of Filter Foundry
697
                factory_fill_rnd_lookup(state->seed, &gFactoryRngState);
697
                factory_fill_rnd_lookup(state->seed, &gFactoryRngState);
698
                state->index1 = 0;
698
                state->index1 = 0;
699
                state->index2 = 31;
699
                state->index2 = 31;
700
        }
700
        }
701
 
701
 
702
        // Algorithm of Filter Factory
702
        // Algorithm of Filter Factory
703
        // Filter Factory uses Donald E.Knuth's subtractive
703
        // Filter Factory uses Donald E.Knuth's subtractive
704
        // random number generator algorithm ("ran3"), which has been published
704
        // random number generator algorithm ("ran3"), which has been published
705
        // in Page 283 of "The Art of Computer Programming, volume 2: Seminumerical Algorithms",
705
        // in Page 283 of "The Art of Computer Programming, volume 2: Seminumerical Algorithms",
706
        // Addison-Wesley, Reading, MA, second edition, 1981.
706
        // Addison-Wesley, Reading, MA, second edition, 1981.
707
        // https://www.cec.uchile.cl/cinetica/pcordero/MC_libros/NumericalRecipesinC.pdf (PDF Page 307)
707
        // https://www.cec.uchile.cl/cinetica/pcordero/MC_libros/NumericalRecipesinC.pdf (PDF Page 307)
708
 
708
 
709
        if (++state->index1 == 56) state->index1 = 1;
709
        if (++state->index1 == 56) state->index1 = 1;
710
        if (++state->index2 == 56) state->index2 = 1;
710
        if (++state->index2 == 56) state->index2 = 1;
711
 
711
 
712
        mj = state->seedTable[state->index1] -
712
        mj = state->seedTable[state->index1] -
713
             state->seedTable[state->index2];
713
             state->seedTable[state->index2];
714
        state->seedTable[state->index1] = mj;
714
        state->seedTable[state->index1] = mj;
715
 
715
 
716
        // This is Filter Factory specific:
716
        // This is Filter Factory specific:
717
        // Reduce result into interval [a..b] by applying (a + (mj % (b - a + 1))
717
        // Reduce result into interval [a..b] by applying (a + (mj % (b - a + 1))
718
        // Try to avoid modulo in order to increase performance
718
        // Try to avoid modulo in order to increase performance
719
        range = b - a;
719
        range = b - a;
720
        if (range < 0) return 0;
720
        if (range < 0) return 0;
721
        switch (range) {
721
        switch (range) {
722
        case 255:
722
        case 255:
723
                return a + (mj & 0xFF);
723
                return a + (mj & 0xFF);
724
        case 127:
724
        case 127:
725
                return a + (mj & 0x7F);
725
                return a + (mj & 0x7F);
726
        case 63:
726
        case 63:
727
                return a + (mj & 0x3F);
727
                return a + (mj & 0x3F);
728
        case 31:
728
        case 31:
729
                return a + (mj & 0x1F);
729
                return a + (mj & 0x1F);
730
        case 15:
730
        case 15:
731
                return a + (mj & 0xF);
731
                return a + (mj & 0xF);
732
        case 7:
732
        case 7:
733
                return a + (mj & 0x7);
733
                return a + (mj & 0x7);
734
        case 3:
734
        case 3:
735
                return a + (mj & 0x3);
735
                return a + (mj & 0x3);
736
        case 1:
736
        case 1:
737
                return a + (mj & 0x1);
737
                return a + (mj & 0x1);
738
        case 0:
738
        case 0:
739
                return a;
739
                return a;
740
        default:
740
        default:
741
                return a + (mj % (range + 1));
741
                return a + (mj % (range + 1));
742
        }
742
        }
743
#endif
743
#endif
744
}
744
}
745
 
745
 
746
value_type foundry_rnd(value_type a, value_type b) {
746
value_type foundry_rnd(value_type a, value_type b) {
747
#ifdef PARSERTEST
747
#ifdef PARSERTEST
748
        return 0;
748
        return 0;
749
#else
749
#else
750
        return (int)((abs(a - b) + 1) * (rand() / (RAND_MAX + 1.))) + ff_min(a, b);
750
        return (int)((abs(a - b) + 1) * (rand() / (RAND_MAX + 1.))) + ff_min(a, b);
751
        //      return ((unsigned)rand() % (ff_dif(a,b)+1)) + ff_min(a,b);
751
        //      return ((unsigned)rand() % (ff_dif(a,b)+1)) + ff_min(a,b);
752
#endif
752
#endif
753
}
753
}
754
 
754
 
755
value_type ff_rnd(value_type a, value_type b) {
755
value_type ff_rnd(value_type a, value_type b) {
756
#ifdef use_filterfactory_implementation_rnd
756
#ifdef use_filterfactory_implementation_rnd
757
        return factory_rnd(a, b, &gFactoryRngState);
757
        return factory_rnd(a, b, &gFactoryRngState);
758
#else
758
#else
759
        return foundry_rnd(a, b);
759
        return foundry_rnd(a, b);
760
#endif
760
#endif
761
}
761
}
762
 
762
 
763
// -------------------------------------------------------------------------------------------
763
// -------------------------------------------------------------------------------------------
764
 
764
 
765
/* rst(i) sets a random seed and returns 0. (undocumented Filter Factory function).
765
/* rst(i) sets a random seed and returns 0. (undocumented Filter Factory function).
766
   Added by DM, 18 Dec 2018 */
766
   Added by DM, 18 Dec 2018 */
767
 
767
 
768
int32_t factory_rst(uint32_t seed, struct factoryRngState* state) {
768
int32_t factory_rst(uint32_t seed, struct factoryRngState* state) {
769
#ifdef PARSERTEST
769
#ifdef PARSERTEST
770
        return 0;
770
        return 0;
771
#else
771
#else
772
        // Attention: This is NOT the FilterFactory rst() implementation!
772
        // Attention: This is NOT the FilterFactory rst() implementation!
773
 
773
 
774
        // We implement rst(i) completely differently in Filter Foundry:
774
        // We implement rst(i) completely differently in Filter Foundry:
775
        // Every call of rst() will renew the lookup table.
775
        // Every call of rst() will renew the lookup table.
776
        // In Filter Factory, there are strange/buggy things going
776
        // In Filter Factory, there are strange/buggy things going
777
        // on: rst(i) only sets a seed and the lookup table is renewed
777
        // on: rst(i) only sets a seed and the lookup table is renewed
778
        // at the NEXT invocation of the filter. Furthermore, in FilterFactory,
778
        // at the NEXT invocation of the filter. Furthermore, in FilterFactory,
779
        // the state is not reset between invocations, therefore, the preview image
779
        // the state is not reset between invocations, therefore, the preview image
780
        // will influence the PRNG state of the final image...
780
        // will influence the PRNG state of the final image...
781
        // More information at "Filter Factory Compatibility.md"
781
        // More information at "Filter Factory Compatibility.md"
782
 
782
 
783
        state->seed = seed;
783
        state->seed = seed;
784
 
784
 
785
        // Force renewal of the PRNG state in the next rnd(a,b) call.
785
        // Force renewal of the PRNG state in the next rnd(a,b) call.
786
        // This allows us to use:
786
        // This allows us to use:
787
        //    (x==0?rst(1):0), rnd(0,255)
787
        //    (x==0?rst(1):0), rnd(0,255)
788
        // But it is slower and this won't work anymore:
788
        // But it is slower and this won't work anymore:
789
        //    rst(0), rnd(0,255)
789
        //    rst(0), rnd(0,255)
790
        state->seedSave = seed + 1;
790
        state->seedSave = seed + 1;
791
 
791
 
792
        return 0;
792
        return 0;
793
#endif
793
#endif
794
}
794
}
795
 
795
 
796
value_type foundry_rst(value_type seed) {
796
value_type foundry_rst(value_type seed) {
797
#ifdef PARSERTEST
797
#ifdef PARSERTEST
798
        return 0;
798
        return 0;
799
#else
799
#else
800
        srand(seed);
800
        srand(seed);
801
        return 0;
801
        return 0;
802
#endif
802
#endif
803
}
803
}
804
 
804
 
805
value_type ff_rst(value_type seed) {
805
value_type ff_rst(value_type seed) {
806
#ifdef use_filterfactory_implementation_rnd
806
#ifdef use_filterfactory_implementation_rnd
807
        return factory_rst(seed, &gFactoryRngState);
807
        return factory_rst(seed, &gFactoryRngState);
808
#else
808
#else
809
        return foundry_rst(seed);
809
        return foundry_rst(seed);
810
#endif
810
#endif
811
}
811
}
812
 
812
 
813
// -------------------------------------------------------------------------------------------
813
// -------------------------------------------------------------------------------------------
814
 
814
 
815
void factory_initialize_rnd_variables() {
815
void factory_initialize_rnd_variables() {
816
#ifdef PARSERTEST
816
#ifdef PARSERTEST
817
        return;
817
        return;
818
#else
818
#else
819
        gFactoryRngState.seed = 0; // default seed
819
        gFactoryRngState.seed = 0; // default seed
820
        gFactoryRngState.seedSave = gFactoryRngState.seed + 1; // force rnd() to call factory_fill_rnd_lookup()
820
        gFactoryRngState.seedSave = gFactoryRngState.seed + 1; // force rnd() to call factory_fill_rnd_lookup()
821
#endif
821
#endif
822
}
822
}
823
 
823
 
824
void foundry_initialize_rnd_variables() {
824
void foundry_initialize_rnd_variables() {
825
#ifdef PARSERTEST
825
#ifdef PARSERTEST
826
        return;
826
        return;
827
#else
827
#else
828
        foundry_rst(691204);
828
        foundry_rst(691204);
829
#endif
829
#endif
830
}
830
}
831
 
831
 
832
void initialize_rnd_variables() {
832
void initialize_rnd_variables() {
833
#ifdef use_filterfactory_implementation_rnd
833
#ifdef use_filterfactory_implementation_rnd
834
        factory_initialize_rnd_variables();
834
        factory_initialize_rnd_variables();
835
#else
835
#else
836
        foundry_initialize_rnd_variables();
836
        foundry_initialize_rnd_variables();
837
#endif
837
#endif
838
}
838
}
839
 
839
 
840
// -------------------------------------------------------------------------------------------
840
// -------------------------------------------------------------------------------------------
841
 
841
 
842
/* mix(a,b,n,d) Mixture of a and b by fraction n/d, a*n/d+b*(d-n)/d */
842
/* mix(a,b,n,d) Mixture of a and b by fraction n/d, a*n/d+b*(d-n)/d */
843
value_type ff_mix(value_type a, value_type b, value_type n, value_type d) {
843
value_type ff_mix(value_type a, value_type b, value_type n, value_type d) {
844
#ifdef PARSERTEST
844
#ifdef PARSERTEST
845
        return 0;
845
        return 0;
846
#else
846
#else
847
        if (d == 0) return 0;
847
        if (d == 0) return 0;
848
        return ((long)a * n) / d + ((long)b * (d - n)) / d;
848
        return ((long)a * n) / d + ((long)b * (d - n)) / d;
849
#endif
849
#endif
850
}
850
}
851
 
851
 
852
// -------------------------------------------------------------------------------------------
852
// -------------------------------------------------------------------------------------------
853
 
853
 
854
/* scl(a,il,ih,ol,oh) Scale a from input range (il to ih)
854
/* scl(a,il,ih,ol,oh) Scale a from input range (il to ih)
855
                                          to output range (ol to oh) */
855
                                          to output range (ol to oh) */
856
value_type ff_scl(value_type a, value_type il, value_type ih,
856
value_type ff_scl(value_type a, value_type il, value_type ih,
857
        value_type ol, value_type oh) {
857
        value_type ol, value_type oh) {
858
#ifdef PARSERTEST
858
#ifdef PARSERTEST
859
        return 0;
859
        return 0;
860
#else
860
#else
861
        return ih == il ? 0 : ol + ((long)(oh - ol) * (a - il)) / (ih - il);
861
        return ih == il ? 0 : ol + ((long)(oh - ol) * (a - il)) / (ih - il);
862
#endif
862
#endif
863
}
863
}
864
 
864
 
865
// -------------------------------------------------------------------------------------------
865
// -------------------------------------------------------------------------------------------
866
 
866
 
867
/* pow(b,e) Calculates the base to the exponent power, that is, b^e. */
867
/* pow(b,e) Calculates the base to the exponent power, that is, b^e. */
868
 
868
 
869
value_type ff_pow(value_type b, value_type e) {
869
value_type ff_pow(value_type b, value_type e) {
870
#ifdef PARSERTEST
870
#ifdef PARSERTEST
871
        return 0;
871
        return 0;
872
#else
872
#else
873
        double a = pow((double)b, (double)e);
873
        double a = pow((double)b, (double)e);
874
        if (a - floor(a) >= 0.5)
874
        if (a - floor(a) >= 0.5)
875
                return (value_type)(floor(a) + 1);
875
                return (value_type)(floor(a) + 1);
876
        else
876
        else
877
                return (value_type)(floor(a));
877
                return (value_type)(floor(a));
878
#endif
878
#endif
879
}
879
}
880
 
880
 
881
// -------------------------------------------------------------------------------------------
881
// -------------------------------------------------------------------------------------------
882
 
882
 
883
/* sqr(x) Square root of x */
883
/* sqr(x) Square root of x */
884
 
884
 
885
static uint32_t isqrt(uint32_t x) {
885
static uint32_t isqrt(uint32_t x) {
886
#ifdef PARSERTEST
886
#ifdef PARSERTEST
887
        return 0;
887
        return 0;
888
#else
888
#else
889
        // based on https://gist.github.com/orlp/3481770
889
        // based on https://gist.github.com/orlp/3481770
890
 
890
 
891
        static uint32_t lkpSquares[65535];
891
        static uint32_t lkpSquares[65535];
892
        static int lkpInitialized = 0;
892
        static int lkpInitialized = 0;
893
        const uint32_t* p;
893
        const uint32_t* p;
894
        int i;
894
        int i;
895
 
895
 
896
        while (lkpInitialized == 1) { /* If other thread is currently creating the lookup table, then wait */ }
896
        while (lkpInitialized == 1) { /* If other thread is currently creating the lookup table, then wait */ }
897
        if (!lkpInitialized) {
897
        if (!lkpInitialized) {
898
                lkpInitialized = 1;
898
                lkpInitialized = 1;
899
                for (i = 0; i < 65535; ++i) {
899
                for (i = 0; i < 65535; ++i) {
900
                        lkpSquares[i] = i * i;
900
                        lkpSquares[i] = i * i;
901
                }
901
                }
902
                lkpInitialized = 2;
902
                lkpInitialized = 2;
903
        }
903
        }
904
 
904
 
905
        p = lkpSquares;
905
        p = lkpSquares;
906
 
906
 
907
        if (p[32768] <= x) p += 32768;
907
        if (p[32768] <= x) p += 32768;
908
        if (p[16384] <= x) p += 16384;
908
        if (p[16384] <= x) p += 16384;
909
        if (p[8192] <= x) p += 8192;
909
        if (p[8192] <= x) p += 8192;
910
        if (p[4096] <= x) p += 4096;
910
        if (p[4096] <= x) p += 4096;
911
        if (p[2048] <= x) p += 2048;
911
        if (p[2048] <= x) p += 2048;
912
        if (p[1024] <= x) p += 1024;
912
        if (p[1024] <= x) p += 1024;
913
        if (p[512] <= x) p += 512;
913
        if (p[512] <= x) p += 512;
914
        if (p[256] <= x) p += 256;
914
        if (p[256] <= x) p += 256;
915
        if (p[128] <= x) p += 128;
915
        if (p[128] <= x) p += 128;
916
        if (p[64] <= x) p += 64;
916
        if (p[64] <= x) p += 64;
917
        if (p[32] <= x) p += 32;
917
        if (p[32] <= x) p += 32;
918
        if (p[16] <= x) p += 16;
918
        if (p[16] <= x) p += 16;
919
        if (p[8] <= x) p += 8;
919
        if (p[8] <= x) p += 8;
920
        if (p[4] <= x) p += 4;
920
        if (p[4] <= x) p += 4;
921
        if (p[2] <= x) p += 2;
921
        if (p[2] <= x) p += 2;
922
        if (p[1] <= x) p += 1;
922
        if (p[1] <= x) p += 1;
923
 
923
 
924
        return (uint32_t)(p - lkpSquares);
924
        return (uint32_t)(p - lkpSquares);
925
#endif
925
#endif
926
}
926
}
927
 
927
 
928
value_type factory_sqr(value_type x) {
928
value_type factory_sqr(value_type x) {
929
#ifdef PARSERTEST
929
#ifdef PARSERTEST
930
        return 0;
930
        return 0;
931
#else
931
#else
932
        // https://misc.daniel-marschall.de/projects/filter_factory/function_sqr.html
932
        // https://misc.daniel-marschall.de/projects/filter_factory/function_sqr.html
933
 
933
 
934
        int eax, ebx, ecx;
934
        int eax, ebx, ecx;
935
 
935
 
936
        ebx = x;
936
        ebx = x;
937
        if (ebx > 1) {
937
        if (ebx > 1) {
938
                ecx = ebx;
938
                ecx = ebx;
939
                ebx = ebx >> 1;
939
                ebx = ebx >> 1;
940
                eax = 2;
940
                eax = 2;
941
                while (ebx > eax) {
941
                while (ebx > eax) {
942
                        eax = ecx;
942
                        eax = ecx;
943
                        eax /= ebx;
943
                        eax /= ebx;
944
                        ebx += eax;
944
                        ebx += eax;
945
                        ebx = ebx >> 1;
945
                        ebx = ebx >> 1;
946
                }
946
                }
947
        }
947
        }
948
        return ebx;
948
        return ebx;
949
#endif
949
#endif
950
}
950
}
951
 
951
 
952
value_type foundry_sqr(value_type x) {
952
value_type foundry_sqr(value_type x) {
953
#ifdef PARSERTEST
953
#ifdef PARSERTEST
954
        return 0;
954
        return 0;
955
#else
955
#else
956
        // Note: FilterFactory has sqr(x)=x if x<0 . Here we set sqr(x)=0 for x<0
956
        // Note: FilterFactory has sqr(x)=x if x<0 . Here we set sqr(x)=0 for x<0
957
        return x < 0 ? 0 : isqrt(x);
957
        return x < 0 ? 0 : isqrt(x);
958
#endif
958
#endif
959
}
959
}
960
 
960
 
961
value_type ff_sqr(value_type x) {
961
value_type ff_sqr(value_type x) {
962
#ifdef use_filterfactory_implementation_sqr
962
#ifdef use_filterfactory_implementation_sqr
963
        return factory_sqr(x);
963
        return factory_sqr(x);
964
#else
964
#else
965
        return foundry_sqr(x);
965
        return foundry_sqr(x);
966
#endif
966
#endif
967
}
967
}
968
 
968
 
969
// -------------------------------------------------------------------------------------------
969
// -------------------------------------------------------------------------------------------
970
 
970
 
971
/* cos(x) Cosine function of x, where x is an integer between 0 and
971
/* cos(x) Cosine function of x, where x is an integer between 0 and
972
   1024, inclusive, and the value returned is an integer
972
   1024, inclusive, and the value returned is an integer
973
   between -512 and 512, inclusive (Windows) or -1024 and
973
   between -512 and 512, inclusive (Windows) or -1024 and
974
   1024, inclusive (Mac OS) */
974
   1024, inclusive (Mac OS) */
975
 
975
 
976
value_type factory_cos(value_type x) {
976
value_type factory_cos(value_type x) {
977
#ifdef PARSERTEST
977
#ifdef PARSERTEST
978
        return 0;
978
        return 0;
979
#else
979
#else
980
        // https://misc.daniel-marschall.de/projects/filter_factory/function_cos.html
980
        // https://misc.daniel-marschall.de/projects/filter_factory/function_cos.html
981
        int res;
981
        int res;
982
        if (x < 0) x = -x;
982
        if (x < 0) x = -x;
983
        x &= 0x3ff; // 1023
983
        x &= 0x3ff; // 1023
984
        res = FACTORY_COS_LOOKUP[x];
984
        res = FACTORY_COS_LOOKUP[x];
985
        return res >= 0 ? (res / 32) : res / 32 - 1;
985
        return res >= 0 ? (res / 32) : res / 32 - 1;
986
#endif
986
#endif
987
}
987
}
988
 
988
 
989
value_type foundry_cos(value_type x) {
989
value_type foundry_cos(value_type x) {
990
#ifdef PARSERTEST
990
#ifdef PARSERTEST
991
        return 0;
991
        return 0;
992
#else
992
#else
993
        //return RINT(TRIGAMP*cos(FFANGLE(x)));
993
        //return RINT(TRIGAMP*cos(FFANGLE(x)));
994
        return (value_type)RINT(TRIGAMP * gdata->costab[abs(x) % COSTABSIZE]);
994
        return (value_type)RINT(TRIGAMP * gdata->costab[abs(x) % COSTABSIZE]);
995
#endif
995
#endif
996
}
996
}
997
 
997
 
998
value_type ff_cos(value_type x) {
998
value_type ff_cos(value_type x) {
999
#ifdef use_filterfactory_implementation_cos
999
#ifdef use_filterfactory_implementation_cos
1000
        return factory_cos(x);
1000
        return factory_cos(x);
1001
#else
1001
#else
1002
        return foundry_cos(x);
1002
        return foundry_cos(x);
1003
#endif
1003
#endif
1004
}
1004
}
1005
 
1005
 
1006
// -------------------------------------------------------------------------------------------
1006
// -------------------------------------------------------------------------------------------
1007
 
1007
 
1008
/* sin(x) Sine function of x, where x is an integer between 0 and
1008
/* sin(x) Sine function of x, where x is an integer between 0 and
1009
   1024, inclusive, and the value returned is an integer
1009
   1024, inclusive, and the value returned is an integer
1010
   between -512 and 512, inclusive (Windows) or -1024 and
1010
   between -512 and 512, inclusive (Windows) or -1024 and
1011
   1024, inclusive (Mac OS) */
1011
   1024, inclusive (Mac OS) */
1012
 
1012
 
1013
value_type factory_sin(value_type x) {
1013
value_type factory_sin(value_type x) {
1014
#ifdef PARSERTEST
1014
#ifdef PARSERTEST
1015
        return 0;
1015
        return 0;
1016
#else
1016
#else
1017
        // https://misc.daniel-marschall.de/projects/filter_factory/function_sin.html
1017
        // https://misc.daniel-marschall.de/projects/filter_factory/function_sin.html
1018
        return factory_cos(x - 256);
1018
        return factory_cos(x - 256);
1019
#endif
1019
#endif
1020
}
1020
}
1021
 
1021
 
1022
value_type foundry_sin(value_type x) {
1022
value_type foundry_sin(value_type x) {
1023
#ifdef PARSERTEST
1023
#ifdef PARSERTEST
1024
        return 0;
1024
        return 0;
1025
#else
1025
#else
1026
        //return RINT(TRIGAMP*sin(FFANGLE(x)));
1026
        //return RINT(TRIGAMP*sin(FFANGLE(x)));
1027
        return foundry_cos(x - 256);
1027
        return foundry_cos(x - 256);
1028
#endif
1028
#endif
1029
}
1029
}
1030
 
1030
 
1031
value_type ff_sin(value_type x) {
1031
value_type ff_sin(value_type x) {
1032
#ifdef use_filterfactory_implementation_sin
1032
#ifdef use_filterfactory_implementation_sin
1033
        return factory_sin(x);
1033
        return factory_sin(x);
1034
#else
1034
#else
1035
        return foundry_sin(x);
1035
        return foundry_sin(x);
1036
#endif
1036
#endif
1037
}
1037
}
1038
 
1038
 
1039
// -------------------------------------------------------------------------------------------
1039
// -------------------------------------------------------------------------------------------
1040
 
1040
 
1041
/* tan(x) Tangent function of x, where x is an integer
1041
/* tan(x) Tangent function of x, where x is an integer
1042
   between -256 and 256, inclusive. Althought the Filter Factory manual
1042
   between -256 and 256, inclusive. Althought the Filter Factory manual
1043
   stated that the return value is bounded to -512 and 512, inclusive (Windows) or
1043
   stated that the return value is bounded to -512 and 512, inclusive (Windows) or
1044
   -1024 and 1024, inclusive (Mac OS), the output is actually NOT bounded! */
1044
   -1024 and 1024, inclusive (Mac OS), the output is actually NOT bounded! */
1045
 
1045
 
1046
value_type factory_tan(value_type x) {
1046
value_type factory_tan(value_type x) {
1047
#ifdef PARSERTEST
1047
#ifdef PARSERTEST
1048
        return 0;
1048
        return 0;
1049
#else
1049
#else
1050
        // https://misc.daniel-marschall.de/projects/filter_factory/function_tan.html
1050
        // https://misc.daniel-marschall.de/projects/filter_factory/function_tan.html
1051
        int v1 = x;
1051
        int v1 = x;
1052
        int v2 = v1 < 0 ? -v1 : v1;
1052
        int v2 = v1 < 0 ? -v1 : v1;
1053
        v2 &= 0x3ff; // 1023
1053
        v2 &= 0x3ff; // 1023
1054
        v2 = FACTORY_COS_LOOKUP[v2];
1054
        v2 = FACTORY_COS_LOOKUP[v2];
1055
        v1 -= 256;
1055
        v1 -= 256;
1056
        if (v1 < 0) v1 = -v1;
1056
        if (v1 < 0) v1 = -v1;
1057
        v1 &= 0x3ff; // 1023
1057
        v1 &= 0x3ff; // 1023
1058
        v1 = FACTORY_COS_LOOKUP[v1];
1058
        v1 = FACTORY_COS_LOOKUP[v1];
1059
        if (v2 == 0) return 0;
1059
        if (v2 == 0) return 0;
1060
        v1 = v1 << 10; // v1 *= 1024;
1060
        v1 = v1 << 10; // v1 *= 1024;
1061
        return v1 / v2;
1061
        return v1 / v2;
1062
#endif
1062
#endif
1063
}
1063
}
1064
 
1064
 
1065
value_type foundry_tan(value_type x) {
1065
value_type foundry_tan(value_type x) {
1066
#ifdef PARSERTEST
1066
#ifdef PARSERTEST
1067
        return 0;
1067
        return 0;
1068
#else
1068
#else
1069
        // Following filter shows that the Filter Factory manual differs from the implementation.
1069
        // Following filter shows that the Filter Factory manual differs from the implementation.
1070
        //     R = cos(x) > 1024 || cos(x) < -1024 || cos(-x) > 1024 || cos(-x) < -1024 ? 255 : 0
1070
        //     R = cos(x) > 1024 || cos(x) < -1024 || cos(-x) > 1024 || cos(-x) < -1024 ? 255 : 0
1071
        //     G = tan(x) > 1024 || tan(x) < -1024 || tan(-x) > 1024 || tan(-x) < -1024 ? 255 : 0
1071
        //     G = tan(x) > 1024 || tan(x) < -1024 || tan(-x) > 1024 || tan(-x) < -1024 ? 255 : 0
1072
        //     B = sin(x) > 1024 || sin(x) < -1024 || sin(-x) > 1024 || sin(-x) < -1024 ? 255 : 0
1072
        //     B = sin(x) > 1024 || sin(x) < -1024 || sin(-x) > 1024 || sin(-x) < -1024 ? 255 : 0
1073
        // It outputs green stripes, showing that the output of tan() is not bounded.
1073
        // It outputs green stripes, showing that the output of tan() is not bounded.
1074
        // So, we do it the same way to stay compatible.
1074
        // So, we do it the same way to stay compatible.
1075
        if (x < 0) x--; /* required for Filter Factory compatibility */
1075
        if (x < 0) x--; /* required for Filter Factory compatibility */
1076
        while (x < 0) x += TANTABSIZE;
1076
        while (x < 0) x += TANTABSIZE;
1077
        return (value_type)RINT(2 * TRIGAMP * gdata->tantab[x % TANTABSIZE]); // We need the x2 multiplicator for some reason
1077
        return (value_type)RINT(2 * TRIGAMP * gdata->tantab[x % TANTABSIZE]); // We need the x2 multiplicator for some reason
1078
#endif
1078
#endif
1079
}
1079
}
1080
 
1080
 
1081
value_type ff_tan(value_type x) {
1081
value_type ff_tan(value_type x) {
1082
#ifdef use_filterfactory_implementation_tan
1082
#ifdef use_filterfactory_implementation_tan
1083
        return factory_tan(x);
1083
        return factory_tan(x);
1084
#else
1084
#else
1085
        return foundry_tan(x);
1085
        return foundry_tan(x);
1086
#endif
1086
#endif
1087
}
1087
}
1088
 
1088
 
1089
// -------------------------------------------------------------------------------------------
1089
// -------------------------------------------------------------------------------------------
1090
 
1090
 
1091
/* c2d(x,y) Angle displacement of the pixel at coordinates x,y */
1091
/* c2d(x,y) Angle displacement of the pixel at coordinates x,y */
1092
 
1092
 
1093
value_type factory_c2d(value_type x, value_type y) {
1093
value_type factory_c2d(value_type x, value_type y) {
1094
#ifdef PARSERTEST
1094
#ifdef PARSERTEST
1095
        return 0;
1095
        return 0;
1096
#else
1096
#else
1097
        // https://misc.daniel-marschall.de/projects/filter_factory/function_c2d.html
1097
        // https://misc.daniel-marschall.de/projects/filter_factory/function_c2d.html
1098
        int32_t eax, ebx, ecx;
1098
        int32_t eax, ebx, ecx;
1099
        eax = y;
1099
        eax = y;
1100
        ebx = x;
1100
        ebx = x;
1101
        ecx = 0;
1101
        ecx = 0;
1102
        if (eax < 0) {
1102
        if (eax < 0) {
1103
                eax = -eax;
1103
                eax = -eax;
1104
                ecx |= 4/*0b0100*/;
1104
                ecx |= 4/*0b0100*/;
1105
        }
1105
        }
1106
        if (ebx < 0) {
1106
        if (ebx < 0) {
1107
                ebx = -ebx;
1107
                ebx = -ebx;
1108
                ecx |= 3/*0b0011*/;
1108
                ecx |= 3/*0b0011*/;
1109
        }
1109
        }
1110
        if (eax > ebx) {
1110
        if (eax > ebx) {
1111
                int tmp;
1111
                int tmp;
1112
                ecx ^= 1/*0b0001*/;
1112
                ecx ^= 1/*0b0001*/;
1113
                tmp = eax;
1113
                tmp = eax;
1114
                eax = ebx;
1114
                eax = ebx;
1115
                ebx = tmp;
1115
                ebx = tmp;
1116
        }
1116
        }
1117
        if (eax > 0) {
1117
        if (eax > 0) {
1118
                eax = eax << 10;
1118
                eax = eax << 10;
1119
                eax /= ebx;
1119
                eax /= ebx;
1120
                if (eax != 0) {
1120
                if (eax != 0) {
1121
                        eax = (eax & 0xFFFF0000) | (FACTORY_C2D_LOOKUP[eax - 1] & 0xFFFF);
1121
                        eax = (eax & 0xFFFF0000) | (FACTORY_C2D_LOOKUP[eax - 1] & 0xFFFF);
1122
                        eax = eax << 9;
1122
                        eax = eax << 9;
1123
                        ebx = 205888; // 205888/65536 == pi == 3.14159265358979323846264338327
1123
                        ebx = 205888; // 205888/65536 == pi == 3.14159265358979323846264338327
1124
                        eax /= ebx;
1124
                        eax /= ebx;
1125
                }
1125
                }
1126
        }
1126
        }
1127
        if ((ecx & 1/*0b0001*/) != 0) {
1127
        if ((ecx & 1/*0b0001*/) != 0) {
1128
                eax = -eax;
1128
                eax = -eax;
1129
                eax += 256;
1129
                eax += 256;
1130
        }
1130
        }
1131
        if ((ecx & 2/*0b0010*/) != 0) {
1131
        if ((ecx & 2/*0b0010*/) != 0) {
1132
                eax += 256;
1132
                eax += 256;
1133
        }
1133
        }
1134
        if ((ecx & 4/*0b0100*/) != 0) {
1134
        if ((ecx & 4/*0b0100*/) != 0) {
1135
                eax = -eax;
1135
                eax = -eax;
1136
        }
1136
        }
1137
        return eax;
1137
        return eax;
1138
#endif
1138
#endif
1139
}
1139
}
1140
 
1140
 
1141
value_type foundry_c2d(value_type x, value_type y) {
1141
value_type foundry_c2d(value_type x, value_type y) {
1142
#ifdef PARSERTEST
1142
#ifdef PARSERTEST
1143
        return 0;
1143
        return 0;
1144
#else
1144
#else
1145
        // Behavior of FilterFoundry <1.7:
1145
        // Behavior of FilterFoundry <1.7:
1146
        //return foundry_c2d_negated(x,y);
1146
        //return foundry_c2d_negated(x,y);
1147
 
1147
 
1148
        // Behavior in FilterFoundry 1.7+: Matches FilterFactory
1148
        // Behavior in FilterFoundry 1.7+: Matches FilterFactory
1149
        return (value_type)RINT(TO_FFANGLE(atan2(y, x)));
1149
        return (value_type)RINT(TO_FFANGLE(atan2(y, x)));
1150
#endif
1150
#endif
1151
}
1151
}
1152
 
1152
 
1153
value_type ff_c2d(value_type x, value_type y) {
1153
value_type ff_c2d(value_type x, value_type y) {
1154
#ifdef use_filterfactory_implementation_c2d
1154
#ifdef use_filterfactory_implementation_c2d
1155
        return factory_c2d(x, y);
1155
        return factory_c2d(x, y);
1156
#else
1156
#else
1157
        return foundry_c2d(x, y);
1157
        return foundry_c2d(x, y);
1158
#endif
1158
#endif
1159
}
1159
}
1160
 
1160
 
1161
// -------------------------------------------------------------------------------------------
1161
// -------------------------------------------------------------------------------------------
1162
 
1162
 
1163
/* c2m(x,y) Magnitude displacement of the pixel at coordinates x,y */
1163
/* c2m(x,y) Magnitude displacement of the pixel at coordinates x,y */
1164
 
1164
 
1165
value_type factory_c2m(value_type x, value_type y) {
1165
value_type factory_c2m(value_type x, value_type y) {
1166
#ifdef PARSERTEST
1166
#ifdef PARSERTEST
1167
        return 0;
1167
        return 0;
1168
#else
1168
#else
1169
        // https://misc.daniel-marschall.de/projects/filter_factory/function_c2m.html
1169
        // https://misc.daniel-marschall.de/projects/filter_factory/function_c2m.html
1170
        int32_t eax, ebx;
1170
        int32_t eax, ebx;
1171
        ebx = y < 0 ? -y : y;
1171
        ebx = y < 0 ? -y : y;
1172
        eax = x < 0 ? -x : x;
1172
        eax = x < 0 ? -x : x;
1173
        if (eax == ebx) {
1173
        if (eax == ebx) {
1174
                eax = 27146; // 27146/65536 == sqrt(2)-1 == 0.41421356237
1174
                eax = 27146; // 27146/65536 == sqrt(2)-1 == 0.41421356237
1175
        }
1175
        }
1176
        else {
1176
        else {
1177
                if (eax > ebx) {
1177
                if (eax > ebx) {
1178
                        int tmp = eax;
1178
                        int tmp = eax;
1179
                        eax = ebx;
1179
                        eax = ebx;
1180
                        ebx = tmp;
1180
                        ebx = tmp;
1181
                }
1181
                }
1182
                eax = eax << 10;
1182
                eax = eax << 10;
1183
                eax /= ebx;
1183
                eax /= ebx;
1184
                eax = FACTORY_C2M_LOOKUP[eax];
1184
                eax = FACTORY_C2M_LOOKUP[eax];
1185
        }
1185
        }
1186
        eax = ((int64_t)eax * (int64_t)ebx) >> 16;
1186
        eax = ((int64_t)eax * (int64_t)ebx) >> 16;
1187
        eax += ebx;
1187
        eax += ebx;
1188
        return eax;
1188
        return eax;
1189
#endif
1189
#endif
1190
}
1190
}
1191
 
1191
 
1192
value_type foundry_c2m(value_type x, value_type y) {
1192
value_type foundry_c2m(value_type x, value_type y) {
1193
#ifdef PARSERTEST
1193
#ifdef PARSERTEST
1194
        return 0;
1194
        return 0;
1195
#else
1195
#else
1196
        return isqrt((long)x * x + (long)y * y);
1196
        return isqrt((long)x * x + (long)y * y);
1197
#endif
1197
#endif
1198
}
1198
}
1199
 
1199
 
1200
value_type ff_c2m(value_type x, value_type y) {
1200
value_type ff_c2m(value_type x, value_type y) {
1201
#ifdef use_filterfactory_implementation_c2m
1201
#ifdef use_filterfactory_implementation_c2m
1202
        return factory_c2m(x, y);
1202
        return factory_c2m(x, y);
1203
#else
1203
#else
1204
        return foundry_c2m(x, y);
1204
        return foundry_c2m(x, y);
1205
#endif
1205
#endif
1206
}
1206
}
1207
 
1207
 
1208
// -------------------------------------------------------------------------------------------
1208
// -------------------------------------------------------------------------------------------
1209
 
1209
 
1210
/* Direction(angle) of the current pixel from the center of the image,
1210
/* Direction(angle) of the current pixel from the center of the image,
1211
   where d is an integer between -512 and 512 inclusive */
1211
   where d is an integer between -512 and 512 inclusive */
1212
 
1212
 
1213
value_type factory_d() {
1213
value_type factory_d() {
1214
#ifdef PARSERTEST
1214
#ifdef PARSERTEST
1215
        return 0;
1215
        return 0;
1216
#else
1216
#else
1217
        // https://misc.daniel-marschall.de/projects/filter_factory/symbol_d_lowercase.html
1217
        // https://misc.daniel-marschall.de/projects/filter_factory/symbol_d_lowercase.html
1218
 
1218
 
1219
        int eax, ebx, ecx;
1219
        int eax, ebx, ecx;
1220
        const int xmin = 0, ymin = 0;
1220
        const int xmin = 0, ymin = 0;
1221
 
1221
 
1222
        eax = -(var['Y'] - ymin) / 2;
1222
        eax = -(var['Y'] - ymin) / 2;
1223
        ebx = -(var['X'] - xmin) / 2;
1223
        ebx = -(var['X'] - xmin) / 2;
1224
        ecx = 0;
1224
        ecx = 0;
1225
        eax += var['y'];
1225
        eax += var['y'];
1226
        if (eax < 0) {
1226
        if (eax < 0) {
1227
                eax = -eax;
1227
                eax = -eax;
1228
                ecx |= 4/*0b0100*/;
1228
                ecx |= 4/*0b0100*/;
1229
        }
1229
        }
1230
        ebx += var['x'];
1230
        ebx += var['x'];
1231
        if (ebx < 0) {
1231
        if (ebx < 0) {
1232
                ebx = -ebx;
1232
                ebx = -ebx;
1233
                ecx |= 3/*0b0011*/;
1233
                ecx |= 3/*0b0011*/;
1234
        }
1234
        }
1235
        if (eax > ebx) {
1235
        if (eax > ebx) {
1236
                int tmp;
1236
                int tmp;
1237
                ecx ^= 1/*0b0001*/;
1237
                ecx ^= 1/*0b0001*/;
1238
                tmp = eax;
1238
                tmp = eax;
1239
                eax = ebx;
1239
                eax = ebx;
1240
                ebx = tmp;
1240
                ebx = tmp;
1241
        }
1241
        }
1242
        if (eax > 0) {
1242
        if (eax > 0) {
1243
                eax = eax << 10;
1243
                eax = eax << 10;
1244
                eax /= ebx;
1244
                eax /= ebx;
1245
                if (eax != 0) { // C2D_LOOKUP[-1] will never be called. Good!
1245
                if (eax != 0) { // C2D_LOOKUP[-1] will never be called. Good!
1246
                        eax = (eax & 0xFFFF0000) + (FACTORY_C2D_LOOKUP[eax - 1] & 0xFFFF);
1246
                        eax = (eax & 0xFFFF0000) + (FACTORY_C2D_LOOKUP[eax - 1] & 0xFFFF);
1247
                        eax = eax << 9;
1247
                        eax = eax << 9;
1248
                        ebx = 205888; // 205888/65536 == pi == 3.14159265358979323846264338327
1248
                        ebx = 205888; // 205888/65536 == pi == 3.14159265358979323846264338327
1249
                        eax /= ebx;
1249
                        eax /= ebx;
1250
                }
1250
                }
1251
        }
1251
        }
1252
        if ((ecx & 1/*0b0001*/) != 0) {
1252
        if ((ecx & 1/*0b0001*/) != 0) {
1253
                eax = -eax;
1253
                eax = -eax;
1254
                eax += 256;
1254
                eax += 256;
1255
        }
1255
        }
1256
        if ((ecx & 2/*0b0010*/) != 0) {
1256
        if ((ecx & 2/*0b0010*/) != 0) {
1257
                eax += 256;
1257
                eax += 256;
1258
        }
1258
        }
1259
        if ((ecx & 4/*0b0100*/) != 0) {
1259
        if ((ecx & 4/*0b0100*/) != 0) {
1260
                eax = -eax;
1260
                eax = -eax;
1261
        }
1261
        }
1262
        return eax;
1262
        return eax;
1263
#endif
1263
#endif
1264
}
1264
}
1265
 
1265
 
1266
value_type foundry_c2d_negated(int x, int y) {
1266
value_type foundry_c2d_negated(int x, int y) {
1267
#ifdef PARSERTEST
1267
#ifdef PARSERTEST
1268
        return 0;
1268
        return 0;
1269
#else
1269
#else
1270
        return (value_type)RINT(TO_FFANGLE(atan2(-y, -x)));
1270
        return (value_type)RINT(TO_FFANGLE(atan2(-y, -x)));
1271
#endif
1271
#endif
1272
}
1272
}
1273
 
1273
 
1274
value_type foundry_d() {
1274
value_type foundry_d() {
1275
#ifdef PARSERTEST
1275
#ifdef PARSERTEST
1276
        return 0;
1276
        return 0;
1277
#else
1277
#else
1278
        // NOTE: FilterFactory uses c2d(x,y):=atan2(y,x), but d:=atan2(-y,-x)
1278
        // NOTE: FilterFactory uses c2d(x,y):=atan2(y,x), but d:=atan2(-y,-x)
1279
        // Due to compatibility reasons, we implement it the same way!
1279
        // Due to compatibility reasons, we implement it the same way!
1280
        // Sign of y difference is negated, as we are dealing with top-down coordinates angle is "observed"
1280
        // Sign of y difference is negated, as we are dealing with top-down coordinates angle is "observed"
1281
        int x = var['X'] / 2 - var['x'];
1281
        int x = var['X'] / 2 - var['x'];
1282
        int y = var['Y'] / 2 - var['y'];
1282
        int y = var['Y'] / 2 - var['y'];
1283
        return foundry_c2d_negated(x, y);
1283
        return foundry_c2d_negated(x, y);
1284
#endif
1284
#endif
1285
}
1285
}
1286
 
1286
 
1287
value_type ff_d() {
1287
value_type ff_d() {
1288
#ifdef use_filterfactory_implementation_d
1288
#ifdef use_filterfactory_implementation_d
1289
        // Output range: -512 ... 512
1289
        // Output range: -512 ... 512
1290
        return factory_d();
1290
        return factory_d();
1291
#else
1291
#else
1292
        // Output range: -511 ... 512
1292
        // Output range: -511 ... 512
1293
        return foundry_d();
1293
        return foundry_d();
1294
#endif
1294
#endif
1295
}
1295
}
1296
 
1296
 
1297
// -------------------------------------------------------------------------------------------
1297
// -------------------------------------------------------------------------------------------
1298
 
1298
 
1299
/* Range of magnitudes with the image, where M is one half the diagonal size of the image */
1299
/* Range of magnitudes with the image, where M is one half the diagonal size of the image */
1300
 
1300
 
1301
value_type factory_M() {
1301
value_type factory_M() {
1302
#ifdef PARSERTEST
1302
#ifdef PARSERTEST
1303
        return 0;
1303
        return 0;
1304
#else
1304
#else
1305
        // https://misc.daniel-marschall.de/projects/filter_factory/symbol_m_uppercase.html
1305
        // https://misc.daniel-marschall.de/projects/filter_factory/symbol_m_uppercase.html
1306
 
1306
 
1307
        int eax, ebx;
1307
        int eax, ebx;
1308
        const int xmin = 0, ymin = 0;
1308
        const int xmin = 0, ymin = 0;
1309
 
1309
 
1310
        eax = (var['X'] - xmin) >> 1;
1310
        eax = (var['X'] - xmin) >> 1;
1311
        ebx = (var['Y'] - ymin) >> 1;
1311
        ebx = (var['Y'] - ymin) >> 1;
1312
        if (eax == ebx) {
1312
        if (eax == ebx) {
1313
                eax = 27146; // 27146/65536 == sqrt(2)-1 == 0.41421356237
1313
                eax = 27146; // 27146/65536 == sqrt(2)-1 == 0.41421356237
1314
        }
1314
        }
1315
        else {
1315
        else {
1316
                if (eax > ebx) {
1316
                if (eax > ebx) {
1317
                        int tmp = eax;
1317
                        int tmp = eax;
1318
                        eax = ebx;
1318
                        eax = ebx;
1319
                        ebx = tmp;
1319
                        ebx = tmp;
1320
                }
1320
                }
1321
                eax = eax << 10;
1321
                eax = eax << 10;
1322
                eax /= ebx;
1322
                eax /= ebx;
1323
                eax = FACTORY_C2M_LOOKUP[eax];
1323
                eax = FACTORY_C2M_LOOKUP[eax];
1324
        }
1324
        }
1325
        eax = ((int64_t)eax * (int64_t)ebx) >> 16;
1325
        eax = ((int64_t)eax * (int64_t)ebx) >> 16;
1326
        eax += ebx;
1326
        eax += ebx;
1327
        return eax;
1327
        return eax;
1328
#endif
1328
#endif
1329
}
1329
}
1330
 
1330
 
1331
value_type foundry_M() {
1331
value_type foundry_M() {
1332
#ifdef PARSERTEST
1332
#ifdef PARSERTEST
1333
        return 0;
1333
        return 0;
1334
#else
1334
#else
1335
        return foundry_c2m(var['X'], var['Y']) / 2;
1335
        return foundry_c2m(var['X'], var['Y']) / 2;
1336
#endif
1336
#endif
1337
}
1337
}
1338
 
1338
 
1339
value_type ff_M() {
1339
value_type ff_M() {
1340
#ifdef use_filterfactory_implementation_M
1340
#ifdef use_filterfactory_implementation_M
1341
        return factory_M();
1341
        return factory_M();
1342
#else
1342
#else
1343
        return foundry_M();
1343
        return foundry_M();
1344
#endif
1344
#endif
1345
}
1345
}
1346
 
1346
 
1347
// -------------------------------------------------------------------------------------------
1347
// -------------------------------------------------------------------------------------------
1348
 
1348
 
1349
/* Distance (magnitude) from the center of the image to the current pixel */
1349
/* Distance (magnitude) from the center of the image to the current pixel */
1350
 
1350
 
1351
value_type factory_m() {
1351
value_type factory_m() {
1352
#ifdef PARSERTEST
1352
#ifdef PARSERTEST
1353
        return 0;
1353
        return 0;
1354
#else
1354
#else
1355
        // https://misc.daniel-marschall.de/projects/filter_factory/symbol_m_lowercase.html
1355
        // https://misc.daniel-marschall.de/projects/filter_factory/symbol_m_lowercase.html
1356
 
1356
 
1357
        int eax, ebx;
1357
        int eax, ebx;
1358
        const int xmin = 0, ymin = 0;
1358
        const int xmin = 0, ymin = 0;
1359
 
1359
 
1360
        eax = ((xmin - var['X']) >> 1) + var['x'];
1360
        eax = ((xmin - var['X']) >> 1) + var['x'];
1361
        ebx = ((ymin - var['Y']) >> 1) + var['y'];
1361
        ebx = ((ymin - var['Y']) >> 1) + var['y'];
1362
        eax = eax < 0 ? -eax : eax;
1362
        eax = eax < 0 ? -eax : eax;
1363
        ebx = ebx < 0 ? -ebx : ebx;
1363
        ebx = ebx < 0 ? -ebx : ebx;
1364
 
1364
 
1365
        if (eax == ebx) {
1365
        if (eax == ebx) {
1366
                eax = 27146; // 27146/65536 == sqrt(2)-1 == 0.41421356237
1366
                eax = 27146; // 27146/65536 == sqrt(2)-1 == 0.41421356237
1367
        }
1367
        }
1368
        else {
1368
        else {
1369
                if (eax > ebx) {
1369
                if (eax > ebx) {
1370
                        int tmp = eax;
1370
                        int tmp = eax;
1371
                        eax = ebx;
1371
                        eax = ebx;
1372
                        ebx = tmp;
1372
                        ebx = tmp;
1373
                }
1373
                }
1374
                eax = FACTORY_C2M_LOOKUP[1024 * eax / ebx];
1374
                eax = FACTORY_C2M_LOOKUP[1024 * eax / ebx];
1375
        }
1375
        }
1376
        eax = ((int64_t)eax * (int64_t)ebx) >> 16;
1376
        eax = ((int64_t)eax * (int64_t)ebx) >> 16;
1377
        eax += ebx;
1377
        eax += ebx;
1378
        return eax;
1378
        return eax;
1379
#endif
1379
#endif
1380
}
1380
}
1381
 
1381
 
1382
value_type foundry_m() {
1382
value_type foundry_m() {
1383
#ifdef PARSERTEST
1383
#ifdef PARSERTEST
1384
        return 0;
1384
        return 0;
1385
#else
1385
#else
1386
        return foundry_c2m(var['X'] / 2 - var['x'], var['Y'] / 2 - var['y']);
1386
        return foundry_c2m(var['X'] / 2 - var['x'], var['Y'] / 2 - var['y']);
1387
#endif
1387
#endif
1388
}
1388
}
1389
 
1389
 
1390
value_type ff_m() {
1390
value_type ff_m() {
1391
#ifdef use_filterfactory_implementation_m
1391
#ifdef use_filterfactory_implementation_m
1392
        return factory_m();
1392
        return factory_m();
1393
#else
1393
#else
1394
        return foundry_m();
1394
        return foundry_m();
1395
#endif
1395
#endif
1396
}
1396
}
1397
 
1397
 
1398
// -------------------------------------------------------------------------------------------
1398
// -------------------------------------------------------------------------------------------
1399
 
1399
 
1400
/* "Y" value of the YUV color-space */
1400
/* "Y" value of the YUV color-space */
1401
 
1401
 
1402
value_type factory_i() {
1402
value_type factory_i() {
1403
#ifdef PARSERTEST
1403
#ifdef PARSERTEST
1404
        return 0;
1404
        return 0;
1405
#else
1405
#else
1406
        return ((76L * var['r']) + (150L * var['g']) + (29L * var['b'])) / 256; // range: [0..254]
1406
        return ((76L * var['r']) + (150L * var['g']) + (29L * var['b'])) / 256; // range: [0..254]
1407
#endif
1407
#endif
1408
}
1408
}
1409
 
1409
 
1410
value_type foundry_i() {
1410
value_type foundry_i() {
1411
#ifdef PARSERTEST
1411
#ifdef PARSERTEST
1412
        return 0;
1412
        return 0;
1413
#else
1413
#else
1414
        // These formulas are more accurate, e.g. pure white has now i=255 instead of 254
1414
        // These formulas are more accurate, e.g. pure white has now i=255 instead of 254
1415
        return ((299L * var['r']) + (587L * var['g']) + (114L * var['b'])) / 1000;    // range: [0..255]
1415
        return ((299L * var['r']) + (587L * var['g']) + (114L * var['b'])) / 1000;    // range: [0..255]
1416
#endif
1416
#endif
1417
}
1417
}
1418
 
1418
 
1419
value_type ff_i() {
1419
value_type ff_i() {
1420
#ifdef use_filterfactory_implementation_i
1420
#ifdef use_filterfactory_implementation_i
1421
        return factory_i();
1421
        return factory_i();
1422
#else
1422
#else
1423
        return foundry_i();
1423
        return foundry_i();
1424
#endif
1424
#endif
1425
}
1425
}
1426
 
1426
 
1427
// -------------------------------------------------------------------------------------------
1427
// -------------------------------------------------------------------------------------------
1428
 
1428
 
1429
/* "U" value of the YUV color-space */
1429
/* "U" value of the YUV color-space */
1430
 
1430
 
1431
value_type factory_u() {
1431
value_type factory_u() {
1432
#ifdef PARSERTEST
1432
#ifdef PARSERTEST
1433
        return 0;
1433
        return 0;
1434
#else
1434
#else
1435
        return ((-19L * var['r']) + (-37L * var['g']) + (56L * var['b'])) / 256; // range: [-55..55]
1435
        return ((-19L * var['r']) + (-37L * var['g']) + (56L * var['b'])) / 256; // range: [-55..55]
1436
#endif
1436
#endif
1437
}
1437
}
1438
 
1438
 
1439
value_type foundry_u() {
1439
value_type foundry_u() {
1440
#ifdef PARSERTEST
1440
#ifdef PARSERTEST
1441
        return 0;
1441
        return 0;
1442
#else
1442
#else
1443
        // These formulas are more accurate, e.g. pure white has now i=255 instead of 254
1443
        // These formulas are more accurate, e.g. pure white has now i=255 instead of 254
1444
        return ((-147407L * var['r']) + (-289391L * var['g']) + (436798L * var['b'])) / 2000000; // range: [-55..55]
1444
        return ((-147407L * var['r']) + (-289391L * var['g']) + (436798L * var['b'])) / 2000000; // range: [-55..55]
1445
#endif
1445
#endif
1446
}
1446
}
1447
 
1447
 
1448
value_type ff_u() {
1448
value_type ff_u() {
1449
#ifdef use_filterfactory_implementation_u
1449
#ifdef use_filterfactory_implementation_u
1450
        return factory_u();
1450
        return factory_u();
1451
#else
1451
#else
1452
        return foundry_u();
1452
        return foundry_u();
1453
#endif
1453
#endif
1454
}
1454
}
1455
 
1455
 
1456
// -------------------------------------------------------------------------------------------
1456
// -------------------------------------------------------------------------------------------
1457
 
1457
 
1458
/* "V" value of the YUV color-space */
1458
/* "V" value of the YUV color-space */
1459
 
1459
 
1460
value_type factory_v() {
1460
value_type factory_v() {
1461
#ifdef PARSERTEST
1461
#ifdef PARSERTEST
1462
        return 0;
1462
        return 0;
1463
#else
1463
#else
1464
        return ((78L * var['r']) + (-65L * var['g']) + (-13L * var['b'])) / 256; // range: [-77..77]
1464
        return ((78L * var['r']) + (-65L * var['g']) + (-13L * var['b'])) / 256; // range: [-77..77]
1465
#endif
1465
#endif
1466
}
1466
}
1467
 
1467
 
1468
value_type foundry_v() {
1468
value_type foundry_v() {
1469
#ifdef PARSERTEST
1469
#ifdef PARSERTEST
1470
        return 0;
1470
        return 0;
1471
#else
1471
#else
1472
        // These formulas are more accurate, e.g. pure white has now i=255 instead of 254
1472
        // These formulas are more accurate, e.g. pure white has now i=255 instead of 254
1473
        return ((614777L * var['r']) + (-514799L * var['g']) + (-99978L * var['b'])) / 2000000; // range: [-78..78]
1473
        return ((614777L * var['r']) + (-514799L * var['g']) + (-99978L * var['b'])) / 2000000; // range: [-78..78]
1474
#endif
1474
#endif
1475
}
1475
}
1476
 
1476
 
1477
value_type ff_v() {
1477
value_type ff_v() {
1478
#ifdef use_filterfactory_implementation_v
1478
#ifdef use_filterfactory_implementation_v
1479
        return factory_v();
1479
        return factory_v();
1480
#else
1480
#else
1481
        return foundry_v();
1481
        return foundry_v();
1482
#endif
1482
#endif
1483
}
1483
}
1484
 
1484
 
1485
// -------------------------------------------------------------------------------------------
1485
// -------------------------------------------------------------------------------------------
1486
 
1486
 
1487
/* get(i) Returns the current cell value at i */
1487
/* get(i) Returns the current cell value at i */
1488
 
1488
 
1489
value_type factory_get(value_type i) {
1489
value_type factory_get(value_type i) {
1490
#ifdef PARSERTEST
1490
#ifdef PARSERTEST
1491
        return 0;
1491
        return 0;
1492
#else
1492
#else
1493
        return i >= 0 && i < NUM_CELLS ? cell[i] : i;
1493
        return i >= 0 && i < NUM_CELLS ? cell[i] : i;
1494
#endif
1494
#endif
1495
}
1495
}
1496
 
1496
 
1497
value_type foundry_get(value_type i) {
1497
value_type foundry_get(value_type i) {
1498
#ifdef PARSERTEST
1498
#ifdef PARSERTEST
1499
        return 0;
1499
        return 0;
1500
#else
1500
#else
1501
        return i >= 0 && i < NUM_CELLS ? cell[i] : 0;
1501
        return i >= 0 && i < NUM_CELLS ? cell[i] : 0;
1502
#endif
1502
#endif
1503
}
1503
}
1504
 
1504
 
1505
value_type ff_get(value_type i) {
1505
value_type ff_get(value_type i) {
1506
        // The only difference is the handling of invalid values of "i"
1506
        // The only difference is the handling of invalid values of "i"
1507
#ifdef use_filterfactory_implementation_get
1507
#ifdef use_filterfactory_implementation_get
1508
        return factory_get(i);
1508
        return factory_get(i);
1509
#else
1509
#else
1510
        return foundry_get(i);
1510
        return foundry_get(i);
1511
#endif
1511
#endif
1512
}
1512
}
1513
 
1513
 
1514
// -------------------------------------------------------------------------------------------
1514
// -------------------------------------------------------------------------------------------
1515
 
1515
 
1516
/* put(v,i) Puts the new value v into cell i */
1516
/* put(v,i) Puts the new value v into cell i */
1517
value_type ff_put(value_type v, value_type i) {
1517
value_type ff_put(value_type v, value_type i) {
1518
#ifdef PARSERTEST
1518
#ifdef PARSERTEST
1519
        return 0;
1519
        return 0;
1520
#else
1520
#else
1521
        if (i >= 0 && i < NUM_CELLS)
1521
        if (i >= 0 && i < NUM_CELLS)
1522
                cell[i] = v;
1522
                cell[i] = v;
1523
        return v;
1523
        return v;
1524
#endif
1524
#endif
1525
}
1525
}
1526
 
1526
 
1527
// -------------------------------------------------------------------------------------------
1527
// -------------------------------------------------------------------------------------------
1528
 
1528
 
1529
/* Convolve. Applies a convolution matrix and divides with d. */
1529
/* Convolve. Applies a convolution matrix and divides with d. */
1530
value_type ff_cnv(value_type m11, value_type m12, value_type m13,
1530
value_type ff_cnv(value_type m11, value_type m12, value_type m13,
1531
        value_type m21, value_type m22, value_type m23,
1531
        value_type m21, value_type m22, value_type m23,
1532
        value_type m31, value_type m32, value_type m33,
1532
        value_type m31, value_type m32, value_type m33,
1533
        value_type d)
1533
        value_type d)
1534
{
1534
{
1535
#ifdef PARSERTEST
1535
#ifdef PARSERTEST
1536
        return 0;
1536
        return 0;
1537
#else
1537
#else
1538
        long total;
1538
        long total;
1539
        int x, y, z;
1539
        int x, y, z;
1540
 
1540
 
1541
        if (d == 0) return 0;
1541
        if (d == 0) return 0;
1542
 
1542
 
1543
        // shift x,y from selection-relative to image relative required by rawsrc()
1543
        // shift x,y from selection-relative to image relative required by rawsrc()
1544
        if (HAS_BIG_DOC(gpb)) {
1544
        if (HAS_BIG_DOC(gpb)) {
1545
                x = var['x'] + BIGDOC_FILTER_RECT(gpb).left;
1545
                x = var['x'] + BIGDOC_FILTER_RECT(gpb).left;
1546
                y = var['y'] + BIGDOC_FILTER_RECT(gpb).top;
1546
                y = var['y'] + BIGDOC_FILTER_RECT(gpb).top;
1547
        } else {
1547
        } else {
1548
                x = var['x'] + FILTER_RECT(gpb).left;
1548
                x = var['x'] + FILTER_RECT(gpb).left;
1549
                y = var['y'] + FILTER_RECT(gpb).top;
1549
                y = var['y'] + FILTER_RECT(gpb).top;
1550
        }
1550
        }
1551
        z = var['z'];
1551
        z = var['z'];
1552
 
1552
 
1553
        // rawsrc() will choose the neighbor pixels if x/y goes out-of-bounds (outer border pixels)
1553
        // rawsrc() will choose the neighbor pixels if x/y goes out-of-bounds (outer border pixels)
1554
        if (z >= 0 && z < var['Z'])
1554
        if (z >= 0 && z < var['Z'])
1555
                total = m11 * rawsrc(x - 1, y - 1, z) + m12 * rawsrc(x, y - 1, z) + m13 * rawsrc(x + 1, y - 1, z)
1555
                total = m11 * rawsrc(x - 1, y - 1, z) + m12 * rawsrc(x, y - 1, z) + m13 * rawsrc(x + 1, y - 1, z)
1556
                + m21 * rawsrc(x - 1, y, z) + m22 * rawsrc(x, y, z) + m23 * rawsrc(x + 1, y, z)
1556
                + m21 * rawsrc(x - 1, y, z) + m22 * rawsrc(x, y, z) + m23 * rawsrc(x + 1, y, z)
1557
                + m31 * rawsrc(x - 1, y + 1, z) + m32 * rawsrc(x, y + 1, z) + m33 * rawsrc(x + 1, y + 1, z);
1557
                + m31 * rawsrc(x - 1, y + 1, z) + m32 * rawsrc(x, y + 1, z) + m33 * rawsrc(x + 1, y + 1, z);
1558
        else
1558
        else
1559
                total = 0; // ... can this happen at all ?!
1559
                total = 0; // ... can this happen at all ?!
1560
 
1560
 
1561
        return total / d;
1561
        return total / d;
1562
#endif
1562
#endif
1563
}
1563
}
1564
 
1564
 
1565
// -------------------------------------------------------------------------------------------
1565
// -------------------------------------------------------------------------------------------
1566
 
1566
 
1567
value_type zero_val = 0;
1567
value_type zero_val = 0;
1568
value_type one_val = 1;
1568
value_type one_val = 1;
1569
 
1569
 
1570
value_type min_val_i = 0;
1570
value_type min_val_i = 0;
1571
value_type max_val_i = 255;
1571
value_type max_val_i = 255;
1572
value_type val_I = 255;
1572
value_type val_I = 255;
1573
 
1573
 
1574
#ifdef use_filterfactory_implementation_u_minmax
1574
#ifdef use_filterfactory_implementation_u_minmax
1575
value_type min_val_u = 0;
1575
value_type min_val_u = 0;
1576
value_type max_val_u = 255;
1576
value_type max_val_u = 255;
1577
#else
1577
#else
1578
value_type min_val_u = -55;
1578
value_type min_val_u = -55;
1579
value_type max_val_u = 55;
1579
value_type max_val_u = 55;
1580
#endif
1580
#endif
1581
 
1581
 
1582
#ifdef use_filterfactory_implementation_U
1582
#ifdef use_filterfactory_implementation_U
1583
value_type val_U = 255;
1583
value_type val_U = 255;
1584
#else
1584
#else
1585
value_type val_U = 110; // max_val_u - min_val_u;
1585
value_type val_U = 110; // max_val_u - min_val_u;
1586
#endif
1586
#endif
1587
 
1587
 
1588
#ifdef use_filterfactory_implementation_v_minmax
1588
#ifdef use_filterfactory_implementation_v_minmax
1589
value_type min_val_v = 0;
1589
value_type min_val_v = 0;
1590
value_type max_val_v = 255;
1590
value_type max_val_v = 255;
1591
#else
1591
#else
1592
value_type min_val_v = -78;
1592
value_type min_val_v = -78;
1593
value_type max_val_v = 78;
1593
value_type max_val_v = 78;
1594
#endif
1594
#endif
1595
 
1595
 
1596
#ifdef use_filterfactory_implementation_V
1596
#ifdef use_filterfactory_implementation_V
1597
value_type val_V = 255;
1597
value_type val_V = 255;
1598
#else
1598
#else
1599
value_type val_V = 156; // max_val_v - min_val_v;
1599
value_type val_V = 156; // max_val_v - min_val_v;
1600
#endif
1600
#endif
1601
 
1601
 
1602
#ifdef use_filterfactory_implementation_d_minmax
1602
#ifdef use_filterfactory_implementation_d_minmax
1603
value_type min_val_d = 0;
1603
value_type min_val_d = 0;
1604
value_type max_val_d = 1024;
1604
value_type max_val_d = 1024;
1605
#else
1605
#else
1606
value_type min_val_d = -512;
1606
value_type min_val_d = -512;
1607
value_type max_val_d = 512;
1607
value_type max_val_d = 512;
1608
#endif
1608
#endif
1609
 
1609
 
1610
#ifdef use_filterfactory_implementation_D
1610
#ifdef use_filterfactory_implementation_D
1611
value_type val_D = 1024;
1611
value_type val_D = 1024;
1612
#else
1612
#else
1613
value_type val_D = 1024; // max_val_d - min_val_d;
1613
value_type val_D = 1024; // max_val_d - min_val_d;
1614
#endif
1614
#endif
1615
 
1615
 
1616
/* predefined symbols */
1616
/* predefined symbols */
1617
struct sym_rec predefs[] = {
1617
struct sym_rec predefs[] = {
1618
        /* functions */
1618
        /* functions */
1619
 
1619
 
1620
        {0,TOK_FN3,"src", (pfunc_type)ff_src, 0},
1620
        {0,TOK_FN3,"src", (pfunc_type)ff_src, 0},
1621
        {0,TOK_FN3,"rad", (pfunc_type)ff_rad, 0},
1621
        {0,TOK_FN3,"rad", (pfunc_type)ff_rad, 0},
1622
        {0,TOK_FN1,"ctl", (pfunc_type)ff_ctl, 0},
1622
        {0,TOK_FN1,"ctl", (pfunc_type)ff_ctl, 0},
1623
        {0,TOK_FN3,"val", (pfunc_type)ff_val, 0},
1623
        {0,TOK_FN3,"val", (pfunc_type)ff_val, 0},
1624
        {0,TOK_FN2,"map", (pfunc_type)ff_map, 0},
1624
        {0,TOK_FN2,"map", (pfunc_type)ff_map, 0},
1625
        {0,TOK_FN2,"min", (pfunc_type)ff_min, 0},
1625
        {0,TOK_FN2,"min", (pfunc_type)ff_min, 0},
1626
        {0,TOK_FN2,"max", (pfunc_type)ff_max, 0},
1626
        {0,TOK_FN2,"max", (pfunc_type)ff_max, 0},
1627
        {0,TOK_FN1,"abs", (pfunc_type)ff_abs, 0},
1627
        {0,TOK_FN1,"abs", (pfunc_type)ff_abs, 0},
1628
        {0,TOK_FN3,"add", (pfunc_type)ff_add, 0},
1628
        {0,TOK_FN3,"add", (pfunc_type)ff_add, 0},
1629
        {0,TOK_FN3,"sub", (pfunc_type)ff_sub, 0},
1629
        {0,TOK_FN3,"sub", (pfunc_type)ff_sub, 0},
1630
        {0,TOK_FN2,"dif", (pfunc_type)ff_dif, 0},
1630
        {0,TOK_FN2,"dif", (pfunc_type)ff_dif, 0},
1631
        {0,TOK_FN2,"rnd", (pfunc_type)ff_rnd, 0},
1631
        {0,TOK_FN2,"rnd", (pfunc_type)ff_rnd, 0},
1632
        {0,TOK_FN4,"mix", (pfunc_type)ff_mix, 0},
1632
        {0,TOK_FN4,"mix", (pfunc_type)ff_mix, 0},
1633
        {0,TOK_FN5,"scl", (pfunc_type)ff_scl, 0},
1633
        {0,TOK_FN5,"scl", (pfunc_type)ff_scl, 0},
1634
        {0,TOK_FN1,"sqr", (pfunc_type)ff_sqr, 0},
1634
        {0,TOK_FN1,"sqr", (pfunc_type)ff_sqr, 0},
1635
        {0,TOK_FN1,"sqrt", (pfunc_type)ff_sqr, 0}, // sqrt() is synonym to sqr() in Premiere
1635
        {0,TOK_FN1,"sqrt", (pfunc_type)ff_sqr, 0}, // sqrt() is synonym to sqr() in Premiere
1636
        {0,TOK_FN1,"sin", (pfunc_type)ff_sin, 0},
1636
        {0,TOK_FN1,"sin", (pfunc_type)ff_sin, 0},
1637
        {0,TOK_FN1,"cos", (pfunc_type)ff_cos, 0},
1637
        {0,TOK_FN1,"cos", (pfunc_type)ff_cos, 0},
1638
        {0,TOK_FN1,"tan", (pfunc_type)ff_tan, 0},
1638
        {0,TOK_FN1,"tan", (pfunc_type)ff_tan, 0},
1639
        {0,TOK_FN2,"r2x", (pfunc_type)ff_r2x, 0},
1639
        {0,TOK_FN2,"r2x", (pfunc_type)ff_r2x, 0},
1640
        {0,TOK_FN2,"r2y", (pfunc_type)ff_r2y, 0},
1640
        {0,TOK_FN2,"r2y", (pfunc_type)ff_r2y, 0},
1641
        {0,TOK_FN2,"c2d", (pfunc_type)ff_c2d, 0},
1641
        {0,TOK_FN2,"c2d", (pfunc_type)ff_c2d, 0},
1642
        {0,TOK_FN2,"c2m", (pfunc_type)ff_c2m, 0},
1642
        {0,TOK_FN2,"c2m", (pfunc_type)ff_c2m, 0},
1643
        {0,TOK_FN1,"get", (pfunc_type)ff_get, 0},
1643
        {0,TOK_FN1,"get", (pfunc_type)ff_get, 0},
1644
        {0,TOK_FN2,"put", (pfunc_type)ff_put, 0},
1644
        {0,TOK_FN2,"put", (pfunc_type)ff_put, 0},
1645
        {0,TOK_FN10,"cnv",(pfunc_type)ff_cnv, 0},
1645
        {0,TOK_FN10,"cnv",(pfunc_type)ff_cnv, 0},
1646
        {0,TOK_FN1,"rst", (pfunc_type)ff_rst, 0}, // undocumented FilterFactory function
1646
        {0,TOK_FN1,"rst", (pfunc_type)ff_rst, 0}, // undocumented FilterFactory function
1647
        {0,TOK_FN2,"pow", (pfunc_type)ff_pow, 0}, // new function, also added in inofficial Filter Factory 3.1.0 patch
1647
        {0,TOK_FN2,"pow", (pfunc_type)ff_pow, 0}, // new function, also added in inofficial Filter Factory 3.1.0 patch
1648
 
1648
 
1649
        /* Predefined variables (names with more than 1 character); most of them are undocumented in Filter Factory */
1649
        /* Predefined variables (names with more than 1 character); most of them are undocumented in Filter Factory */
1650
        /* The predefined variables with 1 character are defined in lexer.l and process.c */
1650
        /* The predefined variables with 1 character are defined in lexer.l and process.c */
1651
        /* In this table, you must not add TOK_VAR with only 1 character (since this case is not defined in parser.y) */
1651
        /* In this table, you must not add TOK_VAR with only 1 character (since this case is not defined in parser.y) */
1652
 
1652
 
1653
        {0,TOK_VAR,"rmax",0, &var['R']}, // alias of R (defined in lexer.l and set by process.c)
1653
        {0,TOK_VAR,"rmax",0, &var['R']}, // alias of R (defined in lexer.l and set by process.c)
1654
        {0,TOK_VAR,"gmax",0, &var['G']}, // alias of G (defined in lexer.l and set by process.c)
1654
        {0,TOK_VAR,"gmax",0, &var['G']}, // alias of G (defined in lexer.l and set by process.c)
1655
        {0,TOK_VAR,"bmax",0, &var['B']}, // alias of B (defined in lexer.l and set by process.c)
1655
        {0,TOK_VAR,"bmax",0, &var['B']}, // alias of B (defined in lexer.l and set by process.c)
1656
        {0,TOK_VAR,"amax",0, &var['A']}, // alias of A (defined in lexer.l and set by process.c)
1656
        {0,TOK_VAR,"amax",0, &var['A']}, // alias of A (defined in lexer.l and set by process.c)
1657
        {0,TOK_VAR,"cmax",0, &var['C']}, // alias of C (defined in lexer.l and set by process.c)
1657
        {0,TOK_VAR,"cmax",0, &var['C']}, // alias of C (defined in lexer.l and set by process.c)
1658
        {0,TOK_VAR,"imax",0, &max_val_i},
1658
        {0,TOK_VAR,"imax",0, &max_val_i},
1659
        {0,TOK_VAR,"umax",0, &max_val_u},
1659
        {0,TOK_VAR,"umax",0, &max_val_u},
1660
        {0,TOK_VAR,"vmax",0, &max_val_v},
1660
        {0,TOK_VAR,"vmax",0, &max_val_v},
1661
        {0,TOK_VAR,"dmax",0, &max_val_d},
1661
        {0,TOK_VAR,"dmax",0, &max_val_d},
1662
        {0,TOK_VAR,"mmax",0, &var['M']}, // alias of M (defined in lexer.l and set by process.c)
1662
        {0,TOK_VAR,"mmax",0, &var['M']}, // alias of M (defined in lexer.l and set by process.c)
1663
        {0,TOK_VAR,"pmax",0, &var['Z']}, // alias of P (defined in lexer.l and set by process.c)
1663
        {0,TOK_VAR,"pmax",0, &var['Z']}, // alias of P (defined in lexer.l and set by process.c)
1664
        {0,TOK_VAR,"xmax",0, &var['X']}, // alias of X (defined in lexer.l and set by process.c)
1664
        {0,TOK_VAR,"xmax",0, &var['X']}, // alias of X (defined in lexer.l and set by process.c)
1665
        {0,TOK_VAR,"ymax",0, &var['Y']}, // alias of Y (defined in lexer.l and set by process.c)
1665
        {0,TOK_VAR,"ymax",0, &var['Y']}, // alias of Y (defined in lexer.l and set by process.c)
1666
        {0,TOK_VAR,"zmax",0, &var['Z']}, // alias of Z (defined in lexer.l and set by process.c)
1666
        {0,TOK_VAR,"zmax",0, &var['Z']}, // alias of Z (defined in lexer.l and set by process.c)
1667
 
1667
 
1668
        {0,TOK_VAR,"rmin",0, &zero_val},
1668
        {0,TOK_VAR,"rmin",0, &zero_val},
1669
        {0,TOK_VAR,"gmin",0, &zero_val},
1669
        {0,TOK_VAR,"gmin",0, &zero_val},
1670
        {0,TOK_VAR,"bmin",0, &zero_val},
1670
        {0,TOK_VAR,"bmin",0, &zero_val},
1671
        {0,TOK_VAR,"amin",0, &zero_val},
1671
        {0,TOK_VAR,"amin",0, &zero_val},
1672
        {0,TOK_VAR,"cmin",0, &zero_val},
1672
        {0,TOK_VAR,"cmin",0, &zero_val},
1673
        {0,TOK_VAR,"imin",0, &min_val_i},
1673
        {0,TOK_VAR,"imin",0, &min_val_i},
1674
        {0,TOK_VAR,"umin",0, &min_val_u},
1674
        {0,TOK_VAR,"umin",0, &min_val_u},
1675
        {0,TOK_VAR,"vmin",0, &min_val_v},
1675
        {0,TOK_VAR,"vmin",0, &min_val_v},
1676
        {0,TOK_VAR,"dmin",0, &min_val_d},
1676
        {0,TOK_VAR,"dmin",0, &min_val_d},
1677
        {0,TOK_VAR,"mmin",0, &zero_val},
1677
        {0,TOK_VAR,"mmin",0, &zero_val},
1678
        {0,TOK_VAR,"pmin",0, &zero_val},
1678
        {0,TOK_VAR,"pmin",0, &zero_val},
1679
        {0,TOK_VAR,"xmin",0, &zero_val},
1679
        {0,TOK_VAR,"xmin",0, &zero_val},
1680
        {0,TOK_VAR,"ymin",0, &zero_val},
1680
        {0,TOK_VAR,"ymin",0, &zero_val},
1681
        {0,TOK_VAR,"zmin",0, &zero_val},
1681
        {0,TOK_VAR,"zmin",0, &zero_val},
1682
 
1682
 
1683
        /* Undocumented synonyms of FilterFactory for compatibility with Premiere */
1683
        /* Undocumented synonyms of FilterFactory for compatibility with Premiere */
1684
        {0,TOK_FN10,"cnv0",(pfunc_type)ff_cnv, 0},
1684
        {0,TOK_FN10,"cnv0",(pfunc_type)ff_cnv, 0},
1685
        {0,TOK_FN3,"src0", (pfunc_type)ff_src, 0},
1685
        {0,TOK_FN3,"src0", (pfunc_type)ff_src, 0},
1686
        {0,TOK_FN3,"rad0", (pfunc_type)ff_rad, 0},
1686
        {0,TOK_FN3,"rad0", (pfunc_type)ff_rad, 0},
1687
        {0,TOK_FN10,"cnv1",(pfunc_type)ff_cnv, 0},
1687
        {0,TOK_FN10,"cnv1",(pfunc_type)ff_cnv, 0},
1688
        {0,TOK_FN3,"src1", (pfunc_type)ff_src, 0},
1688
        {0,TOK_FN3,"src1", (pfunc_type)ff_src, 0},
1689
        {0,TOK_FN3,"rad1", (pfunc_type)ff_rad, 0},
1689
        {0,TOK_FN3,"rad1", (pfunc_type)ff_rad, 0},
1690
        {0,TOK_VAR,"r0",0, &var['r']},
1690
        {0,TOK_VAR,"r0",0, &var['r']},
1691
        {0,TOK_VAR,"g0",0, &var['g']},
1691
        {0,TOK_VAR,"g0",0, &var['g']},
1692
        {0,TOK_VAR,"b0",0, &var['b']},
1692
        {0,TOK_VAR,"b0",0, &var['b']},
1693
        {0,TOK_VAR,"a0",0, &var['a']},
1693
        {0,TOK_VAR,"a0",0, &var['a']},
1694
        {0,TOK_VAR,"c0",0, &var['c']},
1694
        {0,TOK_VAR,"c0",0, &var['c']},
1695
        {0,TOK_VAR,"i0",0, &var['i']},
1695
        {0,TOK_VAR,"i0",0, &var['i']},
1696
        {0,TOK_VAR,"u0",0, &var['u']},
1696
        {0,TOK_VAR,"u0",0, &var['u']},
1697
        {0,TOK_VAR,"v0",0, &var['v']},
1697
        {0,TOK_VAR,"v0",0, &var['v']},
1698
        {0,TOK_VAR,"d0",0, &var['d']},
1698
        {0,TOK_VAR,"d0",0, &var['d']},
1699
        {0,TOK_VAR,"m0",0, &var['m']},
1699
        {0,TOK_VAR,"m0",0, &var['m']},
1700
        {0,TOK_VAR,"r1",0, &var['r']},
1700
        {0,TOK_VAR,"r1",0, &var['r']},
1701
        {0,TOK_VAR,"g1",0, &var['g']},
1701
        {0,TOK_VAR,"g1",0, &var['g']},
1702
        {0,TOK_VAR,"b1",0, &var['b']},
1702
        {0,TOK_VAR,"b1",0, &var['b']},
1703
        {0,TOK_VAR,"a1",0, &var['a']},
1703
        {0,TOK_VAR,"a1",0, &var['a']},
1704
        {0,TOK_VAR,"c1",0, &var['c']},
1704
        {0,TOK_VAR,"c1",0, &var['c']},
1705
        {0,TOK_VAR,"i1",0, &var['i']},
1705
        {0,TOK_VAR,"i1",0, &var['i']},
1706
        {0,TOK_VAR,"u1",0, &var['u']},
1706
        {0,TOK_VAR,"u1",0, &var['u']},
1707
        {0,TOK_VAR,"v1",0, &var['v']},
1707
        {0,TOK_VAR,"v1",0, &var['v']},
1708
        {0,TOK_VAR,"d1",0, &var['d']},
1708
        {0,TOK_VAR,"d1",0, &var['d']},
1709
        {0,TOK_VAR,"m1",0, &var['m']},
1709
        {0,TOK_VAR,"m1",0, &var['m']},
1710
        {0,TOK_VAR,"tmin",0, &zero_val},
1710
        {0,TOK_VAR,"tmin",0, &zero_val},
1711
        {0,TOK_VAR,"tmax",0, &one_val},
1711
        {0,TOK_VAR,"tmax",0, &one_val},
1712
        {0,TOK_VAR,"total",0, &one_val},
1712
        {0,TOK_VAR,"total",0, &one_val},
1713
 
1713
 
1714
        {0,0,0,0,0}
1714
        {0,0,0,0,0}
1715
};
1715
};
1716
 
1716