Compare commits
900 Commits
feature/pr
...
main/gingo
Author | SHA1 | Date |
---|---|---|
Nuno Gonçalves (Ulukyn) | 7df9b2f255 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 8697553956 | 3 years ago |
nimetu | d2508c8b15 | 3 years ago |
Nuno Gonçalves (Ulukyn) | d385dedabc | 3 years ago |
Nuno Gonçalves (Ulukyn) | ae33eb99bf | 3 years ago |
Nuno Gonçalves (Ulukyn) | 2b88fd66ba | 3 years ago |
Ben Saine | be5bfd992c | 3 years ago |
Nuno Gonçalves (Ulukyn) | 9a24e7557f | 3 years ago |
Nuno Gonçalves (Ulukyn) | 8708fd74c6 | 3 years ago |
Nuno | db86219eab | 3 years ago |
Nuno Gonçalves (Ulukyn) | c6ec8a8d7d | 3 years ago |
Ben Saine | 357934fcde | 3 years ago |
Nuno Gonçalves (Ulukyn) | e784c3aab1 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 22b4c074e8 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 255257a7f5 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 855410f3d0 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 71a2c6f6e8 | 3 years ago |
Ben Saine | 3b2553e3dd | 3 years ago |
Nuno Gonçalves (Ulukyn) | 54c7e09a10 | 3 years ago |
Meelis Mägi | aebab35cad | 3 years ago |
Nuno Gonçalves (Ulukyn) | 7cb6d4287e | 3 years ago |
Meelis Mägi | 663de25cbe | 3 years ago |
Nuno | a7811f553e | 3 years ago |
Nuno | 743bf7f601 | 3 years ago |
Nuno Gonçalves (Ulukyn) | e891dddd1e | 3 years ago |
Meelis Mägi | e185ddc19f | 3 years ago |
Nuno Gonçalves (Ulukyn) | b12c7ac25c | 3 years ago |
Meelis Mägi | 9cff221a1e | 3 years ago |
Nuno Gonçalves (Ulukyn) | 219bf0e066 | 3 years ago |
Meelis Mägi | c012e7ffcf | 3 years ago |
Ben Saine | 82b724fe88 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 9f2d2e7dda | 3 years ago |
Ben Saine | 5df8ec43a0 | 3 years ago |
Nimetu | 7c82f26bac | 3 years ago |
Nimetu | 3521d2d02e | 3 years ago |
Nuno | 88280ef02f | 3 years ago |
Nimetu | 7344c98e6e | 3 years ago |
Nimetu | 005e714f7d | 3 years ago |
Nimetu | 37abc25dcb | 3 years ago |
kaetemi | ec41ba753f | 3 years ago |
kaetemi | 63b4ea547a | 3 years ago |
Nimetu | c31747a939 | 3 years ago |
Nimetu | 8aa1aed3bd | 3 years ago |
Nimetu | 19c5b582bc | 3 years ago |
Nuno | 993d749dba | 3 years ago |
Nimetu | f6ac9bc4c1 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 9e3064871a | 3 years ago |
Nimetu | 36e83e32f4 | 3 years ago |
Nuno | 0df3879358 | 3 years ago |
Nuno | b7e5ac18e9 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 80623a20cc | 3 years ago |
Nuno Gonçalves (Ulukyn) | efbceec12e | 3 years ago |
Nimetu | 013aad73d2 | 3 years ago |
Nuno | de638dfe6c | 3 years ago |
Nuno | 177e2395a5 | 3 years ago |
Nuno | 0e2ec103ab | 3 years ago |
Nuno | 574efe0c36 | 3 years ago |
Nuno | e43515e88a | 3 years ago |
Nuno | 41794a1122 | 3 years ago |
Nimetu | c47db9bf94 | 3 years ago |
Nimetu | b325126b20 | 3 years ago |
Nuno | 35a7a6628b | 3 years ago |
Nimetu | aa34e88101 | 3 years ago |
Nuno | b667ccb6b6 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 568d8ab895 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 7f01b21d11 | 3 years ago |
Nuno Gonçalves (Ulukyn) | d436d5616a | 3 years ago |
Nuno Gonçalves (Ulukyn) | 973e183f2e | 3 years ago |
Nuno | 5c56c87d09 | 3 years ago |
Nuno | c616010246 | 3 years ago |
Nuno | 700a9aadb7 | 3 years ago |
Nuno Gonçalves (Ulukyn) | a246f3e5d0 | 3 years ago |
Meelis Mägi | bbc291b9d3 | 3 years ago |
Nuno Gonçalves (Ulukyn) | a64981a92a | 3 years ago |
Nuno Gonçalves (Ulukyn) | 17c9dd061a | 3 years ago |
Ben Saine | b72a71e87c | 3 years ago |
bensaine | b4ce38099f | 3 years ago |
Nimetu | 9eaf7d3550 | 3 years ago |
Nimetu | 26827d2c66 | 3 years ago |
Nuno Gonçalves (Ulukyn) | b6781af51e | 3 years ago |
Nuno Gonçalves (Ulukyn) | e1b611f219 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 8d7932a271 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 0cc7a35dad | 3 years ago |
Nuno | 2304445c39 | 3 years ago |
Ulu Kyn | 701d7309e5 | 3 years ago |
Ulu Kyn | f3d0c9dc5b | 3 years ago |
Ulu Kyn | a71f022c1a | 3 years ago |
Nuno | cc3d42737e | 3 years ago |
Nuno | 1e590f1a69 | 3 years ago |
Nuno | f450b57be0 | 3 years ago |
Nuno | fbb343ad51 | 3 years ago |
bensaine | e1527b724b | 3 years ago |
bensaine | c3a633ae50 | 3 years ago |
Nuno | a76e8e1a64 | 3 years ago |
Nuno | 2df441225c | 3 years ago |
Nuno | 56cbc51005 | 3 years ago |
Nuno | 7ce53abffe | 3 years ago |
Nuno | 4c4028822e | 3 years ago |
Nuno | b4323b6515 | 3 years ago |
Nuno | 9923062417 | 3 years ago |
Nuno | 8f74ba7851 | 3 years ago |
Nuno | d6f367b2ba | 3 years ago |
Nuno | 3f5c3c5d98 | 3 years ago |
Nuno | 514f4613a8 | 3 years ago |
Ben Saine | 24b0c99034 | 3 years ago |
Nuno | 3dc2aa1bb6 | 3 years ago |
Nuno | 543be4bc4c | 3 years ago |
Nuno | 80007bc602 | 3 years ago |
Nuno | cf9855a6d5 | 3 years ago |
Nuno | bec18c661d | 3 years ago |
Nimetu | 13eef096b4 | 3 years ago |
Nimetu | d8deff3f23 | 3 years ago |
Nimetu | 2efc16ce52 | 3 years ago |
Nimetu | 5064f0417b | 3 years ago |
Nimetu | d893d15daf | 3 years ago |
kaetemi | 82ef7e5e81 | 3 years ago |
kaetemi | 8f839dc9c7 | 3 years ago |
kaetemi | 5fcaafbc60 | 3 years ago |
kaetemi | 6d60cfee71 | 3 years ago |
kaetemi | 3076b62063 | 3 years ago |
kaetemi | 3d208e024d | 3 years ago |
kaetemi | af16f09d52 | 3 years ago |
kaetemi | b9d4aa2abd | 3 years ago |
Nimetu | 759ece01d0 | 3 years ago |
Nuno | 4a06fe15dd | 3 years ago |
Nuno | 575d5d9957 | 3 years ago |
Nuno | 0d68ca05e2 | 3 years ago |
Nuno | 6091e76516 | 3 years ago |
Nuno | 0fbbf10361 | 3 years ago |
Nuno | 557f5d3d6c | 3 years ago |
Nuno | d7d1bc60c2 | 3 years ago |
Nuno | 3709ea4520 | 3 years ago |
Nuno | 70286d36a9 | 3 years ago |
Ulu Kyn | 92ff9f12b0 | 3 years ago |
Nimetu | 8cbb306db8 | 3 years ago |
Nuno | 36c2ff5b86 | 3 years ago |
Nuno | 1a49c4cd0b | 3 years ago |
Ben Saine | 111d4a7a0a | 3 years ago |
bensaine | 6cfc9585f5 | 3 years ago |
Nimetu | f76ad7a3eb | 3 years ago |
Nimetu | ce0d1234cc | 3 years ago |
Nuno Gonçalves (Ulukyn) | 5d91c33ddd | 3 years ago |
Nimetu | 78478e32cd | 3 years ago |
Nimetu | ea6e4d91c3 | 3 years ago |
Nimetu | d388ff78ec | 3 years ago |
Nimetu | 0b503e352b | 3 years ago |
Nimetu | df4833bf0f | 3 years ago |
Nuno Gonçalves (Ulukyn) | 8ef89b80b0 | 3 years ago |
Nuno Gonçalves (Ulukyn) | bdea7d24d2 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 90161cd121 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 583a16d126 | 3 years ago |
Nimetu | 591ea6869e | 3 years ago |
Nuno Gonçalves (Ulukyn) | 01a2508567 | 3 years ago |
Nuno Gonçalves (Ulukyn) | b86b9283b2 | 3 years ago |
Nimetu | 0225beefa6 | 3 years ago |
Nimetu | 0de1580520 | 3 years ago |
Nimetu | d9dd9863b7 | 3 years ago |
Ulukyn | 7bed39665e | 3 years ago |
Nimetu | 9ecda65791 | 3 years ago |
Nimetu | fc6ecc7dbd | 3 years ago |
Nimetu | 5c53148907 | 3 years ago |
Nimetu | 028f6cdd3e | 3 years ago |
Nuno | 6a1ea5ff59 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 72ccfc9a02 | 3 years ago |
Ulukyn | 0e2a14c822 | 3 years ago |
Nimetu | a4248d5fa1 | 3 years ago |
Nimetu | 984b2b3590 | 3 years ago |
Nimetu | 3f3991816b | 3 years ago |
Nimetu | e0d54f7897 | 3 years ago |
Nimetu | 37eec8cd7f | 3 years ago |
Nimetu | 2046c4bf6e | 3 years ago |
Nimetu | 12c515c264 | 3 years ago |
Nimetu | 285cfb163f | 3 years ago |
Nimetu | a40ddf7955 | 3 years ago |
Nimetu | dff191a7c2 | 3 years ago |
Nimetu | f26dc534c8 | 3 years ago |
Nimetu | dfe45029ab | 3 years ago |
Nimetu | 65edd9f95d | 3 years ago |
Nuno | 4331e35227 | 3 years ago |
Nuno Gonçalves (Ulukyn) | ce5817721a | 3 years ago |
Nuno Gonçalves (Ulukyn) | aae899b65a | 3 years ago |
Nimetu | 487f9f060e | 3 years ago |
Nimetu | 2e816ddf6e | 3 years ago |
Nimetu | 5d4a04169b | 3 years ago |
Nimetu | b2ec03d1a1 | 3 years ago |
Nimetu | 234465387b | 3 years ago |
Nimetu | 2133f6d2b7 | 3 years ago |
Nimetu | 63f1fb73dd | 3 years ago |
Nimetu | a040f7a2a8 | 3 years ago |
Nimetu | 565932c18d | 3 years ago |
Nimetu | cade609a3a | 3 years ago |
Nimetu | 093702a704 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 4c66865de7 | 3 years ago |
Nimetu | c00a9be398 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 458861951b | 3 years ago |
Nuno Gonçalves (Ulukyn) | 3f991d3781 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 8d5c0facf8 | 3 years ago |
Nuno Gonçalves (Ulukyn) | 178a22d961 | 3 years ago |
Nuno Gonçalves (Ulukyn) | f9dafe720c | 3 years ago |
Nuno Gonçalves (Ulukyn) | 72691a3379 | 3 years ago |
Nuno Gonçalves (Ulukyn) | bc991c8146 | 3 years ago |
Riasan | 62a821bc1d | 3 years ago |
Riasan | 103179ece7 | 3 years ago |
Nimetu | 19d0162332 | 3 years ago |
Nimetu | 5bf139f690 | 3 years ago |
Nimetu | d0d38238a8 | 3 years ago |
Nimetu | 95716b65ca | 3 years ago |
Nimetu | 75f490d394 | 3 years ago |
Nuno | 64bff20e03 | 4 years ago |
Nuno | 1eb651a946 | 4 years ago |
Nuno | 7da7d8cbbe | 4 years ago |
Nuno | 0ee26a6488 | 4 years ago |
Nuno | 9e404a5965 | 4 years ago |
Nuno | 97099768dc | 4 years ago |
kaetemi | 7d1661df42 | 4 years ago |
kaetemi | 19a0d929bb | 4 years ago |
Nuno | a443848924 | 4 years ago |
Nuno | ca0dc24aa0 | 4 years ago |
Nuno | 6d68e96dd4 | 4 years ago |
kaetemi | 6d4b58c281 | 4 years ago |
kaetemi | fcf97d93df | 4 years ago |
kaetemi | c5658cfe26 | 4 years ago |
Nimetu | bc0071ac57 | 4 years ago |
kaetemi | 37a729b5cc | 4 years ago |
Nuno Gonçalves (Ulukyn) | efc1883cca | 4 years ago |
Nuno | 83a021e1e6 | 4 years ago |
Nuno | 431b1ea339 | 4 years ago |
Nuno | 6c3d6403b0 | 4 years ago |
Nuno | 405974c9c0 | 4 years ago |
Nuno | cc5bd3ddae | 4 years ago |
Nuno | 5613eb855e | 4 years ago |
Nimetu | 5614028f63 | 4 years ago |
Nimetu | a28bda89e6 | 4 years ago |
Nimetu | b2d6c313db | 4 years ago |
Nuno | 74c643f147 | 4 years ago |
Nuno | 3d43c3c626 | 4 years ago |
Nimetu | 78fa873003 | 4 years ago |
Nuno | 6bd853f7bf | 4 years ago |
Nuno | 49b4295765 | 4 years ago |
Nimetu | 3362afaa4d | 4 years ago |
Nuno | c5b34c927e | 4 years ago |
Nuno | fa3eab3305 | 4 years ago |
Nuno | 7d1534fb31 | 4 years ago |
Nuno | 791eb639df | 4 years ago |
Nuno | 772990d421 | 4 years ago |
Nuno | c8fd716f8a | 4 years ago |
Nuno | 72f7cbe4fa | 4 years ago |
Nuno | 9d2fc8c630 | 4 years ago |
Nuno | b4e54d5ad4 | 4 years ago |
Nuno | 904daebd88 | 4 years ago |
Nuno | 9c996b5fe3 | 4 years ago |
Nuno | 7964a42927 | 4 years ago |
Nuno | 24cb13d744 | 4 years ago |
Nuno | c8f4a85f0c | 4 years ago |
Nuno | 7bd936ea24 | 4 years ago |
Nuno | 4bcea9a70e | 4 years ago |
Nuno | 762e3b603e | 4 years ago |
Nuno | 292e142319 | 4 years ago |
Nuno | cdb1786018 | 4 years ago |
Nimetu | 1299484163 | 4 years ago |
Nimetu | 668e15e394 | 4 years ago |
Sit Melai | cdf1bacee1 | 4 years ago |
Nuno | 1ec4f88471 | 4 years ago |
Sit Melai | 673ce18e72 | 4 years ago |
Nuno | 54fd022501 | 4 years ago |
Nuno | 5fe26ec6d6 | 4 years ago |
Nuno | 40a9e782c3 | 4 years ago |
Nuno | 155e268ece | 4 years ago |
Nuno | 649527039b | 4 years ago |
Nuno | d350b1621d | 4 years ago |
Nuno | 22bab29654 | 4 years ago |
Nuno | 5632fffa44 | 4 years ago |
Nuno | 1cc000cc6c | 4 years ago |
Nuno | e9b7345ba5 | 4 years ago |
Nuno | 6f4319bfcb | 4 years ago |
Nuno | ab958d1891 | 4 years ago |
Nuno | c3c7e15c81 | 4 years ago |
Nuno | 568a7a10a9 | 4 years ago |
Nuno | f886d5eac7 | 4 years ago |
Nuno | 540ab1ffc8 | 4 years ago |
Nuno | 629e8f5272 | 4 years ago |
Nuno | 868f462d5f | 4 years ago |
Nuno | 5a7d067a71 | 4 years ago |
Nuno | 17f818eace | 4 years ago |
Nuno | 5825332757 | 4 years ago |
Nimetu | c1170a0a4d | 4 years ago |
Nimetu | 291d332b56 | 4 years ago |
Nimetu | d8f54820c4 | 4 years ago |
Nimetu | 155418b20b | 4 years ago |
Nimetu | d665e1fc45 | 4 years ago |
Nimetu | 36f9888b91 | 4 years ago |
Nimetu | 17782d5d21 | 4 years ago |
Nuno | 85e788da81 | 4 years ago |
Nuno | 54de87acf4 | 4 years ago |
Nuno | ebab993e3e | 4 years ago |
Nuno | 3613dfd305 | 4 years ago |
Nuno | c09f82db16 | 4 years ago |
Nuno | 6402a31e4e | 4 years ago |
Nuno | 27cdcf1e02 | 4 years ago |
Nuno | de90245f27 | 4 years ago |
Nuno | bf2f8e39a5 | 4 years ago |
Nimetu | 26482eef1b | 4 years ago |
Nimetu | 383e362ed7 | 4 years ago |
Nimetu | c09ed63120 | 4 years ago |
Nimetu | fdb271bdb3 | 4 years ago |
kaetemi | dba92deea5 | 4 years ago |
Nuno | 0fb9422426 | 4 years ago |
kaetemi | 2528e542cb | 4 years ago |
kaetemi | 719f178f70 | 4 years ago |
Riasan | f83d8a206e | 4 years ago |
Riasan | 8cd863ff44 | 4 years ago |
Nuno | 89065eee3f | 4 years ago |
Sit Melai | 91b3ff25b4 | 4 years ago |
Nimetu | 4bcf9270eb | 4 years ago |
Sit Melai | c75071b488 | 4 years ago |
Nimetu | 04a5aa372b | 4 years ago |
Nimetu | 29ef76e537 | 4 years ago |
Nimetu | 040eee5c9e | 4 years ago |
Nimetu | c6ede4a8b4 | 4 years ago |
Nuno | adf9a646b7 | 4 years ago |
Nuno | 2aaa928cdc | 4 years ago |
Nuno | 83d0e600f1 | 4 years ago |
Nuno | df69a1706f | 4 years ago |
Nuno | 6651e839f3 | 4 years ago |
Nuno | 62be2ab1fb | 4 years ago |
Nuno | 8c62f4e64c | 4 years ago |
Nuno | 2075bf7443 | 4 years ago |
Nuno | 44caf59afd | 4 years ago |
Nuno | 057cf828f4 | 4 years ago |
Nuno | 8d2071524c | 4 years ago |
Nuno | 6db93a0ef0 | 4 years ago |
Nuno | f61d10c75e | 4 years ago |
Nuno | 90728f372a | 4 years ago |
Nuno | 8fa5de61e3 | 4 years ago |
Nuno | 74dbe1e52c | 4 years ago |
Nuno | 6adf44f0b0 | 4 years ago |
Nuno | 98124a3bd5 | 4 years ago |
Nuno | 46ecaac095 | 4 years ago |
Nuno | 06e2840be5 | 4 years ago |
Nuno | bbabe75247 | 4 years ago |
Nuno | b62ddc49d2 | 4 years ago |
Nuno | 690286b2c4 | 4 years ago |
Nuno | ada7dec7d3 | 4 years ago |
Nuno | 98b091ab63 | 4 years ago |
Nuno | 53252d40db | 4 years ago |
Nuno | 2b648934ea | 4 years ago |
Nuno | 46c7b0309d | 4 years ago |
Nuno | 347ed4b2fb | 4 years ago |
Nuno | b9d29d5cfe | 4 years ago |
Nuno | ea212bcba2 | 4 years ago |
Nuno | 281ec4ba60 | 4 years ago |
Nuno | 951f000be4 | 4 years ago |
Nuno | 4726e74dcd | 4 years ago |
Nuno | c5fffb9ff0 | 4 years ago |
Nuno | ae9989dfe4 | 4 years ago |
Nuno | d35ae0db80 | 4 years ago |
Nuno | 3dbdbad80a | 4 years ago |
Riasan | 0a81f40606 | 4 years ago |
Nuno | c63b21150e | 4 years ago |
Nuno | 9771d79bc3 | 4 years ago |
Nimetu | b70573d1dc | 4 years ago |
Nimetu | 7111cf44b3 | 4 years ago |
Nimetu | cb77552121 | 4 years ago |
Nuno | 2bf8faf29e | 4 years ago |
Nuno | b984e2e3d8 | 4 years ago |
Nuno | 140c380eb5 | 4 years ago |
Nuno | 1225fc0fe8 | 4 years ago |
Nuno | 13cb05c732 | 4 years ago |
Nuno | f84184af25 | 4 years ago |
Nuno | 4b6e0184a3 | 4 years ago |
Nuno | 269526e87f | 4 years ago |
Nuno | b8668813df | 4 years ago |
Nuno | 6f9dce0fdc | 4 years ago |
Nuno | fd8b2436ff | 4 years ago |
Nuno | 588bd79535 | 4 years ago |
Nuno | ced0ca3e1c | 4 years ago |
kaetemi | e998d3a85c | 4 years ago |
kaetemi | 5c3b0cf14b | 4 years ago |
Nuno | c327303222 | 4 years ago |
Nuno | 864eba1629 | 4 years ago |
Nuno | 29c3651063 | 4 years ago |
Nuno | acfb37103f | 4 years ago |
Nuno | 3d38a8ca89 | 4 years ago |
Nuno | 4f34ce36ae | 4 years ago |
Nuno | 8d2b26b738 | 4 years ago |
Nuno | 79e65a6b9e | 4 years ago |
Nuno | 6e59af8dc9 | 4 years ago |
Nuno | d23166ae49 | 4 years ago |
Nuno | 0b110c6a88 | 4 years ago |
Nuno | 13398f094a | 4 years ago |
Nuno | 7018a4439c | 4 years ago |
Riasan | cbbbc74a60 | 4 years ago |
Nuno | dab6321caa | 4 years ago |
Nuno | 07390fed37 | 4 years ago |
Nuno | ec98cd2e65 | 4 years ago |
Nuno | ad52a23437 | 4 years ago |
Nuno | c78d1d934f | 4 years ago |
Nuno | 677933ed98 | 4 years ago |
Nuno | 541529bb3f | 4 years ago |
Nuno | a273f78851 | 4 years ago |
Nuno | cb207bdd9d | 4 years ago |
Nuno | 8ec332fefa | 4 years ago |
Nuno | 2f776eab9c | 4 years ago |
Nuno | 04aa097781 | 4 years ago |
Nuno | 3996327394 | 4 years ago |
Nuno | 27e553ccb5 | 4 years ago |
Nuno | 323be1612e | 4 years ago |
Nuno | 184582cfc9 | 4 years ago |
Nimetu | e39cd0a8d3 | 4 years ago |
Nuno | 0b9599c57b | 4 years ago |
Sit Melai | 9d7f2af1a7 | 4 years ago |
Nuno | e021c09051 | 4 years ago |
Nuno | 52ff736ee9 | 4 years ago |
Nuno | d2c56f4b7c | 4 years ago |
Nuno | 2bdc6fb7ae | 4 years ago |
Nuno | a848eab99c | 4 years ago |
kaetemi | b0f1c73d77 | 4 years ago |
kaetemi | 109ed7eba5 | 4 years ago |
Nuno | 9ae2df4527 | 4 years ago |
Nimetu | 762962ef25 | 4 years ago |
Nimetu | 9f3250f4db | 4 years ago |
Nimetu | e8c18b1b44 | 4 years ago |
Nimetu | 73610be10d | 4 years ago |
Nimetu | 72098f624d | 4 years ago |
kaetemi | 1a6e5e6e2b | 4 years ago |
kaetemi | 7adbb84514 | 4 years ago |
kaetemi | e74e229ad9 | 4 years ago |
Nimetu | ae91cc4179 | 4 years ago |
Nimetu | 6ccd8853db | 4 years ago |
Nuno | cc7793202b | 4 years ago |
Nuno | 0bb160545f | 4 years ago |
Nuno | 0e1b464e98 | 4 years ago |
Nuno | dfe051a8df | 4 years ago |
Nuno Gonçalves (Ulukyn) | 2f6133c8ba | 4 years ago |
Nuno Gonçalves (Ulukyn) | 95f8cefecc | 4 years ago |
Nuno Gonçalves (Ulukyn) | b98cd5e345 | 4 years ago |
Nuno Gonçalves (Ulukyn) | bca2a28187 | 4 years ago |
Sit Melai | b7cbeeb2ae | 4 years ago |
Ulukyn | 5d4e81e24c | 4 years ago |
Ulukyn | c73fff2ca6 | 4 years ago |
Nimetu | 9532fc3a81 | 4 years ago |
Nimetu | 6b59fc0081 | 4 years ago |
Sit Melai | 47bf9ecbc8 | 4 years ago |
Sit Melai | 02732c1241 | 4 years ago |
Sit Melai | f96f0b41b9 | 4 years ago |
Sit Melai | 5dc85db8b1 | 4 years ago |
Sit Melai | 49fcec5759 | 4 years ago |
Sit Melai | b8b21914f6 | 4 years ago |
Sit Melai | bccc86bd99 | 4 years ago |
Sit Melai | e5b3b752d5 | 4 years ago |
Sit Melai | c06469b2a0 | 4 years ago |
Ulukyn | 6fa74cd5c2 | 5 years ago |
Riasan | 8cd685d1f4 | 5 years ago |
Riasan | f31eeff8fc | 5 years ago |
Sit Melai | 7e10c697eb | 5 years ago |
Nimetu | f7be62eb3d | 5 years ago |
Nimetu | 2a4b16ab1b | 5 years ago |
Ulukyn | f7e8e3f516 | 5 years ago |
Ulukyn | 107dbc1987 | 5 years ago |
Ulukyn | 97dc744759 | 5 years ago |
Ulukyn | 012339dcf1 | 5 years ago |
Ulukyn | 884c65fc26 | 5 years ago |
Ulukyn | 07f9a55e48 | 5 years ago |
Ulukyn | a87b0f4c97 | 5 years ago |
Ulukyn | 4138a99fb7 | 5 years ago |
Ulukyn | 7be52a10fe | 5 years ago |
Ulukyn | f4a104bf3f | 5 years ago |
Ulukyn | 80a6bf72a9 | 5 years ago |
Ulukyn | 17e539132b | 5 years ago |
Ulukyn | 27bd2cec01 | 5 years ago |
Ulukyn | 6597f32fc1 | 5 years ago |
Ulukyn | 9e2872d15e | 5 years ago |
Ulukyn | 901f33d9a7 | 5 years ago |
Ulukyn | 421de3fa91 | 5 years ago |
Ulukyn | 08fb509d99 | 5 years ago |
Sit Melai | 6c8aeb6ae3 | 5 years ago |
Sit Melai | 59c794f716 | 5 years ago |
Heernis | 3c052d5fcc | 5 years ago |
Sit Melai | c2e7807f99 | 5 years ago |
Riasan | d130a7f826 | 5 years ago |
Ulukyn | fd2cc53d68 | 5 years ago |
Ulukyn | 6ae34e08d9 | 5 years ago |
Ulukyn | 80568ade1c | 5 years ago |
Ulukyn | a8016b6a59 | 5 years ago |
Ulukyn | d0fdfe175d | 5 years ago |
Ulukyn | 4254b6788a | 5 years ago |
Riasan | ada46dfabc | 5 years ago |
kaetemi | fc197880a4 | 5 years ago |
Ulukyn | ada3c09a51 | 5 years ago |
Ulukyn | 83061f7f03 | 5 years ago |
Ulukyn | 3c6bed32fd | 5 years ago |
Nimetu | 92b3a31f0b | 5 years ago |
Ulukyn | f396858ea9 | 5 years ago |
Ulukyn | eae8f9999d | 5 years ago |
Ulukyn | b8885cd661 | 5 years ago |
Ulukyn | f67a1cde32 | 5 years ago |
Ulukyn | feb1a5647d | 5 years ago |
Ulukyn | f3009c4178 | 5 years ago |
Ulukyn | 820bd23cf6 | 5 years ago |
Ulukyn | c883ea63e0 | 5 years ago |
Ulukyn | 791a6641d9 | 5 years ago |
Ulukyn | 521a5c8fb7 | 5 years ago |
Ulukyn | da876dcf7c | 5 years ago |
Ulukyn | 0069db15a6 | 5 years ago |
Ulukyn | 3da2f45363 | 5 years ago |
Ulukyn | 1143ecaae0 | 5 years ago |
Heernis | bcc107e187 | 5 years ago |
Nimetu | 36187626a9 | 5 years ago |
Nimetu | bde8d008d1 | 5 years ago |
Nimetu | 6993a2731f | 5 years ago |
Nimetu | 52d6f89e1e | 5 years ago |
Nimetu | 5bddfcfb22 | 5 years ago |
Ulukyn | aa15fd4e98 | 5 years ago |
Ulukyn | 0f8673beac | 5 years ago |
Ulukyn | 219914b4bf | 5 years ago |
Ulukyn | fb4aebf506 | 5 years ago |
Ulukyn | 81832ae0af | 5 years ago |
kaetemi | 39d6ca285a | 5 years ago |
kaetemi | c8fc110a9e | 5 years ago |
kaetemi | a9fc9c2015 | 5 years ago |
Ulukyn | e32c852d96 | 5 years ago |
Ulukyn | f3a02d4f2a | 5 years ago |
Ulukyn | bd99cd8aed | 5 years ago |
Ulukyn | 77d8cce15a | 5 years ago |
Ulukyn | aa0d9d0be9 | 5 years ago |
Ulukyn | 0845e19408 | 5 years ago |
Ulukyn | ece240448d | 5 years ago |
Ulukyn | 07ff703de2 | 5 years ago |
Ulukyn | f6116a813b | 5 years ago |
Ulukyn | 422a8bb744 | 5 years ago |
Ulukyn | 25d4cca3a9 | 5 years ago |
Ulukyn | 6a40fcf12d | 5 years ago |
Ulukyn | bf0042173f | 5 years ago |
Ulukyn | 681568ce08 | 5 years ago |
Ulukyn | 47863be96e | 5 years ago |
Ulukyn | ade5b6e702 | 5 years ago |
Ulukyn | ecd8b952a2 | 5 years ago |
Ulukyn | 272f91210b | 5 years ago |
Ulukyn | 24d4fb8253 | 5 years ago |
Nimetu | 24fd5a6230 | 5 years ago |
Riasan | 9043e78794 | 5 years ago |
Nimetu | 5250d22706 | 5 years ago |
Nimetu | 682985978d | 5 years ago |
Nimetu | b3f8f307b0 | 5 years ago |
Ulukyn | b5ffa8becd | 5 years ago |
Ulukyn | 92090056ea | 5 years ago |
Nimetu | a6c7b3dd37 | 5 years ago |
Ulukyn | 1e54da83ef | 5 years ago |
Ulukyn | 6ec06b29ab | 5 years ago |
Ulukyn | 7b15da1018 | 5 years ago |
Nimetu | 598be95efd | 5 years ago |
Nimetu | 7f373a904e | 5 years ago |
Nimetu | 983475ff7c | 5 years ago |
Ulukyn | 44824414b1 | 5 years ago |
Ulukyn | 95b0f63622 | 5 years ago |
Ulukyn | 264b50a5ec | 5 years ago |
Ulukyn | 143b96c214 | 5 years ago |
Ulukyn | d4e5af7df2 | 5 years ago |
Ulukyn | 8dc9b89f94 | 5 years ago |
Nimetu | 2d86c5377d | 5 years ago |
Ulukyn | 04f9d593e0 | 5 years ago |
Nimetu | 3be969a73d | 5 years ago |
Ulukyn | ce8b05b284 | 5 years ago |
Ulukyn | 42b291c73e | 5 years ago |
Nimetu | 4aa94b3ae9 | 5 years ago |
Nimetu | c0110133d7 | 5 years ago |
Nimetu | c36faf2d61 | 5 years ago |
Ulukyn | fef0cad61a | 5 years ago |
Ulukyn | debb6b7d0c | 5 years ago |
Heernis | f11ed5ea49 | 5 years ago |
Ulukyn | 050d9fea2f | 5 years ago |
Ulukyn | 9a8f29bb67 | 5 years ago |
Ulukyn | c2e879ebcc | 5 years ago |
Ulukyn | 11086f9b44 | 5 years ago |
Ulukyn | 311e739d98 | 5 years ago |
Ulukyn | f6f7e553fc | 5 years ago |
Ulukyn | 255271cde5 | 5 years ago |
Ulukyn | 6d233cdc2c | 5 years ago |
Ulukyn | f337a28ae2 | 5 years ago |
Ulukyn | a36694614f | 5 years ago |
Ulukyn | bcb8080d42 | 5 years ago |
Ulukyn | 2c9193fa74 | 5 years ago |
Ulukyn | 7e84ee9ec9 | 5 years ago |
Ulukyn | ff5d4e941c | 5 years ago |
Nimetu | f853adfcba | 5 years ago |
Nimetu | 1f736fc347 | 5 years ago |
Ulukyn | 8f3aaee987 | 5 years ago |
Ulukyn | 8d0172e1fb | 5 years ago |
Ulukyn | f06eebf26c | 5 years ago |
Ulukyn | 31ecfdf181 | 5 years ago |
Ulukyn | 4997576923 | 5 years ago |
Ulukyn | 9b6693763f | 5 years ago |
Ulukyn | b9d1cf26b7 | 5 years ago |
Ulukyn | ae25e054d4 | 5 years ago |
Ulukyn | 269f8c4b2d | 5 years ago |
Ulukyn | a3db3c6ba6 | 5 years ago |
Nimetu | 4d9aa3e684 | 5 years ago |
Nimetu | e99b7e257d | 5 years ago |
Nimetu | 94873c3d3f | 5 years ago |
Nimetu | 586e49282f | 5 years ago |
Nimetu | ca20d582b3 | 5 years ago |
Nimetu | 7cb5c817a6 | 5 years ago |
Nimetu | ec1dfca0c5 | 5 years ago |
Ulukyn | df6c0969c2 | 5 years ago |
Ulukyn | 590abe8bfd | 5 years ago |
Ulukyn | b31fa09af7 | 5 years ago |
Ulukyn | 3220a2aa47 | 5 years ago |
Ulukyn | c639bb3c07 | 5 years ago |
Nimetu | 2f635117f7 | 5 years ago |
Ulukyn | 0cf26cbdf8 | 5 years ago |
Nimetu | 34083dee80 | 5 years ago |
Nimetu | edb0c1fe73 | 5 years ago |
Nimetu | 9aabe0bf35 | 5 years ago |
Nimetu | 3b08d50b83 | 5 years ago |
Ulukyn | 523c07d9d9 | 5 years ago |
Ulukyn | e89d3233dc | 5 years ago |
Ulukyn | 96e95c19ee | 5 years ago |
Ulukyn | e10f79dbf2 | 5 years ago |
Ulukyn | 0aff3b4365 | 5 years ago |
Ulukyn | b0fa434c05 | 5 years ago |
Ulukyn | e349cb4399 | 5 years ago |
Ulukyn | f9cf9db049 | 5 years ago |
Ulukyn | 92f3c01a74 | 5 years ago |
Ulukyn | 3ffab7c1a1 | 5 years ago |
Ulukyn | 4df2489f59 | 5 years ago |
Ulukyn | de6418bb9a | 5 years ago |
Ulukyn | 1db0300515 | 5 years ago |
Ulukyn | 435b4362d3 | 5 years ago |
Ulukyn | f9d37a390a | 5 years ago |
Ulukyn | 99413cff48 | 5 years ago |
Ulukyn | d45f6efcef | 5 years ago |
Ulukyn | 01cb2cfdd8 | 5 years ago |
Ulukyn | 5f762edac4 | 5 years ago |
Ulukyn | bfadcfaff5 | 5 years ago |
Ulukyn | 55172c93b5 | 5 years ago |
Ulukyn | c950373782 | 5 years ago |
Ulukyn | b1d18ddb53 | 5 years ago |
Ulukyn | b869cd07d6 | 5 years ago |
Ulukyn | aaa24fd0f4 | 5 years ago |
Ulukyn | 6747613b03 | 5 years ago |
Ulukyn | ac6afb7b2f | 5 years ago |
Ulukyn | 4048ef29db | 5 years ago |
Ulukyn | b5b395c127 | 5 years ago |
Ulukyn | a7d2175f93 | 5 years ago |
Ulukyn | b16d132e1d | 5 years ago |
Ulukyn | e3cef8803e | 5 years ago |
Ulukyn | cb2201a69a | 5 years ago |
Nimetu | dfeba1426a | 5 years ago |
Ulukyn | c9bec465bc | 5 years ago |
Nimetu | 7856e93723 | 5 years ago |
Nimetu | 8f59a71e3c | 5 years ago |
Nimetu | 15433b263b | 5 years ago |
Ulukyn | 58a731628b | 5 years ago |
Ulukyn | eb8daeb652 | 5 years ago |
Ulukyn | c6d5163c1d | 5 years ago |
Ulukyn | 2c63a3aa96 | 5 years ago |
Ulukyn | 4709e766b9 | 5 years ago |
Ulukyn | b2207337fa | 5 years ago |
Ulukyn | 47dc707c91 | 5 years ago |
Ulukyn | 232af164ed | 5 years ago |
Ulukyn | f18101d97e | 5 years ago |
Ulukyn | 0df2bdec2b | 5 years ago |
Ulukyn | ed17e66d97 | 5 years ago |
Ulukyn | 7f149563f6 | 5 years ago |
Nimetu | e22d271408 | 5 years ago |
Ulukyn | d77d3b7102 | 5 years ago |
Ulukyn | e049c34c8d | 5 years ago |
Ulukyn | 6114cb1044 | 5 years ago |
Ulukyn | 609d6b470f | 5 years ago |
Ulukyn | 414011ee37 | 5 years ago |
Ulukyn | b558a1a18b | 5 years ago |
Ulukyn | b033942d36 | 5 years ago |
Ulukyn | de8c9dddcb | 5 years ago |
Ulukyn | 6e00000b9b | 5 years ago |
Ulukyn | 15ce2cd39c | 5 years ago |
Ulukyn | f9738713a7 | 5 years ago |
Ulukyn | 20b1f3a4c5 | 5 years ago |
Ulukyn | 586d84bc20 | 5 years ago |
Ulukyn | b88341792a | 5 years ago |
Ulukyn | 1c562ddbe6 | 5 years ago |
Ulukyn | 4675b8b8b9 | 5 years ago |
Ulukyn | d2edcbf4ee | 5 years ago |
Ulukyn | 954151ca73 | 5 years ago |
Ulukyn | 45b1bab23f | 5 years ago |
Ulukyn | 123197b90b | 5 years ago |
Ulukyn | 4b847a086a | 5 years ago |
Ulukyn | 9f61f08e74 | 5 years ago |
Ulukyn | aacbcf1e65 | 5 years ago |
Ulukyn | c838136d1a | 5 years ago |
Ulukyn | 0455d07125 | 5 years ago |
Ulukyn | 6785217b3a | 5 years ago |
Ulukyn | cc5423fdd5 | 5 years ago |
Ulukyn | c22f8776f4 | 5 years ago |
Nimetu | f5c0cbcdf3 | 5 years ago |
Nimetu | 8b2108af2f | 5 years ago |
Ulukyn | a7ca6f4499 | 5 years ago |
Ulukyn | 9e5f20a679 | 5 years ago |
Ulukyn | 11573ee85a | 5 years ago |
Ulukyn | 48a9a84d0e | 5 years ago |
Ulukyn | 2f27af125e | 5 years ago |
Ulukyn | 10f864b234 | 5 years ago |
Ulukyn | 0ac92bc08b | 5 years ago |
Ulukyn | 34c1265bce | 5 years ago |
Ulukyn | a6ee9fec63 | 5 years ago |
Ulukyn | fe008c0e52 | 5 years ago |
Ulukyn | 935c5df73a | 5 years ago |
Ulukyn | 7a0737e759 | 5 years ago |
Ulukyn | 09d8346558 | 5 years ago |
Ulukyn | 7f53767d85 | 5 years ago |
karu | 6a7fc98a52 | 5 years ago |
Ulukyn | 3d919974cf | 5 years ago |
Ulukyn | 691bf67c4d | 5 years ago |
Ulukyn | f053eaa157 | 5 years ago |
Ulukyn | 30fabcbd0a | 5 years ago |
Ulukyn | 3966020294 | 5 years ago |
Ulukyn | eeac201cf3 | 5 years ago |
Ulukyn | 357e3f07e4 | 5 years ago |
Ulukyn | 188c3494fa | 5 years ago |
Ulukyn | 51776f9203 | 5 years ago |
Ulukyn | 7b8a4e2210 | 5 years ago |
Ulukyn | 762dcd15e2 | 5 years ago |
Ulukyn | ac43b90ba0 | 5 years ago |
Ulukyn | df3c7c2f2e | 5 years ago |
Ulukyn | 780b9c7e63 | 5 years ago |
Ulukyn | f4ee795fde | 5 years ago |
Ulukyn | c521de1d48 | 5 years ago |
Riasan | d5ceb97fa0 | 5 years ago |
Ulukyn | cdc33730ad | 5 years ago |
Ulukyn | 305a27f0db | 5 years ago |
Nimetu | 4c1daee42c | 5 years ago |
Ulu Kyn | b5b8de283b | 5 years ago |
Ulu Kyn | 7b3c09f873 | 5 years ago |
Ulu Kyn | 3f7fc2e870 | 5 years ago |
Ulu Kyn | 4c0438d702 | 5 years ago |
Ulu Kyn | 139b03f0f1 | 5 years ago |
Ulu Kyn | 99caf036ff | 5 years ago |
Ulu Kyn | 6c35550c83 | 5 years ago |
Ulu Kyn | 8221ee2eb9 | 5 years ago |
Ulu Kyn | fd1f151504 | 5 years ago |
Ulu Kyn | c43b4b8bc0 | 5 years ago |
Ulu Kyn | a806758fad | 5 years ago |
Ulu Kyn | 58e24f9c58 | 5 years ago |
Herrah | 99ededcfcb | 5 years ago |
Ulu Kyn | e32e4492ce | 5 years ago |
Ulu Kyn | e3dc99e078 | 5 years ago |
Nuno Gonçalves | 9e406019d8 | 5 years ago |
Nuno Gonçalves | 19789a2544 | 5 years ago |
Nimetu | e4cce24f80 | 5 years ago |
Nimetu | 2e3fa918d4 | 5 years ago |
Nuno Gonçalves | 89973681a2 | 5 years ago |
Nuno Gonçalves | 683af88cb9 | 5 years ago |
Nimetu | da5b7212f8 | 5 years ago |
Nimetu | 14b1c1232a | 5 years ago |
Nuno Gonçalves | de69dfc285 | 5 years ago |
Nuno Gonçalves | f5776610f1 | 5 years ago |
Inky | 11f2044c7d | 5 years ago |
Nimetu | b53d797745 | 6 years ago |
Nimetu | 8b4c179a15 | 6 years ago |
ulukyn | 959d52fd80 | 6 years ago |
Nimetu | b423c0f057 | 6 years ago |
Nimetu | 7148d476ad | 6 years ago |
Nimetu | c9a5fbacd9 | 6 years ago |
Inky | bfbb8e1292 | 6 years ago |
Inky | 045a80b59e | 6 years ago |
Inky | 1ad5cf7a8e | 6 years ago |
Inky | c752619f13 | 6 years ago |
Inky | 26aef169b1 | 6 years ago |
Inky | 8006dbeabe | 6 years ago |
Inky | 6fdbdc9ed1 | 6 years ago |
Inky | f75e413994 | 6 years ago |
Inky | 3acbf83058 | 6 years ago |
Inky | 77496daef4 | 6 years ago |
Inky | c545629a10 | 6 years ago |
Inky | 1910f7bc86 | 6 years ago |
Inky | c1e76fcbb2 | 6 years ago |
Inky | 20fe11c53f | 6 years ago |
Inky | 6fcb6f0669 | 6 years ago |
Inky | a7cdf29463 | 6 years ago |
Inky | b2b16e3cce | 6 years ago |
Inky | 0f3f64cdc2 | 6 years ago |
Inky | c8927c9c4b | 6 years ago |
Inky | 5d1233e805 | 6 years ago |
Inky | f5e9b7703c | 6 years ago |
Inky | 098df688b9 | 6 years ago |
Inky | 6d16b46890 | 6 years ago |
Inky | 331b0d8718 | 6 years ago |
Inky | d9cb317667 | 6 years ago |
Inky | 90e508032c | 6 years ago |
Inky | 4a5de4cb13 | 6 years ago |
Inky | 9d294ef242 | 6 years ago |
Inky | 860d6e2abb | 6 years ago |
Inky | bfab92082b | 6 years ago |
Inky | 64e26124f8 | 6 years ago |
Inky | 21dfa80b73 | 6 years ago |
Inky | ac4d9efd8b | 6 years ago |
Inky | 00f850f143 | 6 years ago |
Nimetu | a4b3e57fd0 | 6 years ago |
Nimetu | 8b2aef9317 | 6 years ago |
Nimetu | c123f63afd | 6 years ago |
Nimetu | a22767af76 | 6 years ago |
ulukyn | f8af0da354 | 6 years ago |
Riasan | 4f08aa3082 | 6 years ago |
ulukyn | 72d636ded1 | 6 years ago |
Riasan | cba4d7948d | 6 years ago |
ulukyn | 739d000055 | 6 years ago |
ulukyn | 963162855c | 6 years ago |
ulukyn | 89ef083460 | 6 years ago |
Inky | 795606628f | 6 years ago |
Inky | e572cc3e83 | 6 years ago |
ulukyn | bf34575037 | 6 years ago |
ulukyn | 57a32f10ee | 6 years ago |
ulukyn | 6c9a8da387 | 6 years ago |
Riasan | 2aa065d109 | 6 years ago |
ulukyn | 41b0fac726 | 6 years ago |
ulukyn | b7ec1c68ac | 6 years ago |
ulukyn | cc6159a9d5 | 6 years ago |
Inky | 438b521ece | 6 years ago |
Ulukyn | f5f4411a00 | 6 years ago |
Riasan | 29cb0c579f | 6 years ago |
ulukyn | 8434cb1a34 | 6 years ago |
ulukyn | 39004eb54b | 6 years ago |
Riasan | d2df2043c5 | 6 years ago |
Riasan | d8cfde63f8 | 6 years ago |
Nuno Gonçalves | 617682afe6 | 6 years ago |
Nuno Gonçalves | c9d19b4879 | 6 years ago |
ulukyn | 0b507cba7b | 6 years ago |
ulukyn | db5a7b141a | 6 years ago |
ulukyn | 478e2a646f | 6 years ago |
ulukyn | 020c59153d | 6 years ago |
ulukyn | 4f1008a413 | 6 years ago |
Riasan | f14c4d7746 | 6 years ago |
ulukyn | 23fe859e19 | 6 years ago |
Riasan | c6978f769f | 6 years ago |
Riasan | 319ae23064 | 6 years ago |
Riasan | 3e2e6cb696 | 6 years ago |
Riasan | 3c66bf2ba2 | 6 years ago |
Riasan | 1390a45f71 | 6 years ago |
ulukyn | d599fa4c14 | 6 years ago |
ulukyn | b4d09e0774 | 6 years ago |
ulukyn | 6f65197479 | 6 years ago |
ulukyn | 569599281b | 6 years ago |
ulukyn | 10562b720b | 6 years ago |
ulukyn | 1fc73a8079 | 6 years ago |
ulukyn | f821ff6973 | 6 years ago |
Riasan | d51b3b2eae | 6 years ago |
Riasan | 90c99b0b0e | 6 years ago |
Riasan | 48b2e9799e | 6 years ago |
Riasan | 9c680f43ce | 6 years ago |
Riasan | 537865cdb9 | 6 years ago |
ulukyn | 60feb8bc57 | 6 years ago |
ulukyn | dd6057ad71 | 6 years ago |
Riasan | 882e067fc0 | 6 years ago |
Riasan | a82a018f40 | 6 years ago |
Riasan | eb1c367464 | 6 years ago |
teanwen | 4ca7ea8957 | 6 years ago |
ulukyn | 6c731f049e | 6 years ago |
ulukyn | 363a59d238 | 6 years ago |
Riasan | b59b8a51a9 | 6 years ago |
ulukyn | 5648981968 | 6 years ago |
Riasan | c1510a8fb8 | 6 years ago |
Riasan | beb3dca614 | 6 years ago |
Riasan | 80204090d4 | 6 years ago |
Riasan | 57e55ed250 | 6 years ago |
Riasan | 5601d84d60 | 6 years ago |
Riasan | 2b24a51439 | 6 years ago |
Riasan | 3343f46e11 | 6 years ago |
Riasan | 82e5e1a4fc | 6 years ago |
Riasan | 19285bc8e9 | 6 years ago |
Riasan | cdbd2e1f47 | 6 years ago |
Riasan | f8a252abcf | 6 years ago |
Ul U'Kyn | 453c81bc7c | 7 years ago |
Riasan | 56f450782f | 7 years ago |
Riasan | dda9dff6ba | 7 years ago |
Riasan | e0266dedcb | 7 years ago |
Riasan | 28fd5a7265 | 7 years ago |
ulukyn | 085770a098 | 7 years ago |
ulukyn | a5f98add80 | 7 years ago |
ulukyn | bb667c736c | 7 years ago |
ulukyn | d824ff5baf | 7 years ago |
ulukyn | 6cc550732b | 7 years ago |
ulukyn | fcfb17c784 | 7 years ago |
Riasan | 22b06fdb3e | 7 years ago |
Riasan | 05baa720e9 | 7 years ago |
Riasan | 8be4abf0fe | 7 years ago |
Riasan | f47f2b4801 | 7 years ago |
Riasan | 7c8eb4b3c6 | 7 years ago |
Riasan | 146ccbbe4c | 7 years ago |
Ul U'Kyn | eaf08e863e | 7 years ago |
Riasan | 5afbc26916 | 7 years ago |
Ul U'Kyn | b5234633b4 | 7 years ago |
Riasan | c60705a297 | 7 years ago |
Ul U'Kyn | 9d4829ec54 | 7 years ago |
Ul U'Kyn | c37ef9592e | 7 years ago |
Ul U'Kyn | af3fe227c8 | 8 years ago |
Ul U'Kyn | 0e122c76ba | 8 years ago |
Nuno Gonçalves | 14c7013348 | 8 years ago |
Nuno Gonçalves | fbf0d664fc | 8 years ago |
Nuno Gonçalves | 0fd0934111 | 8 years ago |
Nuno Gonçalves | aadf864e4e | 8 years ago |
vl | f86da6ec78 | 9 years ago |
@ -1,27 +1,28 @@
|
|||||||
4eddbaff0c5e5d685db96ee3e8427aa0fd96ac83 v0.8.0
|
4eddbaff0c5e5d685db96ee3e8427aa0fd96ac83 ryzomcore/v0.8.0
|
||||||
00d9b6e29e95f56785fbf85abe60afd34674f402 v0.9.0
|
00d9b6e29e95f56785fbf85abe60afd34674f402 ryzomcore/v0.9.0
|
||||||
79776c337176dd5b02e1a74fe5dfb703b91747aa v0.9.1
|
79776c337176dd5b02e1a74fe5dfb703b91747aa ryzomcore/v0.9.1
|
||||||
fedf2aa443d09707beed814b0f499c6a5519cc84 v0.10.0
|
fedf2aa443d09707beed814b0f499c6a5519cc84 ryzomcore/v0.10.0
|
||||||
edaa3624a56420b02ccc64c26059801a389927ee v0.11.0
|
edaa3624a56420b02ccc64c26059801a389927ee ryzomcore/v0.11.0
|
||||||
e3fe4855f22c3e75722e015dc33c091c340b3ad7 v0.11.1
|
e3fe4855f22c3e75722e015dc33c091c340b3ad7 ryzomcore/v0.11.1
|
||||||
9e583b717fd63be0be9fd60b99087abf1691ea49 v0.11.2
|
9e583b717fd63be0be9fd60b99087abf1691ea49 ryzomcore/v0.11.2
|
||||||
bfe5628e14a024ba7ea32e4b326ae433a07856b9 v0.11.3
|
bfe5628e14a024ba7ea32e4b326ae433a07856b9 ryzomcore/v0.11.3
|
||||||
9a6120735daa97c96ac5d85ca35c7f21f607bd87 v0.12.0
|
9a6120735daa97c96ac5d85ca35c7f21f607bd87 ryzomcore/v0.12.0
|
||||||
3e92c7104c20d6bc6c2147b4b5fc289e8621d322 v1.0.0
|
3e17907af67e8d66d80e6b714707bbf912607f2a ryzom-patch-3.0.0
|
||||||
8eb94c3549be898fdc4a7c6d791d2477bdc11a18 v1.0.1
|
153e0b605c9e0c83ba05b6428c62838b49cc84b2 ryzom-patch-3.0.1
|
||||||
3e17907af67e8d66d80e6b714707bbf912607f2a ryzom/3.0.0
|
9d41f2994d44b9aad92b83f945f114e4b6bed44a ryzom-patch-3.0.2
|
||||||
153e0b605c9e0c83ba05b6428c62838b49cc84b2 ryzom/3.0.1
|
4300cc14aad098b1f86ea4c55577b7fa4a4cb5d2 ryzom-patch-3.1.0
|
||||||
9d41f2994d44b9aad92b83f945f114e4b6bed44a ryzom/3.0.2
|
d4060f217f4f834cc62a33f2f1ccdf3c28298066 ryzom-patch-3.1.0-hotfix
|
||||||
4300cc14aad098b1f86ea4c55577b7fa4a4cb5d2 ryzom/3.1.0
|
043aaeb3d8a2a54177581b57bda87a9deaad510e ryzom-patch-3.1.0-april_patch
|
||||||
d4060f217f4f834cc62a33f2f1ccdf3c28298066 ryzom/3.1.0-hotfix
|
4036ecf59e83960f03acebc2089eb2ff5eeaed0a ryzom-patch-3.2.0
|
||||||
043aaeb3d8a2a54177581b57bda87a9deaad510e ryzom/3.1.0-april_patch
|
18403bb9485da3d9742c6f007a16d5619ebfb196 ryzom-patch-3.2.1
|
||||||
4036ecf59e83960f03acebc2089eb2ff5eeaed0a ryzom/3.2.0
|
822ff8f8917ad66e09e2c21c983282f6f693b9f6 ryzom-patch-3.3.0
|
||||||
18403bb9485da3d9742c6f007a16d5619ebfb196 ryzom/3.2.1
|
00dde390a394fce9da06c2f3264140282158d39f ryzom-patch-3.3.0
|
||||||
822ff8f8917ad66e09e2c21c983282f6f693b9f6 ryzom/3.3.0
|
dcd4c4d161ef775136e18c7e8f5072b75dede27e ryzom-patch-3.3.1
|
||||||
00dde390a394fce9da06c2f3264140282158d39f ryzom/3.3.0
|
fc4be8ebec5ca754ef4453bc6a9faef90837c674 ryzom-patch-3.4.0
|
||||||
dcd4c4d161ef775136e18c7e8f5072b75dede27e ryzom/3.3.1
|
70eba02e8eab6920586dbabf74e9e8180c729980 ryzom-patch-3.4.0 Steam Fix
|
||||||
fc4be8ebec5ca754ef4453bc6a9faef90837c674 ryzom/3.4.0
|
3941482843f9cd130cfc16634efc08d34a98ed35 ryzom-patch-3.4.0 Atysmas
|
||||||
70eba02e8eab6920586dbabf74e9e8180c729980 ryzom/3.4.0-steam_fix
|
ecae9feb4cceb78103e5d7236caccaf450796cdb ryzom-patch-3.5.0
|
||||||
3941482843f9cd130cfc16634efc08d34a98ed35 ryzom/3.4.0-atysmas
|
95783afa226f241062134eb62f4323295d29ac84 ryzom-patch-3.5.0.9637
|
||||||
ecae9feb4cceb78103e5d7236caccaf450796cdb ryzom/3.5.0
|
2102fb276eb69d49ed4923042215312a63c47c08 Live-746
|
||||||
95783afa226f241062134eb62f4323295d29ac84 ryzom/3.5.0.9637
|
8eb94c3549be898fdc4a7c6d791d2477bdc11a18 ryzomcore/v1.0.1
|
||||||
|
3e92c7104c20d6bc6c2147b4b5fc289e8621d322 ryzomcore/v1.0.0
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
# This file is parsed by HunterGate command
|
||||||
|
|
||||||
|
hunter_config(luabind
|
||||||
|
VERSION 0.9.1
|
||||||
|
URL "https://github.com/nimetu/luabind/tarball/2fa4606"
|
||||||
|
SHA1 "3b4646bab9f0b2362d7b8d71d78e40deaf3cc747"
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,537 @@
|
|||||||
|
# Copyright (c) 2013-2019, Ruslan Baratov
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice, this
|
||||||
|
# list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
# This is a gate file to Hunter package manager.
|
||||||
|
# Include this file using `include` command and add package you need, example:
|
||||||
|
#
|
||||||
|
# cmake_minimum_required(VERSION 3.2)
|
||||||
|
#
|
||||||
|
# include("cmake/HunterGate.cmake")
|
||||||
|
# HunterGate(
|
||||||
|
# URL "https://github.com/path/to/hunter/archive.tar.gz"
|
||||||
|
# SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d"
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# project(MyProject)
|
||||||
|
#
|
||||||
|
# hunter_add_package(Foo)
|
||||||
|
# hunter_add_package(Boo COMPONENTS Bar Baz)
|
||||||
|
#
|
||||||
|
# Projects:
|
||||||
|
# * https://github.com/hunter-packages/gate/
|
||||||
|
# * https://github.com/ruslo/hunter
|
||||||
|
|
||||||
|
option(HUNTER_ENABLED "Enable Hunter package manager support" ON)
|
||||||
|
|
||||||
|
if(HUNTER_ENABLED)
|
||||||
|
if(CMAKE_VERSION VERSION_LESS "3.2")
|
||||||
|
message(
|
||||||
|
FATAL_ERROR
|
||||||
|
"At least CMake version 3.2 required for Hunter dependency management."
|
||||||
|
" Update CMake or set HUNTER_ENABLED to OFF."
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(CMakeParseArguments) # cmake_parse_arguments
|
||||||
|
|
||||||
|
option(HUNTER_STATUS_PRINT "Print working status" ON)
|
||||||
|
option(HUNTER_STATUS_DEBUG "Print a lot info" OFF)
|
||||||
|
option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON)
|
||||||
|
set(HUNTER_ROOT "" CACHE FILEPATH "Override the HUNTER_ROOT.")
|
||||||
|
|
||||||
|
set(HUNTER_ERROR_PAGE "https://hunter.readthedocs.io/en/latest/reference/errors")
|
||||||
|
|
||||||
|
function(hunter_gate_status_print)
|
||||||
|
if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG)
|
||||||
|
foreach(print_message ${ARGV})
|
||||||
|
message(STATUS "[hunter] ${print_message}")
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(hunter_gate_status_debug)
|
||||||
|
if(HUNTER_STATUS_DEBUG)
|
||||||
|
foreach(print_message ${ARGV})
|
||||||
|
string(TIMESTAMP timestamp)
|
||||||
|
message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}")
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(hunter_gate_error_page error_page)
|
||||||
|
message("------------------------------ ERROR ------------------------------")
|
||||||
|
message(" ${HUNTER_ERROR_PAGE}/${error_page}.html")
|
||||||
|
message("-------------------------------------------------------------------")
|
||||||
|
message("")
|
||||||
|
message(FATAL_ERROR "")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(hunter_gate_internal_error)
|
||||||
|
message("")
|
||||||
|
foreach(print_message ${ARGV})
|
||||||
|
message("[hunter ** INTERNAL **] ${print_message}")
|
||||||
|
endforeach()
|
||||||
|
message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
|
||||||
|
message("")
|
||||||
|
hunter_gate_error_page("error.internal")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(hunter_gate_fatal_error)
|
||||||
|
cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}")
|
||||||
|
if("${hunter_ERROR_PAGE}" STREQUAL "")
|
||||||
|
hunter_gate_internal_error("Expected ERROR_PAGE")
|
||||||
|
endif()
|
||||||
|
message("")
|
||||||
|
foreach(x ${hunter_UNPARSED_ARGUMENTS})
|
||||||
|
message("[hunter ** FATAL ERROR **] ${x}")
|
||||||
|
endforeach()
|
||||||
|
message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
|
||||||
|
message("")
|
||||||
|
hunter_gate_error_page("${hunter_ERROR_PAGE}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(hunter_gate_user_error)
|
||||||
|
hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(hunter_gate_self root version sha1 result)
|
||||||
|
string(COMPARE EQUAL "${root}" "" is_bad)
|
||||||
|
if(is_bad)
|
||||||
|
hunter_gate_internal_error("root is empty")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(COMPARE EQUAL "${version}" "" is_bad)
|
||||||
|
if(is_bad)
|
||||||
|
hunter_gate_internal_error("version is empty")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(COMPARE EQUAL "${sha1}" "" is_bad)
|
||||||
|
if(is_bad)
|
||||||
|
hunter_gate_internal_error("sha1 is empty")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(SUBSTRING "${sha1}" 0 7 archive_id)
|
||||||
|
|
||||||
|
if(EXISTS "${root}/cmake/Hunter")
|
||||||
|
set(hunter_self "${root}")
|
||||||
|
else()
|
||||||
|
set(
|
||||||
|
hunter_self
|
||||||
|
"${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set("${result}" "${hunter_self}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Set HUNTER_GATE_ROOT cmake variable to suitable value.
|
||||||
|
function(hunter_gate_detect_root)
|
||||||
|
# Check CMake variable
|
||||||
|
if(HUNTER_ROOT)
|
||||||
|
set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE)
|
||||||
|
hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check environment variable
|
||||||
|
if(DEFINED ENV{HUNTER_ROOT})
|
||||||
|
set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE)
|
||||||
|
hunter_gate_status_debug("HUNTER_ROOT detected by environment variable")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check HOME environment variable
|
||||||
|
if(DEFINED ENV{HOME})
|
||||||
|
set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE)
|
||||||
|
hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check SYSTEMDRIVE and USERPROFILE environment variable (windows only)
|
||||||
|
if(WIN32)
|
||||||
|
if(DEFINED ENV{SYSTEMDRIVE})
|
||||||
|
set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE)
|
||||||
|
hunter_gate_status_debug(
|
||||||
|
"HUNTER_ROOT set using SYSTEMDRIVE environment variable"
|
||||||
|
)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(DEFINED ENV{USERPROFILE})
|
||||||
|
set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE)
|
||||||
|
hunter_gate_status_debug(
|
||||||
|
"HUNTER_ROOT set using USERPROFILE environment variable"
|
||||||
|
)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
hunter_gate_fatal_error(
|
||||||
|
"Can't detect HUNTER_ROOT"
|
||||||
|
ERROR_PAGE "error.detect.hunter.root"
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(hunter_gate_download dir)
|
||||||
|
string(
|
||||||
|
COMPARE
|
||||||
|
NOTEQUAL
|
||||||
|
"$ENV{HUNTER_DISABLE_AUTOINSTALL}"
|
||||||
|
""
|
||||||
|
disable_autoinstall
|
||||||
|
)
|
||||||
|
if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL)
|
||||||
|
hunter_gate_fatal_error(
|
||||||
|
"Hunter not found in '${dir}'"
|
||||||
|
"Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'"
|
||||||
|
"Settings:"
|
||||||
|
" HUNTER_ROOT: ${HUNTER_GATE_ROOT}"
|
||||||
|
" HUNTER_SHA1: ${HUNTER_GATE_SHA1}"
|
||||||
|
ERROR_PAGE "error.run.install"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
string(COMPARE EQUAL "${dir}" "" is_bad)
|
||||||
|
if(is_bad)
|
||||||
|
hunter_gate_internal_error("Empty 'dir' argument")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad)
|
||||||
|
if(is_bad)
|
||||||
|
hunter_gate_internal_error("HUNTER_GATE_SHA1 empty")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad)
|
||||||
|
if(is_bad)
|
||||||
|
hunter_gate_internal_error("HUNTER_GATE_URL empty")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(done_location "${dir}/DONE")
|
||||||
|
set(sha1_location "${dir}/SHA1")
|
||||||
|
|
||||||
|
set(build_dir "${dir}/Build")
|
||||||
|
set(cmakelists "${dir}/CMakeLists.txt")
|
||||||
|
|
||||||
|
hunter_gate_status_debug("Locking directory: ${dir}")
|
||||||
|
file(LOCK "${dir}" DIRECTORY GUARD FUNCTION)
|
||||||
|
hunter_gate_status_debug("Lock done")
|
||||||
|
|
||||||
|
if(EXISTS "${done_location}")
|
||||||
|
# while waiting for lock other instance can do all the job
|
||||||
|
hunter_gate_status_debug("File '${done_location}' found, skip install")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(REMOVE_RECURSE "${build_dir}")
|
||||||
|
file(REMOVE_RECURSE "${cmakelists}")
|
||||||
|
|
||||||
|
file(MAKE_DIRECTORY "${build_dir}") # check directory permissions
|
||||||
|
|
||||||
|
# Disabling languages speeds up a little bit, reduces noise in the output
|
||||||
|
# and avoids path too long windows error
|
||||||
|
file(
|
||||||
|
WRITE
|
||||||
|
"${cmakelists}"
|
||||||
|
"cmake_minimum_required(VERSION 3.2)\n"
|
||||||
|
"project(HunterDownload LANGUAGES NONE)\n"
|
||||||
|
"include(ExternalProject)\n"
|
||||||
|
"ExternalProject_Add(\n"
|
||||||
|
" Hunter\n"
|
||||||
|
" URL\n"
|
||||||
|
" \"${HUNTER_GATE_URL}\"\n"
|
||||||
|
" URL_HASH\n"
|
||||||
|
" SHA1=${HUNTER_GATE_SHA1}\n"
|
||||||
|
" DOWNLOAD_DIR\n"
|
||||||
|
" \"${dir}\"\n"
|
||||||
|
" TLS_VERIFY\n"
|
||||||
|
" ${HUNTER_TLS_VERIFY}\n"
|
||||||
|
" SOURCE_DIR\n"
|
||||||
|
" \"${dir}/Unpacked\"\n"
|
||||||
|
" CONFIGURE_COMMAND\n"
|
||||||
|
" \"\"\n"
|
||||||
|
" BUILD_COMMAND\n"
|
||||||
|
" \"\"\n"
|
||||||
|
" INSTALL_COMMAND\n"
|
||||||
|
" \"\"\n"
|
||||||
|
")\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
if(HUNTER_STATUS_DEBUG)
|
||||||
|
set(logging_params "")
|
||||||
|
else()
|
||||||
|
set(logging_params OUTPUT_QUIET)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
hunter_gate_status_debug("Run generate")
|
||||||
|
|
||||||
|
# Need to add toolchain file too.
|
||||||
|
# Otherwise on Visual Studio + MDD this will fail with error:
|
||||||
|
# "Could not find an appropriate version of the Windows 10 SDK installed on this machine"
|
||||||
|
if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
|
||||||
|
get_filename_component(absolute_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE)
|
||||||
|
set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${absolute_CMAKE_TOOLCHAIN_FILE}")
|
||||||
|
else()
|
||||||
|
# 'toolchain_arg' can't be empty
|
||||||
|
set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(COMPARE EQUAL "${CMAKE_MAKE_PROGRAM}" "" no_make)
|
||||||
|
if(no_make)
|
||||||
|
set(make_arg "")
|
||||||
|
else()
|
||||||
|
# Test case: remove Ninja from PATH but set it via CMAKE_MAKE_PROGRAM
|
||||||
|
set(make_arg "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND
|
||||||
|
"${CMAKE_COMMAND}"
|
||||||
|
"-H${dir}"
|
||||||
|
"-B${build_dir}"
|
||||||
|
"-G${CMAKE_GENERATOR}"
|
||||||
|
"${toolchain_arg}"
|
||||||
|
${make_arg}
|
||||||
|
WORKING_DIRECTORY "${dir}"
|
||||||
|
RESULT_VARIABLE download_result
|
||||||
|
${logging_params}
|
||||||
|
)
|
||||||
|
|
||||||
|
if(NOT download_result EQUAL 0)
|
||||||
|
hunter_gate_internal_error(
|
||||||
|
"Configure project failed."
|
||||||
|
"To reproduce the error run: ${CMAKE_COMMAND} -H${dir} -B${build_dir} -G${CMAKE_GENERATOR} ${toolchain_arg} ${make_arg}"
|
||||||
|
"In directory ${dir}"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
hunter_gate_status_print(
|
||||||
|
"Initializing Hunter workspace (${HUNTER_GATE_SHA1})"
|
||||||
|
" ${HUNTER_GATE_URL}"
|
||||||
|
" -> ${dir}"
|
||||||
|
)
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${CMAKE_COMMAND}" --build "${build_dir}"
|
||||||
|
WORKING_DIRECTORY "${dir}"
|
||||||
|
RESULT_VARIABLE download_result
|
||||||
|
${logging_params}
|
||||||
|
)
|
||||||
|
|
||||||
|
if(NOT download_result EQUAL 0)
|
||||||
|
hunter_gate_internal_error("Build project failed")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(REMOVE_RECURSE "${build_dir}")
|
||||||
|
file(REMOVE_RECURSE "${cmakelists}")
|
||||||
|
|
||||||
|
file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}")
|
||||||
|
file(WRITE "${done_location}" "DONE")
|
||||||
|
|
||||||
|
hunter_gate_status_debug("Finished")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Must be a macro so master file 'cmake/Hunter' can
|
||||||
|
# apply all variables easily just by 'include' command
|
||||||
|
# (otherwise PARENT_SCOPE magic needed)
|
||||||
|
macro(HunterGate)
|
||||||
|
if(HUNTER_GATE_DONE)
|
||||||
|
# variable HUNTER_GATE_DONE set explicitly for external project
|
||||||
|
# (see `hunter_download`)
|
||||||
|
set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# First HunterGate command will init Hunter, others will be ignored
|
||||||
|
get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET)
|
||||||
|
|
||||||
|
if(NOT HUNTER_ENABLED)
|
||||||
|
# Empty function to avoid error "unknown function"
|
||||||
|
function(hunter_add_package)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
set(
|
||||||
|
_hunter_gate_disabled_mode_dir
|
||||||
|
"${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode"
|
||||||
|
)
|
||||||
|
if(EXISTS "${_hunter_gate_disabled_mode_dir}")
|
||||||
|
hunter_gate_status_debug(
|
||||||
|
"Adding \"disabled-mode\" modules: ${_hunter_gate_disabled_mode_dir}"
|
||||||
|
)
|
||||||
|
list(APPEND CMAKE_PREFIX_PATH "${_hunter_gate_disabled_mode_dir}")
|
||||||
|
endif()
|
||||||
|
elseif(_hunter_gate_done)
|
||||||
|
hunter_gate_status_debug("Secondary HunterGate (use old settings)")
|
||||||
|
hunter_gate_self(
|
||||||
|
"${HUNTER_CACHED_ROOT}"
|
||||||
|
"${HUNTER_VERSION}"
|
||||||
|
"${HUNTER_SHA1}"
|
||||||
|
_hunter_self
|
||||||
|
)
|
||||||
|
include("${_hunter_self}/cmake/Hunter")
|
||||||
|
else()
|
||||||
|
set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||||
|
|
||||||
|
string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name)
|
||||||
|
if(_have_project_name)
|
||||||
|
hunter_gate_fatal_error(
|
||||||
|
"Please set HunterGate *before* 'project' command. "
|
||||||
|
"Detected project: ${PROJECT_NAME}"
|
||||||
|
ERROR_PAGE "error.huntergate.before.project"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
cmake_parse_arguments(
|
||||||
|
HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV}
|
||||||
|
)
|
||||||
|
|
||||||
|
string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1)
|
||||||
|
string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url)
|
||||||
|
string(
|
||||||
|
COMPARE
|
||||||
|
NOTEQUAL
|
||||||
|
"${HUNTER_GATE_UNPARSED_ARGUMENTS}"
|
||||||
|
""
|
||||||
|
_have_unparsed
|
||||||
|
)
|
||||||
|
string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global)
|
||||||
|
string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath)
|
||||||
|
|
||||||
|
if(_have_unparsed)
|
||||||
|
hunter_gate_user_error(
|
||||||
|
"HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
if(_empty_sha1)
|
||||||
|
hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory")
|
||||||
|
endif()
|
||||||
|
if(_empty_url)
|
||||||
|
hunter_gate_user_error("URL suboption of HunterGate is mandatory")
|
||||||
|
endif()
|
||||||
|
if(_have_global)
|
||||||
|
if(HUNTER_GATE_LOCAL)
|
||||||
|
hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)")
|
||||||
|
endif()
|
||||||
|
if(_have_filepath)
|
||||||
|
hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(HUNTER_GATE_LOCAL)
|
||||||
|
if(_have_global)
|
||||||
|
hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)")
|
||||||
|
endif()
|
||||||
|
if(_have_filepath)
|
||||||
|
hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(_have_filepath)
|
||||||
|
if(_have_global)
|
||||||
|
hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)")
|
||||||
|
endif()
|
||||||
|
if(HUNTER_GATE_LOCAL)
|
||||||
|
hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
hunter_gate_detect_root() # set HUNTER_GATE_ROOT
|
||||||
|
|
||||||
|
# Beautify path, fix probable problems with windows path slashes
|
||||||
|
get_filename_component(
|
||||||
|
HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE
|
||||||
|
)
|
||||||
|
hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}")
|
||||||
|
if(NOT HUNTER_ALLOW_SPACES_IN_PATH)
|
||||||
|
string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces)
|
||||||
|
if(NOT _contain_spaces EQUAL -1)
|
||||||
|
hunter_gate_fatal_error(
|
||||||
|
"HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces."
|
||||||
|
"Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error"
|
||||||
|
"(Use at your own risk!)"
|
||||||
|
ERROR_PAGE "error.spaces.in.hunter.root"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(
|
||||||
|
REGEX
|
||||||
|
MATCH
|
||||||
|
"[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*"
|
||||||
|
HUNTER_GATE_VERSION
|
||||||
|
"${HUNTER_GATE_URL}"
|
||||||
|
)
|
||||||
|
string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty)
|
||||||
|
if(_is_empty)
|
||||||
|
set(HUNTER_GATE_VERSION "unknown")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
hunter_gate_self(
|
||||||
|
"${HUNTER_GATE_ROOT}"
|
||||||
|
"${HUNTER_GATE_VERSION}"
|
||||||
|
"${HUNTER_GATE_SHA1}"
|
||||||
|
_hunter_self
|
||||||
|
)
|
||||||
|
|
||||||
|
set(_master_location "${_hunter_self}/cmake/Hunter")
|
||||||
|
if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter")
|
||||||
|
# Hunter downloaded manually (e.g. by 'git clone')
|
||||||
|
set(_unused "xxxxxxxxxx")
|
||||||
|
set(HUNTER_GATE_SHA1 "${_unused}")
|
||||||
|
set(HUNTER_GATE_VERSION "${_unused}")
|
||||||
|
else()
|
||||||
|
get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE)
|
||||||
|
set(_done_location "${_archive_id_location}/DONE")
|
||||||
|
set(_sha1_location "${_archive_id_location}/SHA1")
|
||||||
|
|
||||||
|
# Check Hunter already downloaded by HunterGate
|
||||||
|
if(NOT EXISTS "${_done_location}")
|
||||||
|
hunter_gate_download("${_archive_id_location}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT EXISTS "${_done_location}")
|
||||||
|
hunter_gate_internal_error("hunter_gate_download failed")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT EXISTS "${_sha1_location}")
|
||||||
|
hunter_gate_internal_error("${_sha1_location} not found")
|
||||||
|
endif()
|
||||||
|
file(READ "${_sha1_location}" _sha1_value)
|
||||||
|
string(TOLOWER "${_sha1_value}" _sha1_value_lower)
|
||||||
|
string(TOLOWER "${HUNTER_GATE_SHA1}" _HUNTER_GATE_SHA1_lower)
|
||||||
|
string(COMPARE EQUAL "${_sha1_value_lower}" "${_HUNTER_GATE_SHA1_lower}" _is_equal)
|
||||||
|
if(NOT _is_equal)
|
||||||
|
hunter_gate_internal_error(
|
||||||
|
"Short SHA1 collision:"
|
||||||
|
" ${_sha1_value} (from ${_sha1_location})"
|
||||||
|
" ${HUNTER_GATE_SHA1} (HunterGate)"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
if(NOT EXISTS "${_master_location}")
|
||||||
|
hunter_gate_user_error(
|
||||||
|
"Master file not found:"
|
||||||
|
" ${_master_location}"
|
||||||
|
"try to update Hunter/HunterGate"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
include("${_master_location}")
|
||||||
|
set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
|
||||||
|
endif()
|
||||||
|
endmacro()
|
@ -0,0 +1,83 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010-2019 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_CSS_BACKGROUND_H
|
||||||
|
#define CL_CSS_BACKGROUND_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/misc/rgba.h"
|
||||||
|
#include "nel/gui/css_types.h"
|
||||||
|
#include "nel/gui/css_length.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* \brief CSS background info
|
||||||
|
* \date 2021-07-02 11:36 GMT
|
||||||
|
* \author Meelis Mägi (Nimetu)
|
||||||
|
*/
|
||||||
|
class CSSBackground
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CSSBackground()
|
||||||
|
:color(NLMISC::CRGBA::Transparent),
|
||||||
|
repeatX(CSS_VALUE_REPEAT), repeatY(CSS_VALUE_REPEAT), attachment(CSS_VALUE_SCROLL),
|
||||||
|
xAnchor(CSS_VALUE_LEFT), yAnchor(CSS_VALUE_TOP),
|
||||||
|
clip(CSS_VALUE_BORDER_BOX), origin(CSS_VALUE_PADDING_BOX), size(CSS_VALUE_AUTO)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void setImage(const std::string &value);
|
||||||
|
void setPosition(const std::string &value);
|
||||||
|
void setSize(const std::string &value);
|
||||||
|
void setRepeat(const std::string &value);
|
||||||
|
void setOrigin(const std::string &value);
|
||||||
|
void setClip(const std::string &value);
|
||||||
|
void setAttachment(const std::string &value);
|
||||||
|
void setColor(const std::string &value);
|
||||||
|
|
||||||
|
public:
|
||||||
|
// TODO: only final layer has color
|
||||||
|
NLMISC::CRGBA color;
|
||||||
|
std::string image;
|
||||||
|
|
||||||
|
CSSValueType repeatX;
|
||||||
|
CSSValueType repeatY;
|
||||||
|
CSSValueType attachment;
|
||||||
|
|
||||||
|
CSSValueType xAnchor;
|
||||||
|
CSSValueType yAnchor;
|
||||||
|
CSSLength xPosition;
|
||||||
|
CSSLength yPosition;
|
||||||
|
|
||||||
|
CSSValueType clip;
|
||||||
|
CSSValueType origin;
|
||||||
|
|
||||||
|
CSSValueType size;
|
||||||
|
CSSLength width;
|
||||||
|
CSSLength height;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void positionFromOne(const std::vector<std::string> &parts);
|
||||||
|
void positionFromTwo(const std::vector<std::string> &parts);
|
||||||
|
void positionFromThree(const std::vector<std::string> &parts);
|
||||||
|
void positionFromFour(const std::vector<std::string> &parts);
|
||||||
|
};
|
||||||
|
|
||||||
|
}//namespace
|
||||||
|
|
||||||
|
#endif // CL_CSS_BACKGROUND_H
|
||||||
|
|
||||||
|
|
@ -0,0 +1,193 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010-2019 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_CSS_BACKGROUND_RENDERER_H
|
||||||
|
#define NL_CSS_BACKGROUND_RENDERER_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/misc/rgba.h"
|
||||||
|
#include "nel/misc/geom_ext.h"
|
||||||
|
#include "nel/gui/css_types.h"
|
||||||
|
#include "nel/gui/css_background.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CInterfaceElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Border renderer for GUI classes
|
||||||
|
* \date 2021-06-29 15:17 GMT
|
||||||
|
* \author Meelis Mägi (Nimetu)
|
||||||
|
*/
|
||||||
|
class CSSBackgroundRenderer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// alpha value from parent
|
||||||
|
uint8 CurrentAlpha;
|
||||||
|
|
||||||
|
// TODO: should be moved to CSSBackground
|
||||||
|
sint32 TextureId;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CSSBackgroundRenderer();
|
||||||
|
~CSSBackgroundRenderer();
|
||||||
|
|
||||||
|
// return true if no background is set
|
||||||
|
bool isEmpty() const
|
||||||
|
{
|
||||||
|
return m_Background.image.empty() && m_Background.color.A == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setModulateGlobalColor(bool m) { m_ModulateGlobalColor = m; }
|
||||||
|
|
||||||
|
void updateCoords();
|
||||||
|
void invalidateCoords() { m_Dirty = true; }
|
||||||
|
void invalidateContent() { m_Dirty = true; };
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
void setBackground(const CSSBackground &bg);
|
||||||
|
|
||||||
|
// helper function to change background image
|
||||||
|
void setImage(const std::string &bgtex);
|
||||||
|
void setImageRepeat(bool b);
|
||||||
|
void setImageCover(bool b);
|
||||||
|
|
||||||
|
// helper function to change background color
|
||||||
|
void setColor(const NLMISC::CRGBA &color)
|
||||||
|
{
|
||||||
|
m_Dirty = true;
|
||||||
|
m_Background.color = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
NLMISC::CRGBA getColor() const
|
||||||
|
{
|
||||||
|
return m_Background.color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// override painting area to be at least the size of viewport (ie, <html> background)
|
||||||
|
void setFillViewport(bool b) {
|
||||||
|
m_Dirty = true;
|
||||||
|
m_FillViewport = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setViewport(CInterfaceElement *root)
|
||||||
|
{
|
||||||
|
m_Dirty = true;
|
||||||
|
m_Viewport = root;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setBorderArea(sint32 x, sint32 y, sint32 w, sint32 h)
|
||||||
|
{
|
||||||
|
m_Dirty = true;
|
||||||
|
m_BorderX = x;
|
||||||
|
m_BorderY = y;
|
||||||
|
m_BorderW = w;
|
||||||
|
m_BorderH = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPaddingArea(sint32 x, sint32 y, sint32 w, sint32 h)
|
||||||
|
{
|
||||||
|
m_Dirty = true;
|
||||||
|
m_PaddingX = x;
|
||||||
|
m_PaddingY = y;
|
||||||
|
m_PaddingW = w;
|
||||||
|
m_PaddingH = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setContentArea(sint32 x, sint32 y, sint32 w, sint32 h)
|
||||||
|
{
|
||||||
|
m_Dirty = true;
|
||||||
|
m_ContentX = x;
|
||||||
|
m_ContentY = y;
|
||||||
|
m_ContentW = w;
|
||||||
|
m_ContentH = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sizes for em, rem units
|
||||||
|
void setFontSize(float rootFontSize, float fontSize)
|
||||||
|
{
|
||||||
|
m_Dirty = true;
|
||||||
|
m_RootFontSize = rootFontSize;
|
||||||
|
m_FontSize = fontSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw();
|
||||||
|
|
||||||
|
private:
|
||||||
|
sint32 m_BorderX, m_BorderY, m_BorderW, m_BorderH;
|
||||||
|
sint32 m_PaddingX, m_PaddingY, m_PaddingW, m_PaddingH;
|
||||||
|
sint32 m_ContentX, m_ContentY, m_ContentW, m_ContentH;
|
||||||
|
|
||||||
|
// font size for 'rem'
|
||||||
|
float m_RootFontSize;
|
||||||
|
|
||||||
|
// font size for 'em'
|
||||||
|
float m_FontSize;
|
||||||
|
|
||||||
|
// viewport element for vw,wh,vmin,vmax
|
||||||
|
CInterfaceElement* m_Viewport;
|
||||||
|
|
||||||
|
struct SDrawQueue
|
||||||
|
{
|
||||||
|
sint32 TextureId;
|
||||||
|
NLMISC::CQuadUV Quad;
|
||||||
|
NLMISC::CRGBA Color;
|
||||||
|
};
|
||||||
|
std::vector<SDrawQueue> m_DrawQueue;
|
||||||
|
|
||||||
|
const sint8 m_RenderLayer;
|
||||||
|
bool m_ModulateGlobalColor;
|
||||||
|
// if true, painting area returns area at least the size of viewport (ie, <html> background)
|
||||||
|
bool m_FillViewport;
|
||||||
|
|
||||||
|
// if true, then updateCoords() is called from draw()
|
||||||
|
bool m_Dirty;
|
||||||
|
|
||||||
|
CSSBackground m_Background;
|
||||||
|
|
||||||
|
// get clip area based on background-clip
|
||||||
|
void getPaintingArea(const CSSBackground &bg, sint32 &areaX, sint32 &areaY, sint32 &areaW, sint32 &areaH) const;
|
||||||
|
|
||||||
|
// get positioning area based on background-origin
|
||||||
|
void getPositioningArea(const CSSBackground &bg, sint32 &areaX, sint32 &areaY, sint32 &areaW, sint32 &areaH) const;
|
||||||
|
|
||||||
|
// calculate image size based on background-size
|
||||||
|
void calculateSize(const CSSBackground &bg, sint32 &texW, sint32 &texH) const;
|
||||||
|
|
||||||
|
// calculate image position based on background-position
|
||||||
|
void calculatePosition(const CSSBackground &bg, sint32 &texX, sint32 &texY, sint32 &texW, sint32 &texH) const;
|
||||||
|
|
||||||
|
// calculate image tile position, size, count, and spacing based on background-repeat
|
||||||
|
void calculateTiles(const CSSBackground &bg, sint32 &texX, sint32 &texY, sint32 &texW, sint32 &texH, sint32 &tilesX, sint32 &tilesY, sint32 &spacingX, sint32 &spacingY) const;
|
||||||
|
|
||||||
|
// position, size, and count for first tile to cover an area
|
||||||
|
void getImageTile(sint32 &tilePos, sint32 &tileSize, sint32 &spacing, sint32 &tiles, sint32 areaPos, sint32 areaSize, CSSValueType repeat) const;
|
||||||
|
|
||||||
|
// push background color to draw queue
|
||||||
|
void buildColorQuads(const CSSBackground &bg);
|
||||||
|
|
||||||
|
// push background image to draw quque
|
||||||
|
void buildImageQuads(const CSSBackground &bg, sint32 textureId);
|
||||||
|
|
||||||
|
}; // CSSBackgroundRenderer
|
||||||
|
|
||||||
|
}//namespace
|
||||||
|
|
||||||
|
#endif // NL_CSS_BACKGROUND_RENDERER_H
|
||||||
|
|
||||||
|
|
@ -0,0 +1,72 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010-2019 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_CSS_BORDER_H
|
||||||
|
#define CL_CSS_BORDER_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/misc/rgba.h"
|
||||||
|
#include "nel/gui/css_types.h"
|
||||||
|
#include "nel/gui/css_length.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* \brief CSS border info
|
||||||
|
* \date 2021-07-23 09:51 GMT
|
||||||
|
* \author Meelis Mägi (Nimetu)
|
||||||
|
*/
|
||||||
|
class CSSBorder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CSSBorder()
|
||||||
|
{
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
CSSBorder(uint width, CSSLineStyle style, NLMISC::CRGBA color)
|
||||||
|
{
|
||||||
|
set(width, style, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset()
|
||||||
|
{
|
||||||
|
set(CSS_LINE_WIDTH_MEDIUM, CSS_LINE_STYLE_NONE, NLMISC::CRGBA::Transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set(uint width, CSSLineStyle style, NLMISC::CRGBA color)
|
||||||
|
{
|
||||||
|
Width.setFloatValue(width, "px");
|
||||||
|
Style = style;
|
||||||
|
Color = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool empty() const
|
||||||
|
{
|
||||||
|
return Style == CSS_LINE_STYLE_NONE || Style == CSS_LINE_STYLE_HIDDEN
|
||||||
|
|| Width.getFloat() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSSLength Width;
|
||||||
|
CSSLineStyle Style;
|
||||||
|
NLMISC::CRGBA Color;
|
||||||
|
};
|
||||||
|
|
||||||
|
}//namespace
|
||||||
|
|
||||||
|
#endif // CL_CSS_BORDER_H
|
||||||
|
|
||||||
|
|
@ -0,0 +1,76 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010-2021 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_CSS_LENGTH_H
|
||||||
|
#define CL_CSS_LENGTH_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/css_types.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* \brief CSS types used in GUI classes
|
||||||
|
* \date 2021-07-02 11:36 GMT
|
||||||
|
* \author Meelis Mägi (Nimetu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
class CSSLength
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Kind {
|
||||||
|
Auto, Relative, Fixed
|
||||||
|
};
|
||||||
|
|
||||||
|
CSSLength(float value = 0, CSSUnitType unit = CSS_UNIT_NONE, Kind kind = Auto)
|
||||||
|
: m_Value(value), m_Unit(unit), m_Kind(Auto)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void setAuto() { m_Kind = Auto; }
|
||||||
|
bool parseValue(const std::string &value, bool allowPercent = true, bool allowNegative = false);
|
||||||
|
void setFloatValue(float f, const std::string &unit);
|
||||||
|
|
||||||
|
float getValue() const;
|
||||||
|
float getFloat() const { return m_Value; }
|
||||||
|
|
||||||
|
bool isPercent() const { return m_Unit == CSS_UNIT_PERCENT; }
|
||||||
|
|
||||||
|
bool isAuto() const { return m_Kind == Auto; }
|
||||||
|
bool isRelative() const { return m_Kind == Relative; }
|
||||||
|
|
||||||
|
// % uses relValue
|
||||||
|
// em uses emSize
|
||||||
|
// rem uses remSize
|
||||||
|
// vw,vh,vi,vb,vmin,vmax uses vwSize/vhSize
|
||||||
|
float calculate(uint32 relValue, uint32 emSize, uint32 remSize, uint32 vwSize, uint32 whSize) const;
|
||||||
|
|
||||||
|
CSSUnitType getUnit() const { return m_Unit; }
|
||||||
|
|
||||||
|
std::string toString() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setUnit(const std::string &unit);
|
||||||
|
|
||||||
|
float m_Value;
|
||||||
|
CSSUnitType m_Unit;
|
||||||
|
Kind m_Kind;
|
||||||
|
};
|
||||||
|
|
||||||
|
}//namespace
|
||||||
|
|
||||||
|
#endif // CL_CSS_LENGTH_H
|
||||||
|
|
||||||
|
|
@ -0,0 +1,427 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010-2021 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "stdpch.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "nel/gui/libwww.h"
|
||||||
|
#include "nel/gui/css_length.h"
|
||||||
|
#include "nel/gui/css_background.h"
|
||||||
|
|
||||||
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
#ifdef DEBUG_NEW
|
||||||
|
#define new DEBUG_NEW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
void CSSBackground::setImage(const std::string &value)
|
||||||
|
{
|
||||||
|
image = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSSBackground::setPosition(const std::string &value)
|
||||||
|
{
|
||||||
|
std::vector<std::string> parts;
|
||||||
|
splitString(toLowerAscii(value), " ", parts);
|
||||||
|
|
||||||
|
if (parts.empty() || parts.size() > 4)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch(parts.size())
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
positionFromOne(parts);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
positionFromTwo(parts);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
positionFromThree(parts);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
positionFromFour(parts);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSSBackground::setSize(const std::string &value)
|
||||||
|
{
|
||||||
|
std::vector<std::string> parts;
|
||||||
|
splitString(toLowerAscii(value), " ", parts);
|
||||||
|
if (parts.size() > 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (parts.size() == 1 && (parts[0] == "cover" || parts[0] == "contain"))
|
||||||
|
{
|
||||||
|
if (parts[0] == "cover")
|
||||||
|
size = CSS_VALUE_COVER;
|
||||||
|
else
|
||||||
|
size = CSS_VALUE_CONTAIN;
|
||||||
|
|
||||||
|
width.setAuto();
|
||||||
|
height.setAuto();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// height will default to 'auto' if not set
|
||||||
|
if (parts.size() == 1)
|
||||||
|
parts.push_back("auto");
|
||||||
|
|
||||||
|
if (parts[0] == "auto" && parts[1] == "auto")
|
||||||
|
{
|
||||||
|
size = CSS_VALUE_AUTO;
|
||||||
|
width.setAuto();
|
||||||
|
height.setAuto();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSSLength newW, newH;
|
||||||
|
bool success = true;
|
||||||
|
if (parts[0] == "auto")
|
||||||
|
{
|
||||||
|
newW.setAuto();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float fval;
|
||||||
|
std::string unit;
|
||||||
|
if (!getCssLength(fval, unit, parts[0]))
|
||||||
|
{
|
||||||
|
nlwarning("Failed to parse background-size[0] '%s'", parts[0].c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
newW.setFloatValue(fval, unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parts[1] == "auto")
|
||||||
|
{
|
||||||
|
newH.setAuto();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float fval;
|
||||||
|
std::string unit;
|
||||||
|
if (!getCssLength(fval, unit, parts[1]))
|
||||||
|
{
|
||||||
|
nlwarning("Failed to parse background-size[1] '%s'", parts[1].c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
newH.setFloatValue(fval, unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
size = CSS_VALUE_LENGTH;
|
||||||
|
width = newW;
|
||||||
|
height = newH;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSSBackground::setRepeat(const std::string &value)
|
||||||
|
{
|
||||||
|
std::vector<std::string> parts;
|
||||||
|
splitString(toLowerAscii(value), " ", parts);
|
||||||
|
if (parts.size() == 0 || parts.size() > 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (parts.size() == 1)
|
||||||
|
{
|
||||||
|
if (parts[0] == "repeat-x")
|
||||||
|
parts.push_back("no-repeat");
|
||||||
|
else if (parts[0] == "repeat-y")
|
||||||
|
parts.insert(parts.begin(), "no-repeat");
|
||||||
|
else //repeat, space, round, no-repeat
|
||||||
|
parts.push_back(parts[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (parts[0] == "repeat") repeatX = CSS_VALUE_REPEAT;
|
||||||
|
else if (parts[0] == "no-repeat") repeatX = CSS_VALUE_NOREPEAT;
|
||||||
|
else if (parts[0] == "space") repeatX = CSS_VALUE_SPACE;
|
||||||
|
else if (parts[0] == "round") repeatX = CSS_VALUE_ROUND;
|
||||||
|
else repeatX = CSS_VALUE_REPEAT;
|
||||||
|
|
||||||
|
if (parts[1] == "repeat") repeatY = CSS_VALUE_REPEAT;
|
||||||
|
else if (parts[1] == "no-repeat") repeatY = CSS_VALUE_NOREPEAT;
|
||||||
|
else if (parts[1] == "space") repeatY = CSS_VALUE_SPACE;
|
||||||
|
else if (parts[1] == "round") repeatY = CSS_VALUE_ROUND;
|
||||||
|
else repeatY = CSS_VALUE_REPEAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSSBackground::setOrigin(const std::string &value)
|
||||||
|
{
|
||||||
|
if (value == "border-box") origin = CSS_VALUE_BORDER_BOX;
|
||||||
|
else if (value == "padding-box") origin = CSS_VALUE_PADDING_BOX;
|
||||||
|
else if (value == "content-box") origin = CSS_VALUE_CONTENT_BOX;
|
||||||
|
else origin = CSS_VALUE_PADDING_BOX;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSSBackground::setClip(const std::string &value)
|
||||||
|
{
|
||||||
|
if (value == "border-box") clip = CSS_VALUE_BORDER_BOX;
|
||||||
|
else if (value == "padding-box") clip = CSS_VALUE_PADDING_BOX;
|
||||||
|
else if (value == "content-box") clip = CSS_VALUE_CONTENT_BOX;
|
||||||
|
//else if (value == "text") clip = CSSValueType::Text;
|
||||||
|
else clip = CSS_VALUE_PADDING_BOX;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSSBackground::setAttachment(const std::string &value)
|
||||||
|
{
|
||||||
|
if (value == "fixed") attachment = CSS_VALUE_FIXED;
|
||||||
|
else if (value == "local") attachment = CSS_VALUE_LOCAL;
|
||||||
|
else if (value == "scroll") attachment = CSS_VALUE_SCROLL;
|
||||||
|
else attachment = CSS_VALUE_SCROLL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSSBackground::setColor(const std::string &value)
|
||||||
|
{
|
||||||
|
NLMISC::CRGBA tmp;
|
||||||
|
if (scanHTMLColor(value.c_str(), tmp))
|
||||||
|
color = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool isHorizontalKeyword(const std::string &val)
|
||||||
|
{
|
||||||
|
return val == "left" || val == "right";
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool isVerticalKeyword(const std::string &val)
|
||||||
|
{
|
||||||
|
return val == "top" || val == "bottom";
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSSBackground::positionFromOne(const std::vector<std::string> &parts)
|
||||||
|
{
|
||||||
|
CSSValueType newH = CSS_VALUE_LEFT;
|
||||||
|
CSSValueType newV = CSS_VALUE_TOP;
|
||||||
|
CSSLength newX, newY;
|
||||||
|
newX.setFloatValue(0, "%");
|
||||||
|
newY.setFloatValue(0, "%");
|
||||||
|
|
||||||
|
uint index = 0;
|
||||||
|
float fval;
|
||||||
|
std::string unit;
|
||||||
|
if (isHorizontalKeyword(parts[index]))
|
||||||
|
{
|
||||||
|
newH = parts[index] == "left" ? CSS_VALUE_LEFT : CSS_VALUE_RIGHT;
|
||||||
|
newV = CSS_VALUE_CENTER;
|
||||||
|
}
|
||||||
|
else if (isVerticalKeyword(parts[index]))
|
||||||
|
{
|
||||||
|
newH = CSS_VALUE_CENTER;
|
||||||
|
newV = parts[index] == "top" ? CSS_VALUE_TOP : CSS_VALUE_BOTTOM;
|
||||||
|
}
|
||||||
|
else if (parts[index] == "center")
|
||||||
|
{
|
||||||
|
newH = CSS_VALUE_CENTER;
|
||||||
|
newV = CSS_VALUE_CENTER;
|
||||||
|
}
|
||||||
|
else if (getCssLength(fval, unit, parts[index], true))
|
||||||
|
{
|
||||||
|
newX.setFloatValue(fval, unit);
|
||||||
|
newV = CSS_VALUE_CENTER;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xAnchor = newH;
|
||||||
|
yAnchor = newV;
|
||||||
|
xPosition = newX;
|
||||||
|
yPosition = newY;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSSBackground::positionFromTwo(const std::vector<std::string> &parts)
|
||||||
|
{
|
||||||
|
CSSValueType newH = CSS_VALUE_LEFT;
|
||||||
|
CSSValueType newV = CSS_VALUE_TOP;
|
||||||
|
CSSLength newX, newY;
|
||||||
|
newX.setFloatValue(0, "%");
|
||||||
|
newY.setFloatValue(0, "%");
|
||||||
|
|
||||||
|
float fval;
|
||||||
|
std::string unit;
|
||||||
|
uint index = 0;
|
||||||
|
bool hasCenter = false;
|
||||||
|
bool hasX = false;
|
||||||
|
bool hasY = false;
|
||||||
|
for (uint index = 0; index < parts.size(); index++)
|
||||||
|
{
|
||||||
|
if (parts[index] == "center")
|
||||||
|
{
|
||||||
|
hasCenter = true;
|
||||||
|
}
|
||||||
|
else if (isHorizontalKeyword(parts[index]))
|
||||||
|
{
|
||||||
|
if (hasX) return;
|
||||||
|
hasX = true;
|
||||||
|
newH = parts[index] == "left" ? CSS_VALUE_LEFT : CSS_VALUE_RIGHT;
|
||||||
|
}
|
||||||
|
else if (isVerticalKeyword(parts[index]))
|
||||||
|
{
|
||||||
|
if (hasY) return;
|
||||||
|
hasY = true;
|
||||||
|
newV = parts[index] == "top" ? CSS_VALUE_TOP : CSS_VALUE_BOTTOM;
|
||||||
|
}
|
||||||
|
else if (getCssLength(fval, unit, parts[index], true))
|
||||||
|
{
|
||||||
|
// invalid: 'top 50%';
|
||||||
|
if (hasY) return;
|
||||||
|
if (!hasX)
|
||||||
|
{
|
||||||
|
hasX = true;
|
||||||
|
newX.setFloatValue(fval, unit);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hasY = true;
|
||||||
|
newY.setFloatValue(fval, unit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasCenter)
|
||||||
|
{
|
||||||
|
if (!hasX)
|
||||||
|
newH = CSS_VALUE_CENTER;
|
||||||
|
if (!hasY)
|
||||||
|
newV = CSS_VALUE_CENTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
xAnchor = newH;
|
||||||
|
yAnchor = newV;
|
||||||
|
xPosition = newX;
|
||||||
|
yPosition = newY;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSSBackground::positionFromThree(const std::vector<std::string> &parts)
|
||||||
|
{
|
||||||
|
CSSValueType newH = CSS_VALUE_LEFT;
|
||||||
|
CSSValueType newV = CSS_VALUE_TOP;
|
||||||
|
CSSLength newX, newY;
|
||||||
|
newX.setFloatValue(0, "%");
|
||||||
|
newY.setFloatValue(0, "%");
|
||||||
|
|
||||||
|
float fval;
|
||||||
|
std::string unit;
|
||||||
|
bool hasCenter = false;
|
||||||
|
bool hasX = false;
|
||||||
|
bool hasY = false;
|
||||||
|
for(uint index = 0; index < 3; index++)
|
||||||
|
{
|
||||||
|
if (parts[index] == "center")
|
||||||
|
{
|
||||||
|
if (hasCenter) return;
|
||||||
|
hasCenter = true;
|
||||||
|
}
|
||||||
|
else if (isHorizontalKeyword(parts[index]))
|
||||||
|
{
|
||||||
|
if (hasX) return;
|
||||||
|
hasX = true;
|
||||||
|
newH = parts[index] == "left" ? CSS_VALUE_LEFT : CSS_VALUE_RIGHT;
|
||||||
|
if ((index+1) < parts.size() && getCssLength(fval, unit, parts[index+1], true))
|
||||||
|
{
|
||||||
|
newX.setFloatValue(fval, unit);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isVerticalKeyword(parts[index]))
|
||||||
|
{
|
||||||
|
if (hasY) return;
|
||||||
|
hasY = true;
|
||||||
|
newV = parts[index] == "top" ? CSS_VALUE_TOP : CSS_VALUE_BOTTOM;
|
||||||
|
if ((index+1) < parts.size() && getCssLength(fval, unit, parts[index+1], true))
|
||||||
|
{
|
||||||
|
newY.setFloatValue(fval, unit);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasCenter)
|
||||||
|
{
|
||||||
|
if (hasX && hasY)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!hasX)
|
||||||
|
newH = CSS_VALUE_CENTER;
|
||||||
|
else
|
||||||
|
newV = CSS_VALUE_CENTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
xAnchor = newH;
|
||||||
|
yAnchor = newV;
|
||||||
|
xPosition = newX;
|
||||||
|
yPosition = newY;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSSBackground::positionFromFour(const std::vector<std::string> &parts)
|
||||||
|
{
|
||||||
|
CSSValueType newH = CSS_VALUE_LEFT;
|
||||||
|
CSSValueType newV = CSS_VALUE_TOP;
|
||||||
|
CSSLength newX, newY;
|
||||||
|
newX.setFloatValue(0, "%");
|
||||||
|
newY.setFloatValue(0, "%");
|
||||||
|
|
||||||
|
float fval;
|
||||||
|
std::string unit;
|
||||||
|
bool hasX = false;
|
||||||
|
bool hasY = false;
|
||||||
|
for(uint index = 0; index<4; index+=2)
|
||||||
|
{
|
||||||
|
if (parts[index] == "center")
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (isHorizontalKeyword(parts[index]))
|
||||||
|
{
|
||||||
|
if (hasX) return;
|
||||||
|
hasX = true;
|
||||||
|
if (!getCssLength(fval, unit, parts[index+1], true)) return;
|
||||||
|
newH = parts[index] == "left" ? CSS_VALUE_LEFT : CSS_VALUE_RIGHT;
|
||||||
|
newX.setFloatValue(fval, unit);
|
||||||
|
}
|
||||||
|
else if (isVerticalKeyword(parts[index]))
|
||||||
|
{
|
||||||
|
if (hasY) return;
|
||||||
|
hasY = true;
|
||||||
|
if (!getCssLength(fval, unit, parts[index+1], true)) return;
|
||||||
|
newV = parts[index] == "top" ? CSS_VALUE_TOP : CSS_VALUE_BOTTOM;
|
||||||
|
newY.setFloatValue(fval, unit);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xAnchor = newH;
|
||||||
|
yAnchor = newV;
|
||||||
|
xPosition = newX;
|
||||||
|
yPosition = newY;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
@ -0,0 +1,597 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010-2019 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#include "stdpch.h"
|
||||||
|
#include "nel/gui/css_background_renderer.h"
|
||||||
|
#include "nel/gui/css_border_renderer.h"
|
||||||
|
#include "nel/gui/view_renderer.h"
|
||||||
|
#include "nel/gui/widget_manager.h"
|
||||||
|
#include "nel/gui/view_bitmap.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
#ifdef DEBUG_NEW
|
||||||
|
#define new DEBUG_NEW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
CSSBackgroundRenderer::CSSBackgroundRenderer()
|
||||||
|
: CurrentAlpha(255), TextureId(-1),
|
||||||
|
m_BorderX(0), m_BorderY(0), m_BorderW(0), m_BorderH(0),
|
||||||
|
m_PaddingX(0), m_PaddingY(0), m_PaddingW(0), m_PaddingH(0),
|
||||||
|
m_ContentX(0), m_ContentY(0), m_ContentW(0), m_ContentH(0),
|
||||||
|
m_RootFontSize(16.f), m_FontSize(16.f), m_Viewport(NULL),
|
||||||
|
m_RenderLayer(0), m_ModulateGlobalColor(false), m_FillViewport(false),
|
||||||
|
m_Dirty(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
CSSBackgroundRenderer::~CSSBackgroundRenderer()
|
||||||
|
{
|
||||||
|
if (TextureId != -1)
|
||||||
|
CViewRenderer::getInstance()->deleteTexture(TextureId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::clear()
|
||||||
|
{
|
||||||
|
m_Dirty = true;
|
||||||
|
|
||||||
|
if (TextureId != -1)
|
||||||
|
CViewRenderer::getInstance()->deleteTexture(TextureId);
|
||||||
|
|
||||||
|
TextureId = -1;
|
||||||
|
m_Background.image.clear();
|
||||||
|
m_Background.color.A = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::setBackground(const CSSBackground &bg)
|
||||||
|
{
|
||||||
|
m_Dirty = true;
|
||||||
|
// TODO: CSSBackground should keep track of TextureId
|
||||||
|
CViewRenderer &rVR = *CViewRenderer::getInstance();
|
||||||
|
if (bg.image != m_Background.image && TextureId != -1)
|
||||||
|
rVR.deleteTexture(TextureId);
|
||||||
|
|
||||||
|
m_Background = bg;
|
||||||
|
// TODO: does not accept urls
|
||||||
|
if (TextureId == -1 && !bg.image.empty())
|
||||||
|
{
|
||||||
|
// TODO: make CViewRenderer accept urls
|
||||||
|
if (bg.image.find("://") != std::string::npos)
|
||||||
|
TextureId = rVR.createTexture(bg.image, 0, 0, -1, -1, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::setImage(const std::string &bgtex)
|
||||||
|
{
|
||||||
|
m_Dirty = true;
|
||||||
|
// TODO: CSSBackground should keep track of TextureId
|
||||||
|
CViewRenderer &rVR = *CViewRenderer::getInstance();
|
||||||
|
if (bgtex != m_Background.image && TextureId != -1)
|
||||||
|
{
|
||||||
|
rVR.deleteTexture(TextureId);
|
||||||
|
TextureId = -1;
|
||||||
|
}
|
||||||
|
m_Background.image = bgtex;
|
||||||
|
|
||||||
|
if (TextureId == -1 && !bgtex.empty())
|
||||||
|
{
|
||||||
|
// TODO: make CViewRenderer accept urls
|
||||||
|
if (bgtex.find("://") != std::string::npos)
|
||||||
|
TextureId = rVR.createTexture(bgtex, 0, 0, -1, -1, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::setImageRepeat(bool b)
|
||||||
|
{
|
||||||
|
m_Background.repeatX = b ? CSS_VALUE_REPEAT : CSS_VALUE_NOREPEAT;
|
||||||
|
m_Background.repeatY = b ? CSS_VALUE_REPEAT : CSS_VALUE_NOREPEAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::setImageCover(bool b)
|
||||||
|
{
|
||||||
|
m_Background.size = b ? CSS_VALUE_COVER : CSS_VALUE_AUTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::updateCoords()
|
||||||
|
{
|
||||||
|
m_Dirty = false;
|
||||||
|
m_DrawQueue.clear();
|
||||||
|
|
||||||
|
// TODO: color from last background layer
|
||||||
|
buildColorQuads(m_Background);
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// background-image
|
||||||
|
buildImageQuads(m_Background, TextureId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::draw() {
|
||||||
|
if (m_Dirty) updateCoords();
|
||||||
|
if (m_DrawQueue.empty()) return;
|
||||||
|
|
||||||
|
CViewRenderer &rVR = *CViewRenderer::getInstance();
|
||||||
|
|
||||||
|
// flush draw cache to ensure correct draw order
|
||||||
|
rVR.flush();
|
||||||
|
|
||||||
|
// TODO: no need for widget manager, if global color is set from parent
|
||||||
|
CRGBA globalColor;
|
||||||
|
if (m_ModulateGlobalColor)
|
||||||
|
globalColor = CWidgetManager::getInstance()->getGlobalColor();
|
||||||
|
|
||||||
|
// TODO: there might be issue on draw order IF using multiple textures
|
||||||
|
// and second (top) texture is created before first one.
|
||||||
|
for(uint i = 0; i < m_DrawQueue.size(); ++i)
|
||||||
|
{
|
||||||
|
CRGBA color = m_DrawQueue[i].Color;
|
||||||
|
if (m_ModulateGlobalColor)
|
||||||
|
color.modulateFromColor (color, globalColor);
|
||||||
|
|
||||||
|
color.A = (uint8) (((uint16) CurrentAlpha * (uint16) color.A) >> 8);
|
||||||
|
rVR.drawQuad(m_RenderLayer, m_DrawQueue[i].Quad, m_DrawQueue[i].TextureId, color, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// flush draw cache to ensure correct draw order
|
||||||
|
rVR.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::getPositioningArea(const CSSBackground &bg, sint32 &areaX, sint32 &areaY, sint32 &areaW, sint32 &areaH) const
|
||||||
|
{
|
||||||
|
switch(bg.origin)
|
||||||
|
{
|
||||||
|
case CSS_VALUE_PADDING_BOX:
|
||||||
|
areaX = m_PaddingX;
|
||||||
|
areaY = m_PaddingY;
|
||||||
|
areaW = m_PaddingW;
|
||||||
|
areaH = m_PaddingH;
|
||||||
|
break;
|
||||||
|
case CSS_VALUE_CONTENT_BOX:
|
||||||
|
areaX = m_ContentX;
|
||||||
|
areaY = m_ContentY;
|
||||||
|
areaW = m_ContentW;
|
||||||
|
areaH = m_ContentH;
|
||||||
|
break;
|
||||||
|
case CSS_VALUE_BORDER_BOX:
|
||||||
|
// fall thru
|
||||||
|
default:
|
||||||
|
areaX = m_BorderX;
|
||||||
|
areaY = m_BorderY;
|
||||||
|
areaW = m_BorderW;
|
||||||
|
areaH = m_BorderH;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::getPaintingArea(const CSSBackground &bg, sint32 &areaX, sint32 &areaY, sint32 &areaW, sint32 &areaH) const
|
||||||
|
{
|
||||||
|
switch(bg.clip)
|
||||||
|
{
|
||||||
|
case CSS_VALUE_PADDING_BOX:
|
||||||
|
areaX = m_PaddingX;
|
||||||
|
areaY = m_PaddingY;
|
||||||
|
areaW = m_PaddingW;
|
||||||
|
areaH = m_PaddingH;
|
||||||
|
break;
|
||||||
|
case CSS_VALUE_CONTENT_BOX:
|
||||||
|
areaX = m_ContentX;
|
||||||
|
areaY = m_ContentY;
|
||||||
|
areaW = m_ContentW;
|
||||||
|
areaH = m_ContentH;
|
||||||
|
break;
|
||||||
|
case CSS_VALUE_BORDER_BOX:
|
||||||
|
// fall thru
|
||||||
|
default:
|
||||||
|
areaX = m_BorderX;
|
||||||
|
areaY = m_BorderY;
|
||||||
|
areaW = m_BorderW;
|
||||||
|
areaH = m_BorderH;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_FillViewport && m_Viewport)
|
||||||
|
{
|
||||||
|
sint32 newX = std::min(areaX, m_Viewport->getXReal());
|
||||||
|
sint32 newY = std::min(areaY, m_Viewport->getYReal());
|
||||||
|
areaW = std::max(areaX + areaW, m_Viewport->getXReal() + m_Viewport->getWReal()) - newX;
|
||||||
|
areaH = std::max(areaY + areaH, m_Viewport->getYReal() + m_Viewport->getHReal()) - newY;
|
||||||
|
areaX = newX;
|
||||||
|
areaY = newY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::calculateSize(const CSSBackground &bg, sint32 &texW, sint32 &texH) const
|
||||||
|
{
|
||||||
|
sint32 areaX, areaY, areaW, areaH;
|
||||||
|
getPositioningArea(bg, areaX, areaY, areaW, areaH);
|
||||||
|
|
||||||
|
sint32 vpW=0;
|
||||||
|
sint32 vpH=0;
|
||||||
|
if (m_Viewport)
|
||||||
|
{
|
||||||
|
vpW = m_Viewport->getWReal();
|
||||||
|
vpH = m_Viewport->getHReal();
|
||||||
|
}
|
||||||
|
|
||||||
|
float whRatio = (float)texW / (float)texH;
|
||||||
|
switch(bg.size)
|
||||||
|
{
|
||||||
|
case CSS_VALUE_LENGTH:
|
||||||
|
{
|
||||||
|
if (bg.width.isAuto() && bg.height.isAuto())
|
||||||
|
{
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
else if (bg.width.isAuto())
|
||||||
|
{
|
||||||
|
texH = bg.height.calculate(areaH, m_FontSize, m_RootFontSize, vpW, vpH);
|
||||||
|
texW = texH * whRatio;
|
||||||
|
}
|
||||||
|
else if (bg.height.isAuto())
|
||||||
|
{
|
||||||
|
// calculate Height
|
||||||
|
texW = bg.width.calculate(areaW, m_FontSize, m_RootFontSize, vpW, vpH);
|
||||||
|
texH = texW / whRatio;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
texW = bg.width.calculate(areaW, m_FontSize, m_RootFontSize, vpW, vpH);
|
||||||
|
texH = bg.height.calculate(areaH, m_FontSize, m_RootFontSize, vpW, vpH);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CSS_VALUE_AUTO:
|
||||||
|
{
|
||||||
|
// no-op
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CSS_VALUE_COVER:
|
||||||
|
{
|
||||||
|
float canvasRatio = (float)areaW / (float)areaH;
|
||||||
|
if (whRatio < canvasRatio)
|
||||||
|
{
|
||||||
|
texW = areaW;
|
||||||
|
texH = areaW / whRatio;
|
||||||
|
} else {
|
||||||
|
texW = areaH * whRatio;
|
||||||
|
texH = areaH;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CSS_VALUE_CONTAIN:
|
||||||
|
{
|
||||||
|
// same as covert, but ratio check is reversed
|
||||||
|
float canvasRatio = (float)areaW / (float)areaH;
|
||||||
|
if (whRatio > canvasRatio)
|
||||||
|
{
|
||||||
|
texW = areaW;
|
||||||
|
texH = areaW / whRatio;
|
||||||
|
} else {
|
||||||
|
texW = areaH * whRatio;
|
||||||
|
texH = areaH;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::calculatePosition(const CSSBackground &bg, sint32 &texX, sint32 &texY, sint32 &texW, sint32 &texH) const
|
||||||
|
{
|
||||||
|
sint32 areaX, areaY, areaW, areaH;
|
||||||
|
getPositioningArea(bg, areaX, areaY, areaW, areaH);
|
||||||
|
|
||||||
|
sint32 vpW=0;
|
||||||
|
sint32 vpH=0;
|
||||||
|
if (m_Viewport)
|
||||||
|
{
|
||||||
|
vpW = m_Viewport->getWReal();
|
||||||
|
vpH = m_Viewport->getHReal();
|
||||||
|
}
|
||||||
|
|
||||||
|
float ofsX = bg.xPosition.calculate(1, m_FontSize, m_RootFontSize, vpW, vpH);
|
||||||
|
float ofsY = bg.yPosition.calculate(1, m_FontSize, m_RootFontSize, vpW, vpH);
|
||||||
|
|
||||||
|
if (bg.xPosition.isPercent() || bg.xAnchor == CSS_VALUE_CENTER)
|
||||||
|
{
|
||||||
|
if (bg.xAnchor == CSS_VALUE_RIGHT)
|
||||||
|
ofsX = 1.f - ofsX;
|
||||||
|
else if (bg.xAnchor == CSS_VALUE_CENTER)
|
||||||
|
ofsX = 0.5f;
|
||||||
|
|
||||||
|
ofsX = (float)(areaW - texW) * ofsX;
|
||||||
|
}
|
||||||
|
else if (bg.xAnchor == CSS_VALUE_RIGHT)
|
||||||
|
{
|
||||||
|
ofsX = areaW - texW - ofsX;
|
||||||
|
}
|
||||||
|
|
||||||
|
// areaY is bottom edge, areaY+areaH is top edge
|
||||||
|
if (bg.yPosition.isPercent() || bg.yAnchor == CSS_VALUE_CENTER)
|
||||||
|
{
|
||||||
|
if (bg.yAnchor == CSS_VALUE_TOP)
|
||||||
|
ofsY = 1.f - ofsY;
|
||||||
|
else if (bg.yAnchor == CSS_VALUE_CENTER)
|
||||||
|
ofsY = 0.5f;
|
||||||
|
|
||||||
|
ofsY = (float)(areaH - texH) * ofsY;
|
||||||
|
}
|
||||||
|
else if (bg.yAnchor == CSS_VALUE_TOP)
|
||||||
|
{
|
||||||
|
ofsY = areaH - texH - ofsY;
|
||||||
|
}
|
||||||
|
|
||||||
|
texX = areaX + ofsX;
|
||||||
|
texY = areaY + ofsY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::getImageTile(sint32 &tilePos, sint32 &tileSize, sint32 &spacing, sint32 &tiles, sint32 areaPos, sint32 areaSize, CSSValueType repeat) const
|
||||||
|
{
|
||||||
|
switch(repeat)
|
||||||
|
{
|
||||||
|
case CSS_VALUE_NOREPEAT:
|
||||||
|
{
|
||||||
|
tiles = 1;
|
||||||
|
spacing = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CSS_VALUE_SPACE:
|
||||||
|
{
|
||||||
|
// if no space for 2+ tiles, then show single one on calculated tilePos
|
||||||
|
if (tileSize * 2 > areaSize)
|
||||||
|
{
|
||||||
|
// set spacing large enough to only display single tile
|
||||||
|
tiles = 1;
|
||||||
|
spacing = areaSize;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// available for middle tiles
|
||||||
|
sint32 midSize = (areaSize - tileSize*2);
|
||||||
|
// number of middle tiles
|
||||||
|
sint32 midTiles = midSize / tileSize;
|
||||||
|
|
||||||
|
tiles = 2 + midTiles;
|
||||||
|
tilePos = areaPos;
|
||||||
|
// int div for floor()
|
||||||
|
spacing = ( midSize - tileSize * midTiles) / (midTiles + 1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CSS_VALUE_ROUND:
|
||||||
|
// fall-thru - size is already calculated
|
||||||
|
case CSS_VALUE_REPEAT:
|
||||||
|
// fall-thru
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
tilePos -= std::ceil(abs(tilePos - areaPos)/(float)tileSize)*tileSize;
|
||||||
|
tiles = std::ceil((std::abs(areaPos - tilePos) + areaSize) / (float)tileSize);
|
||||||
|
spacing = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::calculateTiles(const CSSBackground &bg, sint32 &texX, sint32 &texY, sint32 &texW, sint32 &texH, sint32 &tilesX, sint32 &tilesY, sint32 &spacingX, sint32 &spacingY) const
|
||||||
|
{
|
||||||
|
sint32 areaX, areaY, areaW, areaH;
|
||||||
|
getPositioningArea(bg, areaX, areaY, areaW, areaH);
|
||||||
|
|
||||||
|
// texX,texY is for position area (ie content-box), but painting area can be bigger (ie border-box)
|
||||||
|
sint32 paintX, paintY, paintW, paintH;
|
||||||
|
getPaintingArea(bg, paintX, paintY, paintW, paintH);
|
||||||
|
if (paintX < areaX)
|
||||||
|
areaX -= std::ceil((areaX - paintX) / (float)texW) * texW;
|
||||||
|
if ((paintX + paintW) > (areaX + areaW))
|
||||||
|
areaW += std::ceil(((paintX + paintW) - (areaX + areaW)) / (float)texW) * texW;
|
||||||
|
if (paintY < areaY)
|
||||||
|
areaY -= std::ceil((areaY - paintY) / (float)texH) * texH;
|
||||||
|
if ((paintY + paintH) > (areaY + areaH))
|
||||||
|
areaH += std::ceil(((paintY + paintH) - (areaY + areaH)) / (float)texH) * texH;
|
||||||
|
|
||||||
|
if (texW <= 0 || texH <= 0 || areaW <= 0 || areaH <= 0)
|
||||||
|
{
|
||||||
|
tilesX = tilesY = 0;
|
||||||
|
spacingX = spacingY = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bg.repeatX == CSS_VALUE_ROUND)
|
||||||
|
{
|
||||||
|
sint numTiles = std::max(1, (sint)std::round((float)areaW / texW));
|
||||||
|
texW = areaW / numTiles;
|
||||||
|
if (bg.height.isAuto() && bg.repeatY != CSS_VALUE_ROUND)
|
||||||
|
{
|
||||||
|
float aspect = (float)areaW / (numTiles * texW);
|
||||||
|
texH = texW * aspect;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bg.repeatY == CSS_VALUE_ROUND)
|
||||||
|
{
|
||||||
|
sint numTiles = std::max(1, (sint)std::round((float)areaH / texH));
|
||||||
|
texH = areaH / numTiles;
|
||||||
|
if (bg.width.isAuto() && bg.repeatX != CSS_VALUE_ROUND)
|
||||||
|
{
|
||||||
|
float aspect = (float)areaH / (numTiles * texH);
|
||||||
|
texW = texH * aspect;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getImageTile(texX, texW, spacingX, tilesX, areaX, areaW, bg.repeatX);
|
||||||
|
getImageTile(texY, texH, spacingY, tilesY, areaY, areaH, bg.repeatY);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::buildColorQuads(const CSSBackground &bg)
|
||||||
|
{
|
||||||
|
if (bg.color.A == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// painting area defined with background-clip
|
||||||
|
sint32 x, y, w, h;
|
||||||
|
getPaintingArea(bg, x, y, w, h);
|
||||||
|
|
||||||
|
if (w <= 0 || h <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CViewRenderer &rVR = *CViewRenderer::getInstance();
|
||||||
|
|
||||||
|
SDrawQueue shape;
|
||||||
|
shape.Quad.Uv0.set(0.f, 1.f);
|
||||||
|
shape.Quad.Uv1.set(1.f, 1.f);
|
||||||
|
shape.Quad.Uv2.set(1.f, 0.f);
|
||||||
|
shape.Quad.Uv3.set(0.f, 0.f);
|
||||||
|
|
||||||
|
shape.Quad.V0.set(x, y, 0);
|
||||||
|
shape.Quad.V1.set(x+w, y, 0);
|
||||||
|
shape.Quad.V2.set(x+w, y+h, 0);
|
||||||
|
shape.Quad.V3.set(x, y+h, 0);
|
||||||
|
|
||||||
|
shape.Color = bg.color;
|
||||||
|
shape.TextureId = rVR.getBlankTextureId();
|
||||||
|
|
||||||
|
m_DrawQueue.push_back(shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void CSSBackgroundRenderer::buildImageQuads(const CSSBackground &bg, sint32 textureId)
|
||||||
|
{
|
||||||
|
// TODO: m_Background should have textureId and that should be "reserved" in CViewRenderer
|
||||||
|
// even before download is finished
|
||||||
|
if (textureId < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CViewRenderer &rVR = *CViewRenderer::getInstance();
|
||||||
|
|
||||||
|
sint32 texW = 0;
|
||||||
|
sint32 texH = 0;
|
||||||
|
rVR.getTextureSizeFromId(textureId, texW, texH);
|
||||||
|
if (texW <= 0 || texH <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// get requested texture size
|
||||||
|
calculateSize(m_Background, texW, texH);
|
||||||
|
if(texW <= 0 || texH <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// get texture left/top corner
|
||||||
|
sint32 texX, texY;
|
||||||
|
calculatePosition(m_Background, texX, texY, texW, texH);
|
||||||
|
|
||||||
|
sint32 tilesX, tilesY;
|
||||||
|
sint32 spacingX, spacingY;
|
||||||
|
calculateTiles(m_Background, texX, texY, texW, texH, tilesX, tilesY, spacingX, spacingY);
|
||||||
|
|
||||||
|
sint32 clipL, clipB, clipR, clipT;
|
||||||
|
getPaintingArea(m_Background, clipL, clipB, clipR, clipT);
|
||||||
|
clipR += clipL;
|
||||||
|
clipT += clipB;
|
||||||
|
|
||||||
|
m_DrawQueue.reserve(tilesX * tilesY + m_DrawQueue.size());
|
||||||
|
for(sint32 tileX = 0; tileX < tilesX; tileX++)
|
||||||
|
{
|
||||||
|
for(sint32 tileY = 0; tileY < tilesY; tileY++)
|
||||||
|
{
|
||||||
|
sint32 tileL = texX + tileX * (texW + spacingX);
|
||||||
|
sint32 tileB = texY + tileY * (texH + spacingY);
|
||||||
|
sint32 tileR = tileL + texW;
|
||||||
|
sint32 tileT = tileB + texH;
|
||||||
|
|
||||||
|
// tile is outside clip area
|
||||||
|
if (tileT <= clipB || tileB >= clipT || tileR <= clipL || tileL >= clipR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
CUV uv0(0,1);
|
||||||
|
CUV uv1(1,1);
|
||||||
|
CUV uv2(1,0);
|
||||||
|
CUV uv3(0,0);
|
||||||
|
|
||||||
|
// clip if tile not totally inside clip area
|
||||||
|
if (!(tileL >= clipL && tileR <= clipR && tileB >= clipB && tileT <= clipT))
|
||||||
|
{
|
||||||
|
float ratio;
|
||||||
|
if (tileL < clipL)
|
||||||
|
{
|
||||||
|
ratio = ((float)(clipL - tileL))/((float)(tileR - tileL));
|
||||||
|
tileL = clipL;
|
||||||
|
uv0.U += ratio*(uv1.U-uv0.U);
|
||||||
|
uv3.U += ratio*(uv2.U-uv3.U);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tileB < clipB)
|
||||||
|
{
|
||||||
|
ratio = ((float)(clipB - tileB))/((float)(tileT - tileB));
|
||||||
|
tileB = clipB;
|
||||||
|
uv0.V += ratio*(uv3.V-uv0.V);
|
||||||
|
uv1.V += ratio*(uv2.V-uv1.V);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tileR > clipR)
|
||||||
|
{
|
||||||
|
ratio = ((float)(clipR - tileR))/((float)(tileL - tileR));
|
||||||
|
tileR = clipR;
|
||||||
|
uv2.U += ratio*(uv3.U-uv2.U);
|
||||||
|
uv1.U += ratio*(uv0.U-uv1.U);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tileT > clipT)
|
||||||
|
{
|
||||||
|
ratio = ((float)(clipT - tileT))/((float)(tileB - tileT));
|
||||||
|
tileT = clipT;
|
||||||
|
uv2.V += ratio*(uv1.V-uv2.V);
|
||||||
|
uv3.V += ratio*(uv0.V-uv3.V);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDrawQueue shape;
|
||||||
|
shape.Quad.Uv0 = uv0;
|
||||||
|
shape.Quad.Uv1 = uv1;
|
||||||
|
shape.Quad.Uv2 = uv2;
|
||||||
|
shape.Quad.Uv3 = uv3;
|
||||||
|
|
||||||
|
shape.Color = CRGBA::White;
|
||||||
|
shape.TextureId = textureId;
|
||||||
|
|
||||||
|
shape.Quad.V0.set(tileL, tileB, 0);
|
||||||
|
shape.Quad.V1.set(tileR, tileB, 0);
|
||||||
|
shape.Quad.V2.set(tileR, tileT, 0);
|
||||||
|
shape.Quad.V3.set(tileL, tileT, 0);
|
||||||
|
|
||||||
|
m_DrawQueue.push_back(shape);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}//namespace
|
||||||
|
|
@ -0,0 +1,225 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010-2021 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "stdpch.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "nel/gui/css_length.h"
|
||||||
|
|
||||||
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
#ifdef DEBUG_NEW
|
||||||
|
#define new DEBUG_NEW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
bool CSSLength::parseValue(const std::string &value, bool allowPercent, bool allowNegative)
|
||||||
|
{
|
||||||
|
static const std::set<std::string> knownUnits = {
|
||||||
|
"%", "rem", "em", "px", "pt", "vw", "vh", "vi", "vb", "vmin", "vmax"
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string::size_type pos = 0;
|
||||||
|
std::string::size_type len = value.size();
|
||||||
|
if (len == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (len == 1 && value[0] == '0')
|
||||||
|
{
|
||||||
|
m_Value = 0;
|
||||||
|
m_Kind = Auto;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// +100px; -100px
|
||||||
|
if (value[0] == '+')
|
||||||
|
pos++;
|
||||||
|
else if (allowNegative && value[0] == '-')
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
while(pos < len)
|
||||||
|
{
|
||||||
|
bool isNumeric = (value[pos] >= '0' && value[pos] <= '9')
|
||||||
|
|| (pos == 0 && value[pos] == '.')
|
||||||
|
|| (pos > 0 && value[pos] == '.' && value[pos-1] >= '0' && value[pos-1] <= '9');
|
||||||
|
|
||||||
|
if (!isNumeric)
|
||||||
|
break;
|
||||||
|
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string unit = toLowerAscii(value.substr(pos));
|
||||||
|
if (knownUnits.count(unit))
|
||||||
|
{
|
||||||
|
std::string tmpstr = value.substr(0, pos);
|
||||||
|
return fromString(tmpstr, m_Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
float CSSLength::getValue() const
|
||||||
|
{
|
||||||
|
if (m_Unit == CSS_UNIT_PERCENT)
|
||||||
|
return m_Value / 100.f;
|
||||||
|
|
||||||
|
return m_Value;
|
||||||
|
}
|
||||||
|
void CSSLength::setFloatValue(float f, const std::string &unit)
|
||||||
|
{
|
||||||
|
m_Value = f;
|
||||||
|
setUnit(unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSSLength::setUnit(const std::string &unit)
|
||||||
|
{
|
||||||
|
if (unit.empty())
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_NONE;
|
||||||
|
m_Kind = Fixed;
|
||||||
|
}
|
||||||
|
else if (unit == "px")
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_PX;
|
||||||
|
m_Kind = Fixed;
|
||||||
|
} else if (unit == "pt")
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_PT;
|
||||||
|
m_Kind = Fixed;
|
||||||
|
} else if (unit == "%")
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_PERCENT;
|
||||||
|
m_Kind = Relative;
|
||||||
|
} else if (unit == "em")
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_EM;
|
||||||
|
m_Kind = Relative;
|
||||||
|
} else if (unit == "rem")
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_REM;
|
||||||
|
m_Kind = Relative;
|
||||||
|
} else if (unit == "vw")
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_VW;
|
||||||
|
m_Kind = Relative;
|
||||||
|
} else if (unit == "vh")
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_VH;
|
||||||
|
m_Kind = Relative;
|
||||||
|
} else if (unit == "vi")
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_VI;
|
||||||
|
m_Kind = Relative;
|
||||||
|
} else if (unit == "vb")
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_VB;
|
||||||
|
m_Kind = Relative;
|
||||||
|
} else if (unit == "vmin")
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_VMIN;
|
||||||
|
m_Kind = Relative;
|
||||||
|
} else if (unit == "vmax")
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_VMAX;
|
||||||
|
m_Kind = Relative;
|
||||||
|
} else if (unit == "auto")
|
||||||
|
{
|
||||||
|
m_Unit = CSS_UNIT_NONE;
|
||||||
|
m_Kind = Auto;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
// fallback to auto
|
||||||
|
m_Unit = CSS_UNIT_NONE;
|
||||||
|
m_Kind = Auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float CSSLength::calculate(uint32 relValue, uint32 emSize, uint32 remSize, uint32 vwSize, uint32 vhSize = 0) const
|
||||||
|
{
|
||||||
|
if (m_Kind == Auto)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
float value = getValue();
|
||||||
|
switch(m_Unit)
|
||||||
|
{
|
||||||
|
case CSS_UNIT_EM:
|
||||||
|
return emSize * value;
|
||||||
|
case CSS_UNIT_REM:
|
||||||
|
return remSize * value;
|
||||||
|
case CSS_UNIT_PERCENT:
|
||||||
|
return relValue * value;
|
||||||
|
case CSS_UNIT_PX:
|
||||||
|
case CSS_UNIT_PT:
|
||||||
|
return value;
|
||||||
|
case CSS_UNIT_VW:
|
||||||
|
case CSS_UNIT_VI:
|
||||||
|
// Vi for horizontal writing mode only
|
||||||
|
return (float)vwSize*0.01f;
|
||||||
|
case CSS_UNIT_VH:
|
||||||
|
case CSS_UNIT_VB:
|
||||||
|
// Vb for horizontal writing mode only
|
||||||
|
return (float)vhSize*0.01f;
|
||||||
|
case CSS_UNIT_VMIN:
|
||||||
|
return (float)std::min(vwSize, vhSize)*0.01f;
|
||||||
|
case CSS_UNIT_VMAX:
|
||||||
|
return (float)std::max(vwSize, vhSize)*0.01f;
|
||||||
|
}
|
||||||
|
|
||||||
|
nldebug("Unknown CSS unit '%s'", toString().c_str());
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CSSLength::toString() const
|
||||||
|
{
|
||||||
|
if (m_Kind == Auto)
|
||||||
|
return "auto";
|
||||||
|
|
||||||
|
std::string ret;
|
||||||
|
ret += NLMISC::toString("%f", m_Value);
|
||||||
|
|
||||||
|
size_t pos = ret.find(".");
|
||||||
|
for( ; pos < ret.size(); ++pos)
|
||||||
|
{
|
||||||
|
if (ret[pos] != '0')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (pos == ret.size())
|
||||||
|
ret = ret.substr(0, ret.find("."));
|
||||||
|
|
||||||
|
switch(m_Unit)
|
||||||
|
{
|
||||||
|
case CSS_UNIT_NONE: break;
|
||||||
|
case CSS_UNIT_EM: ret += "em"; break;
|
||||||
|
case CSS_UNIT_REM: ret += "rem"; break;
|
||||||
|
case CSS_UNIT_PERCENT: ret += "%"; break;
|
||||||
|
case CSS_UNIT_PX: ret += "px"; break;
|
||||||
|
case CSS_UNIT_PT: ret += "pt"; break;
|
||||||
|
case CSS_UNIT_VW: ret += "vw"; break;
|
||||||
|
case CSS_UNIT_VH: ret += "vh"; break;
|
||||||
|
case CSS_UNIT_VI: ret += "vi"; break;
|
||||||
|
case CSS_UNIT_VB: ret += "vb"; break;
|
||||||
|
case CSS_UNIT_VMIN: ret += "vmin"; break;
|
||||||
|
case CSS_UNIT_VMAX: ret += "vmax"; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue