Subversion Repositories filter_foundry

Rev

Rev 294 | Rev 296 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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