fun apps and inclusion of stb_image.h for future work

This commit is contained in:
boreddevnl 2026-03-05 20:27:10 +01:00
parent 4b8fdde06d
commit b708ad7e45
4 changed files with 8746 additions and 0 deletions

Binary file not shown.

573
src/kernel/userland/cube.c Normal file
View file

@ -0,0 +1,573 @@
// Copyright (c) 2023-2026 Chris (boreddevnl)
// This software is released under the GNU General Public License v3.0. See LICENSE file for details.
// This header needs to maintain in any file it is present in, as per the GPL license terms.
#include "syscall.h"
#include "libui.h"
#include "stdlib.h"
#define WIN_W 320
#define WIN_H 240
#define SHIFT 10
static const int sin_lut[3600] = {
0, 1, 3, 5, 7, 8, 10, 12, 14, 16, 17, 19, 21, 23, 25, 26, 28, 30, 32, 33,
35, 37, 39, 41, 42, 44, 46, 48, 50, 51, 53, 55, 57, 58, 60, 62, 64, 66, 67, 69,
71, 73, 74, 76, 78, 80, 82, 83, 85, 87, 89, 91, 92, 94, 96, 98, 99, 101, 103, 105,
107, 108, 110, 112, 114, 115, 117, 119, 121, 123, 124, 126, 128, 130, 131, 133, 135, 137, 138, 140,
142, 144, 146, 147, 149, 151, 153, 154, 156, 158, 160, 161, 163, 165, 167, 169, 170, 172, 174, 176,
177, 179, 181, 183, 184, 186, 188, 190, 191, 193, 195, 197, 198, 200, 202, 204, 205, 207, 209, 211,
212, 214, 216, 218, 219, 221, 223, 225, 226, 228, 230, 232, 233, 235, 237, 239, 240, 242, 244, 245,
247, 249, 251, 252, 254, 256, 258, 259, 261, 263, 265, 266, 268, 270, 271, 273, 275, 277, 278, 280,
282, 283, 285, 287, 289, 290, 292, 294, 295, 297, 299, 301, 302, 304, 306, 307, 309, 311, 313, 314,
316, 318, 319, 321, 323, 324, 326, 328, 330, 331, 333, 335, 336, 338, 340, 341, 343, 345, 346, 348,
350, 351, 353, 355, 356, 358, 360, 361, 363, 365, 366, 368, 370, 371, 373, 375, 376, 378, 380, 381,
383, 385, 386, 388, 390, 391, 393, 395, 396, 398, 400, 401, 403, 405, 406, 408, 409, 411, 413, 414,
416, 418, 419, 421, 423, 424, 426, 427, 429, 431, 432, 434, 435, 437, 439, 440, 442, 444, 445, 447,
448, 450, 452, 453, 455, 456, 458, 460, 461, 463, 464, 466, 468, 469, 471, 472, 474, 475, 477, 479,
480, 482, 483, 485, 487, 488, 490, 491, 493, 494, 496, 498, 499, 501, 502, 504, 505, 507, 508, 510,
511, 513, 515, 516, 518, 519, 521, 522, 524, 525, 527, 528, 530, 531, 533, 535, 536, 538, 539, 541,
542, 544, 545, 547, 548, 550, 551, 553, 554, 556, 557, 559, 560, 562, 563, 565, 566, 568, 569, 571,
572, 574, 575, 577, 578, 579, 581, 582, 584, 585, 587, 588, 590, 591, 593, 594, 596, 597, 598, 600,
601, 603, 604, 606, 607, 609, 610, 611, 613, 614, 616, 617, 619, 620, 621, 623, 624, 626, 627, 629,
630, 631, 633, 634, 636, 637, 638, 640, 641, 643, 644, 645, 647, 648, 649, 651, 652, 654, 655, 656,
658, 659, 660, 662, 663, 665, 666, 667, 669, 670, 671, 673, 674, 675, 677, 678, 679, 681, 682, 683,
685, 686, 687, 689, 690, 691, 693, 694, 695, 697, 698, 699, 700, 702, 703, 704, 706, 707, 708, 710,
711, 712, 713, 715, 716, 717, 719, 720, 721, 722, 724, 725, 726, 727, 729, 730, 731, 732, 734, 735,
736, 737, 739, 740, 741, 742, 744, 745, 746, 747, 748, 750, 751, 752, 753, 754, 756, 757, 758, 759,
760, 762, 763, 764, 765, 766, 768, 769, 770, 771, 772, 773, 775, 776, 777, 778, 779, 780, 782, 783,
784, 785, 786, 787, 789, 790, 791, 792, 793, 794, 795, 796, 798, 799, 800, 801, 802, 803, 804, 805,
806, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 821, 822, 823, 824, 825, 826, 827,
828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847,
848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867,
868, 869, 870, 871, 872, 873, 874, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 885,
886, 887, 888, 889, 890, 891, 892, 892, 893, 894, 895, 896, 897, 898, 899, 899, 900, 901, 902, 903,
904, 904, 905, 906, 907, 908, 909, 909, 910, 911, 912, 913, 914, 914, 915, 916, 917, 918, 918, 919,
920, 921, 921, 922, 923, 924, 925, 925, 926, 927, 928, 928, 929, 930, 931, 931, 932, 933, 934, 934,
935, 936, 936, 937, 938, 939, 939, 940, 941, 941, 942, 943, 943, 944, 945, 946, 946, 947, 948, 948,
949, 950, 950, 951, 952, 952, 953, 954, 954, 955, 955, 956, 957, 957, 958, 959, 959, 960, 961, 961,
962, 962, 963, 964, 964, 965, 965, 966, 967, 967, 968, 968, 969, 969, 970, 971, 971, 972, 972, 973,
973, 974, 974, 975, 976, 976, 977, 977, 978, 978, 979, 979, 980, 980, 981, 981, 982, 982, 983, 983,
984, 984, 985, 985, 986, 986, 987, 987, 988, 988, 989, 989, 990, 990, 990, 991, 991, 992, 992, 993,
993, 994, 994, 994, 995, 995, 996, 996, 996, 997, 997, 998, 998, 998, 999, 999, 1000, 1000, 1000, 1001,
1001, 1001, 1002, 1002, 1003, 1003, 1003, 1004, 1004, 1004, 1005, 1005, 1005, 1006, 1006, 1006, 1007, 1007, 1007, 1008,
1008, 1008, 1009, 1009, 1009, 1009, 1010, 1010, 1010, 1011, 1011, 1011, 1011, 1012, 1012, 1012, 1013, 1013, 1013, 1013,
1014, 1014, 1014, 1014, 1015, 1015, 1015, 1015, 1015, 1016, 1016, 1016, 1016, 1017, 1017, 1017, 1017, 1017, 1018, 1018,
1018, 1018, 1018, 1018, 1019, 1019, 1019, 1019, 1019, 1019, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1021, 1021, 1021,
1021, 1021, 1021, 1021, 1021, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1023, 1023, 1023, 1023, 1023,
1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
1024, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
1023, 1023, 1023, 1023, 1023, 1023, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1021, 1021, 1021, 1021,
1021, 1021, 1021, 1021, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1019, 1019, 1019, 1019, 1019, 1019, 1018, 1018, 1018,
1018, 1018, 1018, 1017, 1017, 1017, 1017, 1017, 1016, 1016, 1016, 1016, 1015, 1015, 1015, 1015, 1015, 1014, 1014, 1014,
1014, 1013, 1013, 1013, 1013, 1012, 1012, 1012, 1011, 1011, 1011, 1011, 1010, 1010, 1010, 1009, 1009, 1009, 1009, 1008,
1008, 1008, 1007, 1007, 1007, 1006, 1006, 1006, 1005, 1005, 1005, 1004, 1004, 1004, 1003, 1003, 1003, 1002, 1002, 1001,
1001, 1001, 1000, 1000, 1000, 999, 999, 998, 998, 998, 997, 997, 996, 996, 996, 995, 995, 994, 994, 994,
993, 993, 992, 992, 991, 991, 990, 990, 990, 989, 989, 988, 988, 987, 987, 986, 986, 985, 985, 984,
984, 983, 983, 982, 982, 981, 981, 980, 980, 979, 979, 978, 978, 977, 977, 976, 976, 975, 974, 974,
973, 973, 972, 972, 971, 971, 970, 969, 969, 968, 968, 967, 967, 966, 965, 965, 964, 964, 963, 962,
962, 961, 961, 960, 959, 959, 958, 957, 957, 956, 955, 955, 954, 954, 953, 952, 952, 951, 950, 950,
949, 948, 948, 947, 946, 946, 945, 944, 943, 943, 942, 941, 941, 940, 939, 939, 938, 937, 936, 936,
935, 934, 934, 933, 932, 931, 931, 930, 929, 928, 928, 927, 926, 925, 925, 924, 923, 922, 921, 921,
920, 919, 918, 918, 917, 916, 915, 914, 914, 913, 912, 911, 910, 909, 909, 908, 907, 906, 905, 904,
904, 903, 902, 901, 900, 899, 899, 898, 897, 896, 895, 894, 893, 892, 892, 891, 890, 889, 888, 887,
886, 885, 885, 884, 883, 882, 881, 880, 879, 878, 877, 876, 875, 874, 874, 873, 872, 871, 870, 869,
868, 867, 866, 865, 864, 863, 862, 861, 860, 859, 858, 857, 856, 855, 854, 853, 852, 851, 850, 849,
848, 847, 846, 845, 844, 843, 842, 841, 840, 839, 838, 837, 836, 835, 834, 833, 832, 831, 830, 829,
828, 827, 826, 825, 824, 823, 822, 821, 819, 818, 817, 816, 815, 814, 813, 812, 811, 810, 809, 808,
806, 805, 804, 803, 802, 801, 800, 799, 798, 796, 795, 794, 793, 792, 791, 790, 789, 787, 786, 785,
784, 783, 782, 780, 779, 778, 777, 776, 775, 773, 772, 771, 770, 769, 768, 766, 765, 764, 763, 762,
760, 759, 758, 757, 756, 754, 753, 752, 751, 750, 748, 747, 746, 745, 744, 742, 741, 740, 739, 737,
736, 735, 734, 732, 731, 730, 729, 727, 726, 725, 724, 722, 721, 720, 719, 717, 716, 715, 713, 712,
711, 710, 708, 707, 706, 704, 703, 702, 700, 699, 698, 697, 695, 694, 693, 691, 690, 689, 687, 686,
685, 683, 682, 681, 679, 678, 677, 675, 674, 673, 671, 670, 669, 667, 666, 665, 663, 662, 660, 659,
658, 656, 655, 654, 652, 651, 649, 648, 647, 645, 644, 643, 641, 640, 638, 637, 636, 634, 633, 631,
630, 629, 627, 626, 624, 623, 621, 620, 619, 617, 616, 614, 613, 611, 610, 609, 607, 606, 604, 603,
601, 600, 598, 597, 596, 594, 593, 591, 590, 588, 587, 585, 584, 582, 581, 579, 578, 577, 575, 574,
572, 571, 569, 568, 566, 565, 563, 562, 560, 559, 557, 556, 554, 553, 551, 550, 548, 547, 545, 544,
542, 541, 539, 538, 536, 535, 533, 531, 530, 528, 527, 525, 524, 522, 521, 519, 518, 516, 515, 513,
511, 510, 508, 507, 505, 504, 502, 501, 499, 498, 496, 494, 493, 491, 490, 488, 487, 485, 483, 482,
480, 479, 477, 475, 474, 472, 471, 469, 468, 466, 464, 463, 461, 460, 458, 456, 455, 453, 452, 450,
448, 447, 445, 444, 442, 440, 439, 437, 435, 434, 432, 431, 429, 427, 426, 424, 423, 421, 419, 418,
416, 414, 413, 411, 409, 408, 406, 405, 403, 401, 400, 398, 396, 395, 393, 391, 390, 388, 386, 385,
383, 381, 380, 378, 376, 375, 373, 371, 370, 368, 366, 365, 363, 361, 360, 358, 356, 355, 353, 351,
350, 348, 346, 345, 343, 341, 340, 338, 336, 335, 333, 331, 330, 328, 326, 324, 323, 321, 319, 318,
316, 314, 313, 311, 309, 307, 306, 304, 302, 301, 299, 297, 295, 294, 292, 290, 289, 287, 285, 283,
282, 280, 278, 277, 275, 273, 271, 270, 268, 266, 265, 263, 261, 259, 258, 256, 254, 252, 251, 249,
247, 245, 244, 242, 240, 239, 237, 235, 233, 232, 230, 228, 226, 225, 223, 221, 219, 218, 216, 214,
212, 211, 209, 207, 205, 204, 202, 200, 198, 197, 195, 193, 191, 190, 188, 186, 184, 183, 181, 179,
177, 176, 174, 172, 170, 169, 167, 165, 163, 161, 160, 158, 156, 154, 153, 151, 149, 147, 146, 144,
142, 140, 138, 137, 135, 133, 131, 130, 128, 126, 124, 123, 121, 119, 117, 115, 114, 112, 110, 108,
107, 105, 103, 101, 99, 98, 96, 94, 92, 91, 89, 87, 85, 83, 82, 80, 78, 76, 74, 73,
71, 69, 67, 66, 64, 62, 60, 58, 57, 55, 53, 51, 50, 48, 46, 44, 42, 41, 39, 37,
35, 33, 32, 30, 28, 26, 25, 23, 21, 19, 17, 16, 14, 12, 10, 8, 7, 5, 3, 1,
0, -1, -3, -5, -7, -8, -10, -12, -14, -16, -17, -19, -21, -23, -25, -26, -28, -30, -32, -33,
-35, -37, -39, -41, -42, -44, -46, -48, -50, -51, -53, -55, -57, -58, -60, -62, -64, -66, -67, -69,
-71, -73, -74, -76, -78, -80, -82, -83, -85, -87, -89, -91, -92, -94, -96, -98, -99, -101, -103, -105,
-107, -108, -110, -112, -114, -115, -117, -119, -121, -123, -124, -126, -128, -130, -131, -133, -135, -137, -138, -140,
-142, -144, -146, -147, -149, -151, -153, -154, -156, -158, -160, -161, -163, -165, -167, -169, -170, -172, -174, -176,
-177, -179, -181, -183, -184, -186, -188, -190, -191, -193, -195, -197, -198, -200, -202, -204, -205, -207, -209, -211,
-212, -214, -216, -218, -219, -221, -223, -225, -226, -228, -230, -232, -233, -235, -237, -239, -240, -242, -244, -245,
-247, -249, -251, -252, -254, -256, -258, -259, -261, -263, -265, -266, -268, -270, -271, -273, -275, -277, -278, -280,
-282, -283, -285, -287, -289, -290, -292, -294, -295, -297, -299, -301, -302, -304, -306, -307, -309, -311, -313, -314,
-316, -318, -319, -321, -323, -324, -326, -328, -330, -331, -333, -335, -336, -338, -340, -341, -343, -345, -346, -348,
-350, -351, -353, -355, -356, -358, -360, -361, -363, -365, -366, -368, -370, -371, -373, -375, -376, -378, -380, -381,
-383, -385, -386, -388, -390, -391, -393, -395, -396, -398, -400, -401, -403, -405, -406, -408, -409, -411, -413, -414,
-416, -418, -419, -421, -423, -424, -426, -427, -429, -431, -432, -434, -435, -437, -439, -440, -442, -444, -445, -447,
-448, -450, -452, -453, -455, -456, -458, -460, -461, -463, -464, -466, -468, -469, -471, -472, -474, -475, -477, -479,
-480, -482, -483, -485, -487, -488, -490, -491, -493, -494, -496, -498, -499, -501, -502, -504, -505, -507, -508, -510,
-512, -513, -515, -516, -518, -519, -521, -522, -524, -525, -527, -528, -530, -531, -533, -535, -536, -538, -539, -541,
-542, -544, -545, -547, -548, -550, -551, -553, -554, -556, -557, -559, -560, -562, -563, -565, -566, -568, -569, -571,
-572, -574, -575, -577, -578, -579, -581, -582, -584, -585, -587, -588, -590, -591, -593, -594, -596, -597, -598, -600,
-601, -603, -604, -606, -607, -609, -610, -611, -613, -614, -616, -617, -619, -620, -621, -623, -624, -626, -627, -629,
-630, -631, -633, -634, -636, -637, -638, -640, -641, -643, -644, -645, -647, -648, -649, -651, -652, -654, -655, -656,
-658, -659, -660, -662, -663, -665, -666, -667, -669, -670, -671, -673, -674, -675, -677, -678, -679, -681, -682, -683,
-685, -686, -687, -689, -690, -691, -693, -694, -695, -697, -698, -699, -700, -702, -703, -704, -706, -707, -708, -710,
-711, -712, -713, -715, -716, -717, -719, -720, -721, -722, -724, -725, -726, -727, -729, -730, -731, -732, -734, -735,
-736, -737, -739, -740, -741, -742, -744, -745, -746, -747, -748, -750, -751, -752, -753, -754, -756, -757, -758, -759,
-760, -762, -763, -764, -765, -766, -768, -769, -770, -771, -772, -773, -775, -776, -777, -778, -779, -780, -782, -783,
-784, -785, -786, -787, -789, -790, -791, -792, -793, -794, -795, -796, -798, -799, -800, -801, -802, -803, -804, -805,
-806, -808, -809, -810, -811, -812, -813, -814, -815, -816, -817, -818, -819, -821, -822, -823, -824, -825, -826, -827,
-828, -829, -830, -831, -832, -833, -834, -835, -836, -837, -838, -839, -840, -841, -842, -843, -844, -845, -846, -847,
-848, -849, -850, -851, -852, -853, -854, -855, -856, -857, -858, -859, -860, -861, -862, -863, -864, -865, -866, -867,
-868, -869, -870, -871, -872, -873, -874, -874, -875, -876, -877, -878, -879, -880, -881, -882, -883, -884, -885, -885,
-886, -887, -888, -889, -890, -891, -892, -892, -893, -894, -895, -896, -897, -898, -899, -899, -900, -901, -902, -903,
-904, -904, -905, -906, -907, -908, -909, -909, -910, -911, -912, -913, -914, -914, -915, -916, -917, -918, -918, -919,
-920, -921, -921, -922, -923, -924, -925, -925, -926, -927, -928, -928, -929, -930, -931, -931, -932, -933, -934, -934,
-935, -936, -936, -937, -938, -939, -939, -940, -941, -941, -942, -943, -943, -944, -945, -946, -946, -947, -948, -948,
-949, -950, -950, -951, -952, -952, -953, -954, -954, -955, -955, -956, -957, -957, -958, -959, -959, -960, -961, -961,
-962, -962, -963, -964, -964, -965, -965, -966, -967, -967, -968, -968, -969, -969, -970, -971, -971, -972, -972, -973,
-973, -974, -974, -975, -976, -976, -977, -977, -978, -978, -979, -979, -980, -980, -981, -981, -982, -982, -983, -983,
-984, -984, -985, -985, -986, -986, -987, -987, -988, -988, -989, -989, -990, -990, -990, -991, -991, -992, -992, -993,
-993, -994, -994, -994, -995, -995, -996, -996, -996, -997, -997, -998, -998, -998, -999, -999, -1000, -1000, -1000, -1001,
-1001, -1001, -1002, -1002, -1003, -1003, -1003, -1004, -1004, -1004, -1005, -1005, -1005, -1006, -1006, -1006, -1007, -1007, -1007, -1008,
-1008, -1008, -1009, -1009, -1009, -1009, -1010, -1010, -1010, -1011, -1011, -1011, -1011, -1012, -1012, -1012, -1013, -1013, -1013, -1013,
-1014, -1014, -1014, -1014, -1015, -1015, -1015, -1015, -1015, -1016, -1016, -1016, -1016, -1017, -1017, -1017, -1017, -1017, -1018, -1018,
-1018, -1018, -1018, -1018, -1019, -1019, -1019, -1019, -1019, -1019, -1020, -1020, -1020, -1020, -1020, -1020, -1020, -1021, -1021, -1021,
-1021, -1021, -1021, -1021, -1021, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1023, -1023, -1023, -1023, -1023,
-1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023,
-1024, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023,
-1023, -1023, -1023, -1023, -1023, -1023, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1021, -1021, -1021, -1021,
-1021, -1021, -1021, -1021, -1020, -1020, -1020, -1020, -1020, -1020, -1020, -1019, -1019, -1019, -1019, -1019, -1019, -1018, -1018, -1018,
-1018, -1018, -1018, -1017, -1017, -1017, -1017, -1017, -1016, -1016, -1016, -1016, -1015, -1015, -1015, -1015, -1015, -1014, -1014, -1014,
-1014, -1013, -1013, -1013, -1013, -1012, -1012, -1012, -1011, -1011, -1011, -1011, -1010, -1010, -1010, -1009, -1009, -1009, -1009, -1008,
-1008, -1008, -1007, -1007, -1007, -1006, -1006, -1006, -1005, -1005, -1005, -1004, -1004, -1004, -1003, -1003, -1003, -1002, -1002, -1001,
-1001, -1001, -1000, -1000, -1000, -999, -999, -998, -998, -998, -997, -997, -996, -996, -996, -995, -995, -994, -994, -994,
-993, -993, -992, -992, -991, -991, -990, -990, -990, -989, -989, -988, -988, -987, -987, -986, -986, -985, -985, -984,
-984, -983, -983, -982, -982, -981, -981, -980, -980, -979, -979, -978, -978, -977, -977, -976, -976, -975, -974, -974,
-973, -973, -972, -972, -971, -971, -970, -969, -969, -968, -968, -967, -967, -966, -965, -965, -964, -964, -963, -962,
-962, -961, -961, -960, -959, -959, -958, -957, -957, -956, -955, -955, -954, -954, -953, -952, -952, -951, -950, -950,
-949, -948, -948, -947, -946, -946, -945, -944, -943, -943, -942, -941, -941, -940, -939, -939, -938, -937, -936, -936,
-935, -934, -934, -933, -932, -931, -931, -930, -929, -928, -928, -927, -926, -925, -925, -924, -923, -922, -921, -921,
-920, -919, -918, -918, -917, -916, -915, -914, -914, -913, -912, -911, -910, -909, -909, -908, -907, -906, -905, -904,
-904, -903, -902, -901, -900, -899, -899, -898, -897, -896, -895, -894, -893, -892, -892, -891, -890, -889, -888, -887,
-886, -885, -885, -884, -883, -882, -881, -880, -879, -878, -877, -876, -875, -874, -874, -873, -872, -871, -870, -869,
-868, -867, -866, -865, -864, -863, -862, -861, -860, -859, -858, -857, -856, -855, -854, -853, -852, -851, -850, -849,
-848, -847, -846, -845, -844, -843, -842, -841, -840, -839, -838, -837, -836, -835, -834, -833, -832, -831, -830, -829,
-828, -827, -826, -825, -824, -823, -822, -821, -819, -818, -817, -816, -815, -814, -813, -812, -811, -810, -809, -808,
-806, -805, -804, -803, -802, -801, -800, -799, -798, -796, -795, -794, -793, -792, -791, -790, -789, -787, -786, -785,
-784, -783, -782, -780, -779, -778, -777, -776, -775, -773, -772, -771, -770, -769, -768, -766, -765, -764, -763, -762,
-760, -759, -758, -757, -756, -754, -753, -752, -751, -750, -748, -747, -746, -745, -744, -742, -741, -740, -739, -737,
-736, -735, -734, -732, -731, -730, -729, -727, -726, -725, -724, -722, -721, -720, -719, -717, -716, -715, -713, -712,
-711, -710, -708, -707, -706, -704, -703, -702, -700, -699, -698, -697, -695, -694, -693, -691, -690, -689, -687, -686,
-685, -683, -682, -681, -679, -678, -677, -675, -674, -673, -671, -670, -669, -667, -666, -665, -663, -662, -660, -659,
-658, -656, -655, -654, -652, -651, -649, -648, -647, -645, -644, -643, -641, -640, -638, -637, -636, -634, -633, -631,
-630, -629, -627, -626, -624, -623, -621, -620, -619, -617, -616, -614, -613, -611, -610, -609, -607, -606, -604, -603,
-601, -600, -598, -597, -596, -594, -593, -591, -590, -588, -587, -585, -584, -582, -581, -579, -578, -577, -575, -574,
-572, -571, -569, -568, -566, -565, -563, -562, -560, -559, -557, -556, -554, -553, -551, -550, -548, -547, -545, -544,
-542, -541, -539, -538, -536, -535, -533, -531, -530, -528, -527, -525, -524, -522, -521, -519, -518, -516, -515, -513,
-512, -510, -508, -507, -505, -504, -502, -501, -499, -498, -496, -494, -493, -491, -490, -488, -487, -485, -483, -482,
-480, -479, -477, -475, -474, -472, -471, -469, -468, -466, -464, -463, -461, -460, -458, -456, -455, -453, -452, -450,
-448, -447, -445, -444, -442, -440, -439, -437, -435, -434, -432, -431, -429, -427, -426, -424, -423, -421, -419, -418,
-416, -414, -413, -411, -409, -408, -406, -405, -403, -401, -400, -398, -396, -395, -393, -391, -390, -388, -386, -385,
-383, -381, -380, -378, -376, -375, -373, -371, -370, -368, -366, -365, -363, -361, -360, -358, -356, -355, -353, -351,
-350, -348, -346, -345, -343, -341, -340, -338, -336, -335, -333, -331, -330, -328, -326, -324, -323, -321, -319, -318,
-316, -314, -313, -311, -309, -307, -306, -304, -302, -301, -299, -297, -295, -294, -292, -290, -289, -287, -285, -283,
-282, -280, -278, -277, -275, -273, -271, -270, -268, -266, -265, -263, -261, -259, -258, -256, -254, -252, -251, -249,
-247, -245, -244, -242, -240, -239, -237, -235, -233, -232, -230, -228, -226, -225, -223, -221, -219, -218, -216, -214,
-212, -211, -209, -207, -205, -204, -202, -200, -198, -197, -195, -193, -191, -190, -188, -186, -184, -183, -181, -179,
-177, -176, -174, -172, -170, -169, -167, -165, -163, -161, -160, -158, -156, -154, -153, -151, -149, -147, -146, -144,
-142, -140, -138, -137, -135, -133, -131, -130, -128, -126, -124, -123, -121, -119, -117, -115, -114, -112, -110, -108,
-107, -105, -103, -101, -99, -98, -96, -94, -92, -91, -89, -87, -85, -83, -82, -80, -78, -76, -74, -73,
-71, -69, -67, -66, -64, -62, -60, -58, -57, -55, -53, -51, -50, -48, -46, -44, -42, -41, -39, -37,
-35, -33, -32, -30, -28, -26, -25, -23, -21, -19, -17, -16, -14, -12, -10, -8, -7, -5, -3, -1
};
static const int cos_lut[3600] = {
1024, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023,
1023, 1023, 1023, 1023, 1023, 1023, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1021, 1021, 1021, 1021,
1021, 1021, 1021, 1021, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1019, 1019, 1019, 1019, 1019, 1019, 1018, 1018, 1018,
1018, 1018, 1018, 1017, 1017, 1017, 1017, 1017, 1016, 1016, 1016, 1016, 1015, 1015, 1015, 1015, 1015, 1014, 1014, 1014,
1014, 1013, 1013, 1013, 1013, 1012, 1012, 1012, 1011, 1011, 1011, 1011, 1010, 1010, 1010, 1009, 1009, 1009, 1009, 1008,
1008, 1008, 1007, 1007, 1007, 1006, 1006, 1006, 1005, 1005, 1005, 1004, 1004, 1004, 1003, 1003, 1003, 1002, 1002, 1001,
1001, 1001, 1000, 1000, 1000, 999, 999, 998, 998, 998, 997, 997, 996, 996, 996, 995, 995, 994, 994, 994,
993, 993, 992, 992, 991, 991, 990, 990, 990, 989, 989, 988, 988, 987, 987, 986, 986, 985, 985, 984,
984, 983, 983, 982, 982, 981, 981, 980, 980, 979, 979, 978, 978, 977, 977, 976, 976, 975, 974, 974,
973, 973, 972, 972, 971, 971, 970, 969, 969, 968, 968, 967, 967, 966, 965, 965, 964, 964, 963, 962,
962, 961, 961, 960, 959, 959, 958, 957, 957, 956, 955, 955, 954, 954, 953, 952, 952, 951, 950, 950,
949, 948, 948, 947, 946, 946, 945, 944, 943, 943, 942, 941, 941, 940, 939, 939, 938, 937, 936, 936,
935, 934, 934, 933, 932, 931, 931, 930, 929, 928, 928, 927, 926, 925, 925, 924, 923, 922, 921, 921,
920, 919, 918, 918, 917, 916, 915, 914, 914, 913, 912, 911, 910, 909, 909, 908, 907, 906, 905, 904,
904, 903, 902, 901, 900, 899, 899, 898, 897, 896, 895, 894, 893, 892, 892, 891, 890, 889, 888, 887,
886, 885, 885, 884, 883, 882, 881, 880, 879, 878, 877, 876, 875, 874, 874, 873, 872, 871, 870, 869,
868, 867, 866, 865, 864, 863, 862, 861, 860, 859, 858, 857, 856, 855, 854, 853, 852, 851, 850, 849,
848, 847, 846, 845, 844, 843, 842, 841, 840, 839, 838, 837, 836, 835, 834, 833, 832, 831, 830, 829,
828, 827, 826, 825, 824, 823, 822, 821, 819, 818, 817, 816, 815, 814, 813, 812, 811, 810, 809, 808,
806, 805, 804, 803, 802, 801, 800, 799, 798, 796, 795, 794, 793, 792, 791, 790, 789, 787, 786, 785,
784, 783, 782, 780, 779, 778, 777, 776, 775, 773, 772, 771, 770, 769, 768, 766, 765, 764, 763, 762,
760, 759, 758, 757, 756, 754, 753, 752, 751, 750, 748, 747, 746, 745, 744, 742, 741, 740, 739, 737,
736, 735, 734, 732, 731, 730, 729, 727, 726, 725, 724, 722, 721, 720, 719, 717, 716, 715, 713, 712,
711, 710, 708, 707, 706, 704, 703, 702, 700, 699, 698, 697, 695, 694, 693, 691, 690, 689, 687, 686,
685, 683, 682, 681, 679, 678, 677, 675, 674, 673, 671, 670, 669, 667, 666, 665, 663, 662, 660, 659,
658, 656, 655, 654, 652, 651, 649, 648, 647, 645, 644, 643, 641, 640, 638, 637, 636, 634, 633, 631,
630, 629, 627, 626, 624, 623, 621, 620, 619, 617, 616, 614, 613, 611, 610, 609, 607, 606, 604, 603,
601, 600, 598, 597, 596, 594, 593, 591, 590, 588, 587, 585, 584, 582, 581, 579, 578, 577, 575, 574,
572, 571, 569, 568, 566, 565, 563, 562, 560, 559, 557, 556, 554, 553, 551, 550, 548, 547, 545, 544,
542, 541, 539, 538, 536, 535, 533, 531, 530, 528, 527, 525, 524, 522, 521, 519, 518, 516, 515, 513,
512, 510, 508, 507, 505, 504, 502, 501, 499, 498, 496, 494, 493, 491, 490, 488, 487, 485, 483, 482,
480, 479, 477, 475, 474, 472, 471, 469, 468, 466, 464, 463, 461, 460, 458, 456, 455, 453, 452, 450,
448, 447, 445, 444, 442, 440, 439, 437, 435, 434, 432, 431, 429, 427, 426, 424, 423, 421, 419, 418,
416, 414, 413, 411, 409, 408, 406, 405, 403, 401, 400, 398, 396, 395, 393, 391, 390, 388, 386, 385,
383, 381, 380, 378, 376, 375, 373, 371, 370, 368, 366, 365, 363, 361, 360, 358, 356, 355, 353, 351,
350, 348, 346, 345, 343, 341, 340, 338, 336, 335, 333, 331, 330, 328, 326, 324, 323, 321, 319, 318,
316, 314, 313, 311, 309, 307, 306, 304, 302, 301, 299, 297, 295, 294, 292, 290, 289, 287, 285, 283,
282, 280, 278, 277, 275, 273, 271, 270, 268, 266, 265, 263, 261, 259, 258, 256, 254, 252, 251, 249,
247, 245, 244, 242, 240, 239, 237, 235, 233, 232, 230, 228, 226, 225, 223, 221, 219, 218, 216, 214,
212, 211, 209, 207, 205, 204, 202, 200, 198, 197, 195, 193, 191, 190, 188, 186, 184, 183, 181, 179,
177, 176, 174, 172, 170, 169, 167, 165, 163, 161, 160, 158, 156, 154, 153, 151, 149, 147, 146, 144,
142, 140, 138, 137, 135, 133, 131, 130, 128, 126, 124, 123, 121, 119, 117, 115, 114, 112, 110, 108,
107, 105, 103, 101, 99, 98, 96, 94, 92, 91, 89, 87, 85, 83, 82, 80, 78, 76, 74, 73,
71, 69, 67, 66, 64, 62, 60, 58, 57, 55, 53, 51, 50, 48, 46, 44, 42, 41, 39, 37,
35, 33, 32, 30, 28, 26, 25, 23, 21, 19, 17, 16, 14, 12, 10, 8, 7, 5, 3, 1,
0, -1, -3, -5, -7, -8, -10, -12, -14, -16, -17, -19, -21, -23, -25, -26, -28, -30, -32, -33,
-35, -37, -39, -41, -42, -44, -46, -48, -50, -51, -53, -55, -57, -58, -60, -62, -64, -66, -67, -69,
-71, -73, -74, -76, -78, -80, -82, -83, -85, -87, -89, -91, -92, -94, -96, -98, -99, -101, -103, -105,
-107, -108, -110, -112, -114, -115, -117, -119, -121, -123, -124, -126, -128, -130, -131, -133, -135, -137, -138, -140,
-142, -144, -146, -147, -149, -151, -153, -154, -156, -158, -160, -161, -163, -165, -167, -169, -170, -172, -174, -176,
-177, -179, -181, -183, -184, -186, -188, -190, -191, -193, -195, -197, -198, -200, -202, -204, -205, -207, -209, -211,
-212, -214, -216, -218, -219, -221, -223, -225, -226, -228, -230, -232, -233, -235, -237, -239, -240, -242, -244, -245,
-247, -249, -251, -252, -254, -256, -258, -259, -261, -263, -265, -266, -268, -270, -271, -273, -275, -277, -278, -280,
-282, -283, -285, -287, -289, -290, -292, -294, -295, -297, -299, -301, -302, -304, -306, -307, -309, -311, -313, -314,
-316, -318, -319, -321, -323, -324, -326, -328, -330, -331, -333, -335, -336, -338, -340, -341, -343, -345, -346, -348,
-350, -351, -353, -355, -356, -358, -360, -361, -363, -365, -366, -368, -370, -371, -373, -375, -376, -378, -380, -381,
-383, -385, -386, -388, -390, -391, -393, -395, -396, -398, -400, -401, -403, -405, -406, -408, -409, -411, -413, -414,
-416, -418, -419, -421, -423, -424, -426, -427, -429, -431, -432, -434, -435, -437, -439, -440, -442, -444, -445, -447,
-448, -450, -452, -453, -455, -456, -458, -460, -461, -463, -464, -466, -468, -469, -471, -472, -474, -475, -477, -479,
-480, -482, -483, -485, -487, -488, -490, -491, -493, -494, -496, -498, -499, -501, -502, -504, -505, -507, -508, -510,
-511, -513, -515, -516, -518, -519, -521, -522, -524, -525, -527, -528, -530, -531, -533, -535, -536, -538, -539, -541,
-542, -544, -545, -547, -548, -550, -551, -553, -554, -556, -557, -559, -560, -562, -563, -565, -566, -568, -569, -571,
-572, -574, -575, -577, -578, -579, -581, -582, -584, -585, -587, -588, -590, -591, -593, -594, -596, -597, -598, -600,
-601, -603, -604, -606, -607, -609, -610, -611, -613, -614, -616, -617, -619, -620, -621, -623, -624, -626, -627, -629,
-630, -631, -633, -634, -636, -637, -638, -640, -641, -643, -644, -645, -647, -648, -649, -651, -652, -654, -655, -656,
-658, -659, -660, -662, -663, -665, -666, -667, -669, -670, -671, -673, -674, -675, -677, -678, -679, -681, -682, -683,
-685, -686, -687, -689, -690, -691, -693, -694, -695, -697, -698, -699, -700, -702, -703, -704, -706, -707, -708, -710,
-711, -712, -713, -715, -716, -717, -719, -720, -721, -722, -724, -725, -726, -727, -729, -730, -731, -732, -734, -735,
-736, -737, -739, -740, -741, -742, -744, -745, -746, -747, -748, -750, -751, -752, -753, -754, -756, -757, -758, -759,
-760, -762, -763, -764, -765, -766, -768, -769, -770, -771, -772, -773, -775, -776, -777, -778, -779, -780, -782, -783,
-784, -785, -786, -787, -789, -790, -791, -792, -793, -794, -795, -796, -798, -799, -800, -801, -802, -803, -804, -805,
-806, -808, -809, -810, -811, -812, -813, -814, -815, -816, -817, -818, -819, -821, -822, -823, -824, -825, -826, -827,
-828, -829, -830, -831, -832, -833, -834, -835, -836, -837, -838, -839, -840, -841, -842, -843, -844, -845, -846, -847,
-848, -849, -850, -851, -852, -853, -854, -855, -856, -857, -858, -859, -860, -861, -862, -863, -864, -865, -866, -867,
-868, -869, -870, -871, -872, -873, -874, -874, -875, -876, -877, -878, -879, -880, -881, -882, -883, -884, -885, -885,
-886, -887, -888, -889, -890, -891, -892, -892, -893, -894, -895, -896, -897, -898, -899, -899, -900, -901, -902, -903,
-904, -904, -905, -906, -907, -908, -909, -909, -910, -911, -912, -913, -914, -914, -915, -916, -917, -918, -918, -919,
-920, -921, -921, -922, -923, -924, -925, -925, -926, -927, -928, -928, -929, -930, -931, -931, -932, -933, -934, -934,
-935, -936, -936, -937, -938, -939, -939, -940, -941, -941, -942, -943, -943, -944, -945, -946, -946, -947, -948, -948,
-949, -950, -950, -951, -952, -952, -953, -954, -954, -955, -955, -956, -957, -957, -958, -959, -959, -960, -961, -961,
-962, -962, -963, -964, -964, -965, -965, -966, -967, -967, -968, -968, -969, -969, -970, -971, -971, -972, -972, -973,
-973, -974, -974, -975, -976, -976, -977, -977, -978, -978, -979, -979, -980, -980, -981, -981, -982, -982, -983, -983,
-984, -984, -985, -985, -986, -986, -987, -987, -988, -988, -989, -989, -990, -990, -990, -991, -991, -992, -992, -993,
-993, -994, -994, -994, -995, -995, -996, -996, -996, -997, -997, -998, -998, -998, -999, -999, -1000, -1000, -1000, -1001,
-1001, -1001, -1002, -1002, -1003, -1003, -1003, -1004, -1004, -1004, -1005, -1005, -1005, -1006, -1006, -1006, -1007, -1007, -1007, -1008,
-1008, -1008, -1009, -1009, -1009, -1009, -1010, -1010, -1010, -1011, -1011, -1011, -1011, -1012, -1012, -1012, -1013, -1013, -1013, -1013,
-1014, -1014, -1014, -1014, -1015, -1015, -1015, -1015, -1015, -1016, -1016, -1016, -1016, -1017, -1017, -1017, -1017, -1017, -1018, -1018,
-1018, -1018, -1018, -1018, -1019, -1019, -1019, -1019, -1019, -1019, -1020, -1020, -1020, -1020, -1020, -1020, -1020, -1021, -1021, -1021,
-1021, -1021, -1021, -1021, -1021, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1023, -1023, -1023, -1023, -1023,
-1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023,
-1024, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023,
-1023, -1023, -1023, -1023, -1023, -1023, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1022, -1021, -1021, -1021, -1021,
-1021, -1021, -1021, -1021, -1020, -1020, -1020, -1020, -1020, -1020, -1020, -1019, -1019, -1019, -1019, -1019, -1019, -1018, -1018, -1018,
-1018, -1018, -1018, -1017, -1017, -1017, -1017, -1017, -1016, -1016, -1016, -1016, -1015, -1015, -1015, -1015, -1015, -1014, -1014, -1014,
-1014, -1013, -1013, -1013, -1013, -1012, -1012, -1012, -1011, -1011, -1011, -1011, -1010, -1010, -1010, -1009, -1009, -1009, -1009, -1008,
-1008, -1008, -1007, -1007, -1007, -1006, -1006, -1006, -1005, -1005, -1005, -1004, -1004, -1004, -1003, -1003, -1003, -1002, -1002, -1001,
-1001, -1001, -1000, -1000, -1000, -999, -999, -998, -998, -998, -997, -997, -996, -996, -996, -995, -995, -994, -994, -994,
-993, -993, -992, -992, -991, -991, -990, -990, -990, -989, -989, -988, -988, -987, -987, -986, -986, -985, -985, -984,
-984, -983, -983, -982, -982, -981, -981, -980, -980, -979, -979, -978, -978, -977, -977, -976, -976, -975, -974, -974,
-973, -973, -972, -972, -971, -971, -970, -969, -969, -968, -968, -967, -967, -966, -965, -965, -964, -964, -963, -962,
-962, -961, -961, -960, -959, -959, -958, -957, -957, -956, -955, -955, -954, -954, -953, -952, -952, -951, -950, -950,
-949, -948, -948, -947, -946, -946, -945, -944, -943, -943, -942, -941, -941, -940, -939, -939, -938, -937, -936, -936,
-935, -934, -934, -933, -932, -931, -931, -930, -929, -928, -928, -927, -926, -925, -925, -924, -923, -922, -921, -921,
-920, -919, -918, -918, -917, -916, -915, -914, -914, -913, -912, -911, -910, -909, -909, -908, -907, -906, -905, -904,
-904, -903, -902, -901, -900, -899, -899, -898, -897, -896, -895, -894, -893, -892, -892, -891, -890, -889, -888, -887,
-886, -885, -885, -884, -883, -882, -881, -880, -879, -878, -877, -876, -875, -874, -874, -873, -872, -871, -870, -869,
-868, -867, -866, -865, -864, -863, -862, -861, -860, -859, -858, -857, -856, -855, -854, -853, -852, -851, -850, -849,
-848, -847, -846, -845, -844, -843, -842, -841, -840, -839, -838, -837, -836, -835, -834, -833, -832, -831, -830, -829,
-828, -827, -826, -825, -824, -823, -822, -821, -819, -818, -817, -816, -815, -814, -813, -812, -811, -810, -809, -808,
-806, -805, -804, -803, -802, -801, -800, -799, -798, -796, -795, -794, -793, -792, -791, -790, -789, -787, -786, -785,
-784, -783, -782, -780, -779, -778, -777, -776, -775, -773, -772, -771, -770, -769, -768, -766, -765, -764, -763, -762,
-760, -759, -758, -757, -756, -754, -753, -752, -751, -750, -748, -747, -746, -745, -744, -742, -741, -740, -739, -737,
-736, -735, -734, -732, -731, -730, -729, -727, -726, -725, -724, -722, -721, -720, -719, -717, -716, -715, -713, -712,
-711, -710, -708, -707, -706, -704, -703, -702, -700, -699, -698, -697, -695, -694, -693, -691, -690, -689, -687, -686,
-685, -683, -682, -681, -679, -678, -677, -675, -674, -673, -671, -670, -669, -667, -666, -665, -663, -662, -660, -659,
-658, -656, -655, -654, -652, -651, -649, -648, -647, -645, -644, -643, -641, -640, -638, -637, -636, -634, -633, -631,
-630, -629, -627, -626, -624, -623, -621, -620, -619, -617, -616, -614, -613, -611, -610, -609, -607, -606, -604, -603,
-601, -600, -598, -597, -596, -594, -593, -591, -590, -588, -587, -585, -584, -582, -581, -579, -578, -577, -575, -574,
-572, -571, -569, -568, -566, -565, -563, -562, -560, -559, -557, -556, -554, -553, -551, -550, -548, -547, -545, -544,
-542, -541, -539, -538, -536, -535, -533, -531, -530, -528, -527, -525, -524, -522, -521, -519, -518, -516, -515, -513,
-512, -510, -508, -507, -505, -504, -502, -501, -499, -498, -496, -494, -493, -491, -490, -488, -487, -485, -483, -482,
-480, -479, -477, -475, -474, -472, -471, -469, -468, -466, -464, -463, -461, -460, -458, -456, -455, -453, -452, -450,
-448, -447, -445, -444, -442, -440, -439, -437, -435, -434, -432, -431, -429, -427, -426, -424, -423, -421, -419, -418,
-416, -414, -413, -411, -409, -408, -406, -405, -403, -401, -400, -398, -396, -395, -393, -391, -390, -388, -386, -385,
-383, -381, -380, -378, -376, -375, -373, -371, -370, -368, -366, -365, -363, -361, -360, -358, -356, -355, -353, -351,
-350, -348, -346, -345, -343, -341, -340, -338, -336, -335, -333, -331, -330, -328, -326, -324, -323, -321, -319, -318,
-316, -314, -313, -311, -309, -307, -306, -304, -302, -301, -299, -297, -295, -294, -292, -290, -289, -287, -285, -283,
-282, -280, -278, -277, -275, -273, -271, -270, -268, -266, -265, -263, -261, -259, -258, -256, -254, -252, -251, -249,
-247, -245, -244, -242, -240, -239, -237, -235, -233, -232, -230, -228, -226, -225, -223, -221, -219, -218, -216, -214,
-212, -211, -209, -207, -205, -204, -202, -200, -198, -197, -195, -193, -191, -190, -188, -186, -184, -183, -181, -179,
-177, -176, -174, -172, -170, -169, -167, -165, -163, -161, -160, -158, -156, -154, -153, -151, -149, -147, -146, -144,
-142, -140, -138, -137, -135, -133, -131, -130, -128, -126, -124, -123, -121, -119, -117, -115, -114, -112, -110, -108,
-107, -105, -103, -101, -99, -98, -96, -94, -92, -91, -89, -87, -85, -83, -82, -80, -78, -76, -74, -73,
-71, -69, -67, -66, -64, -62, -60, -58, -57, -55, -53, -51, -50, -48, -46, -44, -42, -41, -39, -37,
-35, -33, -32, -30, -28, -26, -25, -23, -21, -19, -17, -16, -14, -12, -10, -8, -7, -5, -3, -1,
0, 1, 3, 5, 7, 8, 10, 12, 14, 16, 17, 19, 21, 23, 25, 26, 28, 30, 32, 33,
35, 37, 39, 41, 42, 44, 46, 48, 50, 51, 53, 55, 57, 58, 60, 62, 64, 66, 67, 69,
71, 73, 74, 76, 78, 80, 82, 83, 85, 87, 89, 91, 92, 94, 96, 98, 99, 101, 103, 105,
107, 108, 110, 112, 114, 115, 117, 119, 121, 123, 124, 126, 128, 130, 131, 133, 135, 137, 138, 140,
142, 144, 146, 147, 149, 151, 153, 154, 156, 158, 160, 161, 163, 165, 167, 169, 170, 172, 174, 176,
177, 179, 181, 183, 184, 186, 188, 190, 191, 193, 195, 197, 198, 200, 202, 204, 205, 207, 209, 211,
212, 214, 216, 218, 219, 221, 223, 225, 226, 228, 230, 232, 233, 235, 237, 239, 240, 242, 244, 245,
247, 249, 251, 252, 254, 256, 258, 259, 261, 263, 265, 266, 268, 270, 271, 273, 275, 277, 278, 280,
282, 283, 285, 287, 289, 290, 292, 294, 295, 297, 299, 301, 302, 304, 306, 307, 309, 311, 313, 314,
316, 318, 319, 321, 323, 324, 326, 328, 330, 331, 333, 335, 336, 338, 340, 341, 343, 345, 346, 348,
350, 351, 353, 355, 356, 358, 360, 361, 363, 365, 366, 368, 370, 371, 373, 375, 376, 378, 380, 381,
383, 385, 386, 388, 390, 391, 393, 395, 396, 398, 400, 401, 403, 405, 406, 408, 409, 411, 413, 414,
416, 418, 419, 421, 423, 424, 426, 427, 429, 431, 432, 434, 435, 437, 439, 440, 442, 444, 445, 447,
448, 450, 452, 453, 455, 456, 458, 460, 461, 463, 464, 466, 468, 469, 471, 472, 474, 475, 477, 479,
480, 482, 483, 485, 487, 488, 490, 491, 493, 494, 496, 498, 499, 501, 502, 504, 505, 507, 508, 510,
512, 513, 515, 516, 518, 519, 521, 522, 524, 525, 527, 528, 530, 531, 533, 535, 536, 538, 539, 541,
542, 544, 545, 547, 548, 550, 551, 553, 554, 556, 557, 559, 560, 562, 563, 565, 566, 568, 569, 571,
572, 574, 575, 577, 578, 579, 581, 582, 584, 585, 587, 588, 590, 591, 593, 594, 596, 597, 598, 600,
601, 603, 604, 606, 607, 609, 610, 611, 613, 614, 616, 617, 619, 620, 621, 623, 624, 626, 627, 629,
630, 631, 633, 634, 636, 637, 638, 640, 641, 643, 644, 645, 647, 648, 649, 651, 652, 654, 655, 656,
658, 659, 660, 662, 663, 665, 666, 667, 669, 670, 671, 673, 674, 675, 677, 678, 679, 681, 682, 683,
685, 686, 687, 689, 690, 691, 693, 694, 695, 697, 698, 699, 700, 702, 703, 704, 706, 707, 708, 710,
711, 712, 713, 715, 716, 717, 719, 720, 721, 722, 724, 725, 726, 727, 729, 730, 731, 732, 734, 735,
736, 737, 739, 740, 741, 742, 744, 745, 746, 747, 748, 750, 751, 752, 753, 754, 756, 757, 758, 759,
760, 762, 763, 764, 765, 766, 768, 769, 770, 771, 772, 773, 775, 776, 777, 778, 779, 780, 782, 783,
784, 785, 786, 787, 789, 790, 791, 792, 793, 794, 795, 796, 798, 799, 800, 801, 802, 803, 804, 805,
806, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 821, 822, 823, 824, 825, 826, 827,
828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847,
848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867,
868, 869, 870, 871, 872, 873, 874, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 885,
886, 887, 888, 889, 890, 891, 892, 892, 893, 894, 895, 896, 897, 898, 899, 899, 900, 901, 902, 903,
904, 904, 905, 906, 907, 908, 909, 909, 910, 911, 912, 913, 914, 914, 915, 916, 917, 918, 918, 919,
920, 921, 921, 922, 923, 924, 925, 925, 926, 927, 928, 928, 929, 930, 931, 931, 932, 933, 934, 934,
935, 936, 936, 937, 938, 939, 939, 940, 941, 941, 942, 943, 943, 944, 945, 946, 946, 947, 948, 948,
949, 950, 950, 951, 952, 952, 953, 954, 954, 955, 955, 956, 957, 957, 958, 959, 959, 960, 961, 961,
962, 962, 963, 964, 964, 965, 965, 966, 967, 967, 968, 968, 969, 969, 970, 971, 971, 972, 972, 973,
973, 974, 974, 975, 976, 976, 977, 977, 978, 978, 979, 979, 980, 980, 981, 981, 982, 982, 983, 983,
984, 984, 985, 985, 986, 986, 987, 987, 988, 988, 989, 989, 990, 990, 990, 991, 991, 992, 992, 993,
993, 994, 994, 994, 995, 995, 996, 996, 996, 997, 997, 998, 998, 998, 999, 999, 1000, 1000, 1000, 1001,
1001, 1001, 1002, 1002, 1003, 1003, 1003, 1004, 1004, 1004, 1005, 1005, 1005, 1006, 1006, 1006, 1007, 1007, 1007, 1008,
1008, 1008, 1009, 1009, 1009, 1009, 1010, 1010, 1010, 1011, 1011, 1011, 1011, 1012, 1012, 1012, 1013, 1013, 1013, 1013,
1014, 1014, 1014, 1014, 1015, 1015, 1015, 1015, 1015, 1016, 1016, 1016, 1016, 1017, 1017, 1017, 1017, 1017, 1018, 1018,
1018, 1018, 1018, 1018, 1019, 1019, 1019, 1019, 1019, 1019, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1021, 1021, 1021,
1021, 1021, 1021, 1021, 1021, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1023, 1023, 1023, 1023, 1023,
1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023
};
typedef struct {
int x, y, z;
} Vec3;
static Vec3 base_cube[8] = {
{-50, -50, -50}, { 50, -50, -50}, { 50, 50, -50}, {-50, 50, -50},
{-50, -50, 50}, { 50, -50, 50}, { 50, 50, 50}, {-50, 50, 50}
};
typedef struct {
int v[4];
uint32_t color;
int z_avg;
} Face;
static Face faces[6] = {
{{0, 1, 2, 3}, 0xFFFFFF00, 0},
{{5, 4, 7, 6}, 0xFFFFFFFF, 0},
{{4, 0, 3, 7}, 0xFFFF0000, 0},
{{1, 5, 6, 2}, 0xFFFF7F00, 0},
{{4, 5, 1, 0}, 0xFF00FF00, 0},
{{3, 2, 6, 7}, 0xFF0000FF, 0}
};
static uint32_t *fb = NULL;
static void put_pixel(int x, int y, uint32_t color) {
if (x >= 0 && x < WIN_W && y >= 0 && y < WIN_H) {
fb[y * WIN_W + x] = color;
}
}
static void fill_triangle(int x0, int y0, int x1, int y1, int x2, int y2, uint32_t color) {
if (y0 > y1) { int t = y0; y0 = y1; y1 = t; t = x0; x0 = x1; x1 = t; }
if (y1 > y2) { int t = y1; y1 = y2; y2 = t; t = x1; x1 = x2; x2 = t; }
if (y0 > y1) { int t = y0; y0 = y1; y1 = t; t = x0; x0 = x1; x1 = t; }
int total_height = y2 - y0;
if (total_height == 0) return;
for (int i = 0; i <= total_height; i++) {
int second_half = i > y1 - y0 || y1 == y0;
int segment_height = second_half ? y2 - y1 : y1 - y0;
if (segment_height == 0) continue;
int alpha_fp = (i * 65536) / total_height;
int beta_fp = ((i - (second_half ? y1 - y0 : 0)) * 65536) / segment_height;
int A_x = x0 + (((x2 - x0) * alpha_fp) >> 16);
int B_x = second_half ? x1 + (((x2 - x1) * beta_fp) >> 16) : x0 + (((x1 - x0) * beta_fp) >> 16);
int y = y0 + i;
if (A_x > B_x) { int t = A_x; A_x = B_x; B_x = t; }
if (y < 0 || y >= WIN_H) continue;
int px1 = A_x < 0 ? 0 : A_x;
int px2 = B_x >= WIN_W ? WIN_W - 1 : B_x;
for (int x = px1; x <= px2; x++) {
fb[y * WIN_W + x] = color;
}
}
}
static void rotate_x(int *y, int *z, int angle) {
int s = sin_lut[angle];
int c = cos_lut[angle];
int ny = (*y * c - *z * s) >> SHIFT;
int nz = (*y * s + *z * c) >> SHIFT;
*y = ny;
*z = nz;
}
static void rotate_y(int *x, int *z, int angle) {
int s = sin_lut[angle];
int c = cos_lut[angle];
int nx = (*x * c + *z * s) >> SHIFT;
int nz = (-(*x) * s + *z * c) >> SHIFT;
*x = nx;
*z = nz;
}
static void rotate_z(int *x, int *y, int angle) {
int s = sin_lut[angle];
int c = cos_lut[angle];
int nx = (*x * c - *y * s) >> SHIFT;
int ny = (*x * s + *y * c) >> SHIFT;
*x = nx;
*y = ny;
}
static void render_cube(ui_window_t win, int angle_x, int angle_y, int angle_z) {
// Clear fb
for (int i = 0; i < WIN_W * WIN_H; i++) {
fb[i] = 0xFF1E1E1E;
}
Vec3 proj[8];
// Transform and project
for (int i = 0; i < 8; i++) {
int x = base_cube[i].x;
int y = base_cube[i].y;
int z = base_cube[i].z;
rotate_x(&y, &z, angle_x);
rotate_y(&x, &z, angle_y);
rotate_z(&x, &y, angle_z);
proj[i].x = x;
proj[i].y = y;
proj[i].z = z;
}
for (int i = 0; i < 6; i++) {
int z_sum = 0;
for (int j = 0; j < 4; j++) {
z_sum += proj[faces[i].v[j]].z;
}
faces[i].z_avg = z_sum / 4;
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5 - i; j++) {
if (faces[j].z_avg < faces[j + 1].z_avg) {
Face temp = faces[j];
faces[j] = faces[j + 1];
faces[j + 1] = temp;
}
}
}
Vec3 screen[8];
for (int i= 0 ; i < 8; i++) {
int z_dist = proj[i].z + 200;
if (z_dist < 10) z_dist = 10;
screen[i].x = (proj[i].x * 256) / z_dist + WIN_W / 2;
screen[i].y = (proj[i].y * 256) / z_dist + WIN_H / 2;
screen[i].z = proj[i].z;
}
for (int i = 0; i < 6; i++) {
int v0 = faces[i].v[0];
int v1 = faces[i].v[1];
int v2 = faces[i].v[2];
int x0 = screen[v0].x; int y0_proj = screen[v0].y;
int x1 = screen[v1].x; int y1_proj = screen[v1].y;
int x2 = screen[v2].x; int y2_proj = screen[v2].y;
int v3 = faces[i].v[3];
int x3 = screen[v3].x; int y3_proj = screen[v3].y;
fill_triangle(x0, y0_proj, x1, y1_proj, x2, y2_proj, faces[i].color);
fill_triangle(x0, y0_proj, x2, y2_proj, x3, y3_proj, faces[i].color);
}
ui_draw_image(win, 0, 0, WIN_W, WIN_H, fb);
ui_mark_dirty(win, 0, 0, WIN_W, WIN_H);
}
int main(void) {
ui_window_t win = ui_window_create("cube", 100, 100, WIN_W, WIN_H);
fb = (uint32_t*)malloc(WIN_W * WIN_H * sizeof(uint32_t));
if (!fb) {
return 1;
}
int angle_x = 0;
int angle_y = 0;
int angle_z = 0;
gui_event_t ev;
while (1) {
if (ui_get_event(win, &ev)) {
if (ev.type == GUI_EVENT_CLOSE) {
break;
}
}
render_cube(win, angle_x, angle_y, angle_z);
angle_x = (angle_x + 2) % 3600;
angle_y = (angle_y + 3) % 3600;
angle_z = (angle_z + 1) % 3600;
sleep(15);
}
free(fb);
sys_exit(0);
return 0;
}

