Subversion Repositories filter_foundry

Rev

Rev 503 | Rev 536 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 503 Rev 532
Line 257... Line 257...
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(void) {
263
#ifdef PARSERTEST
263
#ifdef PARSERTEST
264
        return;
264
        return;
265
#else
265
#else
266
        int i;
266
        int i;
267
 
267
 
Line 810... Line 810...
810
#endif
810
#endif
811
}
811
}
812
 
812
 
813
// -------------------------------------------------------------------------------------------
813
// -------------------------------------------------------------------------------------------
814
 
814
 
815
void factory_initialize_rnd_variables() {
815
void factory_initialize_rnd_variables(void) {
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(void) {
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(void) {
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
Line 1208... Line 1208...
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(void) {
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
 
Line 1269... Line 1269...
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(void) {
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!
Line 1282... Line 1282...
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(void) {
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
Line 1296... Line 1296...
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(void) {
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
 
Line 1326... Line 1326...
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(void) {
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(void) {
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
Line 1346... Line 1346...
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(void) {
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
 
Line 1377... Line 1377...
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(void) {
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(void) {
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
Line 1397... Line 1397...
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(void) {
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(void) {
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(void) {
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
Line 1426... Line 1426...
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(void) {
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(void) {
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(void) {
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
Line 1455... Line 1455...
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(void) {
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(void) {
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(void) {
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