Compare commits
1229 Commits
7.5.0.22062402
...
blit
| Author | SHA1 | Date | |
|---|---|---|---|
| 76ed4fefe1 | |||
| f73799f4fc | |||
| da9691a195 | |||
| 2b829dbc07 | |||
| 2147242d91 | |||
| 3a06f5e7c6 | |||
| 7d000076ed | |||
| e0df6d9b0b | |||
| 2a860ca1c4 | |||
| d8326fdb36 | |||
| 8ebeebe7ea | |||
| 328b056410 | |||
| eb89a9bafb | |||
| a8351b86c2 | |||
| c78484dfb3 | |||
| 255fd01f1b | |||
| ea706a8071 | |||
| ee4d982bd0 | |||
| 0e3630e602 | |||
| a4a8fa95ee | |||
| 759b17f195 | |||
| db123458a3 | |||
| 063092875b | |||
| 7591092518 | |||
| 87d598604e | |||
| 4f4516f3fc | |||
| 1f91895624 | |||
| f019785797 | |||
| d2b25deec4 | |||
| 0a04eadc55 | |||
| 91300cdc0e | |||
| 151acc6959 | |||
| d598d39520 | |||
| bb2b1bc23a | |||
| 6f76c83421 | |||
| bbdff96b49 | |||
| c621ec4865 | |||
| d75a4950cb | |||
| 49bdc8819f | |||
| 68e9e02bf8 | |||
| d702a4f62e | |||
| 236d836274 | |||
| ecf89db683 | |||
| 18e54353fe | |||
| bd8ffe068d | |||
| 2ec1e32681 | |||
| 77c342b6ab | |||
| 69a7b58756 | |||
| 1c9b12c69e | |||
| 60bac24065 | |||
| 73a5efcb7c | |||
| 19cf6b57f6 | |||
| 65ee166afb | |||
| 3fe4f6ac8f | |||
| 9be196163c | |||
| 4574a50590 | |||
| a57ac97e10 | |||
| 4fb8316903 | |||
| 0b424a8221 | |||
| 367f32bd06 | |||
| 214833b1ec | |||
| 4326981a4d | |||
| 9f96f132e7 | |||
| 51e89cb7bd | |||
| 8a7fc84f96 | |||
| 0165b94e0e | |||
| f1190f7187 | |||
| 7cc434691a | |||
| d54c29e2b7 | |||
| 17c9c6f62c | |||
| 2e8c59b94a | |||
| f968c5016b | |||
| b3406bc9ae | |||
| 5a0ca315bf | |||
| 57a1a9ece6 | |||
| 85a21e93e3 | |||
| a559f10792 | |||
| 4e4dc33843 | |||
| 51985b8633 | |||
| a0f4ed2ca6 | |||
| fd3f9102dc | |||
| 0c03ca25b5 | |||
| 1c49408810 | |||
| b1cace6a24 | |||
| f4fd9156c0 | |||
| 85f9d77c9d | |||
| 6d92653229 | |||
| e69967fc94 | |||
| 4fc96ee3ba | |||
| 646bc8b398 | |||
| a1302ecb3b | |||
| ff2302f542 | |||
| 2bd1c71fd8 | |||
| 9c3957a567 | |||
| 9df7c047e4 | |||
| 4a53152c96 | |||
| e9be0244ca | |||
| ff5bb28fe6 | |||
| 89618e957f | |||
| aa9432948f | |||
| 34c12fd310 | |||
| b4ce3ccf9b | |||
| a433009de8 | |||
| b87b673e0f | |||
| eff081741a | |||
| 6667c50ce4 | |||
| 3ff388c5ed | |||
| b0ded80c22 | |||
| c97c4871a6 | |||
| 8c179a88a4 | |||
| 384b70a301 | |||
| ba903152a0 | |||
| 8668e3c986 | |||
| 7039ec5d34 | |||
| 02c1e46cbb | |||
| d1a91a85e4 | |||
| 5781e3b4f4 | |||
| d6a72cfef3 | |||
| bb791f4a9e | |||
| 2c2d08e5f1 | |||
| 8a55b45cc9 | |||
| 26689f992b | |||
| 80b3e8236e | |||
| a1f631285f | |||
| 3a9db89382 | |||
| deae896fec | |||
| 70892cdf1d | |||
| b6d51b7b0b | |||
| b3611b04cd | |||
| beebbf86af | |||
| 9ac23face8 | |||
| 4e416ffebb | |||
| 3e6afe04bb | |||
| c96aac25c4 | |||
| 4d6bd0e14e | |||
| f7b6001771 | |||
| 06aff37241 | |||
| d14bb49be1 | |||
| 738e4b30ec | |||
| 7fd8f66145 | |||
| 3ef37f8adf | |||
| a168f4be32 | |||
| 242431b0b0 | |||
| 9a06311d97 | |||
| d89abb44f1 | |||
| f5dd816d1f | |||
| 89f17d3aeb | |||
| 5cb1b0de72 | |||
| 9a1d7f57d3 | |||
| 1e98a7046b | |||
| f2d55f9657 | |||
| e0b051cf56 | |||
| 0419548455 | |||
| 03d37d24dc | |||
| a2fdb61f70 | |||
| 8d6345e04a | |||
| 93f8cb30b7 | |||
| 94522d104b | |||
| 9f1dbf208c | |||
| fd86992a0e | |||
| d2cb7c82b8 | |||
| 6052b3ec2c | |||
| 2a6fa817de | |||
| 28e8203527 | |||
| 6ec246eaee | |||
| 0e39a75e10 | |||
| 1a69e9af1b | |||
| 513099ef0f | |||
| d8d5c2889a | |||
| 0c076bf365 | |||
| a12f7e96f7 | |||
| 8eff33f250 | |||
| 12d337252e | |||
| 5951976050 | |||
| cda2f03dc1 | |||
| 5f05df1721 | |||
| 62eadebbee | |||
| 6dd9afb0ab | |||
| 9e0e85bc86 | |||
| 36f41e3d22 | |||
| 6d9b593555 | |||
| 28cea14a7f | |||
| a45f7c71e3 | |||
| eff49c8e43 | |||
| 053428b945 | |||
| 22a1e0525b | |||
| 79aedc830c | |||
| 1c84857191 | |||
| ebc1ed7ab6 | |||
| 8a3b69347a | |||
| 9b82eaf228 | |||
| 33c86d3b93 | |||
| c7c7733be3 | |||
| 3d7b15c521 | |||
| 3918cd3e93 | |||
| f42b11ce6b | |||
| e8c11080a5 | |||
| 194cacf7f2 | |||
| a0dba5ca1d | |||
| 6c89fcb29d | |||
| ad2e80f900 | |||
| be95fa7412 | |||
| 7094d87843 | |||
| 9e02cf20f4 | |||
| d284791ffb | |||
| 8637d74c3a | |||
| 69701070b6 | |||
| 76b8962bc5 | |||
| 2f19f4d3e9 | |||
| 17e1cf0a67 | |||
| 49e531fabb | |||
| 1bd7bc6d53 | |||
| ed19b3c333 | |||
| fb251c362d | |||
| 3e0a84ee8c | |||
| db419875b0 | |||
| a474006d40 | |||
| d764a100a6 | |||
| bc2f9c866b | |||
| a49bd0133c | |||
| 97f67f3cb8 | |||
| bec8d214d3 | |||
| 7cd3ed824f | |||
| 7fd6fda193 | |||
| 0c0b824be6 | |||
| 261e4f9926 | |||
| 221815a3ad | |||
| 33e740e4ad | |||
| b64c4c0904 | |||
| e00dd6a491 | |||
| 2a6bfb8878 | |||
| 90b29854a9 | |||
| 9358dbc613 | |||
| ea4e9bc144 | |||
| 280ea1e0e4 | |||
| d5a7b257dc | |||
| 84238fcca5 | |||
| f4990b9f98 | |||
| e0d6230f2f | |||
| c0385ce188 | |||
| e624691fc3 | |||
| a173928fe6 | |||
| 4e06513d07 | |||
| a66a521660 | |||
| 7c08938fb9 | |||
| c51c5e0e7d | |||
| ca649f95ec | |||
| 247b5d33cd | |||
| c9bdd74a5c | |||
| 86be00ff75 | |||
| eadff6ee94 | |||
| 687e1f190d | |||
| d0f293d799 | |||
| 32ee3ed517 | |||
| 84d12e2a93 | |||
| e52ba082bb | |||
| b3dd01d50a | |||
| 23122310ae | |||
| 74027bef5d | |||
| aa6cedcc87 | |||
| 2a1ecfd497 | |||
| fc561141d4 | |||
| e4c7faf8de | |||
| c06da680ed | |||
| 70ef636572 | |||
| 3029937cf6 | |||
| bba9e06d31 | |||
| 417dd54e49 | |||
| 87fd6ea4f3 | |||
| 35cdc01c27 | |||
| a4b1172883 | |||
| 3c8a31cff2 | |||
| 780fe50050 | |||
| 094bf6edb5 | |||
| ae9d6d2ea3 | |||
| 78d423b9e9 | |||
| 926f9190be | |||
| cecc13498a | |||
| 1051e3f2dc | |||
| b5bb26fa52 | |||
| 58efd993dd | |||
| ddff0df466 | |||
| fbbe9b138b | |||
| 2ade8e0449 | |||
| 929aedd082 | |||
| f06cac8537 | |||
| 3b08646baa | |||
| b3558d0725 | |||
| 6387e44694 | |||
| 498b0966be | |||
| 6fb620c12a | |||
| da7d90ea41 | |||
| 5893414f21 | |||
| 3e571d04d2 | |||
| d2c385a713 | |||
| 9a821eca85 | |||
| 40472632a9 | |||
| 89c07909ef | |||
| a55ca53310 | |||
| fb44010b7f | |||
| 6ea0a43e47 | |||
| 5161728f5e | |||
| e7bb3967f2 | |||
| 637af5a21e | |||
| 82dd8ffe95 | |||
| 9f24f22206 | |||
| 5d069f1589 | |||
| 77692f7a7f | |||
| 0bfa9a022b | |||
| f98221a54f | |||
| b830143788 | |||
| c404490bd2 | |||
| 591c440647 | |||
| a95e59bd7c | |||
| 458bbe3ba4 | |||
| a40856fdad | |||
| adfe4fc712 | |||
| 1ba031b1c5 | |||
| 77236946d0 | |||
| f49a7d293a | |||
| 268de01790 | |||
| beeed03b54 | |||
| 8784250be9 | |||
| 4f972a5c39 | |||
| 561dcdbe74 | |||
| 8906015895 | |||
| 5d6d660e0b | |||
| 758b5e2f38 | |||
| 198fc93532 | |||
| f82f7d82d5 | |||
| 0558efe5d9 | |||
| 7b1ea17a91 | |||
| 99514a9341 | |||
| 457ba21aba | |||
| 570cbb8b5b | |||
| 665e5760d8 | |||
| 1cb7d09b97 | |||
| 8cb0fd0670 | |||
| 922798185c | |||
| 2bd84d93b8 | |||
| b2ce4fa349 | |||
| 978126612f | |||
| 1e4298ed61 | |||
| 6b227619e9 | |||
| 2a6bda3a3d | |||
| 0628b3c1ae | |||
| 801cee5db1 | |||
| ca1c0f94f5 | |||
| c356f177d4 | |||
| 0a434367b3 | |||
| 250bb26b16 | |||
| 3a1b3e75d3 | |||
| 6f6e40e066 | |||
| eb7ca2d684 | |||
| d376f8cc30 | |||
| 9b051a0918 | |||
| fadff3ae4c | |||
| 4f6951e911 | |||
| 8cd3d4553d | |||
| 0d558d2670 | |||
| 7350cd81fd | |||
| c540df7fd1 | |||
| 7d17c94251 | |||
| 2a18f54179 | |||
| 3b910c8227 | |||
| 7b2a55e0a4 | |||
| 51fcf958e8 | |||
| 053d0bc158 | |||
| 73300ccc27 | |||
| 37b000f36c | |||
| 93d3163b01 | |||
| 260913703b | |||
| 879c32e538 | |||
| c4ff37826a | |||
| 3e14e1f25e | |||
| 68e2cfb420 | |||
| e531f7561a | |||
| 96ff02dff8 | |||
| aa7a197771 | |||
| c8e22d8c7f | |||
| 5de6385165 | |||
| 9b6df453bc | |||
| b23ecf3603 | |||
| d7d53a06b9 | |||
| bae6672f36 | |||
| 0e0e91495f | |||
| 329e0f49de | |||
| 97d1fd059d | |||
| 55858f9f6d | |||
| 1b8269d746 | |||
| f02ca4c042 | |||
| f3e19bd772 | |||
| 76be237d8b | |||
| 64dd878b6b | |||
| b1b8b03f12 | |||
| d5a816c4fe | |||
| bef4a6f99e | |||
| 72f3513022 | |||
| 47b82bb2d4 | |||
| 362b22bd4d | |||
| 6226a8a78b | |||
| e3d443acc3 | |||
| 034ebf7d54 | |||
| c54034c7e0 | |||
| 09eb77b56e | |||
| be5ad751cf | |||
| 2b85a7f1eb | |||
| 708c7a52a1 | |||
| b42b24be75 | |||
| 5a124d6d45 | |||
| 98328bd6b9 | |||
| a494d160c4 | |||
| 91e3fc15c7 | |||
| 2b719a5b86 | |||
| 9ce786d578 | |||
| 994f358ca8 | |||
| cfd17c616c | |||
| 4826741846 | |||
| 258beb1b38 | |||
| c0de244fd9 | |||
| a39cb7c8f6 | |||
| f1462bd1e1 | |||
| c7c713c6de | |||
| b9d1660377 | |||
| 9366678fef | |||
| c105989111 | |||
| a4d0b79de4 | |||
| 6e910343e1 | |||
| d33317fdb8 | |||
| e020f225f8 | |||
| a727c0edec | |||
| 546b903660 | |||
| 39193405ed | |||
| 351c97bf09 | |||
| b903fc7fb1 | |||
| 067a8b4831 | |||
| f766375dd6 | |||
| 4b56f275f4 | |||
| 6067437ea2 | |||
| 6517d35727 | |||
| 7a6f0d6082 | |||
| d38c505ec8 | |||
| b74c14d93a | |||
| 3cb327ff8d | |||
| a8f4d149da | |||
| 3753cfa417 | |||
| 1b6ef60a37 | |||
| 58ed0461f9 | |||
| 93ffeb8c32 | |||
| 1feed24f14 | |||
| 72a2b88af9 | |||
| ed21a6b21c | |||
| 27dbdab522 | |||
| ecd1fc2803 | |||
| a59b0442f9 | |||
| 3c2b35576e | |||
| 40f24c0196 | |||
| 6bd9819f7f | |||
| 477ec726b2 | |||
| 5c56d9c374 | |||
| 717fdd96c8 | |||
| d004dfe2bf | |||
| 0e4ff5622e | |||
| 2249c10d37 | |||
| ac08209e36 | |||
| c8b4cf9433 | |||
| 3da93f7abd | |||
| 4a8d9b6b54 | |||
| d0382be839 | |||
| e2c1758667 | |||
| e2f3a6bb2b | |||
| 30a3174c88 | |||
| 43a08784f7 | |||
| 7d31bed4f6 | |||
| e510cb1ccc | |||
| c7503f13ac | |||
| aec68a96a4 | |||
| 53d293fe12 | |||
| e5558f0527 | |||
| 047937a57d | |||
| 452e9ead75 | |||
| ae74819174 | |||
| cf0d2c28ec | |||
| abeebfa81c | |||
| 62e9a7c50c | |||
| a7c029cd1e | |||
| 7d11c06cbe | |||
| 115f249b75 | |||
| c40bae3a5e | |||
| 197af9d3e4 | |||
| 5e758a3b09 | |||
| 1edeae716a | |||
| 461c5e823c | |||
| 79ef560c06 | |||
| 2de0ec9bee | |||
| bd5f682196 | |||
| 8ec6bb15fe | |||
| acdd4ff468 | |||
| 305dd3636b | |||
| fdd46102f4 | |||
| 80b0b2a792 | |||
| 73f824ab1c | |||
| 556e014e3a | |||
| 91e27ff475 | |||
| 7cafef382b | |||
| 4b16eebe57 | |||
| 3158cc8fba | |||
| 39dfe02350 | |||
| 385060334e | |||
| 59a4e6cb0b | |||
| d3bc7650fe | |||
| 7a7c4ec7e4 | |||
| 9a68ea37f1 | |||
| 58052bdb46 | |||
| f4da18de2d | |||
| 89fcde4dc3 | |||
| f3d43f110c | |||
| 8cdf2b45ee | |||
| 25ab46acd3 | |||
| 53df5499ea | |||
| df48f4d525 | |||
| 495d3bd66c | |||
| 2ce437871a | |||
| 216ed01bee | |||
| 6f12af24d9 | |||
| bcac0ed1a8 | |||
| 9dc576fd30 | |||
| 0534264d1b | |||
| 9fc04f1fa4 | |||
| 41bba0cb14 | |||
| 3746367531 | |||
| e1a844a8af | |||
| adf22f984e | |||
| 0527380c7b | |||
| f793cec5d8 | |||
| ab818456b0 | |||
| ca2e59e0a9 | |||
| 923ff6442f | |||
| 57e3331d81 | |||
| cc69d17254 | |||
| 7326afc126 | |||
| a4876166e4 | |||
| 6df0957a4a | |||
| 74da96c073 | |||
| b670f13108 | |||
| c1999ebace | |||
| 061b57c9ce | |||
| 5dfcada8ac | |||
| 64b0b0bb84 | |||
| b5928b26ed | |||
| 9b1a20e049 | |||
| 099f0ffa6f | |||
| 8b59103258 | |||
| 95f048272f | |||
| 24ed86da48 | |||
| fafb45bbce | |||
| ad90228ce1 | |||
| f90a9b56cc | |||
| a9a6bc8cf4 | |||
| d87e8a3b9b | |||
| f1a6fec980 | |||
| 2319e889c6 | |||
| 63caa1d436 | |||
| 09b562836a | |||
| 1979fd0b61 | |||
| 4b1e1fba88 | |||
| bf125a8795 | |||
| 444c885785 | |||
| 8af6ec55f1 | |||
| 9f5df79973 | |||
| b870c5b0dd | |||
| 21b507dc71 | |||
| 4afce1d144 | |||
| 185171c5f5 | |||
| 94218416d2 | |||
| 5ab5ae6e68 | |||
| ac663e2f1c | |||
| f7ee13724e | |||
| d7e6438f8f | |||
| 0a6e9fb1f0 | |||
| bb53cdb68a | |||
| 8fc417b5e9 | |||
| 679184ce79 | |||
| 4403a0c63c | |||
| e902707960 | |||
| 681cad1a44 | |||
| cf6d2559ec | |||
| d0067052a8 | |||
| c7ce911edc | |||
| ef7c7f1b35 | |||
| b839a1e080 | |||
| 3280d36230 | |||
| 68a36dae39 | |||
| bbb6587495 | |||
| 511288f86d | |||
| 89342fc956 | |||
| f98476e8cf | |||
| b0cee97f26 | |||
| 78d839b94a | |||
| 75aea66d16 | |||
| fa63ace6a7 | |||
| 5520142001 | |||
| ccb075ea53 | |||
| 6a2d2632ce | |||
| 57d67b78c8 | |||
| 2aa3e9b6e1 | |||
| ce206baa88 | |||
| fb63d447f0 | |||
| 19d4a18315 | |||
| 31ab083352 | |||
| 8bee5d2a77 | |||
| 4385af9f75 | |||
| c01dfa32c3 | |||
| cf7df895a1 | |||
| fb00ffadc4 | |||
| a61f28b0de | |||
| f5ae0db8bd | |||
| 12ba529632 | |||
| bcee7753e6 | |||
| 2b913ae540 | |||
| a1e4a44069 | |||
| b36a574f3c | |||
| 15910d0954 | |||
| 5894a59d5c | |||
| 1d9b6414aa | |||
| f476b87a5d | |||
| 8f18cde853 | |||
| 6cf589429d | |||
| 743bae43c3 | |||
| 509f16865a | |||
| 72815a4915 | |||
| b4a76f1e61 | |||
| d02b5c5fdb | |||
| 9bffa67c7f | |||
| ec8093f8dc | |||
| a71df01691 | |||
| 77460ec62f | |||
| 7467eb8934 | |||
| e5cb5868a7 | |||
| e908bed1e2 | |||
| 8da53babbf | |||
| a0208228bd | |||
| 9516d35b0c | |||
| e06925e208 | |||
| 0e2dce0976 | |||
| 2729df6eca | |||
| 630f673d28 | |||
| 03bf21141d | |||
| 59898271d0 | |||
| 788ebab40c | |||
| 5dbc2c1da3 | |||
| 257c95e2b2 | |||
| 402d04d054 | |||
| ab6023371c | |||
| e64242c9a2 | |||
| a8bf2e0246 | |||
| 82fb38560e | |||
| 25edfa0542 | |||
| f8864d8b90 | |||
| 001ce8acd0 | |||
| 13cf71b2ea | |||
| ea95338e69 | |||
| 57721bacb2 | |||
| 4269d45411 | |||
| 65e03993dc | |||
| cb35c75d9c | |||
| 01cef5d7df | |||
| 0f8576f18b | |||
| fbb80afbeb | |||
| 92c7691789 | |||
| 6116646094 | |||
| 8edaa7cf50 | |||
| eccf8a560d | |||
| 8157c5d8c5 | |||
| 7675251049 | |||
| 7a3322740d | |||
| 61393dbb0e | |||
| a8896e3d1b | |||
| 7ae59e8ad2 | |||
| 7d20837ee6 | |||
| d4326ee4a7 | |||
| 4e69fcb3ec | |||
| 10b057285c | |||
| b7c2f240a1 | |||
| 0832600b45 | |||
| 2ed24851ad | |||
| 48a54c7c2a | |||
| 21072e5722 | |||
| dfeb401352 | |||
| c4626cbde6 | |||
| e53f40ab07 | |||
| bfc28665c1 | |||
| 2a8a9fc3a2 | |||
| ee18060e25 | |||
| 11e72ba9f4 | |||
| 5c3f39b1ff | |||
| 778ae30bcd | |||
| 7cc7de4199 | |||
| 99ea82e20c | |||
| 1f7c5184af | |||
| 784d978a0d | |||
| 174f784c28 | |||
| 2df014314a | |||
| 4e5739abe1 | |||
| 59c2e84aac | |||
| cb2d32ec4e | |||
| c73bbff581 | |||
| 3a764acea5 | |||
| d2fbf45f71 | |||
| 02531cb4da | |||
| 0d403f6f9a | |||
| 791cfdcd5f | |||
| 6ef863793e | |||
| 7f9ac2494e | |||
| 8f241763c1 | |||
| d1aef49c5d | |||
| ac9821b439 | |||
| d6c7f73dba | |||
| f3bfc91311 | |||
| 097da86793 | |||
| ce8f33d671 | |||
| d38bc47030 | |||
| 0d876b0367 | |||
| 1883815cc5 | |||
| 2518998099 | |||
| ebe79d1c92 | |||
| 78a122a24b | |||
| ec6f83731e | |||
| 6338a144f7 | |||
| 0b056f1615 | |||
| 1e908ee265 | |||
| e78f5655ef | |||
| aa6c2acdff | |||
| 4750d5cb15 | |||
| f1fa93e068 | |||
| ea474c9705 | |||
| 021fd6ca32 | |||
| 131491e8ac | |||
| 91ecbb8719 | |||
| 1dd0af0aca | |||
| c72865e791 | |||
| 4570ab6023 | |||
| 31e2d8b49b | |||
| fccda46404 | |||
| 677d3493d4 | |||
| 9572d20bcb | |||
| 53a28e0cba | |||
| 5400aa5db3 | |||
| f55c9f792d | |||
| 24dadde724 | |||
| 9ee5d24d4b | |||
| d8a56af3da | |||
| f5c7f79db7 | |||
| ed831f5e6c | |||
| b7d2220198 | |||
| 3b1a612502 | |||
| 1c2865b1f5 | |||
| da1d3c47b6 | |||
| c1b6d2de4d | |||
| b9b34c9bae | |||
| 5bd61be8a6 | |||
| e24ac8c25f | |||
| cbb204cf37 | |||
| 5c3998f7ac | |||
| e8e20936e0 | |||
| 8a369831dc | |||
| bdc3f51807 | |||
| 00cf228d4e | |||
| 588dac2776 | |||
| e732cf1db3 | |||
| 27475ae7f8 | |||
| 5775310ea8 | |||
| b27deb794f | |||
| c57f3ae4cd | |||
| ca98796799 | |||
| 8c6903b552 | |||
| 12f0318b5c | |||
| 86b8b208ef | |||
| f3535a6456 | |||
| 49e42c56b3 | |||
| 6994aa94d0 | |||
| 3036fbd107 | |||
| 711979985e | |||
| 9b2e6eee39 | |||
| f4d184eb41 | |||
| 889394c7f3 | |||
| 8d3cd5bb85 | |||
| 3b0b01f5f0 | |||
| f0aba80b81 | |||
| 3b7bd5c4b8 | |||
| 54934084cb | |||
| 4174161a66 | |||
| bb9bd717c4 | |||
| 814b4abddd | |||
| 23e313d5e0 | |||
| 9335935c05 | |||
| 9b1f65b824 | |||
| c7666a4ee0 | |||
| b1c5e51b86 | |||
| 15f7626ed2 | |||
| d8fd60c76f | |||
| 0944f09a1f | |||
| 6d1075f03d | |||
| d912b27723 | |||
| aae939286a | |||
| 8ff3aa697c | |||
| 2c04b71cc2 | |||
| f9d1070da7 | |||
| 5046d3bbf4 | |||
| b9afd575f6 | |||
| ea963c581c | |||
| 81597000a4 | |||
| 2867d4b347 | |||
| 8c95ed33a5 | |||
| 03bd609d52 | |||
| f1ed9d0b18 | |||
| 1daceab8ee | |||
| 89a569da5a | |||
| ae823ccb10 | |||
| c8a25fb409 | |||
| 44f50623e7 | |||
| 01dba2a574 | |||
| 5524796509 | |||
| 280555ea44 | |||
| 063a9406e9 | |||
| b64ba23863 | |||
| 9eecf4fec3 | |||
| a465b313bc | |||
| c11051f6a8 | |||
| e9448ccf87 | |||
| 8eeb921ef3 | |||
| 466ba3741c | |||
| fa6f3d523e | |||
| 9069749c44 | |||
| 698b50fd7d | |||
| 92ae3fe576 | |||
| 78391bf68f | |||
| 04a69c0d64 | |||
| e9d0574f88 | |||
| 7d4610d13d | |||
| 1fa440feaa | |||
| c29da607f6 | |||
| a36a6cccf0 | |||
| 7f45cf4ee8 | |||
| 1d330d222c | |||
| 75669c545a | |||
| b3f08bdfeb | |||
| c29e7a0e85 | |||
| 8c5f6f22dc | |||
| 22e58c9a4e | |||
| 4640b135a1 | |||
| 0d04423ca9 | |||
| ad5d6d503a | |||
| af0d90d23c | |||
| 183d18e4fd | |||
| 7cda9a03d9 | |||
| d84d6fb387 | |||
| 43132e9045 | |||
| 6d820a5e74 | |||
| 1df764065e | |||
| 8836b924d7 | |||
| 84ad8d4d91 | |||
| 19a182c7be | |||
| 9e7d46e5d1 | |||
| 7d5ab8adc0 | |||
| f003cfdea6 | |||
| 46c0336375 | |||
| df71854921 | |||
| f11e087838 | |||
| 233db814ea | |||
| 43682e0be3 | |||
| f2fd54744b | |||
| e2909848ec | |||
| a2e2f8ba55 | |||
| 841e736cf9 | |||
| 832560d8dc | |||
| 32e7ca8fd7 | |||
| c23466d98d | |||
| 9572cd7f0a | |||
| a89a158b2f | |||
| 511cdc1227 | |||
| fbcb9a102e | |||
| 2214c67706 | |||
| 207e0b791d | |||
| 090c3d246c | |||
| d111e24a7b | |||
| 2ffe5007c1 | |||
| 3fb99d39b3 | |||
| a09c879f8d | |||
| 6bf6975e1d | |||
| 929f4c2468 | |||
| 6ef2571f17 | |||
| 82a6fbbe6d | |||
| 3028fe28a3 | |||
| 6b81f958fd | |||
| 14f535cea8 | |||
| e7f186e12a | |||
| 2a90f82f3a | |||
| c54780e088 | |||
| 97eb86d6d9 | |||
| 60ad4487ac | |||
| 9f6e618ee4 | |||
| 236cc0b59f | |||
| 387cb05892 | |||
| fb5db21898 | |||
| c91b8f1031 | |||
| 6b390c0191 | |||
| 087fb97c0b | |||
| 5322748f51 | |||
| 156166b3dc | |||
| ae9c90a25e | |||
| 649c4bc725 | |||
| 402d6779e8 | |||
| 29b191ff05 | |||
| 932bf79fbe | |||
| 703d775e99 | |||
| 588b447ab2 | |||
| 4f8cca62fe | |||
| d5546516fd | |||
| 98b44c7a76 | |||
| 22d1af00ef | |||
| 81e21925b2 | |||
| 9fe1b7fb46 | |||
| 0efbf3484b | |||
| 1fdd09aa4f | |||
| b2fa99872a | |||
| b29df78420 | |||
| 4d9ffbbfff | |||
| 5b8458591d | |||
| 19eeb87c9a | |||
| 9efd8aaf2d | |||
| 53f5d4aa89 | |||
| 72df151885 | |||
| 289ccaf00d | |||
| 754731e2b9 | |||
| b6dd3bb5d8 | |||
| e48c9045e7 | |||
| 077a368386 | |||
| 96be374566 | |||
| 164fe5fdb0 | |||
| 612eb11ed3 | |||
| eac73269de | |||
| 12e6c4b7e1 | |||
| 90dee6d775 | |||
| 425feb7909 | |||
| 28088c3a0b | |||
| 1e3b96e1c3 | |||
| 3b5ac939ce | |||
| 6ba03d3fd6 | |||
| a45c39b5ef | |||
| 45cdda60c3 | |||
| 88a1461755 | |||
| f8d93d939f | |||
| 464b5d8c53 | |||
| 5b9148aab8 | |||
| 4629de77f9 | |||
| cb785c3fd5 | |||
| 48b6f77901 | |||
| c4a7ba3ad9 | |||
| f33b715177 | |||
| ccd040599e | |||
| 54f1cae1aa | |||
| d07d61d050 | |||
| 7dc6a7c64b | |||
| 5bb746b0e6 | |||
| 66c33029e6 | |||
| 03ff0ef493 | |||
| b04ecb88f7 | |||
| 5f899a6773 | |||
| 30db52f617 | |||
| 4ad0f51594 | |||
| 6891ad6174 | |||
| 609e502a4d | |||
| bb576eec63 | |||
| d84bb6890a | |||
| 42f7c9f7e1 | |||
| 2417b43439 | |||
| 037880acf0 | |||
| 6b32511e33 | |||
| 948fa59434 | |||
| b4d645e380 | |||
| ef1b55d760 | |||
| b1fdb7be39 | |||
| c25e5d31f0 | |||
| 257b49ff3a | |||
| 44300d9a8c | |||
| f285009182 | |||
| 5cc4fd64a1 | |||
| ef1ae9a562 | |||
| a56e0f9451 | |||
| 05bdff3c7f | |||
| 20dc7e5eb3 | |||
| f0742bc684 | |||
| c63c77b780 | |||
| 233cff6d0b | |||
| 06603d294b | |||
| bd87dd520a | |||
| c3cd5580be | |||
| e586fea5e6 | |||
| 464184cefa | |||
| 2a97b50917 | |||
| 894a7133c0 | |||
| bc696a05c4 | |||
| f49dd5b48e | |||
| e302c2ad62 | |||
| c98f1d2b83 | |||
| f6364a64c3 | |||
| 77cb7334bc | |||
| 60d25f62aa | |||
| 3a3c79dc7d | |||
| cb6a944795 | |||
| 24215c9383 | |||
| 7a3c77d119 | |||
| 1c86b51175 | |||
| 71279094e5 | |||
| 09e56040ab | |||
| 3a1fbb2859 | |||
| 50fe062e72 | |||
| e6e98c6f41 | |||
| 69dc800a89 | |||
| 54773f0b3c | |||
| 54663341b6 | |||
| bdb655c62e | |||
| 766820a881 | |||
| e113bafd0b | |||
| 08f3fce3d2 | |||
| 04adf358c0 | |||
| 65dcc864d8 | |||
| ad04219074 | |||
| 3fdb9236ae | |||
| d5177af212 | |||
| 4dd723affa | |||
| 1f1573c0db | |||
| 3498c5e24c | |||
| a05f3050d4 | |||
| 8f297ce5f1 | |||
| 728e5e0b88 | |||
| 16b6fe8a62 | |||
| 79706e3489 | |||
| 7291c4594b | |||
| 05516c5eff | |||
| b91a67e334 | |||
| f55091310d | |||
| bfad014ce4 | |||
| e406247ae1 | |||
| f7db1fb471 | |||
| 7b25b2e9b9 | |||
| 1ca3201ddd | |||
| 5429223c34 | |||
| ad140a9ae8 | |||
| 8b3e05d75e | |||
| 267f12b166 | |||
| 5a60e1cebe | |||
| 7c8e4475c5 | |||
| c5fb0cddb4 | |||
| 7ba45c6dc0 | |||
| 3c741ac051 | |||
| 5489a74943 | |||
| 7e75d7f61c | |||
| 0305285661 | |||
| d605c8f1af | |||
| aa4a8b4bc6 | |||
| 817ca31d28 | |||
| c1d41e3a78 | |||
| b120f1d742 | |||
| b8ab9a002e | |||
| 87dee63bf6 | |||
| a16b4a54d5 | |||
| e5497b423e | |||
| ffd88bf2a8 | |||
| 9239e92042 | |||
| a9d9e0973e | |||
| 71385f87d9 | |||
| bb90368eef | |||
| 119d7b5277 | |||
| 21e0d7949a | |||
| d4c784bd1a | |||
| d88cefbdef | |||
| 775d291fec | |||
| b9313ff1d9 | |||
| a3ae45e3f2 | |||
| 9d5951b9ae | |||
| 9e97d55129 | |||
| 8d435710df | |||
| 84a3aa0b49 | |||
| 1191c64e0e | |||
| 35b6014ea4 | |||
| dc8c19ef51 | |||
| 8435f57a83 | |||
| c995538d90 | |||
| 086f2f04e1 | |||
| 79fcc13a3a | |||
| edad2f4de7 | |||
| caaab9d49c | |||
| a4accb4a68 | |||
| b0174907b3 | |||
| a27d9183d0 | |||
| 7c3092a37f | |||
| f251262c94 | |||
| c1a7591040 | |||
| 4e59e4c8cc | |||
| 6e08fd91e9 | |||
| 8a32c2fb24 | |||
| 4d19b114f8 | |||
| 95120fe4a6 | |||
| 40afe170ce | |||
| 6abb77bbfb | |||
| bad6bca4e6 | |||
| 075c48324f | |||
| ebf3773e98 | |||
| 84945d78ae | |||
| fbf39a76ee | |||
| 11ef81ef89 | |||
| 10600fd307 | |||
| d26bc4f048 | |||
| df7be71e9a | |||
| 90a827bcd5 | |||
| 953375d0aa | |||
| 53e8d5c28a | |||
| 5ffbbc5531 | |||
| 1b363a7793 | |||
| 5dd655eb4a | |||
| a618d3db32 | |||
| c97a29aa02 | |||
| 331932ecc1 | |||
| c6f59b8144 | |||
| 52ee233378 | |||
| fab154eace | |||
| e532e9f9c3 | |||
| 0b6112fadb | |||
| ce07604bd6 | |||
| f9f24b6a36 | |||
| fc73078f54 | |||
| 909e61decb | |||
| e17f4f3598 | |||
| c6e360caf6 | |||
| 5abb96d8fc | |||
| e417aef073 | |||
| a7ec32c81d | |||
| 26d7a4ab9b | |||
| f4dda8db33 | |||
| 2dfa05fbcb | |||
| 9063ad413a | |||
| 966cce804e | |||
| 6ff68089bd | |||
| a1004924ce | |||
| 0a923be2de | |||
| a364e08d3c | |||
| 8f4d70a836 | |||
| 0b78b48d8d | |||
| 83268109c6 | |||
| d8161ea60e | |||
| 055dd39982 | |||
| dc45fe1a79 | |||
| e0b23d12eb | |||
| b1cacddac7 | |||
| 6af1212a26 | |||
| 1f02e72db9 | |||
| 8de40ac154 | |||
| 246590d6eb | |||
| 0cc8ab844b | |||
| 6e882dcbe3 | |||
| 0402ffe0e2 | |||
| 3fd958c232 | |||
| f308ea3bfb | |||
| 98e98ff57d | |||
| d6c5281889 | |||
| 62dddfe1f3 | |||
| bbfd64a25c | |||
| bd9d586f71 | |||
| 73741573ec | |||
| a58f4c9ad7 | |||
| df4bbb5add | |||
| a525764881 | |||
| c8653b2a63 | |||
| 5949b9e639 | |||
| ce54f2b44a | |||
| 30e4790085 | |||
| fc2d988ddd | |||
| 44facb7d33 | |||
| fe76a66555 | |||
| c4890fdbd5 | |||
| 86d4d2e78f | |||
| d6ae3ba92b | |||
| 9a4f0bd88d | |||
| 07e2dbcaac | |||
| b06e1c0e0d | |||
| 513acc0bdc | |||
| b92b057a40 | |||
| 4e859239aa | |||
| d961eec481 | |||
| fd3e9ce17d | |||
| bccc081971 | |||
| 42cbccfafa | |||
| 866bb6ce45 | |||
| 8aa4a2fedb | |||
| 08c18e1539 | |||
| 1eb7650e49 | |||
| aa9df2c3b6 | |||
| 200ce6212f | |||
| 8923309409 | |||
| f198e4b94e | |||
| 1e8165e8d9 | |||
| 0246043a1e | |||
| d0d0bb4408 | |||
| eae1d8c7ec | |||
| 03cac8dd87 | |||
| 7726613616 | |||
| 02b9b84cd4 | |||
| cbd0080834 | |||
| 97c686557b | |||
| 00c2c864e5 | |||
| 55b00d4652 | |||
| 30dd75bb5c | |||
| b4ff61cb52 | |||
| ec8f29c5a2 | |||
| 545aae7a38 | |||
| d8d2696f45 | |||
| 6b135cdcb2 | |||
| 164b43f91c | |||
| 1cf88bf69a | |||
| 850fa94c3d | |||
| 133a5a8c76 | |||
| aa08660ca6 | |||
| 93cce0fcf8 | |||
| 2fa378ca42 | |||
| 0092484cdd | |||
| 07c9e23c23 | |||
| f9fe673c42 |
+9
-2
@@ -14,10 +14,12 @@ ehthumbs_vista.db
|
||||
*.pyc
|
||||
*.pyo
|
||||
*.pyi
|
||||
*.egg-info
|
||||
|
||||
# Editor files.
|
||||
# Editor/tool files.
|
||||
*~
|
||||
*.bak
|
||||
.gdb_history
|
||||
|
||||
# Compiled Ren'Py files.
|
||||
*.rpyc
|
||||
@@ -64,6 +66,8 @@ cache/
|
||||
/renios3
|
||||
|
||||
/web
|
||||
/web2
|
||||
/web3
|
||||
|
||||
# Docs.
|
||||
/sphinx/source/inc
|
||||
@@ -103,6 +107,9 @@ cache/
|
||||
steam_appid.txt
|
||||
/steamapi.py
|
||||
|
||||
# Android.
|
||||
*.keystore
|
||||
|
||||
# Type analysis.
|
||||
/typings
|
||||
|
||||
@@ -114,9 +121,9 @@ CubismSdkForNative-4-*.zip
|
||||
/screenshot*
|
||||
.android.json
|
||||
|
||||
|
||||
# Old files.
|
||||
/0old
|
||||
|
||||
# Works in progress, throwaway scripts, etc.
|
||||
/scratch
|
||||
/*-dists
|
||||
|
||||
Vendored
+9
-4
@@ -13,7 +13,7 @@
|
||||
"**/renpy/web/**" : true,
|
||||
},
|
||||
"files.exclude": {
|
||||
"0old" : true,
|
||||
"0old": true,
|
||||
"**-dists": true,
|
||||
"**/*.pyc": true,
|
||||
"**/*.pyo": true,
|
||||
@@ -37,13 +37,13 @@
|
||||
"renpy*.exe": true,
|
||||
"tmp": true,
|
||||
"web": true,
|
||||
"**/*.rpa": true,
|
||||
"**/*.rpymc": true,
|
||||
"**/cache/": true
|
||||
},
|
||||
|
||||
"python.languageServer": "Pylance",
|
||||
"python.analysis.typeCheckingMode": "basic",
|
||||
"python.analysis.extraPaths": [
|
||||
""
|
||||
],
|
||||
"python.analysis.diagnosticMode": "workspace",
|
||||
"python.linting.pylintEnabled": false,
|
||||
"python.analysis.diagnosticSeverityOverrides": {
|
||||
@@ -51,4 +51,9 @@
|
||||
},
|
||||
"esbonio.server.enabled": true,
|
||||
"esbonio.sphinx.confDir": "",
|
||||
"renpy.excludeCompiledFilesFromWorkspace": true,
|
||||
"renpy.watchFoldersForChanges": false,
|
||||
"renpy.warnOnInvalidVariableNames": "Disabled",
|
||||
"renpy.warnOnInvalidFilenameIssues": "Disabled",
|
||||
"renpy.warnOnIndentationAndSpacingIssues": "Disabled",
|
||||
}
|
||||
|
||||
+13
-8
@@ -49,29 +49,34 @@ Building the modules requires you have the many dependencies installed on
|
||||
your system. On Ubuntu and Debian, these dependencies can be installed with
|
||||
the command::
|
||||
|
||||
apt-get install virtualenvwrapper python-dev libavcodec-dev libavformat-dev \
|
||||
libavresample-dev libswresample-dev libswscale-dev libfreetype6-dev libglew1.6-dev \
|
||||
libfribidi-dev libsdl2-dev libsdl2-image-dev libsdl2-gfx-dev \
|
||||
libsdl2-mixer-dev libsdl2-ttf-dev libjpeg-dev
|
||||
sudo apt install virtualenvwrapper python3-dev libavcodec-dev libavformat-dev \
|
||||
libswresample-dev libswscale-dev libfreetype6-dev libfribidi-dev libsdl2-dev \
|
||||
libsdl2-image-dev libsdl2-gfx-dev libsdl2-mixer-dev libsdl2-ttf-dev libjpeg-dev
|
||||
|
||||
Ren'Py requires SDL_image 2.6 or greater. If your distribution doesn't include
|
||||
that version, you'll need to download it from:
|
||||
|
||||
https://github.com/libsdl-org/SDL_image/tree/SDL2
|
||||
|
||||
We strongly suggest installing the Ren'Py modules into a Python
|
||||
virtualenv. To create a new virtualenv, open a new terminal and run::
|
||||
|
||||
. /usr/share/virtualenvwrapper/virtualenvwrapper.sh
|
||||
mkvirtualenv renpy
|
||||
|
||||
To return to this virtualenv later, run::
|
||||
|
||||
. /usr/share/virtualenvwrapper/virtualenvwrapper.sh
|
||||
workon renpy
|
||||
|
||||
After activating the virtualenv, install additional dependencies::
|
||||
|
||||
pip install -U cython future six typing pefile requests
|
||||
pip install -U cython future six typing pefile requests ecdsa
|
||||
|
||||
Then, install pygame_sdl2 by running the following commands::
|
||||
|
||||
git clone https://www.github.com/renpy/pygame_sdl2
|
||||
pushd pygame_sdl2
|
||||
python fix_virtualenv.py $VIRTUAL_ENV
|
||||
python setup.py install
|
||||
python setup.py install_headers
|
||||
popd
|
||||
@@ -80,7 +85,7 @@ Next, set RENPY_DEPS_INSTALL To a \:-separated (\;-separated on Windows)
|
||||
list of paths containing the dependencies, and RENPY_CYTHON to the name
|
||||
of the cython command::
|
||||
|
||||
export RENPY_DEPS_INSTALL="/usr:/usr/lib/$(uname -m)-linux-gnu/"
|
||||
export RENPY_DEPS_INSTALL="/usr:/usr/lib/$(gcc -dumpmachine)/"
|
||||
export RENPY_CYTHON=cython
|
||||
|
||||
Finally, use setup.py in the Ren'Py ``module`` directory to compile and
|
||||
@@ -93,7 +98,7 @@ install the modules that support Ren'Py::
|
||||
Ren'Py will be installed into the activated virtualenv. It can then be run
|
||||
using the command::
|
||||
|
||||
python -O renpy.py
|
||||
python renpy.py
|
||||
|
||||
|
||||
Documentation
|
||||
|
||||
@@ -28,9 +28,48 @@ ap.add_argument("--experimental", action="store_true")
|
||||
ap.add_argument("--no-tag", "-n", action="store_true")
|
||||
ap.add_argument("--push-tags", action="store_true")
|
||||
ap.add_argument("--delete-tag")
|
||||
ap.add_argument("--github", action="store_true")
|
||||
ap.add_argument("--real", action="store_true")
|
||||
|
||||
args = ap.parse_args()
|
||||
|
||||
if not args.real:
|
||||
print("Did you want to use scripts/add_all.sh? If not, give --real.")
|
||||
sys.exit(1)
|
||||
|
||||
if args.github:
|
||||
subprocess.call([ "git", "push", "--tags" ])
|
||||
subprocess.call([ "gh", "release", "create", version, "--notes", "See https://www.renpy.org/release/" + short_version, "-t", "Ren'Py {}".format(short_version) ])
|
||||
|
||||
dn = "/home/tom/ab/renpy/dl/" + short_version
|
||||
|
||||
for fn in os.listdir(dn):
|
||||
|
||||
if fn == ".build_cache":
|
||||
continue
|
||||
|
||||
if fn.endswith(".update.gz"):
|
||||
continue
|
||||
|
||||
if fn.endswith(".update.json"):
|
||||
continue
|
||||
|
||||
if fn.startswith("updates.json"):
|
||||
continue
|
||||
|
||||
if fn.endswith(".zsync"):
|
||||
continue
|
||||
|
||||
if fn.endswith(".sums"):
|
||||
continue
|
||||
|
||||
subprocess.call([ "gh", "release", "upload", version, os.path.join(dn, fn) ])
|
||||
|
||||
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
|
||||
if args.release:
|
||||
subprocess.check_call([ "/home/tom/ab/renpy/scripts/checksums.py", "/home/tom/ab/renpy/dl/" + short_version ])
|
||||
|
||||
|
||||
+32
-10
@@ -17,13 +17,34 @@ import time
|
||||
import collections
|
||||
|
||||
try:
|
||||
# reload is built-in in Python 2, in importlib in Python 3
|
||||
reload # type: ignore
|
||||
except NameError:
|
||||
from importlib import reload
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
ROOT = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
|
||||
def zip_rapt_symbols(destination):
|
||||
"""
|
||||
Zips up the rapt symbols.
|
||||
"""
|
||||
|
||||
import zipfile
|
||||
|
||||
if PY2:
|
||||
zf = zipfile.ZipFile(destination + "/android-native-symbols.zip", "w", zipfile.ZIP_DEFLATED)
|
||||
else:
|
||||
zf = zipfile.ZipFile(destination + "/android-native-symbols.zip", "w", zipfile.ZIP_DEFLATED, compresslevel=3)
|
||||
|
||||
for dn, dirs, files in os.walk("rapt/symbols"):
|
||||
for fn in dirs + files:
|
||||
fn = os.path.join(dn, fn)
|
||||
arcname = os.path.relpath(fn, "rapt/symbols")
|
||||
zf.write(fn, arcname)
|
||||
|
||||
zf.close()
|
||||
|
||||
def copy_tutorial_file(src, dest):
|
||||
"""
|
||||
Copies a file from src to dst. Lines between "# tutorial-only" and
|
||||
@@ -72,11 +93,13 @@ def main():
|
||||
ap.add_argument("--notarized", action="store_true", dest="notarized")
|
||||
ap.add_argument("--vc-version-only", action="store_true")
|
||||
ap.add_argument("--link-directories", action="store_true")
|
||||
ap.add_argument("--append-version", action="store_true")
|
||||
|
||||
args = ap.parse_args()
|
||||
|
||||
link_directory("rapt")
|
||||
link_directory("renios")
|
||||
link_directory("web")
|
||||
|
||||
if args.link_directories:
|
||||
return
|
||||
@@ -98,7 +121,7 @@ def main():
|
||||
import renpy
|
||||
|
||||
if args.version is None:
|
||||
args.version = ".".join(str(i) for i in renpy.version_tuple[:-1]) # @UndefinedVariable
|
||||
args.version = ".".join(str(i) for i in renpy.version_tuple[:-1])
|
||||
|
||||
try:
|
||||
s = subprocess.check_output([ "git", "describe", "--tags", "--dirty", ]).decode("utf-8").strip()
|
||||
@@ -107,7 +130,7 @@ def main():
|
||||
|
||||
commits_per_day = collections.defaultdict(int)
|
||||
|
||||
for i in subprocess.check_output([ "git", "log", "-99", "--pretty=%cd", "--date=format:%Y%m%d", "--follow", "HEAD", "--", "." ]).decode("utf-8").split():
|
||||
for i in subprocess.check_output([ "git", "log", "-99", "--pretty=%cd", "--date=format:%Y%m%d" ]).decode("utf-8").split():
|
||||
commits_per_day[i[2:]] += 1
|
||||
|
||||
if dirty:
|
||||
@@ -138,6 +161,9 @@ def main():
|
||||
|
||||
reload(sys.modules['renpy'])
|
||||
|
||||
if args.append_version:
|
||||
args.version += "-" + renpy.version_only
|
||||
|
||||
# Check that the versions match.
|
||||
full_version = renpy.version_only # @UndefinedVariable
|
||||
if "-" not in args.version \
|
||||
@@ -162,11 +188,6 @@ def main():
|
||||
else:
|
||||
renpy_sh = "./renpy2.sh"
|
||||
|
||||
# Perhaps autobuild.
|
||||
if "RENPY_BUILD_ALL" in os.environ:
|
||||
print("Autobuild...")
|
||||
subprocess.check_call(["scripts/autobuild.sh"])
|
||||
|
||||
# Compile all the python files.
|
||||
compileall.compile_dir("renpy/", ddir="renpy/", force=True, quiet=1)
|
||||
|
||||
@@ -197,6 +218,7 @@ def main():
|
||||
if not os.path.exists(destination):
|
||||
os.makedirs(destination)
|
||||
|
||||
zip_rapt_symbols(destination)
|
||||
|
||||
if args.fast:
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"start_a170b500": {
|
||||
"area": [
|
||||
53,
|
||||
120,
|
||||
426,
|
||||
120
|
||||
]
|
||||
},
|
||||
"start_f41f55d7": {
|
||||
"area": [
|
||||
106,
|
||||
60,
|
||||
426,
|
||||
120
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,8 @@ init offset = -2
|
||||
init python:
|
||||
gui.init(1280, 720)
|
||||
|
||||
## Enable checks for invalid or unstable properties in screens or transforms
|
||||
define config.check_conflicting_properties = True
|
||||
|
||||
|
||||
################################################################################
|
||||
@@ -399,6 +401,7 @@ define gui.nvl_thought_xalign = 0.0
|
||||
define gui.nvl_button_xpos = gui.scale(450)
|
||||
define gui.nvl_button_xalign = 0.0
|
||||
|
||||
|
||||
## Localization ################################################################
|
||||
|
||||
## This controls where a line break is permitted. The default is suitable for
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
@@ -200,9 +200,9 @@ init python:
|
||||
build.documentation('*.txt')
|
||||
|
||||
|
||||
## A Google Play license key is required to download expansion files and
|
||||
## perform in-app purchases. It can be found on the "Services & APIs" page
|
||||
## of the Google Play developer console.
|
||||
## A Google Play license key is required to perform in-app purchases.
|
||||
## It can be found in the Google Play developer console,
|
||||
## under "Monetize" > "Monetization Setup" > "Licensing".
|
||||
|
||||
# define build.google_play_key = "..."
|
||||
|
||||
|
||||
+90
-21
@@ -178,7 +178,7 @@ screen input(prompt):
|
||||
window:
|
||||
|
||||
vbox:
|
||||
xalign gui.dialogue_text_xalign
|
||||
xanchor gui.dialogue_text_xalign
|
||||
xpos gui.dialogue_xpos
|
||||
xsize gui.dialogue_width
|
||||
ypos gui.dialogue_ypos
|
||||
@@ -646,27 +646,40 @@ screen file_slots(title):
|
||||
key "save_delete" action FileDelete(slot)
|
||||
|
||||
## Buttons to access other pages.
|
||||
hbox:
|
||||
vbox:
|
||||
style_prefix "page"
|
||||
|
||||
xalign 0.5
|
||||
yalign 1.0
|
||||
|
||||
spacing gui.page_spacing
|
||||
hbox:
|
||||
xalign 0.5
|
||||
|
||||
textbutton _("<") action FilePagePrevious()
|
||||
spacing gui.page_spacing
|
||||
|
||||
if config.has_autosave:
|
||||
textbutton _("{#auto_page}A") action FilePage("auto")
|
||||
textbutton _("<") action FilePagePrevious()
|
||||
|
||||
if config.has_quicksave:
|
||||
textbutton _("{#quick_page}Q") action FilePage("quick")
|
||||
if config.has_autosave:
|
||||
textbutton _("{#auto_page}A") action FilePage("auto")
|
||||
|
||||
## range(1, 10) gives the numbers from 1 to 9.
|
||||
for page in range(1, 10):
|
||||
textbutton "[page]" action FilePage(page)
|
||||
if config.has_quicksave:
|
||||
textbutton _("{#quick_page}Q") action FilePage("quick")
|
||||
|
||||
textbutton _(">") action FilePageNext()
|
||||
## range(1, 10) gives the numbers from 1 to 9.
|
||||
for page in range(1, 10):
|
||||
textbutton "[page]" action FilePage(page)
|
||||
|
||||
textbutton _(">") action FilePageNext()
|
||||
|
||||
if config.has_sync:
|
||||
if CurrentScreenName() == "save":
|
||||
textbutton _("Upload Sync"):
|
||||
action UploadSync()
|
||||
xalign 0.5
|
||||
else:
|
||||
textbutton _("Download Sync"):
|
||||
action DownloadSync()
|
||||
xalign 0.5
|
||||
|
||||
|
||||
style page_label is gui_label
|
||||
@@ -684,7 +697,7 @@ style page_label:
|
||||
ypadding gui.scale(3)
|
||||
|
||||
style page_label_text:
|
||||
text_align 0.5
|
||||
textalign 0.5
|
||||
layout "subtitle"
|
||||
hover_color gui.hover_color
|
||||
|
||||
@@ -908,7 +921,7 @@ screen history():
|
||||
## This determines what tags are allowed to be displayed on the history
|
||||
## screen.
|
||||
|
||||
define gui.history_allow_tags = { "alt", "noalt" }
|
||||
define gui.history_allow_tags = { "alt", "noalt", "rt", "rb", "art" }
|
||||
|
||||
|
||||
style history_window is empty
|
||||
@@ -932,7 +945,7 @@ style history_name:
|
||||
|
||||
style history_name_text:
|
||||
min_width gui.history_name_width
|
||||
text_align gui.history_name_xalign
|
||||
textalign gui.history_name_xalign
|
||||
|
||||
style history_text:
|
||||
xpos gui.history_text_xpos
|
||||
@@ -940,7 +953,7 @@ style history_text:
|
||||
xanchor gui.history_text_xalign
|
||||
xsize gui.history_text_width
|
||||
min_width gui.history_text_width
|
||||
text_align gui.history_text_xalign
|
||||
textalign gui.history_text_xalign
|
||||
layout ("subtitle" if gui.history_text_xalign else "tex")
|
||||
|
||||
style history_label:
|
||||
@@ -1109,7 +1122,7 @@ style help_label:
|
||||
style help_label_text:
|
||||
size gui.text_size
|
||||
xalign 1.0
|
||||
text_align 1.0
|
||||
textalign 1.0
|
||||
|
||||
|
||||
|
||||
@@ -1171,7 +1184,7 @@ style confirm_frame:
|
||||
yalign .5
|
||||
|
||||
style confirm_prompt_text:
|
||||
text_align 0.5
|
||||
textalign 0.5
|
||||
layout "subtitle"
|
||||
|
||||
style confirm_button:
|
||||
@@ -1365,7 +1378,7 @@ style nvl_label:
|
||||
yanchor 0.0
|
||||
xsize gui.nvl_name_width
|
||||
min_width gui.nvl_name_width
|
||||
text_align gui.nvl_name_xalign
|
||||
textalign gui.nvl_name_xalign
|
||||
|
||||
style nvl_dialogue:
|
||||
xpos gui.nvl_text_xpos
|
||||
@@ -1373,7 +1386,7 @@ style nvl_dialogue:
|
||||
ypos gui.nvl_text_ypos
|
||||
xsize gui.nvl_text_width
|
||||
min_width gui.nvl_text_width
|
||||
text_align gui.nvl_text_xalign
|
||||
textalign gui.nvl_text_xalign
|
||||
layout ("subtitle" if gui.nvl_text_xalign else "tex")
|
||||
|
||||
style nvl_thought:
|
||||
@@ -1382,7 +1395,7 @@ style nvl_thought:
|
||||
ypos gui.nvl_thought_ypos
|
||||
xsize gui.nvl_thought_width
|
||||
min_width gui.nvl_thought_width
|
||||
text_align gui.nvl_thought_xalign
|
||||
textalign gui.nvl_thought_xalign
|
||||
layout ("subtitle" if gui.nvl_text_xalign else "tex")
|
||||
|
||||
style nvl_button:
|
||||
@@ -1394,6 +1407,62 @@ style nvl_button_text:
|
||||
properties gui.button_text_properties("nvl_button")
|
||||
|
||||
|
||||
## Bubble screen ###############################################################
|
||||
##
|
||||
## The Bubble screen is used to display dialogue to the player when using
|
||||
## speech bubbles. The Bubble screen takes the same parameters as the say
|
||||
## screen, must create a displayable with the id of "what", and can create
|
||||
## displayables with the "namebox", "who", and "window" ids.
|
||||
##
|
||||
## https://www.renpy.org/doc/html/screen_special.html#bubble
|
||||
|
||||
screen bubble(who, what):
|
||||
style_prefix "bubble"
|
||||
|
||||
window:
|
||||
id "window"
|
||||
|
||||
if who is not None:
|
||||
|
||||
window:
|
||||
id "namebox"
|
||||
style "bubble_namebox"
|
||||
|
||||
text who:
|
||||
id "who"
|
||||
|
||||
text what:
|
||||
id "what"
|
||||
|
||||
|
||||
style bubble_window is empty
|
||||
style bubble_namebox is empty
|
||||
style bubble_who is default
|
||||
style bubble_what is default
|
||||
|
||||
|
||||
style bubble_window:
|
||||
background Frame("gui/bubble.png", 15, 15, 15, 15)
|
||||
padding (15, 10)
|
||||
|
||||
style bubble_namebox:
|
||||
background Frame("gui/bubble.png", 15, 15, 15, 15)
|
||||
pos (-15, -5)
|
||||
anchor (0.0, 1.0)
|
||||
padding (15, 10)
|
||||
|
||||
style bubble_who:
|
||||
xalign 0.5
|
||||
textalign 0.5
|
||||
color "#000"
|
||||
|
||||
style bubble_what:
|
||||
align (0.5, 0.5)
|
||||
textalign 0.5
|
||||
layout "subtitle"
|
||||
color "#000"
|
||||
|
||||
|
||||
|
||||
################################################################################
|
||||
## Mobile Variants
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
+32
-30
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -34,19 +34,18 @@ init python:
|
||||
NO_RAPT_TEXT = _("To build Android packages, please download RAPT, unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher.")
|
||||
NO_JDK_TEXT = _("A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}download and install the JDK{/a}, then restart the Ren'Py launcher.")
|
||||
NO_SDK_TEXT = _("RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this.")
|
||||
NO_KEY_TEXT = _("RAPT has been installed, but a key hasn't been configured. Please create a new key, or restore android.keystore.")
|
||||
NO_BUNDLE_KEY_TEXT = _("RAPT has been installed, but a bundle key hasn't been configured. Please create a new key, or restore bundle.keystore.")
|
||||
NO_KEY_TEXT = _("RAPT has been installed, but a key hasn't been configured. Please generate new keys, or copy android.keystore and bundle.keystore to the base directory.")
|
||||
NO_CONFIG_TEXT = _("The current project has not been configured. Use \"Configure\" to configure it before building.")
|
||||
NO_BUNDLE_TEXT = _("Please select if you want a Play Bundle (for Google Play), or a Universal APK (for sideloading and other app stores).")
|
||||
OK_TEXT = _("Choose \"Build\" to build the current project, or attach an Android device and choose \"Build & Install\" to build and install it on the device.")
|
||||
|
||||
PHONE_TEXT = _("Attempts to emulate an Android phone.\n\nTouch input is emulated through the mouse, but only when the button is held down. Escape is mapped to the menu button, and PageUp is mapped to the back button.")
|
||||
TABLET_TEXT = _("Attempts to emulate an Android tablet.\n\nTouch input is emulated through the mouse, but only when the button is held down. Escape is mapped to the menu button, and PageUp is mapped to the back button.")
|
||||
OUYA_TEXT = _("Attempts to emulate a televison-based Android console, like the OUYA or Fire TV.\n\nController input is mapped to the arrow keys, Enter is mapped to the select button, Escape is mapped to the menu button, and PageUp is mapped to the back button.")
|
||||
OUYA_TEXT = _("Attempts to emulate a televison-based Android console.\n\nController input is mapped to the arrow keys, Enter is mapped to the select button, Escape is mapped to the menu button, and PageUp is mapped to the back button.")
|
||||
|
||||
INSTALL_SDK_TEXT = _("Downloads and installs the Android SDK and supporting packages. Optionally, generates the keys required to sign the package.")
|
||||
INSTALL_SDK_TEXT = _("Downloads and installs the Android SDK and supporting packages.")
|
||||
GENERATE_KEYS_TEXT = _("Generates the keys required to sign the package.")
|
||||
CONFIGURE_TEXT = _("Configures the package name, version, and other information about this project.")
|
||||
PLAY_KEYS_TEXT = _("Opens the file containing the Google Play keys in the editor.\n\nThis is only needed if the application is using an expansion APK. Read the documentation for more details.")
|
||||
BUILD_TEXT = _("Builds the Android package.")
|
||||
BUILD_AND_INSTALL_TEXT = _("Builds the Android package, and installs it on an Android device connected to your computer.")
|
||||
BUILD_INSTALL_AND_LAUNCH_TEXT = _("Builds the Android package, installs it on an Android device connected to your computer, then launches the app on your device.")
|
||||
@@ -62,7 +61,6 @@ init python:
|
||||
PLAY_BUNDLE_TEXT = _("Builds an Android App Bundle (ABB), intended to be uploaded to Google Play. This can include up to 2GB of data.")
|
||||
UNIVERSAL_APK_TEXT = _("Builds a Universal APK package, intended for sideloading and stores other than Google Play. This can include up to 2GB of data.")
|
||||
|
||||
|
||||
import subprocess
|
||||
import re
|
||||
import os
|
||||
@@ -94,6 +92,7 @@ init python:
|
||||
import rapt.install_sdk
|
||||
import rapt.plat
|
||||
import rapt.interface
|
||||
import rapt.keys
|
||||
|
||||
rapt.plat.renpy = True
|
||||
rapt.plat.translate = __
|
||||
@@ -112,11 +111,12 @@ init python:
|
||||
return ANDROID_NO_JDK
|
||||
if not os.path.exists(rapt.plat.adb):
|
||||
return ANDROID_NO_SDK
|
||||
if not os.path.exists(rapt.plat.path("project/local.properties")):
|
||||
if not rapt.keys.keys_exist(project.current.path):
|
||||
return ANDROID_NO_KEY
|
||||
if not os.path.exists(rapt.plat.path("project/bundle.properties")):
|
||||
return ANDROID_NO_BUNDLE_KEY
|
||||
if not os.path.exists(os.path.join(project.current.path, ".android.json")):
|
||||
if not any([
|
||||
os.path.exists(os.path.join(project.current.path, "android.json")),
|
||||
os.path.exists(os.path.join(project.current.path, ".android.json"))
|
||||
]):
|
||||
return ANDROID_NO_CONFIG
|
||||
if persistent.android_bundle is None:
|
||||
return ANDROID_NO_BUNDLE
|
||||
@@ -137,8 +137,6 @@ init python:
|
||||
return NO_SDK_TEXT
|
||||
if state == ANDROID_NO_KEY:
|
||||
return NO_KEY_TEXT
|
||||
if state == ANDROID_NO_BUNDLE_KEY:
|
||||
return NO_BUNDLE_KEY_TEXT
|
||||
if state == ANDROID_NO_CONFIG:
|
||||
return NO_CONFIG_TEXT
|
||||
if state == ANDROID_NO_BUNDLE:
|
||||
@@ -181,31 +179,23 @@ init python:
|
||||
|
||||
build = p.dump["build"]
|
||||
|
||||
filename = os.path.join(p.path, ".android.json")
|
||||
|
||||
with open(filename, "r") as f:
|
||||
android_json = json.load(f)
|
||||
|
||||
old_android_json = dict(android_json)
|
||||
c = rapt.configure.Configuration(p.path)
|
||||
|
||||
if "google_play_key" in build:
|
||||
android_json["google_play_key"] = build["google_play_key"]
|
||||
c.google_play_key = build["google_play_key"]
|
||||
else:
|
||||
android_json.pop("google_play_key", None)
|
||||
c.google_play_key = None
|
||||
|
||||
if "google_play_salt" in build:
|
||||
|
||||
if len(build["google_play_salt"]) != 20:
|
||||
raise Exception("build.google_play_salt must be exactly 20 bytes long.")
|
||||
|
||||
android_json["google_play_salt"] = ", ".join(str(i) for i in build["google_play_salt"])
|
||||
c.google_play_salt = ", ".join(str(i) for i in build["google_play_salt"])
|
||||
else:
|
||||
android_json.pop("google_play_salt", None)
|
||||
c.google_play_salt = None
|
||||
|
||||
if android_json != old_android_json:
|
||||
|
||||
with open(filename, "w") as f:
|
||||
json.dump(android_json, f)
|
||||
c.save(p.path)
|
||||
|
||||
|
||||
def android_build(p=None, gui=True, bundle=False, install=False, launch=False, destination=None, opendir=False):
|
||||
@@ -288,7 +278,7 @@ init python:
|
||||
|
||||
|
||||
with interface.nolinks():
|
||||
rapt.build.build(rapt_interface, dist, bundle=bundle, install=install, launch=launch, finished=finished, permissions=p.dump['build']['android_permissions'])
|
||||
rapt.build.build(rapt_interface, dist, p.path, bundle=bundle, install=install, launch=launch, finished=finished, permissions=p.dump['build']['android_permissions'])
|
||||
|
||||
|
||||
def android_build_argument(cmd):
|
||||
@@ -388,12 +378,16 @@ screen android:
|
||||
frame style "l_indent":
|
||||
|
||||
has vbox
|
||||
textbutton _("Install SDK & Create Keys"):
|
||||
textbutton _("Install SDK"):
|
||||
action AndroidIfState(state, ANDROID_NO_SDK, Jump("android_installsdk"))
|
||||
hovered tt.Action(INSTALL_SDK_TEXT)
|
||||
|
||||
textbutton _("Generate Keys"):
|
||||
action AndroidIfState(state, ANDROID_NO_KEY, Jump("android_keys"))
|
||||
hovered tt.Action(GENERATE_KEYS_TEXT)
|
||||
|
||||
textbutton _("Configure"):
|
||||
action AndroidIfState(state, ANDROID_NO_CONFIG, Jump("android_configure"))
|
||||
action AndroidIfState(state, ANDROID_NO_KEY, Jump("android_configure"))
|
||||
hovered tt.Action(CONFIGURE_TEXT)
|
||||
|
||||
add SPACER
|
||||
@@ -509,6 +503,14 @@ label android_installsdk:
|
||||
jump android
|
||||
|
||||
|
||||
label android_keys:
|
||||
|
||||
python:
|
||||
rapt.keys.generate_keys(MobileInterface("android"), project.current.path)
|
||||
|
||||
jump android
|
||||
|
||||
|
||||
label android_configure:
|
||||
|
||||
python:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
|
||||
# This file contains strings used by RAPT, so the Ren'Py translation framework
|
||||
# can find them. It's automatically generated by rapt/update_translations.py, and
|
||||
# hence should not be changed by hand.
|
||||
@@ -29,12 +29,17 @@ init python hide:
|
||||
__("{} is a Java keyword, and can't be used as part of a package name.")
|
||||
__("What is the application's version?\n\nThis should be the human-readable version that you would present to a person. It must contain only numbers and dots.")
|
||||
__("The version number must contain only numbers and dots.")
|
||||
__("How much RAM do you want to allocate to Gradle?\n\nThis must be a positive integer number.")
|
||||
__("The RAM size must contain only numbers.")
|
||||
__("How much RAM (in GB) do you want to allocate to Gradle?\nThis must be a positive integer number.")
|
||||
__("The RAM size must contain only numbers and be positive.")
|
||||
__("How would you like your application to be displayed?")
|
||||
__("In landscape orientation.")
|
||||
__("In portrait orientation.")
|
||||
__("In the user's preferred orientation.")
|
||||
__("Which app store would you like to support in-app purchasing through?")
|
||||
__("Google Play.")
|
||||
__("Amazon App Store.")
|
||||
__("Both, in one app.")
|
||||
__("Neither.")
|
||||
__("Do you want to automatically update the Java source code?")
|
||||
__("Yes. This is the best choice for most projects.")
|
||||
__("No. This may require manual updates when Ren'Py or the project configuration changes.")
|
||||
@@ -53,11 +58,14 @@ init python hide:
|
||||
__("I was unable to accept the Android licenses.")
|
||||
__("I was unable to install the required Android packages.")
|
||||
__("I've finished installing the required Android packages.")
|
||||
__("It looks like you're ready to start packaging games.")
|
||||
__("Please enter your name or the name of your organization.")
|
||||
__("I found an android.keystore file in the rapt directory. Do you want to use this file?")
|
||||
__("I can create an application signing key for you. This key is required to create Universal APK for sideloading and stores other than Google Play.\n\nDo you want to create a key?")
|
||||
__("I will create the key in the android.keystore file.\n\nYou need to back this file up. If you lose it, you will not be able to upgrade your application.\n\nYou also need to keep the key safe. If evil people get this file, they could make fake versions of your application, and potentially steal your users' data.\n\nWill you make a backup of android.keystore, and keep it in a safe place?")
|
||||
__("Could not create android.keystore. Is keytool in your path?")
|
||||
__("I've finished creating android.keystore. Please back it up, and keep it in a safe place.")
|
||||
__("I found a bundle.keystore file in the rapt directory. Do you want to use this file?")
|
||||
__("I can create a bundle signing key for you. This key is required to build an Android App Bundle (AAB) for upload to Google Play.\n\nDo you want to create a key?")
|
||||
__("I will create the key in the bundle.keystore file.\n\nYou need to back this file up. If you lose it, you will not be able to upgrade your application.\n\nYou also need to keep the key safe. If evil people get this file, they could make fake versions of your application, and potentially steal your users' data.\n\nWill you make a backup of bundle.keystore, and keep it in a safe place?")
|
||||
__("Could not create bundle.keystore. Is keytool in your path?")
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -262,6 +262,34 @@ change_renpy_executable()
|
||||
|
||||
return rv
|
||||
|
||||
def add_missing_directories(self):
|
||||
"""
|
||||
Adds to this file list all directories that are needed by other
|
||||
entries in this file list.
|
||||
"""
|
||||
|
||||
rv = self.copy()
|
||||
|
||||
seen = set()
|
||||
required = set()
|
||||
|
||||
for i in self:
|
||||
seen.add(i.name)
|
||||
|
||||
name = i.name
|
||||
|
||||
while "/" in name:
|
||||
name = name.rpartition("/")[0]
|
||||
required.add(name)
|
||||
|
||||
for name in required - seen:
|
||||
rv.append(File(name, None, True, False))
|
||||
|
||||
rv.sort()
|
||||
|
||||
return rv
|
||||
|
||||
|
||||
@staticmethod
|
||||
def merge(l):
|
||||
"""
|
||||
@@ -340,13 +368,15 @@ change_renpy_executable()
|
||||
duplicate is set.
|
||||
"""
|
||||
|
||||
prefix = py("lib/py{major}-mac-universal")
|
||||
|
||||
for f in list(self):
|
||||
|
||||
if f.name.startswith("lib/python") and (not duplicate):
|
||||
name = app + "/Contents/Resources/" + f.name
|
||||
|
||||
elif f.name.startswith(py("lib/py{major}-mac-x86_64")):
|
||||
name = app + "/Contents/MacOS/" + f.name[19:]
|
||||
elif f.name.startswith(prefix):
|
||||
name = app + "/Contents/MacOS/" + f.name[len(prefix)+1:]
|
||||
|
||||
else:
|
||||
continue
|
||||
@@ -371,7 +401,10 @@ change_renpy_executable()
|
||||
for f in sorted(self, key=lambda a : a.name):
|
||||
f.hash(sha, distributor)
|
||||
|
||||
return sha.hexdigest()
|
||||
if PY2:
|
||||
return sha.hexdigest().decode("utf-8")
|
||||
else:
|
||||
return sha.hexdigest()
|
||||
|
||||
def split_by_prefix(self, prefix):
|
||||
"""
|
||||
@@ -408,7 +441,7 @@ change_renpy_executable()
|
||||
This manages the process of building distributions.
|
||||
"""
|
||||
|
||||
def __init__(self, project, destination=None, reporter=None, packages=None, build_update=True, open_directory=False, noarchive=False, packagedest=None, report_success=True, scan=True, macapp=None, force_format=None):
|
||||
def __init__(self, project, destination=None, reporter=None, packages=None, build_update=True, open_directory=False, noarchive=False, packagedest=None, report_success=True, scan=True, macapp=None, force_format=None, files_filter=None):
|
||||
"""
|
||||
Distributes `project`.
|
||||
|
||||
@@ -446,6 +479,11 @@ change_renpy_executable()
|
||||
|
||||
`force_format`
|
||||
If given, forces the format of the distribution to be this.
|
||||
|
||||
`files_filter`
|
||||
If given, use this object to decide which files must be included.
|
||||
The object must contains the `filter(file, variant, format)`
|
||||
method which must return True is the file must be included.
|
||||
"""
|
||||
|
||||
# A map from a package to a unique update version hash.
|
||||
@@ -618,6 +656,8 @@ change_renpy_executable()
|
||||
# The time of the update version.
|
||||
self.update_version = int(time.time())
|
||||
|
||||
self.files_filter = files_filter
|
||||
|
||||
for p in build_packages:
|
||||
|
||||
formats = p["formats"]
|
||||
@@ -932,6 +972,7 @@ change_renpy_executable()
|
||||
CFBundleDisplayName=display_name,
|
||||
CFBundleExecutable=executable_name,
|
||||
CFBundleIconFile="icon",
|
||||
CFBundleIdentifier="com.domain.game",
|
||||
CFBundleInfoDictionaryVersion="6.0",
|
||||
CFBundleName=display_name,
|
||||
CFBundlePackageType="APPL",
|
||||
@@ -977,13 +1018,13 @@ change_renpy_executable()
|
||||
linux = 'binary'
|
||||
linux_i686 = 'binary'
|
||||
mac = 'binary'
|
||||
raspi = 'raspi'
|
||||
raspi = 'linux_arm'
|
||||
else:
|
||||
windows = 'windows'
|
||||
linux = 'linux'
|
||||
linux_i686 = 'linux_i686'
|
||||
mac = 'mac'
|
||||
raspi = 'linux'
|
||||
raspi = 'linux_arm'
|
||||
|
||||
prefix = py("lib/py{major}-")
|
||||
|
||||
@@ -1011,11 +1052,20 @@ change_renpy_executable()
|
||||
armfn,
|
||||
True)
|
||||
|
||||
aarch64fn = os.path.join(config.renpy_base, prefix + "linux-aarch64/renpy")
|
||||
|
||||
if os.path.exists(aarch64fn):
|
||||
|
||||
self.add_file(
|
||||
raspi,
|
||||
prefix + "linux-aarch64/" + self.executable_name,
|
||||
aarch64fn,
|
||||
True)
|
||||
|
||||
self.add_file(
|
||||
mac,
|
||||
prefix + "mac-x86_64/" + self.executable_name,
|
||||
os.path.join(config.renpy_base, prefix + "mac-x86_64/renpy"),
|
||||
prefix + "mac-universal/" + self.executable_name,
|
||||
os.path.join(config.renpy_base, prefix + "mac-universal/renpy"),
|
||||
True)
|
||||
|
||||
def add_mac_files(self):
|
||||
@@ -1039,7 +1089,7 @@ change_renpy_executable()
|
||||
|
||||
self.add_file(filelist,
|
||||
contents + "/MacOS/" + self.executable_name,
|
||||
os.path.join(config.renpy_base, py("lib/py{major}-mac-x86_64/renpy")))
|
||||
os.path.join(config.renpy_base, py("lib/py{major}-mac-universal/renpy")))
|
||||
|
||||
|
||||
custom_fn = os.path.join(self.project.path, "icon.icns")
|
||||
@@ -1057,7 +1107,7 @@ change_renpy_executable()
|
||||
|
||||
if not self.build['renpy']:
|
||||
self.add_directory(filelist, contents + "/MacOS/lib")
|
||||
self.add_directory(filelist, contents + py("/MacOS/lib/py{major}-mac-x86_64"))
|
||||
self.add_directory(filelist, contents + py("/MacOS/lib/py{major}-mac-universal"))
|
||||
self.add_directory(filelist, contents + py("/Resources/lib/python{major}.{minor}"))
|
||||
|
||||
self.file_lists[filelist].mac_lib_transform(self.app, self.build['renpy'])
|
||||
@@ -1271,13 +1321,13 @@ change_renpy_executable()
|
||||
def workaround_mac_notarization(self, fl):
|
||||
"""
|
||||
This works around mac notarization by compressing the unsigned,
|
||||
un-notarized, binaries in lib/py3-mac-x86_64.
|
||||
un-notarized, binaries in lib/py3-mac-universal.
|
||||
"""
|
||||
|
||||
fl = fl.copy()
|
||||
|
||||
for f in fl:
|
||||
if py("/lib/py{major}-mac-x86_64/") in f.name:
|
||||
if py("/lib/py{major}-mac-universal/") in f.name:
|
||||
with open(f.path, "rb") as inf:
|
||||
data = inf.read()
|
||||
|
||||
@@ -1311,6 +1361,8 @@ change_renpy_executable()
|
||||
if self.build.get("exclude_empty_directories", True):
|
||||
fl = fl.filter_empty()
|
||||
|
||||
fl = fl.add_missing_directories()
|
||||
|
||||
if macapp:
|
||||
fl = fl.mac_transform(self.app, self.documentation_patterns)
|
||||
|
||||
@@ -1408,7 +1460,7 @@ change_renpy_executable()
|
||||
|
||||
if self.include_update and (variant not in [ 'ios', 'android', 'source']) and (not format.startswith("app-")):
|
||||
|
||||
with open(update_fn, "w") as f:
|
||||
with open(update_fn, "wb" if PY2 else "w") as f:
|
||||
json.dump(update, f, indent=2)
|
||||
|
||||
if (not dlc) or (format == "update"):
|
||||
@@ -1490,6 +1542,9 @@ change_renpy_executable()
|
||||
if f.directory:
|
||||
pkg.add_directory(f.name, f.path)
|
||||
else:
|
||||
if self.files_filter is not None and not self.files_filter.filter(f, variant, format):
|
||||
# Ignore file
|
||||
continue
|
||||
pkg.add_file(f.name, f.path, f.executable)
|
||||
|
||||
self.reporter.progress_done()
|
||||
@@ -1545,7 +1600,7 @@ change_renpy_executable()
|
||||
add_variant(p["name"])
|
||||
|
||||
fn = renpy.fsencode(os.path.join(self.destination, "updates.json"))
|
||||
with open(fn, "w") as f:
|
||||
with open(fn, "wb" if PY2 else "w") as f:
|
||||
json.dump(index, f, indent=2)
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -222,7 +222,13 @@ screen build_distributions:
|
||||
for pkg in packages:
|
||||
if not pkg["hidden"]:
|
||||
$ description = pkg["description"]
|
||||
textbutton "[description!q]" action PackageToggle(pkg["name"]) style "l_checkbox"
|
||||
button:
|
||||
action PackageToggle(pkg["name"]) style "l_checkbox"
|
||||
hbox:
|
||||
spacing 3
|
||||
text "[description!q]"
|
||||
if pkg["dlc"]:
|
||||
text _("(DLC)")
|
||||
|
||||
add SPACER
|
||||
add HALF_SPACER
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -197,7 +197,7 @@ init 1 python in editor:
|
||||
1,
|
||||
_("Atom"),
|
||||
AD,
|
||||
dlc,
|
||||
"extension:atom",
|
||||
_("Up to 150 MB download required."),
|
||||
None)
|
||||
|
||||
@@ -205,7 +205,7 @@ init 1 python in editor:
|
||||
|
||||
fei.append(e)
|
||||
|
||||
# jEdit
|
||||
# jEdit - Only present if it exists on system.
|
||||
if os.path.exists(os.path.join(config.renpy_base, "jedit")):
|
||||
|
||||
fei.append(FancyEditorInfo(
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -216,10 +216,7 @@ screen front_page_project:
|
||||
|
||||
textbutton _("Android") action Jump("android")
|
||||
textbutton _("iOS") action Jump("ios")
|
||||
textbutton _("Web") + " " + _("(Beta)") action Jump("web"):
|
||||
if not PY2:
|
||||
text_color DISABLED
|
||||
|
||||
textbutton _("Web") + " " + _("(Beta)") action Jump("web")
|
||||
textbutton _("Generate Translations") action Jump("translate")
|
||||
textbutton _("Extract Dialogue") action Jump("extract_dialogue")
|
||||
|
||||
@@ -240,7 +237,7 @@ label front_page:
|
||||
|
||||
if (not persistent.has_chosen_language) or ("RENPY_CHOOSE_LANGUAGE" in os.environ):
|
||||
|
||||
if _preferences.language is None:
|
||||
if (_preferences.language is None) or ("RENPY_CHOOSE_LANGUAGE" in os.environ):
|
||||
hide screen bottom_info
|
||||
call choose_language
|
||||
show screen bottom_info
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -404,6 +404,19 @@ class ImageGenerator(object):
|
||||
self.save(s, "main_menu", overwrite=False)
|
||||
self.save(s, "game_menu", overwrite=False)
|
||||
|
||||
def generate_bubble(self):
|
||||
|
||||
import shutil
|
||||
|
||||
source = os.path.join(config.renpy_base, "gui", "game", "gui", "bubble.png")
|
||||
dest = os.path.join(self.prefix, "bubble.png")
|
||||
|
||||
if source == dest:
|
||||
return
|
||||
|
||||
shutil.copyfile(source, dest)
|
||||
|
||||
|
||||
def generate_all(self):
|
||||
self.generate_textbox()
|
||||
self.generate_choice_button()
|
||||
@@ -415,6 +428,7 @@ class ImageGenerator(object):
|
||||
self.generate_notify()
|
||||
self.generate_menus()
|
||||
self.generate_icon()
|
||||
self.generate_bubble()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -90,8 +90,7 @@ label install_live2d:
|
||||
patterns = [
|
||||
(r".*/Core/dll/linux/x86_64/(libLive2DCubismCore.so)", _prefix + r"linux-x86_64/\1"),
|
||||
(r".*/Core/dll/windows/x86_64/(Live2DCubismCore.dll)", _prefix + r"windows-x86_64/\1"),
|
||||
(r".*/Core/dll/windows/x86/(Live2DCubismCore.dll)", _prefix + r"windows-i686/\1"),
|
||||
(r".*/Core/dll/macos/(libLive2DCubismCore.dylib)", _prefix + r"mac-x86_64/\1"),
|
||||
(r".*/Core/dll/macos/(libLive2DCubismCore.dylib)", _prefix + r"mac-universal/\1"),
|
||||
(r".*/Core/dll/experimental/rpi/(libLive2DCubismCore.so)", _prefix + r"linux-armv7l/\1"),
|
||||
|
||||
(r".*/Core/dll/android/(armeabi-v7a/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
|
||||
# This file imports the extensions API into the default store, and makes it
|
||||
# also contains the strings used by the extensions API, so the Ren'Py translation
|
||||
# framework can find them.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -170,7 +170,7 @@ screen common:
|
||||
has vbox
|
||||
|
||||
text message:
|
||||
text_align 0.5
|
||||
textalign 0.5
|
||||
xalign 0.5
|
||||
layout "subtitle"
|
||||
|
||||
@@ -211,7 +211,7 @@ screen common:
|
||||
add SPACER
|
||||
|
||||
text submessage:
|
||||
text_align 0.5
|
||||
textalign 0.5
|
||||
xalign 0.5
|
||||
layout "subtitle"
|
||||
|
||||
@@ -250,7 +250,7 @@ screen launcher_input:
|
||||
has vbox
|
||||
|
||||
text message:
|
||||
text_align 0.5
|
||||
textalign 0.5
|
||||
xalign 0.5
|
||||
layout "subtitle"
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -23,7 +23,7 @@ init python hide:
|
||||
import os
|
||||
|
||||
macapp = os.path.join(config.renpy_base, "renpy.app/Contents/MacOS")
|
||||
maclib = os.path.join(config.renpy_base, distribute.py("lib/py{major}-mac-x86_64"))
|
||||
maclib = os.path.join(config.renpy_base, distribute.py("lib/py{major}-mac-universal"))
|
||||
|
||||
if os.path.exists(maclib):
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -173,9 +173,9 @@ init -1 python:
|
||||
|
||||
self.cmd = cmd
|
||||
|
||||
f = open(self.filename, "ab")
|
||||
f = open(self.filename, "a")
|
||||
|
||||
f.write(b"\n\n\n")
|
||||
f.write("\n\n\n")
|
||||
|
||||
if cancel:
|
||||
cancel_action = self.cancel
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -249,7 +249,7 @@ screen navigation:
|
||||
if persistent.navigation == "todo":
|
||||
|
||||
text _("No TODO comments found.\n\nTo create one, include \"# TODO\" in your script."):
|
||||
text_align 0.5
|
||||
textalign 0.5
|
||||
xalign 0.5
|
||||
yalign 0.5
|
||||
|
||||
@@ -279,4 +279,3 @@ label navigation_loop:
|
||||
label navigation_refresh:
|
||||
$ project.current.update_dump(True)
|
||||
jump navigation_loop
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
+15
-28
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -270,22 +270,8 @@ init python:
|
||||
build.classify_renpy("**/thumbs.db", None)
|
||||
build.classify_renpy("**/.*", None)
|
||||
|
||||
# Atom rules. These have to be very early, since Atom uses names like
|
||||
# tmp for packages.
|
||||
build.classify_renpy("atom/", "atom-all")
|
||||
build.classify_renpy("atom/default-dot-atom/**", "atom-all")
|
||||
build.classify_renpy("atom/atom-windows/**", "atom-windows")
|
||||
build.classify_renpy("atom/Atom.app/**", "atom-mac")
|
||||
build.classify_renpy("atom/atom-linux**", "atom-linux")
|
||||
|
||||
try:
|
||||
with open(os.path.join(config.renpy_base, "atom", "executable.txt")) as f:
|
||||
for l in f:
|
||||
build.executable(l.strip())
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
build.classify_renpy("rapt/**/libLive2DCubismCore.so", None)
|
||||
build.classify_renpy("rapt/symbols/", None)
|
||||
build.classify_renpy("rapt/**", "rapt")
|
||||
build.executable("rapt/prototype/gradlew")
|
||||
|
||||
@@ -351,16 +337,25 @@ init python:
|
||||
|
||||
build.classify_renpy(pattern + "/**.rpyc", binary)
|
||||
build.classify_renpy(pattern + "/**.rpymc", binary)
|
||||
|
||||
build.classify_renpy(pattern + "/**/" + renpy.script.BYTECODE_FILE, binary)
|
||||
build.classify_renpy(pattern + "/**/cache/bytecode-311.rpyb", "web")
|
||||
build.classify_renpy(pattern + "/**/cache/bytecode-*.rpyb", None)
|
||||
|
||||
build.classify_renpy(pattern + "/**/cache/*", binary)
|
||||
|
||||
build.classify_renpy(pattern + "/**", source)
|
||||
|
||||
|
||||
build.classify_renpy("renpy.py", "binary")
|
||||
source_and_binary("renpy")
|
||||
|
||||
# games.
|
||||
build.classify_renpy("launcher/game/theme/", None)
|
||||
build.classify_renpy("gui/game/gui/", None)
|
||||
|
||||
build.classify_renpy("gui/game/gui/", "source")
|
||||
build.classify_renpy("gui/game/gui/bubble.png", "source")
|
||||
build.classify_renpy("gui/game/gui/*", None)
|
||||
|
||||
source_and_binary("launcher", py=False)
|
||||
source_and_binary("gui", binary=None, py=False)
|
||||
@@ -399,6 +394,7 @@ init python:
|
||||
build.classify_renpy("module/pysdlsound/*.py", "source")
|
||||
build.classify_renpy("module/pysdlsound/*.pyx", "source")
|
||||
build.classify_renpy("module/fribidi-src/**", "source")
|
||||
build.classify_renpy("module/tinyfiledialogs/**", "source")
|
||||
|
||||
# all-platforms binary.
|
||||
build.classify_renpy("lib/**/*steam_api*", "steam")
|
||||
@@ -419,11 +415,6 @@ init python:
|
||||
|
||||
build.classify_renpy("lib/", "binary")
|
||||
|
||||
# renpy.app is now built from scratch from distribute.rpy.
|
||||
|
||||
# jedit rules.
|
||||
build.classify_renpy("jedit/**", "jedit")
|
||||
|
||||
# Packages.
|
||||
build.packages = [ ]
|
||||
|
||||
@@ -432,16 +423,12 @@ init python:
|
||||
build.package("source", "tar.bz2", "source source_only", update=False)
|
||||
build.package("steam", "zip", "steam", dlc=True)
|
||||
|
||||
build.package("jedit", "zip", "jedit", dlc=True)
|
||||
|
||||
build.package("atom-linux", "tar.bz2", "atom-all atom-linux", dlc=True)
|
||||
build.package("atom-mac", "zip", "atom-all atom-mac", dlc=True)
|
||||
build.package("atom-windows", "zip", "atom-all atom-windows", dlc=True)
|
||||
|
||||
build.package("rapt", "zip", "rapt", dlc=True)
|
||||
build.package("renios", "zip", "renios", dlc=True)
|
||||
build.package("web", "zip", "web", dlc=True)
|
||||
|
||||
# The identifier for the SDK.
|
||||
define build.mac_info_plist["CFBundleIdentifier"] = "org.renpy.sdk"
|
||||
|
||||
# Enable the special launcher translation mode.
|
||||
define config.translate_launcher = True
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -31,12 +31,11 @@ init python in distribute:
|
||||
import sys
|
||||
import threading
|
||||
|
||||
from renpy import six
|
||||
from zipfile import crc32
|
||||
|
||||
|
||||
# Since the long type doesn't exist on py3, define it here
|
||||
if six.PY3:
|
||||
if not PY2:
|
||||
long = int
|
||||
|
||||
zlib.Z_DEFAULT_COMPRESSION = 5
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -343,7 +343,7 @@ screen choose_language():
|
||||
style "l_label_text"
|
||||
|
||||
size 36
|
||||
text_align .5
|
||||
textalign .5
|
||||
layout "subtitle"
|
||||
|
||||
add SPACER
|
||||
@@ -356,7 +356,7 @@ screen choose_language():
|
||||
for tlid, tlname in tran:
|
||||
textbutton tlname:
|
||||
xmaximum (TWOTHIRDS//3)
|
||||
action SetScreenVariable("chosen_lang", tlid)
|
||||
action [ SetScreenVariable("chosen_lang", tlid), Language(tlid), project.SelectTutorial(True), Return() ]
|
||||
hovered SetScreenVariable("local_lang", tlid)
|
||||
unhovered SetScreenVariable("local_lang", chosen_lang)
|
||||
style "l_list"
|
||||
@@ -377,7 +377,7 @@ screen choose_language():
|
||||
text_style "l_default"
|
||||
|
||||
text_size 30
|
||||
text_text_align .5
|
||||
text_textalign .5
|
||||
text_layout "subtitle"
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -48,6 +48,7 @@ init python in project:
|
||||
_("Press shift+O (the letter) to access the console."),
|
||||
_("Press shift+D to access the developer menu."),
|
||||
_("Have you backed up your projects recently?"),
|
||||
_("Lint checks your game for potential mistakes, and gives you statistics."),
|
||||
]
|
||||
|
||||
class Project(object):
|
||||
@@ -276,6 +277,8 @@ init python in project:
|
||||
if wait:
|
||||
if p.wait():
|
||||
|
||||
print("Launch failed. command={!r}, returncode={!r}".format(cmd, p.returncode))
|
||||
|
||||
if args and not self.is_writeable():
|
||||
interface.error(_("Launching the project failed."), _("This may be because the project is not writeable."))
|
||||
else:
|
||||
@@ -387,9 +390,18 @@ init python in project:
|
||||
can be included in the project.
|
||||
"""
|
||||
|
||||
def is_script(fn):
|
||||
fn = fn.lower()
|
||||
|
||||
for i in [ ".rpy", ".rpym", "_ren.py" ]:
|
||||
if fn.endswith(i):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
rv = [ ]
|
||||
rv.extend(i for i, isdir in util.walk(self.path)
|
||||
if (not isdir) and (i.endswith(".rpy") or i.endswith(".rpym")) and (not i.startswith("tmp/")) )
|
||||
if (not isdir) and is_script(i) and (not i.startswith("tmp/")) )
|
||||
|
||||
return rv
|
||||
|
||||
@@ -833,3 +845,24 @@ init python:
|
||||
return False
|
||||
|
||||
renpy.arguments.register_command("get_projects_directory", get_projects_directory_command)
|
||||
|
||||
def set_project_command():
|
||||
ap = renpy.arguments.ArgumentParser()
|
||||
ap.add_argument("project", help="The full path to the project to select.")
|
||||
|
||||
args = ap.parse_args()
|
||||
|
||||
projects = os.path.dirname(os.path.abspath(args.project))
|
||||
name = os.path.basename(args.project)
|
||||
|
||||
persistent.projects_directory = renpy.fsdecode(projects)
|
||||
project.multipersistent.projects_directory = persistent.projects_directory
|
||||
|
||||
persistent.active_project = name
|
||||
|
||||
project.multipersistent.save()
|
||||
renpy.save_persistent()
|
||||
|
||||
return False
|
||||
|
||||
renpy.arguments.register_command("set_project", set_project_command)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -402,7 +402,7 @@ style l_alternate is l_default:
|
||||
style l_alternate_text is l_default:
|
||||
size size(14)
|
||||
font light_font()
|
||||
text_align 1.0
|
||||
textalign 1.0
|
||||
|
||||
style l_small_button is l_button
|
||||
|
||||
@@ -488,7 +488,7 @@ style l_info_button is l_button:
|
||||
xmargin 50
|
||||
|
||||
style l_info_button_text is l_button_text:
|
||||
text_align 0.5
|
||||
textalign 0.5
|
||||
layout "subtitle"
|
||||
|
||||
# Progress bar.
|
||||
|
||||
+10
-1
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
init python:
|
||||
|
||||
|
||||
class FileTail(object):
|
||||
|
||||
def __init__(self, filename, lines=8):
|
||||
@@ -31,6 +32,11 @@ init python:
|
||||
|
||||
def update(self):
|
||||
|
||||
def filter_text(s):
|
||||
if "Unknown chunk type '200'" in s:
|
||||
return False
|
||||
return True
|
||||
|
||||
try:
|
||||
with open(self.filename) as f:
|
||||
text = f.read()
|
||||
@@ -49,6 +55,9 @@ init python:
|
||||
if "\r" in l:
|
||||
_head, _sep, l = l.rpartition("\r")
|
||||
|
||||
if not filter_text(l):
|
||||
continue
|
||||
|
||||
while l:
|
||||
newtext.append(l[:100])
|
||||
l = l[100:]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -797,3 +797,103 @@ translate french strings:
|
||||
# renpy/common/00preferences.rpy:535
|
||||
old "mute main"
|
||||
new "sourdine générale"
|
||||
|
||||
# renpy/common/00speechbubble.rpy:299
|
||||
old "Speech Bubble Editor"
|
||||
new "Éditeur de bulles de dialogue"
|
||||
|
||||
# renpy/common/00speechbubble.rpy:304
|
||||
old "(hide)"
|
||||
new "(masquer)"
|
||||
|
||||
# renpy/common/00director.rpy:1748
|
||||
old "Click to toggle attribute, right click to toggle negative attribute."
|
||||
new "Clic pour (dés)activer des attributs, clic droit pour (dés)activer les suppressions d'attributs."
|
||||
|
||||
# renpy/common/00director.rpy:1771
|
||||
old "Click to set transform, right click to add to transform list."
|
||||
new "Clic pour ajouter un transform, clic droit pour ajouter une liste de transforms."
|
||||
|
||||
# renpy/common/00preferences.rpy:528
|
||||
old "audio when unfocused"
|
||||
new "audio lors de la perte de focus"
|
||||
|
||||
# renpy/common/00preferences.rpy:537
|
||||
old "web cache preload"
|
||||
new "préchargement du cache web cache"
|
||||
|
||||
# renpy/common/00preferences.rpy:552
|
||||
old "voice after game menu"
|
||||
new "voix dans le menu de jeu"
|
||||
|
||||
# renpy/common/00sync.rpy:58
|
||||
old "Sync downloaded."
|
||||
new "Sync téléchargé."
|
||||
|
||||
# renpy/common/00sync.rpy:178
|
||||
old "Could not connect to the Ren'Py Sync server."
|
||||
new "Échec de la connexion au serveur Ren'Py Sync."
|
||||
|
||||
# renpy/common/00sync.rpy:180
|
||||
old "The Ren'Py Sync server timed out."
|
||||
new "Le serveur Ren'Py Sync a mis trop de temps à répondre."
|
||||
|
||||
# renpy/common/00sync.rpy:182
|
||||
old "An unknown error occurred while connecting to the Ren'Py Sync server."
|
||||
new "Une erreur inconnue est arrivée lors de la connexion au serveur Ren'Py Sync."
|
||||
|
||||
# renpy/common/00sync.rpy:255
|
||||
old "The Ren'Py Sync server does not have a copy of this sync. The sync ID may be invalid, or it may have timed out."
|
||||
new "Le serveur Ren'Py Sync ne reconnaît pas ce code sync. l'ID est peut-être invalide, ou il peut avoir expiré."
|
||||
|
||||
# renpy/common/00sync.rpy:397
|
||||
old "Please enter the sync ID you generated.\nNever enter a sync ID you didn't create yourself."
|
||||
new "Entrez l'ID sync que vous avez généré.\nN'entrez jamais un ID sync que vous n'avez pas généré vous-même."
|
||||
|
||||
# renpy/common/00sync.rpy:416
|
||||
old "The sync ID is not in the correct format."
|
||||
new "L'ID sync n'est pas dans un format correct."
|
||||
|
||||
# renpy/common/00sync.rpy:436
|
||||
old "The sync could not be decrypted."
|
||||
new "Le sync n'a pas pu être déchiffré."
|
||||
|
||||
# renpy/common/00sync.rpy:459
|
||||
old "The sync belongs to a different game."
|
||||
new "Le sync correspond à un autre jeu."
|
||||
|
||||
# renpy/common/00sync.rpy:464
|
||||
old "The sync contains a file with an invalid name."
|
||||
new "Le sync contient un fichier ayant un nom invalide."
|
||||
|
||||
# renpy/common/00sync.rpy:517
|
||||
old "This will upload your saves to the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}.\nDo you want to continue?"
|
||||
new "Vos sauvegardes vont être téléchargées sur le {a=https://sync.renpy.org}serveur Ren'Py Sync{/a}.\nVoulez-vous continuer ?"
|
||||
|
||||
# renpy/common/00sync.rpy:546
|
||||
old "Enter Sync ID"
|
||||
new "Entrez l'ID Sync"
|
||||
|
||||
# renpy/common/00sync.rpy:557
|
||||
old "This will contact the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}."
|
||||
new "Ceci va contacter le {a=https://sync.renpy.org}serveur Ren'Py Sync{/a}."
|
||||
|
||||
# renpy/common/00sync.rpy:584
|
||||
old "Sync Success"
|
||||
new "Sync réussi"
|
||||
|
||||
# renpy/common/00sync.rpy:587
|
||||
old "The Sync ID is:"
|
||||
new "L'ID Sync est :"
|
||||
|
||||
# renpy/common/00sync.rpy:593
|
||||
old "You can use this ID to download your save on another device.\nThis sync will expire in an hour.\nRen'Py Sync is supported by {a=https://www.renpy.org/sponsors.html}Ren'Py's Sponsors{/a}."
|
||||
new "Vous pouvez utiliser cet ID pour transférer votre sauvegarde sur un autre appareil.\nCe sync expirera dans une heure.\nRen'Py Sync is soutenu par les {a=https://www.renpy.org/sponsors.html}Sponsors de Ren'Py's{/a}."
|
||||
|
||||
# renpy/common/00sync.rpy:619
|
||||
old "Sync Error"
|
||||
new "Erreur de Sync"
|
||||
|
||||
# renpy/common/00webvideo.rpy:5
|
||||
old "Touch to play the video."
|
||||
new "Touchez pour jouer la vidéo."
|
||||
|
||||
@@ -14,7 +14,11 @@
|
||||
|
||||
# _developer/developer.rpym:47
|
||||
old "Variable Viewer"
|
||||
new "Visualisateur de variable"
|
||||
new "Inspecteur de variables"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:51
|
||||
old "Persistent Viewer"
|
||||
new "Inspecteur de données persistentes"
|
||||
|
||||
# _developer/developer.rpym:49
|
||||
old "Theme Test"
|
||||
@@ -124,9 +128,13 @@
|
||||
old "Ren'Py script disabled."
|
||||
new "Script Ren'Py désactivé."
|
||||
|
||||
# 00console.rpy:398
|
||||
old "help: show this help"
|
||||
new "aide : afficher cette aide"
|
||||
# renpy/common/00console.rpy:781
|
||||
old "help: show this help\n help <expr>: show signature and documentation of <expr>"
|
||||
new "help : afficher cette aide\n help <expr>: afficher la signature et la documentation de <expr>"
|
||||
|
||||
# renpy/common/00console.rpy:805
|
||||
old "Help may display undocumented functions. Please check that the function or\nclass you want to use is documented.\n\n"
|
||||
new "Help peut afficher des fonctions non documentées. Veuillez vérifier que la\nfonction ou classe que vous voulez utiliser est bien documentée.\n\n"
|
||||
|
||||
# 00console.rpy:403
|
||||
old "commands:\n"
|
||||
|
||||
@@ -925,7 +925,7 @@
|
||||
|
||||
# preferences.rpy:174
|
||||
old "Show edit file section"
|
||||
new "Afficher la section d’édition de fichier"
|
||||
new "Afficher la section d’édition de fichiers"
|
||||
|
||||
# preferences.rpy:175
|
||||
old "Large fonts"
|
||||
@@ -933,11 +933,11 @@
|
||||
|
||||
# preferences.rpy:178
|
||||
old "Console output"
|
||||
new "Sortie console"
|
||||
new "Console de sortie"
|
||||
|
||||
# preferences.rpy:199
|
||||
old "Open launcher project"
|
||||
new "Ouvrir le projet lanceur"
|
||||
new "Ouvrir le projet du lanceur"
|
||||
|
||||
# preferences.rpy:213
|
||||
old "Language:"
|
||||
@@ -997,7 +997,7 @@
|
||||
|
||||
# translations.rpy:104
|
||||
old "The language to work with. This should only contain lower-case ASCII characters and underscores."
|
||||
new "Le langage avec lequel travailler. Cette valeur ne doit contenir que des caractères ASCII en minuscules et des underscores (tiret bas)."
|
||||
new "Le langage avec lequel travailler. Cette valeur ne doit contenir que des caractères ASCII en minuscules et des underscores."
|
||||
|
||||
# translations.rpy:130
|
||||
old "Generate empty strings for translations"
|
||||
@@ -1025,7 +1025,7 @@
|
||||
|
||||
# translations.rpy:180
|
||||
old "Update Default Interface Translations"
|
||||
new "Met à jour la traduction de l'interface par défaut"
|
||||
new "Mise à jour de la traduction par défaut de l'interface"
|
||||
|
||||
# translations.rpy:200
|
||||
old "The extract command allows you to extract string translations from an existing project into a temporary file.\n\nThe merge command merges extracted translations into another project."
|
||||
@@ -1057,7 +1057,7 @@
|
||||
|
||||
# translations.rpy:282
|
||||
old "Updating default interface translations..."
|
||||
new "Mise à jour en cours de la traduction de l’interface par défaut..."
|
||||
new "Mise à jour de la traduction par défaut de l’interface en cours..."
|
||||
|
||||
# translations.rpy:306
|
||||
old "Extract Dialogue: [project.current.name!q]"
|
||||
@@ -1069,7 +1069,7 @@
|
||||
|
||||
# translations.rpy:330
|
||||
old "Tab-delimited Spreadsheet (dialogue.tab)"
|
||||
new "Feuille de calcul avec pour séparateur des tabulations (dialogue.tab)"
|
||||
new "Feuille de calcul avec des tabulations comme séparateur (dialogue.tab)"
|
||||
|
||||
# translations.rpy:331
|
||||
old "Dialogue Text Only (dialogue.txt)"
|
||||
@@ -1613,7 +1613,7 @@
|
||||
|
||||
# game/install.rpy:151
|
||||
old "Install Steam Support"
|
||||
new "Installer le upport Steam"
|
||||
new "Installer le support Steam"
|
||||
|
||||
# game/install.rpy:160
|
||||
old "Before installing Steam support, please make sure you are a {a=https://partner.steamgames.com/}Steam partner{/a}."
|
||||
@@ -2074,3 +2074,15 @@
|
||||
# game/preferences.rpy:327
|
||||
old "{#in language font}Start using Ren'Py in [lang_name]"
|
||||
new "{font=fonts/Roboto-Light.ttf}Commencez à utiliser Ren'Py en [lang_name]{/font}"
|
||||
|
||||
# game/distribute_gui.rpy:231
|
||||
old "(DLC)"
|
||||
new "(DLC)"
|
||||
|
||||
# game/project.rpy:46
|
||||
old "Lint checks your game for potential mistakes, and gives you statistics."
|
||||
new "Lint vérifie votre jeu pour des erreurs communes, et génère des statistiques."
|
||||
|
||||
# game/web.rpy:484
|
||||
old "Creating package..."
|
||||
new "Création du package..."
|
||||
|
||||
@@ -185,8 +185,8 @@
|
||||
new "## Les fichiers correspondant au format de documentation sont dupliqués pour les compilation sur Mac, c'est pourquoi ils apparaissent deux fois dans l’archive zip."
|
||||
|
||||
# options.rpy:196
|
||||
old "## A Google Play license key is required to download expansion files and perform in-app purchases. It can be found on the \"Services & APIs\" page of the Google Play developer console."
|
||||
new "## Une clé de licence A Google Play est requise pour télécharger les fichiers et permettre les achats dans l'application. Vous pourrez la trouver sur la page « Services & APIs » de la console de développement Google Play."
|
||||
old "## A Google Play license key is required to perform in-app purchases. It can be found in the Google Play developer console, under \"Monetize\" > \"Monetization Setup\" > \"Licensing\"."
|
||||
new "## Une clé de licence Google Play est requise pour permettre les achats depuis l'application. Vous pourrez la trouver dans la console de développement Google Play, sous \"Monétiser\" > \"Configuration de la monétisation\" > \"Licences\"."
|
||||
|
||||
# options.rpy:203
|
||||
old "## The username and project name associated with an itch.io project, separated by a slash."
|
||||
|
||||
@@ -450,7 +450,7 @@
|
||||
|
||||
# screens.rpy:1024
|
||||
old "Toggles dialogue skipping."
|
||||
new "Active ou désactives les «sauts des dialogues»."
|
||||
new "Active ou désactive les «sauts des dialogues»."
|
||||
|
||||
# screens.rpy:1027
|
||||
old "Page Up"
|
||||
@@ -621,8 +621,8 @@
|
||||
new "## Les dialogues sont affichés soit dans une vpgrid soit dans une vbox."
|
||||
|
||||
# screens.rpy:1314
|
||||
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
|
||||
new "## Si fourni, affiche le menu. Le menu peut s’afficher de manière incorrecte si config.narrator_menu est initialisé à True, comme c’est le cas au-dessus."
|
||||
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True."
|
||||
new "## Si fourni, affiche le menu. Le menu peut s’afficher de manière incorrecte si config.narrator_menu est initialisé à True."
|
||||
|
||||
# screens.rpy:1344
|
||||
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
|
||||
@@ -719,3 +719,15 @@
|
||||
# gui/game/screens.rpy:1049
|
||||
old "Opens the accessibility menu."
|
||||
new "Ouvre le menu d'accessibilité."
|
||||
|
||||
# gui/game/screens.rpy:1397
|
||||
old "## Bubble screen"
|
||||
new "## Screen des bulles"
|
||||
|
||||
# gui/game/screens.rpy:1399
|
||||
old "## The Bubble screen is used to display dialogue to the player when using speech bubbles. The Bubble screen takes the same parameters as the say screen, must create a displayable with the id of \"what\", and can create displayables with the \"namebox\", \"who\", and \"window\" ids."
|
||||
new "## Le screen des bulles est utilisé pour afficher des dialogues en utilisant des bulles. Ce screen prend les mêmes paramètres que le screen say, doit prévoir un displayable avec l'id \"what\", et peut créer des displayables avec les ids \"namebox\", \"who\", et \"window\"."
|
||||
|
||||
# gui/game/screens.rpy:1404
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#bubble"
|
||||
new "## https://www.renpy.org/doc/html/screen_special.html#bubble"
|
||||
|
||||
@@ -622,8 +622,8 @@ translate italian strings:
|
||||
new "## Mostra il dialogo in una vpgrid o in una vbox."
|
||||
|
||||
# screens.rpy:1314
|
||||
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
|
||||
new "## Mostra il menu, se fornito. Il menu può apparire distorto se config.narrator_menu è impostato a True, come lo è sopra."
|
||||
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True."
|
||||
new "## Mostra il menu, se fornito. Il menu può apparire distorto se config.narrator_menu è impostato a True."
|
||||
|
||||
# screens.rpy:1344
|
||||
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
|
||||
@@ -676,4 +676,3 @@ translate italian strings:
|
||||
# screens.rpy:1079
|
||||
old "Left Trigger\nLeft Shoulder"
|
||||
new "Grilletto Sinistro\nLaterale Sinistro"
|
||||
|
||||
|
||||
@@ -669,7 +669,7 @@
|
||||
|
||||
# ios.rpy:37
|
||||
old "Creates an Xcode project corresponding to the current Ren'Py project."
|
||||
new "現在の Ren'PY プロジェクトに対応する Xcode プロジェクトを作成します。"
|
||||
new "現在の Ren'Py プロジェクトに対応する Xcode プロジェクトを作成します。"
|
||||
|
||||
# ios.rpy:38
|
||||
old "Updates the Xcode project with the latest game files. This must be done each time the Ren'Py project changes."
|
||||
|
||||
@@ -346,15 +346,15 @@ translate japanese strings:
|
||||
|
||||
# screens.rpy:752
|
||||
old "Unseen Text"
|
||||
new "未読テキスト"
|
||||
new "未読テキストもスキップ"
|
||||
|
||||
# screens.rpy:753
|
||||
old "After Choices"
|
||||
new "選択肢の後"
|
||||
new "選択肢後もスキップ継続"
|
||||
|
||||
# screens.rpy:754
|
||||
old "Transitions"
|
||||
new "トランジション"
|
||||
new "トランジションをスキップ"
|
||||
|
||||
# screens.rpy:756
|
||||
old "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
|
||||
|
||||
@@ -634,8 +634,8 @@ translate piglatin strings:
|
||||
new "## Isplaysday ialogueday inay eitheray aay pgridvay oray hetay boxvay."
|
||||
|
||||
# gui/game/screens.rpy:1307
|
||||
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
|
||||
new "## Isplaysday hetay enumay, ifay ivengay. Hetay enumay aymay ebay isplayedday incorrectlyay ifay onfigcay.arrator_menunay isay etsay otay Ruetay, asay itay isay aboveay."
|
||||
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True."
|
||||
new "## Isplaysday hetay enumay, ifay ivengay. Hetay enumay aymay ebay isplayedday incorrectlyay ifay onfigcay.arrator_menunay isay etsay otay Ruetay."
|
||||
|
||||
# gui/game/screens.rpy:1337
|
||||
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
|
||||
@@ -652,4 +652,3 @@ translate piglatin strings:
|
||||
# gui/game/screens.rpy:1424
|
||||
old "Menu"
|
||||
new "Enumay"
|
||||
|
||||
|
||||
@@ -654,7 +654,7 @@ translate russian strings:
|
||||
new "## Показывает диалог или в vpgrid, или в vbox."
|
||||
|
||||
# screens.rpy:1316
|
||||
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
|
||||
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True."
|
||||
new "## Показывает меню, если есть. Меню может показываться некорректно, если config.narrator_menu установлено на True."
|
||||
|
||||
# screens.rpy:1346
|
||||
|
||||
@@ -777,3 +777,115 @@ translate spanish strings:
|
||||
# renpy/common/00preferences.rpy:535
|
||||
old "mute main"
|
||||
new "silenciar volumen principal"
|
||||
|
||||
# renpy/common/00speechbubble.rpy:299
|
||||
old "Speech Bubble Editor"
|
||||
new "Editor de globos de diálogo"
|
||||
|
||||
# renpy/common/00speechbubble.rpy:304
|
||||
old "(hide)"
|
||||
new "(ocultar)"
|
||||
|
||||
# renpy/common/00gui.rpy:455
|
||||
old "This save was created on a different device. Maliciously constructed save files can harm your computer. Do you trust this save's creator and everyone who could have changed the file?"
|
||||
new "Este archivo se creó en otro dispositivo. Los archivos de guardado maliciosamente creados pueden dañar tu computadora. Confías en el creador de este archivo y en todos los que podrían haberlo modificado?"
|
||||
|
||||
# renpy/common/00gui.rpy:456
|
||||
old "Do you trust the device the save was created on? You should only choose yes if you are the device's sole user."
|
||||
new "¿Confías en el dispositivo en el que se creó el archivo de guardado? Sólo debes elegir sí si eres el único usuario del dispositivo."
|
||||
|
||||
# renpy/common/00preferences.rpy:520
|
||||
old "web cache preload"
|
||||
new "precarga de la caché web"
|
||||
|
||||
# renpy/common/00webvideo.rpy:5
|
||||
old "Touch to play the video."
|
||||
new "Toca aquí para reproducir el video."
|
||||
|
||||
# renpy/common/00director.rpy:1748
|
||||
old "Click to toggle attribute, right click to toggle negative attribute."
|
||||
new "Clic para cambiar el atributo, Clic derecho para cambiar el atributo a negativo."
|
||||
|
||||
# renpy/common/00director.rpy:1771
|
||||
old "Click to set transform, right click to add to transform list."
|
||||
new "Clic para establecer la transformación, clic derecho para añadir a la lista de transformaciones."
|
||||
|
||||
# renpy/common/00director.rpy:1792
|
||||
old "Click to set, right click to add to behind list."
|
||||
new "Clic para fijar, clic derecho para añadir a detrás de la lista."
|
||||
|
||||
# renpy/common/00preferences.rpy:528
|
||||
old "audio when unfocused"
|
||||
new "audio cuando no está enfocado"
|
||||
|
||||
# renpy/common/00preferences.rpy:552
|
||||
old "voice after game menu"
|
||||
new "voz después de un menú del juego"
|
||||
|
||||
# renpy/common/00sync.rpy:58
|
||||
old "Sync downloaded."
|
||||
new "Sincronización descargada"
|
||||
|
||||
# renpy/common/00sync.rpy:178
|
||||
old "Could not connect to the Ren'Py Sync server."
|
||||
new "No se pudo conectar al servidor Ren'Py Sync."
|
||||
|
||||
# renpy/common/00sync.rpy:180
|
||||
old "The Ren'Py Sync server timed out."
|
||||
new "Se agotó el tiempo de espera del servidor Ren'Py Sync."
|
||||
|
||||
# renpy/common/00sync.rpy:182
|
||||
old "An unknown error occurred while connecting to the Ren'Py Sync server."
|
||||
new "Se produjo un error desconocido al conectarse al servidor Ren'Py Sync."
|
||||
|
||||
# renpy/common/00sync.rpy:255
|
||||
old "The Ren'Py Sync server does not have a copy of this sync. The sync ID may be invalid, or it may have timed out."
|
||||
new "El servidor Ren'Py Sync no tiene una copia de esta sincronización. Es posible que el ID de sincronización no sea válido o que se haya agotado el tiempo de espera."
|
||||
|
||||
# renpy/common/00sync.rpy:397
|
||||
old "Please enter the sync ID you generated.\nNever enter a sync ID you didn't create yourself."
|
||||
new "Ingresa la ID de sincronización SI que generaste.\nNunca ingreses una ID de sincronización que no creaste."
|
||||
|
||||
# renpy/common/00sync.rpy:416
|
||||
old "The sync ID is not in the correct format."
|
||||
new "El ID de sincronización no tiene el formato correcto."
|
||||
|
||||
# renpy/common/00sync.rpy:436
|
||||
old "The sync could not be decrypted."
|
||||
new "No se pudo descifrar la ID de sincronización."
|
||||
|
||||
# renpy/common/00sync.rpy:459
|
||||
old "The sync belongs to a different game."
|
||||
new "La sincronización pertenece a un juego diferente."
|
||||
|
||||
# renpy/common/00sync.rpy:464
|
||||
old "The sync contains a file with an invalid name."
|
||||
new "La sincronización contiene un archivo con un nombre no válido."
|
||||
|
||||
# renpy/common/00sync.rpy:517
|
||||
old "This will upload your saves to the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}.\nDo you want to continue?"
|
||||
new "Esto cargará tus archivos guardados en el {a=https://sync.renpy.org}Servidor Ren'Py Sync{/a}..\n¿Quieres continuar?"
|
||||
|
||||
# renpy/common/00sync.rpy:546
|
||||
old "Enter Sync ID"
|
||||
new "Ingrese ID de Sync"
|
||||
|
||||
# renpy/common/00sync.rpy:557
|
||||
old "This will contact the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}."
|
||||
new "Esto contactará con el {a=https://sync.renpy.org}Servidor Ren'Py Sync{/a}."
|
||||
|
||||
# renpy/common/00sync.rpy:584
|
||||
old "Sync Success"
|
||||
new "Sincronización exitosa"
|
||||
|
||||
# renpy/common/00sync.rpy:587
|
||||
old "The Sync ID is:"
|
||||
new "El ID de Sync es:"
|
||||
|
||||
# renpy/common/00sync.rpy:593
|
||||
old "You can use this ID to download your save on another device.\nThis sync will expire in an hour.\nRen'Py Sync is supported by {a=https://www.renpy.org/sponsors.html}Ren'Py's Sponsors{/a}."
|
||||
new "Puede usar esta ID para descargar su guardado en otro dispositivo.\nEsta sincronización caducará en una hora.\RenPy Sync está para {a=https://www.renpy.org/sponsors.html}los patrocinadores de Ren'Py{/a}."
|
||||
|
||||
# renpy/common/00sync.rpy:619
|
||||
old "Sync Error"
|
||||
new "Error de sincronización"
|
||||
|
||||
@@ -211,3 +211,15 @@
|
||||
# renpy/common/00console.rpy:784
|
||||
old "stack: print the return stack"
|
||||
new "stack: imprime la pila de retorno"
|
||||
|
||||
# renpy/common/00console.rpy:781
|
||||
old "help: show this help\n help <expr>: show signature and documentation of <expr>"
|
||||
new "help: muestra esta ayuda\n help <expr>: muestra la firma y la documentación de <expr>"
|
||||
|
||||
# renpy/common/00console.rpy:805
|
||||
old "Help may display undocumented functions. Please check that the function or\nclass you want to use is documented.\n\n"
|
||||
new "La ayuda puede mostrar funciones no documentadas. Por favor, compruebe que la función o\nclase que desea utilizar está documentada.\n\n"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:51
|
||||
old "Persistent Viewer"
|
||||
new "Visor de datos persistentes"
|
||||
|
||||
@@ -2060,3 +2060,15 @@ translate spanish strings:
|
||||
# game/preferences.rpy:327
|
||||
old "{#in language font}Start using Ren'Py in [lang_name]"
|
||||
new "{font=fonts/Roboto-Light.ttf}Empieza a usar Ren'Py en [lang_name]{/font}"
|
||||
|
||||
# game/distribute_gui.rpy:231
|
||||
old "(DLC)"
|
||||
new "(DLC)"
|
||||
|
||||
# game/project.rpy:46
|
||||
old "Lint checks your game for potential mistakes, and gives you statistics."
|
||||
new "Lint comprueba tu juego en busca de posibles errores y te ofrece estadísticas."
|
||||
|
||||
# game/web.rpy:484
|
||||
old "Creating package..."
|
||||
new "Creando paquete..."
|
||||
|
||||
@@ -204,3 +204,7 @@
|
||||
old "## These three variables control, among other things, which mixers are shown to the player by default. Setting one of these to False will hide the appropriate mixer."
|
||||
new "## Estas tres variables controlan, entre otras cosas, qué mezcladores se muestran al reproductor de forma predeterminada. Establecer uno de estos en False ocultará el mezclador apropiado. "
|
||||
|
||||
# gui/game/options.rpy:203
|
||||
old "## A Google Play license key is required to perform in-app purchases. It can be found in the Google Play developer console, under \"Monetize\" > \"Monetization Setup\" > \"Licensing\"."
|
||||
new "## Se necesita una clave de licencia de Google Play para realizar compras dentro de la aplicación. Se puede encontrar en la consola de desarrollador de Google Play, en \"Monetizar\" > \"Configuración de la monetización\" > \"Licencias\"."
|
||||
|
||||
|
||||
@@ -654,8 +654,8 @@ translate spanish strings:
|
||||
new "## Presenta el diálogo en una 'vpgrid' o una 'vbox'."
|
||||
|
||||
# screens.rpy:1316
|
||||
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
|
||||
new "## Presenta el menú, si lo hay. El menú puede ser presentado incorrectamente si 'config.narrator_menu' está ajustado a 'True', como lo es más arriba."
|
||||
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True."
|
||||
new "## Presenta el menú, si lo hay. El menú puede ser presentado incorrectamente si 'config.narrator_menu' está ajustado a 'True'."
|
||||
|
||||
# screens.rpy:1346
|
||||
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
|
||||
@@ -680,4 +680,15 @@ translate spanish strings:
|
||||
# gui/game/screens.rpy:1049
|
||||
old "Opens the accessibility menu."
|
||||
new "Abre el menú de accesibilidad."
|
||||
|
||||
# gui/game/screens.rpy:1397
|
||||
old "## Bubble screen"
|
||||
new "## Pantalla de globos"
|
||||
|
||||
# gui/game/screens.rpy:1399
|
||||
old "## The Bubble screen is used to display dialogue to the player when using speech bubbles. The Bubble screen takes the same parameters as the say screen, must create a displayable with the id of \"what\", and can create displayables with the \"namebox\", \"who\", and \"window\" ids."
|
||||
new "## La pantalla globos se utiliza para mostrar el diálogo al jugador cuando se utilizan globos de dialogo. La pantalla de globos toma los mismos parámetros que la pantalla say, debe crear un displayable con el id de \"what\", y puede crear displayables con los ids de \"namebox\", \"who\", y \"window\"."
|
||||
|
||||
# gui/game/screens.rpy:1404
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#bubble"
|
||||
new "## https://www.renpy.org/doc/html/screen_special.html#bubble"
|
||||
|
||||
@@ -0,0 +1,921 @@
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# 00action_file.rpy:26
|
||||
old "{#weekday}Monday"
|
||||
new "{#weekday}Понеділок"
|
||||
|
||||
# 00action_file.rpy:26
|
||||
old "{#weekday}Tuesday"
|
||||
new "{#weekday}Вівторок"
|
||||
|
||||
# 00action_file.rpy:26
|
||||
old "{#weekday}Wednesday"
|
||||
new "{#weekday}Середа"
|
||||
|
||||
# 00action_file.rpy:26
|
||||
old "{#weekday}Thursday"
|
||||
new "{#weekday}Четвер"
|
||||
|
||||
# 00action_file.rpy:26
|
||||
old "{#weekday}Friday"
|
||||
new "{#weekday}П'ятниця"
|
||||
|
||||
# 00action_file.rpy:26
|
||||
old "{#weekday}Saturday"
|
||||
new "{#weekday}Субота"
|
||||
|
||||
# 00action_file.rpy:26
|
||||
old "{#weekday}Sunday"
|
||||
new "{#weekday}Неділя"
|
||||
|
||||
# 00action_file.rpy:37
|
||||
old "{#weekday_short}Mon"
|
||||
new "{#weekday_short}Пн"
|
||||
|
||||
# 00action_file.rpy:37
|
||||
old "{#weekday_short}Tue"
|
||||
new "{#weekday_short}Вт"
|
||||
|
||||
# 00action_file.rpy:37
|
||||
old "{#weekday_short}Wed"
|
||||
new "{#weekday_short}Ср"
|
||||
|
||||
# 00action_file.rpy:37
|
||||
old "{#weekday_short}Thu"
|
||||
new "{#weekday_short}Чт"
|
||||
|
||||
# 00action_file.rpy:37
|
||||
old "{#weekday_short}Fri"
|
||||
new "{#weekday_short}Пт"
|
||||
|
||||
# 00action_file.rpy:37
|
||||
old "{#weekday_short}Sat"
|
||||
new "{#weekday_short}Сб"
|
||||
|
||||
# 00action_file.rpy:37
|
||||
old "{#weekday_short}Sun"
|
||||
new "{#weekday_short}Нд"
|
||||
|
||||
# 00action_file.rpy:47
|
||||
old "{#month}January"
|
||||
new "{#month}Січня"
|
||||
|
||||
# 00action_file.rpy:47
|
||||
old "{#month}February"
|
||||
new "{#month}Лютого"
|
||||
|
||||
# 00action_file.rpy:47
|
||||
old "{#month}March"
|
||||
new "{#month}Березня"
|
||||
|
||||
# 00action_file.rpy:47
|
||||
old "{#month}April"
|
||||
new "{#month}Квітня"
|
||||
|
||||
# 00action_file.rpy:47
|
||||
old "{#month}May"
|
||||
new "{#month}Травня"
|
||||
|
||||
# 00action_file.rpy:47
|
||||
old "{#month}June"
|
||||
new "{#month}Червня"
|
||||
|
||||
# 00action_file.rpy:47
|
||||
old "{#month}July"
|
||||
new "{#month}Липня"
|
||||
|
||||
# 00action_file.rpy:47
|
||||
old "{#month}August"
|
||||
new "{#month}Серпня"
|
||||
|
||||
# 00action_file.rpy:47
|
||||
old "{#month}September"
|
||||
new "{#month}Вересня"
|
||||
|
||||
# 00action_file.rpy:47
|
||||
old "{#month}October"
|
||||
new "{#month}Жовтня"
|
||||
|
||||
# 00action_file.rpy:47
|
||||
old "{#month}November"
|
||||
new "{#month}Листопада"
|
||||
|
||||
# 00action_file.rpy:47
|
||||
old "{#month}December"
|
||||
new "{#month}Грудня"
|
||||
|
||||
# 00action_file.rpy:63
|
||||
old "{#month_short}Jan"
|
||||
new "{#month_short}Січ"
|
||||
|
||||
# 00action_file.rpy:63
|
||||
old "{#month_short}Feb"
|
||||
new "{#month_short}Лют"
|
||||
|
||||
# 00action_file.rpy:63
|
||||
old "{#month_short}Mar"
|
||||
new "{#month_short}Бер"
|
||||
|
||||
# 00action_file.rpy:63
|
||||
old "{#month_short}Apr"
|
||||
new "{#month_short}Кві"
|
||||
|
||||
# 00action_file.rpy:63
|
||||
old "{#month_short}May"
|
||||
new "{#month_short}Тра"
|
||||
|
||||
# 00action_file.rpy:63
|
||||
old "{#month_short}Jun"
|
||||
new "{#month_short}Чер"
|
||||
|
||||
# 00action_file.rpy:63
|
||||
old "{#month_short}Jul"
|
||||
new "{#month_short}Лип"
|
||||
|
||||
# 00action_file.rpy:63
|
||||
old "{#month_short}Aug"
|
||||
new "{#month_short}Сер"
|
||||
|
||||
# 00action_file.rpy:63
|
||||
old "{#month_short}Sep"
|
||||
new "{#month_short}Вер"
|
||||
|
||||
# 00action_file.rpy:63
|
||||
old "{#month_short}Oct"
|
||||
new "{#month_short}Жов"
|
||||
|
||||
# 00action_file.rpy:63
|
||||
old "{#month_short}Nov"
|
||||
new "{#month_short}Лис"
|
||||
|
||||
# 00action_file.rpy:63
|
||||
old "{#month_short}Dec"
|
||||
new "{#month_short}Гру"
|
||||
|
||||
# 00action_file.rpy:240
|
||||
old "%b %d, %H:%M"
|
||||
new "%d %b, %H:%M"
|
||||
|
||||
# 00action_file.rpy:353
|
||||
old "Save slot %s: [text]"
|
||||
new "Слот збереження %s: [text]"
|
||||
|
||||
# 00action_file.rpy:434
|
||||
old "Load slot %s: [text]"
|
||||
new "Слот завантаження %s: [text]"
|
||||
|
||||
# 00action_file.rpy:487
|
||||
old "Delete slot [text]"
|
||||
new "Видалити слот [text]"
|
||||
|
||||
# 00action_file.rpy:569
|
||||
old "File page auto"
|
||||
new "Автозбереження"
|
||||
|
||||
# 00action_file.rpy:571
|
||||
old "File page quick"
|
||||
new "Швидкі збереження"
|
||||
|
||||
# 00action_file.rpy:573
|
||||
old "File page [text]"
|
||||
new "Сторінка збережень [text]"
|
||||
|
||||
# 00action_file.rpy:763
|
||||
old "Next file page."
|
||||
new "Наступна сторінка збережень."
|
||||
|
||||
# 00action_file.rpy:827
|
||||
old "Previous file page."
|
||||
new "Минула сторінка збережень"
|
||||
|
||||
# 00action_file.rpy:888
|
||||
old "Quick save complete."
|
||||
new "Швидке збереження завершено."
|
||||
|
||||
# 00action_file.rpy:906
|
||||
old "Quick save."
|
||||
new "Швидке збереження."
|
||||
|
||||
# 00action_file.rpy:925
|
||||
old "Quick load."
|
||||
new "Швидке завантаження."
|
||||
|
||||
# 00action_other.rpy:355
|
||||
old "Language [text]"
|
||||
new "Мова [text]"
|
||||
|
||||
# 00director.rpy:708
|
||||
old "The interactive director is not enabled here."
|
||||
new "Інтерактивний директор недоступний."
|
||||
|
||||
# 00director.rpy:1481
|
||||
old "⬆"
|
||||
new "⬆"
|
||||
|
||||
# 00director.rpy:1487
|
||||
old "⬇"
|
||||
new "⬇"
|
||||
|
||||
# 00director.rpy:1551
|
||||
old "Done"
|
||||
new "Прийняти"
|
||||
|
||||
# 00director.rpy:1561
|
||||
old "(statement)"
|
||||
new "(функція)"
|
||||
|
||||
# 00director.rpy:1562
|
||||
old "(tag)"
|
||||
new "(тег)"
|
||||
|
||||
# 00director.rpy:1563
|
||||
old "(attributes)"
|
||||
new "(атрибут)"
|
||||
|
||||
# 00director.rpy:1564
|
||||
old "(transform)"
|
||||
new "(трансформація)"
|
||||
|
||||
# 00director.rpy:1589
|
||||
old "(transition)"
|
||||
new "(перехід)"
|
||||
|
||||
# 00director.rpy:1601
|
||||
old "(channel)"
|
||||
new "(канал)"
|
||||
|
||||
# 00director.rpy:1602
|
||||
old "(filename)"
|
||||
new "(ім'я файла)"
|
||||
|
||||
# 00director.rpy:1631
|
||||
old "Change"
|
||||
new "Змінити"
|
||||
|
||||
# 00director.rpy:1633
|
||||
old "Add"
|
||||
new "Додати"
|
||||
|
||||
# 00director.rpy:1636
|
||||
old "Cancel"
|
||||
new "Скасувати"
|
||||
|
||||
# 00director.rpy:1639
|
||||
old "Remove"
|
||||
new "Видалити"
|
||||
|
||||
# 00director.rpy:1674
|
||||
old "Statement:"
|
||||
new "Функції:"
|
||||
|
||||
# 00director.rpy:1695
|
||||
old "Tag:"
|
||||
new "Теги:"
|
||||
|
||||
# 00director.rpy:1711
|
||||
old "Attributes:"
|
||||
new "Атрибут:"
|
||||
|
||||
# 00director.rpy:1729
|
||||
old "Transforms:"
|
||||
new "Трансформації:"
|
||||
|
||||
# 00director.rpy:1748
|
||||
old "Behind:"
|
||||
new "Позаду:"
|
||||
|
||||
# 00director.rpy:1767
|
||||
old "Transition:"
|
||||
new "Переходи:"
|
||||
|
||||
# 00director.rpy:1785
|
||||
old "Channel:"
|
||||
new "Канали:"
|
||||
|
||||
# 00director.rpy:1803
|
||||
old "Audio Filename:"
|
||||
new "Ім'я файла:"
|
||||
|
||||
# 00gui.rpy:370
|
||||
old "Are you sure?"
|
||||
new "Ви впевнені?"
|
||||
|
||||
# 00gui.rpy:371
|
||||
old "Are you sure you want to delete this save?"
|
||||
new "Ви впевнені що хочете видалити це збереження?"
|
||||
|
||||
# 00gui.rpy:372
|
||||
old "Are you sure you want to overwrite your save?"
|
||||
new "Ви впевнені що хочете перезаписати ваше збереження?"
|
||||
|
||||
# 00gui.rpy:373
|
||||
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
|
||||
new "Завантаження гри приведе до втрати незбереженого прогресу.\nВи впевнені що хочете це зробити?"
|
||||
|
||||
# 00gui.rpy:374
|
||||
old "Are you sure you want to quit?"
|
||||
new "Ви впевнені що бажаєте вийти?"
|
||||
|
||||
# 00gui.rpy:375
|
||||
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
|
||||
new "Ви впевнені, що хочете повернутися до головного меню?\nЦе призведе до втрати незбереженого прогресу."
|
||||
|
||||
# 00gui.rpy:376
|
||||
old "Are you sure you want to end the replay?"
|
||||
new "Ви впевнені, що хочете завершити повтор?"
|
||||
|
||||
# 00gui.rpy:377
|
||||
old "Are you sure you want to begin skipping?"
|
||||
new "Ви впевнені, що бажаєте пропустити?"
|
||||
|
||||
# 00gui.rpy:378
|
||||
old "Are you sure you want to skip to the next choice?"
|
||||
new "Ви точно хочете пропустити все до наступного вибору?"
|
||||
|
||||
# 00gui.rpy:379
|
||||
old "Are you sure you want to skip unseen dialogue to the next choice?"
|
||||
new "Ви впевнені, що хочете пропустити непрочитані діалоги до наступного вибору?"
|
||||
|
||||
# 00keymap.rpy:258
|
||||
old "Failed to save screenshot as %s."
|
||||
new "Провалено спробу зберегти скріншот як %s."
|
||||
|
||||
# 00keymap.rpy:270
|
||||
old "Saved screenshot as %s."
|
||||
new "Скріншот збережений як %s."
|
||||
|
||||
# 00library.rpy:146
|
||||
old "Self-voicing disabled."
|
||||
new "Синтезатор мови вимкнено."
|
||||
|
||||
# 00library.rpy:147
|
||||
old "Clipboard voicing enabled. "
|
||||
new "Озвучення буфера обміну включено."
|
||||
|
||||
# 00library.rpy:148
|
||||
old "Self-voicing enabled. "
|
||||
new "Синтезатор мови включений."
|
||||
|
||||
# 00library.rpy:150
|
||||
old "bar"
|
||||
new "Смуга налаштування"
|
||||
|
||||
# 00library.rpy:151
|
||||
old "selected"
|
||||
new "вибрано"
|
||||
|
||||
# 00library.rpy:152
|
||||
old "viewport"
|
||||
new "порт перегляду"
|
||||
|
||||
# 00library.rpy:153
|
||||
old "horizontal scroll"
|
||||
new "горизонтальна смуга прокручування"
|
||||
|
||||
# 00library.rpy:154
|
||||
old "vertical scroll"
|
||||
new "вертикальна смуга прокручування"
|
||||
|
||||
# 00library.rpy:155
|
||||
old "activate"
|
||||
new "елемент активовано"
|
||||
|
||||
# 00library.rpy:156
|
||||
old "deactivate"
|
||||
new "елемент деактивовано"
|
||||
|
||||
# 00library.rpy:157
|
||||
old "increase"
|
||||
new "більше"
|
||||
|
||||
# 00library.rpy:158
|
||||
old "decrease"
|
||||
new "менше"
|
||||
|
||||
# 00library.rpy:193
|
||||
old "Skip Mode"
|
||||
new "Режим Пропуску"
|
||||
|
||||
# 00library.rpy:279
|
||||
old "This program contains free software under a number of licenses, including the MIT License and GNU Lesser General Public License. A complete list of software, including links to full source code, can be found {a=https://www.renpy.org/l/license}here{/a}."
|
||||
new "Ця програма містить вільне та відкрите програмне забезпечення під кількома ліцензіями, включаючи ліцензію MIT та GNU Lesser General Public. Повний список ліцензій, враховуючи посилання на повний вихідний код, можна знайти {a=https://www.renpy.org/l/license}тут{/a}."
|
||||
|
||||
# 00preferences.rpy:207
|
||||
old "display"
|
||||
new "режим екрана"
|
||||
|
||||
# 00preferences.rpy:219
|
||||
old "transitions"
|
||||
new "переходи"
|
||||
|
||||
# 00preferences.rpy:228
|
||||
old "skip transitions"
|
||||
new "пропустити переходи"
|
||||
|
||||
# 00preferences.rpy:230
|
||||
old "video sprites"
|
||||
new "відео-спрайти"
|
||||
|
||||
# 00preferences.rpy:239
|
||||
old "show empty window"
|
||||
new "показувати порожнє вікно діалогу"
|
||||
|
||||
# 00preferences.rpy:248
|
||||
old "text speed"
|
||||
new "швидкість тексту"
|
||||
|
||||
# 00preferences.rpy:256
|
||||
old "joystick"
|
||||
new "джойстик"
|
||||
|
||||
# 00preferences.rpy:256
|
||||
old "joystick..."
|
||||
new "джойстик..."
|
||||
|
||||
# 00preferences.rpy:263
|
||||
old "skip"
|
||||
new "пропустити"
|
||||
|
||||
# 00preferences.rpy:266
|
||||
old "skip unseen [text]"
|
||||
new "пропустити весь [text]"
|
||||
|
||||
# 00preferences.rpy:271
|
||||
old "skip unseen text"
|
||||
new "пропускати весь текст"
|
||||
|
||||
# 00preferences.rpy:273
|
||||
old "begin skipping"
|
||||
new "почати пропуск"
|
||||
|
||||
# 00preferences.rpy:277
|
||||
old "after choices"
|
||||
new "після виборів"
|
||||
|
||||
# 00preferences.rpy:284
|
||||
old "skip after choices"
|
||||
new "пропускати після виборів"
|
||||
|
||||
# 00preferences.rpy:286
|
||||
old "auto-forward time"
|
||||
new "швидкість авточитання"
|
||||
|
||||
# 00preferences.rpy:300
|
||||
old "auto-forward"
|
||||
new "авточитання"
|
||||
|
||||
# 00preferences.rpy:307
|
||||
old "Auto forward"
|
||||
new "Авточитання"
|
||||
|
||||
# 00preferences.rpy:310
|
||||
old "auto-forward after click"
|
||||
new "продовжувати авточитання після кліку"
|
||||
|
||||
# 00preferences.rpy:319
|
||||
old "automatic move"
|
||||
new "автоматично пересувати мишу до кнопки" ###
|
||||
|
||||
# 00preferences.rpy:328
|
||||
old "wait for voice"
|
||||
new "чекати голос"
|
||||
|
||||
# 00preferences.rpy:337
|
||||
old "voice sustain"
|
||||
new "не зупиняти голос"
|
||||
|
||||
# 00preferences.rpy:346
|
||||
old "self voicing"
|
||||
new "озвучка через синтезатор мови"
|
||||
|
||||
# 00preferences.rpy:355
|
||||
old "clipboard voicing"
|
||||
new "синтез мови з буфера обміну"
|
||||
|
||||
# 00preferences.rpy:364
|
||||
old "debug voicing"
|
||||
new "режим дебагу синтезу мови"
|
||||
|
||||
# 00preferences.rpy:373
|
||||
old "emphasize audio"
|
||||
new "посилити гучність заздалегідь заданих звукових каналів рахунок приглушення інших каналів"
|
||||
|
||||
# 00preferences.rpy:382
|
||||
old "rollback side"
|
||||
new "сторона відкату"
|
||||
|
||||
# 00preferences.rpy:392
|
||||
old "gl powersave"
|
||||
new "налаштування графіки. Економія енергії"
|
||||
|
||||
# 00preferences.rpy:398
|
||||
old "gl framerate"
|
||||
new "налаштування графіки. Частота кадрів"
|
||||
|
||||
# 00preferences.rpy:401
|
||||
old "gl tearing"
|
||||
new "налаштування графіки. Розривання кадрів"
|
||||
|
||||
# 00preferences.rpy:413
|
||||
old "music volume"
|
||||
new "гучність музики"
|
||||
|
||||
# 00preferences.rpy:414
|
||||
old "sound volume"
|
||||
new "гучність звуків"
|
||||
|
||||
# 00preferences.rpy:415
|
||||
old "voice volume"
|
||||
new "гучність голосу"
|
||||
|
||||
# 00preferences.rpy:416
|
||||
old "mute music"
|
||||
new "без музики"
|
||||
|
||||
# 00preferences.rpy:417
|
||||
old "mute sound"
|
||||
new "без звуків"
|
||||
|
||||
# 00preferences.rpy:418
|
||||
old "mute voice"
|
||||
new "без голосу"
|
||||
|
||||
# 00preferences.rpy:419
|
||||
old "mute all"
|
||||
new "режим без звуку"
|
||||
|
||||
# 00preferences.rpy:500
|
||||
old "Clipboard voicing enabled. Press 'shift+C' to disable."
|
||||
new "Озвучення буфера обміну увімкнено. Натисніть 'shift+C', щоб вимкнути це."
|
||||
|
||||
# 00preferences.rpy:502
|
||||
old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
|
||||
new "Синтезатор мови повинен сказати \"[renpy.display.tts.last]\". Натисніть 'alt+shift+V', щоб відключити його."
|
||||
|
||||
# 00preferences.rpy:504
|
||||
old "Self-voicing enabled. Press 'v' to disable."
|
||||
new "Синтезатор мови включено. Натисніть 'v', щоб вимкнути його."
|
||||
|
||||
# _compat\gamemenu.rpym:198
|
||||
old "Empty Slot."
|
||||
new "Порожній слот"
|
||||
|
||||
# _compat\gamemenu.rpym:355
|
||||
old "Previous"
|
||||
new "Назад"
|
||||
|
||||
# _compat\gamemenu.rpym:362
|
||||
old "Next"
|
||||
new "Далі"
|
||||
|
||||
# _compat\preferences.rpym:428
|
||||
old "Joystick Mapping"
|
||||
new "Розкладка джойстика"
|
||||
|
||||
# _developer\developer.rpym:38
|
||||
old "Developer Menu"
|
||||
new "Меню розробника"
|
||||
|
||||
# _developer\developer.rpym:43
|
||||
old "Interactive Director (D)"
|
||||
new "Інтерактивний Директор (D)"
|
||||
|
||||
# _developer\developer.rpym:45
|
||||
old "Reload Game (Shift+R)"
|
||||
new "Перезавантажити гру (Shift+R)"
|
||||
|
||||
# _developer\developer.rpym:47
|
||||
old "Console (Shift+O)"
|
||||
new "Консоль (Shift+O)"
|
||||
|
||||
# _developer\developer.rpym:49
|
||||
old "Variable Viewer"
|
||||
new "Перегляд змінних"
|
||||
|
||||
# _developer\developer.rpym:51
|
||||
old "Image Location Picker"
|
||||
new "Інструмент позиціонування на зображеннях"
|
||||
|
||||
# _developer\developer.rpym:53
|
||||
old "Filename List"
|
||||
new "Список файлів"
|
||||
|
||||
# _developer\developer.rpym:57
|
||||
old "Show Image Load Log (F4)"
|
||||
new "Показати лог завантаження зображень (F4)"
|
||||
|
||||
# _developer\developer.rpym:60
|
||||
old "Hide Image Load Log (F4)"
|
||||
new "Скрыть лог загрузки изображений (F4)"
|
||||
|
||||
# _developer\developer.rpym:63
|
||||
old "Image Attributes"
|
||||
new "Атрибути зображення"
|
||||
|
||||
# _developer\developer.rpym:90
|
||||
old "[name] [attributes] (hidden)"
|
||||
new "[name] [attributes] (приховано)"
|
||||
|
||||
# _developer\developer.rpym:94
|
||||
old "[name] [attributes]"
|
||||
new "[name] [attributes]"
|
||||
|
||||
# _developer\developer.rpym:137
|
||||
old "Nothing to inspect."
|
||||
new "Змінні не задано."
|
||||
|
||||
# _developer\developer.rpym:265
|
||||
old "Return to the developer menu"
|
||||
new "Повернутися до меню розробника"
|
||||
|
||||
# _developer\developer.rpym:425
|
||||
old "Rectangle: %r"
|
||||
new "Прямокутник: %r"
|
||||
|
||||
# _developer\developer.rpym:430
|
||||
old "Mouse position: %r"
|
||||
new "Позиція миші: %r"
|
||||
|
||||
# _developer\developer.rpym:435
|
||||
old "Right-click or escape to quit."
|
||||
new "Натисніть праву кнопку миші або ESC, щоб вийти."
|
||||
|
||||
# _developer\developer.rpym:467
|
||||
old "Rectangle copied to clipboard."
|
||||
new "Координати прямокутника скопійовані в буфер обміну."
|
||||
|
||||
# _developer\developer.rpym:470
|
||||
old "Position copied to clipboard."
|
||||
new "Координати позиції скопійовані у буфер обміну."
|
||||
|
||||
# _developer\developer.rpym:489
|
||||
old "Type to filter: "
|
||||
new "Поточний фільтр: "
|
||||
|
||||
# _developer\developer.rpym:617
|
||||
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
|
||||
new "Текстур: [tex_count] ([tex_size_mb:.1f] МБ)"
|
||||
|
||||
# _developer\developer.rpym:621
|
||||
old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
|
||||
new "Кеш зображень: [cache_pct:.1f]% ([cache_size_mb:.1f] МБ)"
|
||||
|
||||
# _developer\developer.rpym:631
|
||||
old "✔ "
|
||||
new "✔ "
|
||||
|
||||
# _developer\developer.rpym:634
|
||||
old "✘ "
|
||||
new "✘ "
|
||||
|
||||
# _developer\developer.rpym:639
|
||||
old "\n{color=#cfc}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}"
|
||||
new "\n{color=#cfc}✔ передбачене зображення (добре){/color}\n{color=#fcc}✘ раптове зображення (погано){/color}\n{color=#fff}Натисніть, щоб пересунути.{/color}"
|
||||
|
||||
# _developer\inspector.rpym:38
|
||||
old "Displayable Inspector"
|
||||
new "Диспетчер об'єктів"
|
||||
|
||||
# _developer\inspector.rpym:61
|
||||
old "Size"
|
||||
new "Розмір"
|
||||
|
||||
# _developer\inspector.rpym:65
|
||||
old "Style"
|
||||
new "Стиль"
|
||||
|
||||
# _developer\inspector.rpym:71
|
||||
old "Location"
|
||||
new "Розташування"
|
||||
|
||||
# _developer\inspector.rpym:122
|
||||
old "Inspecting Styles of [displayable_name!q]"
|
||||
new "Інспектую стилі [displayable_name!q]"
|
||||
|
||||
# _developer\inspector.rpym:139
|
||||
old "displayable:"
|
||||
new "об'єкт:"
|
||||
|
||||
# _developer\inspector.rpym:145
|
||||
old " (no properties affect the displayable)"
|
||||
new " (на об'єкт не впливають жодні параметри)"
|
||||
|
||||
# _developer\inspector.rpym:147
|
||||
old " (default properties omitted)"
|
||||
new " (налаштування за замовчуванням опущено)"
|
||||
|
||||
# _developer\inspector.rpym:185
|
||||
old "<repr() failed>"
|
||||
new "<repr() провалений>"
|
||||
|
||||
# _layout\classic_load_save.rpym:170
|
||||
old "a"
|
||||
new "а"
|
||||
|
||||
# _layout\classic_load_save.rpym:179
|
||||
old "q"
|
||||
new "ш"
|
||||
|
||||
# 00iap.rpy:217
|
||||
old "Contacting App Store\nPlease Wait..."
|
||||
new "Зв'язуюсь з App Store\nБудь ласка, чекайте..."
|
||||
|
||||
# 00updater.rpy:375
|
||||
old "The Ren'Py Updater is not supported on mobile devices."
|
||||
new "Ren'Py Updater не підтримується на мобільних пристроях."
|
||||
|
||||
# 00updater.rpy:494
|
||||
old "An error is being simulated."
|
||||
new "Симулюється помилка."
|
||||
|
||||
# 00updater.rpy:678
|
||||
old "Either this project does not support updating, or the update status file was deleted."
|
||||
new "Або цей проект не підтримує оновлення, або видалено файл статусу оновлення."
|
||||
|
||||
# 00updater.rpy:692
|
||||
old "This account does not have permission to perform an update."
|
||||
new "Цей обліковий запис не має права проводити оновлення."
|
||||
|
||||
# 00updater.rpy:695
|
||||
old "This account does not have permission to write the update log."
|
||||
new "Цей обліковий запис не має права писати лог оновлення."
|
||||
|
||||
# 00updater.rpy:722
|
||||
old "Could not verify update signature."
|
||||
new "Не можу верифікувати підпис оновлення."
|
||||
|
||||
# 00updater.rpy:997
|
||||
old "The update file was not downloaded."
|
||||
new "Файл поновлення не був завантажений."
|
||||
|
||||
# 00updater.rpy:1015
|
||||
old "The update file does not have the correct digest - it may have been corrupted."
|
||||
new "Файл поновлення не містить коректного дайджесту — він може бути пошкоджений."
|
||||
|
||||
# 00updater.rpy:1071
|
||||
old "While unpacking {}, unknown type {}."
|
||||
new "При розпаковуванні {} виявлено невідомий тип {}."
|
||||
|
||||
# 00updater.rpy:1439
|
||||
old "Updater"
|
||||
new "Оновлення"
|
||||
|
||||
# 00updater.rpy:1450
|
||||
old "This program is up to date."
|
||||
new "Ця програма оновлена."
|
||||
|
||||
# 00updater.rpy:1452
|
||||
old "[u.version] is available. Do you want to install it?"
|
||||
new "[u.version] доступна. Ви бажаєте її встановити?"
|
||||
|
||||
# 00updater.rpy:1454
|
||||
old "Preparing to download the updates."
|
||||
new "Підготовка до завантаження оновлень."
|
||||
|
||||
# 00updater.rpy:1456
|
||||
old "Downloading the updates."
|
||||
new "Завантаження оновлень."
|
||||
|
||||
# 00updater.rpy:1458
|
||||
old "Unpacking the updates."
|
||||
new "Розпакування оновлень."
|
||||
|
||||
# 00updater.rpy:1462
|
||||
old "The updates have been installed. The program will restart."
|
||||
new "Оновлення встановлено. Програма буде перезапущена."
|
||||
|
||||
# 00updater.rpy:1464
|
||||
old "The updates have been installed."
|
||||
new "Оновлення було встановлено."
|
||||
|
||||
# 00updater.rpy:1466
|
||||
old "The updates were cancelled."
|
||||
new "Оновлення було скасовано."
|
||||
|
||||
# 00gallery.rpy:585
|
||||
old "Image [index] of [count] locked."
|
||||
new "Зображення [index] із [count] заблоковано."
|
||||
|
||||
# 00gallery.rpy:605
|
||||
old "prev"
|
||||
new "мин"
|
||||
|
||||
# 00gallery.rpy:606
|
||||
old "next"
|
||||
new "наст"
|
||||
|
||||
# 00gallery.rpy:607
|
||||
old "slideshow"
|
||||
new "слайд-шоу"
|
||||
|
||||
# 00gallery.rpy:608
|
||||
old "return"
|
||||
new "повернутися"
|
||||
|
||||
# _developer\developer.rpym:154
|
||||
old "Hide deleted"
|
||||
new "Сховати видалені"
|
||||
|
||||
# _developer\developer.rpym:154
|
||||
old "Show deleted"
|
||||
new "Показати видалені"
|
||||
|
||||
# 00accessibility.rpy:76
|
||||
old "Font Override"
|
||||
new "Перевизначення шрифту"
|
||||
|
||||
# 00accessibility.rpy:80
|
||||
old "Default"
|
||||
new "За замовчуванням"
|
||||
|
||||
# 00accessibility.rpy:84
|
||||
old "DejaVu Sans"
|
||||
new "DejaVu Sans"
|
||||
|
||||
# 00accessibility.rpy:88
|
||||
old "Opendyslexic"
|
||||
new "Opendyslexic"
|
||||
|
||||
# 00accessibility.rpy:94
|
||||
old "Text Size Scaling"
|
||||
new "Масштабування розміру тексту"
|
||||
|
||||
# 00accessibility.rpy:100
|
||||
old "Reset"
|
||||
new "Скинути"
|
||||
|
||||
# 00accessibility.rpy:105
|
||||
old "Line Spacing Scaling"
|
||||
new "Масштабування міжрядкового інтервалу"
|
||||
|
||||
# 00accessibility.rpy:117
|
||||
old "Self-Voicing"
|
||||
new "Озвучка через синтезатор мовлення"
|
||||
|
||||
# 00accessibility.rpy:121
|
||||
old "Off"
|
||||
new "Вимкнути"
|
||||
|
||||
# 00accessibility.rpy:125
|
||||
old "Text-to-speech"
|
||||
new "Перетворення тексту на мовлення"
|
||||
|
||||
# 00accessibility.rpy:129
|
||||
old "Clipboard"
|
||||
new "З буфера обміну"
|
||||
|
||||
# 00preferences.rpy:430
|
||||
old "font transform"
|
||||
new "перетворення шрифту"
|
||||
|
||||
# 00preferences.rpy:433
|
||||
old "font size"
|
||||
new "розмір шрифту"
|
||||
|
||||
# 00preferences.rpy:441
|
||||
old "font line spacing"
|
||||
new "міжрядковий інтервал"
|
||||
|
||||
# renpy/common/00accessibility.rpy:191
|
||||
old "The options on this menu are intended to improve accessibility. They may not work with all games, and some combinations of options may render the game unplayable. This is not an issue with the game or engine. For the best results when changing fonts, try to keep the text size the same as it originally was."
|
||||
new "Установки цього меню призначені для збільшення доступності. Вони можуть працювати не з усіма іграми, а деякі комбінації опцій можуть зробити гру, що відображається некоректно. Це не проблема з грою чи движком. Для досягнення найкращих результатів при зміні шрифтів намагайтеся зберігати розмір тексту таким, яким він був спочатку."
|
||||
# renpy/common/00accessibility.rpy:193
|
||||
old "Self-Voicing Volume Drop"
|
||||
new "Зменшення гучності при озвученні через синтезатор мовлення"
|
||||
|
||||
# renpy/common/00preferences.rpy:384
|
||||
old "self voicing volume drop"
|
||||
new "зменшення гучності при озвученні через синтезатор мовлення"
|
||||
|
||||
# renpy/common/00preferences.rpy:464
|
||||
old "system cursor"
|
||||
new "системний курсор"
|
||||
|
||||
# renpy/common/00accessibility.rpy:180
|
||||
old "High Contrast Text"
|
||||
new "Висококонтрастний текст"
|
||||
|
||||
# renpy/common/00preferences.rpy:487
|
||||
old "renderer menu"
|
||||
new "меню рендерера"
|
||||
|
||||
# renpy/common/00preferences.rpy:490
|
||||
old "accessibility menu"
|
||||
new "меню спеціальних можливостей"
|
||||
|
||||
# renpy/common/00preferences.rpy:493
|
||||
old "high contrast text"
|
||||
new "висококонтрастний текст"
|
||||
|
||||
# renpy/common/00preferences.rpy:511
|
||||
old "audio when minimized"
|
||||
new "звук при згортанні вікна"
|
||||
|
||||
# renpy/common/00preferences.rpy:531
|
||||
old "main volume"
|
||||
new "загальна гучність"
|
||||
|
||||
# renpy/common/00preferences.rpy:535
|
||||
old "mute main"
|
||||
new "режим без звуку"
|
||||
@@ -0,0 +1,90 @@
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# 00console.rpy:255
|
||||
old "Press <esc> to exit console. Type help for help.\n"
|
||||
new "Натисніть <esc>, щоб вийти із консолі. Введіть <help> для допомоги.\n"
|
||||
|
||||
# 00console.rpy:259
|
||||
old "Ren'Py script enabled."
|
||||
new "Ren'Py script активовано."
|
||||
|
||||
# 00console.rpy:261
|
||||
old "Ren'Py script disabled."
|
||||
new "Ren'Py script деактивовано."
|
||||
|
||||
# 00console.rpy:496
|
||||
old "help: show this help"
|
||||
new "help: показує допомогу"
|
||||
|
||||
# 00console.rpy:501
|
||||
old "commands:\n"
|
||||
new "команди:\n"
|
||||
|
||||
# 00console.rpy:511
|
||||
old " <renpy script statement>: run the statement\n"
|
||||
new " <оператор renpy script>: запуск оператора\n"
|
||||
|
||||
# 00console.rpy:513
|
||||
old " <python expression or statement>: run the expression or statement"
|
||||
new " <вираз або оператор python>: запустити вираз або оператор"
|
||||
|
||||
# 00console.rpy:521
|
||||
old "clear: clear the console history"
|
||||
new "clear: очищення історії консолі"
|
||||
|
||||
# 00console.rpy:525
|
||||
old "exit: exit the console"
|
||||
new "exit: вихід із консолі"
|
||||
|
||||
# 00console.rpy:533
|
||||
old "load <slot>: loads the game from slot"
|
||||
new "load <слот>: завантажує гру з вибраного слота"
|
||||
|
||||
# 00console.rpy:546
|
||||
old "save <slot>: saves the game in slot"
|
||||
new "save <слот>: зберігає гру у вибраний слот"
|
||||
|
||||
# 00console.rpy:557
|
||||
old "reload: reloads the game, refreshing the scripts"
|
||||
new "reload: перезавантажує гру, оновлює скрипти"
|
||||
|
||||
# 00console.rpy:565
|
||||
old "watch <expression>: watch a python expression"
|
||||
new "watch <вираз>: спостерігати за виразом python"
|
||||
|
||||
# 00console.rpy:591
|
||||
old "unwatch <expression>: stop watching an expression"
|
||||
new "unwatch <вираз>: припинити спостерігати за виразом"
|
||||
|
||||
# 00console.rpy:622
|
||||
old "unwatchall: stop watching all expressions"
|
||||
new "unwatchall: глобальне припинення спостереження"
|
||||
|
||||
# 00console.rpy:639
|
||||
old "jump <label>: jumps to label"
|
||||
new "jump <мітка>: стрибок на мітку"
|
||||
|
||||
# 00console.rpy:685
|
||||
old "short: Shorten the representation of objects on the console (default)."
|
||||
new "short: Скорочене представлення об'єктів (repr) у консолі (за замовчуванням)."
|
||||
|
||||
# 00console.rpy:690
|
||||
old "long: Print the full representation of objects on the console."
|
||||
new "long: Виводити повне уявлення об'єктів (repr) у консолі."
|
||||
|
||||
# renpy/common/00console.rpy:814
|
||||
old "watch <expression>: watch a python expression\n watch short: makes the representation of traced expressions short (default)\n watch long: makes the representation of traced expressions as is"
|
||||
new "watch <вираз>: спостерігати за виразом python\n watch short: вкорочує відображення виразів, що відстежуються (за замовчуванням)\n watch long: робить відображення відстежуваних виразів як є"
|
||||
|
||||
# renpy/common/00console.rpy:925
|
||||
old "escape: Enables escaping of unicode symbols in unicode strings."
|
||||
new "escape: Включає екранування Unicode символів у рядках unicode."
|
||||
|
||||
# renpy/common/00console.rpy:929
|
||||
old "unescape: Disables escaping of unicode symbols in unicode strings and print it as is (default)."
|
||||
new "unescape: Вимикає екранування Unicode символів у рядках unicode та виводить їх як є (за замовчуванням)."
|
||||
|
||||
# renpy/common/00console.rpy:784
|
||||
old "stack: print the return stack"
|
||||
new "stack: виводить стек повернення (return stack)"
|
||||
@@ -0,0 +1,286 @@
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# 00gltest.rpy:70
|
||||
old "Renderer"
|
||||
new "Рендер"
|
||||
|
||||
# 00gltest.rpy:74
|
||||
old "Automatically Choose"
|
||||
new "Вибирати Автоматично"
|
||||
|
||||
# 00gltest.rpy:79
|
||||
old "Force Angle/DirectX Renderer"
|
||||
new "Примусовий Angle/DirectX"
|
||||
|
||||
# 00gltest.rpy:83
|
||||
old "Force OpenGL Renderer"
|
||||
new "Примусовий OpenGL"
|
||||
|
||||
# 00gltest.rpy:87
|
||||
old "Force Software Renderer"
|
||||
new "Примусовий Програмний"
|
||||
|
||||
# 00gltest.rpy:93
|
||||
old "NPOT"
|
||||
new "NPOT (OpenGL 2+)"
|
||||
|
||||
# 00gltest.rpy:97
|
||||
old "Enable"
|
||||
new "Активовано"
|
||||
|
||||
# 00gltest.rpy:131
|
||||
old "Powersave"
|
||||
new "Економія енергії"
|
||||
|
||||
# 00gltest.rpy:145
|
||||
old "Framerate"
|
||||
new "Частота кадрів"
|
||||
|
||||
# 00gltest.rpy:149
|
||||
old "Screen"
|
||||
new "Екран"
|
||||
|
||||
# 00gltest.rpy:153
|
||||
old "60"
|
||||
new "60"
|
||||
|
||||
# 00gltest.rpy:157
|
||||
old "30"
|
||||
new "30"
|
||||
|
||||
# 00gltest.rpy:163
|
||||
old "Tearing"
|
||||
new "Розривання кадрів"
|
||||
|
||||
# 00gltest.rpy:179
|
||||
old "Changes will take effect the next time this program is run."
|
||||
new "Зміни набудуть чинності під час наступного запуску програми."
|
||||
|
||||
# 00gltest.rpy:213
|
||||
old "Performance Warning"
|
||||
new "Попередження Продуктивності"
|
||||
|
||||
# 00gltest.rpy:218
|
||||
old "This computer is using software rendering."
|
||||
new "Цей комп'ютер використовує програмний рендеринг."
|
||||
|
||||
# 00gltest.rpy:220
|
||||
old "This computer is not using shaders."
|
||||
new "Цей комп'ютер не використовує шейдерів."
|
||||
|
||||
# 00gltest.rpy:222
|
||||
old "This computer is displaying graphics slowly."
|
||||
new "Цей комп'ютер повільно відображає графіку."
|
||||
|
||||
# 00gltest.rpy:224
|
||||
old "This computer has a problem displaying graphics: [problem]."
|
||||
new "Цей комп'ютер має проблему з відображенням графіки: [problem]"
|
||||
|
||||
# 00gltest.rpy:229
|
||||
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display. Updating DirectX could fix this problem."
|
||||
new "Графічні драйвера застаріли чи працюють неправильно. Це може призвести до повільного або неправильного відображення графіки. Оновлення DirectX може вирішити цю проблему."
|
||||
|
||||
# 00gltest.rpy:231
|
||||
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display."
|
||||
new "Графічні драйвера застаріли чи працюють неправильно. Це може призвести до повільного або неправильного відображення графіки."
|
||||
|
||||
# 00gltest.rpy:236
|
||||
old "Update DirectX"
|
||||
new "Оновити DirectX"
|
||||
|
||||
# 00gltest.rpy:242
|
||||
old "Continue, Show this warning again"
|
||||
new "Продовжити, показати це попередження знову"
|
||||
|
||||
# 00gltest.rpy:246
|
||||
old "Continue, Don't show warning again"
|
||||
new "Продовжити, не показувати це попередження знову."
|
||||
|
||||
# 00gltest.rpy:264
|
||||
old "Updating DirectX."
|
||||
new "Оновлення DirectX."
|
||||
|
||||
# 00gltest.rpy:268
|
||||
old "DirectX web setup has been started. It may start minimized in the taskbar. Please follow the prompts to install DirectX."
|
||||
new "Інсталятор DirectX був запущений. Можливо, що він запустився у згорнутому стані. Будь ласка, дотримуйтесь інструкцій для встановлення DirectX."
|
||||
|
||||
# 00gltest.rpy:272
|
||||
old "{b}Note:{/b} Microsoft's DirectX web setup program will, by default, install the Bing toolbar. If you do not want this toolbar, uncheck the appropriate box."
|
||||
new "{b}Попередження:{/b} Інсталятор DirectX за замовчуванням намагається встановити панель інструментів Bing. Якщо ви цього не хочете, зніміть відповідну галочку."
|
||||
|
||||
# 00gltest.rpy:276
|
||||
old "When setup finishes, please click below to restart this program."
|
||||
new "Після завершення інсталяції клацніть, щоб перезапустити програму."
|
||||
|
||||
# 00gltest.rpy:278
|
||||
old "Restart"
|
||||
new "Перезапустити"
|
||||
|
||||
# 00gamepad.rpy:32
|
||||
old "Select Gamepad to Calibrate"
|
||||
new "Виберіть Геймпад для калібрування"
|
||||
|
||||
# 00gamepad.rpy:35
|
||||
old "No Gamepads Available"
|
||||
new "Геймпадів не виявлено"
|
||||
|
||||
# 00gamepad.rpy:54
|
||||
old "Calibrating [name] ([i]/[total])"
|
||||
new "Калібрую [name] ([i]/[total])"
|
||||
|
||||
# 00gamepad.rpy:58
|
||||
old "Press or move the [control!s] [kind]."
|
||||
new "Натисніть або посуньте [control!s] [kind]."
|
||||
|
||||
# 00gamepad.rpy:66
|
||||
old "Skip (A)"
|
||||
new "Пропустити (A)"
|
||||
|
||||
# 00gamepad.rpy:69
|
||||
old "Back (B)"
|
||||
new "Назад (B)"
|
||||
|
||||
# _errorhandling.rpym:529
|
||||
old "Open"
|
||||
new "Журнал"
|
||||
|
||||
# _errorhandling.rpym:531
|
||||
old "Opens the traceback.txt file in a text editor."
|
||||
new "Відкриває файл traceback.txt у текстовому редакторі."
|
||||
|
||||
# _errorhandling.rpym:533
|
||||
old "Copy"
|
||||
new "Копіювати"
|
||||
|
||||
# _errorhandling.rpym:535
|
||||
old "Copies the traceback.txt file to the clipboard."
|
||||
new "Копіює файл traceback.txt у буфер обміну."
|
||||
|
||||
# _errorhandling.rpym:562
|
||||
old "An exception has occurred."
|
||||
new "Виник виняток."
|
||||
|
||||
# _errorhandling.rpym:582
|
||||
old "Rollback"
|
||||
new "Назад"
|
||||
|
||||
# _errorhandling.rpym:584
|
||||
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
|
||||
new "Намагається повернутися назад, дозволяючи вам зберегтися або прийняти інший вибір."
|
||||
|
||||
# _errorhandling.rpym:587
|
||||
old "Ignore"
|
||||
new "Ігнорувати"
|
||||
|
||||
# _errorhandling.rpym:591
|
||||
old "Ignores the exception, allowing you to continue."
|
||||
new "Ігнорує цей виняток, дозволяючи вам продовжити."
|
||||
|
||||
# _errorhandling.rpym:593
|
||||
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
|
||||
new "Ігнорує цей виняток, дозволяючи вам продовжити. Найчастіше це призводить до додаткових помилок."
|
||||
|
||||
# _errorhandling.rpym:597
|
||||
old "Reload"
|
||||
new "Перезавантажити"
|
||||
|
||||
# _errorhandling.rpym:599
|
||||
old "Reloads the game from disk, saving and restoring game state if possible."
|
||||
new "Перезавантажує гру з диска, зберігаючи та відновлюючи її стан, якщо це можливо."
|
||||
|
||||
# _errorhandling.rpym:602
|
||||
old "Console"
|
||||
new "Консоль"
|
||||
|
||||
# _errorhandling.rpym:604
|
||||
old "Opens a console to allow debugging the problem."
|
||||
new "Відкриває консоль, що дозволяє налагодити проблему."
|
||||
|
||||
# _errorhandling.rpym:614
|
||||
old "Quits the game."
|
||||
new "Виходить із гри."
|
||||
|
||||
# _errorhandling.rpym:638
|
||||
old "Parsing the script failed."
|
||||
new "Опрацювання сценарію завершилося невдало."
|
||||
|
||||
# _errorhandling.rpym:664
|
||||
old "Opens the errors.txt file in a text editor."
|
||||
new "Відкриває файл errors.txt у текстовому редакторі."
|
||||
|
||||
# _errorhandling.rpym:668
|
||||
old "Copies the errors.txt file to the clipboard."
|
||||
new "Копіює файл errors.txt у буфер обміну."
|
||||
|
||||
# _errorhandling.rpym:542
|
||||
old "Copy BBCode"
|
||||
new "Копіювати як BBCode"
|
||||
|
||||
# _errorhandling.rpym:544
|
||||
old "Copies the traceback.txt file to the clipboard as BBcode for forums like https://lemmasoft.renai.us/."
|
||||
new "Копіює файл traceback.txt у буфер обміну як BBCode для форумів типу https://lemmasoft.renai.us/."
|
||||
|
||||
# _errorhandling.rpym:546
|
||||
old "Copy Markdown"
|
||||
new "Скопіювати як Markdown"
|
||||
|
||||
# _errorhandling.rpym:548
|
||||
old "Copies the traceback.txt file to the clipboard as Markdown for Discord."
|
||||
new "Копіює файл traceback.txt у буфер обміну як Markdown для Дискорду."
|
||||
|
||||
# _errorhandling.rpym:683
|
||||
old "Copies the errors.txt file to the clipboard as BBcode for forums like https://lemmasoft.renai.us/."
|
||||
new "Копіює файл errors.txt у буфер обміну як BBCode для форумів типу https://lemmasoft.renai.us/."
|
||||
|
||||
# _errorhandling.rpym:687
|
||||
old "Copies the errors.txt file to the clipboard as Markdown for Discord."
|
||||
new "Копіює файл errors.txt у буфер обміну як Markdown для Дискорду."
|
||||
|
||||
# renpy/common/00gltest.rpy:100
|
||||
old "Force GL Renderer"
|
||||
new "Примусовий рендеринг GL"
|
||||
|
||||
# renpy/common/00gltest.rpy:105
|
||||
old "Force ANGLE Renderer"
|
||||
new "Примусовий рендеринг ANGLE"
|
||||
|
||||
# renpy/common/00gltest.rpy:110
|
||||
old "Force GLES Renderer"
|
||||
new "Примусовий рендеринг GLES"
|
||||
|
||||
# renpy/common/00gltest.rpy:116
|
||||
old "Force GL2 Renderer"
|
||||
new "Примусовий рендеринг GL2"
|
||||
|
||||
# renpy/common/00gltest.rpy:121
|
||||
old "Force ANGLE2 Renderer"
|
||||
new "Примусовий рендеринг ANGLE2"
|
||||
|
||||
# renpy/common/00gltest.rpy:126
|
||||
old "Force GLES2 Renderer"
|
||||
new "Примусовий рендеринг GLES2"
|
||||
|
||||
# renpy/common/00gltest.rpy:245
|
||||
old "This game requires use of GL2 that can't be initialised."
|
||||
new "Ця гра вимагає використання GL2, який не може бути ініціалізований."
|
||||
|
||||
# renpy/common/00gltest.rpy:256
|
||||
old "More details on how to fix this can be found in the {a=[url]}documentation{/a}."
|
||||
new "Більше інформації про те, як це може бути виправлено, дивіться в {a=[url]}документації{/a}."
|
||||
|
||||
# renpy/common/00gltest.rpy:273
|
||||
old "Change render options"
|
||||
new "Змінити налаштування рендерингу"
|
||||
|
||||
# renpy/common/00gamepad.rpy:58
|
||||
old "Press or move the '[control!s]' [kind]."
|
||||
new "Натисніть або посуньте [kind] '[control!s]'"
|
||||
|
||||
# renpy/common/00gltest.rpy:136
|
||||
old "Enable (No Blocklist)"
|
||||
new "Увімкнути (ігнорувати блоклист)"
|
||||
|
||||
# renpy/common/00gltest.rpy:259
|
||||
old "The {a=edit:1:log.txt}log.txt{/a} file may contain information to help you determine what is wrong with your computer."
|
||||
new "Файл {a=edit:1:log.txt}log.txt{/a} може містити інформацію, яка допоможе вам визначити, що не так з вашим комп'ютером."
|
||||
@@ -0,0 +1,434 @@
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:2
|
||||
old "## Initialization"
|
||||
new "## Ініціалізація"
|
||||
|
||||
# gui/game/gui.rpy:5
|
||||
old "## The init offset statement causes the initialization statements in this file to run before init statements in any other file."
|
||||
new "## Оператор init offset змушує оператори ініціалізації в цьому файлі виконуватися перед операторами init в будь-якому іншому файлі."
|
||||
|
||||
# gui/game/gui.rpy:9
|
||||
old "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
|
||||
new "## Виклик gui.init скидає стилі до розумних значень за замовчуванням і встановлює ширину та висоту гри."
|
||||
|
||||
# gui/game/gui.rpy:17
|
||||
old "## GUI Configuration Variables"
|
||||
new "## Змінні конфігурації GUI"
|
||||
|
||||
# gui/game/gui.rpy:21
|
||||
old "## Colors"
|
||||
new "## Кольори"
|
||||
|
||||
# gui/game/gui.rpy:23
|
||||
old "## The colors of text in the interface."
|
||||
new "## Кольори тексту в інтерфейсі."
|
||||
|
||||
# gui/game/gui.rpy:25
|
||||
old "## An accent color used throughout the interface to label and highlight text."
|
||||
new "## Колір акценту, який використовується в інтерфейсі для позначення та виділення тексту."
|
||||
|
||||
# gui/game/gui.rpy:29
|
||||
old "## The color used for a text button when it is neither selected nor hovered."
|
||||
new "## Колір, який використовується для текстової кнопки, коли вона не вибрана і не наведена."
|
||||
|
||||
# gui/game/gui.rpy:32
|
||||
old "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
|
||||
new "## Дрібний колір використовується для дрібного тексту, який має бути яскравішим/темнішим, щоб досягти того самого ефекту."
|
||||
|
||||
# gui/game/gui.rpy:36
|
||||
old "## The color that is used for buttons and bars that are hovered."
|
||||
new "## Колір, який використовується для кнопок і смуг, на які наводяться."
|
||||
|
||||
# gui/game/gui.rpy:39
|
||||
old "## The color used for a text button when it is selected but not focused. A button is selected if it is the current screen or preference value."
|
||||
new "## Колір, який використовується для текстової кнопки, коли вона вибрана, але не в фокусі. Кнопку вибрано, якщо це поточний екран або значення параметра."
|
||||
|
||||
# gui/game/gui.rpy:43
|
||||
old "## The color used for a text button when it cannot be selected."
|
||||
new "## Колір текстової кнопки, якщо її неможливо вибрати."
|
||||
|
||||
# gui/game/gui.rpy:46
|
||||
old "## Colors used for the portions of bars that are not filled in. These are not used directly, but are used when re-generating bar image files."
|
||||
new "## Кольори, що використовуються для незаповнених частин стовпчиків. Вони не використовуються безпосередньо, а використовуються під час повторного створення файлів зображень стовпчика."
|
||||
|
||||
# gui/game/gui.rpy:51
|
||||
old "## The colors used for dialogue and menu choice text."
|
||||
new "## Кольори, які використовуються для тексту діалогу та вибору меню."
|
||||
|
||||
# gui/game/gui.rpy:56
|
||||
old "## Fonts and Font Sizes"
|
||||
new "## Шрифти та розміри шрифтів"
|
||||
|
||||
# gui/game/gui.rpy:58
|
||||
old "## The font used for in-game text."
|
||||
new "## Шрифт, який використовується для тексту в грі."
|
||||
|
||||
# gui/game/gui.rpy:61
|
||||
old "## The font used for character names."
|
||||
new "## Шрифт, який використовується для імен символів."
|
||||
|
||||
# gui/game/gui.rpy:64
|
||||
old "## The font used for out-of-game text."
|
||||
new "## Шрифт, який використовується для тексту поза грою."
|
||||
|
||||
# gui/game/gui.rpy:67
|
||||
old "## The size of normal dialogue text."
|
||||
new "## Розмір звичайного тексту діалогу."
|
||||
|
||||
# gui/game/gui.rpy:70
|
||||
old "## The size of character names."
|
||||
new "## Розмір імен персонажів."
|
||||
|
||||
# gui/game/gui.rpy:73
|
||||
old "## The size of text in the game's user interface."
|
||||
new "## Розмір тексту в інтерфейсі користувача гри."
|
||||
|
||||
# gui/game/gui.rpy:76
|
||||
old "## The size of labels in the game's user interface."
|
||||
new "## Розмір міток в інтерфейсі користувача гри."
|
||||
|
||||
# gui/game/gui.rpy:79
|
||||
old "## The size of text on the notify screen."
|
||||
new "## Розмір тексту на екрані сповіщень."
|
||||
|
||||
# gui/game/gui.rpy:82
|
||||
old "## The size of the game's title."
|
||||
new "## Розмір назви гри."
|
||||
|
||||
# gui/game/gui.rpy:86
|
||||
old "## Main and Game Menus"
|
||||
new "## Головне та ігрове меню"
|
||||
|
||||
# gui/game/gui.rpy:88
|
||||
old "## The images used for the main and game menus."
|
||||
new "## Зображення, які використовуються для головного та ігрового меню."
|
||||
|
||||
# gui/game/gui.rpy:93
|
||||
old "## Dialogue"
|
||||
new "## Діалог"
|
||||
|
||||
# gui/game/gui.rpy:95
|
||||
old "## These variables control how dialogue is displayed on the screen one line at a time."
|
||||
new "## Ці змінні керують тим, як діалог відображатиметься на екрані один рядок за раз."
|
||||
|
||||
# gui/game/gui.rpy:98
|
||||
old "## The height of the textbox containing dialogue."
|
||||
new "## Висота текстового поля, що містить діалог."
|
||||
|
||||
# gui/game/gui.rpy:101
|
||||
old "## The placement of the textbox vertically on the screen. 0.0 is the top, 0.5 is center, and 1.0 is the bottom."
|
||||
new "## Розташування текстового поля вертикально на екрані. 0,0 – верх, 0,5 – центр, 1,0 – низ."
|
||||
|
||||
# gui/game/gui.rpy:106
|
||||
old "## The placement of the speaking character's name, relative to the textbox. These can be a whole number of pixels from the left or top, or 0.5 to center."
|
||||
new "## Розташування імені персонажа, що говорить, відносно текстового поля. Це може бути ціла кількість пікселів зліва чи зверху або 0,5 до центру."
|
||||
|
||||
# gui/game/gui.rpy:111
|
||||
old "## The horizontal alignment of the character's name. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
|
||||
new "## Горизонтальне вирівнювання імені персонажа. Це може бути 0,0 для вирівнювання по лівому краю, 0,5 для вирівнювання по центру та 1,0 для вирівнювання по правому краю."
|
||||
|
||||
# gui/game/gui.rpy:115
|
||||
old "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
|
||||
new "## Ширина, висота та межі поля, що містять ім’я персонажа, або None, щоб автоматично змінити його розмір."
|
||||
|
||||
# gui/game/gui.rpy:120
|
||||
old "## The borders of the box containing the character's name, in left, top, right, bottom order."
|
||||
new "## Межі поля, що містять ім'я персонажа, у порядку зліва, зверху, справа, знизу."
|
||||
|
||||
# gui/game/gui.rpy:124
|
||||
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
|
||||
new "## Якщо True, фон поля імен буде мозаїкою, якщо False, фон вікна імен буде масштабовано."
|
||||
|
||||
# gui/game/gui.rpy:129
|
||||
old "## The placement of dialogue relative to the textbox. These can be a whole number of pixels relative to the left or top side of the textbox, or 0.5 to center."
|
||||
new "## Розташування діалогу відносно текстового поля. Це може бути ціла кількість пікселів відносно лівого чи верхнього краю текстового поля або 0,5 до центру."
|
||||
|
||||
# gui/game/gui.rpy:135
|
||||
old "## The maximum width of dialogue text, in pixels."
|
||||
new "## Максимальна ширина тексту діалогу в пікселях."
|
||||
|
||||
# gui/game/gui.rpy:138
|
||||
old "## The horizontal alignment of the dialogue text. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
|
||||
new "## Горизонтальне вирівнювання тексту діалогу. Це може бути 0,0 для вирівнювання по лівому краю, 0,5 для вирівнювання по центру та 1,0 для вирівнювання по правому краю."
|
||||
|
||||
# gui/game/gui.rpy:143
|
||||
old "## Buttons"
|
||||
new "## Кнопки"
|
||||
|
||||
# gui/game/gui.rpy:145
|
||||
old "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
|
||||
new "## Ці змінні разом із файлами зображень у gui/button контролюють аспекти відображення кнопок."
|
||||
|
||||
# gui/game/gui.rpy:148
|
||||
old "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
|
||||
new "## Ширина та висота кнопки в пікселях. Якщо немає, Ren'Py обчислює розмір."
|
||||
|
||||
# gui/game/gui.rpy:152
|
||||
old "## The borders on each side of the button, in left, top, right, bottom order."
|
||||
new "## Межі з кожного боку кнопки в порядку зліва, зверху, справа та знизу."
|
||||
|
||||
# gui/game/gui.rpy:155
|
||||
old "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
|
||||
new "## Якщо True, фонове зображення буде мозаїчно. Якщо False, фонове зображення буде лінійно масштабовано."
|
||||
|
||||
# gui/game/gui.rpy:159
|
||||
old "## The font used by the button."
|
||||
new "## Шрифт, який використовується кнопкою."
|
||||
|
||||
# gui/game/gui.rpy:162
|
||||
old "## The size of the text used by the button."
|
||||
new "## Розмір тексту, який використовується кнопкою."
|
||||
|
||||
# gui/game/gui.rpy:165
|
||||
old "## The color of button text in various states."
|
||||
new "## Колір тексту кнопки в різних станах."
|
||||
|
||||
# gui/game/gui.rpy:171
|
||||
old "## The horizontal alignment of the button text. (0.0 is left, 0.5 is center, 1.0 is right)."
|
||||
new "## Горизонтальне вирівнювання тексту кнопки. (0,0 ліворуч, 0,5 центр, 1,0 праворуч)."
|
||||
|
||||
# gui/game/gui.rpy:176
|
||||
old "## These variables override settings for different kinds of buttons. Please see the gui documentation for the kinds of buttons available, and what each is used for."
|
||||
new "## Ці змінні перекривають налаштування для різних типів кнопок. Перегляньте документацію gui, щоб дізнатися про типи доступних кнопок і для чого кожна з них використовується."
|
||||
|
||||
# gui/game/gui.rpy:180
|
||||
old "## These customizations are used by the default interface:"
|
||||
new "## Ці налаштування використовуються стандартним інтерфейсом:"
|
||||
|
||||
# gui/game/gui.rpy:195
|
||||
old "## You can also add your own customizations, by adding properly-named variables. For example, you can uncomment the following line to set the width of a navigation button."
|
||||
new "## Ви також можете додати власні налаштування, додавши змінні з правильними назвами. Наприклад, ви можете розкоментувати наступний рядок, щоб встановити ширину кнопки навігації."
|
||||
|
||||
# gui/game/gui.rpy:202
|
||||
old "## Choice Buttons"
|
||||
new "## Кнопки вибору"
|
||||
|
||||
# gui/game/gui.rpy:204
|
||||
old "## Choice buttons are used in the in-game menus."
|
||||
new "## Кнопки вибору використовуються в ігрових меню."
|
||||
|
||||
# gui/game/gui.rpy:218
|
||||
old "## File Slot Buttons"
|
||||
new "## Кнопки слотів файлів"
|
||||
|
||||
# gui/game/gui.rpy:220
|
||||
old "## A file slot button is a special kind of button. It contains a thumbnail image, and text describing the contents of the save slot. A save slot uses image files in gui/button, like the other kinds of buttons."
|
||||
new "## Кнопка слота файлів — це особливий вид кнопки. Він містить ескіз зображення та текст, що описує вміст гнізда збереження. Слот збереження використовує файли зображень у gui/button, як і інші типи кнопок."
|
||||
|
||||
# gui/game/gui.rpy:224
|
||||
old "## The save slot button."
|
||||
new "## Кнопка збереження слота."
|
||||
|
||||
# gui/game/gui.rpy:234
|
||||
old "## The width and height of thumbnails used by the save slots."
|
||||
new "## Ці змінні керують розташуванням і відстанню між різними елементами інтерфейсу користувача."
|
||||
|
||||
# gui/game/gui.rpy:238
|
||||
old "## The number of columns and rows in the grid of save slots."
|
||||
new "## Ширина та висота мініатюр, що використовуються слотами для збереження."
|
||||
|
||||
# gui/game/gui.rpy:243
|
||||
old "## Positioning and Spacing"
|
||||
new "## Позиціонування та інтервали"
|
||||
|
||||
# gui/game/gui.rpy:245
|
||||
old "## These variables control the positioning and spacing of various user interface elements."
|
||||
new "## Ці змінні керують розташуванням і відстанню між різними елементами інтерфейсу користувача."
|
||||
|
||||
# gui/game/gui.rpy:248
|
||||
old "## The position of the left side of the navigation buttons, relative to the left side of the screen."
|
||||
new "## Розташування лівої сторони навігаційних кнопок відносно лівої сторони екрана."
|
||||
|
||||
# gui/game/gui.rpy:252
|
||||
old "## The vertical position of the skip indicator."
|
||||
new "## Вертикальна позиція індикатора пропуску."
|
||||
|
||||
# gui/game/gui.rpy:255
|
||||
old "## The vertical position of the notify screen."
|
||||
new "## Вертикальне положення екрана сповіщень."
|
||||
|
||||
# gui/game/gui.rpy:258
|
||||
old "## The spacing between menu choices."
|
||||
new "## Інтервал між пунктами меню."
|
||||
|
||||
# gui/game/gui.rpy:261
|
||||
old "## Buttons in the navigation section of the main and game menus."
|
||||
new "## Кнопки в розділі навігації головного та ігрового меню."
|
||||
|
||||
# gui/game/gui.rpy:264
|
||||
old "## Controls the amount of spacing between preferences."
|
||||
new "## Контролює розмір інтервалу між параметрами."
|
||||
|
||||
# gui/game/gui.rpy:267
|
||||
old "## Controls the amount of spacing between preference buttons."
|
||||
new "## Контролює відстань між кнопками налаштувань."
|
||||
|
||||
# gui/game/gui.rpy:270
|
||||
old "## The spacing between file page buttons."
|
||||
new "## Відстань між кнопками сторінки файлу."
|
||||
|
||||
# gui/game/gui.rpy:273
|
||||
old "## The spacing between file slots."
|
||||
new "## Відстань між слотами файлів."
|
||||
|
||||
# gui/game/gui.rpy:276
|
||||
old "## The position of the main menu text."
|
||||
new "## Позиція тексту головного меню."
|
||||
|
||||
# gui/game/gui.rpy:280
|
||||
old "## Frames"
|
||||
new "## Рамки"
|
||||
|
||||
# gui/game/gui.rpy:282
|
||||
old "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
|
||||
new "## Ці змінні керують виглядом рамок, що можуть містити компоненти інтерфейсу користувача, коли накладання або вікно відсутні."
|
||||
|
||||
# gui/game/gui.rpy:285
|
||||
old "## Generic frames."
|
||||
new "## Загальні рамки."
|
||||
|
||||
# gui/game/gui.rpy:288
|
||||
old "## The frame that is used as part of the confirm screen."
|
||||
new "## Рамка, яка використовується як частина екрана підтвердження."
|
||||
|
||||
# gui/game/gui.rpy:291
|
||||
old "## The frame that is used as part of the skip screen."
|
||||
new "## Рамка, який використовується як частина екрана пропуску."
|
||||
|
||||
# gui/game/gui.rpy:294
|
||||
old "## The frame that is used as part of the notify screen."
|
||||
new "## Рамка, яка використовується як частина екрана сповіщень."
|
||||
|
||||
# gui/game/gui.rpy:297
|
||||
old "## Should frame backgrounds be tiled?"
|
||||
new "## Чи слід фонові рамки розміщувати плиткою?"
|
||||
|
||||
# gui/game/gui.rpy:301
|
||||
old "## Bars, Scrollbars, and Sliders"
|
||||
new "## Панелі, смуги прокрутки та повзунки"
|
||||
|
||||
# gui/game/gui.rpy:303
|
||||
old "## These control the look and size of bars, scrollbars, and sliders."
|
||||
new "## Це керує виглядом і розміром смуг, смуг прокрутки та повзунків."
|
||||
|
||||
# gui/game/gui.rpy:305
|
||||
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written screens."
|
||||
new "## GUI за замовчуванням використовує лише повзунки та вертикальні смуги прокручування. Усі інші смужки використовуються лише на екранах, написаних автором."
|
||||
|
||||
# gui/game/gui.rpy:308
|
||||
old "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
|
||||
new "## Висота горизонтальних смуг, смуг прокрутки та повзунків. Ширина вертикальних смуг, смуг прокручування та повзунків."
|
||||
|
||||
# gui/game/gui.rpy:314
|
||||
old "## True if bar images should be tiled. False if they should be linearly scaled."
|
||||
new "## True якщо зображення панелей мають бути мозаїками. False, якщо вони повинні бути лінійно масштабовані."
|
||||
|
||||
# gui/game/gui.rpy:319
|
||||
old "## Horizontal borders."
|
||||
new "## Горизонтальні межі."
|
||||
|
||||
# gui/game/gui.rpy:324
|
||||
old "## Vertical borders."
|
||||
new "## Вертикальні межі."
|
||||
|
||||
# gui/game/gui.rpy:329
|
||||
old "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
|
||||
new "## Що робити з непрокручуваними смугами прокручування в gui. \"hide\" приховує їх, а «Нічого» показує їх."
|
||||
|
||||
# gui/game/gui.rpy:334
|
||||
old "## History"
|
||||
new "## Історія"
|
||||
|
||||
# gui/game/gui.rpy:336
|
||||
old "## The history screen displays dialogue that the player has already dismissed."
|
||||
new "## На екрані історії відображається діалог, який гравець уже закрив."
|
||||
|
||||
# gui/game/gui.rpy:338
|
||||
old "## The number of blocks of dialogue history Ren'Py will keep."
|
||||
new "## Кількість блоків історії діалогів, яких Ren'Py збереже."
|
||||
|
||||
# gui/game/gui.rpy:341
|
||||
old "## The height of a history screen entry, or None to make the height variable at the cost of performance."
|
||||
new "## Висота запису на екрані історії або «Нічого», щоб зробити висоту змінною за рахунок продуктивності."
|
||||
|
||||
# gui/game/gui.rpy:345
|
||||
old "## The position, width, and alignment of the label giving the name of the speaking character."
|
||||
new "## Положення, ширина та вирівнювання мітки, що вказує ім’я персонажа, що говорить."
|
||||
|
||||
# gui/game/gui.rpy:352
|
||||
old "## The position, width, and alignment of the dialogue text."
|
||||
new "## Позиція, ширина та вирівнювання тексту діалогу."
|
||||
|
||||
# gui/game/gui.rpy:359
|
||||
old "## NVL-Mode"
|
||||
new "## Режим NVL"
|
||||
|
||||
# gui/game/gui.rpy:361
|
||||
old "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
|
||||
new "## На екрані режиму NVL відображається діалог, який вимовляють персонажі режиму NVL."
|
||||
|
||||
# gui/game/gui.rpy:363
|
||||
old "## The borders of the background of the NVL-mode background window."
|
||||
new "## Межі фону заднього плану режиму NVL."
|
||||
|
||||
# gui/game/gui.rpy:366
|
||||
old "## The maximum number of NVL-mode entries Ren'Py will display. When more entries than this are to be show, the oldest entry will be removed."
|
||||
new "## Ren'Py відобразить максимальну кількість записів у режимі NVL. Якщо потрібно показати більше записів, найстаріший запис буде видалено."
|
||||
|
||||
# gui/game/gui.rpy:370
|
||||
old "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
|
||||
new "## Висота запису в режимі NVL. Встановіть значення None, щоб записи динамічно регулювали висоту."
|
||||
|
||||
# gui/game/gui.rpy:374
|
||||
old "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
|
||||
new "## Інтервал між записами режиму NVL, коли gui.nvl_height має значення None, і між записами режиму NVL і меню режиму NVL."
|
||||
|
||||
# gui/game/gui.rpy:391
|
||||
old "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
|
||||
new "## Положення, ширина та вирівнювання тексту nvl_thought (тексту, який вимовляє персонаж nvl_narrator.)"
|
||||
|
||||
# gui/game/gui.rpy:398
|
||||
old "## The position of nvl menu_buttons."
|
||||
new "## Позиціонування nvl menu_buttons."
|
||||
|
||||
# gui/game/gui.rpy:402
|
||||
old "## Localization"
|
||||
new "## Локалізація"
|
||||
|
||||
# gui/game/gui.rpy:404
|
||||
old "## This controls where a line break is permitted. The default is suitable for most languages. A list of available values can be found at https://www.renpy.org/doc/html/style_properties.html#style-property-language"
|
||||
new "## Це визначає, де дозволений розрив рядка. Стандартне значення підходить для більшості мов. Список доступних значень можна знайти за адресою https://www.renpy.org/doc/html/style_properties.html#style-property-language"
|
||||
|
||||
# gui/game/gui.rpy:412
|
||||
old "## Mobile devices"
|
||||
new "## Мобільні пристрої"
|
||||
|
||||
# gui/game/gui.rpy:417
|
||||
old "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
|
||||
new "## Це збільшує розмір швидких кнопок, щоб їх було легше торкатися на планшетах і телефонах."
|
||||
|
||||
# gui/game/gui.rpy:424
|
||||
old "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
|
||||
new "## Це змінює розмір і відстань між різними елементами gui, щоб вони були видимими на телефонах."
|
||||
|
||||
# gui/game/gui.rpy:429
|
||||
old "## Font sizes."
|
||||
new "## Розміри шрифту"
|
||||
|
||||
# gui/game/gui.rpy:437
|
||||
old "## Adjust the location of the textbox."
|
||||
new "## Налаштунки розташування текстового поля."
|
||||
|
||||
# gui/game/gui.rpy:443
|
||||
old "## Change the size and spacing of various things."
|
||||
new "## Зміна розміру і відстані між різними речами."
|
||||
|
||||
# gui/game/gui.rpy:457
|
||||
old "## File button layout."
|
||||
new "## Макет кнопки файлу."
|
||||
|
||||
# gui/game/gui.rpy:461
|
||||
old "## NVL-mode."
|
||||
new "## NVL-режим."
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,199 @@
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# gui/game/options.rpy:1
|
||||
old "## This file contains options that can be changed to customize your game."
|
||||
new "## Цей файл містить параметри, які можна змінити, щоб налаштувати гру."
|
||||
|
||||
# gui/game/options.rpy:4
|
||||
old "## Lines beginning with two '#' marks are comments, and you shouldn't uncomment them. Lines beginning with a single '#' mark are commented-out code, and you may want to uncomment them when appropriate."
|
||||
new "## Рядки, що починаються з двох позначок «#», є коментарями, і ви не повинні розкоментувати їх. Рядки, що починаються з одного знака «#», є закоментованим кодом, і ви можете за потреби розкоментувати їх."
|
||||
|
||||
# gui/game/options.rpy:10
|
||||
old "## Basics"
|
||||
new "## Основи"
|
||||
|
||||
# gui/game/options.rpy:12
|
||||
old "## A human-readable name of the game. This is used to set the default window title, and shows up in the interface and error reports."
|
||||
new "## Зрозуміла назва гри. Це використовується для встановлення заголовка вікна за замовчуванням і відображається в інтерфейсі та звітах про помилки."
|
||||
|
||||
# gui/game/options.rpy:15
|
||||
old "## The _() surrounding the string marks it as eligible for translation."
|
||||
new "## _() навколо рядка позначає його як придатний для перекладу."
|
||||
|
||||
# gui/game/options.rpy:17
|
||||
old "Ren'Py 7 Default GUI"
|
||||
new "Графічний інтерфейс Ren'Py 7 за замовчуванням"
|
||||
|
||||
# gui/game/options.rpy:20
|
||||
old "## Determines if the title given above is shown on the main menu screen. Set this to False to hide the title."
|
||||
new "## Визначає, чи заголовок, наведений вище, відображається на екрані головного меню. Встановіть значення False, щоб приховати назву."
|
||||
|
||||
# gui/game/options.rpy:26
|
||||
old "## The version of the game."
|
||||
new "## Версія гри."
|
||||
|
||||
# gui/game/options.rpy:31
|
||||
old "## Text that is placed on the game's about screen. Place the text between the triple-quotes, and leave a blank line between paragraphs."
|
||||
new "## Текст, який розміщується на екрані інформації про гру. Поставте текст між потрійними лапками, а між абзацами залиште порожній рядок."
|
||||
|
||||
# gui/game/options.rpy:38
|
||||
old "## A short name for the game used for executables and directories in the built distribution. This must be ASCII-only, and must not contain spaces, colons, or semicolons."
|
||||
new "## Коротка назва гри, яка використовується для виконуваних файлів і каталогів у вбудованому дистрибутиві. Це має бути лише ASCII і не повинно містити пробілів, двокрапки чи крапки з комою."
|
||||
|
||||
# gui/game/options.rpy:45
|
||||
old "## Sounds and music"
|
||||
new "## Звуки і музика"
|
||||
|
||||
# gui/game/options.rpy:47
|
||||
old "## These three variables control, among other things, which mixers are shown to the player by default. Setting one of these to False will hide the appropriate mixer."
|
||||
new "## Ці три змінні керують, серед іншого, тим, які міксери відображаються гравцеві за замовчуванням. Встановлення для одного з них значення False приховає відповідний мікшер."
|
||||
|
||||
# gui/game/options.rpy:56
|
||||
old "## To allow the user to play a test sound on the sound or voice channel, uncomment a line below and use it to set a sample sound to play."
|
||||
new "## Щоб дозволити користувачеві відтворювати тестовий звук на звуковому або голосовому каналі, розкоментуйте рядок нижче та використовуйте його, щоб встановити зразок звуку для відтворення."
|
||||
|
||||
# gui/game/options.rpy:63
|
||||
old "## Uncomment the following line to set an audio file that will be played while the player is at the main menu. This file will continue playing into the game, until it is stopped or another file is played."
|
||||
new "## Розкоментуйте наступний рядок, щоб налаштувати аудіофайл, який відтворюватиметься, коли плеєр перебуває в головному меню. Цей файл продовжуватиме відтворюватися в грі, доки його не буде зупинено або не буде відтворено інший файл."
|
||||
|
||||
# gui/game/options.rpy:70
|
||||
old "## Transitions"
|
||||
new "## Переходи"
|
||||
|
||||
# gui/game/options.rpy:72
|
||||
old "## These variables set transitions that are used when certain events occur. Each variable should be set to a transition, or None to indicate that no transition should be used."
|
||||
new "## Ці змінні встановлюють переходи, які використовуються, коли відбуваються певні події. Кожна змінна має бути встановлена на перехід або None, щоб вказати, що перехід не слід використовувати."
|
||||
|
||||
# gui/game/options.rpy:76
|
||||
old "## Entering or exiting the game menu."
|
||||
new "## Вхід або вихід з меню гри."
|
||||
|
||||
# gui/game/options.rpy:82
|
||||
old "## Between screens of the game menu."
|
||||
new "## Між екранами меню гри"
|
||||
|
||||
# gui/game/options.rpy:87
|
||||
old "## A transition that is used after a game has been loaded."
|
||||
new "## Перехід, що використовується після завантаження гри."
|
||||
|
||||
# gui/game/options.rpy:92
|
||||
old "## Used when entering the main menu after the game has ended."
|
||||
new "## Використовується під час входу в головне меню після завершення гри."
|
||||
|
||||
# gui/game/options.rpy:97
|
||||
old "## A variable to set the transition used when the game starts does not exist. Instead, use a with statement after showing the initial scene."
|
||||
new "## Змінна для встановлення переходу, який використовується під час запуску гри, не існує. Замість цього використовуйте оператор with після показу початкової сцени."
|
||||
|
||||
# gui/game/options.rpy:102
|
||||
old "## Window management"
|
||||
new "## Керування вікнами"
|
||||
|
||||
# gui/game/options.rpy:104
|
||||
old "## This controls when the dialogue window is displayed. If \"show\", it is always displayed. If \"hide\", it is only displayed when dialogue is present. If \"auto\", the window is hidden before scene statements and shown again once dialogue is displayed."
|
||||
new "## Цей параметр визначає час відображення діалогового вікна. Якщо \"show\", він завжди відображається. Якщо \"hide\", воно відображається лише за наявності діалогу. Якщо \"auto\", вікно буде приховано перед операторами сцени та показано знову, коли відобразиться діалог."
|
||||
|
||||
# gui/game/options.rpy:109
|
||||
old "## After the game has started, this can be changed with the \"window show\", \"window hide\", and \"window auto\" statements."
|
||||
new "## Після початку гри це можна змінити за допомогою операторів \"window show\", \"window hide\" і \"window auto\"."
|
||||
|
||||
# gui/game/options.rpy:115
|
||||
old "## Transitions used to show and hide the dialogue window"
|
||||
new "## Переходи, які використовуються для показу та приховування діалогового вікна"
|
||||
|
||||
# gui/game/options.rpy:121
|
||||
old "## Preference defaults"
|
||||
new "## Параметри за замовчуванням"
|
||||
|
||||
# gui/game/options.rpy:123
|
||||
old "## Controls the default text speed. The default, 0, is infinite, while any other number is the number of characters per second to type out."
|
||||
new "## Керує швидкістю тексту за замовчуванням. За замовчуванням, 0, є нескінченним, тоді як будь-яке інше число означає кількість символів за секунду, які потрібно ввести."
|
||||
|
||||
# gui/game/options.rpy:129
|
||||
old "## The default auto-forward delay. Larger numbers lead to longer waits, with 0 to 30 being the valid range."
|
||||
new "## Затримка автоматичного пересилання за замовчуванням. Більші числа призводять до довшого очікування, при цьому допустимим діапазоном є від 0 до 30."
|
||||
|
||||
# gui/game/options.rpy:135
|
||||
old "## Save directory"
|
||||
new "## Зберегти каталог"
|
||||
|
||||
# gui/game/options.rpy:137
|
||||
old "## Controls the platform-specific place Ren'Py will place the save files for this game. The save files will be placed in:"
|
||||
new "## Контролює місце, де Ren'Py буде розміщувати файли збереження для цієї гри. Файли збереження будуть розміщені в:"
|
||||
|
||||
# gui/game/options.rpy:140
|
||||
old "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
|
||||
new "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
|
||||
|
||||
# gui/game/options.rpy:142
|
||||
old "## Macintosh: $HOME/Library/RenPy/<config.save_directory>"
|
||||
new "## Macintosh: $HOME/Library/RenPy/<config.save_directory>"
|
||||
|
||||
# gui/game/options.rpy:144
|
||||
old "## Linux: $HOME/.renpy/<config.save_directory>"
|
||||
new "## Linux: $HOME/.renpy/<config.save_directory>"
|
||||
|
||||
# gui/game/options.rpy:146
|
||||
old "## This generally should not be changed, and if it is, should always be a literal string, not an expression."
|
||||
new "## Як правило, це не слід змінювати, і якщо це так, завжди має бути літеральний рядок, а не вираз."
|
||||
|
||||
# gui/game/options.rpy:152
|
||||
old "## Icon"
|
||||
new "## Значок"
|
||||
|
||||
# gui/game/options.rpy:154
|
||||
old "## The icon displayed on the taskbar or dock."
|
||||
new "## Значок, що відображається на панелі завдань або док-станції."
|
||||
|
||||
# gui/game/options.rpy:159
|
||||
old "## Build configuration"
|
||||
new "## Створити конфігурацію"
|
||||
|
||||
# gui/game/options.rpy:161
|
||||
old "## This section controls how Ren'Py turns your project into distribution files."
|
||||
new "## Цей розділ керує тим, як Ren'Py перетворює ваш проєкт у файли розповсюдження."
|
||||
|
||||
# gui/game/options.rpy:166
|
||||
old "## The following functions take file patterns. File patterns are case- insensitive, and matched against the path relative to the base directory, with and without a leading /. If multiple patterns match, the first is used."
|
||||
new "## Наступні функції приймають шаблони файлів. Шаблони файлів не чутливі до регістру та зіставляються зі шляхом відносно основного каталогу, з / без нього на початку. Якщо збігається декілька шаблонів, використовується перший."
|
||||
|
||||
# gui/game/options.rpy:171
|
||||
old "## In a pattern:"
|
||||
new "## У шаблоні:"
|
||||
|
||||
# gui/game/options.rpy:173
|
||||
old "## / is the directory separator."
|
||||
new "## / є роздільником каталогу."
|
||||
|
||||
# gui/game/options.rpy:175
|
||||
old "## * matches all characters, except the directory separator."
|
||||
new "## * відповідає всім символам, крім роздільника каталогу."
|
||||
|
||||
# gui/game/options.rpy:177
|
||||
old "## ** matches all characters, including the directory separator."
|
||||
new "## ** відповідає всім символам, включаючи роздільник каталогу."
|
||||
|
||||
# gui/game/options.rpy:179
|
||||
old "## For example, \"*.txt\" matches txt files in the base directory, \"game/**.ogg\" matches ogg files in the game directory or any of its subdirectories, and \"**.psd\" matches psd files anywhere in the project."
|
||||
new "## Наприклад, \"*.txt\" відповідає файлам txt у базовому каталозі, \"game/**.ogg\" відповідає файлам ogg у каталозі гри або будь-якому з його підкаталогів, а \"**.psd \" відповідає файлам psd будь-де в проєкті."
|
||||
|
||||
# gui/game/options.rpy:183
|
||||
old "## Classify files as None to exclude them from the built distributions."
|
||||
new "## Класифікуйте файли як None, щоб виключити їх із вбудованих дистрибутивів."
|
||||
|
||||
# gui/game/options.rpy:191
|
||||
old "## To archive files, classify them as 'archive'."
|
||||
new "## Щоб архівувати файли, класифікуйте їх як 'archive'."
|
||||
|
||||
# gui/game/options.rpy:196
|
||||
old "## Files matching documentation patterns are duplicated in a mac app build, so they appear in both the app and the zip file."
|
||||
new "## Файли, що відповідають шаблонам документації, дублюються у створенні програми Mac, тому вони з’являються як у програмі, так і в zip-файлі."
|
||||
|
||||
# gui/game/options.rpy:203
|
||||
old "## A Google Play license key is required to download expansion files and perform in-app purchases. It can be found on the \"Services & APIs\" page of the Google Play developer console."
|
||||
new "## Для завантаження файлів розширення та здійснення покупок у програмі потрібен ліцензійний ключ Google Play. Його можна знайти на сторінці \"Services & APIs\" консолі розробника Google Play."
|
||||
|
||||
# gui/game/options.rpy:210
|
||||
old "## The username and project name associated with an itch.io project, separated by a slash."
|
||||
new "## Ім’я користувача та назва проєкту, пов’язані з проєктом itch.io, розділені скісною рискою."
|
||||
|
||||
@@ -0,0 +1,655 @@
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:9
|
||||
old "## Styles"
|
||||
new "## Стилі"
|
||||
|
||||
# gui/game/screens.rpy:81
|
||||
old "## In-game screens"
|
||||
new "## Екрани в грі"
|
||||
|
||||
# gui/game/screens.rpy:85
|
||||
old "## Say screen"
|
||||
new "## Екран розмови"
|
||||
|
||||
# gui/game/screens.rpy:87
|
||||
old "## The say screen is used to display dialogue to the player. It takes two parameters, who and what, which are the name of the speaking character and the text to be displayed, respectively. (The who parameter can be None if no name is given.)"
|
||||
new "## Екран say використовується для відображення діалогу гравцеві. Він приймає два параметри, хто і що, ім'я персонажа, що говорить, і текст, який буде відображатися відповідно. (Параметр who може мати значення None, якщо ім’я не вказано.)"
|
||||
|
||||
# gui/game/screens.rpy:92
|
||||
old "## This screen must create a text displayable with id \"what\", as Ren'Py uses this to manage text display. It can also create displayables with id \"who\" and id \"window\" to apply style properties."
|
||||
new "## Цей екран має створювати текст, який можна відображати з ідентифікатором \"what\", оскільки Ren'Py використовує це для керування відображенням тексту. Він також може створювати відображувані елементи з ідентифікаторами \"who\" та ідентифікаторами \"window\" для застосування властивостей стилю."
|
||||
|
||||
# gui/game/screens.rpy:96
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#say"
|
||||
new "## https://www.renpy.org/doc/html/screen_special.html#say"
|
||||
|
||||
# gui/game/screens.rpy:114
|
||||
old "## If there's a side image, display it above the text. Do not display on the phone variant - there's no room."
|
||||
new "## Якщо є зображення збоку, відобразіть його над текстом. Не відображати на телефоні як варіант - немає місця."
|
||||
|
||||
# gui/game/screens.rpy:120
|
||||
old "## Make the namebox available for styling through the Character object."
|
||||
new "## Робить поле імен доступним для стилізації через об'єкт Character."
|
||||
|
||||
# gui/game/screens.rpy:165
|
||||
old "## Input screen"
|
||||
new "## Екран введення"
|
||||
|
||||
# gui/game/screens.rpy:167
|
||||
old "## This screen is used to display renpy.input. The prompt parameter is used to pass a text prompt in."
|
||||
new "## Цей екран використовується для відображення renpy.input. Параметр prompt використовується для передачі текстової підказки."
|
||||
|
||||
# gui/game/screens.rpy:170
|
||||
old "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
|
||||
new "## Цей екран має створити відображуваний вхід з ідентифікатором \"input\" для прийняття різних вхідних параметрів."
|
||||
|
||||
# gui/game/screens.rpy:173
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#input"
|
||||
new "## https://www.renpy.org/doc/html/screen_special.html#input"
|
||||
|
||||
# gui/game/screens.rpy:200
|
||||
old "## Choice screen"
|
||||
new "## Екран вибору"
|
||||
|
||||
# gui/game/screens.rpy:202
|
||||
old "## This screen is used to display the in-game choices presented by the menu statement. The one parameter, items, is a list of objects, each with caption and action fields."
|
||||
new "## Цей екран використовується для відображення вибору в грі, представленого командою 'menu'. Один параметр, 'items', — це список об’єктів, кожен із полями заголовка та дії."
|
||||
|
||||
# gui/game/screens.rpy:206
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#choice"
|
||||
new "## https://www.renpy.org/doc/html/screen_special.html#choice"
|
||||
|
||||
# gui/game/screens.rpy:234
|
||||
old "## Quick Menu screen"
|
||||
new "## Екран швидкого меню"
|
||||
|
||||
# gui/game/screens.rpy:236
|
||||
old "## The quick menu is displayed in-game to provide easy access to the out-of-game menus."
|
||||
new "## Швидке меню відображається в грі, щоб забезпечити легкий доступ до меню поза грою."
|
||||
|
||||
# gui/game/screens.rpy:241
|
||||
old "## Ensure this appears on top of other screens."
|
||||
new "## Переконайтеся, що це відображається поверх інших екранів."
|
||||
|
||||
# gui/game/screens.rpy:252
|
||||
old "Back"
|
||||
new "Назад"
|
||||
|
||||
# gui/game/screens.rpy:253
|
||||
old "History"
|
||||
new "Історія"
|
||||
|
||||
# gui/game/screens.rpy:254
|
||||
old "Skip"
|
||||
new "Пропустити"
|
||||
|
||||
# gui/game/screens.rpy:255
|
||||
old "Auto"
|
||||
new "Авто"
|
||||
|
||||
# gui/game/screens.rpy:256
|
||||
old "Save"
|
||||
new "Зберегти"
|
||||
|
||||
# gui/game/screens.rpy:257
|
||||
old "Q.Save"
|
||||
new "Ш.Зберегти"
|
||||
|
||||
# gui/game/screens.rpy:258
|
||||
old "Q.Load"
|
||||
new "Ш.Завантажити"
|
||||
|
||||
# gui/game/screens.rpy:259
|
||||
old "Prefs"
|
||||
new "Опції"
|
||||
|
||||
# gui/game/screens.rpy:262
|
||||
old "## This code ensures that the quick_menu screen is displayed in-game, whenever the player has not explicitly hidden the interface."
|
||||
new "## Цей код гарантує, що екран quick_menu відображається в грі, якщо гравець явно не приховав інтерфейс."
|
||||
|
||||
# gui/game/screens.rpy:280
|
||||
old "## Main and Game Menu Screens"
|
||||
new "## Екрани головного та ігрового меню"
|
||||
|
||||
# gui/game/screens.rpy:283
|
||||
old "## Navigation screen"
|
||||
new "## Екран навігації"
|
||||
|
||||
# gui/game/screens.rpy:285
|
||||
old "## This screen is included in the main and game menus, and provides navigation to other menus, and to start the game."
|
||||
new "## Цей екран включено в головне та ігрове меню та забезпечує навігацію до інших меню та початок гри."
|
||||
|
||||
# gui/game/screens.rpy:300
|
||||
old "Start"
|
||||
new "Почати"
|
||||
|
||||
# gui/game/screens.rpy:308
|
||||
old "Load"
|
||||
new "Завантажити"
|
||||
|
||||
# gui/game/screens.rpy:310
|
||||
old "Preferences"
|
||||
new "Налаштування"
|
||||
|
||||
# gui/game/screens.rpy:314
|
||||
old "End Replay"
|
||||
new "Кінець повтору"
|
||||
|
||||
# gui/game/screens.rpy:318
|
||||
old "Main Menu"
|
||||
new "Головне меню"
|
||||
|
||||
# gui/game/screens.rpy:320
|
||||
old "About"
|
||||
new "Про гру"
|
||||
|
||||
# gui/game/screens.rpy:324
|
||||
old "## Help isn't necessary or relevant to mobile devices."
|
||||
new "## Допомога не є необхідною або актуальною для мобільних пристроїв."
|
||||
|
||||
# gui/game/screens.rpy:325
|
||||
old "Help"
|
||||
new "Довідка"
|
||||
|
||||
# gui/game/screens.rpy:329
|
||||
old "## The quit button is banned on iOS and unnecessary on Android and Web."
|
||||
new "## Кнопка виходу заборонена на iOS і непотрібна на Android і в Веб."
|
||||
|
||||
# gui/game/screens.rpy:330
|
||||
old "Quit"
|
||||
new "Вийти"
|
||||
|
||||
# gui/game/screens.rpy:344
|
||||
old "## Main Menu screen"
|
||||
new "## Екран головного меню"
|
||||
|
||||
# gui/game/screens.rpy:346
|
||||
old "## Used to display the main menu when Ren'Py starts."
|
||||
new "## Використовується для відображення головного меню під час запуску Ren'Py."
|
||||
|
||||
# gui/game/screens.rpy:348
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#main-menu"
|
||||
new "## https://www.renpy.org/doc/html/screen_special.html#main-menu"
|
||||
|
||||
# gui/game/screens.rpy:352
|
||||
old "## This ensures that any other menu screen is replaced."
|
||||
new "## Це гарантує, що будь-який інший екран меню буде замінено."
|
||||
|
||||
# gui/game/screens.rpy:357
|
||||
old "## This empty frame darkens the main menu."
|
||||
new "## Ця порожня рамка затемнює головне меню."
|
||||
|
||||
# gui/game/screens.rpy:361
|
||||
old "## The use statement includes another screen inside this one. The actual contents of the main menu are in the navigation screen."
|
||||
new "## Інструкція використання включає інший екран всередині цього. Фактичний вміст головного меню знаходиться на екрані навігації."
|
||||
|
||||
# gui/game/screens.rpy:406
|
||||
old "## Game Menu screen"
|
||||
new "## Екран меню гри"
|
||||
|
||||
# gui/game/screens.rpy:408
|
||||
old "## This lays out the basic common structure of a game menu screen. It's called with the screen title, and displays the background, title, and navigation."
|
||||
new "## Це описує базову структуру екрана меню гри. Він викликається за допомогою заголовка екрана та відображає фон, заголовок і навігацію."
|
||||
|
||||
# gui/game/screens.rpy:411
|
||||
old "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". When this screen is intended to be used with one or more children, which are transcluded (placed) inside it."
|
||||
new "## Параметр прокручування може бути None або одним із \"viewport\" чи \"vpgrid\". Коли цей екран призначений для використання з одним або декількома об'єктами, які включені (розміщені) всередині нього."
|
||||
|
||||
# gui/game/screens.rpy:429
|
||||
old "## Reserve space for the navigation section."
|
||||
new "## Зарезервуйте місце для розділу навігації."
|
||||
|
||||
# gui/game/screens.rpy:471
|
||||
old "Return"
|
||||
new "Повернутися"
|
||||
|
||||
# gui/game/screens.rpy:534
|
||||
old "## About screen"
|
||||
new "## Про екран"
|
||||
|
||||
# gui/game/screens.rpy:536
|
||||
old "## This screen gives credit and copyright information about the game and Ren'Py."
|
||||
new "## Цей екран містить інформацію про авторство та авторські права щодо гри та Ren'Py."
|
||||
|
||||
# gui/game/screens.rpy:539
|
||||
old "## There's nothing special about this screen, and hence it also serves as an example of how to make a custom screen."
|
||||
new "## У цьому екрані немає нічого особливого, тому він також служить прикладом того, як створити власний екран."
|
||||
|
||||
# gui/game/screens.rpy:546
|
||||
old "## This use statement includes the game_menu screen inside this one. The vbox child is then included inside the viewport inside the game_menu screen."
|
||||
new "## Цей оператор використання включає екран game_menu всередині цього. Потім дочірній елемент vbox включається в область перегляду всередині екрана game_menu."
|
||||
|
||||
# gui/game/screens.rpy:556
|
||||
old "Version [config.version!t]\n"
|
||||
new "Версія [config.version!t]\n"
|
||||
|
||||
# gui/game/screens.rpy:558
|
||||
old "## gui.about is usually set in options.rpy."
|
||||
new "## gui.about зазвичай встановлюється в options.rpy."
|
||||
|
||||
# gui/game/screens.rpy:562
|
||||
old "Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
|
||||
new "Створено за допомогою {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
|
||||
|
||||
# gui/game/screens.rpy:573
|
||||
old "## Load and Save screens"
|
||||
new "## Екрани завантаження та збереження"
|
||||
|
||||
# gui/game/screens.rpy:575
|
||||
old "## These screens are responsible for letting the player save the game and load it again. Since they share nearly everything in common, both are implemented in terms of a third screen, file_slots."
|
||||
new "## Ці екрани дозволяють гравцеві зберегти гру та завантажити її знову. Оскільки вони мають майже все спільне, обидва реалізовані в термінах третього екрана, file_slots."
|
||||
|
||||
# gui/game/screens.rpy:579
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
|
||||
new "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
|
||||
|
||||
# gui/game/screens.rpy:598
|
||||
old "Page {}"
|
||||
new "Сторінка {}"
|
||||
|
||||
# gui/game/screens.rpy:598
|
||||
old "Automatic saves"
|
||||
new "Авто збереження"
|
||||
|
||||
# gui/game/screens.rpy:598
|
||||
old "Quick saves"
|
||||
new "Швидкі збереження"
|
||||
|
||||
# gui/game/screens.rpy:604
|
||||
old "## This ensures the input will get the enter event before any of the buttons do."
|
||||
new "## Це гарантує, що введення отримає подію enter раніше, ніж будь-яка кнопка."
|
||||
|
||||
# gui/game/screens.rpy:608
|
||||
old "## The page name, which can be edited by clicking on a button."
|
||||
new "## Назва сторінки, яку можна редагувати, натиснувши кнопку."
|
||||
|
||||
# gui/game/screens.rpy:620
|
||||
old "## The grid of file slots."
|
||||
new "## Сітка слотів для файлів."
|
||||
|
||||
# gui/game/screens.rpy:640
|
||||
old "{#file_time}%A, %B %d %Y, %H:%M"
|
||||
new "{#file_time}%A, %B %d %Y, %H:%M"
|
||||
|
||||
# gui/game/screens.rpy:640
|
||||
old "empty slot"
|
||||
new "порожній слот"
|
||||
|
||||
# gui/game/screens.rpy:648
|
||||
old "## Buttons to access other pages."
|
||||
new "## Кнопки для доступу до інших сторінок."
|
||||
|
||||
# gui/game/screens.rpy:657
|
||||
old "<"
|
||||
new "<"
|
||||
|
||||
# gui/game/screens.rpy:660
|
||||
old "{#auto_page}A"
|
||||
new "{#auto_page}A"
|
||||
|
||||
# gui/game/screens.rpy:663
|
||||
old "{#quick_page}Q"
|
||||
new "{#quick_page}Ш"
|
||||
|
||||
# gui/game/screens.rpy:665
|
||||
old "## range(1, 10) gives the numbers from 1 to 9."
|
||||
new "## діапазон(1, 10) дає числа від 1 до 9."
|
||||
|
||||
# gui/game/screens.rpy:669
|
||||
old ">"
|
||||
new ">"
|
||||
|
||||
# gui/game/screens.rpy:704
|
||||
old "## Preferences screen"
|
||||
new "## Екран налаштувань"
|
||||
|
||||
# gui/game/screens.rpy:706
|
||||
old "## The preferences screen allows the player to configure the game to better suit themselves."
|
||||
new "## Екран налаштувань дозволяє гравцеві налаштувати гру на свій смак."
|
||||
|
||||
# gui/game/screens.rpy:709
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#preferences"
|
||||
new "## https://www.renpy.org/doc/html/screen_special.html#preferences"
|
||||
|
||||
# gui/game/screens.rpy:726
|
||||
old "Display"
|
||||
new "Дисплей"
|
||||
|
||||
# gui/game/screens.rpy:727
|
||||
old "Window"
|
||||
new "Вікно"
|
||||
|
||||
# gui/game/screens.rpy:728
|
||||
old "Fullscreen"
|
||||
new "На весь екран"
|
||||
|
||||
# gui/game/screens.rpy:733
|
||||
old "Unseen Text"
|
||||
new "Невидимий текст"
|
||||
|
||||
# gui/game/screens.rpy:734
|
||||
old "After Choices"
|
||||
new "Після виборів"
|
||||
|
||||
# gui/game/screens.rpy:735
|
||||
old "Transitions"
|
||||
new "Переходи"
|
||||
|
||||
# gui/game/screens.rpy:737
|
||||
old "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
|
||||
new "## Сюди можна долучити додаткові вікна vbox типу \"radio_pref\" або \"check_pref\", щоб долучити додаткові параметри, визначені творцем."
|
||||
|
||||
# gui/game/screens.rpy:748
|
||||
old "Text Speed"
|
||||
new "Швидкість тексту"
|
||||
|
||||
# gui/game/screens.rpy:752
|
||||
old "Auto-Forward Time"
|
||||
new "Час авто-переадресації"
|
||||
|
||||
# gui/game/screens.rpy:759
|
||||
old "Music Volume"
|
||||
new "Гучність музики"
|
||||
|
||||
# gui/game/screens.rpy:766
|
||||
old "Sound Volume"
|
||||
new "Гучність звуку"
|
||||
|
||||
# gui/game/screens.rpy:772
|
||||
old "Test"
|
||||
new "Тест"
|
||||
|
||||
# gui/game/screens.rpy:776
|
||||
old "Voice Volume"
|
||||
new "Гучність голосу"
|
||||
|
||||
# gui/game/screens.rpy:787
|
||||
old "Mute All"
|
||||
new "Без звуку"
|
||||
|
||||
# gui/game/screens.rpy:863
|
||||
old "## History screen"
|
||||
new "## Екран історії"
|
||||
|
||||
# gui/game/screens.rpy:865
|
||||
old "## This is a screen that displays the dialogue history to the player. While there isn't anything special about this screen, it does have to access the dialogue history stored in _history_list."
|
||||
new "## Це екран, на якому гравцеві відображається історія діалогів. Хоча в цьому екрані немає нічого особливого, він має доступ до історії діалогів, що зберігається в _history_list."
|
||||
|
||||
# gui/game/screens.rpy:869
|
||||
old "## https://www.renpy.org/doc/html/history.html"
|
||||
new "## https://www.renpy.org/doc/html/history.html"
|
||||
|
||||
# gui/game/screens.rpy:875
|
||||
old "## Avoid predicting this screen, as it can be very large."
|
||||
new "## Уникайте прогнозування цього екрана, оскільки він може бути дуже великим."
|
||||
|
||||
# gui/game/screens.rpy:886
|
||||
old "## This lays things out properly if history_height is None."
|
||||
new "## Це правильно розкладає речі, якщо history_height дорівнює None."
|
||||
|
||||
# gui/game/screens.rpy:896
|
||||
old "## Take the color of the who text from the Character, if set."
|
||||
new "## Взяти колір тексту що від персонажа, якщо встановлено."
|
||||
|
||||
# gui/game/screens.rpy:905
|
||||
old "The dialogue history is empty."
|
||||
new "Історія діалогу порожня."
|
||||
|
||||
# gui/game/screens.rpy:908
|
||||
old "## This determines what tags are allowed to be displayed on the history screen."
|
||||
new "## Це визначає теги, які можна відображати на екрані історії."
|
||||
|
||||
# gui/game/screens.rpy:953
|
||||
old "## Help screen"
|
||||
new "## Екран довідки"
|
||||
|
||||
# gui/game/screens.rpy:955
|
||||
old "## A screen that gives information about key and mouse bindings. It uses other screens (keyboard_help, mouse_help, and gamepad_help) to display the actual help."
|
||||
new "## Екран, що надає інформацію про прив’язку клавіш і миші. Він використовує інші екрани (keyboard_help, mouse_help і gamepad_help), щоб відобразити фактичну довідку."
|
||||
|
||||
# gui/game/screens.rpy:974
|
||||
old "Keyboard"
|
||||
new "Клавіатура"
|
||||
|
||||
# gui/game/screens.rpy:975
|
||||
old "Mouse"
|
||||
new "Мишка"
|
||||
|
||||
# gui/game/screens.rpy:978
|
||||
old "Gamepad"
|
||||
new "Геймпад"
|
||||
|
||||
# gui/game/screens.rpy:991
|
||||
old "Enter"
|
||||
new "Enter"
|
||||
|
||||
# gui/game/screens.rpy:992
|
||||
old "Advances dialogue and activates the interface."
|
||||
new "Розвиває діалог і активує інтерфейс."
|
||||
|
||||
# gui/game/screens.rpy:995
|
||||
old "Space"
|
||||
new "Space"
|
||||
|
||||
# gui/game/screens.rpy:996
|
||||
old "Advances dialogue without selecting choices."
|
||||
new "Просуває діалог без вибору варіантів."
|
||||
|
||||
# gui/game/screens.rpy:999
|
||||
old "Arrow Keys"
|
||||
new "Клавіші cтрілок"
|
||||
|
||||
# gui/game/screens.rpy:1000
|
||||
old "Navigate the interface."
|
||||
new "Навігація по інтерфейсу."
|
||||
|
||||
# gui/game/screens.rpy:1003
|
||||
old "Escape"
|
||||
new "Escape"
|
||||
|
||||
# gui/game/screens.rpy:1004
|
||||
old "Accesses the game menu."
|
||||
new "Доступ до меню гри."
|
||||
|
||||
# gui/game/screens.rpy:1007
|
||||
old "Ctrl"
|
||||
new "Ctrl"
|
||||
|
||||
# gui/game/screens.rpy:1008
|
||||
old "Skips dialogue while held down."
|
||||
new "Пропускає діалог при утриманні."
|
||||
|
||||
# gui/game/screens.rpy:1011
|
||||
old "Tab"
|
||||
new "Tab"
|
||||
|
||||
# gui/game/screens.rpy:1012
|
||||
old "Toggles dialogue skipping."
|
||||
new "Вмикає пропуск діалогу."
|
||||
|
||||
# gui/game/screens.rpy:1015
|
||||
old "Page Up"
|
||||
new "Page Up"
|
||||
|
||||
# gui/game/screens.rpy:1016
|
||||
old "Rolls back to earlier dialogue."
|
||||
new "Відкат до попереднього діалогу."
|
||||
|
||||
# gui/game/screens.rpy:1019
|
||||
old "Page Down"
|
||||
new "Page Down"
|
||||
|
||||
# gui/game/screens.rpy:1020
|
||||
old "Rolls forward to later dialogue."
|
||||
new "Перехід до наступного діалогу."
|
||||
|
||||
# gui/game/screens.rpy:1024
|
||||
old "Hides the user interface."
|
||||
new "Приховує інтерфейс користувача."
|
||||
|
||||
# gui/game/screens.rpy:1028
|
||||
old "Takes a screenshot."
|
||||
new "Робить скріншот."
|
||||
|
||||
# gui/game/screens.rpy:1032
|
||||
old "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}."
|
||||
new "Вмикає допоміжне {a=https://www.renpy.org/l/voicing}самоозвучення{/a}."
|
||||
|
||||
# gui/game/screens.rpy:1036
|
||||
old "Opens the accessibility menu."
|
||||
new "Відкриває меню спеціальних можливостей."
|
||||
|
||||
# gui/game/screens.rpy:1042
|
||||
old "Left Click"
|
||||
new "Лівий клік"
|
||||
|
||||
# gui/game/screens.rpy:1046
|
||||
old "Middle Click"
|
||||
new "Середній клік"
|
||||
|
||||
# gui/game/screens.rpy:1050
|
||||
old "Right Click"
|
||||
new "Правий клік"
|
||||
|
||||
# gui/game/screens.rpy:1054
|
||||
old "Mouse Wheel Up\nClick Rollback Side"
|
||||
new "Колесо миші вгору\nбік повернення назад"
|
||||
|
||||
# gui/game/screens.rpy:1058
|
||||
old "Mouse Wheel Down"
|
||||
new "Колесо миші вниз"
|
||||
|
||||
# gui/game/screens.rpy:1065
|
||||
old "Right Trigger\nA/Bottom Button"
|
||||
new "Правий тригер\nA/нижня кнопка"
|
||||
|
||||
# gui/game/screens.rpy:1069
|
||||
old "Left Trigger\nLeft Shoulder"
|
||||
new "Лівий тригер\nЛіве плече"
|
||||
|
||||
# gui/game/screens.rpy:1073
|
||||
old "Right Shoulder"
|
||||
new "Праве плече"
|
||||
|
||||
# gui/game/screens.rpy:1078
|
||||
old "D-Pad, Sticks"
|
||||
new "D-Pad, стіки"
|
||||
|
||||
# gui/game/screens.rpy:1082
|
||||
old "Start, Guide"
|
||||
new "Старт, Гайд"
|
||||
|
||||
# gui/game/screens.rpy:1086
|
||||
old "Y/Top Button"
|
||||
new "Кнопка Y/Top"
|
||||
|
||||
# gui/game/screens.rpy:1089
|
||||
old "Calibrate"
|
||||
new "Калібрувати"
|
||||
|
||||
# gui/game/screens.rpy:1117
|
||||
old "## Additional screens"
|
||||
new "## Додаткові екрани"
|
||||
|
||||
# gui/game/screens.rpy:1121
|
||||
old "## Confirm screen"
|
||||
new "## Екран підтвердження"
|
||||
|
||||
# gui/game/screens.rpy:1123
|
||||
old "## The confirm screen is called when Ren'Py wants to ask the player a yes or no question."
|
||||
new "## Екран підтвердження викликається, коли Ren'Py хоче поставити гравцеві запитання «так» або «ні»."
|
||||
|
||||
# gui/game/screens.rpy:1126
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#confirm"
|
||||
new "## https://www.renpy.org/doc/html/screen_special.html#confirm"
|
||||
|
||||
# gui/game/screens.rpy:1130
|
||||
old "## Ensure other screens do not get input while this screen is displayed."
|
||||
new "## Переконайтеся, що інші екрани не отримують введення, поки відображається цей екран."
|
||||
|
||||
# gui/game/screens.rpy:1154
|
||||
old "Yes"
|
||||
new "Так"
|
||||
|
||||
# gui/game/screens.rpy:1155
|
||||
old "No"
|
||||
new "Ні"
|
||||
|
||||
# gui/game/screens.rpy:1157
|
||||
old "## Right-click and escape answer \"no\"."
|
||||
new "## Клацніть правою кнопкою миші та вийдіть із відповіді \"no\"."
|
||||
|
||||
# gui/game/screens.rpy:1184
|
||||
old "## Skip indicator screen"
|
||||
new "## Екран індикатора пропуску"
|
||||
|
||||
# gui/game/screens.rpy:1186
|
||||
old "## The skip_indicator screen is displayed to indicate that skipping is in progress."
|
||||
new "## Екран skip_indicator відображається, щоб вказати, що триває пропуск."
|
||||
|
||||
# gui/game/screens.rpy:1189
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
|
||||
new "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
|
||||
|
||||
# gui/game/screens.rpy:1201
|
||||
old "Skipping"
|
||||
new "Пропуск"
|
||||
|
||||
# gui/game/screens.rpy:1208
|
||||
old "## This transform is used to blink the arrows one after another."
|
||||
new "## Це перетворення використовується для миготіння стрілок одна за одною."
|
||||
|
||||
# gui/game/screens.rpy:1235
|
||||
old "## We have to use a font that has the BLACK RIGHT-POINTING SMALL TRIANGLE glyph in it."
|
||||
new "## Ми повинні використовувати шрифт із гліфом МАЛЕНЬКИЙ ЧОРНИЙ ТРИКУТНИК ВПРАВО."
|
||||
|
||||
# gui/game/screens.rpy:1240
|
||||
old "## Notify screen"
|
||||
new "## Екран сповіщень"
|
||||
|
||||
# gui/game/screens.rpy:1242
|
||||
old "## The notify screen is used to show the player a message. (For example, when the game is quicksaved or a screenshot has been taken.)"
|
||||
new "## Екран сповіщень використовується, щоб показати гравцеві повідомлення. (Наприклад, коли гра швидко збережена або зроблено знімок екрана.)"
|
||||
|
||||
# gui/game/screens.rpy:1245
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
|
||||
new "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
|
||||
|
||||
# gui/game/screens.rpy:1279
|
||||
old "## NVL screen"
|
||||
new "## Екран NVL"
|
||||
|
||||
# gui/game/screens.rpy:1281
|
||||
old "## This screen is used for NVL-mode dialogue and menus."
|
||||
new "## Відображає діалог у vpgrid або vbox."
|
||||
|
||||
# gui/game/screens.rpy:1283
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#nvl"
|
||||
new "## https://www.renpy.org/doc/html/screen_special.html#nvl"
|
||||
|
||||
# gui/game/screens.rpy:1294
|
||||
old "## Displays dialogue in either a vpgrid or the vbox."
|
||||
new "## Відображає діалог у vpgrid або vbox."
|
||||
|
||||
# gui/game/screens.rpy:1307
|
||||
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True."
|
||||
new "## Відображає меню, якщо є. Меню може відображатися неправильно, якщо для config.narrator_menu встановлено значення True."
|
||||
|
||||
# gui/game/screens.rpy:1337
|
||||
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
|
||||
new "## Це визначає максимальну кількість записів у режимі NVL, які можуть бути відображені одночасно."
|
||||
|
||||
# gui/game/screens.rpy:1399
|
||||
old "## Mobile Variants"
|
||||
new "## Мобільні варіанти"
|
||||
|
||||
# gui/game/screens.rpy:1406
|
||||
old "## Since a mouse may not be present, we replace the quick menu with a version that uses fewer and bigger buttons that are easier to touch."
|
||||
new "## Оскільки миша може бути відсутня, ми замінюємо швидке меню версією, яка використовує менше та більші кнопки, які легше торкатися."
|
||||
|
||||
# gui/game/screens.rpy:1424
|
||||
old "Menu"
|
||||
new "Меню"
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
# У цьому файлі міститься скрипт гри.
|
||||
|
||||
# Оголошення символів, які використовуються в цій грі. Колірний аргумент розфарбовує
|
||||
# ім'я персонажа.
|
||||
|
||||
define e = Character("Ейлін")
|
||||
|
||||
|
||||
# Гра починається тут.
|
||||
|
||||
label start:
|
||||
|
||||
# Це показує фон. За замовчуванням використовується заповнювач, але ви можете
|
||||
# додати файл (з назвою "bg room.png" або "bg room.jpg") до
|
||||
# каталогу images, щоб показати його.
|
||||
|
||||
scene bg room
|
||||
|
||||
# Це показує спрайт персонажа. Використовується заповнювач, але ви можете
|
||||
# замінити його, додавши до зображень файл із назвою "eileen happy.png".
|
||||
# до каталогу.
|
||||
|
||||
show eileen happy
|
||||
|
||||
# Це репліки діалогу.
|
||||
|
||||
e "Ви створили нову гру Ren'Py."
|
||||
|
||||
e "Додавши історію, зображення та музику, ви можете оприлюднити це світові!"
|
||||
|
||||
# На цьому гра закінчується.
|
||||
|
||||
return
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -78,6 +78,7 @@ init python:
|
||||
_("Nightly (Ren'Py 7, Python 2)")
|
||||
_("The bleeding edge of Ren'Py development. This may have the latest features, or might not run at all.")
|
||||
|
||||
default allow_repair_update = False
|
||||
|
||||
screen update_channel(channels):
|
||||
|
||||
@@ -108,8 +109,8 @@ screen update_channel(channels):
|
||||
|
||||
for c in channels:
|
||||
|
||||
if c["split_version"] != list(renpy.version_tuple):
|
||||
$ action = [SetField(persistent, "has_update", None), SetField(persistent, "last_update_check", None), updater.Update(c["url"], simulate=UPDATE_SIMULATE, public_key=PUBLIC_KEY, confirm=False)]
|
||||
if c["split_version"] != list(renpy.version_tuple) or allow_repair_update:
|
||||
$ action = [SetField(persistent, "has_update", None), SetField(persistent, "last_update_check", None), updater.Update(c["url"], simulate=UPDATE_SIMULATE, public_key=PUBLIC_KEY, confirm=False, force=allow_repair_update)]
|
||||
|
||||
if c["channel"].startswith("Release"):
|
||||
$ current = _("• {a=https://www.renpy.org/doc/html/changelog.html}View change log{/a}")
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
+295
-75
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -32,9 +32,97 @@ init python:
|
||||
import time
|
||||
import pygame_sdl2
|
||||
import zipfile
|
||||
import re
|
||||
import hashlib
|
||||
|
||||
WEB_PATH = None
|
||||
|
||||
class ProgressiveFilter(object):
|
||||
def __init__(self, project):
|
||||
self.project = project
|
||||
self.destination = get_web_destination(project)
|
||||
self.remote_files = {}
|
||||
self.images = []
|
||||
self.path_filters = []
|
||||
load_filters(project, self.path_filters)
|
||||
|
||||
def filter(self, file, variant, format):
|
||||
"""
|
||||
Detect and copy the files to be downloaded progressively,
|
||||
and prevent them to be put in the ZIP archive.
|
||||
Returns True if the file must be included in the ZIP archive.
|
||||
"""
|
||||
if variant != 'web' or format != 'zip': # useless?
|
||||
return True
|
||||
|
||||
base, ext = os.path.splitext(file.name)
|
||||
|
||||
copy_file = False
|
||||
# Images
|
||||
if (ext.lower() in ('.jpg', '.jpeg', '.png', '.webp', '.avif', '.svg')
|
||||
and filters_match(self.path_filters, file.name, 'image')):
|
||||
# Add image to list and generate placeholder later
|
||||
self.images.append((file.path, file.name))
|
||||
copy_file = True
|
||||
|
||||
# Musics (but not SFX - no placeholders for short, non-looping sounds)
|
||||
elif (ext.lower() in ('.wav', '.mp2', '.mp3', '.ogg', '.opus')
|
||||
and filters_match(self.path_filters, file.name, 'music')):
|
||||
self.remote_files[file.name[len('game/'):]] = 'music -'
|
||||
copy_file = True
|
||||
|
||||
# Voices
|
||||
elif (ext.lower() in ('.wav', '.mp2', '.mp3', '.ogg', '.opus')
|
||||
and filters_match(self.path_filters, file.name, 'voice')):
|
||||
self.remote_files[file.name[len('game/'):]] = 'voice -'
|
||||
copy_file = True
|
||||
|
||||
# Videos are never included.
|
||||
elif (ext.lower() in ('.ogv', '.webm', '.mp4', '.mkv', '.avi')):
|
||||
self.remote_files[file.name[len('game/'):]] = 'video -'
|
||||
copy_file = True
|
||||
|
||||
if not copy_file:
|
||||
return True
|
||||
|
||||
# Copy the file to the destination folder, keeping metadata
|
||||
dst_path = os.path.join(self.destination, file.name)
|
||||
dst_dir = os.path.dirname(dst_path)
|
||||
if not os.path.isdir(dst_dir):
|
||||
os.makedirs(dst_dir, 0o755)
|
||||
shutil.copy2(file.path, dst_path)
|
||||
|
||||
return False
|
||||
|
||||
def finalize(self):
|
||||
"""
|
||||
Append some generated files to the ZIP archive.
|
||||
"""
|
||||
zout = zipfile.ZipFile(os.path.join(self.destination, 'game.zip'), 'a')
|
||||
tmpdir = tempfile.mkdtemp()
|
||||
|
||||
# Generate and append placeholder image files to archive
|
||||
for (src, dst) in self.images:
|
||||
surface = pygame_sdl2.image.load(src)
|
||||
(w, h) = (surface.get_width(), surface.get_height())
|
||||
self.remote_files[dst[len('game/'):]] = 'image {},{}'.format(w,h)
|
||||
tmpfile = generate_image_placeholder(surface, tmpdir)
|
||||
placeholder_relpath = os.path.join('_placeholders', dst[len('game/'):])
|
||||
zout.write(tmpfile, placeholder_relpath)
|
||||
|
||||
# Prepare a list of remote files for renpy.loader
|
||||
remote_files_str = ''
|
||||
for f in sorted(self.remote_files):
|
||||
remote_files_str += f + "\n"
|
||||
remote_files_str += self.remote_files[f] + "\n"
|
||||
zout.writestr('game/renpyweb_remote_files.txt',
|
||||
remote_files_str,
|
||||
zipfile.ZIP_DEFLATED)
|
||||
|
||||
# Clean-up
|
||||
shutil.rmtree(tmpdir)
|
||||
zout.close()
|
||||
|
||||
def find_web():
|
||||
|
||||
global WEB_PATH
|
||||
@@ -140,80 +228,175 @@ init python:
|
||||
return f_rule
|
||||
return False
|
||||
|
||||
def repack_for_progressive_download(p):
|
||||
def generate_pwa_icons(p, destination):
|
||||
"""
|
||||
Filter out downloadable resources and generate placeholders
|
||||
Checks if the pwa_icon.png file exists in the game folder and generates
|
||||
required icons for PWA in subdirectory icons/ in the destination folder.
|
||||
If no pwa_icon.png is found, the default Ren'Py icon is used instead in
|
||||
the web folder, if exists.
|
||||
"""
|
||||
# Check if there's a custom icon in the game directory
|
||||
icon_path = os.path.join(p.path, 'web-icon.png')
|
||||
# Generate a default icon if there isn't
|
||||
if not os.path.exists(icon_path):
|
||||
icon_path = os.path.join(WEB_PATH, 'web-icon.png')
|
||||
|
||||
# Check if path is a valid image
|
||||
if not os.path.exists(icon_path):
|
||||
# Skip pwa support if no icon is found
|
||||
return
|
||||
# Create icons directory
|
||||
icons_dir = os.path.join(destination, 'icons')
|
||||
if not os.path.isdir(icons_dir):
|
||||
os.makedirs(icons_dir, 0o777)
|
||||
# Check the height and width of the icon
|
||||
icon = pygame_sdl2.image.load(icon_path)
|
||||
icon_width = icon.get_width()
|
||||
icon_height = icon.get_height()
|
||||
if icon_width != icon_height:
|
||||
raise RuntimeError("The icon must be square")
|
||||
if icon_width < 512:
|
||||
raise RuntimeError("The icon must be at least 512x512 pixels")
|
||||
|
||||
scale = renpy.display.scale.smoothscale
|
||||
|
||||
best_compression = 9
|
||||
# Generate 512x512 icon, if needed
|
||||
if icon_width != 512:
|
||||
icon512 = scale(icon, (512, 512))
|
||||
pygame_sdl2.image.save(icon512, os.path.join(icons_dir, 'icon-512x512.png'), best_compression)
|
||||
else:
|
||||
pygame_sdl2.image.save(icon, os.path.join(icons_dir, 'icon-512x512.png'), best_compression)
|
||||
|
||||
# Generate 384x384 icon
|
||||
icon384 = scale(icon, (384, 384))
|
||||
pygame_sdl2.image.save(icon384, os.path.join(icons_dir, 'icon-384x384.png'), best_compression)
|
||||
|
||||
# Generate 192x192 icon
|
||||
icon192 = scale(icon, (192, 192))
|
||||
pygame_sdl2.image.save(icon192, os.path.join(icons_dir, 'icon-192x192.png'), best_compression)
|
||||
|
||||
# Generate 152x152 icon
|
||||
icon152 = scale(icon, (152, 152))
|
||||
pygame_sdl2.image.save(icon152, os.path.join(icons_dir, 'icon-152x152.png'), best_compression)
|
||||
|
||||
# Generate 144x144 icon
|
||||
icon144 = scale(icon, (144, 144))
|
||||
pygame_sdl2.image.save(icon144, os.path.join(icons_dir, 'icon-144x144.png'), best_compression)
|
||||
|
||||
# Generate 128x128 icon
|
||||
icon128 = scale(icon, (128, 128))
|
||||
pygame_sdl2.image.save(icon128, os.path.join(icons_dir, 'icon-128x128.png'), best_compression)
|
||||
|
||||
# Generate 96x96 icon
|
||||
icon96 = scale(icon, (96, 96))
|
||||
pygame_sdl2.image.save(icon96, os.path.join(icons_dir, 'icon-96x96.png'), best_compression)
|
||||
|
||||
# Generate 72x72 icon
|
||||
icon72 = scale(icon, (72, 72))
|
||||
pygame_sdl2.image.save(icon72, os.path.join(icons_dir, 'icon-72x72.png'), best_compression)
|
||||
|
||||
# Add 128 pixels to the 384x384 icon to generate 512x512 icon maskable
|
||||
icon512_maskable = pygame_sdl2.Surface((512, 512), pygame_sdl2.SRCALPHA)
|
||||
icon512_maskable.blit(icon384, (64, 64))
|
||||
pygame_sdl2.image.save(icon512_maskable, os.path.join(icons_dir, 'icon-512x512-maskable.png'), best_compression)
|
||||
|
||||
# Resize icon512_maskable to 384x384 to generate 384x384 icon maskable
|
||||
icon384_maskable = scale(icon512_maskable, (384, 384))
|
||||
pygame_sdl2.image.save(icon384_maskable, os.path.join(icons_dir, 'icon-384x384-maskable.png'), best_compression)
|
||||
|
||||
# Resize icon512_maskable to 192x192 to generate 192x192 icon maskable
|
||||
icon192_maskable = scale(icon512_maskable, (192, 192))
|
||||
pygame_sdl2.image.save(icon192_maskable, os.path.join(icons_dir, 'icon-192x192-maskable.png'), best_compression)
|
||||
|
||||
# Resize icon512_maskable to 152x152 to generate 152x152 icon maskable
|
||||
icon152_maskable = scale(icon512_maskable, (152, 152))
|
||||
pygame_sdl2.image.save(icon152_maskable, os.path.join(icons_dir, 'icon-152x152-maskable.png'), best_compression)
|
||||
|
||||
# Resize icon512_maskable to 144x144 to generate 144x144 icon maskable
|
||||
icon144_maskable = scale(icon512_maskable, (144, 144))
|
||||
pygame_sdl2.image.save(icon144_maskable, os.path.join(icons_dir, 'icon-144x144-maskable.png'), best_compression)
|
||||
|
||||
# Resize icon512_maskable to 128x128 to generate 128x128 icon maskable
|
||||
icon128_maskable = scale(icon512_maskable, (128, 128))
|
||||
pygame_sdl2.image.save(icon128_maskable, os.path.join(icons_dir, 'icon-128x128-maskable.png'), best_compression)
|
||||
|
||||
# Resize icon512_maskable to 96x96 to generate 96x96 icon maskable
|
||||
icon96_maskable = scale(icon512_maskable, (96, 96))
|
||||
pygame_sdl2.image.save(icon96_maskable, os.path.join(icons_dir, 'icon-96x96-maskable.png'), best_compression)
|
||||
|
||||
# Resize icon512_maskable to 72x72 to generate 72x72 icon maskable
|
||||
icon72_maskable = scale(icon512_maskable, (72, 72))
|
||||
pygame_sdl2.image.save(icon72_maskable, os.path.join(icons_dir, 'icon-72x72-maskable.png'), best_compression)
|
||||
|
||||
def generate_files_catalog(destination):
|
||||
"""
|
||||
Generates a JSON file with information about the game files.
|
||||
This file is used by the service worker to cache the game files.
|
||||
|
||||
:param destination: string, The destination path where the files will be copied to and where
|
||||
game folder is located.
|
||||
:param version: string, the version of the game. Should be the same as the version in the
|
||||
manifest.json file.
|
||||
|
||||
:return: None
|
||||
"""
|
||||
catalog = {
|
||||
"files": [ ],
|
||||
"version": int(time.time())
|
||||
}
|
||||
# Walk through the game folder
|
||||
for root, dirs, files in os.walk(destination):
|
||||
for file in files:
|
||||
# Get the absolute path of the file
|
||||
file_path = os.path.join(root, file)
|
||||
# Convert it to relative path of the file
|
||||
file_name = os.path.relpath(file_path, destination)
|
||||
# Replace backslashes with forward slashes
|
||||
file_name = file_name.replace("\\", "/")
|
||||
# Add the file to the catalog
|
||||
catalog["files"].append(file_name)
|
||||
|
||||
with io.open(os.path.join(destination, "pwa_catalog.json"), 'w', encoding='utf-8') as f:
|
||||
f.write(json.dumps(catalog))
|
||||
|
||||
def prepare_pwa_files(p, destination):
|
||||
"""
|
||||
Replaces in service-worker.js the cache name with the game name and current timestamp.
|
||||
Replace in manifest.json the project name with the ones in the game.
|
||||
"""
|
||||
|
||||
destination = get_web_destination(p)
|
||||
# Open the service-worker.js file
|
||||
with io.open(os.path.join(destination, "service-worker.js"), encoding='utf-8') as f:
|
||||
service_worker = f.read()
|
||||
|
||||
path_filters = []
|
||||
load_filters(p, path_filters)
|
||||
# Use re to slugify the game name, avoiding use of 3rd party libraries
|
||||
slugified_name = re.sub(r'\W+', '-', p.dump['build']['display_name']).lower()
|
||||
service_worker = service_worker.replace('renpy-web-game', slugified_name)
|
||||
|
||||
shutil.move(
|
||||
os.path.join(destination, 'game.zip'),
|
||||
os.path.join(destination, 'game-old.zip'))
|
||||
zin = zipfile.ZipFile(os.path.join(destination, 'game-old.zip'))
|
||||
zout = zipfile.ZipFile(os.path.join(destination, 'game.zip'), 'w')
|
||||
remote_files = {}
|
||||
tmpdir = tempfile.mkdtemp()
|
||||
# Write the file
|
||||
with io.open(os.path.join(destination, "service-worker.js"), 'w', encoding='utf-8') as f:
|
||||
f.write(service_worker)
|
||||
|
||||
for m in zin.infolist():
|
||||
# Open the manifest.json file
|
||||
with io.open(os.path.join(destination, "manifest.json"), encoding='utf-8') as f:
|
||||
manifest = json.load(f)
|
||||
|
||||
base, ext = os.path.splitext(m.filename)
|
||||
|
||||
# Images
|
||||
if (ext.lower() in ('.jpg', '.jpeg', '.png', '.webp')
|
||||
and filters_match(path_filters, m.filename, 'image')):
|
||||
|
||||
zin.extract(m, path=destination)
|
||||
surface = pygame_sdl2.image.load(os.path.join(destination,m.filename))
|
||||
(w,h) = (surface.get_width(),surface.get_height())
|
||||
# Replace the project name with the ones in the game
|
||||
manifest["name"] = p.dump['build']['display_name']
|
||||
|
||||
remote_files[m.filename[len('game/'):]] = 'image {},{}'.format(w,h)
|
||||
screen_size = p.dump.get("size")
|
||||
# If width are smaller than height, set the orientation to portrait. If not, leave it as is.
|
||||
if screen_size[0] < screen_size[1]:
|
||||
manifest["orientation"] = "portrait-primary"
|
||||
|
||||
tmpfile = generate_image_placeholder(surface, tmpdir)
|
||||
placeholder_relpath = os.path.join('_placeholders', m.filename[len('game/'):])
|
||||
zout.write(tmpfile, placeholder_relpath)
|
||||
# Write the file
|
||||
with io.open(os.path.join(destination, "manifest.json"), 'w', encoding='utf-8') as f:
|
||||
f.write(json.dumps(manifest))
|
||||
|
||||
# Musics (but not SFX - no placeholders for short, non-looping sounds)
|
||||
elif (ext.lower() in ('.wav', '.mp2', '.mp3', '.ogg', '.opus')
|
||||
and filters_match(path_filters, m.filename, 'music')):
|
||||
zin.extract(m, path=destination)
|
||||
remote_files[m.filename[len('game/'):]] = 'music -'
|
||||
|
||||
# Voices
|
||||
elif (ext.lower() in ('.wav', '.mp2', '.mp3', '.ogg', '.opus')
|
||||
and filters_match(path_filters, m.filename, 'voice')):
|
||||
zin.extract(m, path=destination)
|
||||
remote_files[m.filename[len('game/'):]] = 'voice -'
|
||||
|
||||
# Videos are currently not supported, strip them if not already
|
||||
elif (ext.lower() in ('.ogv', '.webm', '.mp4', '.mkv', '.avi')):
|
||||
pass
|
||||
|
||||
# Default: keep (extract & recompress to new .zip)
|
||||
else:
|
||||
# Not using zout.writestr(m, zin.read(m)) to avoid MemoryError
|
||||
tmpfile = zin.extract(m, tmpdir)
|
||||
date_time = time.mktime(m.date_time+(0,0,0))
|
||||
os.utime(tmpfile, (date_time,date_time))
|
||||
zout.write(tmpfile, m.filename, m.compress_type)
|
||||
|
||||
# Prepare a list of remote files for renpy.loader
|
||||
remote_files_str = ''
|
||||
for f in sorted(remote_files):
|
||||
remote_files_str += f + "\n"
|
||||
remote_files_str += remote_files[f] + "\n"
|
||||
zout.writestr('game/renpyweb_remote_files.txt',
|
||||
remote_files_str,
|
||||
zipfile.ZIP_DEFLATED)
|
||||
|
||||
# Clean-up
|
||||
shutil.rmtree(tmpdir)
|
||||
zout.close()
|
||||
zin.close()
|
||||
os.unlink(os.path.join(destination, 'game-old.zip'))
|
||||
generate_files_catalog(destination)
|
||||
|
||||
|
||||
def build_web(p, gui=True):
|
||||
@@ -236,28 +419,73 @@ init python:
|
||||
|
||||
os.makedirs(destination, 0o777)
|
||||
|
||||
files_filter = ProgressiveFilter(p)
|
||||
|
||||
# Use the distributor to make game.zip.
|
||||
distribute.Distributor(p, packages=[ "web" ], packagedest=os.path.join(destination, "game"), reporter=reporter, noarchive=True, scan=False)
|
||||
distribute.Distributor(p, packages=[ "web" ], packagedest=os.path.join(destination, "game"),
|
||||
reporter=reporter, noarchive=True, scan=False, files_filter=files_filter)
|
||||
|
||||
reporter.info(_("Preparing progressive download"))
|
||||
repack_for_progressive_download(p)
|
||||
files_filter.finalize()
|
||||
|
||||
# Copy the files from WEB_PATH to destination.
|
||||
for fn in os.listdir(WEB_PATH):
|
||||
if fn in { "game.zip", "hash.txt", "index.html" }:
|
||||
if fn in { "game.zip", "hash.txt", "index.html", "pwa_icon.png" }:
|
||||
continue
|
||||
|
||||
shutil.copy(os.path.join(WEB_PATH, fn), os.path.join(destination, fn))
|
||||
|
||||
# Find the presplash and copy it over.
|
||||
presplash = None
|
||||
|
||||
if not PY2:
|
||||
for fn in [ "web-presplash.png", "web-presplash.jpg", "web-presplash.webp" ]:
|
||||
fullfn = os.path.join(project.current.path, fn)
|
||||
|
||||
if os.path.exists(fullfn):
|
||||
presplash = fn
|
||||
break
|
||||
|
||||
if presplash:
|
||||
os.unlink(os.path.join(destination, "web-presplash.jpg"))
|
||||
shutil.copy(os.path.join(project.current.path, presplash), os.path.join(destination, presplash))
|
||||
|
||||
# Copy over index.html.
|
||||
with io.open(os.path.join(WEB_PATH, "index.html"), encoding='utf-8') as f:
|
||||
html = f.read()
|
||||
|
||||
html = html.replace("%%TITLE%%", display_name)
|
||||
if PY2:
|
||||
html = html.replace("%%TITLE%%", display_name)
|
||||
else:
|
||||
html = html.replace("Ren'Py Web Game", display_name)
|
||||
|
||||
if presplash:
|
||||
html = html.replace("web-presplash.jpg", presplash)
|
||||
|
||||
with io.open(os.path.join(destination, "index.html"), "w", encoding='utf-8') as f:
|
||||
f.write(html)
|
||||
|
||||
if not PY2:
|
||||
generate_pwa_icons(p, destination)
|
||||
prepare_pwa_files(p, destination)
|
||||
|
||||
# Zip up the game.
|
||||
|
||||
zip_targets = [ ]
|
||||
|
||||
for dn, dirs, files in os.walk(destination):
|
||||
for directory in dirs:
|
||||
zip_targets.append(os.path.join(dn, directory))
|
||||
for file in files:
|
||||
zip_targets.append(os.path.join(dn, file))
|
||||
|
||||
with zipfile.ZipFile(destination + ".zip", 'w') as zf:
|
||||
for i, target in enumerate(zip_targets):
|
||||
zf.write(target, os.path.relpath(target, destination))
|
||||
reporter.progress(_("Creating package..."), i + 1, len(zip_targets))
|
||||
|
||||
# Start the web server.
|
||||
|
||||
webserver.start(destination)
|
||||
|
||||
|
||||
@@ -331,19 +559,11 @@ screen web():
|
||||
|
||||
text _("Images and music can be downloaded while playing. A 'progressive_download.txt' file will be created so you can configure this behavior.")
|
||||
|
||||
add SPACER
|
||||
|
||||
text _("Current limitations in the web platform mean that loading large images may cause audio or framerate glitches, and lower performance in general. Movies aren't supported.")
|
||||
|
||||
|
||||
textbutton _("Return") action Jump("front_page") style "l_left_button"
|
||||
|
||||
label web:
|
||||
|
||||
if not PY2:
|
||||
$ interface.info(_("This feature is not supported in Ren'Py 8."), _("We will restore support in a future release of Ren'Py 8. Until then, please use Ren'Py 7 for web support."))
|
||||
return
|
||||
|
||||
if WEB_PATH is None:
|
||||
$ interface.yesno(_("Before packaging web apps, you'll need to download RenPyWeb, Ren'Py's web support. Would you like to download RenPyWeb now?"), no=Jump("front_page"))
|
||||
$ add_dlc("web", restart=True)
|
||||
|
||||
@@ -10,6 +10,7 @@ import sys
|
||||
import shutil
|
||||
import mimetypes
|
||||
import io
|
||||
import hashlib
|
||||
|
||||
# The path to the root of the web server.
|
||||
root = ""
|
||||
@@ -84,19 +85,44 @@ class WebHandler(http.server.BaseHTTPRequestHandler):
|
||||
# newline translations, making the actual size of the content
|
||||
# transmitted *less* than the content-length!
|
||||
f = open(path, 'rb')
|
||||
fs = os.fstat(f.fileno())
|
||||
except IOError:
|
||||
self.send_error(404, "File not found")
|
||||
return None
|
||||
try:
|
||||
|
||||
last_modified = self.date_time_string(fs.st_mtime)
|
||||
|
||||
ims = self.headers.get("If-Modified-Since", None)
|
||||
if (ims is not None) and (ims == last_modified):
|
||||
self.send_response(304)
|
||||
self.end_headers()
|
||||
return None
|
||||
|
||||
hash = hashlib.md5()
|
||||
|
||||
while True:
|
||||
data = f.read(1024 * 1024)
|
||||
if not data:
|
||||
break
|
||||
hash.update(data)
|
||||
|
||||
f.seek(0)
|
||||
|
||||
etag = '"{}"'.format(hash.hexdigest())
|
||||
|
||||
if self.headers.get("If-None-Match", None) == etag:
|
||||
self.send_response(304)
|
||||
self.end_headers()
|
||||
return None
|
||||
|
||||
self.send_response(200)
|
||||
self.send_header("Content-type", ctype)
|
||||
fs = os.fstat(f.fileno())
|
||||
|
||||
# Ren'Py - bust cache.
|
||||
self.send_header("Pragma", "no-cache")
|
||||
|
||||
self.send_header("Cache-Control", "max-age=0, must-revalidate")
|
||||
self.send_header("Content-Length", str(fs[6]))
|
||||
self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
|
||||
self.send_header("ETag", etag)
|
||||
self.end_headers()
|
||||
return f
|
||||
except Exception:
|
||||
@@ -220,7 +246,22 @@ class WebHandler(http.server.BaseHTTPRequestHandler):
|
||||
'.htm': 'text/html',
|
||||
'.html': 'text/html',
|
||||
'.js': 'application/javascript',
|
||||
}
|
||||
'.wasm': 'application/wasm',
|
||||
'.avi': 'video/x-msvideo',
|
||||
'.m1v': 'video/mpeg',
|
||||
'.m2v': 'video/mpeg',
|
||||
'.m4v': 'video/mp4',
|
||||
'.mkv': 'video/x-matroska',
|
||||
'.mp4': 'video/mp4',
|
||||
'.mpe': 'video/mpeg',
|
||||
'.mpeg': 'video/mpeg',
|
||||
'.mpg': 'video/mpeg',
|
||||
'.mpg4': 'video/mp4',
|
||||
'.mpv': 'video/x-matroska',
|
||||
'.ogv': 'video/ogg',
|
||||
'.webm': 'video/webm',
|
||||
'.wmv': 'video/x-ms-wmv',
|
||||
}
|
||||
|
||||
|
||||
def run():
|
||||
|
||||
@@ -60,7 +60,6 @@ int renpy_IMG_SavePNG_RW(SDL_RWops *src, SDL_Surface *surf,int compression){
|
||||
SDL_PixelFormat *fmt=NULL;
|
||||
SDL_Surface *tempsurf=NULL;
|
||||
int ret;
|
||||
unsigned int i;
|
||||
png_colorp palette;
|
||||
Uint8 *palette_alpha=NULL;
|
||||
png_byte **row_pointers=NULL;
|
||||
@@ -149,7 +148,7 @@ int renpy_IMG_SavePNG_RW(SDL_RWops *src, SDL_Surface *surf,int compression){
|
||||
}
|
||||
}
|
||||
|
||||
for(i=0;i < surf->h;i++){
|
||||
for(int i=0;i < surf->h;i++){
|
||||
row_pointers[i]= ((png_byte*) surf->pixels) + i * surf->pitch;
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -1,9 +1,10 @@
|
||||
_renpy gen/_renpy.c IMG_savepng.c core.c
|
||||
_renpybidi gen/_renpybidi.c renpybidicore.c
|
||||
renpy.audio.renpysound gen/renpy.audio.renpysound.c renpysound_core.c ffmedia.c
|
||||
renpy.parsersupport gen/renpy.parsersupport.c
|
||||
renpy.lexersupport gen/renpy.lexersupport.c
|
||||
renpy.pydict gen/renpy.pydict.c
|
||||
renpy.style gen/renpy.style.c
|
||||
renpy.encryption gen/renpy.encryption.c
|
||||
renpy.compat.dictviews gen/renpy.compat.dictviews.c
|
||||
renpy.styledata.styleclass gen/renpy.styledata.styleclass.c
|
||||
renpy.styledata.stylesets gen/renpy.styledata.stylesets.c
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
# -*- python -*-
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
cdef extern from "fribidi.h":
|
||||
cdef extern from "fribidi/fribidi.h":
|
||||
int FRIBIDI_TYPE_LTR
|
||||
int FRIBIDI_TYPE_ON
|
||||
int FRIBIDI_TYPE_RTL
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2004-2022 Tom Rothamel <pytom@bishoujo.us>
|
||||
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
|
||||
+24
-50
@@ -51,9 +51,9 @@ void pixellate32_core(PyObject *pysrc,
|
||||
SDL_Surface *dst;
|
||||
|
||||
int x, y, i, j;
|
||||
Uint32 srcpitch, dstpitch;
|
||||
Uint32 srcw, srch;
|
||||
Uint32 dstw, dsth;
|
||||
int srcpitch, dstpitch;
|
||||
int srcw, srch;
|
||||
int dstw, dsth;
|
||||
int vw, vh;
|
||||
|
||||
unsigned char *srcpixels;
|
||||
@@ -193,9 +193,9 @@ void pixellate24_core(PyObject *pysrc,
|
||||
SDL_Surface *dst;
|
||||
|
||||
int x, y, i, j;
|
||||
Uint32 srcpitch, dstpitch;
|
||||
Uint32 srcw, srch;
|
||||
Uint32 dstw, dsth;
|
||||
int srcpitch, dstpitch;
|
||||
int srcw, srch;
|
||||
int dstw, dsth;
|
||||
int vw, vh;
|
||||
|
||||
unsigned char *srcpixels;
|
||||
@@ -322,9 +322,8 @@ void map32_core(PyObject *pysrc,
|
||||
SDL_Surface *dst;
|
||||
|
||||
int x, y;
|
||||
Uint32 srcpitch, dstpitch;
|
||||
Uint32 srcw, srch;
|
||||
Uint32 dstw, dsth;
|
||||
int srcpitch, dstpitch;
|
||||
int srcw, srch;
|
||||
|
||||
char *srcpixels;
|
||||
char *dstpixels;
|
||||
@@ -344,9 +343,7 @@ void map32_core(PyObject *pysrc,
|
||||
srcpitch = src->pitch;
|
||||
dstpitch = dst->pitch;
|
||||
srcw = src->w;
|
||||
dstw = dst->w;
|
||||
srch = src->h;
|
||||
dsth = dst->h;
|
||||
|
||||
srcrow = srcpixels;
|
||||
dstrow = dstpixels;
|
||||
@@ -381,9 +378,8 @@ void map24_core(PyObject *pysrc,
|
||||
SDL_Surface *dst;
|
||||
|
||||
int x, y;
|
||||
Uint32 srcpitch, dstpitch;
|
||||
Uint32 srcw, srch;
|
||||
Uint32 dstw, dsth;
|
||||
int srcpitch, dstpitch;
|
||||
int srcw, srch;
|
||||
|
||||
char *srcpixels;
|
||||
char *dstpixels;
|
||||
@@ -403,9 +399,7 @@ void map24_core(PyObject *pysrc,
|
||||
srcpitch = src->pitch;
|
||||
dstpitch = dst->pitch;
|
||||
srcw = src->w;
|
||||
dstw = dst->w;
|
||||
srch = src->h;
|
||||
dsth = dst->h;
|
||||
|
||||
srcrow = srcpixels;
|
||||
dstrow = dstpixels;
|
||||
@@ -446,9 +440,8 @@ void linmap32_core(PyObject *pysrc,
|
||||
SDL_Surface *dst;
|
||||
|
||||
int x, y;
|
||||
Uint32 srcpitch, dstpitch;
|
||||
Uint32 srcw, srch;
|
||||
Uint32 dstw, dsth;
|
||||
int srcpitch, dstpitch;
|
||||
int srcw, srch;
|
||||
|
||||
char *srcpixels;
|
||||
char *dstpixels;
|
||||
@@ -468,9 +461,7 @@ void linmap32_core(PyObject *pysrc,
|
||||
srcpitch = src->pitch;
|
||||
dstpitch = dst->pitch;
|
||||
srcw = src->w;
|
||||
dstw = dst->w;
|
||||
srch = src->h;
|
||||
dsth = dst->h;
|
||||
|
||||
srcrow = srcpixels;
|
||||
dstrow = dstpixels;
|
||||
@@ -505,9 +496,8 @@ void linmap24_core(PyObject *pysrc,
|
||||
SDL_Surface *dst;
|
||||
|
||||
int x, y;
|
||||
Uint32 srcpitch, dstpitch;
|
||||
Uint32 srcw, srch;
|
||||
Uint32 dstw, dsth;
|
||||
int srcpitch, dstpitch;
|
||||
int srcw, srch;
|
||||
|
||||
char *srcpixels;
|
||||
char *dstpixels;
|
||||
@@ -527,9 +517,7 @@ void linmap24_core(PyObject *pysrc,
|
||||
srcpitch = src->pitch;
|
||||
dstpitch = dst->pitch;
|
||||
srcw = src->w;
|
||||
dstw = dst->w;
|
||||
srch = src->h;
|
||||
dsth = dst->h;
|
||||
|
||||
srcrow = srcpixels;
|
||||
dstrow = dstpixels;
|
||||
@@ -653,8 +641,8 @@ void linblur32_core(PyObject *pysrc,
|
||||
SDL_Surface *src;
|
||||
SDL_Surface *dst;
|
||||
|
||||
Uint32 rows, cols;
|
||||
Uint32 incr, skip;
|
||||
int rows, cols;
|
||||
int incr, skip;
|
||||
|
||||
unsigned char *srcpixels;
|
||||
unsigned char *dstpixels;
|
||||
@@ -793,8 +781,8 @@ void linblur24_core(PyObject *pysrc,
|
||||
SDL_Surface *src;
|
||||
SDL_Surface *dst;
|
||||
|
||||
Uint32 rows, cols;
|
||||
Uint32 incr, skip;
|
||||
int rows, cols;
|
||||
int incr, skip;
|
||||
|
||||
unsigned char *srcpixels;
|
||||
unsigned char *dstpixels;
|
||||
@@ -928,9 +916,8 @@ void alphamunge_core(PyObject *pysrc,
|
||||
SDL_Surface *src;
|
||||
SDL_Surface *dst;
|
||||
|
||||
Uint32 srcpitch, dstpitch;
|
||||
Uint32 srcw, srch;
|
||||
Uint32 dstw, dsth;
|
||||
int srcpitch, dstpitch;
|
||||
int dstw, dsth;
|
||||
|
||||
unsigned char *srcpixels;
|
||||
unsigned char *dstpixels;
|
||||
@@ -951,9 +938,7 @@ void alphamunge_core(PyObject *pysrc,
|
||||
dstpixels = (unsigned char *) dst->pixels;
|
||||
srcpitch = src->pitch;
|
||||
dstpitch = dst->pitch;
|
||||
srcw = src->w;
|
||||
dstw = dst->w;
|
||||
srch = src->h;
|
||||
dsth = dst->h;
|
||||
|
||||
|
||||
@@ -996,9 +981,8 @@ void scale32_core(PyObject *pysrc, PyObject *pydst,
|
||||
SDL_Surface *dst;
|
||||
|
||||
int y;
|
||||
Uint32 srcpitch, dstpitch;
|
||||
Uint32 srcw, srch;
|
||||
Uint32 dstw, dsth;
|
||||
int srcpitch, dstpitch;
|
||||
int dstw, dsth;
|
||||
float xdelta, ydelta;
|
||||
|
||||
unsigned char *srcpixels;
|
||||
@@ -1014,9 +998,7 @@ void scale32_core(PyObject *pysrc, PyObject *pydst,
|
||||
dstpixels = (unsigned char *) dst->pixels;
|
||||
srcpitch = src->pitch;
|
||||
dstpitch = dst->pitch;
|
||||
srcw = src->w;
|
||||
dstw = dst->w;
|
||||
srch = src->h;
|
||||
dsth = dst->h;
|
||||
|
||||
if (precise) {
|
||||
@@ -1041,7 +1023,6 @@ void scale32_core(PyObject *pysrc, PyObject *pydst,
|
||||
for (y = 0; y < dsth; y++) {
|
||||
|
||||
unsigned char *s0;
|
||||
unsigned char *s1;
|
||||
unsigned char *d;
|
||||
unsigned char *dend;
|
||||
|
||||
@@ -1058,7 +1039,6 @@ void scale32_core(PyObject *pysrc, PyObject *pydst,
|
||||
s0frac = 256 - s1frac;
|
||||
|
||||
s0 = srcpixels + (sline >> 8) * srcpitch;
|
||||
s1 = s0 + srcpitch;
|
||||
|
||||
scol = source_xoff * 256 + dest_xoff * xdelta;
|
||||
|
||||
@@ -1109,15 +1089,13 @@ void scale24_core(PyObject *pysrc, PyObject *pydst,
|
||||
SDL_Surface *dst;
|
||||
|
||||
int y;
|
||||
Uint32 srcpitch, dstpitch;
|
||||
Uint32 srcw, srch;
|
||||
Uint32 dstw, dsth;
|
||||
int srcpitch, dstpitch;
|
||||
int dstw, dsth;
|
||||
float xdelta, ydelta;
|
||||
|
||||
unsigned char *srcpixels;
|
||||
unsigned char *dstpixels;
|
||||
|
||||
|
||||
src = PySurface_AsSurface(pysrc);
|
||||
dst = PySurface_AsSurface(pydst);
|
||||
|
||||
@@ -1127,9 +1105,7 @@ void scale24_core(PyObject *pysrc, PyObject *pydst,
|
||||
dstpixels = (unsigned char *) dst->pixels;
|
||||
srcpitch = src->pitch;
|
||||
dstpitch = dst->pitch;
|
||||
srcw = src->w;
|
||||
dstw = dst->w;
|
||||
srch = src->h;
|
||||
dsth = dst->h;
|
||||
|
||||
xdelta = 255.0 * (source_width - 1) / dest_width;
|
||||
@@ -1138,7 +1114,6 @@ void scale24_core(PyObject *pysrc, PyObject *pydst,
|
||||
for (y = 0; y < dsth; y++) {
|
||||
|
||||
unsigned char *s0;
|
||||
unsigned char *s1;
|
||||
unsigned char *d;
|
||||
unsigned char *dend;
|
||||
|
||||
@@ -1155,7 +1130,6 @@ void scale24_core(PyObject *pysrc, PyObject *pydst,
|
||||
s0frac = 256 - s1frac;
|
||||
|
||||
s0 = srcpixels + (sline >> 8) * srcpitch;
|
||||
s1 = s0 + srcpitch;
|
||||
|
||||
scol = source_xoff * 255 + dest_xoff * xdelta;
|
||||
|
||||
|
||||
+131
-182
@@ -56,7 +56,7 @@ static SDL_Surface *rgba_surface = NULL;
|
||||
|
||||
/*******************************************************************************
|
||||
* SDL_RWops <-> AVIOContext
|
||||
* */
|
||||
*/
|
||||
|
||||
static int rwops_read(void *opaque, uint8_t *buf, int buf_size) {
|
||||
SDL_RWops *rw = (SDL_RWops *) opaque;
|
||||
@@ -116,9 +116,14 @@ static void rwops_close(SDL_RWops *rw) {
|
||||
|
||||
static double current_time = 0;
|
||||
|
||||
typedef struct PacketQueueEntry {
|
||||
AVPacket *pkt;
|
||||
struct PacketQueueEntry *next;
|
||||
} PacketQueueEntry;
|
||||
|
||||
typedef struct PacketQueue {
|
||||
AVPacketList *first;
|
||||
AVPacketList *last;
|
||||
PacketQueueEntry *first;
|
||||
PacketQueueEntry *last;
|
||||
} PacketQueue;
|
||||
|
||||
typedef struct FrameQueue {
|
||||
@@ -200,13 +205,10 @@ typedef struct MediaState {
|
||||
AVCodecContext *video_context;
|
||||
AVCodecContext *audio_context;
|
||||
|
||||
/* Queues of packets going to the audio and video
|
||||
* streams.
|
||||
*/
|
||||
/* Queues of packets going to the audio and video streams. */
|
||||
PacketQueue video_packet_queue;
|
||||
PacketQueue audio_packet_queue;
|
||||
|
||||
|
||||
/* The total duration of the video. Only used for information purposes. */
|
||||
double total_duration;
|
||||
|
||||
@@ -239,11 +241,6 @@ typedef struct MediaState {
|
||||
/* A frame that video is decoded into. */
|
||||
AVFrame *video_decode_frame;
|
||||
|
||||
/* The video packet we're decoding, and the partial packet. */
|
||||
AVPacket video_pkt;
|
||||
AVPacket video_pkt_tmp;
|
||||
|
||||
|
||||
/* Video Stuff ***********************************************************/
|
||||
|
||||
/* Software rescaling context. */
|
||||
@@ -268,7 +265,6 @@ typedef struct MediaState {
|
||||
/* The offset between now and the time of the current frame, at least for video. */
|
||||
double time_offset;
|
||||
|
||||
|
||||
} MediaState;
|
||||
|
||||
static AVFrame *dequeue_frame(FrameQueue *fq);
|
||||
@@ -310,8 +306,6 @@ static void deallocate(MediaState *ms) {
|
||||
av_frame_free(&ms->video_decode_frame);
|
||||
}
|
||||
|
||||
av_packet_unref(&ms->video_pkt);
|
||||
|
||||
/* Destroy audio stuff. */
|
||||
if (ms->swr) {
|
||||
swr_free(&ms->swr);
|
||||
@@ -404,6 +398,8 @@ static void deallocate_deferred() {
|
||||
SDL_UnlockMutex(deallocate_mutex);
|
||||
}
|
||||
|
||||
/* Frame queue ***************************************************************/
|
||||
|
||||
static void enqueue_frame(FrameQueue *fq, AVFrame *frame) {
|
||||
frame->opaque = NULL;
|
||||
|
||||
@@ -431,68 +427,109 @@ static AVFrame *dequeue_frame(FrameQueue *fq) {
|
||||
}
|
||||
|
||||
|
||||
/* Packet queue **************************************************************/
|
||||
|
||||
static void enqueue_packet(PacketQueue *pq, AVPacket *pkt) {
|
||||
AVPacketList *pl = av_malloc(sizeof(AVPacketList));
|
||||
if (pl == NULL)
|
||||
{
|
||||
PacketQueueEntry *pqe = av_malloc(sizeof(PacketQueueEntry));
|
||||
if (pqe == NULL) {
|
||||
av_packet_free(&pkt);
|
||||
return;
|
||||
}
|
||||
|
||||
av_init_packet(&pl->pkt);
|
||||
av_packet_ref(&pl->pkt, pkt);
|
||||
|
||||
pl->next = NULL;
|
||||
pqe->pkt = pkt;
|
||||
pqe->next = NULL;
|
||||
|
||||
if (!pq->first) {
|
||||
pq->first = pq->last = pl;
|
||||
pq->first = pq->last = pqe;
|
||||
} else {
|
||||
pq->last->next = pl;
|
||||
pq->last = pl;
|
||||
pq->last->next = pqe;
|
||||
pq->last = pqe;
|
||||
}
|
||||
}
|
||||
|
||||
static int dequeue_packet(PacketQueue *pq, AVPacket *pkt) {
|
||||
if (! pq->first ) {
|
||||
return 0;
|
||||
static AVPacket *first_packet(PacketQueue *pq) {
|
||||
if (pq->first) {
|
||||
return pq->first->pkt;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void dequeue_packet(PacketQueue *pq) {
|
||||
if (! pq->first) {
|
||||
return;
|
||||
}
|
||||
|
||||
AVPacketList *pl = pq->first;
|
||||
|
||||
av_packet_move_ref(pkt, &pl->pkt);
|
||||
|
||||
pq->first = pl->next;
|
||||
PacketQueueEntry *pqe = pq->first;
|
||||
pq->first = pqe->next;
|
||||
|
||||
if (!pq->first) {
|
||||
pq->last = NULL;
|
||||
}
|
||||
|
||||
av_free(pl);
|
||||
|
||||
return 1;
|
||||
av_packet_free(&pqe->pkt);
|
||||
av_free(pqe);
|
||||
}
|
||||
|
||||
static int count_packet_queue(PacketQueue *pq) {
|
||||
AVPacketList *pl = pq->first;
|
||||
PacketQueueEntry *pqe = pq->first;
|
||||
|
||||
int rv = 0;
|
||||
int rv = 0;
|
||||
|
||||
while (pl) {
|
||||
rv += 1;
|
||||
pl = pl->next;
|
||||
}
|
||||
while (pqe) {
|
||||
rv += 1;
|
||||
pqe = pqe->next;
|
||||
}
|
||||
|
||||
return rv;
|
||||
return rv;
|
||||
}
|
||||
|
||||
static void free_packet_queue(PacketQueue *pq) {
|
||||
AVPacket scratch;
|
||||
|
||||
av_init_packet(&scratch);
|
||||
|
||||
while (dequeue_packet(pq, &scratch)) {
|
||||
av_packet_unref(&scratch);
|
||||
while(first_packet(pq)) {
|
||||
dequeue_packet(pq);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reads a packet from one of the queues, filling the other queue if
|
||||
* necessary. Returns the packet, or NULL if end of file has been reached.
|
||||
*/
|
||||
static AVPacket *read_packet(MediaState *ms, PacketQueue *pq) {
|
||||
|
||||
AVPacket *pkt;
|
||||
AVPacket *rv;
|
||||
|
||||
while (1) {
|
||||
|
||||
rv = first_packet(pq);
|
||||
if (rv) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
pkt = av_packet_alloc();
|
||||
|
||||
if (!pkt) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (av_read_frame(ms->ctx, pkt)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (pkt->stream_index == ms->video_stream && ! ms->video_finished) {
|
||||
enqueue_packet(&ms->video_packet_queue, pkt);
|
||||
} else if (pkt->stream_index == ms->audio_stream && ! ms->audio_finished) {
|
||||
enqueue_packet(&ms->audio_packet_queue, pkt);
|
||||
} else {
|
||||
av_packet_free(&pkt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Surface queue *************************************************************/
|
||||
|
||||
static void enqueue_surface(SurfaceQueueEntry **queue, SurfaceQueueEntry *sqe) {
|
||||
while (*queue) {
|
||||
queue = &(*queue)->next;
|
||||
@@ -532,36 +569,7 @@ static void check_surface_queue(MediaState *ms) {
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Reads a packet from one of the queues, filling the other queue if
|
||||
* necessary.
|
||||
*/
|
||||
static int read_packet(MediaState *ms, PacketQueue *pq, AVPacket *pkt) {
|
||||
AVPacket scratch;
|
||||
|
||||
av_init_packet(&scratch);
|
||||
|
||||
while (1) {
|
||||
if (dequeue_packet(pq, pkt)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (av_read_frame(ms->ctx, &scratch)) {
|
||||
pkt->data = NULL;
|
||||
pkt->size = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (scratch.stream_index == ms->video_stream && ! ms->video_finished) {
|
||||
enqueue_packet(&ms->video_packet_queue, &scratch);
|
||||
} else if (scratch.stream_index == ms->audio_stream && ! ms->audio_finished) {
|
||||
enqueue_packet(&ms->audio_packet_queue, &scratch);
|
||||
}
|
||||
|
||||
av_packet_unref(&scratch);
|
||||
}
|
||||
}
|
||||
/* Find decoder context ******************************************************/
|
||||
|
||||
|
||||
static AVCodecContext *find_context(AVFormatContext *ctx, int index) {
|
||||
@@ -613,62 +621,11 @@ fail:
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Given a packet, decodes a frame if possible. This is intended to be a drop-in replacement
|
||||
* for the now deprecated avcodec_decode_audio4/video2 APIs.
|
||||
*
|
||||
* \param[in] context The context the decoding is done in.
|
||||
* \param[out] frame A frame that is updated with the decoded data.
|
||||
* \param[out] got_frame Set to 1 if a frame was decoded, 0 if not.
|
||||
* \param[in] pkt The packet data to present.
|
||||
*
|
||||
* Returns pkt->size if the packet was consumed, 0 if not, or < 0 on error (including
|
||||
* end of file.)
|
||||
*/
|
||||
static int decode_common(AVCodecContext *context, AVFrame *frame, int *got_frame, AVPacket *pkt) {
|
||||
/* Audio decoding *************************************************************/
|
||||
|
||||
int ret;
|
||||
int rv = 0;
|
||||
|
||||
if (pkt) {
|
||||
ret = avcodec_send_packet(context, pkt);
|
||||
|
||||
if (ret >= 0) {
|
||||
rv = pkt->size;
|
||||
} else if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
|
||||
rv = 0;
|
||||
} else {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = avcodec_receive_frame(context, frame);
|
||||
|
||||
if (ret >= 0) {
|
||||
*got_frame = 1;
|
||||
} else if (ret == AVERROR(EAGAIN)) {
|
||||
*got_frame = 0;
|
||||
} else if (ret == AVERROR_EOF) {
|
||||
*got_frame = 0;
|
||||
if (!pkt || pkt->size == 0) {
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
*got_frame = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Decodes audio. Returns 0 if no audio was decoded, or 1 if some audio was
|
||||
* decoded.
|
||||
*/
|
||||
static void decode_audio(MediaState *ms) {
|
||||
AVPacket pkt;
|
||||
AVPacket pkt_temp;
|
||||
int ret;
|
||||
AVPacket *pkt;
|
||||
AVFrame *converted_frame;
|
||||
|
||||
if (!ms->audio_context) {
|
||||
@@ -685,8 +642,6 @@ static void decode_audio(MediaState *ms) {
|
||||
return;
|
||||
}
|
||||
|
||||
av_init_packet(&pkt);
|
||||
|
||||
double timebase = av_q2d(ms->ctx->streams[ms->audio_stream]->time_base);
|
||||
|
||||
if (ms->audio_queue_target_samples < audio_target_samples) {
|
||||
@@ -695,35 +650,31 @@ static void decode_audio(MediaState *ms) {
|
||||
|
||||
while (ms->audio_queue_samples < ms->audio_queue_target_samples) {
|
||||
|
||||
read_packet(ms, &ms->audio_packet_queue, &pkt);
|
||||
/** Read a packet, and send it to the decoder. */
|
||||
pkt = read_packet(ms, &ms->audio_packet_queue);
|
||||
ret = avcodec_send_packet(ms->audio_context, pkt);
|
||||
|
||||
pkt_temp = pkt;
|
||||
if (ret == 0) {
|
||||
dequeue_packet(&ms->audio_packet_queue);
|
||||
} else if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
|
||||
// pass
|
||||
} else {
|
||||
ms->audio_finished = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
do {
|
||||
int got_frame;
|
||||
int read_size = decode_common(ms->audio_context, ms->audio_decode_frame, &got_frame, &pkt_temp);
|
||||
while (1) {
|
||||
|
||||
if (read_size < 0) {
|
||||
ret = avcodec_receive_frame(ms->audio_context, ms->audio_decode_frame);
|
||||
|
||||
if (pkt.data) {
|
||||
av_packet_unref(&pkt);
|
||||
}
|
||||
|
||||
ms->audio_finished = 1;
|
||||
return;
|
||||
// More input is needed.
|
||||
if (ret == AVERROR(EAGAIN)) {
|
||||
break;
|
||||
}
|
||||
|
||||
pkt_temp.data += read_size;
|
||||
pkt_temp.size -= read_size;
|
||||
|
||||
if (!got_frame) {
|
||||
if (pkt.data == NULL) {
|
||||
ms->audio_finished = 1;
|
||||
av_packet_unref(&pkt);
|
||||
return;
|
||||
}
|
||||
|
||||
break;
|
||||
if (ret < 0) {
|
||||
ms->audio_finished = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
converted_frame = av_frame_alloc();
|
||||
@@ -785,18 +736,17 @@ static void decode_audio(MediaState *ms) {
|
||||
}
|
||||
|
||||
SDL_UnlockMutex(ms->lock);
|
||||
|
||||
} while (pkt_temp.size);
|
||||
|
||||
if (pkt.data) {
|
||||
av_packet_unref(&pkt);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Video decoding *************************************************************/
|
||||
|
||||
static enum AVPixelFormat get_pixel_format(SDL_Surface *surf) {
|
||||
uint32_t pixel;
|
||||
uint8_t *bytes = (uint8_t *) &pixel;
|
||||
@@ -819,37 +769,37 @@ static enum AVPixelFormat get_pixel_format(SDL_Surface *surf) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
static SurfaceQueueEntry *decode_video_frame(MediaState *ms) {
|
||||
int ret;
|
||||
|
||||
while (1) {
|
||||
|
||||
if (! ms->video_pkt_tmp.size) {
|
||||
av_packet_unref(&ms->video_pkt);
|
||||
read_packet(ms, &ms->video_packet_queue, &ms->video_pkt);
|
||||
ms->video_pkt_tmp = ms->video_pkt;
|
||||
}
|
||||
AVPacket *pkt = read_packet(ms, &ms->video_packet_queue);
|
||||
ret = avcodec_send_packet(ms->video_context, pkt);
|
||||
|
||||
int got_frame = 0;
|
||||
int read_size = decode_common(ms->video_context, ms->video_decode_frame, &got_frame, &ms->video_pkt_tmp);
|
||||
|
||||
if (read_size < 0) {
|
||||
if (ret == 0) {
|
||||
dequeue_packet(&ms->video_packet_queue);
|
||||
} else if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
|
||||
// pass
|
||||
} else {
|
||||
ms->video_finished = 1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ms->video_pkt_tmp.data += read_size;
|
||||
ms->video_pkt_tmp.size -= read_size;
|
||||
ret = avcodec_receive_frame(ms->video_context, ms->video_decode_frame);
|
||||
|
||||
if (got_frame) {
|
||||
break;
|
||||
// More input is needed.
|
||||
if (ret == AVERROR(EAGAIN)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!got_frame && !ms->video_pkt.size) {
|
||||
if (ret < 0) {
|
||||
ms->video_finished = 1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
double pts = ms->video_decode_frame->best_effort_timestamp * av_q2d(ms->ctx->streams[ms->video_stream]->time_base);
|
||||
@@ -914,7 +864,10 @@ static SurfaceQueueEntry *decode_video_frame(MediaState *ms) {
|
||||
#ifndef USE_POSIX_MEMALIGN
|
||||
rv->pixels = SDL_calloc(rv->pitch * rv->h, 1);
|
||||
#else
|
||||
posix_memalign(&rv->pixels, ROW_ALIGNMENT, rv->pitch * rv->h);
|
||||
if (posix_memalign(&rv->pixels, ROW_ALIGNMENT, rv->pitch * rv->h)) {
|
||||
av_free(rv);
|
||||
return NULL;
|
||||
}
|
||||
memset(rv->pixels, 0, rv->pitch * rv->h);
|
||||
#endif
|
||||
|
||||
@@ -1193,8 +1146,6 @@ static int decode_thread(void *arg) {
|
||||
goto finish;
|
||||
}
|
||||
|
||||
av_init_packet(&ms->video_pkt);
|
||||
|
||||
// Compute the number of samples we need to play back.
|
||||
if (ms->audio_duration < 0) {
|
||||
if (av_fmt_ctx_get_duration_estimation_method(ctx) != AVFMT_DURATION_FROM_BITRATE) {
|
||||
@@ -1355,8 +1306,6 @@ static int decode_sync_start(void *arg) {
|
||||
media_read_sync_finish(ms);
|
||||
}
|
||||
|
||||
av_init_packet(&ms->video_pkt);
|
||||
|
||||
// Compute the number of samples we need to play back.
|
||||
if (ms->audio_duration < 0) {
|
||||
if (av_fmt_ctx_get_duration_estimation_method(ctx) != AVFMT_DURATION_FROM_BITRATE) {
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
behdad: Behdad Esfahbod <behdad@gnu.org>
|
||||
#
|
||||
# Behdad Esfahbod is the only author that actually codes these days. He
|
||||
# maintains the package too. He has revised all of the code written by
|
||||
# others, and has written much of the code himself. He's listed (or should
|
||||
# be listed) on every file in the package as one of the authors. Behdad
|
||||
# designs, implements, documents, maintains, ...
|
||||
#
|
||||
|
||||
dov-g: Dov Grobgeld <dov@imagic.weizmann.ac.il>
|
||||
#
|
||||
# Dov Grobgeld originally wrote FriBidi. The 0.1.* releases were all done
|
||||
# by him. After that, Dov rarely touched the code, but contributed ideas.
|
||||
# All files that he has originally authored have him listed as an author in
|
||||
# the header of the file.
|
||||
#
|
||||
|
||||
roozbeh: Roozbeh Pournader <roozbeh@gnu.org>
|
||||
#
|
||||
# Roozbeh Pournader hasn't contributed much code to FriBidi personally; but
|
||||
# has maintained, promoted, and supported the project for a while. He has
|
||||
# helped with making GNU FriBidi standards compliant, and has sometimes
|
||||
# lobbied with the Unicode Consortium when needed. Roozbeh was supposed to
|
||||
# be a co-maintainer of GNU FriBidi, but he's not doing that yet.
|
||||
#
|
||||
|
||||
|
||||
#
|
||||
# Note: Other people have contributed significant amounts of code, but
|
||||
# usually the code has faded out because of restructuring and redesigning
|
||||
# things around GNU FriBidi. As an example, the FriBidiEnv patch by Omer
|
||||
# Zak, made itself into FriBidi CVS for a couple of years, but was finally
|
||||
# implemented in a better way by Behdad.
|
||||
#
|
||||
# Note: GNU getopt is distributed with and used in GNU FriBidi under bin/, but
|
||||
# is not part of GNU FriBidi.
|
||||
#
|
||||
# Note: Parts of the Unicode Character Database are distributed with and used
|
||||
# in GNU FriBidi under gen.tab/unidata/, but are not part of GNU FriBidi.
|
||||
#
|
||||
@@ -1,340 +0,0 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
@@ -1,30 +0,0 @@
|
||||
Thanks to:
|
||||
|
||||
Behnam Esfahbod <behnam@esfahbod.info>
|
||||
* Testing and auditing code.
|
||||
|
||||
|
||||
And for the previous versions of FriBidi (pre 2002), thanks to:
|
||||
|
||||
|
||||
Tomas Frydrych <tomas@frydrych.uklinux.net>
|
||||
* Contirbuted patches for compiling GNU FriBidi under other OSes.
|
||||
|
||||
Dov Grobgeld <dov@imagic.weizmann.ac.il>
|
||||
* Initial author, and maintainer before the 0.9 releases.
|
||||
|
||||
Franck Portaneri
|
||||
* For the Mozilla BiDi languges support document;
|
||||
|
||||
Roozbeh Pournader <roozbeh@sharif.edu>
|
||||
* Fixed things here and there.
|
||||
|
||||
Pablo Saratxaga <pablo@mandrakesoft.com>
|
||||
* Contributed several Arabic charset converters.
|
||||
|
||||
Owen Tayler <otaylor@redhat.com>
|
||||
* Contributed very important memory leak and speed patches.
|
||||
|
||||
Omer Zak <omerz@actcom.co.il>
|
||||
* Contributed several bug fixes, and several considerations for
|
||||
embedded systems.
|
||||
@@ -1,105 +0,0 @@
|
||||
/* config.h. Generated from config.h.in by configure. */
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define to 1 if you want to include debug code in the library */
|
||||
#define DEBUG 1
|
||||
|
||||
/* Define to 1 if you have the <asm/page.h> header file. */
|
||||
/* #undef HAVE_ASM_PAGE_H */
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#define HAVE_DLFCN_H 1
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the `memmove' function. */
|
||||
#define HAVE_MEMMOVE 1
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#define HAVE_MEMORY_H 1
|
||||
|
||||
/* Define to 1 if you have the `memset' function. */
|
||||
#define HAVE_MEMSET 1
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the `strdup' function. */
|
||||
#define HAVE_STRDUP 1
|
||||
|
||||
/* Define to 1 if cpp supports the ANSI # stringizing operator. */
|
||||
#define HAVE_STRINGIZE 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/times.h> header file. */
|
||||
#define HAVE_SYS_TIMES_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to 1 if you have the <wchar.h> header file. */
|
||||
#define HAVE_WCHAR_H 1
|
||||
|
||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||
*/
|
||||
#define LT_OBJDIR ".libs/"
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "fribidi"
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT "http://fribidi.org/bug"
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME "GNU FriBidi"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "GNU FriBidi 0.19.2"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "fribidi"
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "0.19.2"
|
||||
|
||||
/* Define as the return type of signal handlers (`int' or `void'). */
|
||||
#define RETSIGTYPE void
|
||||
|
||||
/* The size of `int', as computed by sizeof. */
|
||||
#define SIZEOF_INT 4
|
||||
|
||||
/* The size of `short', as computed by sizeof. */
|
||||
#define SIZEOF_SHORT 2
|
||||
|
||||
/* The size of `void *', as computed by sizeof. */
|
||||
#define SIZEOF_VOID_P 8
|
||||
|
||||
/* The size of `wchar_t', as computed by sizeof. */
|
||||
#define SIZEOF_WCHAR_T 4
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Define to 1 if you want to use simple mallocs instead of memory chunks */
|
||||
/* #undef USE_SIMPLE_MALLOC */
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "0.19.2"
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
/* #undef const */
|
||||
@@ -1,94 +0,0 @@
|
||||
/* The tables in this file should all be sorted on their first item. */
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
|
||||
const PairMap mandatory_liga_table[] = {
|
||||
{{0xFEDF, 0xFE82}, 0xFEF5},
|
||||
{{0xFEDF, 0xFE84}, 0xFEF7},
|
||||
{{0xFEDF, 0xFE88}, 0xFEF9},
|
||||
{{0xFEDF, 0xFE8E}, 0xFEFB},
|
||||
{{0xFEE0, 0xFE82}, 0xFEF6},
|
||||
{{0xFEE0, 0xFE84}, 0xFEF8},
|
||||
{{0xFEE0, 0xFE88}, 0xFEFA},
|
||||
{{0xFEE0, 0xFE8E}, 0xFEFC},
|
||||
};
|
||||
|
||||
|
||||
const PairMap console_liga_table[] = {
|
||||
{{0x0640, 0xFC60}, 0xFCF2},
|
||||
{{0x0640, 0xFC61}, 0xFCF3},
|
||||
{{0x0640, 0xFC62}, 0xFCF4},
|
||||
{{0x0640, 0xFE70}, 0xFE71},
|
||||
{{0x0640, 0xFE76}, 0xFE77},
|
||||
{{0x0640, 0xFE78}, 0xFE79},
|
||||
{{0x0640, 0xFE7A}, 0xFE7B},
|
||||
{{0x0640, 0xFE7C}, 0xFE7D},
|
||||
{{0x0640, 0xFE7E}, 0xFE7F},
|
||||
{{0xFBE8, 0x0654}, 0xFE8B},
|
||||
{{0xFBE9, 0x0654}, 0xFE8C},
|
||||
{{0xFBFC, 0x0654}, 0xFE89},
|
||||
{{0xFBFC, 0x0670}, 0xFC5D},
|
||||
{{0xFBFD, 0x0654}, 0xFE8A},
|
||||
{{0xFBFD, 0x0670}, 0xFC90},
|
||||
{{0xFE7C, 0x0670}, 0xFC63},
|
||||
{{0xFE7C, 0xFE72}, 0xFC5E},
|
||||
{{0xFE7C, 0xFE74}, 0xFC5F},
|
||||
{{0xFE7C, 0xFE76}, 0xFC60},
|
||||
{{0xFE7C, 0xFE78}, 0xFC61},
|
||||
{{0xFE7C, 0xFE7A}, 0xFC62},
|
||||
{{0xFE7D, 0xFE76}, 0xFCF2},
|
||||
{{0xFE7D, 0xFE77}, 0xFCF2},
|
||||
{{0xFE7D, 0xFE78}, 0xFCF3},
|
||||
{{0xFE7D, 0xFE79}, 0xFCF3},
|
||||
{{0xFE7D, 0xFE7A}, 0xFCF4},
|
||||
{{0xFE7D, 0xFE7B}, 0xFCF4},
|
||||
{{0xFE8D, 0x0653}, 0xFE81},
|
||||
{{0xFE8D, 0x0654}, 0xFE83},
|
||||
{{0xFE8D, 0x0655}, 0xFE87},
|
||||
{{0xFE8D, 0xFE70}, 0xFD3D},
|
||||
{{0xFE8E, 0x0653}, 0xFE82},
|
||||
{{0xFE8E, 0x0654}, 0xFE84},
|
||||
{{0xFE8E, 0x0655}, 0xFE88},
|
||||
{{0xFE8E, 0xFE70}, 0xFD3C},
|
||||
{{0xFEE9, 0x0654}, 0xFBA4},
|
||||
{{0xFEEA, 0x0654}, 0xFBA5},
|
||||
{{0xFEED, 0x0654}, 0xFE85},
|
||||
{{0xFEEE, 0x0654}, 0xFE86},
|
||||
{{0xFEEF, 0x0654}, 0xFE89},
|
||||
{{0xFEEF, 0x0670}, 0xFC5D},
|
||||
{{0xFEF0, 0x0654}, 0xFE8A},
|
||||
{{0xFEF0, 0x0670}, 0xFC90},
|
||||
{{0xFEF1, 0x0654}, 0xFE89},
|
||||
{{0xFEF1, 0x0670}, 0xFC5D},
|
||||
{{0xFEF2, 0x0654}, 0xFE8A},
|
||||
{{0xFEF2, 0x0670}, 0xFC90},
|
||||
{{0xFEF3, 0x0654}, 0xFE8B},
|
||||
{{0xFEF4, 0x0654}, 0xFE8C},
|
||||
{{0xFEFB, 0x0653}, 0xFEF5},
|
||||
{{0xFEFB, 0x0654}, 0xFEF7},
|
||||
{{0xFEFB, 0x0655}, 0xFEF9},
|
||||
{{0xFEFC, 0x0653}, 0xFEF6},
|
||||
{{0xFEFC, 0x0654}, 0xFEF8},
|
||||
{{0xFEFC, 0x0655}, 0xFEFA},
|
||||
};
|
||||
|
||||
|
||||
static const FriBidiChar NSMShap[][4] = {
|
||||
{0xFE70, 0xFE71, 0xFE70, 0xFE71,},
|
||||
{0xFE72, 0xFE72, 0xFE72, 0xFE72,},
|
||||
{0xFE74, 0xFE74, 0xFE74, 0xFE74,},
|
||||
{0xFE76, 0xFE77, 0xFE76, 0xFE77,},
|
||||
{0xFE78, 0xFE79, 0xFE78, 0xFE79,},
|
||||
{0xFE7A, 0xFE7B, 0xFE7A, 0xFE7B,},
|
||||
{0xFE7C, 0xFE7D, 0xFE7C, 0xFE7D,},
|
||||
{0xFE7E, 0xFE7F, 0xFE7E, 0xFE7F,},
|
||||
};
|
||||
|
||||
/* *INDENT-ON* */
|
||||
|
||||
#ifndef FRIBIDI_ACCESS_SHAPE_TABLE
|
||||
# define FRIBIDI_ACCESS_SHAPE_TABLE(table,min,max,x,shape) \
|
||||
(((x)<(min)||(x)>(max))?(x):(table)[(x)-(min)][(shape)])
|
||||
#endif
|
||||
|
||||
#define FRIBIDI_GET_ARABIC_SHAPE_NSM(x,shape) FRIBIDI_ACCESS_SHAPE_TABLE(NSMShap, 0x064B, 0x0652, (x), (shape))
|
||||
@@ -1,205 +0,0 @@
|
||||
/* arabic-shaping.tab.i
|
||||
* generated by gen-arabic-shaping-tab (GNU FriBidi 0.19.1)
|
||||
* from the files UnicodeData.txt, (null) of Unicode version 5.1.0. */
|
||||
|
||||
/*
|
||||
use FRIBIDI_GET_ARABIC_SHAPE_PRES(key,shape) to access your table
|
||||
|
||||
required memory: 2864
|
||||
*/
|
||||
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
|
||||
static const FriBidiChar ArShap[179][4] = {
|
||||
{0xfe80,0x0621,0x0621,0x0621,},
|
||||
{0xfe81,0xfe82,0x0622,0x0622,},
|
||||
{0xfe83,0xfe84,0x0623,0x0623,},
|
||||
{0xfe85,0xfe86,0x0624,0x0624,},
|
||||
{0xfe87,0xfe88,0x0625,0x0625,},
|
||||
{0xfe89,0xfe8a,0xfe8b,0xfe8c,},
|
||||
{0xfe8d,0xfe8e,0x0627,0x0627,},
|
||||
{0xfe8f,0xfe90,0xfe91,0xfe92,},
|
||||
{0xfe93,0xfe94,0x0629,0x0629,},
|
||||
{0xfe95,0xfe96,0xfe97,0xfe98,},
|
||||
{0xfe99,0xfe9a,0xfe9b,0xfe9c,},
|
||||
{0xfe9d,0xfe9e,0xfe9f,0xfea0,},
|
||||
{0xfea1,0xfea2,0xfea3,0xfea4,},
|
||||
{0xfea5,0xfea6,0xfea7,0xfea8,},
|
||||
{0xfea9,0xfeaa,0x062f,0x062f,},
|
||||
{0xfeab,0xfeac,0x0630,0x0630,},
|
||||
{0xfead,0xfeae,0x0631,0x0631,},
|
||||
{0xfeaf,0xfeb0,0x0632,0x0632,},
|
||||
{0xfeb1,0xfeb2,0xfeb3,0xfeb4,},
|
||||
{0xfeb5,0xfeb6,0xfeb7,0xfeb8,},
|
||||
{0xfeb9,0xfeba,0xfebb,0xfebc,},
|
||||
{0xfebd,0xfebe,0xfebf,0xfec0,},
|
||||
{0xfec1,0xfec2,0xfec3,0xfec4,},
|
||||
{0xfec5,0xfec6,0xfec7,0xfec8,},
|
||||
{0xfec9,0xfeca,0xfecb,0xfecc,},
|
||||
{0xfecd,0xfece,0xfecf,0xfed0,},
|
||||
{0x063b,0x063b,0x063b,0x063b,},
|
||||
{0x063c,0x063c,0x063c,0x063c,},
|
||||
{0x063d,0x063d,0x063d,0x063d,},
|
||||
{0x063e,0x063e,0x063e,0x063e,},
|
||||
{0x063f,0x063f,0x063f,0x063f,},
|
||||
{0x0640,0x0640,0x0640,0x0640,},
|
||||
{0xfed1,0xfed2,0xfed3,0xfed4,},
|
||||
{0xfed5,0xfed6,0xfed7,0xfed8,},
|
||||
{0xfed9,0xfeda,0xfedb,0xfedc,},
|
||||
{0xfedd,0xfede,0xfedf,0xfee0,},
|
||||
{0xfee1,0xfee2,0xfee3,0xfee4,},
|
||||
{0xfee5,0xfee6,0xfee7,0xfee8,},
|
||||
{0xfee9,0xfeea,0xfeeb,0xfeec,},
|
||||
{0xfeed,0xfeee,0x0648,0x0648,},
|
||||
{0xfeef,0xfef0,0xfbe8,0xfbe9,},
|
||||
{0xfef1,0xfef2,0xfef3,0xfef4,},
|
||||
{0x064b,0x064b,0x064b,0x064b,},
|
||||
{0x064c,0x064c,0x064c,0x064c,},
|
||||
{0x064d,0x064d,0x064d,0x064d,},
|
||||
{0x064e,0x064e,0x064e,0x064e,},
|
||||
{0x064f,0x064f,0x064f,0x064f,},
|
||||
{0x0650,0x0650,0x0650,0x0650,},
|
||||
{0x0651,0x0651,0x0651,0x0651,},
|
||||
{0x0652,0x0652,0x0652,0x0652,},
|
||||
{0x0653,0x0653,0x0653,0x0653,},
|
||||
{0x0654,0x0654,0x0654,0x0654,},
|
||||
{0x0655,0x0655,0x0655,0x0655,},
|
||||
{0x0656,0x0656,0x0656,0x0656,},
|
||||
{0x0657,0x0657,0x0657,0x0657,},
|
||||
{0x0658,0x0658,0x0658,0x0658,},
|
||||
{0x0659,0x0659,0x0659,0x0659,},
|
||||
{0x065a,0x065a,0x065a,0x065a,},
|
||||
{0x065b,0x065b,0x065b,0x065b,},
|
||||
{0x065c,0x065c,0x065c,0x065c,},
|
||||
{0x065d,0x065d,0x065d,0x065d,},
|
||||
{0x065e,0x065e,0x065e,0x065e,},
|
||||
{0x065f,0x065f,0x065f,0x065f,},
|
||||
{0x0660,0x0660,0x0660,0x0660,},
|
||||
{0x0661,0x0661,0x0661,0x0661,},
|
||||
{0x0662,0x0662,0x0662,0x0662,},
|
||||
{0x0663,0x0663,0x0663,0x0663,},
|
||||
{0x0664,0x0664,0x0664,0x0664,},
|
||||
{0x0665,0x0665,0x0665,0x0665,},
|
||||
{0x0666,0x0666,0x0666,0x0666,},
|
||||
{0x0667,0x0667,0x0667,0x0667,},
|
||||
{0x0668,0x0668,0x0668,0x0668,},
|
||||
{0x0669,0x0669,0x0669,0x0669,},
|
||||
{0x066a,0x066a,0x066a,0x066a,},
|
||||
{0x066b,0x066b,0x066b,0x066b,},
|
||||
{0x066c,0x066c,0x066c,0x066c,},
|
||||
{0x066d,0x066d,0x066d,0x066d,},
|
||||
{0x066e,0x066e,0x066e,0x066e,},
|
||||
{0x066f,0x066f,0x066f,0x066f,},
|
||||
{0x0670,0x0670,0x0670,0x0670,},
|
||||
{0xfb50,0xfb51,0x0671,0x0671,},
|
||||
{0x0672,0x0672,0x0672,0x0672,},
|
||||
{0x0673,0x0673,0x0673,0x0673,},
|
||||
{0x0674,0x0674,0x0674,0x0674,},
|
||||
{0x0675,0x0675,0x0675,0x0675,},
|
||||
{0x0676,0x0676,0x0676,0x0676,},
|
||||
{0xfbdd,0x0677,0x0677,0x0677,},
|
||||
{0x0678,0x0678,0x0678,0x0678,},
|
||||
{0xfb66,0xfb67,0xfb68,0xfb69,},
|
||||
{0xfb5e,0xfb5f,0xfb60,0xfb61,},
|
||||
{0xfb52,0xfb53,0xfb54,0xfb55,},
|
||||
{0x067c,0x067c,0x067c,0x067c,},
|
||||
{0x067d,0x067d,0x067d,0x067d,},
|
||||
{0xfb56,0xfb57,0xfb58,0xfb59,},
|
||||
{0xfb62,0xfb63,0xfb64,0xfb65,},
|
||||
{0xfb5a,0xfb5b,0xfb5c,0xfb5d,},
|
||||
{0x0681,0x0681,0x0681,0x0681,},
|
||||
{0x0682,0x0682,0x0682,0x0682,},
|
||||
{0xfb76,0xfb77,0xfb78,0xfb79,},
|
||||
{0xfb72,0xfb73,0xfb74,0xfb75,},
|
||||
{0x0685,0x0685,0x0685,0x0685,},
|
||||
{0xfb7a,0xfb7b,0xfb7c,0xfb7d,},
|
||||
{0xfb7e,0xfb7f,0xfb80,0xfb81,},
|
||||
{0xfb88,0xfb89,0x0688,0x0688,},
|
||||
{0x0689,0x0689,0x0689,0x0689,},
|
||||
{0x068a,0x068a,0x068a,0x068a,},
|
||||
{0x068b,0x068b,0x068b,0x068b,},
|
||||
{0xfb84,0xfb85,0x068c,0x068c,},
|
||||
{0xfb82,0xfb83,0x068d,0x068d,},
|
||||
{0xfb86,0xfb87,0x068e,0x068e,},
|
||||
{0x068f,0x068f,0x068f,0x068f,},
|
||||
{0x0690,0x0690,0x0690,0x0690,},
|
||||
{0xfb8c,0xfb8d,0x0691,0x0691,},
|
||||
{0x0692,0x0692,0x0692,0x0692,},
|
||||
{0x0693,0x0693,0x0693,0x0693,},
|
||||
{0x0694,0x0694,0x0694,0x0694,},
|
||||
{0x0695,0x0695,0x0695,0x0695,},
|
||||
{0x0696,0x0696,0x0696,0x0696,},
|
||||
{0x0697,0x0697,0x0697,0x0697,},
|
||||
{0xfb8a,0xfb8b,0x0698,0x0698,},
|
||||
{0x0699,0x0699,0x0699,0x0699,},
|
||||
{0x069a,0x069a,0x069a,0x069a,},
|
||||
{0x069b,0x069b,0x069b,0x069b,},
|
||||
{0x069c,0x069c,0x069c,0x069c,},
|
||||
{0x069d,0x069d,0x069d,0x069d,},
|
||||
{0x069e,0x069e,0x069e,0x069e,},
|
||||
{0x069f,0x069f,0x069f,0x069f,},
|
||||
{0x06a0,0x06a0,0x06a0,0x06a0,},
|
||||
{0x06a1,0x06a1,0x06a1,0x06a1,},
|
||||
{0x06a2,0x06a2,0x06a2,0x06a2,},
|
||||
{0x06a3,0x06a3,0x06a3,0x06a3,},
|
||||
{0xfb6a,0xfb6b,0xfb6c,0xfb6d,},
|
||||
{0x06a5,0x06a5,0x06a5,0x06a5,},
|
||||
{0xfb6e,0xfb6f,0xfb70,0xfb71,},
|
||||
{0x06a7,0x06a7,0x06a7,0x06a7,},
|
||||
{0x06a8,0x06a8,0x06a8,0x06a8,},
|
||||
{0xfb8e,0xfb8f,0xfb90,0xfb91,},
|
||||
{0x06aa,0x06aa,0x06aa,0x06aa,},
|
||||
{0x06ab,0x06ab,0x06ab,0x06ab,},
|
||||
{0x06ac,0x06ac,0x06ac,0x06ac,},
|
||||
{0xfbd3,0xfbd4,0xfbd5,0xfbd6,},
|
||||
{0x06ae,0x06ae,0x06ae,0x06ae,},
|
||||
{0xfb92,0xfb93,0xfb94,0xfb95,},
|
||||
{0x06b0,0x06b0,0x06b0,0x06b0,},
|
||||
{0xfb9a,0xfb9b,0xfb9c,0xfb9d,},
|
||||
{0x06b2,0x06b2,0x06b2,0x06b2,},
|
||||
{0xfb96,0xfb97,0xfb98,0xfb99,},
|
||||
{0x06b4,0x06b4,0x06b4,0x06b4,},
|
||||
{0x06b5,0x06b5,0x06b5,0x06b5,},
|
||||
{0x06b6,0x06b6,0x06b6,0x06b6,},
|
||||
{0x06b7,0x06b7,0x06b7,0x06b7,},
|
||||
{0x06b8,0x06b8,0x06b8,0x06b8,},
|
||||
{0x06b9,0x06b9,0x06b9,0x06b9,},
|
||||
{0xfb9e,0xfb9f,0x06ba,0x06ba,},
|
||||
{0xfba0,0xfba1,0xfba2,0xfba3,},
|
||||
{0x06bc,0x06bc,0x06bc,0x06bc,},
|
||||
{0x06bd,0x06bd,0x06bd,0x06bd,},
|
||||
{0xfbaa,0xfbab,0xfbac,0xfbad,},
|
||||
{0x06bf,0x06bf,0x06bf,0x06bf,},
|
||||
{0xfba4,0xfba5,0x06c0,0x06c0,},
|
||||
{0xfba6,0xfba7,0xfba8,0xfba9,},
|
||||
{0x06c2,0x06c2,0x06c2,0x06c2,},
|
||||
{0x06c3,0x06c3,0x06c3,0x06c3,},
|
||||
{0x06c4,0x06c4,0x06c4,0x06c4,},
|
||||
{0xfbe0,0xfbe1,0x06c5,0x06c5,},
|
||||
{0xfbd9,0xfbda,0x06c6,0x06c6,},
|
||||
{0xfbd7,0xfbd8,0x06c7,0x06c7,},
|
||||
{0xfbdb,0xfbdc,0x06c8,0x06c8,},
|
||||
{0xfbe2,0xfbe3,0x06c9,0x06c9,},
|
||||
{0x06ca,0x06ca,0x06ca,0x06ca,},
|
||||
{0xfbde,0xfbdf,0x06cb,0x06cb,},
|
||||
{0xfbfc,0xfbfd,0xfbfe,0xfbff,},
|
||||
{0x06cd,0x06cd,0x06cd,0x06cd,},
|
||||
{0x06ce,0x06ce,0x06ce,0x06ce,},
|
||||
{0x06cf,0x06cf,0x06cf,0x06cf,},
|
||||
{0xfbe4,0xfbe5,0xfbe6,0xfbe7,},
|
||||
{0x06d1,0x06d1,0x06d1,0x06d1,},
|
||||
{0xfbae,0xfbaf,0x06d2,0x06d2,},
|
||||
{0xfbb0,0xfbb1,0x06d3,0x06d3,},
|
||||
};
|
||||
|
||||
/* *INDENT-ON* */
|
||||
|
||||
#ifndef FRIBIDI_ACCESS_SHAPE_TABLE
|
||||
# define FRIBIDI_ACCESS_SHAPE_TABLE(table,min,max,x,shape) \
|
||||
(((x)<(min)||(x)>(max))?(x):(table)[(x)-(min)][(shape)])
|
||||
#endif
|
||||
|
||||
#define FRIBIDI_GET_ARABIC_SHAPE_PRES(x,shape) FRIBIDI_ACCESS_SHAPE_TABLE(ArShap, 0x0621, 0x06d3, (x), (shape))
|
||||
|
||||
/* End of generated arabic-shaping.tab.i */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,61 +0,0 @@
|
||||
/* FriBidi
|
||||
* bidi-types.h - define internal bidi types
|
||||
*
|
||||
* $Id: bidi-types.h,v 1.7 2006/01/31 03:23:12 behdad Exp $
|
||||
* $Author: behdad $
|
||||
* $Date: 2006/01/31 03:23:12 $
|
||||
* $Revision: 1.7 $
|
||||
* $Source: /cvs/fribidi/fribidi2/lib/bidi-types.h,v $
|
||||
*
|
||||
* Author:
|
||||
* Behdad Esfahbod, 2001, 2002, 2004
|
||||
*
|
||||
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
|
||||
* Copyright (C) 2001,2002 Behdad Esfahbod
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library, in a file named COPYING; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA
|
||||
*
|
||||
* For licensing issues, contact <license@farsiweb.info>.
|
||||
*/
|
||||
#ifndef _BIDI_TYPES_H
|
||||
#define _BIDI_TYPES_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <fribidi-types.h>
|
||||
#include <fribidi-bidi-types.h>
|
||||
|
||||
#include <fribidi-begindecls.h>
|
||||
|
||||
#define FRIBIDI_LEVEL_INVALID FRIBIDI_BIDI_MAX_RESOLVED_LEVELS
|
||||
#define FRIBIDI_SENTINEL -1
|
||||
|
||||
#if DEBUG+0
|
||||
|
||||
#define fribidi_char_from_bidi_type FRIBIDI_PRIVATESPACE(char_from_bidi_type)
|
||||
char
|
||||
fribidi_char_from_bidi_type (
|
||||
FriBidiCharType t /* input bidi type */
|
||||
) FRIBIDI_GNUC_HIDDEN;
|
||||
|
||||
#endif /* DEBUG */
|
||||
|
||||
#include <fribidi-enddecls.h>
|
||||
|
||||
#endif /* !_BIDI_TYPES_H */
|
||||
/* Editor directions:
|
||||
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
|
||||
*/
|
||||
@@ -1,190 +0,0 @@
|
||||
/* FriBidi
|
||||
* common.h - common include for library sources
|
||||
*
|
||||
* $Id: common.h,v 1.20 2008-04-08 21:38:23 behdad Exp $
|
||||
* $Author: behdad $
|
||||
* $Date: 2008-04-08 21:38:23 $
|
||||
* $Revision: 1.20 $
|
||||
* $Source: /cvs/fribidi/fribidi2/lib/common.h,v $
|
||||
*
|
||||
* Author:
|
||||
* Behdad Esfahbod, 2004
|
||||
*
|
||||
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library, in a file named COPYING; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA
|
||||
*
|
||||
* For licensing issues, contact <license@farsiweb.info>.
|
||||
*/
|
||||
#ifndef _COMMON_H
|
||||
#define _COMMON_H
|
||||
|
||||
#if HAVE_CONFIG_H+0
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <fribidi-common.h>
|
||||
|
||||
/* FRIBIDI_PRIVATESPACE is a macro used to name library internal symbols. */
|
||||
#ifndef FRIBIDI_PRIVATESPACE
|
||||
# define FRIBIDI_PRIVATESPACE1(A,B) A##B
|
||||
# define FRIBIDI_PRIVATESPACE0(A,B) FRIBIDI_PRIVATESPACE1(A,B)
|
||||
# define FRIBIDI_PRIVATESPACE(SYMBOL) FRIBIDI_PRIVATESPACE0(_,FRIBIDI_NAMESPACE(_##SYMBOL##__internal__))
|
||||
#endif /* !FRIBIDI_PRIVATESPACE */
|
||||
|
||||
#if (defined(WIN32)) || (defined(_WIN32_WCE))
|
||||
# define FRIBIDI_ENTRY __declspec(dllexport)
|
||||
#endif /* WIN32 */
|
||||
|
||||
#if FRIBIDI_USE_GLIB+0
|
||||
# ifndef SIZEOF_LONG
|
||||
# define SIZEOF_LONG GLIB_SIZEOF_LONG
|
||||
# endif /* !SIZEOF_LONG */
|
||||
# ifndef SIZEOF_VOID_P
|
||||
# define SIZEOF_VOID_P GLIB_SIZEOF_VOID_P
|
||||
# endif /* !SIZEOF_VOID_P */
|
||||
# ifndef __FRIBIDI_DOC
|
||||
# include <glib/gmem.h>
|
||||
# endif /* !__FRIBIDI_DOC */
|
||||
# ifndef fribidi_malloc
|
||||
# define fribidi_malloc g_try_malloc
|
||||
# define fribidi_free g_free
|
||||
# endif /* !fribidi_malloc */
|
||||
# ifndef fribidi_assert
|
||||
# ifndef __FRIBIDI_DOC
|
||||
# include <glib/gmessages.h>
|
||||
# endif /* !__FRIBIDI_DOC */
|
||||
# define fribidi_assert g_assert
|
||||
# endif /* !fribidi_assert */
|
||||
# ifndef __FRIBIDI_DOC
|
||||
# include <glib/gmacros.h>
|
||||
# endif /* !__FRIBIDI_DOC */
|
||||
# ifndef FRIBIDI_BEGIN_STMT
|
||||
# define FRIBIDI_BEGIN_STMT G_STMT_START {
|
||||
# define FRIBIDI_END_STMT } G_STMT_END
|
||||
# endif /* !FRIBIDI_BEGIN_STMT */
|
||||
# ifndef LIKELY
|
||||
# define LIKELY G_LIKELY
|
||||
# define UNLIKELY G_UNLIKELY
|
||||
# endif /* !LIKELY */
|
||||
# ifndef false
|
||||
# define false FALSE
|
||||
# endif /* !false */
|
||||
# ifndef true
|
||||
# define true TRUE
|
||||
# endif /* !true */
|
||||
#endif /* FRIBIDI_USE_GLIB */
|
||||
|
||||
#ifndef false
|
||||
# define false (0)
|
||||
# endif /* !false */
|
||||
# ifndef true
|
||||
# define true (!false)
|
||||
# endif /* !true */
|
||||
|
||||
#ifndef NULL
|
||||
# ifdef __cplusplus
|
||||
# define NULL (0L)
|
||||
# else /* !__cplusplus */
|
||||
# define NULL ((void*) 0)
|
||||
# endif /* !__cplusplus */
|
||||
#endif /* !NULL */
|
||||
|
||||
/* fribidi_malloc and fribidi_free should be used instead of malloc and free.
|
||||
* No need to include any headers. */
|
||||
#ifndef fribidi_malloc
|
||||
# if HAVE_STDLIB_H
|
||||
# ifndef __FRIBIDI_DOC
|
||||
# include <stdlib.h>
|
||||
# endif /* __FRIBIDI_DOC */
|
||||
# define fribidi_malloc malloc
|
||||
# else /* !HAVE_STDLIB_H */
|
||||
# define fribidi_malloc (void *) malloc
|
||||
# endif /* !HAVE_STDLIB_H */
|
||||
# define fribidi_free free
|
||||
#else /* fribidi_malloc */
|
||||
# ifndef fribidi_free
|
||||
# error "You should define fribidi_free too when you define fribidi_malloc."
|
||||
# endif /* !fribidi_free */
|
||||
#endif /* fribidi_malloc */
|
||||
|
||||
#if HAVE_STRING_H+0
|
||||
# if !STDC_HEADERS && HAVE_MEMORY_H
|
||||
# include <memory.h>
|
||||
# endif
|
||||
# include <string.h>
|
||||
#endif
|
||||
#if HAVE_STRINGS_H+0
|
||||
# include <strings.h>
|
||||
#endif
|
||||
|
||||
/* FRIBIDI_CHUNK_SIZE is the number of bytes in each chunk of memory being
|
||||
* allocated for data structure pools. */
|
||||
#ifndef FRIBIDI_CHUNK_SIZE
|
||||
# if HAVE_ASM_PAGE_H
|
||||
# ifndef __FRIBIDI_DOC
|
||||
# include <asm/page.h>
|
||||
# endif /* __FRIBIDI_DOC */
|
||||
# define FRIBIDI_CHUNK_SIZE (PAGE_SIZE - 16)
|
||||
# else /* !HAVE_ASM_PAGE_H */
|
||||
# define FRIBIDI_CHUNK_SIZE (4096 - 16)
|
||||
# endif /* !HAVE_ASM_PAGE_H */
|
||||
#else /* FRIBIDI_CHUNK_SIZE */
|
||||
# if FRIBIDI_CHUNK_SIZE < 256
|
||||
# error "FRIBIDI_CHUNK_SIZE now should define the size of a chunk in bytes."
|
||||
# endif /* FRIBIDI_CHUNK_SIZE < 256 */
|
||||
#endif /* FRIBIDI_CHUNK_SIZE */
|
||||
|
||||
/* FRIBIDI_BEGIN_STMT should be used at the beginning of your macro
|
||||
* definitions that are to behave like simple statements. Use
|
||||
* FRIBIDI_END_STMT at the end of the macro after the semicolon or brace. */
|
||||
#ifndef FRIBIDI_BEGIN_STMT
|
||||
# define FRIBIDI_BEGIN_STMT do {
|
||||
# define FRIBIDI_END_STMT } while (0)
|
||||
#endif /* !FRIBIDI_BEGIN_STMT */
|
||||
|
||||
/* LIKEYLY and UNLIKELY are used to give a hint on branch prediction to the
|
||||
* compiler. */
|
||||
#ifndef LIKELY
|
||||
# define LIKELY
|
||||
# define UNLIKELY
|
||||
#endif /* !LIKELY */
|
||||
|
||||
#ifndef FRIBIDI_EMPTY_STMT
|
||||
# define FRIBIDI_EMPTY_STMT FRIBIDI_BEGIN_STMT (void) 0; FRIBIDI_END_STMT
|
||||
#endif /* !FRIBIDI_EMPTY_STMT */
|
||||
|
||||
#if HAVE_STRINGIZE+0
|
||||
# define STRINGIZE(symbol) #symbol
|
||||
#else /* !HAVE_STRINGIZE */
|
||||
# error "No stringize operator available?"
|
||||
#endif /* !HAVE_STRINGIZE */
|
||||
|
||||
/* As per recommendation of GNU Coding Standards. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# define _GNU_SOURCE
|
||||
#endif /* !_GNU_SOURCE */
|
||||
|
||||
/* We respect our own rules. */
|
||||
#define FRIBIDI_NO_DEPRECATED
|
||||
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
#endif /* !_COMMON_H */
|
||||
/* Editor directions:
|
||||
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
|
||||
*/
|
||||
@@ -1,113 +0,0 @@
|
||||
/* FriBidi
|
||||
* debug.h - debug-only interfaces
|
||||
*
|
||||
* $Id: debug.h,v 1.10 2006/01/31 03:23:12 behdad Exp $
|
||||
* $Author: behdad $
|
||||
* $Date: 2006/01/31 03:23:12 $
|
||||
* $Revision: 1.10 $
|
||||
* $Source: /cvs/fribidi/fribidi2/lib/debug.h,v $
|
||||
*
|
||||
* Author:
|
||||
* Behdad Esfahbod, 2001, 2002, 2004
|
||||
*
|
||||
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
|
||||
* Copyright (C) 2001,2002 Behdad Esfahbod
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library, in a file named COPYING; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA
|
||||
*
|
||||
* For licensing issues, contact <license@farsiweb.info>.
|
||||
*/
|
||||
#ifndef _DEBUG_H
|
||||
#define _DEBUG_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <fribidi-types.h>
|
||||
|
||||
#include <fribidi-begindecls.h>
|
||||
|
||||
#if DEBUG+0
|
||||
|
||||
/* These definitions should only be used in DEBUG mode: */
|
||||
#ifndef __LINE__
|
||||
# define __LINE__ 0
|
||||
#endif /* !__LINE__ */
|
||||
#ifndef __FILE__
|
||||
# define __FILE__ "unknown"
|
||||
#endif /* !__FILE__ */
|
||||
|
||||
#ifndef FRIBIDI_FPRINTF
|
||||
# ifndef __FRIBIDI_DOC
|
||||
# include <stdio.h>
|
||||
# endif /* !__FRIBIDI_DOC */
|
||||
# define FRIBIDI_FPRINTF fprintf
|
||||
# define FRIBIDI_STDERR_ stderr,
|
||||
#endif /* !FRIBIDI_FPRINTF */
|
||||
|
||||
#ifndef MSG
|
||||
#define MSG(s) \
|
||||
FRIBIDI_BEGIN_STMT \
|
||||
FRIBIDI_FPRINTF(FRIBIDI_STDERR_ s); \
|
||||
FRIBIDI_END_STMT
|
||||
#define MSG2(s, t) \
|
||||
FRIBIDI_BEGIN_STMT \
|
||||
FRIBIDI_FPRINTF(FRIBIDI_STDERR_ s, t); \
|
||||
FRIBIDI_END_STMT
|
||||
#define MSG5(s, t, u, v, w) \
|
||||
FRIBIDI_BEGIN_STMT \
|
||||
FRIBIDI_FPRINTF(FRIBIDI_STDERR_ s, t, u, v, w); \
|
||||
FRIBIDI_END_STMT
|
||||
#endif /* !MSG */
|
||||
|
||||
#ifndef DBG
|
||||
# define DBG(s) \
|
||||
FRIBIDI_BEGIN_STMT \
|
||||
if (fribidi_debug_status()) { MSG(FRIBIDI ": " s "\n"); } \
|
||||
FRIBIDI_END_STMT
|
||||
# define DBG2(s, t) \
|
||||
FRIBIDI_BEGIN_STMT \
|
||||
if (fribidi_debug_status()) { MSG2(FRIBIDI ": " s "\n", t); } \
|
||||
FRIBIDI_END_STMT
|
||||
#endif /* !DBG */
|
||||
|
||||
#ifndef fribidi_assert
|
||||
# define fribidi_assert(cond) \
|
||||
FRIBIDI_BEGIN_STMT \
|
||||
if (!(cond)) { \
|
||||
DBG(__FILE__ ":" STRINGIZE(__LINE__) ": " \
|
||||
"assertion failed (" STRINGIZE(cond) ")"); \
|
||||
} \
|
||||
FRIBIDI_END_STMT
|
||||
#endif /* !fribidi_assert */
|
||||
|
||||
#else /* !DEBUG */
|
||||
|
||||
#ifndef DBG
|
||||
# define DBG(s) FRIBIDI_EMPTY_STMT
|
||||
# define DBG2(s, t) FRIBIDI_EMPTY_STMT
|
||||
#endif /* !DBG */
|
||||
#ifndef fribidi_assert
|
||||
# define fribidi_assert(cond) FRIBIDI_EMPTY_STMT
|
||||
#endif /* !fribidi_assert */
|
||||
|
||||
#endif /* !DEBUG */
|
||||
|
||||
#include <fribidi-enddecls.h>
|
||||
|
||||
#endif /* !_DEBUG_H */
|
||||
/* Editor directions:
|
||||
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
|
||||
*/
|
||||
@@ -1,193 +0,0 @@
|
||||
/* fribidi-arabic.c - Arabic shaping
|
||||
*
|
||||
* Copyright (C) 2005 Behdad Esfahbod
|
||||
*
|
||||
* This file is part of GNU FriBidi.
|
||||
*
|
||||
* GNU FriBidi is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* GNU FriBidi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU FriBidi; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* For licensing issues, contact <license@farsiweb.info> or write to
|
||||
* Sharif FarsiWeb, Inc., PO Box 13445-389, Tehran, Iran.
|
||||
*/
|
||||
/* $Id: fribidi-arabic.c,v 1.3 2007/04/05 16:14:39 behdad Exp $
|
||||
* $Author: behdad $
|
||||
* $Date: 2007/04/05 16:14:39 $
|
||||
* $Revision: 1.3 $
|
||||
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-arabic.c,v $
|
||||
*
|
||||
* Author(s):
|
||||
* Behdad Esfahbod, 2005
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#if HAVE_STDLIB_H+0
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include <fribidi-arabic.h>
|
||||
#include <fribidi-unicode.h>
|
||||
|
||||
|
||||
typedef struct _PairMap {
|
||||
FriBidiChar pair[2], to;
|
||||
} PairMap;
|
||||
|
||||
|
||||
#define FRIBIDI_ACCESS_SHAPE_TABLE(table,min,max,x,shape) (table), (min), (max)
|
||||
# define FRIBIDI_ACCESS_SHAPE_TABLE_REAL(table,min,max,x,shape) \
|
||||
(((x)<(min)||(x)>(max))?(x):(table)[(x)-(min)][(shape)])
|
||||
|
||||
#include "arabic-shaping.tab.i"
|
||||
#include "arabic-misc.tab.i"
|
||||
|
||||
|
||||
static void
|
||||
fribidi_shape_arabic_joining (
|
||||
/* input */
|
||||
const FriBidiChar table[][4],
|
||||
FriBidiChar min,
|
||||
FriBidiChar max,
|
||||
const FriBidiStrIndex len,
|
||||
const FriBidiArabicProp *ar_props,
|
||||
/* input and output */
|
||||
FriBidiChar *str
|
||||
)
|
||||
{
|
||||
register FriBidiStrIndex i;
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
if (FRIBIDI_ARAB_SHAPES(ar_props[i]))
|
||||
str[i] = FRIBIDI_ACCESS_SHAPE_TABLE_REAL (table, min, max, str[i], FRIBIDI_JOIN_SHAPE (ar_props[i]));
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
comp_PairMap (const void *pa, const void *pb)
|
||||
{
|
||||
PairMap *a = (PairMap *)pa;
|
||||
PairMap *b = (PairMap *)pb;
|
||||
|
||||
if (a->pair[0] != b->pair[0])
|
||||
return a->pair[0] < b->pair[0] ? -1 : +1;
|
||||
else
|
||||
return a->pair[1] < b->pair[1] ? -1 :
|
||||
a->pair[1] > b->pair[1] ? +1 :
|
||||
0;
|
||||
}
|
||||
|
||||
|
||||
static FriBidiChar
|
||||
find_pair_match (const PairMap *table, int size, FriBidiChar first, FriBidiChar second)
|
||||
{
|
||||
PairMap *match;
|
||||
PairMap x;
|
||||
x.pair[0] = first;
|
||||
x.pair[1] = second;
|
||||
x.to = 0;
|
||||
match = bsearch (&x, table, size, sizeof (table[0]), comp_PairMap);
|
||||
return match ? match->to : 0;
|
||||
}
|
||||
|
||||
#define PAIR_MATCH(table,len,first,second) \
|
||||
((first)<(table[0].pair[0])||(first)>(table[len-1].pair[0])?0: \
|
||||
find_pair_match(table, len, first, second))
|
||||
|
||||
static void
|
||||
fribidi_shape_arabic_ligature (
|
||||
/* input */
|
||||
const PairMap *table,
|
||||
int size,
|
||||
const FriBidiLevel *embedding_levels,
|
||||
const FriBidiStrIndex len,
|
||||
/* input and output */
|
||||
FriBidiArabicProp *ar_props,
|
||||
FriBidiChar *str
|
||||
)
|
||||
{
|
||||
/* TODO: This doesn't form ligatures for even-level Arabic text.
|
||||
* no big problem though. */
|
||||
register FriBidiStrIndex i;
|
||||
|
||||
for (i = 0; i < len - 1; i++) {
|
||||
register FriBidiChar c;
|
||||
if (FRIBIDI_LEVEL_IS_RTL(embedding_levels[i]) &&
|
||||
embedding_levels[i] == embedding_levels[i+1] &&
|
||||
(c = PAIR_MATCH(table, size, str[i], str[i+1])))
|
||||
{
|
||||
str[i] = FRIBIDI_CHAR_FILL;
|
||||
FRIBIDI_SET_BITS(ar_props[i], FRIBIDI_MASK_LIGATURED);
|
||||
str[i+1] = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define DO_LIGATURING(table, levels, len, ar_props, str) \
|
||||
fribidi_shape_arabic_ligature ((table), sizeof(table)/sizeof((table)[0]), levels, len, ar_props, str)
|
||||
|
||||
#define DO_SHAPING(tablemacro, len, ar_props, str) \
|
||||
fribidi_shape_arabic_joining (tablemacro(,), len, ar_props, str);
|
||||
|
||||
|
||||
|
||||
|
||||
FRIBIDI_ENTRY void
|
||||
fribidi_shape_arabic (
|
||||
/* input */
|
||||
FriBidiFlags flags,
|
||||
const FriBidiLevel *embedding_levels,
|
||||
const FriBidiStrIndex len,
|
||||
/* input and output */
|
||||
FriBidiArabicProp *ar_props,
|
||||
FriBidiChar *str
|
||||
)
|
||||
{
|
||||
DBG ("in fribidi_shape_arabic");
|
||||
|
||||
if UNLIKELY
|
||||
(len == 0 || !str) return;
|
||||
|
||||
DBG ("in fribidi_shape");
|
||||
|
||||
fribidi_assert (ar_props);
|
||||
|
||||
if (FRIBIDI_TEST_BITS (flags, FRIBIDI_FLAG_SHAPE_ARAB_PRES))
|
||||
{
|
||||
DO_SHAPING (FRIBIDI_GET_ARABIC_SHAPE_PRES, len, ar_props, str);
|
||||
}
|
||||
|
||||
if (FRIBIDI_TEST_BITS (flags, FRIBIDI_FLAG_SHAPE_ARAB_LIGA))
|
||||
{
|
||||
DO_LIGATURING (mandatory_liga_table, embedding_levels, len, ar_props, str);
|
||||
}
|
||||
|
||||
if (FRIBIDI_TEST_BITS (flags, FRIBIDI_FLAG_SHAPE_ARAB_CONSOLE))
|
||||
{
|
||||
DO_LIGATURING (console_liga_table, embedding_levels, len, ar_props, str);
|
||||
DO_SHAPING (FRIBIDI_GET_ARABIC_SHAPE_NSM, len, ar_props, str);
|
||||
}
|
||||
}
|
||||
|
||||
/* Editor directions:
|
||||
* Local Variables:
|
||||
* mode: c
|
||||
* c-basic-offset: 2
|
||||
* indent-tabs-mode: t
|
||||
* tab-width: 8
|
||||
* End:
|
||||
* vim: textwidth=78: autoindent: cindent: shiftwidth=2: tabstop=8:
|
||||
*/
|
||||
@@ -1,88 +0,0 @@
|
||||
/* fribidi-arabic.h - do Arabic shaping to presentation forms
|
||||
*
|
||||
* Copyright (C) 2005 Behdad Esfahbod
|
||||
*
|
||||
* This file is part of GNU FriBidi.
|
||||
*
|
||||
* GNU FriBidi is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public License
|
||||
* as published by the Free Software Foundation; either version 2.1
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* GNU FriBidi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU FriBidi; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* For licensing issues, contact <license@farsiweb.info> or write to
|
||||
* Sharif FarsiWeb, Inc., PO Box 13445-389, Tehran, Iran.
|
||||
*/
|
||||
/* $Id: fribidi-arabic.h,v 1.1 2005/11/03 01:39:01 behdad Exp $
|
||||
* $Author: behdad $
|
||||
* $Date: 2005/11/03 01:39:01 $
|
||||
* $Revision: 1.1 $
|
||||
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-arabic.h,v $
|
||||
*
|
||||
* Author(s):
|
||||
* Behdad Esfahbod, 2005
|
||||
*/
|
||||
#ifndef _FRIBIDI_ARABIC_H
|
||||
#define _FRIBIDI_ARABIC_H
|
||||
|
||||
#include "fribidi-common.h"
|
||||
|
||||
#include "fribidi-types.h"
|
||||
#include "fribidi-flags.h"
|
||||
#include "fribidi-bidi-types.h"
|
||||
#include "fribidi-joining.h"
|
||||
|
||||
#include "fribidi-begindecls.h"
|
||||
|
||||
|
||||
#define fribidi_shape_arabic FRIBIDI_NAMESPACE(shape_arabic)
|
||||
/* fribidi_shape_arabic - do Arabic shaping
|
||||
*
|
||||
* The actual shaping that is done depends on the flags set. Only flags
|
||||
* starting with FRIBIDI_FLAG_SHAPE_ARAB_ affect this function.
|
||||
* Currently these are:
|
||||
*
|
||||
* * FRIBIDI_FLAG_SHAPE_MIRRORING: Do mirroring.
|
||||
* * FRIBIDI_FLAG_SHAPE_ARAB_PRES: Shape Arabic characters to their
|
||||
* presentation form glyphs.
|
||||
* * FRIBIDI_FLAG_SHAPE_ARAB_LIGA: Form mandatory Arabic ligatures.
|
||||
* * FRIBIDI_FLAG_SHAPE_ARAB_CONSOLE: Perform additional Arabic shaping
|
||||
* suitable for text rendered on
|
||||
* grid terminals with no mark
|
||||
* rendering capabilities.
|
||||
*
|
||||
* Of the above, FRIBIDI_FLAG_SHAPE_ARAB_CONSOLE is only used in special
|
||||
* cases, but the rest are recommended in any enviroment that doesn't have
|
||||
* other means for doing Arabic shaping. The set of extra flags that enable
|
||||
* this level of Arabic support has a shortcut named FRIBIDI_FLAGS_ARABIC.
|
||||
*/
|
||||
FRIBIDI_ENTRY void
|
||||
fribidi_shape_arabic (
|
||||
FriBidiFlags flags, /* shaping flags */
|
||||
const FriBidiLevel *embedding_levels,
|
||||
const FriBidiStrIndex len, /* input string length */
|
||||
FriBidiArabicProp *ar_props, /* input/output Arabic properties as
|
||||
* computed by fribidi_join_arabic */
|
||||
FriBidiChar *str /* string to shape */
|
||||
);
|
||||
|
||||
#include "fribidi-enddecls.h"
|
||||
|
||||
#endif /* !_FRIBIDI_ARABIC_H */
|
||||
/* Editor directions:
|
||||
* Local Variables:
|
||||
* mode: c
|
||||
* c-basic-offset: 2
|
||||
* indent-tabs-mode: t
|
||||
* tab-width: 8
|
||||
* End:
|
||||
* vim: textwidth=78: autoindent: cindent: shiftwidth=2: tabstop=8:
|
||||
*/
|
||||
@@ -1,3 +0,0 @@
|
||||
#ifdef FRIBIDI_BEGIN_DECLS
|
||||
FRIBIDI_BEGIN_DECLS
|
||||
#endif /* FRIBIDI_BEGIN_DECLS */
|
||||
@@ -1,98 +0,0 @@
|
||||
#ifndef __FRIBIDI_DOC
|
||||
/* FriBidi
|
||||
* fribidi-bidi-types-list.h - list of bidi types
|
||||
*
|
||||
* $Id: fribidi-bidi-types-list.h,v 1.5 2004/06/13 20:11:42 behdad Exp $
|
||||
* $Author: behdad $
|
||||
* $Date: 2004/06/13 20:11:42 $
|
||||
* $Revision: 1.5 $
|
||||
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-bidi-types-list.h,v $
|
||||
*
|
||||
* Author:
|
||||
* Behdad Esfahbod, 2001, 2002, 2004
|
||||
*
|
||||
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
|
||||
* Copyright (C) 2001,2002 Behdad Esfahbod
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library, in a file named COPYING; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA
|
||||
*
|
||||
* For licensing issues, contact <license@farsiweb.info>.
|
||||
*/
|
||||
/* *INDENT-OFF* */
|
||||
#endif /* !__FRIBIDI_DOC */
|
||||
#ifndef _FRIBIDI_ADD_TYPE
|
||||
# define _FRIBIDI_ADD_TYPE(x,y)
|
||||
#endif
|
||||
#ifndef _FRIBIDI_ADD_ALIAS
|
||||
# define _FRIBIDI_ADD_ALIAS(x1,x2)
|
||||
#endif
|
||||
|
||||
#if !defined(_FRIBIDI_PAR_TYPES) || defined(_FRIBIDI_ALL_TYPES)
|
||||
|
||||
_FRIBIDI_ADD_TYPE (LTR, 'L') /* Left-To-Right letter */
|
||||
_FRIBIDI_ADD_TYPE (RTL, 'R') /* Right-To-Left letter */
|
||||
_FRIBIDI_ADD_TYPE (AL, 'A') /* Arabic Letter */
|
||||
_FRIBIDI_ADD_TYPE (EN, '1') /* European Numeral */
|
||||
_FRIBIDI_ADD_TYPE (AN, '9') /* Arabic Numeral */
|
||||
_FRIBIDI_ADD_TYPE (ES, 'w') /* European number Separator */
|
||||
_FRIBIDI_ADD_TYPE (ET, 'w') /* European number Terminator */
|
||||
_FRIBIDI_ADD_TYPE (CS, 'w') /* Common Separator */
|
||||
_FRIBIDI_ADD_TYPE (NSM, '`') /* Non Spacing Mark */
|
||||
_FRIBIDI_ADD_TYPE (BN, 'b') /* Boundary Neutral */
|
||||
_FRIBIDI_ADD_TYPE (BS, 'B') /* Block Separator */
|
||||
_FRIBIDI_ADD_TYPE (SS, 'S') /* Segment Separator */
|
||||
_FRIBIDI_ADD_TYPE (WS, '_') /* WhiteSpace */
|
||||
_FRIBIDI_ADD_TYPE (ON, 'n') /* Other Neutral */
|
||||
_FRIBIDI_ADD_TYPE (LRE, '+') /* Left-to-Right Embedding */
|
||||
_FRIBIDI_ADD_TYPE (RLE, '+') /* Right-to-Left Embedding */
|
||||
_FRIBIDI_ADD_TYPE (LRO, '+') /* Left-to-Right Override */
|
||||
_FRIBIDI_ADD_TYPE (RLO, '+') /* Right-to-Left Override */
|
||||
_FRIBIDI_ADD_TYPE (PDF, '-') /* Pop Directional Flag */
|
||||
|
||||
#if defined(_FRIBIDI_ADD_ALIAS)
|
||||
_FRIBIDI_ADD_ALIAS (L, LTR)
|
||||
_FRIBIDI_ADD_ALIAS (R, RTL)
|
||||
_FRIBIDI_ADD_ALIAS (B, BS)
|
||||
_FRIBIDI_ADD_ALIAS (S, SS)
|
||||
#endif /* _FRIBIDI_ADD_ALIAS */
|
||||
|
||||
#if defined(_FRIBIDI_SENTINEL_TYPE) || defined(_FRIBIDI_ALL_TYPES)
|
||||
_FRIBIDI_ADD_TYPE (SENTINEL, '$') /* SENTINEL */
|
||||
#endif /* _FRIBIDI_SENTINEL_TYPES || _FRIBIDI_ALL_TYPES*/
|
||||
#endif /* !_FRIBIDI_PAR_TYPES || _FRIBIDI_ALL_TYPES */
|
||||
|
||||
#if defined(_FRIBIDI_PAR_TYPES) || defined(_FRIBIDI_ALL_TYPES)
|
||||
# if !defined(_FRIBIDI_ALL_TYPES)
|
||||
_FRIBIDI_ADD_TYPE (LTR, 'L') /* Left-To-Right paragraph */
|
||||
_FRIBIDI_ADD_TYPE (RTL, 'R') /* Right-To-Left paragraph */
|
||||
_FRIBIDI_ADD_TYPE (ON, 'n') /* directiOn-Neutral paragraph */
|
||||
# endif /* !_FRIBIDI_ALL_TYPES */
|
||||
_FRIBIDI_ADD_TYPE (WLTR, 'l') /* Weak Left To Right paragraph */
|
||||
_FRIBIDI_ADD_TYPE (WRTL, 'r') /* Weak Right To Left paragraph */
|
||||
#endif /* _FRIBIDI_PAR_TYPES || _FRIBIDI_ALL_TYPES*/
|
||||
|
||||
#if defined(_FRIBIDI_ENUM_TYPES)
|
||||
typedef enum {
|
||||
# define _FRIBIDI_ADD_TYPE _FRIBIDI_ENUM_ADD_TYPE
|
||||
# include "fribidi-bidi-types-list.h"
|
||||
# undef _FRIBIDI_ADD_TYPE
|
||||
_FRIBIDI_TYPES_MAX
|
||||
} _FRIBIDI_ENUM_TYPES
|
||||
#endif /* _FRIBIDI_ENUM_TYPES */
|
||||
|
||||
#ifndef __FRIBIDI_DOC
|
||||
/* *INDENT-ON* */
|
||||
#endif /* !__FRIBIDI_DOC */
|
||||
@@ -1,125 +0,0 @@
|
||||
/* FriBidi
|
||||
* fribidi-bidi-types.c - character bidi types
|
||||
*
|
||||
* $Id: fribidi-bidi-types.c,v 1.9 2006/01/31 03:23:13 behdad Exp $
|
||||
* $Author: behdad $
|
||||
* $Date: 2006/01/31 03:23:13 $
|
||||
* $Revision: 1.9 $
|
||||
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-bidi-types.c,v $
|
||||
*
|
||||
* Authors:
|
||||
* Behdad Esfahbod, 2001, 2002, 2004
|
||||
*
|
||||
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
|
||||
* Copyright (C) 2001,2002 Behdad Esfahbod
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library, in a file named COPYING; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA
|
||||
*
|
||||
* For licensing issues, contact <license@farsiweb.info>.
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <fribidi-bidi-types.h>
|
||||
|
||||
#include "bidi-types.h"
|
||||
|
||||
enum FriBidiCharTypeLinearEnum
|
||||
{
|
||||
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) TYPE,
|
||||
# include "fribidi-bidi-types-list.h"
|
||||
# undef _FRIBIDI_ADD_TYPE
|
||||
_FRIBIDI_NUM_TYPES
|
||||
};
|
||||
|
||||
#include "bidi-type.tab.i"
|
||||
|
||||
/* Map FriBidiCharTypeLinearEnum to FriBidiCharType. */
|
||||
static const FriBidiCharType linear_enum_to_char_type[] = {
|
||||
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) FRIBIDI_TYPE_##TYPE,
|
||||
# include "fribidi-bidi-types-list.h"
|
||||
# undef _FRIBIDI_ADD_TYPE
|
||||
};
|
||||
|
||||
FRIBIDI_ENTRY FriBidiCharType
|
||||
fribidi_get_bidi_type (
|
||||
/* input */
|
||||
FriBidiChar ch
|
||||
)
|
||||
{
|
||||
return linear_enum_to_char_type[FRIBIDI_GET_BIDI_TYPE (ch)];
|
||||
}
|
||||
|
||||
FRIBIDI_ENTRY void
|
||||
fribidi_get_bidi_types (
|
||||
/* input */
|
||||
const FriBidiChar *str,
|
||||
const FriBidiStrIndex len,
|
||||
/* output */
|
||||
FriBidiCharType *btypes
|
||||
)
|
||||
{
|
||||
register FriBidiStrIndex i = len;
|
||||
for (; i; i--)
|
||||
{
|
||||
*btypes++ = linear_enum_to_char_type[FRIBIDI_GET_BIDI_TYPE (*str)];
|
||||
str++;
|
||||
}
|
||||
}
|
||||
|
||||
FRIBIDI_ENTRY const char *
|
||||
fribidi_get_bidi_type_name (
|
||||
/* input */
|
||||
FriBidiCharType t
|
||||
)
|
||||
{
|
||||
switch (t)
|
||||
{
|
||||
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) case FRIBIDI_TYPE_##TYPE: return STRINGIZE(TYPE);
|
||||
# define _FRIBIDI_ALL_TYPES
|
||||
# include "fribidi-bidi-types-list.h"
|
||||
# undef _FRIBIDI_ALL_TYPES
|
||||
# undef _FRIBIDI_ADD_TYPE
|
||||
default:
|
||||
return "?";
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG+0
|
||||
|
||||
char
|
||||
fribidi_char_from_bidi_type (
|
||||
/* input */
|
||||
FriBidiCharType t
|
||||
)
|
||||
{
|
||||
switch (t)
|
||||
{
|
||||
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) case FRIBIDI_TYPE_##TYPE: return SYMBOL;
|
||||
# define _FRIBIDI_ALL_TYPES
|
||||
# include "fribidi-bidi-types-list.h"
|
||||
# undef _FRIBIDI_ALL_TYPES
|
||||
# undef _FRIBIDI_ADD_TYPE
|
||||
default:
|
||||
return '?';
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* DEBUG */
|
||||
|
||||
/* Editor directions:
|
||||
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
|
||||
*/
|
||||
@@ -1,389 +0,0 @@
|
||||
/* FriBidi
|
||||
* fribidi-bidi-types.h - character bidi types
|
||||
*
|
||||
* $Id: fribidi-bidi-types.h,v 1.15 2008-11-24 17:48:31 behdad Exp $
|
||||
* $Author: behdad $
|
||||
* $Date: 2008-11-24 17:48:31 $
|
||||
* $Revision: 1.15 $
|
||||
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-bidi-types.h,v $
|
||||
*
|
||||
* Author:
|
||||
* Behdad Esfahbod, 2001, 2002, 2004
|
||||
*
|
||||
* Copyright (C) 2004 Sharif FarsiWeb, Inc.
|
||||
* Copyright (C) 2001,2002 Behdad Esfahbod
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library, in a file named COPYING; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA
|
||||
*
|
||||
* For licensing issues, contact <license@farsiweb.info>.
|
||||
*/
|
||||
#ifndef _FRIBIDI_BIDI_TYPES_H
|
||||
#define _FRIBIDI_BIDI_TYPES_H
|
||||
|
||||
#include "fribidi-common.h"
|
||||
|
||||
#include "fribidi-types.h"
|
||||
|
||||
#include "fribidi-begindecls.h"
|
||||
|
||||
typedef signed char FriBidiLevel;
|
||||
|
||||
/*
|
||||
* Define bit masks that bidi types are based on, each mask has
|
||||
* only one bit set.
|
||||
*/
|
||||
|
||||
/* RTL mask better be the least significant bit. */
|
||||
#define FRIBIDI_MASK_RTL 0x00000001L /* Is right to left */
|
||||
#define FRIBIDI_MASK_ARABIC 0x00000002L /* Is arabic */
|
||||
|
||||
/* Each char can be only one of the three following. */
|
||||
#define FRIBIDI_MASK_STRONG 0x00000010L /* Is strong */
|
||||
#define FRIBIDI_MASK_WEAK 0x00000020L /* Is weak */
|
||||
#define FRIBIDI_MASK_NEUTRAL 0x00000040L /* Is neutral */
|
||||
#define FRIBIDI_MASK_SENTINEL 0x00000080L /* Is sentinel */
|
||||
/* Sentinels are not valid chars, just identify the start/end of strings. */
|
||||
|
||||
/* Each char can be only one of the five following. */
|
||||
#define FRIBIDI_MASK_LETTER 0x00000100L /* Is letter: L, R, AL */
|
||||
#define FRIBIDI_MASK_NUMBER 0x00000200L /* Is number: EN, AN */
|
||||
#define FRIBIDI_MASK_NUMSEPTER 0x00000400L /* Is separator or terminator: ES, ET, CS */
|
||||
#define FRIBIDI_MASK_SPACE 0x00000800L /* Is space: BN, BS, SS, WS */
|
||||
#define FRIBIDI_MASK_EXPLICIT 0x00001000L /* Is expilict mark: LRE, RLE, LRO, RLO, PDF */
|
||||
|
||||
/* Can be set only if FRIBIDI_MASK_SPACE is also set. */
|
||||
#define FRIBIDI_MASK_SEPARATOR 0x00002000L /* Is text separator: BS, SS */
|
||||
/* Can be set only if FRIBIDI_MASK_EXPLICIT is also set. */
|
||||
#define FRIBIDI_MASK_OVERRIDE 0x00004000L /* Is explicit override: LRO, RLO */
|
||||
|
||||
/* The following exist to make types pairwise different, some of them can
|
||||
* be removed but are here because of efficiency (make queries faster). */
|
||||
|
||||
#define FRIBIDI_MASK_ES 0x00010000L
|
||||
#define FRIBIDI_MASK_ET 0x00020000L
|
||||
#define FRIBIDI_MASK_CS 0x00040000L
|
||||
|
||||
#define FRIBIDI_MASK_NSM 0x00080000L
|
||||
#define FRIBIDI_MASK_BN 0x00100000L
|
||||
|
||||
#define FRIBIDI_MASK_BS 0x00200000L
|
||||
#define FRIBIDI_MASK_SS 0x00400000L
|
||||
#define FRIBIDI_MASK_WS 0x00800000L
|
||||
|
||||
/* We reserve a single bit for user's private use: we will never use it. */
|
||||
#define FRIBIDI_MASK_PRIVATE 0x01000000L
|
||||
|
||||
|
||||
/*
|
||||
* Define values for FriBidiCharType
|
||||
*/
|
||||
|
||||
/* Strong types */
|
||||
|
||||
/* Left-To-Right letter */
|
||||
#define FRIBIDI_TYPE_LTR_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_LETTER )
|
||||
/* Right-To-Left letter */
|
||||
#define FRIBIDI_TYPE_RTL_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_LETTER \
|
||||
| FRIBIDI_MASK_RTL)
|
||||
/* Arabic Letter */
|
||||
#define FRIBIDI_TYPE_AL_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_LETTER \
|
||||
| FRIBIDI_MASK_RTL | FRIBIDI_MASK_ARABIC )
|
||||
/* Left-to-Right Embedding */
|
||||
#define FRIBIDI_TYPE_LRE_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_EXPLICIT)
|
||||
/* Right-to-Left Embedding */
|
||||
#define FRIBIDI_TYPE_RLE_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_EXPLICIT \
|
||||
| FRIBIDI_MASK_RTL )
|
||||
/* Left-to-Right Override */
|
||||
#define FRIBIDI_TYPE_LRO_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_EXPLICIT \
|
||||
| FRIBIDI_MASK_OVERRIDE )
|
||||
/* Right-to-Left Override */
|
||||
#define FRIBIDI_TYPE_RLO_VAL ( FRIBIDI_MASK_STRONG | FRIBIDI_MASK_EXPLICIT \
|
||||
| FRIBIDI_MASK_RTL | FRIBIDI_MASK_OVERRIDE )
|
||||
|
||||
/* Weak types */
|
||||
|
||||
/* Pop Directional Flag*/
|
||||
#define FRIBIDI_TYPE_PDF_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_EXPLICIT )
|
||||
/* European Numeral */
|
||||
#define FRIBIDI_TYPE_EN_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMBER )
|
||||
/* Arabic Numeral */
|
||||
#define FRIBIDI_TYPE_AN_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMBER \
|
||||
| FRIBIDI_MASK_ARABIC )
|
||||
/* European number Separator */
|
||||
#define FRIBIDI_TYPE_ES_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMSEPTER \
|
||||
| FRIBIDI_MASK_ES )
|
||||
/* European number Terminator */
|
||||
#define FRIBIDI_TYPE_ET_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMSEPTER \
|
||||
| FRIBIDI_MASK_ET )
|
||||
/* Common Separator */
|
||||
#define FRIBIDI_TYPE_CS_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NUMSEPTER \
|
||||
| FRIBIDI_MASK_CS )
|
||||
/* Non Spacing Mark */
|
||||
#define FRIBIDI_TYPE_NSM_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_NSM )
|
||||
/* Boundary Neutral */
|
||||
#define FRIBIDI_TYPE_BN_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_SPACE \
|
||||
| FRIBIDI_MASK_BN )
|
||||
|
||||
/* Neutral types */
|
||||
|
||||
/* Block Separator */
|
||||
#define FRIBIDI_TYPE_BS_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_SPACE \
|
||||
| FRIBIDI_MASK_SEPARATOR | FRIBIDI_MASK_BS )
|
||||
/* Segment Separator */
|
||||
#define FRIBIDI_TYPE_SS_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_SPACE \
|
||||
| FRIBIDI_MASK_SEPARATOR | FRIBIDI_MASK_SS )
|
||||
/* WhiteSpace */
|
||||
#define FRIBIDI_TYPE_WS_VAL ( FRIBIDI_MASK_NEUTRAL | FRIBIDI_MASK_SPACE \
|
||||
| FRIBIDI_MASK_WS )
|
||||
/* Other Neutral */
|
||||
#define FRIBIDI_TYPE_ON_VAL ( FRIBIDI_MASK_NEUTRAL )
|
||||
|
||||
|
||||
/* The following are used in specifying paragraph direction only. */
|
||||
|
||||
/* Weak Left-To-Right */
|
||||
#define FRIBIDI_TYPE_WLTR_VAL ( FRIBIDI_MASK_WEAK )
|
||||
/* Weak Right-To-Left */
|
||||
#define FRIBIDI_TYPE_WRTL_VAL ( FRIBIDI_MASK_WEAK | FRIBIDI_MASK_RTL )
|
||||
|
||||
/* start or end of text (run list) SENTINEL. Only used internally */
|
||||
#define FRIBIDI_TYPE_SENTINEL ( FRIBIDI_MASK_SENTINEL )
|
||||
|
||||
/* Private types for applications. More private types can be obtained by
|
||||
* summing up from this one. */
|
||||
#define FRIBIDI_TYPE_PRIVATE ( FRIBIDI_MASK_PRIVATE )
|
||||
|
||||
|
||||
/* Define Enums only if sizeof(int) == 4 (UTF-32), and not compiling C++.
|
||||
* The problem with C++ is that then casts between int32 and enum will fail!
|
||||
*/
|
||||
#if defined(__FRIBIDI_DOC) || (FRIBIDI_SIZEOF_INT+0 == 4 && !defined(__cplusplus))
|
||||
|
||||
typedef enum
|
||||
{
|
||||
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) \
|
||||
FRIBIDI_TYPE_##TYPE = FRIBIDI_TYPE_##TYPE##_VAL,
|
||||
# include "fribidi-bidi-types-list.h"
|
||||
# undef _FRIBIDI_ADD_TYPE
|
||||
_FRIBIDI_TYPE_SENTINEL = FRIBIDI_TYPE_SENTINEL /* Don't use this */
|
||||
} FriBidiCharType;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
# define _FRIBIDI_PAR_TYPES
|
||||
# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) \
|
||||
FRIBIDI_PAR_##TYPE = FRIBIDI_TYPE_##TYPE##_VAL,
|
||||
# include "fribidi-bidi-types-list.h"
|
||||
# undef _FRIBIDI_ADD_TYPE
|
||||
# undef _FRIBIDI_PAR_TYPES
|
||||
_FRIBIDI_PAR_SENTINEL = FRIBIDI_TYPE_SENTINEL /* Don't use this */
|
||||
} FriBidiParType;
|
||||
|
||||
#else
|
||||
|
||||
typedef fribidi_uint32 FriBidiCharType;
|
||||
# define FRIBIDI_TYPE_LTR FRIBIDI_TYPE_LTR_VAL
|
||||
# define FRIBIDI_TYPE_RTL FRIBIDI_TYPE_RTL_VAL
|
||||
# define FRIBIDI_TYPE_AL FRIBIDI_TYPE_AL_VAL
|
||||
# define FRIBIDI_TYPE_EN FRIBIDI_TYPE_EN_VAL
|
||||
# define FRIBIDI_TYPE_AN FRIBIDI_TYPE_AN_VAL
|
||||
# define FRIBIDI_TYPE_ES FRIBIDI_TYPE_ES_VAL
|
||||
# define FRIBIDI_TYPE_ET FRIBIDI_TYPE_ET_VAL
|
||||
# define FRIBIDI_TYPE_CS FRIBIDI_TYPE_CS_VAL
|
||||
# define FRIBIDI_TYPE_NSM FRIBIDI_TYPE_NSM_VAL
|
||||
# define FRIBIDI_TYPE_BN FRIBIDI_TYPE_BN_VAL
|
||||
# define FRIBIDI_TYPE_BS FRIBIDI_TYPE_BS_VAL
|
||||
# define FRIBIDI_TYPE_SS FRIBIDI_TYPE_SS_VAL
|
||||
# define FRIBIDI_TYPE_WS FRIBIDI_TYPE_WS_VAL
|
||||
# define FRIBIDI_TYPE_ON FRIBIDI_TYPE_ON_VAL
|
||||
# define FRIBIDI_TYPE_LRE FRIBIDI_TYPE_LRE_VAL
|
||||
# define FRIBIDI_TYPE_RLE FRIBIDI_TYPE_RLE_VAL
|
||||
# define FRIBIDI_TYPE_LRO FRIBIDI_TYPE_LRO_VAL
|
||||
# define FRIBIDI_TYPE_RLO FRIBIDI_TYPE_RLO_VAL
|
||||
# define FRIBIDI_TYPE_PDF FRIBIDI_TYPE_PDF_VAL
|
||||
|
||||
typedef fribidi_uint32 FriBidiParType;
|
||||
# define FRIBIDI_PAR_LTR FRIBIDI_TYPE_LTR_VAL
|
||||
# define FRIBIDI_PAR_RTL FRIBIDI_TYPE_RTL_VAL
|
||||
# define FRIBIDI_PAR_ON FRIBIDI_TYPE_ON_VAL
|
||||
# define FRIBIDI_PAR_WLTR FRIBIDI_TYPE_WLTR_VAL
|
||||
# define FRIBIDI_PAR_WRTL FRIBIDI_TYPE_WRTL_VAL
|
||||
|
||||
#endif
|
||||
|
||||
/* Please don't use these two type names, use FRIBIDI_PAR_* form instead. */
|
||||
#define FRIBIDI_TYPE_WLTR FRIBIDI_PAR_WLTR
|
||||
#define FRIBIDI_TYPE_WRTL FRIBIDI_PAR_WRTL
|
||||
|
||||
|
||||
/*
|
||||
* Defining macros for needed queries, It is fully dependent on the
|
||||
* implementation of FriBidiCharType.
|
||||
*/
|
||||
|
||||
|
||||
/* Is right-to-left level? */
|
||||
#define FRIBIDI_LEVEL_IS_RTL(lev) ((lev) & 1)
|
||||
|
||||
/* Return the bidi type corresponding to the direction of the level number,
|
||||
FRIBIDI_TYPE_LTR for evens and FRIBIDI_TYPE_RTL for odds. */
|
||||
#define FRIBIDI_LEVEL_TO_DIR(lev) \
|
||||
(FRIBIDI_LEVEL_IS_RTL (lev) ? FRIBIDI_TYPE_RTL : FRIBIDI_TYPE_LTR)
|
||||
|
||||
/* Return the minimum level of the direction, 0 for FRIBIDI_TYPE_LTR and
|
||||
1 for FRIBIDI_TYPE_RTL and FRIBIDI_TYPE_AL. */
|
||||
#define FRIBIDI_DIR_TO_LEVEL(dir) \
|
||||
((FriBidiLevel) (FRIBIDI_IS_RTL (dir) ? 1 : 0))
|
||||
|
||||
/* Is right to left: RTL, AL, RLE, RLO? */
|
||||
#define FRIBIDI_IS_RTL(p) ((p) & FRIBIDI_MASK_RTL)
|
||||
/* Is arabic: AL, AN? */
|
||||
#define FRIBIDI_IS_ARABIC(p) ((p) & FRIBIDI_MASK_ARABIC)
|
||||
|
||||
/* Is strong? */
|
||||
#define FRIBIDI_IS_STRONG(p) ((p) & FRIBIDI_MASK_STRONG)
|
||||
/* Is weak? */
|
||||
#define FRIBIDI_IS_WEAK(p) ((p) & FRIBIDI_MASK_WEAK)
|
||||
/* Is neutral? */
|
||||
#define FRIBIDI_IS_NEUTRAL(p) ((p) & FRIBIDI_MASK_NEUTRAL)
|
||||
/* Is sentinel? */
|
||||
#define FRIBIDI_IS_SENTINEL(p) ((p) & FRIBIDI_MASK_SENTINEL)
|
||||
|
||||
/* Is letter: L, R, AL? */
|
||||
#define FRIBIDI_IS_LETTER(p) ((p) & FRIBIDI_MASK_LETTER)
|
||||
/* Is number: EN, AN? */
|
||||
#define FRIBIDI_IS_NUMBER(p) ((p) & FRIBIDI_MASK_NUMBER)
|
||||
/* Is number separator or terminator: ES, ET, CS? */
|
||||
#define FRIBIDI_IS_NUMBER_SEPARATOR_OR_TERMINATOR(p) \
|
||||
((p) & FRIBIDI_MASK_NUMSEPTER)
|
||||
/* Is space: BN, BS, SS, WS? */
|
||||
#define FRIBIDI_IS_SPACE(p) ((p) & FRIBIDI_MASK_SPACE)
|
||||
/* Is explicit mark: LRE, RLE, LRO, RLO, PDF? */
|
||||
#define FRIBIDI_IS_EXPLICIT(p) ((p) & FRIBIDI_MASK_EXPLICIT)
|
||||
|
||||
/* Is text separator: BS, SS? */
|
||||
#define FRIBIDI_IS_SEPARATOR(p) ((p) & FRIBIDI_MASK_SEPARATOR)
|
||||
|
||||
/* Is explicit override: LRO, RLO? */
|
||||
#define FRIBIDI_IS_OVERRIDE(p) ((p) & FRIBIDI_MASK_OVERRIDE)
|
||||
|
||||
/* Some more: */
|
||||
|
||||
/* Is left to right letter: LTR? */
|
||||
#define FRIBIDI_IS_LTR_LETTER(p) \
|
||||
((p) & (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL) == FRIBIDI_MASK_LETTER)
|
||||
|
||||
/* Is right to left letter: RTL, AL? */
|
||||
#define FRIBIDI_IS_RTL_LETTER(p) \
|
||||
((p) & (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL) \
|
||||
== (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL))
|
||||
|
||||
/* Is ES or CS: ES, CS? */
|
||||
#define FRIBIDI_IS_ES_OR_CS(p) \
|
||||
((p) & (FRIBIDI_MASK_ES | FRIBIDI_MASK_CS))
|
||||
|
||||
/* Is explicit or BN: LRE, RLE, LRO, RLO, PDF, BN? */
|
||||
#define FRIBIDI_IS_EXPLICIT_OR_BN(p) \
|
||||
((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_BN))
|
||||
|
||||
/* Is explicit or BN or NSM: LRE, RLE, LRO, RLO, PDF, BN, NSM? */
|
||||
#define FRIBIDI_IS_EXPLICIT_OR_BN_OR_NSM(p) \
|
||||
((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_BN | FRIBIDI_MASK_NSM))
|
||||
|
||||
/* Is explicit or BN or WS: LRE, RLE, LRO, RLO, PDF, BN, WS? */
|
||||
#define FRIBIDI_IS_EXPLICIT_OR_BN_OR_WS(p) \
|
||||
((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_BN | FRIBIDI_MASK_WS))
|
||||
|
||||
/* Is explicit or separator or BN or WS: LRE, RLE, LRO, RLO, PDF, BS, SS, BN, WS? */
|
||||
#define FRIBIDI_IS_EXPLICIT_OR_SEPARATOR_OR_BN_OR_WS(p) \
|
||||
((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_SEPARATOR \
|
||||
| FRIBIDI_MASK_BN | FRIBIDI_MASK_WS))
|
||||
|
||||
/* Is private-use type for application? */
|
||||
#define FRIBIDI_IS_PRIVATE(p) ((p) & FRIBIDI_MASK_PRIVATE)
|
||||
|
||||
/* Define some conversions. */
|
||||
|
||||
/* Change numbers to RTL: EN,AN -> RTL. */
|
||||
#define FRIBIDI_CHANGE_NUMBER_TO_RTL(p) \
|
||||
(FRIBIDI_IS_NUMBER(p) ? FRIBIDI_TYPE_RTL : (p))
|
||||
|
||||
/* Override status of an explicit mark:
|
||||
* LRO,LRE->LTR, RLO,RLE->RTL, otherwise->ON. */
|
||||
#define FRIBIDI_EXPLICIT_TO_OVERRIDE_DIR(p) \
|
||||
(FRIBIDI_IS_OVERRIDE(p) ? FRIBIDI_LEVEL_TO_DIR(FRIBIDI_DIR_TO_LEVEL(p)) \
|
||||
: FRIBIDI_TYPE_ON)
|
||||
|
||||
/* Weaken type for paragraph fallback purposes:
|
||||
* LTR->WLTR, RTL->WRTL. */
|
||||
#define FRIBIDI_WEAK_PARAGRAPH(p) (FRIBIDI_PAR_WLTR | ((p) & FRIBIDI_MASK_RTL))
|
||||
|
||||
|
||||
/* Functions finally */
|
||||
|
||||
|
||||
#define fribidi_get_bidi_type FRIBIDI_NAMESPACE(get_bidi_type)
|
||||
/* fribidi_get_bidi_type - get character bidi type
|
||||
*
|
||||
* This function returns the bidi type of a character as defined in Table 3.7
|
||||
* Bidirectional Character Types of the Unicode Bidirectional Algorithm
|
||||
* available at
|
||||
* http://www.unicode.org/reports/tr9/#Bidirectional_Character_Types, using
|
||||
* data provided in file UnicodeData.txt of the Unicode Character Database
|
||||
* available at http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.
|
||||
*
|
||||
* There are a few macros defined in fribidi-bidi-types.h for querying a bidi
|
||||
* type.
|
||||
*/
|
||||
FRIBIDI_ENTRY FriBidiCharType
|
||||
fribidi_get_bidi_type (
|
||||
FriBidiChar ch /* input character */
|
||||
) FRIBIDI_GNUC_CONST;
|
||||
|
||||
#define fribidi_get_bidi_types FRIBIDI_NAMESPACE(get_bidi_types)
|
||||
/* fribidi_get_bidi_types - get bidi types for an string of characters
|
||||
*
|
||||
* This function finds the bidi types of an string of characters. See
|
||||
* fribidi_get_bidi_type() for more information about the bidi types returned
|
||||
* by this function.
|
||||
*/
|
||||
FRIBIDI_ENTRY void fribidi_get_bidi_types (
|
||||
const FriBidiChar *str, /* input string */
|
||||
const FriBidiStrIndex len, /* input string length */
|
||||
FriBidiCharType *btypes /* output bidi types */
|
||||
);
|
||||
|
||||
#define fribidi_get_bidi_type_name FRIBIDI_NAMESPACE(get_bidi_type_name)
|
||||
/* fribidi_get_bidi_type_name - get bidi type name
|
||||
*
|
||||
* This function returns the bidi type name of a character type. The
|
||||
* returned string is a static string and should not be freed.
|
||||
*
|
||||
* The type names are the same as ones defined in Table 3.7 Bidirectional
|
||||
* Character Types of the Unicode Bidirectional Algorithm available at
|
||||
* http://www.unicode.org/reports/tr9/#Bidirectional_Character_Types, with a
|
||||
* few modifications: L->LTR, R->RTL, B->BS, S->SS.
|
||||
*/
|
||||
FRIBIDI_ENTRY const char *fribidi_get_bidi_type_name (
|
||||
FriBidiCharType t /* input bidi type */
|
||||
) FRIBIDI_GNUC_CONST;
|
||||
|
||||
#include "fribidi-enddecls.h"
|
||||
|
||||
#endif /* !_FRIBIDI_BIDI_TYPES_H */
|
||||
/* Editor directions:
|
||||
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
|
||||
*/
|
||||
@@ -1,992 +0,0 @@
|
||||
/* FriBidi
|
||||
* fribidi-bidi.c - bidirectional algorithm
|
||||
*
|
||||
* $Id: fribidi-bidi.c,v 1.21 2007/03/15 18:09:25 behdad Exp $
|
||||
* $Author: behdad $
|
||||
* $Date: 2007/03/15 18:09:25 $
|
||||
* $Revision: 1.21 $
|
||||
* $Source: /cvs/fribidi/fribidi2/lib/fribidi-bidi.c,v $
|
||||
*
|
||||
* Authors:
|
||||
* Behdad Esfahbod, 2001, 2002, 2004
|
||||
* Dov Grobgeld, 1999, 2000
|
||||
*
|
||||
* Copyright (C) 2004 Sharif FarsiWeb, Inc
|
||||
* Copyright (C) 2001,2002 Behdad Esfahbod
|
||||
* Copyright (C) 1999,2000 Dov Grobgeld
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library, in a file named COPYING; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA
|
||||
*
|
||||
* For licensing issues, contact <license@farsiweb.info>.
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <fribidi-bidi.h>
|
||||
#include <fribidi-mirroring.h>
|
||||
#include <fribidi-unicode.h>
|
||||
|
||||
#include "mem.h"
|
||||
#include "bidi-types.h"
|
||||
#include "run.h"
|
||||
|
||||
/*
|
||||
* This file implements most of Unicode Standard Annex #9, Tracking Number 13.
|
||||
*/
|
||||
|
||||
#ifndef MAX
|
||||
# define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||
#endif /* !MAX */
|
||||
|
||||
/* Some convenience macros */
|
||||
#define RL_TYPE(list) ((list)->type)
|
||||
#define RL_LEN(list) ((list)->len)
|
||||
#define RL_POS(list) ((list)->pos)
|
||||
#define RL_LEVEL(list) ((list)->level)
|
||||
|
||||
static FriBidiRun *
|
||||
merge_with_prev (
|
||||
FriBidiRun *second
|
||||
)
|
||||
{
|
||||
FriBidiRun *first;
|
||||
|
||||
fribidi_assert (second);
|
||||
fribidi_assert (second->next);
|
||||
first = second->prev;
|
||||
fribidi_assert (first);
|
||||
|
||||
first->next = second->next;
|
||||
first->next->prev = first;
|
||||
RL_LEN (first) += RL_LEN (second);
|
||||
free_run (second);
|
||||
return first;
|
||||
}
|
||||
|
||||
static void
|
||||
compact_list (
|
||||
FriBidiRun *list
|
||||
)
|
||||
{
|
||||
fribidi_assert (list);
|
||||
|
||||
if (list->next)
|
||||
for_run_list (list, list)
|
||||
if (RL_TYPE (list->prev) == RL_TYPE (list)
|
||||
&& RL_LEVEL (list->prev) == RL_LEVEL (list))
|
||||
list = merge_with_prev (list);
|
||||
}
|
||||
|
||||
static void
|
||||
compact_neutrals (
|
||||
FriBidiRun *list
|
||||
)
|
||||
{
|
||||
fribidi_assert (list);
|
||||
|
||||
if (list->next)
|
||||
{
|
||||
for_run_list (list, list)
|
||||
{
|
||||
if (RL_LEVEL (list->prev) == RL_LEVEL (list)
|
||||
&&
|
||||
((RL_TYPE
|
||||
(list->prev) == RL_TYPE (list)
|
||||
|| (FRIBIDI_IS_NEUTRAL (RL_TYPE (list->prev))
|
||||
&& FRIBIDI_IS_NEUTRAL (RL_TYPE (list))))))
|
||||
list = merge_with_prev (list);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG+0
|
||||
/*======================================================================
|
||||
* For debugging, define some functions for printing the types and the
|
||||
* levels.
|
||||
*----------------------------------------------------------------------*/
|
||||
|
||||
static char char_from_level_array[] = {
|
||||
'$', /* -1 == FRIBIDI_SENTINEL, indicating
|
||||
* start or end of string. */
|
||||
/* 0-61 == 0-9,a-z,A-Z are the the only valid levels before resolving
|
||||
* implicits. after that the level @ may be appear too. */
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
|
||||
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
|
||||
'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
|
||||
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
||||
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
|
||||
'Y', 'Z',
|
||||
|
||||
'@', /* 62 == only must appear after resolving
|
||||
* implicits. */
|
||||
|
||||
'!', /* 63 == FRIBIDI_LEVEL_INVALID, internal error,
|
||||
* this level shouldn't be seen. */
|
||||
|
||||
'*', '*', '*', '*', '*' /* >= 64 == overflows, this levels and higher
|
||||
* levels show a real bug!. */
|
||||
};
|
||||
|
||||
#define fribidi_char_from_level(level) char_from_level_array[(level) + 1]
|
||||
|
||||
static void
|
||||
print_types_re (
|
||||
const FriBidiRun *pp
|
||||
)
|
||||
{
|
||||
fribidi_assert (pp);
|
||||
|
||||
MSG (" Run types : ");
|
||||
for_run_list (pp, pp)
|
||||
{
|
||||
MSG5 ("%d:%d(%s)[%d] ",
|
||||
pp->pos, pp->len, fribidi_get_bidi_type_name (pp->type), pp->level);
|
||||
}
|
||||
MSG ("\n");
|
||||
}
|
||||
|
||||
static void
|
||||
print_resolved_levels (
|
||||
const FriBidiRun *pp
|
||||
)
|
||||
{
|
||||
fribidi_assert (pp);
|
||||
|
||||
MSG (" Res. levels: ");
|
||||
for_run_list (pp, pp)
|
||||
{
|
||||
register FriBidiStrIndex i;
|
||||
for (i = RL_LEN (pp); i; i--)
|
||||
MSG2 ("%c", fribidi_char_from_level (RL_LEVEL (pp)));
|
||||
}
|
||||
MSG ("\n");
|
||||
}
|
||||
|
||||
static void
|
||||
print_resolved_types (
|
||||
const FriBidiRun *pp
|
||||
)
|
||||
{
|
||||
fribidi_assert (pp);
|
||||
|
||||
MSG (" Res. types : ");
|
||||
for_run_list (pp, pp)
|
||||
{
|
||||
FriBidiStrIndex i;
|
||||
for (i = RL_LEN (pp); i; i--)
|
||||
MSG2 ("%c", fribidi_char_from_bidi_type (pp->type));
|
||||
}
|
||||
MSG ("\n");
|
||||
}
|
||||
|
||||
static void
|
||||
print_bidi_string (
|
||||
/* input */
|
||||
const FriBidiCharType *bidi_types,
|
||||
const FriBidiStrIndex len
|
||||
)
|
||||
{
|
||||
register FriBidiStrIndex i;
|
||||
|
||||
fribidi_assert (bidi_types);
|
||||
|
||||
MSG (" Org. types : ");
|
||||
for (i = 0; i < len; i++)
|
||||
MSG2 ("%c", fribidi_char_from_bidi_type (bidi_types[i]));
|
||||
MSG ("\n");
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
|
||||
/*=========================================================================
|
||||
* define macros for push and pop the status in to / out of the stack
|
||||
*-------------------------------------------------------------------------*/
|
||||
|
||||
/* There are a few little points in pushing into and poping from the status
|
||||
stack:
|
||||
1. when the embedding level is not valid (more than
|
||||
FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL=61), you must reject it, and not to push
|
||||
into the stack, but when you see a PDF, you must find the matching code,
|
||||
and if it was pushed in the stack, pop it, it means you must pop if and
|
||||
only if you have pushed the matching code, the over_pushed var counts the
|
||||
number of rejected codes so far.
|
||||
2. there's a more confusing point too, when the embedding level is exactly
|
||||
FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL-1=60, an LRO or LRE is rejected
|
||||
because the new level would be FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL+1=62, that
|
||||
is invalid; but an RLO or RLE is accepted because the new level is
|
||||
FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL=61, that is valid, so the rejected codes
|
||||
may be not continuous in the logical order, in fact there are at most two
|
||||
continuous intervals of codes, with an RLO or RLE between them. To support
|
||||
this case, the first_interval var counts the number of rejected codes in
|
||||
the first interval, when it is 0, means that there is only one interval.
|
||||
*/
|
||||
|
||||
/* a. If this new level would be valid, then this embedding code is valid.
|
||||
Remember (push) the current embedding level and override status.
|
||||
Reset current level to this new level, and reset the override status to
|
||||
new_override.
|
||||
b. If the new level would not be valid, then this code is invalid. Don't
|
||||
change the current level or override status.
|
||||
*/
|
||||
#define PUSH_STATUS \
|
||||
FRIBIDI_BEGIN_STMT \
|
||||
if LIKELY(new_level <= FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL) \
|
||||
{ \
|
||||
if UNLIKELY(level == FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL - 1) \
|
||||
first_interval = over_pushed; \
|
||||
status_stack[stack_size].level = level; \
|
||||
status_stack[stack_size].override = override; \
|
||||
stack_size++; \
|
||||
level = new_level; \
|
||||
override = new_override; \
|
||||
} else \
|
||||
over_pushed++; \
|
||||
FRIBIDI_END_STMT
|
||||
|
||||
/* If there was a valid matching code, restore (pop) the last remembered
|
||||
(pushed) embedding level and directional override.
|
||||
*/
|
||||
#define POP_STATUS \
|
||||
FRIBIDI_BEGIN_STMT \
|
||||
if (stack_size) \
|
||||
{ \
|
||||
if UNLIKELY(over_pushed > first_interval) \
|
||||
over_pushed--; \
|
||||
else \
|
||||
{ \
|
||||
if LIKELY(over_pushed == first_interval) \
|
||||
first_interval = 0; \
|
||||
stack_size--; \
|
||||
level = status_stack[stack_size].level; \
|
||||
override = status_stack[stack_size].override; \
|
||||
} \
|
||||
} \
|
||||
FRIBIDI_END_STMT
|
||||
|
||||
|
||||
/* Return the type of previous run or the SOR, if already at the start of
|
||||
a level run. */
|
||||
#define PREV_TYPE_OR_SOR(pp) \
|
||||
( \
|
||||
RL_LEVEL(pp->prev) == RL_LEVEL(pp) ? \
|
||||
RL_TYPE(pp->prev) : \
|
||||
FRIBIDI_LEVEL_TO_DIR(MAX(RL_LEVEL(pp->prev), RL_LEVEL(pp))) \
|
||||
)
|
||||
|
||||
/* Return the type of next run or the EOR, if already at the end of
|
||||
a level run. */
|
||||
#define NEXT_TYPE_OR_EOR(pp) \
|
||||
( \
|
||||
RL_LEVEL(pp->next) == RL_LEVEL(pp) ? \
|
||||
RL_TYPE(pp->next) : \
|
||||
FRIBIDI_LEVEL_TO_DIR(MAX(RL_LEVEL(pp->next), RL_LEVEL(pp))) \
|
||||
)
|
||||
|
||||
|
||||
/* Return the embedding direction of a link. */
|
||||
#define FRIBIDI_EMBEDDING_DIRECTION(link) \
|
||||
FRIBIDI_LEVEL_TO_DIR(RL_LEVEL(link))
|
||||
|
||||
|
||||
FRIBIDI_ENTRY FriBidiParType
|
||||
fribidi_get_par_direction (
|
||||
/* input */
|
||||
const FriBidiCharType *bidi_types,
|
||||
const FriBidiStrIndex len
|
||||
)
|
||||
{
|
||||
register FriBidiStrIndex i;
|
||||
|
||||
fribidi_assert (bidi_types);
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
if (FRIBIDI_IS_LETTER (bidi_types[i]))
|
||||
return FRIBIDI_IS_RTL (bidi_types[i]) ? FRIBIDI_PAR_RTL :
|
||||
FRIBIDI_PAR_LTR;
|
||||
|
||||
return FRIBIDI_PAR_ON;
|
||||
}
|
||||
|
||||
FRIBIDI_ENTRY FriBidiLevel
|
||||
fribidi_get_par_embedding_levels (
|
||||
/* input */
|
||||
const FriBidiCharType *bidi_types,
|
||||
const FriBidiStrIndex len,
|
||||
/* input and output */
|
||||
FriBidiParType *pbase_dir,
|
||||
/* output */
|
||||
FriBidiLevel *embedding_levels
|
||||
)
|
||||
{
|
||||
FriBidiLevel base_level, max_level = 0;
|
||||
FriBidiParType base_dir;
|
||||
FriBidiRun *main_run_list = NULL, *explicits_list = NULL, *pp;
|
||||
fribidi_boolean status = false;
|
||||
|
||||
if UNLIKELY
|
||||
(!len)
|
||||
{
|
||||
status = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
DBG ("in fribidi_get_par_embedding_levels");
|
||||
|
||||
fribidi_assert (bidi_types);
|
||||
fribidi_assert (pbase_dir);
|
||||
fribidi_assert (embedding_levels);
|
||||
|
||||
/* Determinate character types */
|
||||
{
|
||||
/* Get run-length encoded character types */
|
||||
main_run_list = run_list_encode_bidi_types (bidi_types, len);
|
||||
if UNLIKELY
|
||||
(!main_run_list) goto out;
|
||||
}
|
||||
|
||||
/* Find base level */
|
||||
/* If no strong base_dir was found, resort to the weak direction
|
||||
that was passed on input. */
|
||||
base_level = FRIBIDI_DIR_TO_LEVEL (*pbase_dir);
|
||||
if (!FRIBIDI_IS_STRONG (*pbase_dir))
|
||||
/* P2. P3. Search for first strong character and use its direction as
|
||||
base direction */
|
||||
{
|
||||
for_run_list (pp, main_run_list) if (FRIBIDI_IS_LETTER (RL_TYPE (pp)))
|
||||
{
|
||||
base_level = FRIBIDI_DIR_TO_LEVEL (RL_TYPE (pp));
|
||||
*pbase_dir = FRIBIDI_LEVEL_TO_DIR (base_level);
|
||||
break;
|
||||
}
|
||||
}
|
||||
base_dir = FRIBIDI_LEVEL_TO_DIR (base_level);
|
||||
DBG2 (" base level : %c", fribidi_char_from_level (base_level));
|
||||
DBG2 (" base dir : %c", fribidi_char_from_bidi_type (base_dir));
|
||||
|
||||
# if DEBUG
|
||||
if UNLIKELY
|
||||
(fribidi_debug_status ())
|
||||
{
|
||||
print_types_re (main_run_list);
|
||||
}
|
||||
# endif /* DEBUG */
|
||||
|
||||
/* Explicit Levels and Directions */
|
||||
DBG ("explicit levels and directions");
|
||||
{
|
||||
FriBidiLevel level, new_level;
|
||||
FriBidiCharType override, new_override;
|
||||
FriBidiStrIndex i;
|
||||
int stack_size, over_pushed, first_interval;
|
||||
struct
|
||||
{
|
||||
FriBidiCharType override; /* only LTR, RTL and ON are valid */
|
||||
FriBidiLevel level;
|
||||
} *status_stack;
|
||||
FriBidiRun temp_link;
|
||||
|
||||
/* explicits_list is a list like main_run_list, that holds the explicit
|
||||
codes that are removed from main_run_list, to reinsert them later by
|
||||
calling the shadow_run_list.
|
||||
*/
|
||||
explicits_list = new_run_list ();
|
||||
if UNLIKELY
|
||||
(!explicits_list) goto out;
|
||||
|
||||
/* X1. Begin by setting the current embedding level to the paragraph
|
||||
embedding level. Set the directional override status to neutral.
|
||||
Process each character iteratively, applying rules X2 through X9.
|
||||
Only embedding levels from 0 to 61 are valid in this phase. */
|
||||
|
||||
level = base_level;
|
||||
override = FRIBIDI_TYPE_ON;
|
||||
/* stack */
|
||||
stack_size = 0;
|
||||
over_pushed = 0;
|
||||
first_interval = 0;
|
||||
status_stack = fribidi_malloc (sizeof (status_stack[0]) *
|
||||
FRIBIDI_BIDI_MAX_RESOLVED_LEVELS);
|
||||
|
||||
for_run_list (pp, main_run_list)
|
||||
{
|
||||
FriBidiCharType this_type = RL_TYPE (pp);
|
||||
if (FRIBIDI_IS_EXPLICIT_OR_BN (this_type))
|
||||
{
|
||||
if (FRIBIDI_IS_STRONG (this_type))
|
||||
{ /* LRE, RLE, LRO, RLO */
|
||||
/* 1. Explicit Embeddings */
|
||||
/* X2. With each RLE, compute the least greater odd
|
||||
embedding level. */
|
||||
/* X3. With each LRE, compute the least greater even
|
||||
embedding level. */
|
||||
/* 2. Explicit Overrides */
|
||||
/* X4. With each RLO, compute the least greater odd
|
||||
embedding level. */
|
||||
/* X5. With each LRO, compute the least greater even
|
||||
embedding level. */
|
||||
new_override = FRIBIDI_EXPLICIT_TO_OVERRIDE_DIR (this_type);
|
||||
for (i = RL_LEN (pp); i; i--)
|
||||
{
|
||||
new_level =
|
||||
((level + FRIBIDI_DIR_TO_LEVEL (this_type) + 2) & ~1) -
|
||||
FRIBIDI_DIR_TO_LEVEL (this_type);
|
||||
PUSH_STATUS;
|
||||
}
|
||||
}
|
||||
else if (this_type == FRIBIDI_TYPE_PDF)
|
||||
{
|
||||
/* 3. Terminating Embeddings and overrides */
|
||||
/* X7. With each PDF, determine the matching embedding or
|
||||
override code. */
|
||||
for (i = RL_LEN (pp); i; i--)
|
||||
POP_STATUS;
|
||||
}
|
||||
|
||||
/* X9. Remove all RLE, LRE, RLO, LRO, PDF, and BN codes. */
|
||||
/* Remove element and add it to explicits_list */
|
||||
RL_LEVEL (pp) = FRIBIDI_SENTINEL;
|
||||
temp_link.next = pp->next;
|
||||
move_node_before (pp, explicits_list);
|
||||
pp = &temp_link;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* X6. For all types besides RLE, LRE, RLO, LRO, and PDF:
|
||||
a. Set the level of the current character to the current
|
||||
embedding level.
|
||||
b. Whenever the directional override status is not neutral,
|
||||
reset the current character type to the directional override
|
||||
status. */
|
||||
RL_LEVEL (pp) = level;
|
||||
if (!FRIBIDI_IS_NEUTRAL (override))
|
||||
RL_TYPE (pp) = override;
|
||||
}
|
||||
/* X8. All explicit directional embeddings and overrides are
|
||||
completely terminated at the end of each paragraph. Paragraph
|
||||
separators are not included in the embedding. */
|
||||
/* This function is running on a single paragraph, so we can do
|
||||
X8 after all the input is processed. */
|
||||
}
|
||||
|
||||
/* Implementing X8. It has no effect on a single paragraph! */
|
||||
level = base_level;
|
||||
override = FRIBIDI_TYPE_ON;
|
||||
stack_size = 0;
|
||||
over_pushed = 0;
|
||||
|
||||
fribidi_free (status_stack);
|
||||
}
|
||||
/* X10. The remaining rules are applied to each run of characters at the
|
||||
same level. For each run, determine the start-of-level-run (sor) and
|
||||
end-of-level-run (eor) type, either L or R. This depends on the
|
||||
higher of the two levels on either side of the boundary (at the start
|
||||
or end of the paragraph, the level of the 'other' run is the base
|
||||
embedding level). If the higher level is odd, the type is R, otherwise
|
||||
it is L. */
|
||||
/* Resolving Implicit Levels can be done out of X10 loop, so only change
|
||||
of Resolving Weak Types and Resolving Neutral Types is needed. */
|
||||
|
||||
compact_list (main_run_list);
|
||||
|
||||
# if DEBUG
|
||||
if UNLIKELY
|
||||
(fribidi_debug_status ())
|
||||
{
|
||||
print_types_re (main_run_list);
|
||||
print_bidi_string (bidi_types, len);
|
||||
print_resolved_levels (main_run_list);
|
||||
print_resolved_types (main_run_list);
|
||||
}
|
||||
# endif /* DEBUG */
|
||||
|
||||
/* 4. Resolving weak types */
|
||||
DBG ("resolving weak types");
|
||||
{
|
||||
FriBidiCharType last_strong, prev_type_orig;
|
||||
fribidi_boolean w4;
|
||||
|
||||
last_strong = base_dir;
|
||||
|
||||
for_run_list (pp, main_run_list)
|
||||
{
|
||||
register FriBidiCharType prev_type, this_type, next_type;
|
||||
|
||||
prev_type = PREV_TYPE_OR_SOR (pp);
|
||||
this_type = RL_TYPE (pp);
|
||||
next_type = NEXT_TYPE_OR_EOR (pp);
|
||||
|
||||
if (FRIBIDI_IS_STRONG (prev_type))
|
||||
last_strong = prev_type;
|
||||
|
||||
/* W1. NSM
|
||||
Examine each non-spacing mark (NSM) in the level run, and change the
|
||||
type of the NSM to the type of the previous character. If the NSM
|
||||
is at the start of the level run, it will get the type of sor. */
|
||||
/* Implementation note: it is important that if the previous character
|
||||
is not sor, then we should merge this run with the previous,
|
||||
because of rules like W5, that we assume all of a sequence of
|
||||
adjacent ETs are in one FriBidiRun. */
|
||||
if (this_type == FRIBIDI_TYPE_NSM)
|
||||
{
|
||||
if (RL_LEVEL (pp->prev) == RL_LEVEL (pp))
|
||||
pp = merge_with_prev (pp);
|
||||
else
|
||||
RL_TYPE (pp) = prev_type;
|
||||
continue; /* As we know the next condition cannot be true. */
|
||||
}
|
||||
|
||||
/* W2: European numbers. */
|
||||
if (this_type == FRIBIDI_TYPE_EN && last_strong == FRIBIDI_TYPE_AL)
|
||||
{
|
||||
RL_TYPE (pp) = FRIBIDI_TYPE_AN;
|
||||
|
||||
/* Resolving dependency of loops for rules W1 and W2, so we
|
||||
can merge them in one loop. */
|
||||
if (next_type == FRIBIDI_TYPE_NSM)
|
||||
RL_TYPE (pp->next) = FRIBIDI_TYPE_AN;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
last_strong = base_dir;
|
||||
/* Resolving dependency of loops for rules W4 and W5, W5 may
|
||||
want to prevent W4 to take effect in the next turn, do this
|
||||
through "w4". */
|
||||
w4 = true;
|
||||
/* Resolving dependency of loops for rules W4 and W5 with W7,
|
||||
W7 may change an EN to L but it sets the prev_type_orig if needed,
|
||||
so W4 and W5 in next turn can still do their works. */
|
||||
prev_type_orig = FRIBIDI_TYPE_ON;
|
||||
|
||||
for_run_list (pp, main_run_list)
|
||||
{
|
||||
register FriBidiCharType prev_type, this_type, next_type;
|
||||
|
||||
prev_type = PREV_TYPE_OR_SOR (pp);
|
||||
this_type = RL_TYPE (pp);
|
||||
next_type = NEXT_TYPE_OR_EOR (pp);
|
||||
|
||||
if (FRIBIDI_IS_STRONG (prev_type))
|
||||
last_strong = prev_type;
|
||||
|
||||
/* W3: Change ALs to R. */
|
||||
if (this_type == FRIBIDI_TYPE_AL)
|
||||
{
|
||||
RL_TYPE (pp) = FRIBIDI_TYPE_RTL;
|
||||
w4 = true;
|
||||
prev_type_orig = FRIBIDI_TYPE_ON;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* W4. A single european separator changes to a european number.
|
||||
A single common separator between two numbers of the same type
|
||||
changes to that type. */
|
||||
if (w4
|
||||
&& RL_LEN (pp) == 1 && FRIBIDI_IS_ES_OR_CS (this_type)
|
||||
&& FRIBIDI_IS_NUMBER (prev_type_orig)
|
||||
&& prev_type_orig == next_type
|
||||
&& (prev_type_orig == FRIBIDI_TYPE_EN
|
||||
|| this_type == FRIBIDI_TYPE_CS))
|
||||
{
|
||||
RL_TYPE (pp) = prev_type;
|
||||
this_type = RL_TYPE (pp);
|
||||
}
|
||||
w4 = true;
|
||||
|
||||
/* W5. A sequence of European terminators adjacent to European
|
||||
numbers changes to All European numbers. */
|
||||
if (this_type == FRIBIDI_TYPE_ET
|
||||
&& (prev_type_orig == FRIBIDI_TYPE_EN
|
||||
|| next_type == FRIBIDI_TYPE_EN))
|
||||
{
|
||||
RL_TYPE (pp) = FRIBIDI_TYPE_EN;
|
||||
w4 = false;
|
||||
this_type = RL_TYPE (pp);
|
||||
}
|
||||
|
||||
/* W6. Otherwise change separators and terminators to other neutral. */
|
||||
if (FRIBIDI_IS_NUMBER_SEPARATOR_OR_TERMINATOR (this_type))
|
||||
RL_TYPE (pp) = FRIBIDI_TYPE_ON;
|
||||
|
||||
/* W7. Change european numbers to L. */
|
||||
if (this_type == FRIBIDI_TYPE_EN && last_strong == FRIBIDI_TYPE_LTR)
|
||||
{
|
||||
RL_TYPE (pp) = FRIBIDI_TYPE_LTR;
|
||||
prev_type_orig = (RL_LEVEL (pp) == RL_LEVEL (pp->next) ?
|
||||
FRIBIDI_TYPE_EN : FRIBIDI_TYPE_ON);
|
||||
}
|
||||
else
|
||||
prev_type_orig = PREV_TYPE_OR_SOR (pp->next);
|
||||
}
|
||||
}
|
||||
|
||||
compact_neutrals (main_run_list);
|
||||
|
||||
# if DEBUG
|
||||
if UNLIKELY
|
||||
(fribidi_debug_status ())
|
||||
{
|
||||
print_resolved_levels (main_run_list);
|
||||
print_resolved_types (main_run_list);
|
||||
}
|
||||
# endif /* DEBUG */
|
||||
|
||||
/* 5. Resolving Neutral Types */
|
||||
DBG ("resolving neutral types");
|
||||
{
|
||||
/* N1. and N2.
|
||||
For each neutral, resolve it. */
|
||||
for_run_list (pp, main_run_list)
|
||||
{
|
||||
FriBidiCharType prev_type, this_type, next_type;
|
||||
|
||||
/* "European and Arabic numbers are treated as though they were R"
|
||||
FRIBIDI_CHANGE_NUMBER_TO_RTL does this. */
|
||||
this_type = FRIBIDI_CHANGE_NUMBER_TO_RTL (RL_TYPE (pp));
|
||||
prev_type = FRIBIDI_CHANGE_NUMBER_TO_RTL (PREV_TYPE_OR_SOR (pp));
|
||||
next_type = FRIBIDI_CHANGE_NUMBER_TO_RTL (NEXT_TYPE_OR_EOR (pp));
|
||||
|
||||
if (FRIBIDI_IS_NEUTRAL (this_type))
|
||||
RL_TYPE (pp) = (prev_type == next_type) ?
|
||||
/* N1. */ prev_type :
|
||||
/* N2. */ FRIBIDI_EMBEDDING_DIRECTION (pp);
|
||||
}
|
||||
}
|
||||
|
||||
compact_list (main_run_list);
|
||||
|
||||
# if DEBUG
|
||||
if UNLIKELY
|
||||
(fribidi_debug_status ())
|
||||
{
|
||||
print_resolved_levels (main_run_list);
|
||||
print_resolved_types (main_run_list);
|
||||
}
|
||||
# endif /* DEBUG */
|
||||
|
||||
/* 6. Resolving implicit levels */
|
||||
DBG ("resolving implicit levels");
|
||||
{
|
||||
max_level = base_level;
|
||||
|
||||
for_run_list (pp, main_run_list)
|
||||
{
|
||||
FriBidiCharType this_type;
|
||||
int level;
|
||||
|
||||
this_type = RL_TYPE (pp);
|
||||
level = RL_LEVEL (pp);
|
||||
|
||||
/* I1. Even */
|
||||
/* I2. Odd */
|
||||
if (FRIBIDI_IS_NUMBER (this_type))
|
||||
RL_LEVEL (pp) = (level + 2) & ~1;
|
||||
else
|
||||
RL_LEVEL (pp) =
|
||||
level +
|
||||
(FRIBIDI_LEVEL_IS_RTL (level) ^ FRIBIDI_DIR_TO_LEVEL (this_type));
|
||||
|
||||
if (RL_LEVEL (pp) > max_level)
|
||||
max_level = RL_LEVEL (pp);
|
||||
}
|
||||
}
|
||||
|
||||
compact_list (main_run_list);
|
||||
|
||||
# if DEBUG
|
||||
if UNLIKELY
|
||||
(fribidi_debug_status ())
|
||||
{
|
||||
print_bidi_string (bidi_types, len);
|
||||
print_resolved_levels (main_run_list);
|
||||
print_resolved_types (main_run_list);
|
||||
}
|
||||
# endif /* DEBUG */
|
||||
|
||||
/* Reinsert the explicit codes & BN's that are already removed, from the
|
||||
explicits_list to main_run_list. */
|
||||
DBG ("reinserting explicit codes");
|
||||
if UNLIKELY
|
||||
(explicits_list->next != explicits_list)
|
||||
{
|
||||
register FriBidiRun *p;
|
||||
register fribidi_boolean stat =
|
||||
shadow_run_list (main_run_list, explicits_list, true);
|
||||
explicits_list = NULL;
|
||||
if UNLIKELY
|
||||
(!stat) goto out;
|
||||
|
||||
/* Set level of inserted explicit chars to that of their previous
|
||||
* char, such that they do not affect reordering. */
|
||||
p = main_run_list->next;
|
||||
if (p != main_run_list && p->level == FRIBIDI_SENTINEL)
|
||||
p->level = base_level;
|
||||
for_run_list (p, main_run_list) if (p->level == FRIBIDI_SENTINEL)
|
||||
p->level = p->prev->level;
|
||||
}
|
||||
|
||||
# if DEBUG
|
||||
if UNLIKELY
|
||||
(fribidi_debug_status ())
|
||||
{
|
||||
print_types_re (main_run_list);
|
||||
print_resolved_levels (main_run_list);
|
||||
print_resolved_types (main_run_list);
|
||||
}
|
||||
# endif /* DEBUG */
|
||||
|
||||
DBG ("reset the embedding levels, 1, 2, 3.");
|
||||
{
|
||||
register int j, state, pos;
|
||||
register FriBidiCharType char_type;
|
||||
register FriBidiRun *p, *q, *list;
|
||||
|
||||
/* L1. Reset the embedding levels of some chars:
|
||||
1. segment separators,
|
||||
2. paragraph separators,
|
||||
3. any sequence of whitespace characters preceding a segment
|
||||
separator or paragraph separator, and
|
||||
... (to be continued in fribidi_reorder_line()). */
|
||||
list = new_run_list ();
|
||||
if UNLIKELY
|
||||
(!list) goto out;
|
||||
q = list;
|
||||
state = 1;
|
||||
pos = len - 1;
|
||||
for (j = len - 1; j >= -1; j--)
|
||||
{
|
||||
/* close up the open link at the end */
|
||||
if (j >= 0)
|
||||
char_type = bidi_types[j];
|
||||
else
|
||||
char_type = FRIBIDI_TYPE_ON;
|
||||
if (!state && FRIBIDI_IS_SEPARATOR (char_type))
|
||||
{
|
||||
state = 1;
|
||||
pos = j;
|
||||
}
|
||||
else if (state && !FRIBIDI_IS_EXPLICIT_OR_SEPARATOR_OR_BN_OR_WS
|
||||
(char_type))
|
||||
{
|
||||
state = 0;
|
||||
p = new_run ();
|
||||
if UNLIKELY
|
||||
(!p)
|
||||
{
|
||||
free_run_list (list);
|
||||
goto out;
|
||||
}
|
||||
p->pos = j + 1;
|
||||
p->len = pos - j;
|
||||
p->type = base_dir;
|
||||
p->level = base_level;
|
||||
move_node_before (p, q);
|
||||
q = p;
|
||||
}
|
||||
}
|
||||
if UNLIKELY
|
||||
(!shadow_run_list (main_run_list, list, false)) goto out;
|
||||
}
|
||||
|
||||
# if DEBUG
|
||||
if UNLIKELY
|
||||
(fribidi_debug_status ())
|
||||
{
|
||||
print_types_re (main_run_list);
|
||||
print_resolved_levels (main_run_list);
|
||||
print_resolved_types (main_run_list);
|
||||
}
|
||||
# endif /* DEBUG */
|
||||
|
||||
{
|
||||
FriBidiStrIndex pos = 0;
|
||||
for_run_list (pp, main_run_list)
|
||||
{
|
||||
register FriBidiStrIndex l;
|
||||
register FriBidiLevel level = pp->level;
|
||||
for (l = pp->len; l; l--)
|
||||
embedding_levels[pos++] = level;
|
||||
}
|
||||
}
|
||||
|
||||
status = true;
|
||||
|
||||
out:
|
||||
DBG ("leaving fribidi_get_par_embedding_levels");
|
||||
|
||||
if (main_run_list)
|
||||
free_run_list (main_run_list);
|
||||
if UNLIKELY
|
||||
(explicits_list) free_run_list (explicits_list);
|
||||
|
||||
return status ? max_level + 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
bidi_string_reverse (
|
||||
FriBidiChar *str,
|
||||
const FriBidiStrIndex len
|
||||
)
|
||||
{
|
||||
FriBidiStrIndex i;
|
||||
|
||||
fribidi_assert (str);
|
||||
|
||||
for (i = 0; i < len / 2; i++)
|
||||
{
|
||||
FriBidiChar tmp = str[i];
|
||||
str[i] = str[len - 1 - i];
|
||||
str[len - 1 - i] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
index_array_reverse (
|
||||
FriBidiStrIndex *arr,
|
||||
const FriBidiStrIndex len
|
||||
)
|
||||
{
|
||||
FriBidiStrIndex i;
|
||||
|
||||
fribidi_assert (arr);
|
||||
|
||||
for (i = 0; i < len / 2; i++)
|
||||
{
|
||||
FriBidiStrIndex tmp = arr[i];
|
||||
arr[i] = arr[len - 1 - i];
|
||||
arr[len - 1 - i] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
FRIBIDI_ENTRY FriBidiLevel
|
||||
fribidi_reorder_line (
|
||||
/* input */
|
||||
FriBidiFlags flags, /* reorder flags */
|
||||
const FriBidiCharType *bidi_types,
|
||||
const FriBidiStrIndex len,
|
||||
const FriBidiStrIndex off,
|
||||
const FriBidiParType base_dir,
|
||||
/* input and output */
|
||||
FriBidiLevel *embedding_levels,
|
||||
FriBidiChar *visual_str,
|
||||
/* output */
|
||||
FriBidiStrIndex *map
|
||||
)
|
||||
{
|
||||
fribidi_boolean status = false;
|
||||
FriBidiLevel max_level = 0;
|
||||
|
||||
if UNLIKELY
|
||||
(len == 0)
|
||||
{
|
||||
status = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
DBG ("in fribidi_reorder_line");
|
||||
|
||||
fribidi_assert (bidi_types);
|
||||
fribidi_assert (embedding_levels);
|
||||
|
||||
DBG ("reset the embedding levels, 4. whitespace at the end of line");
|
||||
{
|
||||
register FriBidiStrIndex i;
|
||||
|
||||
/* L1. Reset the embedding levels of some chars:
|
||||
4. any sequence of white space characters at the end of the line. */
|
||||
for (i = off + len - 1; i >= off &&
|
||||
FRIBIDI_IS_EXPLICIT_OR_BN_OR_WS (bidi_types[i]); i--)
|
||||
embedding_levels[i] = FRIBIDI_DIR_TO_LEVEL (base_dir);
|
||||
}
|
||||
|
||||
/* 7. Reordering resolved levels */
|
||||
{
|
||||
register FriBidiLevel level;
|
||||
register FriBidiStrIndex i;
|
||||
|
||||
/* Reorder both the outstring and the order array */
|
||||
{
|
||||
if (FRIBIDI_TEST_BITS (flags, FRIBIDI_FLAG_REORDER_NSM))
|
||||
{
|
||||
/* L3. Reorder NSMs. */
|
||||
for (i = off + len - 1; i >= off; i--)
|
||||
if (FRIBIDI_LEVEL_IS_RTL (embedding_levels[i])
|
||||
&& bidi_types[i] == FRIBIDI_TYPE_NSM)
|
||||
{
|
||||
register FriBidiStrIndex seq_end = i;
|
||||
level = embedding_levels[i];
|
||||
|
||||
for (i--; i >= off &&
|
||||
FRIBIDI_IS_EXPLICIT_OR_BN_OR_NSM (bidi_types[i])
|
||||
&& embedding_levels[i] == level; i--)
|
||||
;
|
||||
|
||||
if (i < off || embedding_levels[i] != level)
|
||||
{
|
||||
i++;
|
||||
DBG ("warning: NSM(s) at the beggining of level run");
|
||||
}
|
||||
|
||||
if (visual_str)
|
||||
{
|
||||
bidi_string_reverse (visual_str + i, seq_end - i + 1);
|
||||
}
|
||||
if (map)
|
||||
{
|
||||
index_array_reverse (map + i, seq_end - i + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Find max_level of the line. We don't reuse the paragraph
|
||||
* max_level, both for a cleaner API, and that the line max_level
|
||||
* may be far less than paragraph max_level. */
|
||||
for (i = off + len - 1; i >= off; i--)
|
||||
if (embedding_levels[i] > max_level)
|
||||
max_level = embedding_levels[i];
|
||||
|
||||
/* L2. Reorder. */
|
||||
for (level = max_level; level > 0; level--)
|
||||
for (i = off + len - 1; i >= off; i--)
|
||||
if (embedding_levels[i] >= level)
|
||||
{
|
||||
/* Find all stretches that are >= level_idx */
|
||||
register FriBidiStrIndex seq_end = i;
|
||||
for (i--; i >= off && embedding_levels[i] >= level; i--)
|
||||
;
|
||||
|
||||
if (visual_str)
|
||||
bidi_string_reverse (visual_str + i + 1, seq_end - i);
|
||||
if (map)
|
||||
index_array_reverse (map + i + 1, seq_end - i);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
status = true;
|
||||
|
||||
out:
|
||||
|
||||
return status ? max_level + 1 : 0;
|
||||
}
|
||||
|
||||
/* Editor directions:
|
||||
* vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
|
||||
*/
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user