185
src/kernel/userland/sort.c Normal file
View file

@ -0,0 +1,185 @@
// Copyright (c) 2023-2026 Chris (boreddevnl)
// This software is released under the GNU General Public License v3.0. See LICENSE file for details.
// This header needs to maintain in any file it is present in, as per the GPL license terms.
#include "syscall.h"
#include "libui.h"
#include "stdlib.h"
#define WIN_W 400
#define WIN_H 210
#define NUM_ELEM (WIN_W / 2)
#define BAR_W 2
static uint32_t *fb = NULL;
static int heights[NUM_ELEM];
static int moves = 0;
static unsigned long int next_rand = 1;
static int my_rand(void) {
next_rand = next_rand * 1103515245 + 12345;
return (unsigned int)(next_rand / 65536) % 32768;
}
static void my_srand(unsigned int seed) {
next_rand = seed;
}
static void render_state(ui_window_t win) {
// Clear fb
for (int i = 0; i < WIN_W * WIN_H; i++) {
fb[i] = 0xFF1E1E1E;
}
// Draw bars
for (int i = 0; i < NUM_ELEM; i++) {
int h = heights[i];
if (h > WIN_H - 10) h = WIN_H - 10;
int x = i * BAR_W;
int y = WIN_H - h;
// draw rect
for (int yy = y; yy < WIN_H; yy++) {
for (int xx = x; xx < x + BAR_W; xx++) {
if (xx >= 0 && xx < WIN_W && yy >= 0 && yy < WIN_H) {
fb[yy * WIN_W + xx] = 0xFF4A90E2; // Blue
}
}
}
}
// Draw Border for Box - bottom left
int box_x = 10;
int box_y = WIN_H - 40; // moved up by 10 pixels
int box_w = 120;
int box_h = 24;
for (int yy = box_y; yy < box_y + box_h; yy++) {
for (int xx = box_x; xx < box_x + box_w; xx++) {
if (xx == box_x || xx == box_x + box_w - 1 || yy == box_y || yy == box_y + box_h - 1) {
fb[yy * WIN_W + xx] = 0xFFFFFFFF;
} else {
fb[yy * WIN_W + xx] = 0xFF1E1E1E;
}
}
}
// Draw framebuffer to window
ui_draw_image(win, 0, 0, WIN_W, WIN_H, fb);
// Draw text inside the box
char buf[32];
strcpy(buf, "Moves: ");
char num_buf[16];
itoa(moves, num_buf);
strcat(buf, num_buf);
ui_draw_string(win, box_x + 8, box_y + 4, buf, 0xFFFFFFFF);
ui_mark_dirty(win, 0, 0, WIN_W, WIN_H);
}
int main(void) {
ui_window_t win = ui_window_create("sort", 100, 100, WIN_W, WIN_H);
fb = (uint32_t*)malloc(WIN_W * WIN_H * sizeof(uint32_t));
if (!fb) return 1;
// Seed PRNG with system time (ticks)
my_srand((unsigned int)sys_system(16, 0, 0, 0, 0));
// Initialize perfect slope
int max_h = WIN_H - 40; // max height
int min_h = 10;
for (int i = 0; i < NUM_ELEM; i++) {
heights[i] = min_h + (max_h - min_h) * i / (NUM_ELEM - 1);
}
// Shuffle
for (int i = NUM_ELEM - 1; i > 0; i--) {
int j = my_rand() % (i + 1);
int t = heights[i];
heights[i] = heights[j];
heights[j] = t;
}
gui_event_t ev;
// Cocktail shaker sort variables
bool swapped = true;
int start = 0;
int end = NUM_ELEM - 1;
bool done = false;
// We render after each swap so the steps are extremely visual
while (1) {
if (ui_get_event(win, &ev)) {
if (ev.type == GUI_EVENT_CLOSE) {
break;
}
}
if (!done) {
swapped = false;
// Forward pass
for (int i = start; i < end; ++i) {
if (heights[i] > heights[i + 1]) {
int t = heights[i];
heights[i] = heights[i+1];
heights[i+1] = t;
swapped = true;
moves++;
render_state(win);
// Allow UI events while sorting
if (ui_get_event(win, &ev)) {
if (ev.type == GUI_EVENT_CLOSE) {
goto exit_app;
}
}
// No explicit sleep, rendering takes some time and provides natural visual delay.
// If it's too fast, we'll add sleep(1) here later.
}
}
if (!swapped) {
done = true;
continue;
}
swapped = false;
end = end - 1;
// Backward pass
for (int i = end - 1; i >= start; --i) {
if (heights[i] > heights[i + 1]) {
int t = heights[i];
heights[i] = heights[i+1];
heights[i+1] = t;
swapped = true;
moves++;
render_state(win);
// Allow UI events
if (ui_get_event(win, &ev)) {
if (ev.type == GUI_EVENT_CLOSE) {
goto exit_app;
}
}
}
}
start = start + 1;
} else {
// Sort is done, just render and idle
render_state(win);
sleep(50);
}
}
exit_app:
free(fb);
exit(0);
return 0;
}

File diff suppressed because it is too large Load diff