/* * Copyright (c) 2020 Actions Technology Co., Ltd * * SPDX-License-Identifier: Apache-2.0 */ #include #include #ifdef CONFIG_GUI_API_BROM #include #endif #ifndef CONFIG_GUI_API_BROM /* cos(M_PI * angle / 1800): angle is measured in 0.1 degree */ static const int32_t cos_fp30_tbl[901] = { 1073741824, 1073740188, 1073735282, 1073727105, 1073715657, 1073700939, 1073682950, 1073661690, 1073637159, 1073609359, 1073578287, 1073543946, 1073506334, 1073465452, 1073421301, 1073373879, 1073323188, 1073269227, 1073211997, 1073151497, 1073087729, 1073020692, 1072950386, 1072876812, 1072799969, 1072719859, 1072636481, 1072549836, 1072459923, 1072366744, 1072270298, 1072170585, 1072067607, 1071961363, 1071851853, 1071739079, 1071623039, 1071503736, 1071381168, 1071255337, 1071126242, 1070993885, 1070858265, 1070719384, 1070577240, 1070431836, 1070283171, 1070131245, 1069976060, 1069817615, 1069655912, 1069490950, 1069322730, 1069151253, 1068976519, 1068798529, 1068617283, 1068432782, 1068245026, 1068054017, 1067859753, 1067662237, 1067461469, 1067257449, 1067050178, 1066839656, 1066625885, 1066408864, 1066188595, 1065965079, 1065738315, 1065508304, 1065275049, 1065038548, 1064798802, 1064555813, 1064309582, 1064060108, 1063807393, 1063551437, 1063292242, 1063029808, 1062764135, 1062495225, 1062223079, 1061947697, 1061669080, 1061387229, 1061102144, 1060813828, 1060522280, 1060227501, 1059929493, 1059628256, 1059323792, 1059016100, 1058705183, 1058391040, 1058073674, 1057753084, 1057429273, 1057102240, 1056771987, 1056438515, 1056101825, 1055761917, 1055418794, 1055072456, 1054722904, 1054370139, 1054014162, 1053654974, 1053292577, 1052926972, 1052558159, 1052186139, 1051810915, 1051432486, 1051050855, 1050666022, 1050277988, 1049886756, 1049492325, 1049094697, 1048693873, 1048289855, 1047882644, 1047472240, 1047058646, 1046641862, 1046221890, 1045798731, 1045372386, 1044942857, 1044510145, 1044074251, 1043635177, 1043192924, 1042747493, 1042298885, 1041847102, 1041392146, 1040934018, 1040472718, 1040008250, 1039540613, 1039069809, 1038595841, 1038118708, 1037638414, 1037154958, 1036668343, 1036178570, 1035685641, 1035189557, 1034690320, 1034187931, 1033682391, 1033173703, 1032661867, 1032146886, 1031628761, 1031107493, 1030583084, 1030055536, 1029524851, 1028991029, 1028454072, 1027913983, 1027370762, 1026824412, 1026274935, 1025722330, 1025166602, 1024607750, 1024045778, 1023480686, 1022912476, 1022341150, 1021766710, 1021189158, 1020608495, 1020024723, 1019437844, 1018847859, 1018254771, 1017658581, 1017059291, 1016456903, 1015851418, 1015242839, 1014631168, 1014016406, 1013398555, 1012777617, 1012153594, 1011526487, 1010896300, 1010263033, 1009626688, 1008987268, 1008344775, 1007699210, 1007050575, 1006398872, 1005744104, 1005086273, 1004425379, 1003761426, 1003094416, 1002424349, 1001751230, 1001075058, 1000395838, 999713569, 999028256, 998339899, 997648502, 996954065, 996256591, 995556083, 994852542, 994145970, 993436370, 992723744, 992008094, 991289422, 990567730, 989843021, 989115297, 988384560, 987650812, 986914055, 986174292, 985431525, 984685756, 983936988, 983185223, 982430462, 981672709, 980911965, 980148234, 979381517, 978611816, 977839135, 977063474, 976284838, 975503227, 974718645, 973931094, 973140576, 972347094, 971550649, 970751245, 969948885, 969143569, 968335301, 967524084, 966709919, 965892810, 965072758, 964249767, 963423838, 962594974, 961763179, 960928453, 960090801, 959250224, 958406724, 957560306, 956710970, 955858720, 955003558, 954145488, 953284511, 952420629, 951553847, 950684166, 949811589, 948936119, 948057758, 947176510, 946292376, 945405359, 944515463, 943622689, 942727041, 941828521, 940927133, 940022878, 939115759, 938205780, 937292943, 936377251, 935458706, 934537312, 933613071, 932685986, 931756060, 930823296, 929887696, 928949264, 928008002, 927063913, 926117000, 925167266, 924214714, 923259346, 922301166, 921340176, 920376380, 919409781, 918440380, 917468182, 916493189, 915515405, 914534831, 913551472, 912565330, 911576408, 910584709, 909590237, 908592993, 907592982, 906590206, 905584669, 904576373, 903565321, 902551518, 901534964, 900515665, 899493622, 898468840, 897441320, 896411067, 895378083, 894342372, 893303936, 892262779, 891218904, 890172315, 889123014, 888071004, 887016289, 885958872, 884898756, 883835945, 882770442, 881702249, 880631371, 879557810, 878481569, 877402653, 876321064, 875236806, 874149881, 873060294, 871968047, 870873144, 869775588, 868675383, 867572531, 866467037, 865358903, 864248134, 863134731, 862018700, 860900042, 859778762, 858654863, 857528349, 856399222, 855267487, 854133146, 852996203, 851856662, 850714526, 849569799, 848422484, 847272584, 846120103, 844965045, 843807413, 842647211, 841484442, 840319109, 839151217, 837980769, 836807767, 835632217, 834454122, 833273484, 832090308, 830904598, 829716356, 828525587, 827332294, 826136481, 824938151, 823737309, 822533957, 821328100, 820119740, 818908883, 817695531, 816479688, 815261358, 814040544, 812817251, 811591482, 810363241, 809132531, 807899356, 806663721, 805425628, 804185081, 802942085, 801696643, 800448759, 799198437, 797945680, 796690492, 795432878, 794172841, 792910384, 791645512, 790378228, 789108537, 787836443, 786561948, 785285057, 784005774, 782724103, 781440048, 780153612, 778864800, 777573615, 776280061, 774984143, 773685864, 772385229, 771082240, 769776903, 768469221, 767159198, 765846838, 764532145, 763215123, 761895776, 760574109, 759250124, 757923827, 756595221, 755264311, 753931099, 752595591, 751257791, 749917702, 748575329, 747230675, 745883745, 744534543, 743183073, 741829340, 740473346, 739115097, 737754597, 736391849, 735026858, 733659628, 732290163, 730918467, 729544545, 728168400, 726790038, 725409461, 724026675, 722641683, 721254490, 719865100, 718473517, 717079746, 715683790, 714285654, 712885342, 711482859, 710078208, 708671394, 707262422, 705851295, 704438018, 703022595, 701605031, 700185329, 698763495, 697339532, 695913444, 694485237, 693054914, 691622481, 690187940, 688751297, 687312556, 685871721, 684428797, 682983788, 681536698, 680087533, 678636296, 677182991, 675727624, 674270198, 672810719, 671349190, 669885616, 668420001, 666952350, 665482668, 664010958, 662537226, 661061475, 659583711, 658103937, 656622159, 655138381, 653652607, 652164841, 650675090, 649183356, 647689645, 646193960, 644696307, 643196691, 641695115, 640191584, 638686104, 637178677, 635669310, 634158006, 632644771, 631129608, 629612523, 628093520, 626572604, 625049779, 623525050, 621998422, 620469899, 618939486, 617407188, 615873008, 614336953, 612799027, 611259233, 609717578, 608174065, 606628700, 605081487, 603532431, 601981536, 600428808, 598874250, 597317868, 595759667, 594199651, 592637825, 591074193, 589508762, 587941534, 586372515, 584801710, 583229124, 581654761, 580078627, 578500725, 576921061, 575339640, 573756466, 572171544, 570584880, 568996477, 567406341, 565814477, 564220889, 562625582, 561028561, 559429832, 557829398, 556227265, 554623438, 553017921, 551410720, 549801839, 548191283, 546579058, 544965167, 543349616, 541732411, 540113555, 538493053, 536870912, 535247134, 533621727, 531994694, 530366040, 528735771, 527103891, 525470406, 523835320, 522198638, 520560365, 518920507, 517279068, 515636054, 513991468, 512345317, 510697605, 509048338, 507397520, 505745156, 504091252, 502435812, 500778841, 499120346, 497460329, 495798798, 494135756, 492471209, 490805161, 489137619, 487468587, 485798070, 484126072, 482452601, 480777659, 479101253, 477423388, 475744068, 474063299, 472381086, 470697434, 469012348, 467325834, 465637896, 463948540, 462257770, 460565592, 458872011, 457177033, 455480661, 453782903, 452083762, 450383244, 448681354, 446978097, 445273478, 443567503, 441860178, 440151506, 438441493, 436730145, 435017466, 433303462, 431588138, 429871500, 428153552, 426434300, 424713749, 422991904, 421268771, 419544354, 417818659, 416091692, 414363457, 412633960, 410903206, 409171200, 407437948, 405703455, 403967726, 402230766, 400492581, 398753177, 397012557, 395270728, 393527695, 391783463, 390038038, 388291425, 386543629, 384794655, 383044510, 381293197, 379540723, 377787093, 376032312, 374276385, 372519319, 370761118, 369001787, 367241332, 365479759, 363717072, 361953277, 360188380, 358422385, 356655299, 354887126, 353117873, 351347543, 349576144, 347803679, 346030155, 344255577, 342479950, 340703280, 338925572, 337146832, 335367065, 333586276, 331804471, 330021655, 328237834, 326453013, 324667198, 322880393, 321092605, 319303839, 317514101, 315723395, 313931727, 312139103, 310345528, 308551008, 306755548, 304959154, 303161830, 301363583, 299564419, 297764341, 295963357, 294161471, 292358689, 290555016, 288750458, 286945021, 285138709, 283331529, 281523486, 279714586, 277904833, 276094234, 274282794, 272470518, 270657412, 268843482, 267028733, 265213170, 263396799, 261579627, 259761657, 257942896, 256123349, 254303022, 252481921, 250660050, 248837416, 247014024, 245189879, 243364988, 241539355, 239712986, 237885887, 236058064, 234229521, 232400265, 230570301, 228739635, 226908272, 225076218, 223243478, 221410058, 219575963, 217741200, 215905773, 214069689, 212232953, 210395570, 208557546, 206718887, 204879598, 203039685, 201199154, 199358010, 197516258, 195673905, 193830956, 191987416, 190143292, 188298588, 186453311, 184607465, 182761058, 180914093, 179066578, 177218517, 175369916, 173520781, 171671118, 169820931, 167970227, 166119012, 164267290, 162415069, 160562352, 158709146, 156855457, 155001290, 153146651, 151291545, 149435979, 147579957, 145723486, 143866571, 142009217, 140151431, 138293218, 136434584, 134575534, 132716075, 130856211, 128995948, 127135292, 125274250, 123412825, 121551025, 119688854, 117826319, 115963425, 114100177, 112236582, 110372645, 108508372, 106643769, 104778840, 102913593, 101048031, 99182163, 97315991, 95449524, 93582766, 91715722, 89848400, 87980803, 86112939, 84244812, 82376429, 80507794, 78638915, 76769796, 74900443, 73030862, 71161058, 69291038, 67420806, 65550370, 63679733, 61808903, 59937884, 58066683, 56195305, 54323755, 52452040, 50580166, 48708137, 46835960, 44963640, 43091184, 41218596, 39345882, 37473049, 35600101, 33727045, 31853887, 29980631, 28107284, 26233851, 24360338, 22486752, 20613096, 18739378, 16865603, 14991776, 13117904, 11243992, 9370046, 7496071, 5622073, 3748058, 1874032, 0, }; #endif /* CONFIG_GUI_API_BROM */ /* cos(M_PI * angle / 1800): angle is measured in 0.1 degree */ static const int16_t cos_fp14_tbl[901] = { 16384, 16383, 16383, 16383, 16383, 16383, 16383, 16382, 16382, 16381, 16381, 16380, 16380, 16379, 16379, 16378, 16377, 16376, 16375, 16374, 16374, 16372, 16371, 16370, 16369, 16368, 16367, 16365, 16364, 16363, 16361, 16360, 16358, 16356, 16355, 16353, 16351, 16349, 16347, 16346, 16344, 16342, 16340, 16337, 16335, 16333, 16331, 16328, 16326, 16324, 16321, 16319, 16316, 16313, 16311, 16308, 16305, 16302, 16300, 16297, 16294, 16291, 16288, 16285, 16281, 16278, 16275, 16272, 16268, 16265, 16261, 16258, 16254, 16251, 16247, 16243, 16240, 16236, 16232, 16228, 16224, 16220, 16216, 16212, 16208, 16204, 16199, 16195, 16191, 16186, 16182, 16177, 16173, 16168, 16163, 16159, 16154, 16149, 16144, 16140, 16135, 16130, 16125, 16119, 16114, 16109, 16104, 16099, 16093, 16088, 16082, 16077, 16071, 16066, 16060, 16055, 16049, 16043, 16037, 16031, 16025, 16020, 16013, 16007, 16001, 15995, 15989, 15983, 15976, 15970, 15964, 15957, 15951, 15944, 15937, 15931, 15924, 15917, 15911, 15904, 15897, 15890, 15883, 15876, 15869, 15862, 15854, 15847, 15840, 15833, 15825, 15818, 15810, 15803, 15795, 15788, 15780, 15772, 15764, 15757, 15749, 15741, 15733, 15725, 15717, 15709, 15701, 15692, 15684, 15676, 15668, 15659, 15651, 15642, 15634, 15625, 15617, 15608, 15599, 15590, 15582, 15573, 15564, 15555, 15546, 15537, 15528, 15519, 15509, 15500, 15491, 15482, 15472, 15463, 15453, 15444, 15434, 15425, 15415, 15405, 15395, 15386, 15376, 15366, 15356, 15346, 15336, 15326, 15316, 15306, 15295, 15285, 15275, 15264, 15254, 15243, 15233, 15222, 15212, 15201, 15190, 15180, 15169, 15158, 15147, 15136, 15125, 15114, 15103, 15092, 15081, 15070, 15059, 15047, 15036, 15025, 15013, 15002, 14990, 14979, 14967, 14955, 14944, 14932, 14920, 14908, 14896, 14884, 14873, 14861, 14848, 14836, 14824, 14812, 14800, 14787, 14775, 14763, 14750, 14738, 14725, 14713, 14700, 14688, 14675, 14662, 14649, 14636, 14624, 14611, 14598, 14585, 14572, 14559, 14545, 14532, 14519, 14506, 14492, 14479, 14466, 14452, 14439, 14425, 14412, 14398, 14384, 14371, 14357, 14343, 14329, 14315, 14301, 14287, 14273, 14259, 14245, 14231, 14217, 14203, 14188, 14174, 14160, 14145, 14131, 14116, 14102, 14087, 14073, 14058, 14043, 14029, 14014, 13999, 13984, 13969, 13954, 13939, 13924, 13909, 13894, 13879, 13864, 13848, 13833, 13818, 13802, 13787, 13771, 13756, 13740, 13725, 13709, 13693, 13678, 13662, 13646, 13630, 13614, 13598, 13582, 13566, 13550, 13534, 13518, 13502, 13486, 13470, 13453, 13437, 13420, 13404, 13388, 13371, 13355, 13338, 13321, 13305, 13288, 13271, 13254, 13238, 13221, 13204, 13187, 13170, 13153, 13136, 13119, 13102, 13084, 13067, 13050, 13033, 13015, 12998, 12980, 12963, 12945, 12928, 12910, 12893, 12875, 12857, 12840, 12822, 12804, 12786, 12768, 12750, 12732, 12714, 12696, 12678, 12660, 12642, 12624, 12605, 12587, 12569, 12550, 12532, 12514, 12495, 12477, 12458, 12439, 12421, 12402, 12383, 12365, 12346, 12327, 12308, 12289, 12270, 12251, 12232, 12213, 12194, 12175, 12156, 12137, 12118, 12098, 12079, 12060, 12040, 12021, 12001, 11982, 11962, 11943, 11923, 11904, 11884, 11864, 11845, 11825, 11805, 11785, 11765, 11745, 11725, 11705, 11685, 11665, 11645, 11625, 11605, 11585, 11564, 11544, 11524, 11504, 11483, 11463, 11442, 11422, 11401, 11381, 11360, 11340, 11319, 11298, 11278, 11257, 11236, 11215, 11194, 11173, 11152, 11131, 11110, 11089, 11068, 11047, 11026, 11005, 10984, 10963, 10941, 10920, 10899, 10877, 10856, 10834, 10813, 10791, 10770, 10748, 10727, 10705, 10683, 10662, 10640, 10618, 10597, 10575, 10553, 10531, 10509, 10487, 10465, 10443, 10421, 10399, 10377, 10355, 10332, 10310, 10288, 10266, 10243, 10221, 10199, 10176, 10154, 10132, 10109, 10086, 10064, 10041, 10019, 9996, 9973, 9951, 9928, 9905, 9882, 9860, 9837, 9814, 9791, 9768, 9745, 9722, 9699, 9676, 9653, 9630, 9607, 9583, 9560, 9537, 9514, 9490, 9467, 9444, 9420, 9397, 9374, 9350, 9327, 9303, 9279, 9256, 9232, 9209, 9185, 9161, 9138, 9114, 9090, 9066, 9042, 9019, 8995, 8971, 8947, 8923, 8899, 8875, 8851, 8827, 8803, 8778, 8754, 8730, 8706, 8682, 8657, 8633, 8609, 8584, 8560, 8536, 8511, 8487, 8462, 8438, 8413, 8389, 8364, 8340, 8315, 8290, 8266, 8241, 8216, 8192, 8167, 8142, 8117, 8092, 8067, 8042, 8018, 7993, 7968, 7943, 7918, 7893, 7867, 7842, 7817, 7792, 7767, 7742, 7717, 7691, 7666, 7641, 7615, 7590, 7565, 7539, 7514, 7489, 7463, 7438, 7412, 7387, 7361, 7336, 7310, 7284, 7259, 7233, 7207, 7182, 7156, 7130, 7105, 7079, 7053, 7027, 7001, 6975, 6950, 6924, 6898, 6872, 6846, 6820, 6794, 6768, 6742, 6716, 6690, 6663, 6637, 6611, 6585, 6559, 6533, 6506, 6480, 6454, 6428, 6401, 6375, 6349, 6322, 6296, 6269, 6243, 6217, 6190, 6164, 6137, 6111, 6084, 6057, 6031, 6004, 5978, 5951, 5924, 5898, 5871, 5844, 5818, 5791, 5764, 5737, 5711, 5684, 5657, 5630, 5603, 5576, 5549, 5522, 5496, 5469, 5442, 5415, 5388, 5361, 5334, 5307, 5280, 5252, 5225, 5198, 5171, 5144, 5117, 5090, 5062, 5035, 5008, 4981, 4954, 4926, 4899, 4872, 4844, 4817, 4790, 4762, 4735, 4708, 4680, 4653, 4625, 4598, 4570, 4543, 4516, 4488, 4461, 4433, 4405, 4378, 4350, 4323, 4295, 4268, 4240, 4212, 4185, 4157, 4129, 4102, 4074, 4046, 4019, 3991, 3963, 3935, 3908, 3880, 3852, 3824, 3796, 3769, 3741, 3713, 3685, 3657, 3629, 3601, 3574, 3546, 3518, 3490, 3462, 3434, 3406, 3378, 3350, 3322, 3294, 3266, 3238, 3210, 3182, 3154, 3126, 3098, 3070, 3041, 3013, 2985, 2957, 2929, 2901, 2873, 2845, 2816, 2788, 2760, 2732, 2704, 2675, 2647, 2619, 2591, 2563, 2534, 2506, 2478, 2449, 2421, 2393, 2365, 2336, 2308, 2280, 2251, 2223, 2195, 2166, 2138, 2110, 2081, 2053, 2025, 1996, 1968, 1939, 1911, 1883, 1854, 1826, 1797, 1769, 1741, 1712, 1684, 1655, 1627, 1598, 1570, 1541, 1513, 1484, 1456, 1427, 1399, 1370, 1342, 1313, 1285, 1256, 1228, 1199, 1171, 1142, 1114, 1085, 1057, 1028, 1000, 971, 943, 914, 886, 857, 828, 800, 771, 743, 714, 686, 657, 628, 600, 571, 543, 514, 486, 457, 428, 400, 371, 343, 314, 285, 257, 228, 200, 171, 142, 114, 85, 57, 28, 0, }; int32_t sw_cos30(uint16_t angle) { assert(angle <= 3600); #ifdef CONFIG_GUI_API_BROM return p_brom_libgui_api->p_sw_cos30(angle); #else if (angle <= 900) { return cos_fp30_tbl[angle]; } else if (angle <= 1800) { return -cos_fp30_tbl[1800 - angle]; } else if (angle <= 2700) { return -cos_fp30_tbl[angle - 1800]; } else if (angle <= 3600) { return cos_fp30_tbl[3600 - angle]; } else { return cos_fp30_tbl[0]; } #endif /* CONFIG_GUI_API_BROM */ } int32_t sw_sin30(uint16_t angle) { assert(angle <= 3600); #ifdef CONFIG_GUI_API_BROM return p_brom_libgui_api->p_sw_sin30(angle); #else #if 0 if (angle <= 900) { return sw_cos30(900 - angle); } else { return sw_cos30(3600 + 900 - angle); } #else if (angle <= 900) { return cos_fp30_tbl[900 - angle]; } else if (angle <= 1800) { return cos_fp30_tbl[angle - 900]; } else if (angle <= 2700) { return -cos_fp30_tbl[2700 - angle]; } else if (angle <= 3600) { return -cos_fp30_tbl[angle - 2700]; } else { return cos_fp30_tbl[900]; } #endif #endif /* CONFIG_GUI_API_BROM */ } int16_t sw_cos14(uint16_t angle) { assert(angle <= 3600); if (angle <= 900) { return cos_fp14_tbl[angle]; } else if (angle <= 1800) { return -cos_fp14_tbl[1800 - angle]; } else if (angle <= 2700) { return -cos_fp14_tbl[angle - 1800]; } else if (angle <= 3600) { return cos_fp14_tbl[3600 - angle]; } else { return cos_fp14_tbl[0]; } } int16_t sw_sin14(uint16_t angle) { assert(angle <= 3600); #if 0 if (angle <= 900) { return sw_cos14(900 - angle); } else { return sw_cos14(3600 + 900 - angle); } #else if (angle <= 900) { return cos_fp14_tbl[900 - angle]; } else if (angle <= 1800) { return cos_fp14_tbl[angle - 900]; } else if (angle <= 2700) { return -cos_fp14_tbl[2700 - angle]; } else if (angle <= 3600) { return -cos_fp14_tbl[angle - 2700]; } else { return cos_fp14_tbl[900]; } #endif } void sw_rotate_point32(int32_t *dest_x, int32_t *dest_y, int32_t src_x, int32_t src_y, int32_t pivot_x, int32_t pivot_y, uint16_t angle) { #ifdef CONFIG_GUI_API_BROM p_brom_libgui_api->p_sw_rotate_point32( dest_x, dest_y, src_x, src_y, pivot_x, pivot_y, angle); #else int64_t x = src_x - pivot_x; int64_t y = src_y - pivot_y; assert(angle >= 0 && angle <= 3600); *dest_x = (int32_t)((x * sw_cos30(angle) - y * sw_sin30(angle)) >> 30) + pivot_x; *dest_y = (int32_t)((x * sw_sin30(angle) + y * sw_cos30(angle)) >> 30) + pivot_y; #endif /* CONFIG_GUI_API_BROM */ } void sw_rotate_point16(int16_t *dest_x, int16_t *dest_y, int16_t src_x, int16_t src_y, int16_t pivot_x, int16_t pivot_y, uint16_t angle) { int32_t x = src_x - pivot_x; int32_t y = src_y - pivot_y; assert(angle >= 0 && angle <= 3600); *dest_x = round_fixedpoint(x * sw_cos14(angle) - y * sw_sin14(angle), 14) + pivot_x; *dest_y = round_fixedpoint(x * sw_sin14(angle) + y * sw_cos14(angle), 14) + pivot_y; } void sw_rotate_area16( int16_t *dest_x1, int16_t *dest_y1, int16_t *dest_x2, int16_t *dest_y2, int16_t src_x1, int16_t src_y1, int16_t src_x2, int16_t src_y2, int16_t pivot_x, int16_t pivot_y, uint16_t angle) { #ifdef CONFIG_GUI_API_BROM p_brom_libgui_api->p_sw_rotate_area16( dest_x1, dest_y1, dest_x2, dest_y2, src_x1, src_y1, src_x2, src_y2, pivot_x, pivot_y, angle); #else int32_t pt[4][2] = { { PX_FIXEDPOINT1(src_x1), PX_FIXEDPOINT1(src_y1), }, { PX_FIXEDPOINT1(src_x1), PX_FIXEDPOINT1(src_y2), }, { PX_FIXEDPOINT1(src_x2), PX_FIXEDPOINT1(src_y2), }, { PX_FIXEDPOINT1(src_x2), PX_FIXEDPOINT1(src_y1), }, }; int i; assert(angle >= 0 && angle <= 3600); sw_rotate_point32(&pt[0][0], &pt[0][1], pt[0][0], pt[0][1], FIXEDPOINT1(pivot_x), FIXEDPOINT1(pivot_y), angle); *dest_x1 = pt[0][0]; *dest_y1 = pt[0][1]; *dest_x2 = pt[0][0]; *dest_y2 = pt[0][1]; for (i = 1; i < 4; i++) { sw_rotate_point32(&pt[i][0], &pt[i][1], pt[i][0], pt[i][1], FIXEDPOINT1(pivot_x), FIXEDPOINT1(pivot_y), angle); if (*dest_x1 > pt[i][0]) *dest_x1 = pt[i][0]; else if (*dest_x2 < pt[i][0]) *dest_x2 = pt[i][0]; if (*dest_y1 > pt[i][1]) *dest_y1 = pt[i][1]; else if (*dest_y2 < pt[i][1]) *dest_y2 = pt[i][1]; } *dest_x1 = ROUND_FIXEDPOINT1(*dest_x1 - FIXEDPOINT1_0_5); *dest_y1 = ROUND_FIXEDPOINT1(*dest_y1 - FIXEDPOINT1_0_5); *dest_x2 = ROUND_FIXEDPOINT1(*dest_x2 - FIXEDPOINT1_0_5); *dest_y2 = ROUND_FIXEDPOINT1(*dest_y2 - FIXEDPOINT1_0_5); #endif /* CONFIG_GUI_API_BROM */ }