Compare commits
	
		
			389 Commits
		
	
	
		
			wip/cherge
			...
			wip/cally-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					b856008914 | ||
| 
						 | 
					d823a54b5d | ||
| 
						 | 
					e06daa58c3 | ||
| 
						 | 
					1880e22229 | ||
| 
						 | 
					bd28581471 | ||
| 
						 | 
					82470cd40d | ||
| 
						 | 
					b4972f573c | ||
| 
						 | 
					c97c409c50 | ||
| 
						 | 
					989e2ccc46 | ||
| 
						 | 
					e09e62d585 | ||
| 
						 | 
					033f0d11bf | ||
| 
						 | 
					668eb318c7 | ||
| 
						 | 
					449cbe153b | ||
| 
						 | 
					9b8e5a05f5 | ||
| 
						 | 
					d14c8cf9a4 | ||
| 
						 | 
					4571de5772 | ||
| 
						 | 
					62f449d7d5 | ||
| 
						 | 
					476ef76de6 | ||
| 
						 | 
					48de81b63e | ||
| 
						 | 
					2ee3d5392b | ||
| 
						 | 
					0f2a33cc9c | ||
| 
						 | 
					2ce622f057 | ||
| 
						 | 
					76083d76af | ||
| 
						 | 
					132060db21 | ||
| 
						 | 
					c7f2ae1b16 | ||
| 
						 | 
					24a0e72ae9 | ||
| 
						 | 
					5c4938e479 | ||
| 
						 | 
					322b51cded | ||
| 
						 | 
					b46bc98d44 | ||
| 
						 | 
					da5be1fdea | ||
| 
						 | 
					bc18438cb0 | ||
| 
						 | 
					e3c0fcf7d5 | ||
| 
						 | 
					73cb96ddb9 | ||
| 
						 | 
					1cb59f44ab | ||
| 
						 | 
					a55a286b15 | ||
| 
						 | 
					18e7b814f2 | ||
| 
						 | 
					e073076119 | ||
| 
						 | 
					5d58156134 | ||
| 
						 | 
					c38fa4fa5c | ||
| 
						 | 
					5201d77b0b | ||
| 
						 | 
					aedf692e0c | ||
| 
						 | 
					5dfd86ebe7 | ||
| 
						 | 
					9e41f687a0 | ||
| 
						 | 
					61356caa06 | ||
| 
						 | 
					4300f1f91d | ||
| 
						 | 
					d26dc4ae44 | ||
| 
						 | 
					bd45a00fa3 | ||
| 
						 | 
					793a9d45e1 | ||
| 
						 | 
					43295bdcc4 | ||
| 
						 | 
					43e12dab7b | ||
| 
						 | 
					c4535fdf85 | ||
| 
						 | 
					d2c3272eb7 | ||
| 
						 | 
					90c4b6492f | ||
| 
						 | 
					b7bf42e778 | ||
| 
						 | 
					e849667be6 | ||
| 
						 | 
					424016d66c | ||
| 
						 | 
					a4f55d4986 | ||
| 
						 | 
					1b33a5a3a7 | ||
| 
						 | 
					36111270aa | ||
| 
						 | 
					6e0cfd3e55 | ||
| 
						 | 
					5671f0a284 | ||
| 
						 | 
					a7e63bea6c | ||
| 
						 | 
					94b3c334e5 | ||
| 
						 | 
					efb0addb62 | ||
| 
						 | 
					988da215c8 | ||
| 
						 | 
					551a57ed7f | ||
| 
						 | 
					b7366b5b53 | ||
| 
						 | 
					5e8d8b9ade | ||
| 
						 | 
					4726f3d5d3 | ||
| 
						 | 
					91ef7515de | ||
| 
						 | 
					317f6c0910 | ||
| 
						 | 
					6a3d521466 | ||
| 
						 | 
					1363246d44 | ||
| 
						 | 
					0b6560fac4 | ||
| 
						 | 
					d4c3870286 | ||
| 
						 | 
					4bdf9a1e70 | ||
| 
						 | 
					1909977a67 | ||
| 
						 | 
					655a783891 | ||
| 
						 | 
					a4596becc4 | ||
| 
						 | 
					7015bb3efd | ||
| 
						 | 
					d2c762cc66 | ||
| 
						 | 
					04d429b743 | ||
| 
						 | 
					0b21dcfe08 | ||
| 
						 | 
					7c939d78c2 | ||
| 
						 | 
					8a2b82897d | ||
| 
						 | 
					e95c365cf0 | ||
| 
						 | 
					a32cb7133b | ||
| 
						 | 
					967966cdee | ||
| 
						 | 
					06d67b6abf | ||
| 
						 | 
					f15ce01e2b | ||
| 
						 | 
					e48516679c | ||
| 
						 | 
					65a6c4c361 | ||
| 
						 | 
					b51c468c0f | ||
| 
						 | 
					2e7d02f1ce | ||
| 
						 | 
					dc4fe780f7 | ||
| 
						 | 
					d682cdb078 | ||
| 
						 | 
					ff7a42b8bc | ||
| 
						 | 
					4b1805c306 | ||
| 
						 | 
					03c00e4944 | ||
| 
						 | 
					cb05b16414 | ||
| 
						 | 
					b9fe9c736a | ||
| 
						 | 
					3dd8861fbf | ||
| 
						 | 
					753066598f | ||
| 
						 | 
					3da8c1bfdc | ||
| 
						 | 
					f8ee974628 | ||
| 
						 | 
					f36120757f | ||
| 
						 | 
					bc178b711f | ||
| 
						 | 
					5dad87cfb9 | ||
| 
						 | 
					0f8f607e4c | ||
| 
						 | 
					282aada13a | ||
| 
						 | 
					47002bf0cd | ||
| 
						 | 
					3d47c7edc1 | ||
| 
						 | 
					bc350f37f5 | ||
| 
						 | 
					b55e2e1df9 | ||
| 
						 | 
					43baf643d4 | ||
| 
						 | 
					21b8ae10b8 | ||
| 
						 | 
					425a10de11 | ||
| 
						 | 
					d0ef660ff6 | ||
| 
						 | 
					506e06589b | ||
| 
						 | 
					1d75d5aa2f | ||
| 
						 | 
					645d596f9d | ||
| 
						 | 
					3e967d731a | ||
| 
						 | 
					167fd07e01 | ||
| 
						 | 
					fbd6366edd | ||
| 
						 | 
					23d0bdd46d | ||
| 
						 | 
					0d0834f87c | ||
| 
						 | 
					676997e0af | ||
| 
						 | 
					633d5d1b84 | ||
| 
						 | 
					f620f43353 | ||
| 
						 | 
					eb6e1f694a | ||
| 
						 | 
					6aead84d7a | ||
| 
						 | 
					5b984c1e53 | ||
| 
						 | 
					7660ca2579 | ||
| 
						 | 
					ac52631e8a | ||
| 
						 | 
					5b30a52bbd | ||
| 
						 | 
					a5294ce55f | ||
| 
						 | 
					553372ffb7 | ||
| 
						 | 
					f672d6ee3b | ||
| 
						 | 
					ba3417667f | ||
| 
						 | 
					50fa002a19 | ||
| 
						 | 
					f0718c7d95 | ||
| 
						 | 
					e74c2e42cf | ||
| 
						 | 
					ce64ab5449 | ||
| 
						 | 
					8df3b21a51 | ||
| 
						 | 
					08431a127a | ||
| 
						 | 
					3f068d1138 | ||
| 
						 | 
					6f0e5b0b56 | ||
| 
						 | 
					fe27a6ea3b | ||
| 
						 | 
					1301770dcb | ||
| 
						 | 
					1551b6d386 | ||
| 
						 | 
					a6f94696e2 | ||
| 
						 | 
					c389aadff9 | ||
| 
						 | 
					37eda498f2 | ||
| 
						 | 
					7d2df52336 | ||
| 
						 | 
					5d27e5415d | ||
| 
						 | 
					625773fba4 | ||
| 
						 | 
					7d79ae7b07 | ||
| 
						 | 
					5817779656 | ||
| 
						 | 
					5f5ce08ba4 | ||
| 
						 | 
					223f033780 | ||
| 
						 | 
					50e0ae3cf3 | ||
| 
						 | 
					a8f6cada88 | ||
| 
						 | 
					7f488e3e1d | ||
| 
						 | 
					059d2144b2 | ||
| 
						 | 
					902302a174 | ||
| 
						 | 
					f98ca7683c | ||
| 
						 | 
					479fb0549c | ||
| 
						 | 
					52e5d6fc94 | ||
| 
						 | 
					09a6031c69 | ||
| 
						 | 
					dbe919ef92 | ||
| 
						 | 
					2907ee93cc | ||
| 
						 | 
					aa136f4515 | ||
| 
						 | 
					8748841094 | ||
| 
						 | 
					86f2885e98 | ||
| 
						 | 
					bb5ea0580f | ||
| 
						 | 
					2cfdbbd730 | ||
| 
						 | 
					9f31e7252c | ||
| 
						 | 
					e8ea5ecd8a | ||
| 
						 | 
					ed10aea44d | ||
| 
						 | 
					fed5f4d9aa | ||
| 
						 | 
					73250b8f4c | ||
| 
						 | 
					f6700f19a7 | ||
| 
						 | 
					ea34915df3 | ||
| 
						 | 
					37742c5cde | ||
| 
						 | 
					cdd27d0e53 | ||
| 
						 | 
					82778f72a4 | ||
| 
						 | 
					d846fabda2 | ||
| 
						 | 
					2d94a34a14 | ||
| 
						 | 
					92710d8f89 | ||
| 
						 | 
					da600b8400 | ||
| 
						 | 
					6aa546145f | ||
| 
						 | 
					3956ffd5e8 | ||
| 
						 | 
					05341221d4 | ||
| 
						 | 
					95642d05a6 | ||
| 
						 | 
					51cd8aed96 | ||
| 
						 | 
					ac01e69a67 | ||
| 
						 | 
					a68e6972a2 | ||
| 
						 | 
					55cf1c1496 | ||
| 
						 | 
					343de21af5 | ||
| 
						 | 
					3c157242fa | ||
| 
						 | 
					32c99513c8 | ||
| 
						 | 
					40c345d6f3 | ||
| 
						 | 
					8beef8ccd0 | ||
| 
						 | 
					62d0dd907b | ||
| 
						 | 
					0462208d4e | ||
| 
						 | 
					6885c37784 | ||
| 
						 | 
					238e41d493 | ||
| 
						 | 
					8699482475 | ||
| 
						 | 
					dcaa45fc0c | ||
| 
						 | 
					3c4f5ddcb4 | ||
| 
						 | 
					3aece84499 | ||
| 
						 | 
					40fb06ca17 | ||
| 
						 | 
					d4c070da88 | ||
| 
						 | 
					d052f9c070 | ||
| 
						 | 
					3b88af94e3 | ||
| 
						 | 
					1f00aba92c | ||
| 
						 | 
					ec1195e3ff | ||
| 
						 | 
					18b661cc93 | ||
| 
						 | 
					8592a8591b | ||
| 
						 | 
					7fa7c2aeb7 | ||
| 
						 | 
					41130b08eb | ||
| 
						 | 
					1d20045247 | ||
| 
						 | 
					c131a9b7fa | ||
| 
						 | 
					2ecbf6d746 | ||
| 
						 | 
					a13d60aae5 | ||
| 
						 | 
					ed4b80cee5 | ||
| 
						 | 
					0a6034ef3a | ||
| 
						 | 
					c9a5b2b22f | ||
| 
						 | 
					db9b60cc63 | ||
| 
						 | 
					fa74da0039 | ||
| 
						 | 
					b310e1d9d7 | ||
| 
						 | 
					0053ef2e16 | ||
| 
						 | 
					4133b73632 | ||
| 
						 | 
					074f4974dd | ||
| 
						 | 
					0700f3749f | ||
| 
						 | 
					0487e6f11f | ||
| 
						 | 
					23da6c2426 | ||
| 
						 | 
					67dd0b4fec | ||
| 
						 | 
					6989fea767 | ||
| 
						 | 
					df33255162 | ||
| 
						 | 
					5319949a45 | ||
| 
						 | 
					aba0b9ef64 | ||
| 
						 | 
					512bb7d1cd | ||
| 
						 | 
					d2a12ee0fa | ||
| 
						 | 
					531a195cf1 | ||
| 
						 | 
					509e9ca5a0 | ||
| 
						 | 
					0743381573 | ||
| 
						 | 
					267f712068 | ||
| 
						 | 
					0b102afb53 | ||
| 
						 | 
					304a103659 | ||
| 
						 | 
					2d09e95934 | ||
| 
						 | 
					be11525b28 | ||
| 
						 | 
					adc38f902a | ||
| 
						 | 
					8abdf16a39 | ||
| 
						 | 
					4cc29cfb61 | ||
| 
						 | 
					121c5d2a92 | ||
| 
						 | 
					50ff30bf2b | ||
| 
						 | 
					26e1e495a0 | ||
| 
						 | 
					480e7d44be | ||
| 
						 | 
					1c1adb0036 | ||
| 
						 | 
					6b852e6cb3 | ||
| 
						 | 
					6e966e47f2 | ||
| 
						 | 
					227eea1e31 | ||
| 
						 | 
					79920d66d4 | ||
| 
						 | 
					6cd0aa429f | ||
| 
						 | 
					15d3de0099 | ||
| 
						 | 
					38fb59a6a6 | ||
| 
						 | 
					748f5bb3e6 | ||
| 
						 | 
					3c55475391 | ||
| 
						 | 
					dd6e371bac | ||
| 
						 | 
					00d900e46d | ||
| 
						 | 
					a4f11bef47 | ||
| 
						 | 
					c4f76622a6 | ||
| 
						 | 
					f80e5dd8e4 | ||
| 
						 | 
					f484efaac1 | ||
| 
						 | 
					f97804f4f4 | ||
| 
						 | 
					5c37f5104e | ||
| 
						 | 
					d08a8de265 | ||
| 
						 | 
					6c82feb1b8 | ||
| 
						 | 
					0dac91cffc | ||
| 
						 | 
					ff381d1d52 | ||
| 
						 | 
					05e9d6ab9e | ||
| 
						 | 
					d22f947bf5 | ||
| 
						 | 
					9b97e5ed58 | ||
| 
						 | 
					7f9fac2ba2 | ||
| 
						 | 
					64eaf70279 | ||
| 
						 | 
					e3149e6021 | ||
| 
						 | 
					166a464515 | ||
| 
						 | 
					38e58b837b | ||
| 
						 | 
					39a8c047d1 | ||
| 
						 | 
					c979cd95aa | ||
| 
						 | 
					6831f2edb4 | ||
| 
						 | 
					372d73e275 | ||
| 
						 | 
					0ada90024f | ||
| 
						 | 
					46e38ff61a | ||
| 
						 | 
					1e0b015ce8 | ||
| 
						 | 
					72054332c5 | ||
| 
						 | 
					d30ef0dd3b | ||
| 
						 | 
					84275688f3 | ||
| 
						 | 
					90a1eb4275 | ||
| 
						 | 
					73e3207a85 | ||
| 
						 | 
					8a6673bb55 | ||
| 
						 | 
					35c16a9f4b | ||
| 
						 | 
					390fd7ddcf | ||
| 
						 | 
					4b513a31ae | ||
| 
						 | 
					25c9e66c73 | ||
| 
						 | 
					649911b6b3 | ||
| 
						 | 
					8c332a4704 | ||
| 
						 | 
					21994bb00d | ||
| 
						 | 
					87a06c63ad | ||
| 
						 | 
					09026e5f0e | ||
| 
						 | 
					1f190a7cfe | ||
| 
						 | 
					86168b945c | ||
| 
						 | 
					680a54aff6 | ||
| 
						 | 
					548073ec27 | ||
| 
						 | 
					d366fb335d | ||
| 
						 | 
					7fbb47b2bb | ||
| 
						 | 
					3881c1f952 | ||
| 
						 | 
					038a3170bf | ||
| 
						 | 
					f27de9620a | ||
| 
						 | 
					969ad54feb | ||
| 
						 | 
					987ce5bec0 | ||
| 
						 | 
					d600cd9aee | ||
| 
						 | 
					1fc7935858 | ||
| 
						 | 
					b5354fb3cd | ||
| 
						 | 
					01aaced129 | ||
| 
						 | 
					ff59b5d041 | ||
| 
						 | 
					92f0eb9d14 | ||
| 
						 | 
					e6913d1471 | ||
| 
						 | 
					d495dc6c63 | ||
| 
						 | 
					88bb24f66e | ||
| 
						 | 
					6e7316ef11 | ||
| 
						 | 
					9fa56176fd | ||
| 
						 | 
					fb81199dec | ||
| 
						 | 
					b7f47ea17f | ||
| 
						 | 
					71101cab82 | ||
| 
						 | 
					c4b28b0939 | ||
| 
						 | 
					38954de11c | ||
| 
						 | 
					964ea60090 | ||
| 
						 | 
					159c83b914 | ||
| 
						 | 
					b68c630329 | ||
| 
						 | 
					fe1ccea1e1 | ||
| 
						 | 
					c483b52d24 | ||
| 
						 | 
					f3dcba27f5 | ||
| 
						 | 
					86ccc28413 | ||
| 
						 | 
					0d039c3ba3 | ||
| 
						 | 
					adcbc2aa5f | ||
| 
						 | 
					860906246e | ||
| 
						 | 
					37d7df612b | ||
| 
						 | 
					0baf4578c8 | ||
| 
						 | 
					2d6665950c | ||
| 
						 | 
					1c98f01a65 | ||
| 
						 | 
					e3f30371aa | ||
| 
						 | 
					1a14c4d3c9 | ||
| 
						 | 
					292d2754ae | ||
| 
						 | 
					fe42d56db3 | ||
| 
						 | 
					a11f9bd513 | ||
| 
						 | 
					7f6cafa847 | ||
| 
						 | 
					1b67f49f7f | ||
| 
						 | 
					c447d76cd4 | ||
| 
						 | 
					d327cedb83 | ||
| 
						 | 
					0c55e87d8f | ||
| 
						 | 
					81d11ac0a8 | ||
| 
						 | 
					84261d1db3 | ||
| 
						 | 
					a0441ad666 | ||
| 
						 | 
					67152916e1 | ||
| 
						 | 
					b98ebe60b2 | ||
| 
						 | 
					ad8ba69423 | ||
| 
						 | 
					bf24b816c2 | ||
| 
						 | 
					a9b1134dfb | ||
| 
						 | 
					6fb6a23389 | ||
| 
						 | 
					2da27720ca | ||
| 
						 | 
					f9326cfa3d | ||
| 
						 | 
					963108a9a6 | ||
| 
						 | 
					b8355a6686 | ||
| 
						 | 
					4c421959dc | ||
| 
						 | 
					aedcfcd010 | ||
| 
						 | 
					d7c7311ceb | ||
| 
						 | 
					41d72e86e0 | ||
| 
						 | 
					282b09c17e | ||
| 
						 | 
					c5d2fc856a | ||
| 
						 | 
					f5a28aa9e4 | ||
| 
						 | 
					6206511846 | ||
| 
						 | 
					a209a14898 | ||
| 
						 | 
					3e6a55aff0 | ||
| 
						 | 
					704fea6323 | ||
| 
						 | 
					8c1e6ebde0 | ||
| 
						 | 
					81512ad0dc | ||
| 
						 | 
					d122b66abc | 
@@ -1,9 +1,10 @@
 | 
			
		||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v3
 | 
			
		||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v4
 | 
			
		||||
 | 
			
		||||
stages:
 | 
			
		||||
 - review
 | 
			
		||||
 - build
 | 
			
		||||
 - test
 | 
			
		||||
 - coverage
 | 
			
		||||
 | 
			
		||||
check-commit-log:
 | 
			
		||||
  stage: review
 | 
			
		||||
@@ -17,7 +18,7 @@ check-commit-log:
 | 
			
		||||
build-mutter:
 | 
			
		||||
  stage: build
 | 
			
		||||
  script:
 | 
			
		||||
    - meson . build -Dbuildtype=debugoptimized -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr
 | 
			
		||||
    - meson . build -Dbuildtype=debugoptimized -Db_coverage=true -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr
 | 
			
		||||
    - ninja -C build
 | 
			
		||||
    - ninja -C build install
 | 
			
		||||
  artifacts:
 | 
			
		||||
@@ -28,6 +29,19 @@ build-mutter:
 | 
			
		||||
    - merge_requests
 | 
			
		||||
    - /^.*$/
 | 
			
		||||
 | 
			
		||||
build-without-opengl-and-glx:
 | 
			
		||||
  stage: build
 | 
			
		||||
  script:
 | 
			
		||||
    - meson . build -Dbuildtype=debugoptimized -Dopengl=false -Dglx=false -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr
 | 
			
		||||
    - ninja -C build
 | 
			
		||||
    - ninja -C build install
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - build/meson-logs
 | 
			
		||||
  only:
 | 
			
		||||
    - merge_requests
 | 
			
		||||
    - /^.*$/
 | 
			
		||||
 | 
			
		||||
build-without-native-backend-and-wayland:
 | 
			
		||||
  stage: build
 | 
			
		||||
  script:
 | 
			
		||||
@@ -35,9 +49,8 @@ build-without-native-backend-and-wayland:
 | 
			
		||||
    - ninja -C build
 | 
			
		||||
    - ninja -C build install
 | 
			
		||||
  artifacts:
 | 
			
		||||
    expire_in: 1 day
 | 
			
		||||
    paths:
 | 
			
		||||
      - build
 | 
			
		||||
      - build/meson-logs
 | 
			
		||||
  only:
 | 
			
		||||
    - merge_requests
 | 
			
		||||
    - /^.*$/
 | 
			
		||||
@@ -52,7 +65,6 @@ test-mutter:
 | 
			
		||||
    G_SLICE: "always-malloc"
 | 
			
		||||
    MALLOC_CHECK_: "3"
 | 
			
		||||
    NO_AT_BRIDGE: "1"
 | 
			
		||||
    MALLOC_PERTURB_: "123"
 | 
			
		||||
  script:
 | 
			
		||||
    - dconf update
 | 
			
		||||
    - mkdir -m 700 $XDG_RUNTIME_DIR
 | 
			
		||||
@@ -60,10 +72,30 @@ test-mutter:
 | 
			
		||||
    - >
 | 
			
		||||
      dbus-run-session -- xvfb-run -s '+iglx -noreset'
 | 
			
		||||
      meson test -C build --no-rebuild -t 10 --verbose --no-stdsplit --print-errorlogs --wrap catchsegv
 | 
			
		||||
  artifacts:
 | 
			
		||||
    expire_in: 1 day
 | 
			
		||||
    paths:
 | 
			
		||||
      - build
 | 
			
		||||
  only:
 | 
			
		||||
    - merge_requests
 | 
			
		||||
    - /^.*$/
 | 
			
		||||
 | 
			
		||||
test-mutter-coverage:
 | 
			
		||||
  stage: coverage
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - test-mutter
 | 
			
		||||
  script:
 | 
			
		||||
    - ninja -C build coverage
 | 
			
		||||
    - cat build/meson-logs/coverage.txt
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - build/meson-logs
 | 
			
		||||
  when: manual
 | 
			
		||||
  except:
 | 
			
		||||
    refs:
 | 
			
		||||
      - tags
 | 
			
		||||
      - master
 | 
			
		||||
 | 
			
		||||
can-build-gnome-shell:
 | 
			
		||||
  stage: test
 | 
			
		||||
  dependencies:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +1,27 @@
 | 
			
		||||
# Rebuild and push with
 | 
			
		||||
#
 | 
			
		||||
#     cd .gitlab-ci/
 | 
			
		||||
#     podman build --format docker --no-cache -t registry.gitlab.gnome.org/gnome/mutter/master:v3 .
 | 
			
		||||
#     podman push registry.gitlab.gnome.org/gnome/mutter/master:v3
 | 
			
		||||
#     podman build --format docker --no-cache -t registry.gitlab.gnome.org/gnome/mutter/master:v4 .
 | 
			
		||||
#     podman push registry.gitlab.gnome.org/gnome/mutter/master:v4
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
FROM fedora:31
 | 
			
		||||
FROM fedora:32
 | 
			
		||||
 | 
			
		||||
RUN dnf -y update && dnf -y upgrade && \
 | 
			
		||||
    dnf install -y 'dnf-command(builddep)' && \
 | 
			
		||||
    dnf install -y 'dnf-command(copr)' && \
 | 
			
		||||
    dnf copr enable -y fmuellner/gnome-shell-ci && \
 | 
			
		||||
    dnf -y update && dnf -y upgrade && \
 | 
			
		||||
    dnf copr enable -y jadahl/mutter-ci && \
 | 
			
		||||
 | 
			
		||||
    dnf builddep -y mutter && \
 | 
			
		||||
 | 
			
		||||
    # Until Fedora catches up with new build-deps
 | 
			
		||||
    dnf install -y 'pkgconfig(graphene-gobject-1.0)' 'pkgconfig(sysprof-capture-3)' && \
 | 
			
		||||
    dnf builddep -y mutter --setopt=install_weak_deps=False && \
 | 
			
		||||
 | 
			
		||||
    # For running unit tests
 | 
			
		||||
    dnf install -y xorg-x11-server-Xvfb mesa-dri-drivers dbus dbus-x11 '*/xvfb-run' gdm-lib accountsservice-libs gnome-control-center && \
 | 
			
		||||
    dnf install -y xorg-x11-server-Xvfb mesa-dri-drivers dbus dbus-x11 \
 | 
			
		||||
        '*/xvfb-run' gdm-lib accountsservice-libs gnome-control-center gcovr \
 | 
			
		||||
        --setopt=install_weak_deps=False && \
 | 
			
		||||
 | 
			
		||||
    # GNOME Shell
 | 
			
		||||
    dnf builddep -y gnome-shell --setopt=install_weak_deps=False && \
 | 
			
		||||
    dnf remove -y gnome-bluetooth-libs-devel dbus-glib-devel upower-devel python3-devel && \
 | 
			
		||||
    dnf remove -y gnome-bluetooth-libs-devel && \
 | 
			
		||||
    dnf remove -y --noautoremove mutter mutter-devel && \
 | 
			
		||||
 | 
			
		||||
    dnf clean all
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ fi
 | 
			
		||||
function commit_message_has_url() {
 | 
			
		||||
  commit=$1
 | 
			
		||||
  commit_message=$(git show -s --format='format:%b' $commit)
 | 
			
		||||
  echo "$commit_message" | grep -qe "\($CI_MERGE_REQUEST_PROJECT_URL/\(issues\|merge_requests\)/[0-9]\+\|https://bugzilla.gnome.org/show_bug.cgi?id=[0-9]\+\)"
 | 
			
		||||
  echo "$commit_message" | grep -qe "\($CI_MERGE_REQUEST_PROJECT_URL/\(-/\)\?\(issues\|merge_requests\)/[0-9]\+\|https://bugzilla.gnome.org/show_bug.cgi?id=[0-9]\+\)"
 | 
			
		||||
  return $?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										85
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,3 +1,88 @@
 | 
			
		||||
3.37.1
 | 
			
		||||
======
 | 
			
		||||
* Fix screencasting non-maximized windows [Jonas Å.; !1174]
 | 
			
		||||
* Make window-aliveness checks less aggressive [Jonas Å.; !1182]
 | 
			
		||||
* Fix stylus coordinates when using screen rotation [Jonas T.; #1118]
 | 
			
		||||
* Preserve keyboard state on VT switch [Olivier; !1185]
 | 
			
		||||
* Remove Clutter's drag and drop actions [Jonas D.; !789]
 | 
			
		||||
* Cancel clicks/gestures actions on disable [Georges; !1188]
 | 
			
		||||
* Fix various clipboard issues [Carlos; !1186, !1198, !1203, !1204, !1206]
 | 
			
		||||
* Fix trackball button scrolling [Phillip; #1120]
 | 
			
		||||
* Fix tiled monitor support [Jonas; !1199]
 | 
			
		||||
* Support unredirecting fullscreen wayland surfaces [Jonas Å.; !798]
 | 
			
		||||
* Support area screencasts [Jonas Å.; !1207]
 | 
			
		||||
* Synchronize shadows to server-side decorations [Olivier; !1214]
 | 
			
		||||
* Allow inhibiting remote access [Jonas Å.; !1212]
 | 
			
		||||
* Fix overview key on X11 when using multiple keyboard layouts [Olivier; !1219]
 | 
			
		||||
* Fixed crashes [Jonas, D., Carlos; !1173, !1183, !1012]
 | 
			
		||||
* Misc. bug fixes and cleanups [Andre, Georges, Christian, Jonas Å., Andre,
 | 
			
		||||
  Simon, Florian, Carlos, Adam, Marco, Thomas, Elias, Pekka, Jonas D.,
 | 
			
		||||
  Laurent; !1169, !1168, !1166, !1170, !1167, !1172, !1175, !1176, !1184,
 | 
			
		||||
  !1126, !1187, !1191, !1195, !1179, !1200, !1193, !1209, !1213, !1208,
 | 
			
		||||
  #1074, !1223]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Marco Trevisan (Treviño), Elias Aebi, Thomas Hindoe Paaboel Andersen,
 | 
			
		||||
  Laurent Bigonville, Jonas Dreßler, Olivier Fourdan, Carlos Garnacho,
 | 
			
		||||
  Adam Jackson, Andre Moreira Magalhaes, Simon McVittie, Florian Müllner,
 | 
			
		||||
  Georges Basile Stavracas Neto, Pekka Paalanen, Christian Rauch, Jonas Troeger,
 | 
			
		||||
  Phillip Wood, Jonas Ådahl
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Dušan Kazik [sk], Christian Kirbach [de]
 | 
			
		||||
 | 
			
		||||
3.36.0
 | 
			
		||||
======
 | 
			
		||||
* Fix placement of popup windows in multi-monitor setups [Jonas; !1110]
 | 
			
		||||
* Fix invisible mouse cursor on some hardware [Jonas; !1079]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Aurimas Černius [lt], Goran Vidović [hr], Anders Jonsson [sv],
 | 
			
		||||
  Guillaume Bernard [fr], Milo Casagrande [it], Daniel Korostil [uk],
 | 
			
		||||
  Andre Klapper [cy], Aman Alam [pa], Nathan Follens [nl]
 | 
			
		||||
 | 
			
		||||
3.35.92
 | 
			
		||||
=======
 | 
			
		||||
* Fix visibility of initially hidden windows [Jonas Å.; !1066]
 | 
			
		||||
* Avoid flicker when (un)redirecting windows [Sebastian; #997]
 | 
			
		||||
* Let BindConstraints update the preferred size [Emmanuele; !1070]
 | 
			
		||||
* Learn about GLES3 [Adam; !882]
 | 
			
		||||
* Ping windows on every window focus [Jonas D.; !891]
 | 
			
		||||
* Remove overhead from hot code paths [Christian;
 | 
			
		||||
  #1056, !1081, !1083, !1071, !1087]
 | 
			
		||||
* Allow remote desktop services to inhibit animations [Jonas Å.; !838]
 | 
			
		||||
* Update screen-cast code to PipeWire 0.3 API [Wim; !1062]
 | 
			
		||||
* Make check-alive timeouts configurable [Jonas Å.; !1080]
 | 
			
		||||
* Make each stage view correspond to a single CRTC [Jonas Å.; !1042]
 | 
			
		||||
* Implement scaled/transformed hardware cursors [Robert; !526]
 | 
			
		||||
* Use DMA buffers for screencasting if possible [Georges; !1086]
 | 
			
		||||
* Make Xwayland startup asynchronous [Carlos; !944]
 | 
			
		||||
* Fix clipping glitches in long text entries [Jonas D.; !1096]
 | 
			
		||||
* Add side channel for starting required X11 services [Carlos; !945]
 | 
			
		||||
* Support synchronized wayland popup moving [Jonas Å.; !705]
 | 
			
		||||
* Fixed crashes [Olivier, Jonas Å.; !1073, !1093]
 | 
			
		||||
* Plugged memory leaks [Sebastian, Jonas Å.; !1089, !1095]
 | 
			
		||||
* Misc. bug fixes and cleanups [Jonas Å, Olivier, Florian, Daniel, Jonas D.,
 | 
			
		||||
  Robert, Sebastian, Christian, Arun, Carlos, worldofpeace; !1061, #1043,
 | 
			
		||||
  !1067, !1068, !1065, !835, !1058, !1069, !1075, #1060, !1077, !423, !1090,
 | 
			
		||||
  !1088, !1094, #1067, !1064, !1099, !957, !1000, !1082]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Emmanuele Bassi, Jonas Dreßler, Olivier Fourdan, Carlos Garnacho,
 | 
			
		||||
  Christian Hergert, Adam Jackson, Sebastian Keller, Robert Mader,
 | 
			
		||||
  Florian Müllner, Georges Basile Stavracas Neto, Arun Raghavan, Wim Taymans,
 | 
			
		||||
  Daniel van Vugt, worldofpeace, Jonas Ådahl
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Yi-Jyun Pan [zh_TW], Asier Sarasua Garmendia [eu], Rafael Fontenelle [pt_BR],
 | 
			
		||||
  Emin Tufan Çetin [tr], Daniel Mustieles [es], Balázs Úr [hu],
 | 
			
		||||
  Gwan-gyeong Mun [ko], Marek Černocký [cs], Fran Dieguez [gl],
 | 
			
		||||
  Kukuh Syafaat [id], Alan Mortensen [da], Piotr Drąg [pl], sicklylife [ja],
 | 
			
		||||
  Matej Urbančič [sl]
 | 
			
		||||
 | 
			
		||||
3.35.91
 | 
			
		||||
=======
 | 
			
		||||
* Honor accelerometer orientation on monitor config changes [Hans; !959]
 | 
			
		||||
 
 | 
			
		||||
@@ -600,10 +600,11 @@ cally_actor_real_remove_actor (ClutterActor *container,
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), 0);
 | 
			
		||||
 | 
			
		||||
  atk_parent = ATK_OBJECT (data);
 | 
			
		||||
  atk_child = clutter_actor_get_accessible (actor);
 | 
			
		||||
 | 
			
		||||
  if (atk_child)
 | 
			
		||||
  if (clutter_actor_has_accessible (actor))
 | 
			
		||||
    {
 | 
			
		||||
      atk_child = clutter_actor_get_accessible (actor);
 | 
			
		||||
 | 
			
		||||
      g_value_init (&values.old_value, G_TYPE_POINTER);
 | 
			
		||||
      g_value_set_pointer (&values.old_value, atk_parent);
 | 
			
		||||
 | 
			
		||||
@@ -766,10 +767,10 @@ static gboolean
 | 
			
		||||
cally_actor_action_do_action (AtkAction *action,
 | 
			
		||||
                             gint       index)
 | 
			
		||||
{
 | 
			
		||||
  CallyActor           *cally_actor = NULL;
 | 
			
		||||
  AtkStateSet          *set         = NULL;
 | 
			
		||||
  CallyActorPrivate    *priv        = NULL;
 | 
			
		||||
  CallyActorActionInfo *info        = NULL;
 | 
			
		||||
  CallyActor              *cally_actor = NULL;
 | 
			
		||||
  g_autoptr (AtkStateSet)  set         = NULL;
 | 
			
		||||
  CallyActorPrivate       *priv        = NULL;
 | 
			
		||||
  CallyActorActionInfo    *info        = NULL;
 | 
			
		||||
 | 
			
		||||
  cally_actor = CALLY_ACTOR (action);
 | 
			
		||||
  priv = cally_actor->priv;
 | 
			
		||||
@@ -783,8 +784,6 @@ cally_actor_action_do_action (AtkAction *action,
 | 
			
		||||
      !atk_state_set_contains_state (set, ATK_STATE_SHOWING))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  g_object_unref (set);
 | 
			
		||||
 | 
			
		||||
  info = _cally_actor_get_action_info (cally_actor, index);
 | 
			
		||||
 | 
			
		||||
  if (info == NULL)
 | 
			
		||||
 
 | 
			
		||||
@@ -88,6 +88,10 @@ static void
 | 
			
		||||
clutter_actor_meta_real_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
                                   ClutterActor     *actor)
 | 
			
		||||
{
 | 
			
		||||
  g_warn_if_fail (!meta->priv->actor ||
 | 
			
		||||
                  !CLUTTER_ACTOR_IN_PAINT (meta->priv->actor));
 | 
			
		||||
  g_warn_if_fail (!actor || !CLUTTER_ACTOR_IN_PAINT (actor));
 | 
			
		||||
 | 
			
		||||
  if (meta->priv->actor == actor)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
@@ -101,6 +105,18 @@ clutter_actor_meta_real_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
                                               meta);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_actor_meta_real_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                                     gboolean          is_enabled)
 | 
			
		||||
{
 | 
			
		||||
  g_warn_if_fail (!meta->priv->actor ||
 | 
			
		||||
                  !CLUTTER_ACTOR_IN_PAINT (meta->priv->actor));
 | 
			
		||||
 | 
			
		||||
  meta->priv->is_enabled = is_enabled;
 | 
			
		||||
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (meta), obj_props[PROP_ENABLED]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_actor_meta_set_property (GObject      *gobject,
 | 
			
		||||
                                 guint         prop_id,
 | 
			
		||||
@@ -172,6 +188,7 @@ clutter_actor_meta_class_init (ClutterActorMetaClass *klass)
 | 
			
		||||
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  klass->set_actor = clutter_actor_meta_real_set_actor;
 | 
			
		||||
  klass->set_enabled = clutter_actor_meta_real_set_enabled;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterActorMeta:actor:
 | 
			
		||||
@@ -298,9 +315,7 @@ clutter_actor_meta_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
  if (meta->priv->is_enabled == is_enabled)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  meta->priv->is_enabled = is_enabled;
 | 
			
		||||
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (meta), obj_props[PROP_ENABLED]);
 | 
			
		||||
  CLUTTER_ACTOR_META_GET_CLASS (meta)->set_enabled (meta, is_enabled);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -87,6 +87,9 @@ struct _ClutterActorMetaClass
 | 
			
		||||
  void (* set_actor) (ClutterActorMeta *meta,
 | 
			
		||||
                      ClutterActor     *actor);
 | 
			
		||||
 | 
			
		||||
  void (* set_enabled) (ClutterActorMeta *meta,
 | 
			
		||||
                        gboolean          is_enabled);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  void (* _clutter_meta1) (void);
 | 
			
		||||
  void (* _clutter_meta2) (void);
 | 
			
		||||
@@ -94,7 +97,6 @@ struct _ClutterActorMetaClass
 | 
			
		||||
  void (* _clutter_meta4) (void);
 | 
			
		||||
  void (* _clutter_meta5) (void);
 | 
			
		||||
  void (* _clutter_meta6) (void);
 | 
			
		||||
  void (* _clutter_meta7) (void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
 
 | 
			
		||||
@@ -631,7 +631,7 @@
 | 
			
		||||
#include "clutter-color-static.h"
 | 
			
		||||
#include "clutter-color.h"
 | 
			
		||||
#include "clutter-constraint-private.h"
 | 
			
		||||
#include "clutter-container.h"
 | 
			
		||||
#include "clutter-container-private.h"
 | 
			
		||||
#include "clutter-content-private.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-easing.h"
 | 
			
		||||
@@ -710,6 +710,7 @@ struct _ClutterActorPrivate
 | 
			
		||||
 | 
			
		||||
  guint8 opacity;
 | 
			
		||||
  gint opacity_override;
 | 
			
		||||
  unsigned int inhibit_culling_counter;
 | 
			
		||||
 | 
			
		||||
  ClutterOffscreenRedirect offscreen_redirect;
 | 
			
		||||
 | 
			
		||||
@@ -1124,6 +1125,20 @@ static GQuark quark_actor_layout_info = 0;
 | 
			
		||||
static GQuark quark_actor_transform_info = 0;
 | 
			
		||||
static GQuark quark_actor_animation_info = 0;
 | 
			
		||||
 | 
			
		||||
static GQuark quark_key = 0;
 | 
			
		||||
static GQuark quark_motion = 0;
 | 
			
		||||
static GQuark quark_pointer_focus = 0;
 | 
			
		||||
static GQuark quark_button = 0;
 | 
			
		||||
static GQuark quark_scroll = 0;
 | 
			
		||||
static GQuark quark_stage = 0;
 | 
			
		||||
static GQuark quark_destroy = 0;
 | 
			
		||||
static GQuark quark_client = 0;
 | 
			
		||||
static GQuark quark_delete = 0;
 | 
			
		||||
static GQuark quark_touch = 0;
 | 
			
		||||
static GQuark quark_touchpad = 0;
 | 
			
		||||
static GQuark quark_proximity = 0;
 | 
			
		||||
static GQuark quark_pad = 0;
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE_WITH_CODE (ClutterActor,
 | 
			
		||||
                         clutter_actor,
 | 
			
		||||
                         G_TYPE_INITIALLY_UNOWNED,
 | 
			
		||||
@@ -1183,28 +1198,21 @@ clutter_actor_verify_map_state (ClutterActor *self)
 | 
			
		||||
 | 
			
		||||
  if (CLUTTER_ACTOR_IS_REALIZED (self))
 | 
			
		||||
    {
 | 
			
		||||
      /* all bets are off during reparent when we're potentially realized,
 | 
			
		||||
       * but should not be according to invariants
 | 
			
		||||
       */
 | 
			
		||||
      if (!CLUTTER_ACTOR_IN_REPARENT (self))
 | 
			
		||||
      if (priv->parent == NULL)
 | 
			
		||||
        {
 | 
			
		||||
          if (priv->parent == NULL)
 | 
			
		||||
          if (!CLUTTER_ACTOR_IS_TOPLEVEL (self))
 | 
			
		||||
            {
 | 
			
		||||
              if (CLUTTER_ACTOR_IS_TOPLEVEL (self))
 | 
			
		||||
                {
 | 
			
		||||
                }
 | 
			
		||||
              else
 | 
			
		||||
                g_warning ("Realized non-toplevel actor '%s' should "
 | 
			
		||||
                           "have a parent",
 | 
			
		||||
                           _clutter_actor_get_debug_name (self));
 | 
			
		||||
            }
 | 
			
		||||
          else if (!CLUTTER_ACTOR_IS_REALIZED (priv->parent))
 | 
			
		||||
            {
 | 
			
		||||
              g_warning ("Realized actor %s has an unrealized parent %s",
 | 
			
		||||
                         _clutter_actor_get_debug_name (self),
 | 
			
		||||
                         _clutter_actor_get_debug_name (priv->parent));
 | 
			
		||||
              g_warning ("Realized non-toplevel actor '%s' should "
 | 
			
		||||
                         "have a parent",
 | 
			
		||||
                         _clutter_actor_get_debug_name (self));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
      else if (!CLUTTER_ACTOR_IS_REALIZED (priv->parent))
 | 
			
		||||
        {
 | 
			
		||||
          g_warning ("Realized actor %s has an unrealized parent %s",
 | 
			
		||||
                     _clutter_actor_get_debug_name (self),
 | 
			
		||||
                     _clutter_actor_get_debug_name (priv->parent));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (CLUTTER_ACTOR_IS_MAPPED (self))
 | 
			
		||||
@@ -1213,70 +1221,64 @@ clutter_actor_verify_map_state (ClutterActor *self)
 | 
			
		||||
        g_warning ("Actor '%s' is mapped but not realized",
 | 
			
		||||
                   _clutter_actor_get_debug_name (self));
 | 
			
		||||
 | 
			
		||||
      /* remaining bets are off during reparent when we're potentially
 | 
			
		||||
       * mapped, but should not be according to invariants
 | 
			
		||||
       */
 | 
			
		||||
      if (!CLUTTER_ACTOR_IN_REPARENT (self))
 | 
			
		||||
      if (priv->parent == NULL)
 | 
			
		||||
        {
 | 
			
		||||
          if (priv->parent == NULL)
 | 
			
		||||
          if (CLUTTER_ACTOR_IS_TOPLEVEL (self))
 | 
			
		||||
            {
 | 
			
		||||
              if (CLUTTER_ACTOR_IS_TOPLEVEL (self))
 | 
			
		||||
              if (!CLUTTER_ACTOR_IS_VISIBLE (self) &&
 | 
			
		||||
                  !CLUTTER_ACTOR_IN_DESTRUCTION (self))
 | 
			
		||||
                {
 | 
			
		||||
                  if (!CLUTTER_ACTOR_IS_VISIBLE (self) &&
 | 
			
		||||
                      !CLUTTER_ACTOR_IN_DESTRUCTION (self))
 | 
			
		||||
                    {
 | 
			
		||||
                      g_warning ("Toplevel actor '%s' is mapped "
 | 
			
		||||
                                 "but not visible",
 | 
			
		||||
                                 _clutter_actor_get_debug_name (self));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
              else
 | 
			
		||||
                {
 | 
			
		||||
                  g_warning ("Mapped actor '%s' should have a parent",
 | 
			
		||||
                  g_warning ("Toplevel actor '%s' is mapped "
 | 
			
		||||
                             "but not visible",
 | 
			
		||||
                             _clutter_actor_get_debug_name (self));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
          else
 | 
			
		||||
            {
 | 
			
		||||
              ClutterActor *iter = self;
 | 
			
		||||
              g_warning ("Mapped actor '%s' should have a parent",
 | 
			
		||||
                         _clutter_actor_get_debug_name (self));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          ClutterActor *iter = self;
 | 
			
		||||
 | 
			
		||||
              /* check for the enable_paint_unmapped flag on the actor
 | 
			
		||||
               * and parents; if the flag is enabled at any point of this
 | 
			
		||||
               * branch of the scene graph then all the later checks
 | 
			
		||||
               * become pointless
 | 
			
		||||
               */
 | 
			
		||||
              while (iter != NULL)
 | 
			
		||||
                {
 | 
			
		||||
                  if (iter->priv->enable_paint_unmapped)
 | 
			
		||||
                    return;
 | 
			
		||||
          /* check for the enable_paint_unmapped flag on the actor
 | 
			
		||||
           * and parents; if the flag is enabled at any point of this
 | 
			
		||||
           * branch of the scene graph then all the later checks
 | 
			
		||||
           * become pointless
 | 
			
		||||
           */
 | 
			
		||||
          while (iter != NULL)
 | 
			
		||||
            {
 | 
			
		||||
              if (iter->priv->enable_paint_unmapped)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
                  iter = iter->priv->parent;
 | 
			
		||||
                }
 | 
			
		||||
              iter = iter->priv->parent;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
              if (!CLUTTER_ACTOR_IS_VISIBLE (priv->parent))
 | 
			
		||||
                {
 | 
			
		||||
                  g_warning ("Actor '%s' should not be mapped if parent '%s'"
 | 
			
		||||
                             "is not visible",
 | 
			
		||||
                             _clutter_actor_get_debug_name (self),
 | 
			
		||||
                             _clutter_actor_get_debug_name (priv->parent));
 | 
			
		||||
                }
 | 
			
		||||
          if (!CLUTTER_ACTOR_IS_VISIBLE (priv->parent))
 | 
			
		||||
            {
 | 
			
		||||
              g_warning ("Actor '%s' should not be mapped if parent '%s'"
 | 
			
		||||
                         "is not visible",
 | 
			
		||||
                         _clutter_actor_get_debug_name (self),
 | 
			
		||||
                         _clutter_actor_get_debug_name (priv->parent));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
              if (!CLUTTER_ACTOR_IS_REALIZED (priv->parent))
 | 
			
		||||
                {
 | 
			
		||||
                  g_warning ("Actor '%s' should not be mapped if parent '%s'"
 | 
			
		||||
                             "is not realized",
 | 
			
		||||
                             _clutter_actor_get_debug_name (self),
 | 
			
		||||
                             _clutter_actor_get_debug_name (priv->parent));
 | 
			
		||||
                }
 | 
			
		||||
          if (!CLUTTER_ACTOR_IS_REALIZED (priv->parent))
 | 
			
		||||
            {
 | 
			
		||||
              g_warning ("Actor '%s' should not be mapped if parent '%s'"
 | 
			
		||||
                         "is not realized",
 | 
			
		||||
                         _clutter_actor_get_debug_name (self),
 | 
			
		||||
                         _clutter_actor_get_debug_name (priv->parent));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
              if (!CLUTTER_ACTOR_IS_TOPLEVEL (priv->parent))
 | 
			
		||||
                {
 | 
			
		||||
                  if (!CLUTTER_ACTOR_IS_MAPPED (priv->parent))
 | 
			
		||||
                    g_warning ("Actor '%s' is mapped but its non-toplevel "
 | 
			
		||||
                               "parent '%s' is not mapped",
 | 
			
		||||
                               _clutter_actor_get_debug_name (self),
 | 
			
		||||
                               _clutter_actor_get_debug_name (priv->parent));
 | 
			
		||||
                }
 | 
			
		||||
          if (!CLUTTER_ACTOR_IS_TOPLEVEL (priv->parent))
 | 
			
		||||
            {
 | 
			
		||||
              if (!CLUTTER_ACTOR_IS_MAPPED (priv->parent))
 | 
			
		||||
                g_warning ("Actor '%s' is mapped but its non-toplevel "
 | 
			
		||||
                           "parent '%s' is not mapped",
 | 
			
		||||
                           _clutter_actor_get_debug_name (self),
 | 
			
		||||
                           _clutter_actor_get_debug_name (priv->parent));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -1571,13 +1573,10 @@ clutter_actor_update_map_state (ClutterActor  *self,
 | 
			
		||||
                       _clutter_actor_get_debug_name (priv->parent));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* If in reparent, we temporarily suspend unmap and unrealize.
 | 
			
		||||
       *
 | 
			
		||||
       * We want to go in the order "realize, map" and "unmap, unrealize"
 | 
			
		||||
       */
 | 
			
		||||
      /* We want to go in the order "realize, map" and "unmap, unrealize" */
 | 
			
		||||
 | 
			
		||||
      /* Unmap */
 | 
			
		||||
      if (!should_be_mapped && !CLUTTER_ACTOR_IN_REPARENT (self))
 | 
			
		||||
      if (!should_be_mapped)
 | 
			
		||||
        clutter_actor_set_mapped (self, FALSE);
 | 
			
		||||
 | 
			
		||||
      /* Realize */
 | 
			
		||||
@@ -1588,7 +1587,7 @@ clutter_actor_update_map_state (ClutterActor  *self,
 | 
			
		||||
      g_assert (!(must_be_realized && !may_be_realized));
 | 
			
		||||
 | 
			
		||||
      /* Unrealize */
 | 
			
		||||
      if (!may_be_realized && !CLUTTER_ACTOR_IN_REPARENT (self))
 | 
			
		||||
      if (!may_be_realized)
 | 
			
		||||
        clutter_actor_unrealize_not_hiding (self);
 | 
			
		||||
 | 
			
		||||
      /* Map */
 | 
			
		||||
@@ -2395,6 +2394,7 @@ clutter_actor_should_pick_paint (ClutterActor *self)
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
 | 
			
		||||
 | 
			
		||||
  if (CLUTTER_ACTOR_IS_MAPPED (self) &&
 | 
			
		||||
      clutter_actor_has_allocation (self) &&
 | 
			
		||||
      (_clutter_context_get_pick_mode () == CLUTTER_PICK_ALL ||
 | 
			
		||||
       CLUTTER_ACTOR_IS_REACTIVE (self)))
 | 
			
		||||
    return TRUE;
 | 
			
		||||
@@ -3076,96 +3076,6 @@ _clutter_actor_transform_and_project_box (ClutterActor          *self,
 | 
			
		||||
    _clutter_actor_fully_transform_vertices (self, box_vertices, verts, 4);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_actor_get_allocation_vertices:
 | 
			
		||||
 * @self: A #ClutterActor
 | 
			
		||||
 * @ancestor: (allow-none): A #ClutterActor to calculate the vertices
 | 
			
		||||
 *   against, or %NULL to use the #ClutterStage
 | 
			
		||||
 * @verts: (out) (array fixed-size=4): return
 | 
			
		||||
 *   location for an array of 4 #graphene_point3d_t in which to store the result
 | 
			
		||||
 *
 | 
			
		||||
 * Calculates the transformed coordinates of the four corners of the
 | 
			
		||||
 * actor in the plane of @ancestor. The returned vertices relate to
 | 
			
		||||
 * the #ClutterActorBox coordinates as follows:
 | 
			
		||||
 *
 | 
			
		||||
 *  - @verts[0] contains (x1, y1)
 | 
			
		||||
 *  - @verts[1] contains (x2, y1)
 | 
			
		||||
 *  - @verts[2] contains (x1, y2)
 | 
			
		||||
 *  - @verts[3] contains (x2, y2)
 | 
			
		||||
 *
 | 
			
		||||
 * If @ancestor is %NULL the ancestor will be the #ClutterStage. In
 | 
			
		||||
 * this case, the coordinates returned will be the coordinates on
 | 
			
		||||
 * the stage before the projection is applied. This is different from
 | 
			
		||||
 * the behaviour of clutter_actor_get_abs_allocation_vertices().
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.6
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_actor_get_allocation_vertices (ClutterActor       *self,
 | 
			
		||||
                                       ClutterActor       *ancestor,
 | 
			
		||||
                                       graphene_point3d_t *verts)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorPrivate *priv;
 | 
			
		||||
  ClutterActorBox box;
 | 
			
		||||
  graphene_point3d_t vertices[4];
 | 
			
		||||
  CoglMatrix modelview;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ACTOR (self));
 | 
			
		||||
  g_return_if_fail (ancestor == NULL || CLUTTER_IS_ACTOR (ancestor));
 | 
			
		||||
 | 
			
		||||
  if (ancestor == NULL)
 | 
			
		||||
    ancestor = _clutter_actor_get_stage_internal (self);
 | 
			
		||||
 | 
			
		||||
  /* Fallback to a NOP transform if the actor isn't parented under a
 | 
			
		||||
   * stage. */
 | 
			
		||||
  if (ancestor == NULL)
 | 
			
		||||
    ancestor = self;
 | 
			
		||||
 | 
			
		||||
  priv = self->priv;
 | 
			
		||||
 | 
			
		||||
  /* if the actor needs to be allocated we force a relayout, so that
 | 
			
		||||
   * we will have valid values to use in the transformations */
 | 
			
		||||
  if (priv->needs_allocation)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterActor *stage = _clutter_actor_get_stage_internal (self);
 | 
			
		||||
      if (stage)
 | 
			
		||||
        _clutter_stage_maybe_relayout (stage);
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          box.x1 = box.y1 = 0;
 | 
			
		||||
          /* The result isn't really meaningful in this case but at
 | 
			
		||||
           * least try to do something *vaguely* reasonable... */
 | 
			
		||||
          clutter_actor_get_size (self, &box.x2, &box.y2);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  clutter_actor_get_allocation_box (self, &box);
 | 
			
		||||
 | 
			
		||||
  vertices[0].x = box.x1;
 | 
			
		||||
  vertices[0].y = box.y1;
 | 
			
		||||
  vertices[0].z = 0;
 | 
			
		||||
  vertices[1].x = box.x2;
 | 
			
		||||
  vertices[1].y = box.y1;
 | 
			
		||||
  vertices[1].z = 0;
 | 
			
		||||
  vertices[2].x = box.x1;
 | 
			
		||||
  vertices[2].y = box.y2;
 | 
			
		||||
  vertices[2].z = 0;
 | 
			
		||||
  vertices[3].x = box.x2;
 | 
			
		||||
  vertices[3].y = box.y2;
 | 
			
		||||
  vertices[3].z = 0;
 | 
			
		||||
 | 
			
		||||
  _clutter_actor_get_relative_transformation_matrix (self, ancestor,
 | 
			
		||||
                                                     &modelview);
 | 
			
		||||
 | 
			
		||||
  cogl_matrix_transform_points (&modelview,
 | 
			
		||||
                                3,
 | 
			
		||||
                                sizeof (graphene_point3d_t),
 | 
			
		||||
                                vertices,
 | 
			
		||||
                                sizeof (graphene_point3d_t),
 | 
			
		||||
                                vertices,
 | 
			
		||||
                                4);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_actor_get_abs_allocation_vertices:
 | 
			
		||||
 * @self: A #ClutterActor
 | 
			
		||||
@@ -3474,8 +3384,8 @@ _clutter_actor_draw_paint_volume_full (ClutterActor       *self,
 | 
			
		||||
  cogl_pipeline_set_color (outline, &cogl_color);
 | 
			
		||||
 | 
			
		||||
  pipeline_node = clutter_pipeline_node_new (outline);
 | 
			
		||||
  clutter_paint_node_set_name (pipeline_node,
 | 
			
		||||
                               "ClutterActor (paint volume outline)");
 | 
			
		||||
  clutter_paint_node_set_static_name (pipeline_node,
 | 
			
		||||
                                      "ClutterActor (paint volume outline)");
 | 
			
		||||
  clutter_paint_node_add_primitive (pipeline_node, prim);
 | 
			
		||||
  clutter_paint_node_add_child (node, pipeline_node);
 | 
			
		||||
  cogl_object_unref (prim);
 | 
			
		||||
@@ -3489,8 +3399,8 @@ _clutter_actor_draw_paint_volume_full (ClutterActor       *self,
 | 
			
		||||
      pango_layout_set_text (layout, label, -1);
 | 
			
		||||
 | 
			
		||||
      text_node = clutter_text_node_new (layout, color);
 | 
			
		||||
      clutter_paint_node_set_name (text_node,
 | 
			
		||||
                                   "ClutterActor (paint volume label)");
 | 
			
		||||
      clutter_paint_node_set_static_name (text_node,
 | 
			
		||||
                                          "ClutterActor (paint volume label)");
 | 
			
		||||
      clutter_paint_node_add_rectangle (text_node,
 | 
			
		||||
                                        &(ClutterActorBox) {
 | 
			
		||||
                                          .x1 = pv->vertices[0].x,
 | 
			
		||||
@@ -3586,8 +3496,8 @@ _clutter_actor_paint_cull_result (ClutterActor      *self,
 | 
			
		||||
      pango_layout_set_text (layout, label, -1);
 | 
			
		||||
 | 
			
		||||
      text_node = clutter_text_node_new (layout, &color);
 | 
			
		||||
      clutter_paint_node_set_name (text_node,
 | 
			
		||||
                                   "ClutterActor (paint volume text)");
 | 
			
		||||
      clutter_paint_node_set_static_name (text_node,
 | 
			
		||||
                                          "ClutterActor (paint volume text)");
 | 
			
		||||
      clutter_paint_node_add_rectangle (text_node,
 | 
			
		||||
                                        &(ClutterActorBox) {
 | 
			
		||||
                                          .x1 = 0.f,
 | 
			
		||||
@@ -3743,7 +3653,13 @@ needs_flatten_effect (ClutterActor *self)
 | 
			
		||||
                  CLUTTER_DEBUG_DISABLE_OFFSCREEN_REDIRECT))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  if (priv->offscreen_redirect & CLUTTER_OFFSCREEN_REDIRECT_ALWAYS)
 | 
			
		||||
  /* We need to enable the effect immediately even in ON_IDLE because that can
 | 
			
		||||
   * only be implemented efficiently within the effect itself.
 | 
			
		||||
   * If it was implemented here using just priv->is_dirty then we would lose
 | 
			
		||||
   * the ability to animate opacity without repaints.
 | 
			
		||||
   */
 | 
			
		||||
  if ((priv->offscreen_redirect & CLUTTER_OFFSCREEN_REDIRECT_ALWAYS) ||
 | 
			
		||||
      (priv->offscreen_redirect & CLUTTER_OFFSCREEN_REDIRECT_ON_IDLE))
 | 
			
		||||
    return TRUE;
 | 
			
		||||
  else if (priv->offscreen_redirect & CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY)
 | 
			
		||||
    {
 | 
			
		||||
@@ -3844,14 +3760,7 @@ clutter_actor_paint_node (ClutterActor        *actor,
 | 
			
		||||
 | 
			
		||||
      fb = clutter_paint_context_get_base_framebuffer (paint_context);
 | 
			
		||||
 | 
			
		||||
      if (clutter_stage_get_use_alpha (CLUTTER_STAGE (actor)))
 | 
			
		||||
        {
 | 
			
		||||
          bg_color.alpha = priv->opacity
 | 
			
		||||
                         * priv->bg_color.alpha
 | 
			
		||||
                         / 255;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        bg_color.alpha = 255;
 | 
			
		||||
      bg_color.alpha = 255;
 | 
			
		||||
 | 
			
		||||
      CLUTTER_NOTE (PAINT, "Stage clear color: (%d, %d, %d, %d)",
 | 
			
		||||
                    bg_color.red,
 | 
			
		||||
@@ -3862,7 +3771,7 @@ clutter_actor_paint_node (ClutterActor        *actor,
 | 
			
		||||
      clear_flags = COGL_BUFFER_BIT_DEPTH;
 | 
			
		||||
 | 
			
		||||
      node = clutter_root_node_new (fb, &bg_color, clear_flags);
 | 
			
		||||
      clutter_paint_node_set_name (node, "stageClear");
 | 
			
		||||
      clutter_paint_node_set_static_name (node, "stageClear");
 | 
			
		||||
      clutter_paint_node_add_rectangle (node, &box);
 | 
			
		||||
      clutter_paint_node_add_child (root, node);
 | 
			
		||||
      clutter_paint_node_unref (node);
 | 
			
		||||
@@ -3877,7 +3786,7 @@ clutter_actor_paint_node (ClutterActor        *actor,
 | 
			
		||||
                     / 255;
 | 
			
		||||
 | 
			
		||||
      node = clutter_color_node_new (&bg_color);
 | 
			
		||||
      clutter_paint_node_set_name (node, "backgroundColor");
 | 
			
		||||
      clutter_paint_node_set_static_name (node, "backgroundColor");
 | 
			
		||||
      clutter_paint_node_add_rectangle (node, &box);
 | 
			
		||||
      clutter_paint_node_add_child (root, node);
 | 
			
		||||
      clutter_paint_node_unref (node);
 | 
			
		||||
@@ -3931,6 +3840,7 @@ clutter_actor_paint (ClutterActor        *self,
 | 
			
		||||
  g_autoptr (ClutterPaintNode) root_node = NULL;
 | 
			
		||||
  ClutterActorPrivate *priv;
 | 
			
		||||
  ClutterActorBox clip;
 | 
			
		||||
  gboolean culling_inhibited;
 | 
			
		||||
  gboolean clip_set = FALSE;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ACTOR (self));
 | 
			
		||||
@@ -3997,11 +3907,14 @@ clutter_actor_paint (ClutterActor        *self,
 | 
			
		||||
 | 
			
		||||
      clutter_actor_get_transform (self, &transform);
 | 
			
		||||
 | 
			
		||||
      transform_node = clutter_transform_node_new (&transform);
 | 
			
		||||
      clutter_paint_node_add_child (transform_node, root_node);
 | 
			
		||||
      clutter_paint_node_unref (root_node);
 | 
			
		||||
      if (!cogl_matrix_is_identity (&transform))
 | 
			
		||||
        {
 | 
			
		||||
          transform_node = clutter_transform_node_new (&transform);
 | 
			
		||||
          clutter_paint_node_add_child (transform_node, root_node);
 | 
			
		||||
          clutter_paint_node_unref (root_node);
 | 
			
		||||
 | 
			
		||||
      root_node = g_steal_pointer (&transform_node);
 | 
			
		||||
          root_node = g_steal_pointer (&transform_node);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#ifdef CLUTTER_ENABLE_DEBUG
 | 
			
		||||
      /* Catch when out-of-band transforms have been made by actors not as part
 | 
			
		||||
@@ -4076,7 +3989,8 @@ clutter_actor_paint (ClutterActor        *self,
 | 
			
		||||
   * paint then the last-paint-volume would likely represent the new
 | 
			
		||||
   * actor position not the old.
 | 
			
		||||
   */
 | 
			
		||||
  if (!in_clone_paint ())
 | 
			
		||||
  culling_inhibited = priv->inhibit_culling_counter > 0;
 | 
			
		||||
  if (!culling_inhibited && !in_clone_paint ())
 | 
			
		||||
    {
 | 
			
		||||
      gboolean success;
 | 
			
		||||
      /* annoyingly gcc warns if uninitialized even though
 | 
			
		||||
@@ -4158,7 +4072,7 @@ clutter_actor_continue_paint (ClutterActor        *self,
 | 
			
		||||
       */
 | 
			
		||||
      framebuffer = clutter_paint_context_get_base_framebuffer (paint_context);
 | 
			
		||||
      dummy = _clutter_dummy_node_new (self, framebuffer);
 | 
			
		||||
      clutter_paint_node_set_name (dummy, "Root");
 | 
			
		||||
      clutter_paint_node_set_static_name (dummy, "Root");
 | 
			
		||||
 | 
			
		||||
      /* XXX - for 1.12, we use the return value of paint_node() to
 | 
			
		||||
       * decide whether we should emit the ::paint signal.
 | 
			
		||||
@@ -4198,6 +4112,11 @@ clutter_actor_continue_paint (ClutterActor        *self,
 | 
			
		||||
            run_flags |= CLUTTER_EFFECT_PAINT_ACTOR_DIRTY;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      if (priv->current_effect == priv->flatten_effect &&
 | 
			
		||||
          priv->offscreen_redirect & CLUTTER_OFFSCREEN_REDIRECT_ON_IDLE &&
 | 
			
		||||
          run_flags & CLUTTER_EFFECT_PAINT_ACTOR_DIRTY)
 | 
			
		||||
        run_flags |= CLUTTER_EFFECT_PAINT_BYPASS_EFFECT;
 | 
			
		||||
 | 
			
		||||
      _clutter_effect_paint (priv->current_effect, paint_context, run_flags);
 | 
			
		||||
 | 
			
		||||
      priv->current_effect = old_current_effect;
 | 
			
		||||
@@ -4553,8 +4472,7 @@ clutter_actor_remove_child_internal (ClutterActor                 *self,
 | 
			
		||||
      clutter_actor_queue_compute_expand (self);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (emit_parent_set && !CLUTTER_ACTOR_IN_REPARENT (child) &&
 | 
			
		||||
      !CLUTTER_ACTOR_IN_DESTRUCTION (child))
 | 
			
		||||
  if (emit_parent_set && !CLUTTER_ACTOR_IN_DESTRUCTION (child))
 | 
			
		||||
    {
 | 
			
		||||
      child->priv->needs_compute_resource_scale = TRUE;
 | 
			
		||||
      g_signal_emit (child, actor_signals[PARENT_SET], 0, self);
 | 
			
		||||
@@ -4568,7 +4486,7 @@ clutter_actor_remove_child_internal (ClutterActor                 *self,
 | 
			
		||||
 | 
			
		||||
  /* we need to emit the signal before dropping the reference */
 | 
			
		||||
  if (emit_actor_removed)
 | 
			
		||||
    g_signal_emit_by_name (self, "actor-removed", child);
 | 
			
		||||
    _clutter_container_emit_actor_removed (CLUTTER_CONTAINER (self), child);
 | 
			
		||||
 | 
			
		||||
  if (notify_first_last)
 | 
			
		||||
    {
 | 
			
		||||
@@ -6531,6 +6449,20 @@ clutter_actor_class_init (ClutterActorClass *klass)
 | 
			
		||||
  quark_actor_transform_info = g_quark_from_static_string ("-clutter-actor-transform-info");
 | 
			
		||||
  quark_actor_animation_info = g_quark_from_static_string ("-clutter-actor-animation-info");
 | 
			
		||||
 | 
			
		||||
  quark_key = g_quark_from_static_string ("key");
 | 
			
		||||
  quark_motion = g_quark_from_static_string ("motion");
 | 
			
		||||
  quark_pointer_focus = g_quark_from_static_string ("pointer-focus");
 | 
			
		||||
  quark_button = g_quark_from_static_string ("button");
 | 
			
		||||
  quark_scroll = g_quark_from_static_string ("scroll");
 | 
			
		||||
  quark_stage = g_quark_from_static_string ("stage");
 | 
			
		||||
  quark_destroy = g_quark_from_static_string ("destroy");
 | 
			
		||||
  quark_client = g_quark_from_static_string ("client");
 | 
			
		||||
  quark_delete = g_quark_from_static_string ("delete");
 | 
			
		||||
  quark_touch = g_quark_from_static_string ("touch");
 | 
			
		||||
  quark_touchpad = g_quark_from_static_string ("touchpad");
 | 
			
		||||
  quark_proximity = g_quark_from_static_string ("proximity");
 | 
			
		||||
  quark_pad = g_quark_from_static_string ("pad");
 | 
			
		||||
 | 
			
		||||
  object_class->constructor = clutter_actor_constructor;
 | 
			
		||||
  object_class->set_property = clutter_actor_set_property;
 | 
			
		||||
  object_class->get_property = clutter_actor_get_property;
 | 
			
		||||
@@ -8566,7 +8498,7 @@ clutter_actor_class_init (ClutterActorClass *klass)
 | 
			
		||||
  actor_signals[CAPTURED_EVENT] =
 | 
			
		||||
    g_signal_new (I_("captured-event"),
 | 
			
		||||
		  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
		  G_SIGNAL_RUN_LAST,
 | 
			
		||||
		  G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
 | 
			
		||||
		  G_STRUCT_OFFSET (ClutterActorClass, captured_event),
 | 
			
		||||
		  _clutter_boolean_handled_accumulator, NULL,
 | 
			
		||||
		  _clutter_marshal_BOOLEAN__BOXED,
 | 
			
		||||
@@ -13154,7 +13086,7 @@ clutter_actor_add_child_internal (ClutterActor              *self,
 | 
			
		||||
      clutter_actor_queue_compute_expand (self);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (emit_parent_set && !CLUTTER_ACTOR_IN_REPARENT (child))
 | 
			
		||||
  if (emit_parent_set)
 | 
			
		||||
    {
 | 
			
		||||
      child->priv->needs_compute_resource_scale = TRUE;
 | 
			
		||||
      g_signal_emit (child, actor_signals[PARENT_SET], 0, NULL);
 | 
			
		||||
@@ -13212,7 +13144,7 @@ clutter_actor_add_child_internal (ClutterActor              *self,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (emit_actor_added)
 | 
			
		||||
    g_signal_emit_by_name (self, "actor-added", child);
 | 
			
		||||
    _clutter_container_emit_actor_added (CLUTTER_CONTAINER (self), child);
 | 
			
		||||
 | 
			
		||||
  if (notify_first_last)
 | 
			
		||||
    {
 | 
			
		||||
@@ -13876,8 +13808,70 @@ clutter_actor_event (ClutterActor       *actor,
 | 
			
		||||
 | 
			
		||||
  if (capture)
 | 
			
		||||
    {
 | 
			
		||||
      g_signal_emit (actor, actor_signals[CAPTURED_EVENT], 0,
 | 
			
		||||
		     event,
 | 
			
		||||
      GQuark detail = 0;
 | 
			
		||||
 | 
			
		||||
      switch (event->type)
 | 
			
		||||
        {
 | 
			
		||||
        case CLUTTER_NOTHING:
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_KEY_PRESS:
 | 
			
		||||
        case CLUTTER_KEY_RELEASE:
 | 
			
		||||
          detail = quark_key;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_MOTION:
 | 
			
		||||
          detail = quark_motion;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_ENTER:
 | 
			
		||||
        case CLUTTER_LEAVE:
 | 
			
		||||
          detail = quark_pointer_focus;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_BUTTON_PRESS:
 | 
			
		||||
        case CLUTTER_BUTTON_RELEASE:
 | 
			
		||||
          detail = quark_button;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_SCROLL:
 | 
			
		||||
          detail = quark_scroll;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_STAGE_STATE:
 | 
			
		||||
          detail = quark_stage;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_DESTROY_NOTIFY:
 | 
			
		||||
          detail = quark_destroy;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_CLIENT_MESSAGE:
 | 
			
		||||
          detail = quark_client;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_DELETE:
 | 
			
		||||
          detail = quark_delete;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_TOUCH_BEGIN:
 | 
			
		||||
        case CLUTTER_TOUCH_UPDATE:
 | 
			
		||||
        case CLUTTER_TOUCH_END:
 | 
			
		||||
        case CLUTTER_TOUCH_CANCEL:
 | 
			
		||||
          detail = quark_touch;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_TOUCHPAD_PINCH:
 | 
			
		||||
        case CLUTTER_TOUCHPAD_SWIPE:
 | 
			
		||||
          detail = quark_touchpad;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_PROXIMITY_IN:
 | 
			
		||||
        case CLUTTER_PROXIMITY_OUT:
 | 
			
		||||
          detail = quark_proximity;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_PAD_BUTTON_PRESS:
 | 
			
		||||
        case CLUTTER_PAD_BUTTON_RELEASE:
 | 
			
		||||
        case CLUTTER_PAD_STRIP:
 | 
			
		||||
        case CLUTTER_PAD_RING:
 | 
			
		||||
          detail = quark_pad;
 | 
			
		||||
          break;
 | 
			
		||||
        case CLUTTER_EVENT_LAST:  /* Just keep compiler warnings quiet */
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      g_signal_emit (actor,
 | 
			
		||||
                     actor_signals[CAPTURED_EVENT],
 | 
			
		||||
                     detail,
 | 
			
		||||
                     event,
 | 
			
		||||
                     &retval);
 | 
			
		||||
      goto out;
 | 
			
		||||
    }
 | 
			
		||||
@@ -15898,6 +15892,63 @@ clutter_actor_get_opacity_override (ClutterActor *self)
 | 
			
		||||
  return self->priv->opacity_override;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_actor_inhibit_culling:
 | 
			
		||||
 * @actor: a #ClutterActor
 | 
			
		||||
 *
 | 
			
		||||
 * Increases the culling inhibitor counter. Inhibiting culling
 | 
			
		||||
 * forces the actor to be painted even when outside the visible
 | 
			
		||||
 * bounds of the stage view.
 | 
			
		||||
 *
 | 
			
		||||
 * This is usually necessary when an actor is being painted on
 | 
			
		||||
 * another paint context.
 | 
			
		||||
 *
 | 
			
		||||
 * Pair with clutter_actor_uninhibit_culling() when the actor doesn't
 | 
			
		||||
 * need to be painted anymore.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_actor_inhibit_culling (ClutterActor *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ACTOR (actor));
 | 
			
		||||
 | 
			
		||||
  priv = actor->priv;
 | 
			
		||||
 | 
			
		||||
  priv->inhibit_culling_counter++;
 | 
			
		||||
  _clutter_actor_set_enable_paint_unmapped (actor, TRUE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_actor_uninhibit_culling:
 | 
			
		||||
 * @actor: a #ClutterActor
 | 
			
		||||
 *
 | 
			
		||||
 * Decreases the culling inhibitor counter. See clutter_actor_inhibit_culling()
 | 
			
		||||
 * for when inhibit culling is necessary.
 | 
			
		||||
 *
 | 
			
		||||
 * Calling this function without a matching call to
 | 
			
		||||
 * clutter_actor_inhibit_culling() is a programming error.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_actor_uninhibit_culling (ClutterActor *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ACTOR (actor));
 | 
			
		||||
 | 
			
		||||
  priv = actor->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->inhibit_culling_counter == 0)
 | 
			
		||||
    {
 | 
			
		||||
      g_critical ("Unpaired call to clutter_actor_uninhibit_culling");
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->inhibit_culling_counter--;
 | 
			
		||||
  if (priv->inhibit_culling_counter == 0)
 | 
			
		||||
    _clutter_actor_set_enable_paint_unmapped (actor, FALSE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Allows you to disable applying the actors model view transform during
 | 
			
		||||
 * a paint. Used by ClutterClone. */
 | 
			
		||||
void
 | 
			
		||||
@@ -17611,10 +17662,42 @@ _clutter_actor_compute_resource_scale (ClutterActor *self,
 | 
			
		||||
                                                   resource_scale))
 | 
			
		||||
    {
 | 
			
		||||
      if (priv->parent)
 | 
			
		||||
        return _clutter_actor_compute_resource_scale (priv->parent,
 | 
			
		||||
                                                      resource_scale);
 | 
			
		||||
        {
 | 
			
		||||
          gboolean in_clone_paint;
 | 
			
		||||
          gboolean was_parent_in_clone_paint;
 | 
			
		||||
          gboolean was_parent_unmapped;
 | 
			
		||||
          gboolean was_parent_paint_unmapped;
 | 
			
		||||
          gboolean ret;
 | 
			
		||||
 | 
			
		||||
          in_clone_paint = clutter_actor_is_in_clone_paint (self);
 | 
			
		||||
          was_parent_unmapped = !clutter_actor_is_mapped (priv->parent);
 | 
			
		||||
          was_parent_in_clone_paint =
 | 
			
		||||
            clutter_actor_is_in_clone_paint (priv->parent);
 | 
			
		||||
          was_parent_paint_unmapped = priv->parent->priv->enable_paint_unmapped;
 | 
			
		||||
 | 
			
		||||
          if (in_clone_paint && was_parent_unmapped)
 | 
			
		||||
            {
 | 
			
		||||
              _clutter_actor_set_in_clone_paint (priv->parent, TRUE);
 | 
			
		||||
              _clutter_actor_set_enable_paint_unmapped (priv->parent, TRUE);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          ret = _clutter_actor_compute_resource_scale (priv->parent,
 | 
			
		||||
                                                       resource_scale);
 | 
			
		||||
 | 
			
		||||
          if (in_clone_paint && was_parent_unmapped)
 | 
			
		||||
            {
 | 
			
		||||
              _clutter_actor_set_in_clone_paint (priv->parent,
 | 
			
		||||
                                                 was_parent_in_clone_paint);
 | 
			
		||||
              _clutter_actor_set_enable_paint_unmapped (priv->parent,
 | 
			
		||||
                                                        was_parent_paint_unmapped);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          return ret;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        return FALSE;
 | 
			
		||||
        {
 | 
			
		||||
          return FALSE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
@@ -19770,6 +19853,23 @@ clutter_actor_get_transition (ClutterActor *self,
 | 
			
		||||
  return clos->transition;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_actor_has_transitions: (skip)
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_actor_has_transitions (ClutterActor *self)
 | 
			
		||||
{
 | 
			
		||||
  const ClutterAnimationInfo *info;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
 | 
			
		||||
 | 
			
		||||
  info = _clutter_actor_get_animation_info_or_defaults (self);
 | 
			
		||||
  if (info->transitions == NULL)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  return g_hash_table_size (info->transitions) > 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_actor_save_easing_state:
 | 
			
		||||
 * @self: a #ClutterActor
 | 
			
		||||
@@ -21157,7 +21257,7 @@ clutter_actor_create_texture_paint_node (ClutterActor *self,
 | 
			
		||||
  color.alpha = clutter_actor_get_paint_opacity_internal (self);
 | 
			
		||||
 | 
			
		||||
  node = clutter_texture_node_new (texture, &color, priv->min_filter, priv->mag_filter);
 | 
			
		||||
  clutter_paint_node_set_name (node, "Texture");
 | 
			
		||||
  clutter_paint_node_set_static_name (node, "Texture");
 | 
			
		||||
 | 
			
		||||
  if (priv->content_repeat == CLUTTER_REPEAT_NONE)
 | 
			
		||||
    clutter_paint_node_add_rectangle (node, &box);
 | 
			
		||||
@@ -21178,3 +21278,14 @@ clutter_actor_create_texture_paint_node (ClutterActor *self,
 | 
			
		||||
 | 
			
		||||
  return node;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_actor_has_accessible (ClutterActor *actor)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), FALSE);
 | 
			
		||||
 | 
			
		||||
  if (CLUTTER_ACTOR_GET_CLASS (actor)->has_accessible)
 | 
			
		||||
    return CLUTTER_ACTOR_GET_CLASS (actor)->has_accessible (actor);
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -299,10 +299,11 @@ struct _ClutterActorClass
 | 
			
		||||
 | 
			
		||||
  gboolean (* touch_event)          (ClutterActor         *self,
 | 
			
		||||
                                     ClutterTouchEvent    *event);
 | 
			
		||||
  gboolean (* has_accessible)       (ClutterActor         *self);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  /* padding for future expansion */
 | 
			
		||||
  gpointer _padding_dummy[26];
 | 
			
		||||
  gpointer _padding_dummy[25];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -380,6 +381,8 @@ CLUTTER_EXPORT
 | 
			
		||||
const gchar *                   clutter_actor_get_name                          (ClutterActor                *self);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
AtkObject *                     clutter_actor_get_accessible                    (ClutterActor                *self);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                        clutter_actor_has_accessible                    (ClutterActor                *self);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                        clutter_actor_is_visible                        (ClutterActor                *self);
 | 
			
		||||
@@ -440,10 +443,6 @@ CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_get_allocation_box                (ClutterActor                *self,
 | 
			
		||||
                                                                                 ClutterActorBox             *box);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_get_allocation_vertices           (ClutterActor                *self,
 | 
			
		||||
                                                                                 ClutterActor                *ancestor,
 | 
			
		||||
                                                                                 graphene_point3d_t          *verts);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                        clutter_actor_has_allocation                    (ClutterActor                *self);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_set_size                          (ClutterActor                *self,
 | 
			
		||||
@@ -881,6 +880,11 @@ void                            clutter_actor_set_opacity_override
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gint                            clutter_actor_get_opacity_override              (ClutterActor               *self);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_inhibit_culling                   (ClutterActor               *actor);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_uninhibit_culling                 (ClutterActor               *actor);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterActorCreateChildFunc:
 | 
			
		||||
 * @item: (type GObject): the item in the model
 | 
			
		||||
 
 | 
			
		||||
@@ -27,35 +27,23 @@
 | 
			
		||||
 * @short_description: Interface for animatable classes
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterAnimatable is an interface that allows a #GObject class
 | 
			
		||||
 * to control how a #ClutterAnimation will animate a property.
 | 
			
		||||
 * to control how an actor will animate a property.
 | 
			
		||||
 *
 | 
			
		||||
 * Each #ClutterAnimatable should implement the
 | 
			
		||||
 * #ClutterAnimatableInterface.interpolate_property() virtual function of the
 | 
			
		||||
 * interface to compute the animation state between two values of an interval
 | 
			
		||||
 * depending on a progress factor, expressed as a floating point value.
 | 
			
		||||
 *
 | 
			
		||||
 * If a #ClutterAnimatable is animated by a #ClutterAnimation
 | 
			
		||||
 * instance, the #ClutterAnimation will call
 | 
			
		||||
 * clutter_animatable_interpolate_property() passing the name of the
 | 
			
		||||
 * currently animated property; the values interval; and the progress factor.
 | 
			
		||||
 * The #ClutterAnimatable implementation should return the computed value for
 | 
			
		||||
 * the animated
 | 
			
		||||
 * property.
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterAnimatable is available since Clutter 1.0
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
 | 
			
		||||
#include "clutter-animatable.h"
 | 
			
		||||
#include "clutter-interval.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
 | 
			
		||||
#include "deprecated/clutter-animation.h"
 | 
			
		||||
 | 
			
		||||
G_DEFINE_INTERFACE (ClutterAnimatable, clutter_animatable, G_TYPE_OBJECT);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 
 | 
			
		||||
@@ -42,8 +42,6 @@ G_DECLARE_INTERFACE (ClutterAnimatable, clutter_animatable,
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterAnimatableInterface:
 | 
			
		||||
 * @animate_property: virtual function for custom interpolation of a
 | 
			
		||||
 *   property. This virtual function is deprecated
 | 
			
		||||
 * @find_property: virtual function for retrieving the #GParamSpec of
 | 
			
		||||
 *   an animatable property
 | 
			
		||||
 * @get_initial_state: virtual function for retrieving the initial
 | 
			
		||||
@@ -53,9 +51,6 @@ G_DECLARE_INTERFACE (ClutterAnimatable, clutter_animatable,
 | 
			
		||||
 * @interpolate_value: virtual function for interpolating the progress
 | 
			
		||||
 *   of a property
 | 
			
		||||
 *
 | 
			
		||||
 * Base interface for #GObject<!-- -->s that can be animated by a
 | 
			
		||||
 * a #ClutterAnimation.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterAnimatableInterface
 | 
			
		||||
@@ -64,13 +59,6 @@ struct _ClutterAnimatableInterface
 | 
			
		||||
  GTypeInterface parent_iface;
 | 
			
		||||
 | 
			
		||||
  /*< public >*/
 | 
			
		||||
  gboolean    (* animate_property)  (ClutterAnimatable *animatable,
 | 
			
		||||
                                     ClutterAnimation  *animation,
 | 
			
		||||
                                     const gchar       *property_name,
 | 
			
		||||
                                     const GValue      *initial_value,
 | 
			
		||||
                                     const GValue      *final_value,
 | 
			
		||||
                                     gdouble            progress,
 | 
			
		||||
                                     GValue            *value);
 | 
			
		||||
  GParamSpec *(* find_property)     (ClutterAnimatable *animatable,
 | 
			
		||||
                                     const gchar       *property_name);
 | 
			
		||||
  void        (* get_initial_state) (ClutterAnimatable *animatable,
 | 
			
		||||
 
 | 
			
		||||
@@ -50,8 +50,6 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterConstraint, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterContainer, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDeformEffect, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDesaturateEffect, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDragAction, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDropAction, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterEffect, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterFixedLayout, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterFlowLayout, g_object_unref)
 | 
			
		||||
 
 | 
			
		||||
@@ -54,7 +54,6 @@
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#include "deprecated/clutter-container.h"
 | 
			
		||||
#include "deprecated/clutter-alpha.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-box-layout.h"
 | 
			
		||||
 | 
			
		||||
@@ -78,7 +77,7 @@ struct _ClutterBoxLayoutPrivate
 | 
			
		||||
 | 
			
		||||
  guint spacing;
 | 
			
		||||
 | 
			
		||||
  gulong easing_mode;
 | 
			
		||||
  ClutterAnimationMode easing_mode;
 | 
			
		||||
  guint easing_duration;
 | 
			
		||||
 | 
			
		||||
  ClutterOrientation orientation;
 | 
			
		||||
@@ -1267,7 +1266,7 @@ clutter_box_layout_set_property (GObject      *gobject,
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_EASING_MODE:
 | 
			
		||||
      clutter_box_layout_set_easing_mode (self, g_value_get_ulong (value));
 | 
			
		||||
      clutter_box_layout_set_easing_mode (self, g_value_get_enum (value));
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_EASING_DURATION:
 | 
			
		||||
@@ -1316,7 +1315,7 @@ clutter_box_layout_get_property (GObject    *gobject,
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_EASING_MODE:
 | 
			
		||||
      g_value_set_ulong (value, priv->easing_mode);
 | 
			
		||||
      g_value_set_enum (value, priv->easing_mode);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_EASING_DURATION:
 | 
			
		||||
@@ -1449,11 +1448,6 @@ clutter_box_layout_class_init (ClutterBoxLayoutClass *klass)
 | 
			
		||||
   * The easing mode for the animations, in case
 | 
			
		||||
   * #ClutterBoxLayout:use-animations is set to %TRUE.
 | 
			
		||||
   *
 | 
			
		||||
   * The easing mode has the same semantics of #ClutterAnimation:mode: it can
 | 
			
		||||
   * either be a value from the #ClutterAnimationMode enumeration, like
 | 
			
		||||
   * %CLUTTER_EASE_OUT_CUBIC, or a logical id as returned by
 | 
			
		||||
   * clutter_alpha_register_func().
 | 
			
		||||
   *
 | 
			
		||||
   * The default value is %CLUTTER_EASE_OUT_CUBIC.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.2
 | 
			
		||||
@@ -1462,12 +1456,12 @@ clutter_box_layout_class_init (ClutterBoxLayoutClass *klass)
 | 
			
		||||
   *   the children when allocating them.
 | 
			
		||||
   */
 | 
			
		||||
  obj_props[PROP_EASING_MODE] =
 | 
			
		||||
    g_param_spec_ulong ("easing-mode",
 | 
			
		||||
                        P_("Easing Mode"),
 | 
			
		||||
                        P_("The easing mode of the animations"),
 | 
			
		||||
                        0, G_MAXULONG,
 | 
			
		||||
                        CLUTTER_EASE_OUT_CUBIC,
 | 
			
		||||
                        CLUTTER_PARAM_READWRITE);
 | 
			
		||||
    g_param_spec_enum ("easing-mode",
 | 
			
		||||
                       P_("Easing Mode"),
 | 
			
		||||
                       P_("The easing mode of the animations"),
 | 
			
		||||
                       CLUTTER_TYPE_ANIMATION_MODE,
 | 
			
		||||
                       CLUTTER_EASE_OUT_CUBIC,
 | 
			
		||||
                       CLUTTER_PARAM_READWRITE);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterBoxLayout:easing-duration:
 | 
			
		||||
@@ -2244,8 +2238,7 @@ clutter_box_layout_get_use_animations (ClutterBoxLayout *layout)
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_box_layout_set_easing_mode:
 | 
			
		||||
 * @layout: a #ClutterBoxLayout
 | 
			
		||||
 * @mode: an easing mode, either from #ClutterAnimationMode or a logical id
 | 
			
		||||
 *   from clutter_alpha_register_func()
 | 
			
		||||
 * @mode: a #ClutterAnimationMode
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the easing mode to be used by @layout when animating changes in layout
 | 
			
		||||
 * properties.
 | 
			
		||||
@@ -2256,8 +2249,8 @@ clutter_box_layout_get_use_animations (ClutterBoxLayout *layout)
 | 
			
		||||
 *   of the children when allocating them.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout,
 | 
			
		||||
                                    gulong            mode)
 | 
			
		||||
clutter_box_layout_set_easing_mode (ClutterBoxLayout     *layout,
 | 
			
		||||
                                    ClutterAnimationMode  mode)
 | 
			
		||||
{
 | 
			
		||||
  ClutterBoxLayoutPrivate *priv;
 | 
			
		||||
 | 
			
		||||
@@ -2285,7 +2278,7 @@ clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout,
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12
 | 
			
		||||
 */
 | 
			
		||||
gulong
 | 
			
		||||
ClutterAnimationMode
 | 
			
		||||
clutter_box_layout_get_easing_mode (ClutterBoxLayout *layout)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_BOX_LAYOUT (layout),
 | 
			
		||||
 
 | 
			
		||||
@@ -153,10 +153,10 @@ void                    clutter_box_layout_set_use_animations   (ClutterBoxLayou
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
gboolean                clutter_box_layout_get_use_animations   (ClutterBoxLayout    *layout);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void                    clutter_box_layout_set_easing_mode      (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 gulong               mode);
 | 
			
		||||
void                    clutter_box_layout_set_easing_mode      (ClutterBoxLayout     *layout,
 | 
			
		||||
                                                                 ClutterAnimationMode  mode);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
gulong                  clutter_box_layout_get_easing_mode      (ClutterBoxLayout    *layout);
 | 
			
		||||
ClutterAnimationMode    clutter_box_layout_get_easing_mode      (ClutterBoxLayout    *layout);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void                    clutter_box_layout_set_easing_duration  (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 guint                msecs);
 | 
			
		||||
 
 | 
			
		||||
@@ -352,7 +352,7 @@ clutter_canvas_paint_content (ClutterContent      *content,
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  node = clutter_actor_create_texture_paint_node (actor, priv->texture);
 | 
			
		||||
  clutter_paint_node_set_name (node, "Canvas Content");
 | 
			
		||||
  clutter_paint_node_set_static_name (node, "Canvas Content");
 | 
			
		||||
  clutter_paint_node_add_child (root, node);
 | 
			
		||||
  clutter_paint_node_unref (node);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -238,6 +238,7 @@ click_action_query_long_press (ClutterClickAction *action)
 | 
			
		||||
 | 
			
		||||
  if (result)
 | 
			
		||||
    {
 | 
			
		||||
      g_clear_handle_id (&priv->long_press_id, g_source_remove);
 | 
			
		||||
      priv->long_press_id =
 | 
			
		||||
        clutter_threads_add_timeout (timeout,
 | 
			
		||||
                                     click_action_emit_long_press,
 | 
			
		||||
@@ -467,6 +468,20 @@ clutter_click_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
  CLUTTER_ACTOR_META_CLASS (clutter_click_action_parent_class)->set_actor (meta, actor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_click_action_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                                  gboolean          is_enabled)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickAction *click_action = CLUTTER_CLICK_ACTION (meta);
 | 
			
		||||
  ClutterActorMetaClass *parent_class =
 | 
			
		||||
    CLUTTER_ACTOR_META_CLASS (clutter_click_action_parent_class);
 | 
			
		||||
 | 
			
		||||
  if (!is_enabled)
 | 
			
		||||
    clutter_click_action_release (click_action);
 | 
			
		||||
 | 
			
		||||
  parent_class->set_enabled (meta, is_enabled);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_click_action_set_property (GObject      *gobject,
 | 
			
		||||
                                   guint         prop_id,
 | 
			
		||||
@@ -546,6 +561,7 @@ clutter_click_action_class_init (ClutterClickActionClass *klass)
 | 
			
		||||
  ClutterActorMetaClass *meta_class = CLUTTER_ACTOR_META_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  meta_class->set_actor = clutter_click_action_set_actor;
 | 
			
		||||
  meta_class->set_enabled = clutter_click_action_set_enabled;
 | 
			
		||||
 | 
			
		||||
  gobject_class->dispose = clutter_click_action_dispose;
 | 
			
		||||
  gobject_class->set_property = clutter_click_action_set_property;
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,13 @@
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
@CLUTTER_CONFIG_DEFINES@
 | 
			
		||||
#mesondefine CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT
 | 
			
		||||
#mesondefine CLUTTER_WINDOWING_X11
 | 
			
		||||
#mesondefine CLUTTER_INPUT_X11
 | 
			
		||||
#mesondefine CLUTTER_WINDOWING_GLX
 | 
			
		||||
#mesondefine CLUTTER_WINDOWING_EGL
 | 
			
		||||
#mesondefine CLUTTER_INPUT_EVDEV
 | 
			
		||||
#mesondefine CLUTTER_INPUT_NULL
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -160,28 +160,26 @@ constraint_update_preferred_size (ClutterConstraint  *constraint,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_constraint_notify (GObject    *gobject,
 | 
			
		||||
                           GParamSpec *pspec)
 | 
			
		||||
clutter_constraint_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                                gboolean          is_enabled)
 | 
			
		||||
{
 | 
			
		||||
  if (strcmp (pspec->name, "enabled") == 0)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterActorMeta *meta = CLUTTER_ACTOR_META (gobject);
 | 
			
		||||
      ClutterActor *actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
  ClutterActorMetaClass *parent_class =
 | 
			
		||||
    CLUTTER_ACTOR_META_CLASS (clutter_constraint_parent_class);
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
 | 
			
		||||
      if (actor != NULL)
 | 
			
		||||
        clutter_actor_queue_relayout (actor);
 | 
			
		||||
    }
 | 
			
		||||
  actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
  if (actor)
 | 
			
		||||
    clutter_actor_queue_relayout (actor);
 | 
			
		||||
 | 
			
		||||
  if (G_OBJECT_CLASS (clutter_constraint_parent_class)->notify != NULL)
 | 
			
		||||
    G_OBJECT_CLASS (clutter_constraint_parent_class)->notify (gobject, pspec);
 | 
			
		||||
  parent_class->set_enabled (meta, is_enabled);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_constraint_class_init (ClutterConstraintClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
  ClutterActorMetaClass *actor_meta_class = CLUTTER_ACTOR_META_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  gobject_class->notify = clutter_constraint_notify;
 | 
			
		||||
  actor_meta_class->set_enabled = clutter_constraint_set_enabled;
 | 
			
		||||
 | 
			
		||||
  klass->update_allocation = constraint_update_allocation;
 | 
			
		||||
  klass->update_preferred_size = constraint_update_preferred_size;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										36
									
								
								clutter/clutter/clutter-container-private.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								clutter/clutter/clutter-container-private.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2020 Red Hat, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_CONTAINER_PRIVATE_H__
 | 
			
		||||
#define __CLUTTER_CONTAINER_PRIVATE_H__
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-container.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
void _clutter_container_emit_actor_added   (ClutterContainer *container,
 | 
			
		||||
                                            ClutterActor     *actor);
 | 
			
		||||
void _clutter_container_emit_actor_removed (ClutterContainer *container,
 | 
			
		||||
                                            ClutterActor     *actor);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_CONTAINER_PRIVATE_H__ */
 | 
			
		||||
@@ -37,6 +37,7 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-actor-private.h"
 | 
			
		||||
#include "clutter-child-meta.h"
 | 
			
		||||
#include "clutter-container-private.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-main.h"
 | 
			
		||||
#include "clutter-marshal.h"
 | 
			
		||||
@@ -1250,3 +1251,23 @@ clutter_container_child_notify (ClutterContainer *container,
 | 
			
		||||
                                                         child,
 | 
			
		||||
                                                         pspec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_container_emit_actor_added (ClutterContainer *container,
 | 
			
		||||
                                     ClutterActor     *actor)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_CONTAINER (container));
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ACTOR (actor));
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (container, container_signals[ACTOR_ADDED], 0, actor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_container_emit_actor_removed (ClutterContainer *container,
 | 
			
		||||
                                       ClutterActor     *actor)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_CONTAINER (container));
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ACTOR (actor));
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (container, container_signals[ACTOR_REMOVED], 0, actor);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,14 +4,11 @@
 | 
			
		||||
#define __CLUTTER_DEPRECATED_H_INSIDE__
 | 
			
		||||
 | 
			
		||||
#include "deprecated/clutter-actor.h"
 | 
			
		||||
#include "deprecated/clutter-alpha.h"
 | 
			
		||||
#include "deprecated/clutter-animation.h"
 | 
			
		||||
#include "deprecated/clutter-box.h"
 | 
			
		||||
#include "deprecated/clutter-container.h"
 | 
			
		||||
#include "deprecated/clutter-group.h"
 | 
			
		||||
#include "deprecated/clutter-rectangle.h"
 | 
			
		||||
#include "deprecated/clutter-stage.h"
 | 
			
		||||
#include "deprecated/clutter-state.h"
 | 
			
		||||
#include "deprecated/clutter-timeline.h"
 | 
			
		||||
 | 
			
		||||
#undef __CLUTTER_DEPRECATED_H_INSIDE__
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,152 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010  Intel Corporation.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author:
 | 
			
		||||
 *   Emmanuele Bassi <ebassi@linux.intel.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_DRAG_ACTION_H__
 | 
			
		||||
#define __CLUTTER_DRAG_ACTION_H__
 | 
			
		||||
 | 
			
		||||
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
 | 
			
		||||
#error "Only <clutter/clutter.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-action.h>
 | 
			
		||||
#include <clutter/clutter-event.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_DRAG_ACTION                (clutter_drag_action_get_type ())
 | 
			
		||||
#define CLUTTER_DRAG_ACTION(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_DRAG_ACTION, ClutterDragAction))
 | 
			
		||||
#define CLUTTER_IS_DRAG_ACTION(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_DRAG_ACTION))
 | 
			
		||||
#define CLUTTER_DRAG_ACTION_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_DRAG_ACTION, ClutterDragActionClass))
 | 
			
		||||
#define CLUTTER_IS_DRAG_ACTION_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_DRAG_ACTION))
 | 
			
		||||
#define CLUTTER_DRAG_ACTION_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_DRAG_ACTION, ClutterDragActionClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterDragAction               ClutterDragAction;
 | 
			
		||||
typedef struct _ClutterDragActionPrivate        ClutterDragActionPrivate;
 | 
			
		||||
typedef struct _ClutterDragActionClass          ClutterDragActionClass;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterDragAction:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterDragAction structure contains only
 | 
			
		||||
 * private data and should be accessed using the provided API
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterDragAction
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  ClutterAction parent_instance;
 | 
			
		||||
 | 
			
		||||
  ClutterDragActionPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterDragActionClass:
 | 
			
		||||
 * @drag_begin: class handler of the #ClutterDragAction::drag-begin signal
 | 
			
		||||
 * @drag_motion: class handler of the #ClutterDragAction::drag-motion signal
 | 
			
		||||
 * @drag_end: class handler of the #ClutterDragAction::drag-end signal
 | 
			
		||||
 * @drag_progress: class handler of the #ClutterDragAction::drag-progress signal
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterDragActionClass structure contains
 | 
			
		||||
 * only private data
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterDragActionClass
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  ClutterActionClass parent_class;
 | 
			
		||||
 | 
			
		||||
  /*< public >*/
 | 
			
		||||
  void          (* drag_begin)          (ClutterDragAction   *action,
 | 
			
		||||
                                         ClutterActor        *actor,
 | 
			
		||||
                                         gfloat               event_x,
 | 
			
		||||
                                         gfloat               event_y,
 | 
			
		||||
                                         ClutterModifierType  modifiers);
 | 
			
		||||
  void          (* drag_motion)         (ClutterDragAction   *action,
 | 
			
		||||
                                         ClutterActor        *actor,
 | 
			
		||||
                                         gfloat               delta_x,
 | 
			
		||||
                                         gfloat               delta_y);
 | 
			
		||||
  void          (* drag_end)            (ClutterDragAction   *action,
 | 
			
		||||
                                         ClutterActor        *actor,
 | 
			
		||||
                                         gfloat               event_x,
 | 
			
		||||
                                         gfloat               event_y,
 | 
			
		||||
                                         ClutterModifierType  modifiers);
 | 
			
		||||
  gboolean      (* drag_progress)       (ClutterDragAction   *action,
 | 
			
		||||
                                         ClutterActor        *actor,
 | 
			
		||||
                                         gfloat               delta_x,
 | 
			
		||||
                                         gfloat               delta_y);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  void (* _clutter_drag_action1) (void);
 | 
			
		||||
  void (* _clutter_drag_action2) (void);
 | 
			
		||||
  void (* _clutter_drag_action3) (void);
 | 
			
		||||
  void (* _clutter_drag_action4) (void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_drag_action_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterAction * clutter_drag_action_new                   (void);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_set_drag_threshold (ClutterDragAction *action,
 | 
			
		||||
                                                        gint               x_threshold,
 | 
			
		||||
                                                        gint               y_threshold);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_get_drag_threshold (ClutterDragAction *action,
 | 
			
		||||
                                                        guint             *x_threshold,
 | 
			
		||||
                                                        guint             *y_threshold);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_set_drag_handle    (ClutterDragAction *action,
 | 
			
		||||
                                                        ClutterActor      *handle);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterActor *  clutter_drag_action_get_drag_handle    (ClutterDragAction *action);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_set_drag_axis      (ClutterDragAction *action,
 | 
			
		||||
                                                        ClutterDragAxis    axis);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterDragAxis clutter_drag_action_get_drag_axis      (ClutterDragAction *action);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_get_press_coords   (ClutterDragAction *action,
 | 
			
		||||
                                                        gfloat            *press_x,
 | 
			
		||||
                                                        gfloat            *press_y);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_get_motion_coords  (ClutterDragAction *action,
 | 
			
		||||
                                                        gfloat            *motion_x,
 | 
			
		||||
                                                        gfloat            *motion_y);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        clutter_drag_action_get_drag_area      (ClutterDragAction *action,
 | 
			
		||||
                                                        graphene_rect_t   *drag_area);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_set_drag_area      (ClutterDragAction     *action,
 | 
			
		||||
                                                        const graphene_rect_t *drag_area);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_DRAG_ACTION_H__ */
 | 
			
		||||
@@ -1,527 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright © 2011  Intel Corporation.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author:
 | 
			
		||||
 *   Emmanuele Bassi <ebassi@linux.intel.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:clutter-drop-action
 | 
			
		||||
 * @Title: ClutterDropAction
 | 
			
		||||
 * @short_description: An action for drop targets
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterDropAction is a #ClutterAction that allows a #ClutterActor
 | 
			
		||||
 * implementation to control what happens when an actor dragged using
 | 
			
		||||
 * a #ClutterDragAction crosses the target area or when a dragged actor
 | 
			
		||||
 * is released (or "dropped") on the target area.
 | 
			
		||||
 *
 | 
			
		||||
 * A trivial use of #ClutterDropAction consists in connecting to the
 | 
			
		||||
 * #ClutterDropAction::drop signal and handling the drop from there,
 | 
			
		||||
 * for instance:
 | 
			
		||||
 *
 | 
			
		||||
 * |[<!-- language="C" -->
 | 
			
		||||
 *   ClutterAction *action = clutter_drop_action ();
 | 
			
		||||
 *
 | 
			
		||||
 *   g_signal_connect (action, "drop", G_CALLBACK (on_drop), NULL);
 | 
			
		||||
 *   clutter_actor_add_action (an_actor, action);
 | 
			
		||||
 * ]|
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterDropAction::can-drop can be used to control whether the
 | 
			
		||||
 * #ClutterDropAction::drop signal is going to be emitted; returning %FALSE
 | 
			
		||||
 * from a handler connected to the #ClutterDropAction::can-drop signal will
 | 
			
		||||
 * cause the #ClutterDropAction::drop signal to be skipped when the input
 | 
			
		||||
 * device button is released.
 | 
			
		||||
 *
 | 
			
		||||
 * It's important to note that #ClutterDropAction will only work with
 | 
			
		||||
 * actors dragged using #ClutterDragAction.
 | 
			
		||||
 *
 | 
			
		||||
 * See [drop-action.c](https://git.gnome.org/browse/clutter/tree/examples/drop-action.c?h=clutter-1.18)
 | 
			
		||||
 * for an example of how to use #ClutterDropAction.
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterDropAction is available since Clutter 1.8
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-drop-action.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-actor-meta-private.h"
 | 
			
		||||
#include "clutter-actor-private.h"
 | 
			
		||||
#include "clutter-drag-action.h"
 | 
			
		||||
#include "clutter-main.h"
 | 
			
		||||
#include "clutter-marshal.h"
 | 
			
		||||
#include "clutter-stage-private.h"
 | 
			
		||||
 | 
			
		||||
struct _ClutterDropActionPrivate
 | 
			
		||||
{
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  ClutterActor *stage;
 | 
			
		||||
 | 
			
		||||
  gulong mapped_id;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct _DropTarget {
 | 
			
		||||
  ClutterActor *stage;
 | 
			
		||||
 | 
			
		||||
  gulong capture_id;
 | 
			
		||||
 | 
			
		||||
  GHashTable *actions;
 | 
			
		||||
 | 
			
		||||
  ClutterDropAction *last_action;
 | 
			
		||||
} DropTarget;
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
  CAN_DROP,
 | 
			
		||||
  OVER_IN,
 | 
			
		||||
  OVER_OUT,
 | 
			
		||||
  DROP,
 | 
			
		||||
  DROP_CANCEL,
 | 
			
		||||
 | 
			
		||||
  LAST_SIGNAL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static guint drop_signals[LAST_SIGNAL] = { 0, };
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE_WITH_PRIVATE (ClutterDropAction, clutter_drop_action, CLUTTER_TYPE_ACTION)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
drop_target_free (gpointer _data)
 | 
			
		||||
{
 | 
			
		||||
  DropTarget *data = _data;
 | 
			
		||||
 | 
			
		||||
  g_clear_signal_handler (&data->capture_id, data->stage);
 | 
			
		||||
  g_hash_table_destroy (data->actions);
 | 
			
		||||
  g_free (data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
on_stage_capture (ClutterStage *stage,
 | 
			
		||||
                  ClutterEvent *event,
 | 
			
		||||
                  gpointer      user_data)
 | 
			
		||||
{
 | 
			
		||||
  DropTarget *data = user_data;
 | 
			
		||||
  gfloat event_x, event_y;
 | 
			
		||||
  ClutterActor *actor, *drag_actor;
 | 
			
		||||
  ClutterDropAction *drop_action;
 | 
			
		||||
  ClutterInputDevice *device;
 | 
			
		||||
  gboolean was_reactive;
 | 
			
		||||
 | 
			
		||||
  switch (clutter_event_type (event))
 | 
			
		||||
    {
 | 
			
		||||
    case CLUTTER_MOTION:
 | 
			
		||||
    case CLUTTER_BUTTON_RELEASE:
 | 
			
		||||
      if (clutter_event_type (event) == CLUTTER_MOTION &&
 | 
			
		||||
          !(clutter_event_get_state (event) & CLUTTER_BUTTON1_MASK))
 | 
			
		||||
        return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
      if (clutter_event_type (event) == CLUTTER_BUTTON_RELEASE &&
 | 
			
		||||
          clutter_event_get_button (event) != CLUTTER_BUTTON_PRIMARY)
 | 
			
		||||
        return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
      device = clutter_event_get_device (event);
 | 
			
		||||
      drag_actor = _clutter_stage_get_pointer_drag_actor (stage, device);
 | 
			
		||||
      if (drag_actor == NULL)
 | 
			
		||||
        return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case CLUTTER_TOUCH_UPDATE:
 | 
			
		||||
    case CLUTTER_TOUCH_END:
 | 
			
		||||
      drag_actor = _clutter_stage_get_touch_drag_actor (stage,
 | 
			
		||||
                                                        clutter_event_get_event_sequence (event));
 | 
			
		||||
      if (drag_actor == NULL)
 | 
			
		||||
        return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  clutter_event_get_coords (event, &event_x, &event_y);
 | 
			
		||||
 | 
			
		||||
  /* get the actor under the cursor, excluding the dragged actor; we
 | 
			
		||||
   * use reactivity because it won't cause any scene invalidation
 | 
			
		||||
   */
 | 
			
		||||
  was_reactive = clutter_actor_get_reactive (drag_actor);
 | 
			
		||||
  clutter_actor_set_reactive (drag_actor, FALSE);
 | 
			
		||||
 | 
			
		||||
  actor = clutter_stage_get_actor_at_pos (stage, CLUTTER_PICK_REACTIVE,
 | 
			
		||||
                                          event_x,
 | 
			
		||||
                                          event_y);
 | 
			
		||||
  if (actor == NULL || actor == CLUTTER_ACTOR (stage))
 | 
			
		||||
    {
 | 
			
		||||
      if (data->last_action != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          ClutterActorMeta *meta = CLUTTER_ACTOR_META (data->last_action);
 | 
			
		||||
 | 
			
		||||
          g_signal_emit (data->last_action, drop_signals[OVER_OUT], 0,
 | 
			
		||||
                         clutter_actor_meta_get_actor (meta));
 | 
			
		||||
 | 
			
		||||
          data->last_action = NULL;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  drop_action = g_hash_table_lookup (data->actions, actor);
 | 
			
		||||
 | 
			
		||||
  if (drop_action == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      if (data->last_action != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          ClutterActorMeta *meta = CLUTTER_ACTOR_META (data->last_action);
 | 
			
		||||
 | 
			
		||||
          g_signal_emit (data->last_action, drop_signals[OVER_OUT], 0,
 | 
			
		||||
                         clutter_actor_meta_get_actor (meta));
 | 
			
		||||
 | 
			
		||||
          data->last_action = NULL;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      goto out;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      if (data->last_action != drop_action)
 | 
			
		||||
        {
 | 
			
		||||
          ClutterActorMeta *meta;
 | 
			
		||||
 | 
			
		||||
          if (data->last_action != NULL)
 | 
			
		||||
            {
 | 
			
		||||
              meta = CLUTTER_ACTOR_META (data->last_action);
 | 
			
		||||
 | 
			
		||||
              g_signal_emit (data->last_action, drop_signals[OVER_OUT], 0,
 | 
			
		||||
                             clutter_actor_meta_get_actor (meta));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          meta = CLUTTER_ACTOR_META (drop_action);
 | 
			
		||||
 | 
			
		||||
          g_signal_emit (drop_action, drop_signals[OVER_IN], 0,
 | 
			
		||||
                         clutter_actor_meta_get_actor (meta));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      data->last_action = drop_action;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
  if (clutter_event_type (event) == CLUTTER_BUTTON_RELEASE ||
 | 
			
		||||
      clutter_event_type (event) == CLUTTER_TOUCH_END)
 | 
			
		||||
    {
 | 
			
		||||
      if (data->last_action != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          ClutterActorMeta *meta = CLUTTER_ACTOR_META (data->last_action);
 | 
			
		||||
          gboolean can_drop = FALSE;
 | 
			
		||||
 | 
			
		||||
          g_signal_emit (data->last_action, drop_signals[CAN_DROP], 0,
 | 
			
		||||
                         clutter_actor_meta_get_actor (meta),
 | 
			
		||||
                         event_x, event_y,
 | 
			
		||||
                         &can_drop);
 | 
			
		||||
 | 
			
		||||
          if (can_drop)
 | 
			
		||||
            {
 | 
			
		||||
              g_signal_emit (data->last_action, drop_signals[DROP], 0,
 | 
			
		||||
                             clutter_actor_meta_get_actor (meta),
 | 
			
		||||
                             event_x, event_y);
 | 
			
		||||
            }
 | 
			
		||||
	  else
 | 
			
		||||
            {
 | 
			
		||||
              g_signal_emit (data->last_action, drop_signals[DROP_CANCEL], 0,
 | 
			
		||||
                             clutter_actor_meta_get_actor (meta),
 | 
			
		||||
                             event_x, event_y);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      data->last_action = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (drag_actor != NULL)
 | 
			
		||||
    clutter_actor_set_reactive (drag_actor, was_reactive);
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
drop_action_register (ClutterDropAction *self)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDropActionPrivate *priv = self->priv;
 | 
			
		||||
  DropTarget *data;
 | 
			
		||||
 | 
			
		||||
  g_assert (priv->stage != NULL);
 | 
			
		||||
 | 
			
		||||
  data = g_object_get_data (G_OBJECT (priv->stage), "__clutter_drop_targets");
 | 
			
		||||
  if (data == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      data = g_new0 (DropTarget, 1);
 | 
			
		||||
 | 
			
		||||
      data->stage = priv->stage;
 | 
			
		||||
      data->actions = g_hash_table_new (NULL, NULL);
 | 
			
		||||
      data->capture_id = g_signal_connect (priv->stage, "captured-event",
 | 
			
		||||
                                           G_CALLBACK (on_stage_capture),
 | 
			
		||||
                                           data);
 | 
			
		||||
      g_object_set_data_full (G_OBJECT (priv->stage), "__clutter_drop_targets",
 | 
			
		||||
                              data,
 | 
			
		||||
                              drop_target_free);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_hash_table_replace (data->actions, priv->actor, self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
drop_action_unregister (ClutterDropAction *self)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDropActionPrivate *priv = self->priv;
 | 
			
		||||
  DropTarget *data = NULL;
 | 
			
		||||
 | 
			
		||||
  if (priv->stage != NULL)
 | 
			
		||||
    data = g_object_get_data (G_OBJECT (priv->stage), "__clutter_drop_targets");
 | 
			
		||||
 | 
			
		||||
  if (data == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  g_hash_table_remove (data->actions, priv->actor);
 | 
			
		||||
  if (g_hash_table_size (data->actions) == 0)
 | 
			
		||||
    g_object_set_data (G_OBJECT (data->stage), "__clutter_drop_targets", NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_actor_mapped (ClutterActor      *actor,
 | 
			
		||||
                 GParamSpec        *pspec,
 | 
			
		||||
                 ClutterDropAction *self)
 | 
			
		||||
{
 | 
			
		||||
  if (clutter_actor_is_mapped (actor))
 | 
			
		||||
    {
 | 
			
		||||
      if (self->priv->stage == NULL)
 | 
			
		||||
        self->priv->stage = clutter_actor_get_stage (actor);
 | 
			
		||||
 | 
			
		||||
      drop_action_register (self);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    drop_action_unregister (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_drop_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
                               ClutterActor     *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDropActionPrivate *priv = CLUTTER_DROP_ACTION (meta)->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->actor != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      drop_action_unregister (CLUTTER_DROP_ACTION (meta));
 | 
			
		||||
 | 
			
		||||
      g_clear_signal_handler (&priv->mapped_id, priv->actor);
 | 
			
		||||
 | 
			
		||||
      priv->stage = NULL;
 | 
			
		||||
      priv->actor = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->actor = actor;
 | 
			
		||||
 | 
			
		||||
  if (priv->actor != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      priv->stage = clutter_actor_get_stage (actor);
 | 
			
		||||
      priv->mapped_id = g_signal_connect (actor, "notify::mapped",
 | 
			
		||||
                                          G_CALLBACK (on_actor_mapped),
 | 
			
		||||
                                          meta);
 | 
			
		||||
 | 
			
		||||
      if (priv->stage != NULL)
 | 
			
		||||
        drop_action_register (CLUTTER_DROP_ACTION (meta));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  CLUTTER_ACTOR_META_CLASS (clutter_drop_action_parent_class)->set_actor (meta, actor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
signal_accumulator (GSignalInvocationHint *ihint,
 | 
			
		||||
                    GValue                *return_accu,
 | 
			
		||||
                    const GValue          *handler_return,
 | 
			
		||||
                    gpointer               user_data)
 | 
			
		||||
{
 | 
			
		||||
  gboolean continue_emission;
 | 
			
		||||
 | 
			
		||||
  continue_emission = g_value_get_boolean (handler_return);
 | 
			
		||||
  g_value_set_boolean (return_accu, continue_emission);
 | 
			
		||||
 | 
			
		||||
  return continue_emission;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_drop_action_real_can_drop (ClutterDropAction *action,
 | 
			
		||||
                                   ClutterActor      *actor,
 | 
			
		||||
                                   gfloat             event_x,
 | 
			
		||||
                                   gfloat             event_y)
 | 
			
		||||
{
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_drop_action_class_init (ClutterDropActionClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaClass *meta_class = CLUTTER_ACTOR_META_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  meta_class->set_actor = clutter_drop_action_set_actor;
 | 
			
		||||
 | 
			
		||||
  klass->can_drop = clutter_drop_action_real_can_drop;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDropAction::can-drop:
 | 
			
		||||
   * @action: the #ClutterDropAction that emitted the signal
 | 
			
		||||
   * @actor: the #ClutterActor attached to the @action
 | 
			
		||||
   * @event_x: the X coordinate (in stage space) of the drop event
 | 
			
		||||
   * @event_y: the Y coordinate (in stage space) of the drop event
 | 
			
		||||
   *
 | 
			
		||||
   * The ::can-drop signal is emitted when the dragged actor is dropped
 | 
			
		||||
   * on @actor. The return value of the ::can-drop signal will determine
 | 
			
		||||
   * whether or not the #ClutterDropAction::drop signal is going to be
 | 
			
		||||
   * emitted on @action.
 | 
			
		||||
   *
 | 
			
		||||
   * The default implementation of #ClutterDropAction returns %TRUE for
 | 
			
		||||
   * this signal.
 | 
			
		||||
   *
 | 
			
		||||
   * Return value: %TRUE if the drop is accepted, and %FALSE otherwise
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.8
 | 
			
		||||
   */
 | 
			
		||||
  drop_signals[CAN_DROP] =
 | 
			
		||||
    g_signal_new (I_("can-drop"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterDropActionClass, can_drop),
 | 
			
		||||
                  signal_accumulator, NULL,
 | 
			
		||||
                  _clutter_marshal_BOOLEAN__OBJECT_FLOAT_FLOAT,
 | 
			
		||||
                  G_TYPE_BOOLEAN, 3,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR,
 | 
			
		||||
                  G_TYPE_FLOAT,
 | 
			
		||||
                  G_TYPE_FLOAT);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDropAction::over-in:
 | 
			
		||||
   * @action: the #ClutterDropAction that emitted the signal
 | 
			
		||||
   * @actor: the #ClutterActor attached to the @action
 | 
			
		||||
   *
 | 
			
		||||
   * The ::over-in signal is emitted when the dragged actor crosses
 | 
			
		||||
   * into @actor.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.8
 | 
			
		||||
   */
 | 
			
		||||
  drop_signals[OVER_IN] =
 | 
			
		||||
    g_signal_new (I_("over-in"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterDropActionClass, over_in),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDropAction::over-out:
 | 
			
		||||
   * @action: the #ClutterDropAction that emitted the signal
 | 
			
		||||
   * @actor: the #ClutterActor attached to the @action
 | 
			
		||||
   *
 | 
			
		||||
   * The ::over-out signal is emitted when the dragged actor crosses
 | 
			
		||||
   * outside @actor.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.8
 | 
			
		||||
   */
 | 
			
		||||
  drop_signals[OVER_OUT] =
 | 
			
		||||
    g_signal_new (I_("over-out"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterDropActionClass, over_out),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDropAction::drop:
 | 
			
		||||
   * @action: the #ClutterDropAction that emitted the signal
 | 
			
		||||
   * @actor: the #ClutterActor attached to the @action
 | 
			
		||||
   * @event_x: the X coordinate (in stage space) of the drop event
 | 
			
		||||
   * @event_y: the Y coordinate (in stage space) of the drop event
 | 
			
		||||
   *
 | 
			
		||||
   * The ::drop signal is emitted when the dragged actor is dropped
 | 
			
		||||
   * on @actor. This signal is only emitted if at least an handler of
 | 
			
		||||
   * #ClutterDropAction::can-drop returns %TRUE.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.8
 | 
			
		||||
   */
 | 
			
		||||
  drop_signals[DROP] =
 | 
			
		||||
    g_signal_new (I_("drop"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterDropActionClass, drop),
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT_FLOAT_FLOAT,
 | 
			
		||||
                  G_TYPE_NONE, 3,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR,
 | 
			
		||||
                  G_TYPE_FLOAT,
 | 
			
		||||
                  G_TYPE_FLOAT);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDropAction::drop-cancel:
 | 
			
		||||
   * @action: the #ClutterDropAction that emitted the signal
 | 
			
		||||
   * @actor: the #ClutterActor attached to the @action
 | 
			
		||||
   * @event_x: the X coordinate (in stage space) of the drop event
 | 
			
		||||
   * @event_y: the Y coordinate (in stage space) of the drop event
 | 
			
		||||
   *
 | 
			
		||||
   * The ::drop-cancel signal is emitted when the drop is refused
 | 
			
		||||
   * by an emission of the #ClutterDropAction::can-drop signal.
 | 
			
		||||
   *
 | 
			
		||||
   * After the ::drop-cancel signal is fired the active drag is
 | 
			
		||||
   * terminated.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.12
 | 
			
		||||
   */
 | 
			
		||||
  drop_signals[DROP_CANCEL] =
 | 
			
		||||
    g_signal_new (I_("drop-cancel"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterDropActionClass, drop),
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT_FLOAT_FLOAT,
 | 
			
		||||
                  G_TYPE_NONE, 3,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR,
 | 
			
		||||
                  G_TYPE_FLOAT,
 | 
			
		||||
                  G_TYPE_FLOAT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_drop_action_init (ClutterDropAction *self)
 | 
			
		||||
{
 | 
			
		||||
  self->priv = clutter_drop_action_get_instance_private (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_drop_action_new:
 | 
			
		||||
 *
 | 
			
		||||
 * Creates a new #ClutterDropAction.
 | 
			
		||||
 *
 | 
			
		||||
 * Use clutter_actor_add_action() to add the action to a #ClutterActor.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: the newly created #ClutterDropAction
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 */
 | 
			
		||||
ClutterAction *
 | 
			
		||||
clutter_drop_action_new (void)
 | 
			
		||||
{
 | 
			
		||||
  return g_object_new (CLUTTER_TYPE_DROP_ACTION, NULL);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,115 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright © 2011  Intel Corporation.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author:
 | 
			
		||||
 *   Emmanuele Bassi <ebassi@linux.intel.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_DROP_ACTION_H__
 | 
			
		||||
#define __CLUTTER_DROP_ACTION_H__
 | 
			
		||||
 | 
			
		||||
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
 | 
			
		||||
#error "Only <clutter/clutter.h> can be directly included."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-action.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_DROP_ACTION                (clutter_drop_action_get_type ())
 | 
			
		||||
#define CLUTTER_DROP_ACTION(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_DROP_ACTION, ClutterDropAction))
 | 
			
		||||
#define CLUTTER_IS_DROP_ACTION(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_DROP_ACTION))
 | 
			
		||||
#define CLUTTER_DROP_ACTION_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_DROP_ACTION, ClutterDropActionClass))
 | 
			
		||||
#define CLUTTER_IS_DROP_ACTION_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_DROP_ACTION))
 | 
			
		||||
#define CLUTTER_DROP_ACTION_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_DROP_ACTION, ClutterDropActionClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterDropAction               ClutterDropAction;
 | 
			
		||||
typedef struct _ClutterDropActionPrivate        ClutterDropActionPrivate;
 | 
			
		||||
typedef struct _ClutterDropActionClass          ClutterDropActionClass;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterDropAction:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterDropAction structure contains only
 | 
			
		||||
 * private data and should be accessed using the provided API.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterDropAction
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  ClutterAction parent_instance;
 | 
			
		||||
 | 
			
		||||
  ClutterDropActionPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterDropActionClass:
 | 
			
		||||
 * @can_drop: class handler for the #ClutterDropAction::can-drop signal
 | 
			
		||||
 * @over_in: class handler for the #ClutterDropAction::over-in signal
 | 
			
		||||
 * @over_out: class handler for the #ClutterDropAction::over-out signal
 | 
			
		||||
 * @drop: class handler for the #ClutterDropAction::drop signal
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterDropActionClass structure contains
 | 
			
		||||
 * only private data.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterDropActionClass
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  ClutterActionClass parent_class;
 | 
			
		||||
 | 
			
		||||
  /*< public >*/
 | 
			
		||||
  gboolean (* can_drop) (ClutterDropAction *action,
 | 
			
		||||
                         ClutterActor      *actor,
 | 
			
		||||
                         gfloat             event_x,
 | 
			
		||||
                         gfloat             event_y);
 | 
			
		||||
 | 
			
		||||
  void     (* over_in)  (ClutterDropAction *action,
 | 
			
		||||
                         ClutterActor      *actor);
 | 
			
		||||
  void     (* over_out) (ClutterDropAction *action,
 | 
			
		||||
                         ClutterActor      *actor);
 | 
			
		||||
 | 
			
		||||
  void     (* drop)     (ClutterDropAction *action,
 | 
			
		||||
                         ClutterActor      *actor,
 | 
			
		||||
                         gfloat             event_x,
 | 
			
		||||
                         gfloat             event_y);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  void (*_clutter_drop_action1) (void);
 | 
			
		||||
  void (*_clutter_drop_action2) (void);
 | 
			
		||||
  void (*_clutter_drop_action3) (void);
 | 
			
		||||
  void (*_clutter_drop_action4) (void);
 | 
			
		||||
  void (*_clutter_drop_action5) (void);
 | 
			
		||||
  void (*_clutter_drop_action6) (void);
 | 
			
		||||
  void (*_clutter_drop_action7) (void);
 | 
			
		||||
  void (*_clutter_drop_action8) (void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_drop_action_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterAction *         clutter_drop_action_new         (void);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_DROP_ACTION_H__ */
 | 
			
		||||
@@ -230,28 +230,26 @@ clutter_effect_real_pick (ClutterEffect      *effect,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_effect_notify (GObject    *gobject,
 | 
			
		||||
                       GParamSpec *pspec)
 | 
			
		||||
clutter_effect_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                            gboolean          is_enabled)
 | 
			
		||||
{
 | 
			
		||||
  if (strcmp (pspec->name, "enabled") == 0)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterActorMeta *meta = CLUTTER_ACTOR_META (gobject);
 | 
			
		||||
      ClutterActor *actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
  ClutterActorMetaClass *parent_class =
 | 
			
		||||
    CLUTTER_ACTOR_META_CLASS (clutter_effect_parent_class);
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
 | 
			
		||||
      if (actor != NULL)
 | 
			
		||||
        clutter_actor_queue_redraw (actor);
 | 
			
		||||
    }
 | 
			
		||||
  actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
  if (actor)
 | 
			
		||||
    clutter_actor_queue_redraw (actor);
 | 
			
		||||
 | 
			
		||||
  if (G_OBJECT_CLASS (clutter_effect_parent_class)->notify != NULL)
 | 
			
		||||
    G_OBJECT_CLASS (clutter_effect_parent_class)->notify (gobject, pspec);
 | 
			
		||||
  parent_class->set_enabled (meta, is_enabled);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_effect_class_init (ClutterEffectClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
  ClutterActorMetaClass *actor_meta_class = CLUTTER_ACTOR_META_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  gobject_class->notify = clutter_effect_notify;
 | 
			
		||||
  actor_meta_class->set_enabled = clutter_effect_set_enabled;
 | 
			
		||||
 | 
			
		||||
  klass->pre_paint = clutter_effect_real_pre_paint;
 | 
			
		||||
  klass->post_paint = clutter_effect_real_post_paint;
 | 
			
		||||
 
 | 
			
		||||
@@ -190,7 +190,7 @@ typedef enum /*< prefix=CLUTTER_REQUEST >*/
 | 
			
		||||
 * @CLUTTER_ANIMATION_LAST: last animation mode, used as a guard for
 | 
			
		||||
 *   registered global alpha functions
 | 
			
		||||
 *
 | 
			
		||||
 * The animation modes used by #ClutterAlpha and #ClutterAnimation. This
 | 
			
		||||
 * The animation modes used by #ClutterAnimatable. This
 | 
			
		||||
 * enumeration can be expanded in later versions of Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * <figure id="easing-modes">
 | 
			
		||||
@@ -538,6 +538,10 @@ typedef enum /*< prefix=CLUTTER_ACTOR >*/
 | 
			
		||||
 *   virtual returns %TRUE.
 | 
			
		||||
 * @CLUTTER_OFFSCREEN_REDIRECT_ALWAYS: Always redirect the actor to an
 | 
			
		||||
 *   offscreen buffer even if it is fully opaque.
 | 
			
		||||
 * @CLUTTER_OFFSCREEN_REDIRECT_ON_IDLE: Only redirect the actor if it is the
 | 
			
		||||
 *   most efficient thing to do based on its recent repaint behaviour. That
 | 
			
		||||
 *   means when its contents are changing less frequently than it's being used
 | 
			
		||||
 *   on stage.
 | 
			
		||||
 *
 | 
			
		||||
 * Possible flags to pass to clutter_actor_set_offscreen_redirect().
 | 
			
		||||
 *
 | 
			
		||||
@@ -545,8 +549,9 @@ typedef enum /*< prefix=CLUTTER_ACTOR >*/
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_OFFSCREEN_REDIRECT >*/
 | 
			
		||||
{
 | 
			
		||||
  CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY = 1<<0,
 | 
			
		||||
  CLUTTER_OFFSCREEN_REDIRECT_ALWAYS = 1<<1
 | 
			
		||||
  CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY = 1 << 0,
 | 
			
		||||
  CLUTTER_OFFSCREEN_REDIRECT_ALWAYS                = 1 << 1,
 | 
			
		||||
  CLUTTER_OFFSCREEN_REDIRECT_ON_IDLE               = 1 << 2
 | 
			
		||||
} ClutterOffscreenRedirect;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -673,12 +678,15 @@ typedef enum /*< prefix=CLUTTER_BIND >*/
 | 
			
		||||
 *   has queued a redraw before this paint. This implies that the effect
 | 
			
		||||
 *   should call clutter_actor_continue_paint() to chain to the next
 | 
			
		||||
 *   effect and can not cache any results from a previous paint.
 | 
			
		||||
 * @CLUTTER_EFFECT_PAINT_BYPASS_EFFECT: The effect should not be used
 | 
			
		||||
 *   on this frame, but it will be asked to paint the actor still.
 | 
			
		||||
 *
 | 
			
		||||
 * Flags passed to the ‘paint’ or ‘pick’ method of #ClutterEffect.
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_EFFECT_PAINT >*/
 | 
			
		||||
{
 | 
			
		||||
  CLUTTER_EFFECT_PAINT_ACTOR_DIRTY = (1 << 0)
 | 
			
		||||
  CLUTTER_EFFECT_PAINT_ACTOR_DIRTY   = (1 << 0),
 | 
			
		||||
  CLUTTER_EFFECT_PAINT_BYPASS_EFFECT = (1 << 1)
 | 
			
		||||
} ClutterEffectPaintFlags;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -556,6 +556,21 @@ clutter_gesture_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
  meta_class->set_actor (meta, actor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_gesture_action_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                                    gboolean          is_enabled)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaClass *meta_class =
 | 
			
		||||
    CLUTTER_ACTOR_META_CLASS (clutter_gesture_action_parent_class);
 | 
			
		||||
  ClutterGestureAction *gesture_action = CLUTTER_GESTURE_ACTION (meta);
 | 
			
		||||
  ClutterGestureActionPrivate *priv = gesture_action->priv;
 | 
			
		||||
 | 
			
		||||
  if (!is_enabled && priv->in_gesture)
 | 
			
		||||
    cancel_gesture (gesture_action);
 | 
			
		||||
 | 
			
		||||
  meta_class->set_enabled (meta, is_enabled);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
default_event_handler (ClutterGestureAction *action,
 | 
			
		||||
                       ClutterActor *actor)
 | 
			
		||||
@@ -654,6 +669,7 @@ clutter_gesture_action_class_init (ClutterGestureActionClass *klass)
 | 
			
		||||
  gobject_class->get_property = clutter_gesture_action_get_property;
 | 
			
		||||
 | 
			
		||||
  meta_class->set_actor = clutter_gesture_action_set_actor;
 | 
			
		||||
  meta_class->set_enabled = clutter_gesture_action_set_enabled;
 | 
			
		||||
 | 
			
		||||
  klass->gesture_begin = default_event_handler;
 | 
			
		||||
  klass->gesture_progress = default_event_handler;
 | 
			
		||||
 
 | 
			
		||||
@@ -130,7 +130,7 @@ clutter_image_paint_content (ClutterContent      *content,
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  node = clutter_actor_create_texture_paint_node (actor, priv->texture);
 | 
			
		||||
  clutter_paint_node_set_name (node, "Image Content");
 | 
			
		||||
  clutter_paint_node_set_static_name (node, "Image Content");
 | 
			
		||||
  clutter_paint_node_add_child (root, node);
 | 
			
		||||
  clutter_paint_node_unref (node);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ void clutter_input_focus_focus_out (ClutterInputFocus  *focus);
 | 
			
		||||
void clutter_input_focus_commit (ClutterInputFocus *focus,
 | 
			
		||||
                                 const gchar       *text);
 | 
			
		||||
void clutter_input_focus_delete_surrounding (ClutterInputFocus *focus,
 | 
			
		||||
                                             guint              offset,
 | 
			
		||||
                                             int                offset,
 | 
			
		||||
                                             guint              len);
 | 
			
		||||
void clutter_input_focus_request_surrounding (ClutterInputFocus *focus);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -217,7 +217,7 @@ clutter_input_focus_commit (ClutterInputFocus *focus,
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_delete_surrounding (ClutterInputFocus *focus,
 | 
			
		||||
                                        guint              offset,
 | 
			
		||||
                                        int                offset,
 | 
			
		||||
                                        guint              len)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ struct _ClutterInputFocusClass
 | 
			
		||||
 | 
			
		||||
  void (* request_surrounding) (ClutterInputFocus *focus);
 | 
			
		||||
  void (* delete_surrounding)  (ClutterInputFocus *focus,
 | 
			
		||||
                                guint              offset,
 | 
			
		||||
                                int                offset,
 | 
			
		||||
                                guint              len);
 | 
			
		||||
  void (* commit_text) (ClutterInputFocus *focus,
 | 
			
		||||
                        const gchar       *text);
 | 
			
		||||
 
 | 
			
		||||
@@ -168,7 +168,7 @@ clutter_input_method_class_init (ClutterInputMethodClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT);
 | 
			
		||||
                  G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_UINT);
 | 
			
		||||
  signals[REQUEST_SURROUNDING] =
 | 
			
		||||
    g_signal_new ("request-surrounding",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
@@ -292,7 +292,7 @@ clutter_input_method_commit (ClutterInputMethod *im,
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_delete_surrounding (ClutterInputMethod *im,
 | 
			
		||||
                                         guint               offset,
 | 
			
		||||
                                         int                 offset,
 | 
			
		||||
                                         guint               len)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
 
 | 
			
		||||
@@ -68,7 +68,7 @@ void clutter_input_method_commit (ClutterInputMethod *im,
 | 
			
		||||
                                  const gchar        *text);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_input_method_delete_surrounding (ClutterInputMethod *im,
 | 
			
		||||
                                              guint               offset,
 | 
			
		||||
                                              int                 offset,
 | 
			
		||||
                                              guint               len);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_input_method_request_surrounding (ClutterInputMethod *im);
 | 
			
		||||
 
 | 
			
		||||
@@ -37,9 +37,6 @@
 | 
			
		||||
 * any object taking a reference on a #ClutterInterval instance should
 | 
			
		||||
 * also take ownership of the interval by using g_object_ref_sink().
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterInterval is used by #ClutterAnimation to define the
 | 
			
		||||
 * interval of values that an implicit animation should tween over.
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterInterval can be subclassed to override the validation
 | 
			
		||||
 * and value computation.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -136,7 +136,6 @@
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#include "deprecated/clutter-container.h"
 | 
			
		||||
#include "deprecated/clutter-alpha.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-layout-manager.h"
 | 
			
		||||
@@ -164,7 +163,6 @@ G_DEFINE_ABSTRACT_TYPE (ClutterLayoutManager,
 | 
			
		||||
                        G_TYPE_INITIALLY_UNOWNED)
 | 
			
		||||
 | 
			
		||||
static GQuark quark_layout_meta  = 0;
 | 
			
		||||
static GQuark quark_layout_alpha = 0;
 | 
			
		||||
 | 
			
		||||
static guint manager_signals[LAST_SIGNAL] = { 0, };
 | 
			
		||||
 | 
			
		||||
@@ -301,96 +299,12 @@ layout_manager_real_get_child_meta_type (ClutterLayoutManager *manager)
 | 
			
		||||
  return G_TYPE_INVALID;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* XXX:2.0 - Remove */
 | 
			
		||||
static ClutterAlpha *
 | 
			
		||||
layout_manager_real_begin_animation (ClutterLayoutManager *manager,
 | 
			
		||||
                                     guint                 duration,
 | 
			
		||||
                                     gulong                mode)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTimeline *timeline;
 | 
			
		||||
  ClutterAlpha *alpha;
 | 
			
		||||
 | 
			
		||||
  alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha);
 | 
			
		||||
  if (alpha != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      clutter_alpha_set_mode (alpha, mode);
 | 
			
		||||
 | 
			
		||||
      timeline = clutter_alpha_get_timeline (alpha);
 | 
			
		||||
      clutter_timeline_set_duration (timeline, duration);
 | 
			
		||||
      clutter_timeline_rewind (timeline);
 | 
			
		||||
 | 
			
		||||
      return alpha;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  timeline = clutter_timeline_new (duration);
 | 
			
		||||
 | 
			
		||||
  alpha = clutter_alpha_new_full (timeline, mode);
 | 
			
		||||
 | 
			
		||||
  /* let the alpha take ownership of the timeline */
 | 
			
		||||
  g_object_unref (timeline);
 | 
			
		||||
 | 
			
		||||
  g_signal_connect_swapped (timeline, "new-frame",
 | 
			
		||||
                            G_CALLBACK (clutter_layout_manager_layout_changed),
 | 
			
		||||
                            manager);
 | 
			
		||||
 | 
			
		||||
  g_object_set_qdata_full (G_OBJECT (manager),
 | 
			
		||||
                           quark_layout_alpha, alpha,
 | 
			
		||||
                           (GDestroyNotify) g_object_unref);
 | 
			
		||||
 | 
			
		||||
  clutter_timeline_start (timeline);
 | 
			
		||||
 | 
			
		||||
  return alpha;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* XXX:2.0 - Remove */
 | 
			
		||||
static gdouble
 | 
			
		||||
layout_manager_real_get_animation_progress (ClutterLayoutManager *manager)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlpha *alpha;
 | 
			
		||||
 | 
			
		||||
  alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha);
 | 
			
		||||
  if (alpha == NULL)
 | 
			
		||||
    return 1.0;
 | 
			
		||||
 | 
			
		||||
  return clutter_alpha_get_alpha (alpha);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* XXX:2.0 - Remove */
 | 
			
		||||
static void
 | 
			
		||||
layout_manager_real_end_animation (ClutterLayoutManager *manager)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTimeline *timeline;
 | 
			
		||||
  ClutterAlpha *alpha;
 | 
			
		||||
 | 
			
		||||
  alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha);
 | 
			
		||||
  if (alpha == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  timeline = clutter_alpha_get_timeline (alpha);
 | 
			
		||||
  g_assert (timeline != NULL);
 | 
			
		||||
 | 
			
		||||
  if (clutter_timeline_is_playing (timeline))
 | 
			
		||||
    clutter_timeline_stop (timeline);
 | 
			
		||||
 | 
			
		||||
  g_signal_handlers_disconnect_by_func (timeline,
 | 
			
		||||
                                        G_CALLBACK (clutter_layout_manager_layout_changed),
 | 
			
		||||
                                        manager);
 | 
			
		||||
 | 
			
		||||
  g_object_set_qdata (G_OBJECT (manager), quark_layout_alpha, NULL);
 | 
			
		||||
 | 
			
		||||
  clutter_layout_manager_layout_changed (manager);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  quark_layout_meta =
 | 
			
		||||
    g_quark_from_static_string ("clutter-layout-manager-child-meta");
 | 
			
		||||
 | 
			
		||||
  /* XXX:2.0 - Remove */
 | 
			
		||||
  quark_layout_alpha =
 | 
			
		||||
    g_quark_from_static_string ("clutter-layout-manager-alpha");
 | 
			
		||||
 | 
			
		||||
  klass->get_preferred_width = layout_manager_real_get_preferred_width;
 | 
			
		||||
  klass->get_preferred_height = layout_manager_real_get_preferred_height;
 | 
			
		||||
  klass->allocate = layout_manager_real_allocate;
 | 
			
		||||
@@ -398,9 +312,6 @@ clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
 | 
			
		||||
  klass->get_child_meta_type = layout_manager_real_get_child_meta_type;
 | 
			
		||||
 | 
			
		||||
  /* XXX:2.0 - Remove */
 | 
			
		||||
  klass->begin_animation = layout_manager_real_begin_animation;
 | 
			
		||||
  klass->get_animation_progress = layout_manager_real_get_animation_progress;
 | 
			
		||||
  klass->end_animation = layout_manager_real_end_animation;
 | 
			
		||||
  klass->set_container = layout_manager_real_set_container;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
 
 | 
			
		||||
@@ -126,15 +126,6 @@ struct _ClutterLayoutManagerClass
 | 
			
		||||
                                                 ClutterContainer       *container,
 | 
			
		||||
                                                 ClutterActor           *actor);
 | 
			
		||||
 | 
			
		||||
  /* deprecated */
 | 
			
		||||
  ClutterAlpha *     (* begin_animation)        (ClutterLayoutManager   *manager,
 | 
			
		||||
                                                 guint                   duration,
 | 
			
		||||
                                                 gulong                  mode);
 | 
			
		||||
  /* deprecated */
 | 
			
		||||
  gdouble            (* get_animation_progress) (ClutterLayoutManager   *manager);
 | 
			
		||||
  /* deprecated */
 | 
			
		||||
  void               (* end_animation)          (ClutterLayoutManager   *manager);
 | 
			
		||||
 | 
			
		||||
  void               (* layout_changed)         (ClutterLayoutManager   *manager);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
 
 | 
			
		||||
@@ -63,6 +63,7 @@
 | 
			
		||||
#include "clutter-main.h"
 | 
			
		||||
#include "clutter-master-clock.h"
 | 
			
		||||
#include "clutter-mutter.h"
 | 
			
		||||
#include "clutter-paint-node-private.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-settings-private.h"
 | 
			
		||||
#include "clutter-stage-manager.h"
 | 
			
		||||
@@ -970,6 +971,9 @@ clutter_init_real (GError **error)
 | 
			
		||||
  if (clutter_enable_accessibility)
 | 
			
		||||
    cally_accessibility_init ();
 | 
			
		||||
 | 
			
		||||
  /* Initialize types required for paint nodes */
 | 
			
		||||
  _clutter_paint_node_init_types ();
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_INIT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,8 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#include <cogl/cogl.h>
 | 
			
		||||
 | 
			
		||||
#include "clutter-master-clock.h"
 | 
			
		||||
#include "clutter-master-clock-default.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
@@ -461,6 +463,8 @@ clutter_clock_dispatch (GSource     *source,
 | 
			
		||||
 | 
			
		||||
  _clutter_threads_acquire_lock ();
 | 
			
		||||
 | 
			
		||||
  COGL_TRACE_BEGIN (ClutterMasterClockTick, "Master Clock (tick)");
 | 
			
		||||
 | 
			
		||||
  /* Get the time to use for this frame */
 | 
			
		||||
  master_clock->cur_tick = g_source_get_time (source);
 | 
			
		||||
 | 
			
		||||
@@ -492,6 +496,8 @@ clutter_clock_dispatch (GSource     *source,
 | 
			
		||||
 | 
			
		||||
  g_slist_free_full (stages, g_object_unref);
 | 
			
		||||
 | 
			
		||||
  COGL_TRACE_END (ClutterMasterClockTick);
 | 
			
		||||
 | 
			
		||||
  _clutter_threads_release_lock ();
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,9 @@
 | 
			
		||||
#include "cogl/clutter-stage-cogl.h"
 | 
			
		||||
#include "clutter/x11/clutter-backend-x11.h"
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GList * clutter_stage_peek_stage_views (ClutterStage *stage);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_set_custom_backend_func (ClutterBackend *(* func) (void));
 | 
			
		||||
 | 
			
		||||
@@ -48,6 +51,23 @@ void clutter_stage_capture_into (ClutterStage          *stage,
 | 
			
		||||
                                 cairo_rectangle_int_t *rect,
 | 
			
		||||
                                 uint8_t               *data);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_stage_paint_to_framebuffer (ClutterStage                *stage,
 | 
			
		||||
                                         CoglFramebuffer             *framebuffer,
 | 
			
		||||
                                         const cairo_rectangle_int_t *rect,
 | 
			
		||||
                                         float                        scale,
 | 
			
		||||
                                         ClutterPaintFlag             paint_flags);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_stage_paint_to_buffer (ClutterStage                 *stage,
 | 
			
		||||
                                        const cairo_rectangle_int_t  *rect,
 | 
			
		||||
                                        float                         scale,
 | 
			
		||||
                                        uint8_t                      *data,
 | 
			
		||||
                                        int                           stride,
 | 
			
		||||
                                        CoglPixelFormat               format,
 | 
			
		||||
                                        ClutterPaintFlag              paint_flags,
 | 
			
		||||
                                        GError                      **error);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_stage_freeze_updates (ClutterStage *stage);
 | 
			
		||||
 | 
			
		||||
@@ -57,9 +77,16 @@ void clutter_stage_thaw_updates (ClutterStage *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_stage_update_resource_scales (ClutterStage *stage);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_stage_view_assign_next_scanout (ClutterStageView *stage_view,
 | 
			
		||||
                                             CoglScanout      *scanout);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_actor_has_damage (ClutterActor *actor);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_actor_has_transitions (ClutterActor *actor);
 | 
			
		||||
 | 
			
		||||
#undef __CLUTTER_H_INSIDE__
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_MUTTER_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -81,7 +81,7 @@
 | 
			
		||||
struct _ClutterOffscreenEffectPrivate
 | 
			
		||||
{
 | 
			
		||||
  CoglHandle offscreen;
 | 
			
		||||
  CoglPipeline *target;
 | 
			
		||||
  CoglPipeline *pipeline;
 | 
			
		||||
  CoglHandle texture;
 | 
			
		||||
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
@@ -140,7 +140,7 @@ ensure_pipeline_filter_for_scale (ClutterOffscreenEffect *self,
 | 
			
		||||
{
 | 
			
		||||
  CoglPipelineFilter filter;
 | 
			
		||||
 | 
			
		||||
  if (!self->priv->target)
 | 
			
		||||
  if (!self->priv->pipeline)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* If no fractional scaling is set, we're always going to render the texture
 | 
			
		||||
@@ -154,7 +154,7 @@ ensure_pipeline_filter_for_scale (ClutterOffscreenEffect *self,
 | 
			
		||||
  else
 | 
			
		||||
    filter = COGL_PIPELINE_FILTER_LINEAR;
 | 
			
		||||
 | 
			
		||||
  cogl_pipeline_set_layer_filters (self->priv->target, 0 /* layer_index */,
 | 
			
		||||
  cogl_pipeline_set_layer_filters (self->priv->pipeline, 0 /* layer_index */,
 | 
			
		||||
                                   filter, filter);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -185,12 +185,12 @@ update_fbo (ClutterEffect *effect,
 | 
			
		||||
    return TRUE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (priv->target == NULL)
 | 
			
		||||
  if (priv->pipeline == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      CoglContext *ctx =
 | 
			
		||||
        clutter_backend_get_cogl_context (clutter_get_default_backend ());
 | 
			
		||||
 | 
			
		||||
      priv->target = cogl_pipeline_new (ctx);
 | 
			
		||||
      priv->pipeline = cogl_pipeline_new (ctx);
 | 
			
		||||
      ensure_pipeline_filter_for_scale (self, resource_scale);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -202,7 +202,7 @@ update_fbo (ClutterEffect *effect,
 | 
			
		||||
  if (priv->texture == NULL)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  cogl_pipeline_set_layer_texture (priv->target, 0, priv->texture);
 | 
			
		||||
  cogl_pipeline_set_layer_texture (priv->pipeline, 0, priv->texture);
 | 
			
		||||
 | 
			
		||||
  priv->target_width = target_width;
 | 
			
		||||
  priv->target_height = target_height;
 | 
			
		||||
@@ -212,8 +212,8 @@ update_fbo (ClutterEffect *effect,
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("%s: Unable to create an Offscreen buffer", G_STRLOC);
 | 
			
		||||
 | 
			
		||||
      cogl_object_unref (priv->target);
 | 
			
		||||
      priv->target = NULL;
 | 
			
		||||
      cogl_object_unref (priv->pipeline);
 | 
			
		||||
      priv->pipeline = NULL;
 | 
			
		||||
 | 
			
		||||
      priv->target_width = 0;
 | 
			
		||||
      priv->target_height = 0;
 | 
			
		||||
@@ -380,7 +380,7 @@ clutter_offscreen_effect_real_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
 | 
			
		||||
  paint_opacity = clutter_actor_get_paint_opacity (priv->actor);
 | 
			
		||||
 | 
			
		||||
  cogl_pipeline_set_color4ub (priv->target,
 | 
			
		||||
  cogl_pipeline_set_color4ub (priv->pipeline,
 | 
			
		||||
                              paint_opacity,
 | 
			
		||||
                              paint_opacity,
 | 
			
		||||
                              paint_opacity,
 | 
			
		||||
@@ -392,7 +392,7 @@ clutter_offscreen_effect_real_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
   * hadn't been redirected offscreen.
 | 
			
		||||
   */
 | 
			
		||||
  cogl_framebuffer_draw_textured_rectangle (framebuffer,
 | 
			
		||||
                                            priv->target,
 | 
			
		||||
                                            priv->pipeline,
 | 
			
		||||
                                            0, 0,
 | 
			
		||||
                                            cogl_texture_get_width (priv->texture),
 | 
			
		||||
                                            cogl_texture_get_height (priv->texture),
 | 
			
		||||
@@ -446,13 +446,16 @@ clutter_offscreen_effect_post_paint (ClutterEffect       *effect,
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = self->priv;
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
 | 
			
		||||
  if (priv->offscreen == NULL ||
 | 
			
		||||
      priv->target == NULL ||
 | 
			
		||||
      priv->actor == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
  g_warn_if_fail (priv->offscreen);
 | 
			
		||||
  g_warn_if_fail (priv->pipeline);
 | 
			
		||||
  g_warn_if_fail (priv->actor);
 | 
			
		||||
 | 
			
		||||
  /* Restore the previous opacity override */
 | 
			
		||||
  clutter_actor_set_opacity_override (priv->actor, priv->old_opacity_override);
 | 
			
		||||
  if (priv->actor)
 | 
			
		||||
    {
 | 
			
		||||
      clutter_actor_set_opacity_override (priv->actor,
 | 
			
		||||
                                          priv->old_opacity_override);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  framebuffer = clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  cogl_framebuffer_pop_matrix (framebuffer);
 | 
			
		||||
@@ -469,6 +472,13 @@ clutter_offscreen_effect_paint (ClutterEffect           *effect,
 | 
			
		||||
  ClutterOffscreenEffect *self = CLUTTER_OFFSCREEN_EFFECT (effect);
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = self->priv;
 | 
			
		||||
 | 
			
		||||
  if (flags & CLUTTER_EFFECT_PAINT_BYPASS_EFFECT)
 | 
			
		||||
    {
 | 
			
		||||
      clutter_actor_continue_paint (priv->actor, paint_context);
 | 
			
		||||
      cogl_clear_object (&priv->offscreen);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* If we've already got a cached image and the actor hasn't been redrawn
 | 
			
		||||
   * then we can just use the cached image in the FBO.
 | 
			
		||||
   */
 | 
			
		||||
@@ -491,16 +501,17 @@ clutter_offscreen_effect_paint (ClutterEffect           *effect,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_offscreen_effect_notify (GObject    *gobject,
 | 
			
		||||
                                 GParamSpec *pspec)
 | 
			
		||||
clutter_offscreen_effect_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                                      gboolean          is_enabled)
 | 
			
		||||
{
 | 
			
		||||
  ClutterOffscreenEffect *offscreen_effect = CLUTTER_OFFSCREEN_EFFECT (gobject);
 | 
			
		||||
  ClutterActorMetaClass *parent_class =
 | 
			
		||||
    CLUTTER_ACTOR_META_CLASS (clutter_offscreen_effect_parent_class);
 | 
			
		||||
  ClutterOffscreenEffect *offscreen_effect = CLUTTER_OFFSCREEN_EFFECT (meta);
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = offscreen_effect->priv;
 | 
			
		||||
 | 
			
		||||
  if (strcmp (pspec->name, "enabled") == 0)
 | 
			
		||||
    g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_offscreen_effect_parent_class)->notify (gobject, pspec);
 | 
			
		||||
  parent_class->set_enabled (meta, is_enabled);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -511,7 +522,7 @@ clutter_offscreen_effect_finalize (GObject *gobject)
 | 
			
		||||
 | 
			
		||||
  g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->texture, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->target, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->pipeline, cogl_object_unref);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_offscreen_effect_parent_class)->finalize (gobject);
 | 
			
		||||
}
 | 
			
		||||
@@ -527,13 +538,13 @@ clutter_offscreen_effect_class_init (ClutterOffscreenEffectClass *klass)
 | 
			
		||||
  klass->paint_target = clutter_offscreen_effect_real_paint_target;
 | 
			
		||||
 | 
			
		||||
  meta_class->set_actor = clutter_offscreen_effect_set_actor;
 | 
			
		||||
  meta_class->set_enabled = clutter_offscreen_effect_set_enabled;
 | 
			
		||||
 | 
			
		||||
  effect_class->pre_paint = clutter_offscreen_effect_pre_paint;
 | 
			
		||||
  effect_class->post_paint = clutter_offscreen_effect_post_paint;
 | 
			
		||||
  effect_class->paint = clutter_offscreen_effect_paint;
 | 
			
		||||
 | 
			
		||||
  gobject_class->finalize = clutter_offscreen_effect_finalize;
 | 
			
		||||
  gobject_class->notify = clutter_offscreen_effect_notify;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -593,7 +604,7 @@ clutter_offscreen_effect_get_target (ClutterOffscreenEffect *effect)
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_OFFSCREEN_EFFECT (effect),
 | 
			
		||||
                        NULL);
 | 
			
		||||
 | 
			
		||||
  return (CoglMaterial *)effect->priv->target;
 | 
			
		||||
  return (CoglMaterial *)effect->priv->pipeline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,9 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-paint-context.h"
 | 
			
		||||
 | 
			
		||||
ClutterPaintContext * clutter_paint_context_new_for_view (ClutterStageView *view);
 | 
			
		||||
ClutterPaintContext * clutter_paint_context_new_for_view (ClutterStageView     *view,
 | 
			
		||||
                                                          const cairo_region_t *redraw_clip,
 | 
			
		||||
                                                          ClutterPaintFlag      paint_flags);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_paint_context_is_drawing_off_stage (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,9 +23,13 @@ struct _ClutterPaintContext
 | 
			
		||||
{
 | 
			
		||||
  grefcount ref_count;
 | 
			
		||||
 | 
			
		||||
  ClutterPaintFlag paint_flags;
 | 
			
		||||
 | 
			
		||||
  GList *framebuffers;
 | 
			
		||||
 | 
			
		||||
  ClutterStageView *view;
 | 
			
		||||
 | 
			
		||||
  cairo_region_t *redraw_clip;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
G_DEFINE_BOXED_TYPE (ClutterPaintContext, clutter_paint_context,
 | 
			
		||||
@@ -33,7 +37,9 @@ G_DEFINE_BOXED_TYPE (ClutterPaintContext, clutter_paint_context,
 | 
			
		||||
                     clutter_paint_context_unref)
 | 
			
		||||
 | 
			
		||||
ClutterPaintContext *
 | 
			
		||||
clutter_paint_context_new_for_view (ClutterStageView *view)
 | 
			
		||||
clutter_paint_context_new_for_view (ClutterStageView     *view,
 | 
			
		||||
                                    const cairo_region_t *redraw_clip,
 | 
			
		||||
                                    ClutterPaintFlag      paint_flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintContext *paint_context;
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
@@ -41,6 +47,8 @@ clutter_paint_context_new_for_view (ClutterStageView *view)
 | 
			
		||||
  paint_context = g_new0 (ClutterPaintContext, 1);
 | 
			
		||||
  g_ref_count_init (&paint_context->ref_count);
 | 
			
		||||
  paint_context->view = view;
 | 
			
		||||
  paint_context->redraw_clip = cairo_region_copy (redraw_clip);
 | 
			
		||||
  paint_context->paint_flags = paint_flags;
 | 
			
		||||
 | 
			
		||||
  framebuffer = clutter_stage_view_get_framebuffer (view);
 | 
			
		||||
  clutter_paint_context_push_framebuffer (paint_context, framebuffer);
 | 
			
		||||
@@ -52,12 +60,16 @@ clutter_paint_context_new_for_view (ClutterStageView *view)
 | 
			
		||||
 * clutter_paint_context_new_for_framebuffer: (skip)
 | 
			
		||||
 */
 | 
			
		||||
ClutterPaintContext *
 | 
			
		||||
clutter_paint_context_new_for_framebuffer (CoglFramebuffer *framebuffer)
 | 
			
		||||
clutter_paint_context_new_for_framebuffer (CoglFramebuffer      *framebuffer,
 | 
			
		||||
                                           const cairo_region_t *redraw_clip,
 | 
			
		||||
                                           ClutterPaintFlag      paint_flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintContext *paint_context;
 | 
			
		||||
 | 
			
		||||
  paint_context = g_new0 (ClutterPaintContext, 1);
 | 
			
		||||
  g_ref_count_init (&paint_context->ref_count);
 | 
			
		||||
  paint_context->redraw_clip = cairo_region_copy (redraw_clip);
 | 
			
		||||
  paint_context->paint_flags = paint_flags;
 | 
			
		||||
 | 
			
		||||
  clutter_paint_context_push_framebuffer (paint_context, framebuffer);
 | 
			
		||||
 | 
			
		||||
@@ -77,6 +89,7 @@ clutter_paint_context_dispose (ClutterPaintContext *paint_context)
 | 
			
		||||
  g_list_free_full (paint_context->framebuffers,
 | 
			
		||||
                    cogl_object_unref);
 | 
			
		||||
  paint_context->framebuffers = NULL;
 | 
			
		||||
  g_clear_pointer (&paint_context->redraw_clip, cairo_region_destroy);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -115,6 +128,12 @@ clutter_paint_context_pop_framebuffer (ClutterPaintContext *paint_context)
 | 
			
		||||
                        paint_context->framebuffers);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const cairo_region_t *
 | 
			
		||||
clutter_paint_context_get_redraw_clip (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  return paint_context->redraw_clip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_context_get_framebuffer:
 | 
			
		||||
 * @paint_context: The #ClutterPaintContext
 | 
			
		||||
@@ -159,3 +178,12 @@ clutter_paint_context_is_drawing_off_stage (ClutterPaintContext *paint_context)
 | 
			
		||||
 | 
			
		||||
  return !paint_context->view;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_context_get_paint_flags: (skip)
 | 
			
		||||
 */
 | 
			
		||||
ClutterPaintFlag
 | 
			
		||||
clutter_paint_context_get_paint_flags (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  return paint_context->paint_flags;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,13 +29,21 @@
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterPaintContext ClutterPaintContext;
 | 
			
		||||
 | 
			
		||||
typedef enum _ClutterPaintFlag
 | 
			
		||||
{
 | 
			
		||||
  CLUTTER_PAINT_FLAG_NONE = 0,
 | 
			
		||||
  CLUTTER_PAINT_FLAG_NO_CURSORS = 1 << 0,
 | 
			
		||||
} ClutterPaintFlag;
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_PAINT_CONTEXT (clutter_paint_context_get_type ())
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_paint_context_get_type (void);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterPaintContext * clutter_paint_context_new_for_framebuffer (CoglFramebuffer *framebuffer);
 | 
			
		||||
ClutterPaintContext * clutter_paint_context_new_for_framebuffer (CoglFramebuffer      *framebuffer,
 | 
			
		||||
                                                                 const cairo_region_t *redraw_clip,
 | 
			
		||||
                                                                 ClutterPaintFlag      paint_flags);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterPaintContext * clutter_paint_context_ref (ClutterPaintContext *paint_context);
 | 
			
		||||
@@ -59,4 +67,10 @@ void clutter_paint_context_push_framebuffer (ClutterPaintContext *paint_context,
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_paint_context_pop_framebuffer (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
const cairo_region_t * clutter_paint_context_get_redraw_clip (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterPaintFlag clutter_paint_context_get_paint_flags (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
#endif /* CLUTTER_PAINT_CONTEXT_H */
 | 
			
		||||
 
 | 
			
		||||
@@ -49,11 +49,11 @@ struct _ClutterPaintNode
 | 
			
		||||
  ClutterPaintNode *next_sibling;
 | 
			
		||||
  ClutterPaintNode *last_child;
 | 
			
		||||
 | 
			
		||||
  guint n_children;
 | 
			
		||||
 | 
			
		||||
  GArray *operations;
 | 
			
		||||
 | 
			
		||||
  gchar *name;
 | 
			
		||||
  const gchar *name;
 | 
			
		||||
 | 
			
		||||
  guint n_children;
 | 
			
		||||
 | 
			
		||||
  volatile int ref_count;
 | 
			
		||||
};
 | 
			
		||||
@@ -83,7 +83,6 @@ typedef enum
 | 
			
		||||
  PAINT_OP_INVALID = 0,
 | 
			
		||||
  PAINT_OP_TEX_RECT,
 | 
			
		||||
  PAINT_OP_MULTITEX_RECT,
 | 
			
		||||
  PAINT_OP_PATH,
 | 
			
		||||
  PAINT_OP_PRIMITIVE
 | 
			
		||||
} PaintOpCode;
 | 
			
		||||
 | 
			
		||||
@@ -96,8 +95,6 @@ struct _ClutterPaintOperation
 | 
			
		||||
  union {
 | 
			
		||||
    float texrect[8];
 | 
			
		||||
 | 
			
		||||
    CoglPath *path;
 | 
			
		||||
 | 
			
		||||
    CoglPrimitive *primitive;
 | 
			
		||||
  } op;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -171,8 +171,6 @@ clutter_paint_node_real_finalize (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintNode *iter;
 | 
			
		||||
 | 
			
		||||
  g_free (node->name);
 | 
			
		||||
 | 
			
		||||
  if (node->operations != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      guint i;
 | 
			
		||||
@@ -297,7 +295,8 @@ clutter_paint_node_get_type (void)
 | 
			
		||||
 *
 | 
			
		||||
 * The @name will be used for debugging purposes.
 | 
			
		||||
 *
 | 
			
		||||
 * The @node will copy the passed string.
 | 
			
		||||
 * The @node will intern @name using g_intern_string(). If you have access to a
 | 
			
		||||
 * static string, use clutter_paint_node_set_static_name() instead.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 */
 | 
			
		||||
@@ -307,8 +306,22 @@ clutter_paint_node_set_name (ClutterPaintNode *node,
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_PAINT_NODE (node));
 | 
			
		||||
 | 
			
		||||
  g_free (node->name);
 | 
			
		||||
  node->name = g_strdup (name);
 | 
			
		||||
  node->name = g_intern_string (name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_node_set_static_name: (skip)
 | 
			
		||||
 *
 | 
			
		||||
 * Like clutter_paint_node_set_name() but uses a static or interned string
 | 
			
		||||
 * containing the name.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_paint_node_set_static_name (ClutterPaintNode *node,
 | 
			
		||||
                                    const char       *name)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_PAINT_NODE (node));
 | 
			
		||||
 | 
			
		||||
  node->name = name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -769,11 +782,6 @@ clutter_paint_operation_clear (ClutterPaintOperation *op)
 | 
			
		||||
        g_array_unref (op->multitex_coords);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PAINT_OP_PATH:
 | 
			
		||||
      if (op->op.path != NULL)
 | 
			
		||||
        cogl_object_unref (op->op.path);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PAINT_OP_PRIMITIVE:
 | 
			
		||||
      if (op->op.primitive != NULL)
 | 
			
		||||
        cogl_object_unref (op->op.primitive);
 | 
			
		||||
@@ -823,16 +831,6 @@ clutter_paint_op_init_multitex_rect (ClutterPaintOperation *op,
 | 
			
		||||
  op->op.texrect[3] = rect->y2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
clutter_paint_op_init_path (ClutterPaintOperation *op,
 | 
			
		||||
                            CoglPath              *path)
 | 
			
		||||
{
 | 
			
		||||
  clutter_paint_operation_clear (op);
 | 
			
		||||
 | 
			
		||||
  op->opcode = PAINT_OP_PATH;
 | 
			
		||||
  op->op.path = cogl_object_ref (path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
clutter_paint_op_init_primitive (ClutterPaintOperation *op,
 | 
			
		||||
                                 CoglPrimitive         *primitive)
 | 
			
		||||
@@ -937,34 +935,6 @@ clutter_paint_node_add_multitexture_rectangle (ClutterPaintNode      *node,
 | 
			
		||||
  g_array_append_val (node->operations, operation);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_node_add_path: (skip)
 | 
			
		||||
 * @node: a #ClutterPaintNode
 | 
			
		||||
 * @path: a Cogl path
 | 
			
		||||
 *
 | 
			
		||||
 * Adds a region described as a path to the @node.
 | 
			
		||||
 *
 | 
			
		||||
 * This function acquires a reference on the passed @path, so it
 | 
			
		||||
 * is safe to call cogl_object_unref() when it returns.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 * Stability: unstable
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_paint_node_add_path (ClutterPaintNode *node,
 | 
			
		||||
                             CoglPath         *path)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintOperation operation = PAINT_OP_INIT;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_PAINT_NODE (node));
 | 
			
		||||
  g_return_if_fail (cogl_is_path (path));
 | 
			
		||||
 | 
			
		||||
  clutter_paint_node_maybe_init_operations (node);
 | 
			
		||||
 | 
			
		||||
  clutter_paint_op_init_path (&operation, path);
 | 
			
		||||
  g_array_append_val (node->operations, operation);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_node_add_primitive: (skip)
 | 
			
		||||
 * @node: a #ClutterPaintNode
 | 
			
		||||
@@ -1101,11 +1071,6 @@ clutter_paint_node_to_json (ClutterPaintNode *node)
 | 
			
		||||
              json_builder_end_array (builder);
 | 
			
		||||
              break;
 | 
			
		||||
 | 
			
		||||
            case PAINT_OP_PATH:
 | 
			
		||||
              json_builder_set_member_name (builder, "path");
 | 
			
		||||
              json_builder_add_int_value (builder, (intptr_t) op->op.path);
 | 
			
		||||
              break;
 | 
			
		||||
 | 
			
		||||
            case PAINT_OP_PRIMITIVE:
 | 
			
		||||
              json_builder_set_member_name (builder, "primitive");
 | 
			
		||||
              json_builder_add_int_value (builder, (intptr_t) op->op.primitive);
 | 
			
		||||
@@ -1181,8 +1146,6 @@ _clutter_paint_node_create (GType gtype)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (g_type_is_a (gtype, CLUTTER_TYPE_PAINT_NODE), NULL);
 | 
			
		||||
 | 
			
		||||
  _clutter_paint_node_init_types ();
 | 
			
		||||
 | 
			
		||||
  return (gpointer) g_type_create_instance (gtype);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -56,6 +56,9 @@ void                    clutter_paint_node_paint                        (Clutter
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_paint_node_set_name                     (ClutterPaintNode      *node,
 | 
			
		||||
                                                                         const char            *name);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_paint_node_set_static_name              (ClutterPaintNode      *node,
 | 
			
		||||
                                                                         const char            *name);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
CoglFramebuffer *       clutter_paint_node_get_framebuffer              (ClutterPaintNode      *node);
 | 
			
		||||
@@ -81,9 +84,6 @@ void                   clutter_paint_node_add_multitexture_rectangle   (ClutterP
 | 
			
		||||
                                                                        unsigned int            text_coords_len);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_paint_node_add_path                     (ClutterPaintNode      *node,
 | 
			
		||||
                                                                         CoglPath              *path);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_paint_node_add_primitive                (ClutterPaintNode      *node,
 | 
			
		||||
                                                                         CoglPrimitive         *primitive);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -477,10 +477,6 @@ clutter_pipeline_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
                                                         op->multitex_coords->len);
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PATH:
 | 
			
		||||
          cogl_framebuffer_fill_path (fb, pnode->pipeline, op->op.path);
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PRIMITIVE:
 | 
			
		||||
          cogl_framebuffer_draw_primitive (fb,
 | 
			
		||||
                                           pnode->pipeline,
 | 
			
		||||
@@ -876,7 +872,6 @@ clutter_text_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_MULTITEX_RECT:
 | 
			
		||||
        case PAINT_OP_PATH:
 | 
			
		||||
        case PAINT_OP_PRIMITIVE:
 | 
			
		||||
        case PAINT_OP_INVALID:
 | 
			
		||||
          break;
 | 
			
		||||
@@ -1037,11 +1032,6 @@ clutter_clip_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
          retval = TRUE;
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PATH:
 | 
			
		||||
          cogl_framebuffer_push_path_clip (fb, op->op.path);
 | 
			
		||||
          retval = TRUE;
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_MULTITEX_RECT:
 | 
			
		||||
        case PAINT_OP_PRIMITIVE:
 | 
			
		||||
        case PAINT_OP_INVALID:
 | 
			
		||||
@@ -1072,7 +1062,6 @@ clutter_clip_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
 | 
			
		||||
      switch (op->opcode)
 | 
			
		||||
        {
 | 
			
		||||
        case PAINT_OP_PATH:
 | 
			
		||||
        case PAINT_OP_TEX_RECT:
 | 
			
		||||
          cogl_framebuffer_pop_clip (fb);
 | 
			
		||||
          break;
 | 
			
		||||
@@ -1242,9 +1231,8 @@ struct _ClutterLayerNode
 | 
			
		||||
  float fbo_width;
 | 
			
		||||
  float fbo_height;
 | 
			
		||||
 | 
			
		||||
  CoglPipeline *state;
 | 
			
		||||
  CoglPipeline *pipeline;
 | 
			
		||||
  CoglFramebuffer *offscreen;
 | 
			
		||||
  CoglTexture *texture;
 | 
			
		||||
 | 
			
		||||
  guint8 opacity;
 | 
			
		||||
};
 | 
			
		||||
@@ -1334,7 +1322,7 @@ clutter_layer_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
        case PAINT_OP_TEX_RECT:
 | 
			
		||||
          /* now we need to paint the texture */
 | 
			
		||||
          cogl_framebuffer_draw_textured_rectangle (fb,
 | 
			
		||||
                                                    lnode->state,
 | 
			
		||||
                                                    lnode->pipeline,
 | 
			
		||||
                                                    op->op.texrect[0],
 | 
			
		||||
                                                    op->op.texrect[1],
 | 
			
		||||
                                                    op->op.texrect[2],
 | 
			
		||||
@@ -1347,7 +1335,7 @@ clutter_layer_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_MULTITEX_RECT:
 | 
			
		||||
          cogl_framebuffer_draw_multitextured_rectangle (fb,
 | 
			
		||||
                                                         lnode->state,
 | 
			
		||||
                                                         lnode->pipeline,
 | 
			
		||||
                                                         op->op.texrect[0],
 | 
			
		||||
                                                         op->op.texrect[1],
 | 
			
		||||
                                                         op->op.texrect[2],
 | 
			
		||||
@@ -1356,12 +1344,10 @@ clutter_layer_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
                                                         op->multitex_coords->len);
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PATH:
 | 
			
		||||
          cogl_framebuffer_fill_path (fb, lnode->state, op->op.path);
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PRIMITIVE:
 | 
			
		||||
          cogl_framebuffer_draw_primitive (fb, lnode->state, op->op.primitive);
 | 
			
		||||
          cogl_framebuffer_draw_primitive (fb,
 | 
			
		||||
                                           lnode->pipeline,
 | 
			
		||||
                                           op->op.primitive);
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -1372,8 +1358,8 @@ clutter_layer_node_finalize (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterLayerNode *lnode = CLUTTER_LAYER_NODE (node);
 | 
			
		||||
 | 
			
		||||
  if (lnode->state != NULL)
 | 
			
		||||
    cogl_object_unref (lnode->state);
 | 
			
		||||
  if (lnode->pipeline != NULL)
 | 
			
		||||
    cogl_object_unref (lnode->pipeline);
 | 
			
		||||
 | 
			
		||||
  if (lnode->offscreen != NULL)
 | 
			
		||||
    cogl_object_unref (lnode->offscreen);
 | 
			
		||||
@@ -1425,6 +1411,8 @@ clutter_layer_node_new (const CoglMatrix        *projection,
 | 
			
		||||
                        guint8                   opacity)
 | 
			
		||||
{
 | 
			
		||||
  ClutterLayerNode *res;
 | 
			
		||||
  CoglContext *context;
 | 
			
		||||
  CoglTexture *texture;
 | 
			
		||||
  CoglColor color;
 | 
			
		||||
 | 
			
		||||
  res = _clutter_paint_node_create (CLUTTER_TYPE_LAYER_NODE);
 | 
			
		||||
@@ -1436,19 +1424,17 @@ clutter_layer_node_new (const CoglMatrix        *projection,
 | 
			
		||||
  res->opacity = opacity;
 | 
			
		||||
 | 
			
		||||
  /* the texture backing the FBO */
 | 
			
		||||
  res->texture = cogl_texture_new_with_size (MAX (res->fbo_width, 1),
 | 
			
		||||
                                             MAX (res->fbo_height, 1),
 | 
			
		||||
                                             COGL_TEXTURE_NO_SLICING,
 | 
			
		||||
                                             COGL_PIXEL_FORMAT_RGBA_8888_PRE);
 | 
			
		||||
  context = clutter_backend_get_cogl_context (clutter_get_default_backend ());
 | 
			
		||||
 | 
			
		||||
  res->offscreen = COGL_FRAMEBUFFER (cogl_offscreen_new_to_texture (res->texture));
 | 
			
		||||
  texture = cogl_texture_2d_new_with_size (context,
 | 
			
		||||
                                           MAX (res->fbo_width, 1),
 | 
			
		||||
                                           MAX (res->fbo_height, 1));
 | 
			
		||||
  cogl_texture_set_premultiplied (texture, TRUE);
 | 
			
		||||
 | 
			
		||||
  res->offscreen = COGL_FRAMEBUFFER (cogl_offscreen_new_to_texture (texture));
 | 
			
		||||
  if (res->offscreen == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      g_critical ("%s: Unable to create an offscreen buffer", G_STRLOC);
 | 
			
		||||
 | 
			
		||||
      cogl_object_unref (res->texture);
 | 
			
		||||
      res->texture = NULL;
 | 
			
		||||
 | 
			
		||||
      goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1458,14 +1444,15 @@ clutter_layer_node_new (const CoglMatrix        *projection,
 | 
			
		||||
   * interpolation filters because the texture is always
 | 
			
		||||
   * going to be painted at a 1:1 texel:pixel ratio
 | 
			
		||||
   */
 | 
			
		||||
  res->state = cogl_pipeline_copy (default_texture_pipeline);
 | 
			
		||||
  cogl_pipeline_set_layer_filters (res->state, 0,
 | 
			
		||||
  res->pipeline = cogl_pipeline_copy (default_texture_pipeline);
 | 
			
		||||
  cogl_pipeline_set_layer_filters (res->pipeline, 0,
 | 
			
		||||
                                   COGL_PIPELINE_FILTER_NEAREST,
 | 
			
		||||
                                   COGL_PIPELINE_FILTER_NEAREST);
 | 
			
		||||
  cogl_pipeline_set_layer_texture (res->state, 0, res->texture);
 | 
			
		||||
  cogl_pipeline_set_color (res->state, &color);
 | 
			
		||||
  cogl_object_unref (res->texture);
 | 
			
		||||
  cogl_pipeline_set_layer_texture (res->pipeline, 0, texture);
 | 
			
		||||
  cogl_pipeline_set_color (res->pipeline, &color);
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
  cogl_object_unref (texture);
 | 
			
		||||
 | 
			
		||||
  return (ClutterPaintNode *) res;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -65,7 +65,6 @@ typedef struct _ClutterVertex4          ClutterVertex4;
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_ACTOR_IS_TOPLEVEL(a)            ((CLUTTER_PRIVATE_FLAGS (a) & CLUTTER_IS_TOPLEVEL) != FALSE)
 | 
			
		||||
#define CLUTTER_ACTOR_IN_DESTRUCTION(a)         ((CLUTTER_PRIVATE_FLAGS (a) & CLUTTER_IN_DESTRUCTION) != FALSE)
 | 
			
		||||
#define CLUTTER_ACTOR_IN_REPARENT(a)            ((CLUTTER_PRIVATE_FLAGS (a) & CLUTTER_IN_REPARENT) != FALSE)
 | 
			
		||||
#define CLUTTER_ACTOR_IN_PAINT(a)               ((CLUTTER_PRIVATE_FLAGS (a) & CLUTTER_IN_PAINT) != FALSE)
 | 
			
		||||
#define CLUTTER_ACTOR_IN_PICK(a)                ((CLUTTER_PRIVATE_FLAGS (a) & CLUTTER_IN_PICK) != FALSE)
 | 
			
		||||
#define CLUTTER_ACTOR_IN_RELAYOUT(a)            ((CLUTTER_PRIVATE_FLAGS (a) & CLUTTER_IN_RELAYOUT) != FALSE)
 | 
			
		||||
@@ -99,7 +98,6 @@ typedef enum
 | 
			
		||||
 | 
			
		||||
  CLUTTER_IN_DESTRUCTION = 1 << 0,
 | 
			
		||||
  CLUTTER_IS_TOPLEVEL    = 1 << 1,
 | 
			
		||||
  CLUTTER_IN_REPARENT    = 1 << 2,
 | 
			
		||||
  CLUTTER_IN_PREF_WIDTH  = 1 << 3,
 | 
			
		||||
  CLUTTER_IN_PREF_HEIGHT = 1 << 4,
 | 
			
		||||
 | 
			
		||||
@@ -248,6 +246,9 @@ gboolean _clutter_util_rectangle_intersection (const cairo_rectangle_int_t *src1
 | 
			
		||||
                                               const cairo_rectangle_int_t *src2,
 | 
			
		||||
                                               cairo_rectangle_int_t       *dest);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_util_rectangle_equal (const cairo_rectangle_int_t *src1,
 | 
			
		||||
                                       const cairo_rectangle_int_t *src2);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct _ClutterVertex4
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,6 @@
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#include "deprecated/clutter-container.h"
 | 
			
		||||
#include "deprecated/clutter-alpha.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-actor.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
@@ -799,232 +798,6 @@ parse_signals (ClutterScript *script,
 | 
			
		||||
  return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterTimeline *
 | 
			
		||||
construct_timeline (ClutterScript *script,
 | 
			
		||||
                    JsonObject    *object)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTimeline *retval = NULL;
 | 
			
		||||
  ObjectInfo *oinfo;
 | 
			
		||||
  GList *members, *l;
 | 
			
		||||
 | 
			
		||||
  /* we fake an ObjectInfo so we can reuse clutter_script_construct_object()
 | 
			
		||||
   * here; we do not save it inside the hash table, because if this had
 | 
			
		||||
   * been a named object then we wouldn't have ended up here in the first
 | 
			
		||||
   * place
 | 
			
		||||
   */
 | 
			
		||||
  oinfo = g_slice_new0 (ObjectInfo);
 | 
			
		||||
  oinfo->gtype = CLUTTER_TYPE_TIMELINE;
 | 
			
		||||
  oinfo->id = g_strdup ("dummy");
 | 
			
		||||
 | 
			
		||||
  members = json_object_get_members (object);
 | 
			
		||||
  for (l = members; l != NULL; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      const gchar *name = l->data;
 | 
			
		||||
      JsonNode *node = json_object_get_member (object, name);
 | 
			
		||||
      PropertyInfo *pinfo = g_slice_new0 (PropertyInfo);
 | 
			
		||||
 | 
			
		||||
      pinfo->name = g_strdelimit (g_strdup (name), G_STR_DELIMITERS, '-');
 | 
			
		||||
      pinfo->node = json_node_copy (node);
 | 
			
		||||
 | 
			
		||||
      oinfo->properties = g_list_prepend (oinfo->properties, pinfo);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_list_free (members);
 | 
			
		||||
 | 
			
		||||
  _clutter_script_construct_object (script, oinfo);
 | 
			
		||||
  _clutter_script_apply_properties (script, oinfo);
 | 
			
		||||
  retval = CLUTTER_TIMELINE (oinfo->object);
 | 
			
		||||
 | 
			
		||||
  /* we transfer ownership to the alpha function, so we ref before
 | 
			
		||||
   * destroying the ObjectInfo to avoid the timeline going away
 | 
			
		||||
   */
 | 
			
		||||
  g_object_ref (retval);
 | 
			
		||||
  object_info_free (oinfo);
 | 
			
		||||
 | 
			
		||||
  return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* define the names of the animation modes to match the ones
 | 
			
		||||
 * that developers might be more accustomed to
 | 
			
		||||
 */
 | 
			
		||||
static const struct
 | 
			
		||||
{
 | 
			
		||||
  const gchar *name;
 | 
			
		||||
  ClutterAnimationMode mode;
 | 
			
		||||
} animation_modes[] = {
 | 
			
		||||
  { "linear", CLUTTER_LINEAR },
 | 
			
		||||
  { "easeInQuad", CLUTTER_EASE_IN_QUAD },
 | 
			
		||||
  { "easeOutQuad", CLUTTER_EASE_OUT_QUAD },
 | 
			
		||||
  { "easeInOutQuad", CLUTTER_EASE_IN_OUT_QUAD },
 | 
			
		||||
  { "easeInCubic", CLUTTER_EASE_IN_CUBIC },
 | 
			
		||||
  { "easeOutCubic", CLUTTER_EASE_OUT_CUBIC },
 | 
			
		||||
  { "easeInOutCubic", CLUTTER_EASE_IN_OUT_CUBIC },
 | 
			
		||||
  { "easeInQuart", CLUTTER_EASE_IN_QUART },
 | 
			
		||||
  { "easeOutQuart", CLUTTER_EASE_OUT_QUART },
 | 
			
		||||
  { "easeInOutQuart", CLUTTER_EASE_IN_OUT_QUART },
 | 
			
		||||
  { "easeInQuint", CLUTTER_EASE_IN_QUINT },
 | 
			
		||||
  { "easeOutQuint", CLUTTER_EASE_OUT_QUINT },
 | 
			
		||||
  { "easeInOutQuint", CLUTTER_EASE_IN_OUT_QUINT },
 | 
			
		||||
  { "easeInSine", CLUTTER_EASE_IN_SINE },
 | 
			
		||||
  { "easeOutSine", CLUTTER_EASE_OUT_SINE },
 | 
			
		||||
  { "easeInOutSine", CLUTTER_EASE_IN_OUT_SINE },
 | 
			
		||||
  { "easeInExpo", CLUTTER_EASE_IN_EXPO },
 | 
			
		||||
  { "easeOutExpo", CLUTTER_EASE_OUT_EXPO },
 | 
			
		||||
  { "easeInOutExpo", CLUTTER_EASE_IN_OUT_EXPO },
 | 
			
		||||
  { "easeInCirc", CLUTTER_EASE_IN_CIRC },
 | 
			
		||||
  { "easeOutCirc", CLUTTER_EASE_OUT_CIRC },
 | 
			
		||||
  { "easeInOutCirc", CLUTTER_EASE_IN_OUT_CIRC },
 | 
			
		||||
  { "easeInElastic", CLUTTER_EASE_IN_ELASTIC },
 | 
			
		||||
  { "easeOutElastic", CLUTTER_EASE_OUT_ELASTIC },
 | 
			
		||||
  { "easeInOutElastic", CLUTTER_EASE_IN_OUT_ELASTIC },
 | 
			
		||||
  { "easeInBack", CLUTTER_EASE_IN_BACK },
 | 
			
		||||
  { "easeOutBack", CLUTTER_EASE_OUT_BACK },
 | 
			
		||||
  { "easeInOutBack", CLUTTER_EASE_IN_OUT_BACK },
 | 
			
		||||
  { "easeInBounce", CLUTTER_EASE_IN_BOUNCE },
 | 
			
		||||
  { "easeOutBounce", CLUTTER_EASE_OUT_BOUNCE },
 | 
			
		||||
  { "easeInOutBounce", CLUTTER_EASE_IN_OUT_BOUNCE },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const gint n_animation_modes = G_N_ELEMENTS (animation_modes);
 | 
			
		||||
 | 
			
		||||
gulong
 | 
			
		||||
_clutter_script_resolve_animation_mode (JsonNode *node)
 | 
			
		||||
{
 | 
			
		||||
  gint i, res = CLUTTER_CUSTOM_MODE;
 | 
			
		||||
 | 
			
		||||
  if (JSON_NODE_TYPE (node) != JSON_NODE_VALUE)
 | 
			
		||||
    return CLUTTER_CUSTOM_MODE;
 | 
			
		||||
 | 
			
		||||
  if (json_node_get_value_type (node) == G_TYPE_INT64)
 | 
			
		||||
    return json_node_get_int (node);
 | 
			
		||||
 | 
			
		||||
  if (json_node_get_value_type (node) == G_TYPE_STRING)
 | 
			
		||||
    {
 | 
			
		||||
      const gchar *name = json_node_get_string (node);
 | 
			
		||||
 | 
			
		||||
      /* XXX - we might be able to optimize by changing the ordering
 | 
			
		||||
       * of the animation_modes array, e.g.
 | 
			
		||||
       *  - special casing linear
 | 
			
		||||
       *  - tokenizing ('ease', 'In', 'Sine') and matching on token
 | 
			
		||||
       *  - binary searching?
 | 
			
		||||
       */
 | 
			
		||||
      for (i = 0; i < n_animation_modes; i++)
 | 
			
		||||
        {
 | 
			
		||||
          if (strcmp (animation_modes[i].name, name) == 0)
 | 
			
		||||
            return animation_modes[i].mode;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      if (_clutter_script_enum_from_string (CLUTTER_TYPE_ANIMATION_MODE,
 | 
			
		||||
                                            name,
 | 
			
		||||
                                            &res))
 | 
			
		||||
        return res;
 | 
			
		||||
 | 
			
		||||
      g_warning ("Unable to find the animation mode '%s'", name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_CUSTOM_MODE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterAlphaFunc
 | 
			
		||||
resolve_alpha_func (const gchar *name)
 | 
			
		||||
{
 | 
			
		||||
  static GModule *module = NULL;
 | 
			
		||||
  ClutterAlphaFunc func;
 | 
			
		||||
 | 
			
		||||
  CLUTTER_NOTE (SCRIPT, "Looking up '%s' alpha function", name);
 | 
			
		||||
 | 
			
		||||
  if (G_UNLIKELY (!module))
 | 
			
		||||
    module = g_module_open (NULL, 0);
 | 
			
		||||
 | 
			
		||||
  if (g_module_symbol (module, name, (gpointer) &func))
 | 
			
		||||
    {
 | 
			
		||||
      CLUTTER_NOTE (SCRIPT, "Found '%s' alpha function in the symbols table",
 | 
			
		||||
                    name);
 | 
			
		||||
      return func;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GObject *
 | 
			
		||||
_clutter_script_parse_alpha (ClutterScript *script,
 | 
			
		||||
                             JsonNode      *node)
 | 
			
		||||
{
 | 
			
		||||
  GObject *retval = NULL;
 | 
			
		||||
  JsonObject *object;
 | 
			
		||||
  ClutterTimeline *timeline = NULL;
 | 
			
		||||
  ClutterAlphaFunc alpha_func = NULL;
 | 
			
		||||
  ClutterAnimationMode mode = CLUTTER_CUSTOM_MODE;
 | 
			
		||||
  JsonNode *val;
 | 
			
		||||
  gboolean unref_timeline = FALSE;
 | 
			
		||||
 | 
			
		||||
  if (JSON_NODE_TYPE (node) != JSON_NODE_OBJECT)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  object = json_node_get_object (node);
 | 
			
		||||
 | 
			
		||||
  val = json_object_get_member (object, "timeline");
 | 
			
		||||
  if (val)
 | 
			
		||||
    {
 | 
			
		||||
      if (JSON_NODE_TYPE (val) == JSON_NODE_VALUE &&
 | 
			
		||||
          json_node_get_string (val) != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          const gchar *id_ = json_node_get_string (val);
 | 
			
		||||
 | 
			
		||||
          timeline =
 | 
			
		||||
            CLUTTER_TIMELINE (clutter_script_get_object (script, id_));
 | 
			
		||||
        }
 | 
			
		||||
      else if (JSON_NODE_TYPE (val) == JSON_NODE_OBJECT)
 | 
			
		||||
        {
 | 
			
		||||
          timeline = construct_timeline (script, json_node_get_object (val));
 | 
			
		||||
          unref_timeline = TRUE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  val = json_object_get_member (object, "mode");
 | 
			
		||||
  if (val != NULL)
 | 
			
		||||
    mode = _clutter_script_resolve_animation_mode (val);
 | 
			
		||||
 | 
			
		||||
  if (mode == CLUTTER_CUSTOM_MODE)
 | 
			
		||||
    {
 | 
			
		||||
      val = json_object_get_member (object, "function");
 | 
			
		||||
      if (val && json_node_get_string (val) != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          alpha_func = resolve_alpha_func (json_node_get_string (val));
 | 
			
		||||
          if (!alpha_func)
 | 
			
		||||
            {
 | 
			
		||||
              g_warning ("Unable to find the function '%s' in the "
 | 
			
		||||
                         "Clutter alpha functions or the symbols table",
 | 
			
		||||
                         json_node_get_string (val));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  CLUTTER_NOTE (SCRIPT, "Parsed alpha: %s timeline (%p) (mode:%d, func:%p)",
 | 
			
		||||
                unref_timeline ? "implicit" : "explicit",
 | 
			
		||||
                timeline ? timeline : 0x0,
 | 
			
		||||
                mode != CLUTTER_CUSTOM_MODE ? mode : 0,
 | 
			
		||||
                alpha_func ? alpha_func : 0x0);
 | 
			
		||||
 | 
			
		||||
  retval = g_object_new (CLUTTER_TYPE_ALPHA, NULL);
 | 
			
		||||
 | 
			
		||||
  if (mode != CLUTTER_CUSTOM_MODE)
 | 
			
		||||
    clutter_alpha_set_mode (CLUTTER_ALPHA (retval), mode);
 | 
			
		||||
 | 
			
		||||
  if (alpha_func != NULL)
 | 
			
		||||
    clutter_alpha_set_func (CLUTTER_ALPHA (retval), alpha_func, NULL, NULL);
 | 
			
		||||
 | 
			
		||||
  clutter_alpha_set_timeline (CLUTTER_ALPHA (retval), timeline);
 | 
			
		||||
 | 
			
		||||
  /* if we created an implicit timeline, the Alpha has full ownership
 | 
			
		||||
   * of it now, since it won't be accessible from ClutterScript
 | 
			
		||||
   */
 | 
			
		||||
  if (unref_timeline)
 | 
			
		||||
    g_object_unref (timeline);
 | 
			
		||||
 | 
			
		||||
  return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_script_parser_object_end (JsonParser *json_parser,
 | 
			
		||||
                                  JsonObject *object)
 | 
			
		||||
 
 | 
			
		||||
@@ -110,8 +110,6 @@ gboolean _clutter_script_parse_node        (ClutterScript *script,
 | 
			
		||||
GType    _clutter_script_get_type_from_symbol (const gchar *symbol);
 | 
			
		||||
GType    _clutter_script_get_type_from_class  (const gchar *name);
 | 
			
		||||
 | 
			
		||||
gulong   _clutter_script_resolve_animation_mode (JsonNode *node);
 | 
			
		||||
 | 
			
		||||
gboolean _clutter_script_enum_from_string  (GType          gtype,
 | 
			
		||||
                                            const gchar   *string,
 | 
			
		||||
                                            gint          *enum_value);
 | 
			
		||||
@@ -128,8 +126,6 @@ gboolean _clutter_script_parse_rect        (ClutterScript   *script,
 | 
			
		||||
gboolean _clutter_script_parse_color       (ClutterScript   *script,
 | 
			
		||||
                                            JsonNode        *node,
 | 
			
		||||
                                            ClutterColor    *color);
 | 
			
		||||
GObject *_clutter_script_parse_alpha       (ClutterScript   *script,
 | 
			
		||||
                                            JsonNode        *node);
 | 
			
		||||
gboolean _clutter_script_parse_point       (ClutterScript    *script,
 | 
			
		||||
                                            JsonNode         *node,
 | 
			
		||||
                                            graphene_point_t *point);
 | 
			
		||||
 
 | 
			
		||||
@@ -98,49 +98,6 @@
 | 
			
		||||
 * respectively) and the "object" string member for calling
 | 
			
		||||
 * g_signal_connect_object() instead of g_signal_connect().
 | 
			
		||||
 *
 | 
			
		||||
 * Signals can also be directly attached to a specific state defined
 | 
			
		||||
 * inside a #ClutterState instance, for instance:
 | 
			
		||||
 *
 | 
			
		||||
 * |[
 | 
			
		||||
 *   ...
 | 
			
		||||
 *   "signals" : [
 | 
			
		||||
 *     {
 | 
			
		||||
 *       "name" : "enter-event",
 | 
			
		||||
 *       "states" : "button-states",
 | 
			
		||||
 *       "target-state" : "hover"
 | 
			
		||||
 *     },
 | 
			
		||||
 *     {
 | 
			
		||||
 *       "name" : "leave-event",
 | 
			
		||||
 *       "states" : "button-states",
 | 
			
		||||
 *       "target-state" : "base"
 | 
			
		||||
 *     },
 | 
			
		||||
 *     {
 | 
			
		||||
 *       "name" : "button-press-event",
 | 
			
		||||
 *       "states" : "button-states",
 | 
			
		||||
 *       "target-state" : "active",
 | 
			
		||||
 *     },
 | 
			
		||||
 *     {
 | 
			
		||||
 *       "name" : "key-press-event",
 | 
			
		||||
 *       "states" : "button-states",
 | 
			
		||||
 *       "target-state" : "key-focus",
 | 
			
		||||
 *       "warp" : true
 | 
			
		||||
 *     }
 | 
			
		||||
 *   ],
 | 
			
		||||
 *   ...
 | 
			
		||||
 * ]|
 | 
			
		||||
 *
 | 
			
		||||
 * The "states" key defines the #ClutterState instance to be used to
 | 
			
		||||
 * resolve the "target-state" key; it can be either a script id for a
 | 
			
		||||
 * #ClutterState built by the same #ClutterScript instance, or to a
 | 
			
		||||
 * #ClutterState built in code and associated to the #ClutterScript
 | 
			
		||||
 * instance through the clutter_script_add_states() function. If no
 | 
			
		||||
 * "states" key is present, then the default #ClutterState associated to
 | 
			
		||||
 * the #ClutterScript instance will be used; the default #ClutterState
 | 
			
		||||
 * can be set using clutter_script_add_states() using a %NULL name. The
 | 
			
		||||
 * "warp" key can be used to warp to a specific state instead of
 | 
			
		||||
 * animating to it. State changes on signal emission will not affect
 | 
			
		||||
 * the signal emission chain.
 | 
			
		||||
 *
 | 
			
		||||
 * Clutter reserves the following names, so classes defining properties
 | 
			
		||||
 * through the usual GObject registration process should avoid using these
 | 
			
		||||
 * names to avoid collisions:
 | 
			
		||||
@@ -184,9 +141,7 @@
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
 | 
			
		||||
#include "deprecated/clutter-alpha.h"
 | 
			
		||||
#include "deprecated/clutter-container.h"
 | 
			
		||||
#include "deprecated/clutter-state.h"
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
@@ -210,8 +165,6 @@ struct _ClutterScriptPrivate
 | 
			
		||||
 | 
			
		||||
  ClutterScriptParser *parser;
 | 
			
		||||
 | 
			
		||||
  GHashTable *states;
 | 
			
		||||
 | 
			
		||||
  gchar **search_paths;
 | 
			
		||||
 | 
			
		||||
  gchar *translation_domain;
 | 
			
		||||
@@ -264,7 +217,6 @@ signal_info_free (gpointer data)
 | 
			
		||||
      g_free (sinfo->name);
 | 
			
		||||
      g_free (sinfo->handler);
 | 
			
		||||
      g_free (sinfo->object);
 | 
			
		||||
      g_free (sinfo->state);
 | 
			
		||||
      g_free (sinfo->target);
 | 
			
		||||
 | 
			
		||||
      g_slice_free (SignalInfo, sinfo);
 | 
			
		||||
@@ -319,7 +271,6 @@ clutter_script_finalize (GObject *gobject)
 | 
			
		||||
  g_hash_table_destroy (priv->objects);
 | 
			
		||||
  g_strfreev (priv->search_paths);
 | 
			
		||||
  g_free (priv->filename);
 | 
			
		||||
  g_hash_table_destroy (priv->states);
 | 
			
		||||
  g_free (priv->translation_domain);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_script_parent_class)->finalize (gobject);
 | 
			
		||||
@@ -454,9 +405,6 @@ clutter_script_init (ClutterScript *script)
 | 
			
		||||
  priv->objects = g_hash_table_new_full (g_str_hash, g_str_equal,
 | 
			
		||||
                                         NULL,
 | 
			
		||||
                                         object_info_free);
 | 
			
		||||
  priv->states = g_hash_table_new_full (g_str_hash, g_str_equal,
 | 
			
		||||
                                        g_free,
 | 
			
		||||
                                        (GDestroyNotify) g_object_unref);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -972,65 +920,12 @@ clutter_script_connect_signals (ClutterScript *script,
 | 
			
		||||
  g_free (cd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  ClutterState *state;
 | 
			
		||||
  GObject *emitter;
 | 
			
		||||
  gchar *target;
 | 
			
		||||
  gulong signal_id;
 | 
			
		||||
  gulong hook_id;
 | 
			
		||||
  gboolean warp_to;
 | 
			
		||||
} HookData;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  ClutterScript *script;
 | 
			
		||||
  ClutterScriptConnectFunc func;
 | 
			
		||||
  gpointer user_data;
 | 
			
		||||
} SignalConnectData;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
hook_data_free (gpointer data)
 | 
			
		||||
{
 | 
			
		||||
  if (G_LIKELY (data != NULL))
 | 
			
		||||
    {
 | 
			
		||||
      HookData *hook_data = data;
 | 
			
		||||
 | 
			
		||||
      g_free (hook_data->target);
 | 
			
		||||
      g_slice_free (HookData, hook_data);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_script_state_change_hook (GSignalInvocationHint *ihint,
 | 
			
		||||
                                  guint                  n_params,
 | 
			
		||||
                                  const GValue          *params,
 | 
			
		||||
                                  gpointer               user_data)
 | 
			
		||||
{
 | 
			
		||||
  HookData *hook_data = user_data;
 | 
			
		||||
  GObject *emitter;
 | 
			
		||||
 | 
			
		||||
  emitter = g_value_get_object (¶ms[0]);
 | 
			
		||||
 | 
			
		||||
  if (emitter == hook_data->emitter)
 | 
			
		||||
    {
 | 
			
		||||
      if (hook_data->warp_to)
 | 
			
		||||
        clutter_state_warp_to_state (hook_data->state, hook_data->target);
 | 
			
		||||
      else
 | 
			
		||||
        clutter_state_set_state (hook_data->state, hook_data->target);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_script_remove_state_change_hook (gpointer  user_data,
 | 
			
		||||
                                         GObject  *object_p)
 | 
			
		||||
{
 | 
			
		||||
  HookData *hook_data = user_data;
 | 
			
		||||
 | 
			
		||||
  g_signal_remove_emission_hook (hook_data->signal_id,
 | 
			
		||||
                                 hook_data->hook_id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
connect_each_object (gpointer key,
 | 
			
		||||
                     gpointer value,
 | 
			
		||||
@@ -1070,64 +965,7 @@ connect_each_object (gpointer key,
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          GObject *state_object = NULL;
 | 
			
		||||
          const gchar *signal_name, *signal_detail;
 | 
			
		||||
          gchar **components;
 | 
			
		||||
          GQuark signal_quark;
 | 
			
		||||
          guint signal_id;
 | 
			
		||||
          HookData *hook_data;
 | 
			
		||||
 | 
			
		||||
          if (sinfo->state == NULL)
 | 
			
		||||
            state_object = (GObject *) clutter_script_get_states (script, NULL);
 | 
			
		||||
          else
 | 
			
		||||
            {
 | 
			
		||||
              state_object = clutter_script_get_object (script, sinfo->state);
 | 
			
		||||
              if (state_object == NULL)
 | 
			
		||||
                state_object = (GObject *) clutter_script_get_states (script, sinfo->state);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          if (state_object == NULL)
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
          components = g_strsplit (sinfo->name, "::", 2);
 | 
			
		||||
          if (g_strv_length (components) == 2)
 | 
			
		||||
            {
 | 
			
		||||
              signal_name = components[0];
 | 
			
		||||
              signal_detail = components[1];
 | 
			
		||||
            }
 | 
			
		||||
          else
 | 
			
		||||
            {
 | 
			
		||||
              signal_name = components[0];
 | 
			
		||||
              signal_detail = NULL;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          signal_id = g_signal_lookup (signal_name, G_OBJECT_TYPE (object));
 | 
			
		||||
          if (signal_id == 0)
 | 
			
		||||
            {
 | 
			
		||||
              g_strfreev (components);
 | 
			
		||||
              continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          if (signal_detail != NULL)
 | 
			
		||||
            signal_quark = g_quark_from_string (signal_detail);
 | 
			
		||||
          else
 | 
			
		||||
            signal_quark = 0;
 | 
			
		||||
 | 
			
		||||
          hook_data = g_slice_new (HookData);
 | 
			
		||||
          hook_data->emitter = object;
 | 
			
		||||
          hook_data->state = CLUTTER_STATE (state_object);
 | 
			
		||||
          hook_data->target = g_strdup (sinfo->target);
 | 
			
		||||
          hook_data->warp_to = sinfo->warp_to;
 | 
			
		||||
          hook_data->signal_id = signal_id;
 | 
			
		||||
          hook_data->hook_id =
 | 
			
		||||
            g_signal_add_emission_hook (signal_id, signal_quark,
 | 
			
		||||
                                        clutter_script_state_change_hook,
 | 
			
		||||
                                        hook_data,
 | 
			
		||||
                                        hook_data_free);
 | 
			
		||||
 | 
			
		||||
          g_object_weak_ref (hook_data->emitter,
 | 
			
		||||
                             clutter_script_remove_state_change_hook,
 | 
			
		||||
                             hook_data);
 | 
			
		||||
          g_warn_if_reached ();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      signal_info_free (sinfo);
 | 
			
		||||
@@ -1352,72 +1190,6 @@ clutter_script_list_objects (ClutterScript *script)
 | 
			
		||||
  return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_script_add_states:
 | 
			
		||||
 * @script: a #ClutterScript
 | 
			
		||||
 * @name: (allow-none): a name for the @state, or %NULL to
 | 
			
		||||
 *   set the default #ClutterState
 | 
			
		||||
 * @state: a #ClutterState
 | 
			
		||||
 *
 | 
			
		||||
 * Associates a #ClutterState to the #ClutterScript instance using the given
 | 
			
		||||
 * name.
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterScript instance will use @state to resolve target states when
 | 
			
		||||
 * connecting signal handlers.
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterScript instance will take a reference on the #ClutterState
 | 
			
		||||
 * passed to this function.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_script_add_states (ClutterScript *script,
 | 
			
		||||
                           const gchar   *name,
 | 
			
		||||
                           ClutterState  *state)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SCRIPT (script));
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_STATE (state));
 | 
			
		||||
 | 
			
		||||
  if (name == NULL || *name == '\0')
 | 
			
		||||
    name = "__clutter_script_default_state";
 | 
			
		||||
 | 
			
		||||
  g_hash_table_replace (script->priv->states,
 | 
			
		||||
                        g_strdup (name),
 | 
			
		||||
                        g_object_ref (state));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_script_get_states:
 | 
			
		||||
 * @script: a #ClutterScript
 | 
			
		||||
 * @name: (allow-none): the name of the #ClutterState, or %NULL
 | 
			
		||||
 *
 | 
			
		||||
 * Retrieves the #ClutterState for the given @state_name.
 | 
			
		||||
 *
 | 
			
		||||
 * If @name is %NULL, this function will return the default
 | 
			
		||||
 * #ClutterState instance.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer none): a pointer to the #ClutterState for the
 | 
			
		||||
 *   given name. The #ClutterState is owned by the #ClutterScript instance
 | 
			
		||||
 *   and it should not be unreferenced
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12
 | 
			
		||||
 */
 | 
			
		||||
ClutterState *
 | 
			
		||||
clutter_script_get_states (ClutterScript *script,
 | 
			
		||||
                           const gchar   *name)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_SCRIPT (script), NULL);
 | 
			
		||||
 | 
			
		||||
  if (name == NULL || *name == '\0')
 | 
			
		||||
    name = "__clutter_script_default_state";
 | 
			
		||||
 | 
			
		||||
  return g_hash_table_lookup (script->priv->states, name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_script_set_translation_domain:
 | 
			
		||||
 * @script: a #ClutterScript
 | 
			
		||||
 
 | 
			
		||||
@@ -179,15 +179,6 @@ void            clutter_script_unmerge_objects          (ClutterScript
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_script_ensure_objects           (ClutterScript             *script);
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void            clutter_script_add_states               (ClutterScript             *script,
 | 
			
		||||
                                                         const gchar               *name,
 | 
			
		||||
                                                         ClutterState              *state);
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterState *  clutter_script_get_states               (ClutterScript             *script,
 | 
			
		||||
                                                         const gchar               *name);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_script_connect_signals          (ClutterScript             *script,
 | 
			
		||||
                                                         gpointer                   user_data);
 | 
			
		||||
 
 | 
			
		||||
@@ -41,6 +41,7 @@ enum
 | 
			
		||||
  PTR_A11Y_DWELL_CLICK_TYPE_CHANGED,
 | 
			
		||||
  PTR_A11Y_TIMEOUT_STARTED,
 | 
			
		||||
  PTR_A11Y_TIMEOUT_STOPPED,
 | 
			
		||||
  IS_UNFOCUS_INHIBITED_CHANGED,
 | 
			
		||||
  N_SIGNALS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -62,6 +63,8 @@ struct _ClutterSeatPrivate
 | 
			
		||||
{
 | 
			
		||||
  ClutterBackend *backend;
 | 
			
		||||
 | 
			
		||||
  unsigned int inhibit_unfocus_count;
 | 
			
		||||
 | 
			
		||||
  /* Keyboard a11y */
 | 
			
		||||
  ClutterKbdA11ySettings kbd_a11y_settings;
 | 
			
		||||
 | 
			
		||||
@@ -275,6 +278,22 @@ clutter_seat_class_init (ClutterSeatClass *klass)
 | 
			
		||||
                              G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                              _clutter_marshal_VOID__OBJECT_FLAGS_BOOLEANv);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterSeat::is-unfocus-inhibited-changed:
 | 
			
		||||
   * @seat: the #ClutterSeat that emitted the signal
 | 
			
		||||
   *
 | 
			
		||||
   * The ::is-unfocus-inhibited-changed signal is emitted when the
 | 
			
		||||
   * property to inhibit the unsetting of the focus-surface of the
 | 
			
		||||
   * #ClutterSeat changed. To get the current state of this property,
 | 
			
		||||
   * use clutter_seat_is_unfocus_inhibited().
 | 
			
		||||
   */
 | 
			
		||||
  signals[IS_UNFOCUS_INHIBITED_CHANGED] =
 | 
			
		||||
    g_signal_new (I_("is-unfocus-inhibited-changed"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
 | 
			
		||||
  props[PROP_BACKEND] =
 | 
			
		||||
    g_param_spec_object ("backend",
 | 
			
		||||
                         P_("Backend"),
 | 
			
		||||
@@ -282,6 +301,12 @@ clutter_seat_class_init (ClutterSeatClass *klass)
 | 
			
		||||
                         CLUTTER_TYPE_BACKEND,
 | 
			
		||||
                         CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterSeat:touch-mode:
 | 
			
		||||
   *
 | 
			
		||||
   * The current touch-mode of the #ClutterSeat, it is set to %TRUE if the
 | 
			
		||||
   * requirements documented in clutter_seat_get_touch_mode() are fulfilled.
 | 
			
		||||
   **/
 | 
			
		||||
  props[PROP_TOUCH_MODE] =
 | 
			
		||||
    g_param_spec_boolean ("touch-mode",
 | 
			
		||||
                          P_("Touch mode"),
 | 
			
		||||
@@ -508,6 +533,85 @@ clutter_seat_set_pointer_a11y_dwell_click_type (ClutterSeat
 | 
			
		||||
  priv->pointer_a11y_settings.dwell_click_type = click_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_inhibit_unfocus:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 *
 | 
			
		||||
 * Inhibits unsetting of the pointer focus-surface for the #ClutterSeat @seat,
 | 
			
		||||
 * this allows to keep using the pointer even when it's hidden.
 | 
			
		||||
 *
 | 
			
		||||
 * This property is refcounted, so clutter_seat_uninhibit_unfocus() must be
 | 
			
		||||
 * called the exact same number of times as clutter_seat_inhibit_unfocus()
 | 
			
		||||
 * was called before.
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_inhibit_unfocus (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SEAT (seat));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  priv->inhibit_unfocus_count++;
 | 
			
		||||
 | 
			
		||||
  if (priv->inhibit_unfocus_count == 1)
 | 
			
		||||
    g_signal_emit (G_OBJECT (seat), signals[IS_UNFOCUS_INHIBITED_CHANGED], 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_uninhibit_unfocus:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 *
 | 
			
		||||
 * Disables the inhibiting of unsetting of the pointer focus-surface
 | 
			
		||||
 * previously enabled by calling clutter_seat_inhibit_unfocus().
 | 
			
		||||
 *
 | 
			
		||||
 * This property is refcounted, so clutter_seat_uninhibit_unfocus() must be
 | 
			
		||||
 * called the exact same number of times as clutter_seat_inhibit_unfocus()
 | 
			
		||||
 * was called before.
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_uninhibit_unfocus (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SEAT (seat));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  if (priv->inhibit_unfocus_count == 0)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("Called clutter_seat_uninhibit_unfocus without inhibiting before");
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->inhibit_unfocus_count--;
 | 
			
		||||
 | 
			
		||||
  if (priv->inhibit_unfocus_count == 0)
 | 
			
		||||
    g_signal_emit (G_OBJECT (seat), signals[IS_UNFOCUS_INHIBITED_CHANGED], 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_is_unfocus_inhibited:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 *
 | 
			
		||||
 * Gets whether unsetting of the pointer focus-surface is inhibited
 | 
			
		||||
 * for the #ClutterSeat @seat.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: %TRUE if unsetting is inhibited, %FALSE otherwise
 | 
			
		||||
 **/
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_seat_is_unfocus_inhibited (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_SEAT (seat), FALSE);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  return priv->inhibit_unfocus_count > 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_create_virtual_device:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
@@ -569,6 +673,21 @@ clutter_seat_warp_pointer (ClutterSeat *seat,
 | 
			
		||||
  CLUTTER_SEAT_GET_CLASS (seat)->warp_pointer (seat, x, y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_get_touch_mode:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 *
 | 
			
		||||
 * Gets the current touch-mode state of the #ClutterSeat @seat.
 | 
			
		||||
 * The #ClutterSeat:touch-mode property is set to %TRUE if the following
 | 
			
		||||
 * requirements are fulfilled:
 | 
			
		||||
 *
 | 
			
		||||
 *  - A touchscreen is available
 | 
			
		||||
 *  - No external keyboard is attached to the device
 | 
			
		||||
 *  - A tablet mode switch, if present, is enabled
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: %TRUE if the device is a tablet that doesn't have an external
 | 
			
		||||
 *   keyboard attached, %FALSE otherwise.
 | 
			
		||||
 **/
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_seat_get_touch_mode (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -159,6 +159,16 @@ void clutter_seat_get_pointer_a11y_settings (ClutterSeat                *seat,
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_set_pointer_a11y_dwell_click_type (ClutterSeat                      *seat,
 | 
			
		||||
                                                     ClutterPointerA11yDwellClickType  click_type);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_inhibit_unfocus (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_uninhibit_unfocus (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_seat_is_unfocus_inhibited (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterVirtualInputDevice *clutter_seat_create_virtual_device (ClutterSeat            *seat,
 | 
			
		||||
                                                               ClutterInputDeviceType  device_type);
 | 
			
		||||
 
 | 
			
		||||
@@ -36,9 +36,9 @@ typedef struct _ClutterStageQueueRedrawEntry ClutterStageQueueRedrawEntry;
 | 
			
		||||
/* stage */
 | 
			
		||||
ClutterStageWindow *_clutter_stage_get_default_window    (void);
 | 
			
		||||
 | 
			
		||||
void                _clutter_stage_paint_view            (ClutterStage                *stage,
 | 
			
		||||
                                                          ClutterStageView            *view,
 | 
			
		||||
                                                          const cairo_rectangle_int_t *clip);
 | 
			
		||||
void                clutter_stage_paint_view             (ClutterStage          *stage,
 | 
			
		||||
                                                          ClutterStageView      *view,
 | 
			
		||||
                                                          const cairo_region_t  *redraw_clip);
 | 
			
		||||
 | 
			
		||||
void                _clutter_stage_emit_after_paint      (ClutterStage          *stage);
 | 
			
		||||
 | 
			
		||||
@@ -139,8 +139,6 @@ void            _clutter_stage_presented                (ClutterStage      *stag
 | 
			
		||||
                                                         CoglFrameEvent     frame_event,
 | 
			
		||||
                                                         ClutterFrameInfo  *frame_info);
 | 
			
		||||
 | 
			
		||||
GList *         _clutter_stage_peek_stage_views         (ClutterStage *stage);
 | 
			
		||||
 | 
			
		||||
void            clutter_stage_queue_actor_relayout      (ClutterStage *stage,
 | 
			
		||||
                                                         ClutterActor *actor);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,8 +20,7 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter/clutter-stage-view.h"
 | 
			
		||||
 | 
			
		||||
void clutter_stage_view_after_paint (ClutterStageView            *view,
 | 
			
		||||
                                     const cairo_rectangle_int_t *clip);
 | 
			
		||||
void clutter_stage_view_after_paint (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_stage_view_is_dirty_viewport (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
@@ -33,7 +32,17 @@ gboolean clutter_stage_view_is_dirty_projection (ClutterStageView *view);
 | 
			
		||||
void clutter_stage_view_set_dirty_projection (ClutterStageView *view,
 | 
			
		||||
                                              gboolean          dirty);
 | 
			
		||||
 | 
			
		||||
void clutter_stage_view_add_redraw_clip (ClutterStageView      *view,
 | 
			
		||||
                                         cairo_rectangle_int_t *clip);
 | 
			
		||||
void clutter_stage_view_add_redraw_clip (ClutterStageView            *view,
 | 
			
		||||
                                         const cairo_rectangle_int_t *clip);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_stage_view_has_full_redraw_clip (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_stage_view_has_redraw_clip (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
const cairo_region_t * clutter_stage_view_peek_redraw_clip (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
cairo_region_t * clutter_stage_view_take_redraw_clip (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
CoglScanout * clutter_stage_view_take_scanout (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_STAGE_VIEW_PRIVATE_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,10 @@
 | 
			
		||||
#include <cairo-gobject.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
#include "clutter/clutter-private.h"
 | 
			
		||||
#include "clutter/clutter-mutter.h"
 | 
			
		||||
#include "cogl/cogl.h"
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
  PROP_0,
 | 
			
		||||
@@ -50,6 +54,11 @@ typedef struct _ClutterStageViewPrivate
 | 
			
		||||
  CoglOffscreen *shadowfb;
 | 
			
		||||
  CoglPipeline *shadowfb_pipeline;
 | 
			
		||||
 | 
			
		||||
  CoglScanout *next_scanout;
 | 
			
		||||
 | 
			
		||||
  gboolean has_redraw_clip;
 | 
			
		||||
  cairo_region_t *redraw_clip;
 | 
			
		||||
 | 
			
		||||
  guint dirty_viewport   : 1;
 | 
			
		||||
  guint dirty_projection : 1;
 | 
			
		||||
} ClutterStageViewPrivate;
 | 
			
		||||
@@ -166,12 +175,11 @@ clutter_stage_view_invalidate_offscreen_blit_pipeline (ClutterStageView *view)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_view_copy_to_framebuffer (ClutterStageView            *view,
 | 
			
		||||
                                        const cairo_rectangle_int_t *rect,
 | 
			
		||||
                                        CoglPipeline                *pipeline,
 | 
			
		||||
                                        CoglFramebuffer             *src_framebuffer,
 | 
			
		||||
                                        CoglFramebuffer             *dst_framebuffer,
 | 
			
		||||
                                        gboolean                     can_blit)
 | 
			
		||||
clutter_stage_view_copy_to_framebuffer (ClutterStageView *view,
 | 
			
		||||
                                        CoglPipeline     *pipeline,
 | 
			
		||||
                                        CoglFramebuffer  *src_framebuffer,
 | 
			
		||||
                                        CoglFramebuffer  *dst_framebuffer,
 | 
			
		||||
                                        gboolean          can_blit)
 | 
			
		||||
{
 | 
			
		||||
  CoglMatrix matrix;
 | 
			
		||||
 | 
			
		||||
@@ -204,8 +212,7 @@ clutter_stage_view_copy_to_framebuffer (ClutterStageView            *view,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_view_after_paint (ClutterStageView            *view,
 | 
			
		||||
                                const cairo_rectangle_int_t *rect)
 | 
			
		||||
clutter_stage_view_after_paint (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
@@ -222,7 +229,6 @@ clutter_stage_view_after_paint (ClutterStageView            *view,
 | 
			
		||||
      if (priv->shadowfb)
 | 
			
		||||
        {
 | 
			
		||||
          clutter_stage_view_copy_to_framebuffer (view,
 | 
			
		||||
                                                  rect,
 | 
			
		||||
                                                  priv->offscreen_pipeline,
 | 
			
		||||
                                                  priv->offscreen,
 | 
			
		||||
                                                  priv->shadowfb,
 | 
			
		||||
@@ -231,7 +237,6 @@ clutter_stage_view_after_paint (ClutterStageView            *view,
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          clutter_stage_view_copy_to_framebuffer (view,
 | 
			
		||||
                                                  rect,
 | 
			
		||||
                                                  priv->offscreen_pipeline,
 | 
			
		||||
                                                  priv->offscreen,
 | 
			
		||||
                                                  priv->framebuffer,
 | 
			
		||||
@@ -243,7 +248,6 @@ clutter_stage_view_after_paint (ClutterStageView            *view,
 | 
			
		||||
    {
 | 
			
		||||
      clutter_stage_view_ensure_shadowfb_blit_pipeline (view);
 | 
			
		||||
      clutter_stage_view_copy_to_framebuffer (view,
 | 
			
		||||
                                              rect,
 | 
			
		||||
                                              priv->shadowfb_pipeline,
 | 
			
		||||
                                              priv->shadowfb,
 | 
			
		||||
                                              priv->framebuffer,
 | 
			
		||||
@@ -307,6 +311,86 @@ clutter_stage_view_get_offscreen_transformation_matrix (ClutterStageView *view,
 | 
			
		||||
  view_class->get_offscreen_transformation_matrix (view, matrix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_view_add_redraw_clip (ClutterStageView            *view,
 | 
			
		||||
                                    const cairo_rectangle_int_t *clip)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
 | 
			
		||||
  if (priv->has_redraw_clip && !priv->redraw_clip)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (!clip)
 | 
			
		||||
    {
 | 
			
		||||
      g_clear_pointer (&priv->redraw_clip, cairo_region_destroy);
 | 
			
		||||
      priv->has_redraw_clip = TRUE;
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (clip->width == 0 || clip->height == 0)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (!priv->redraw_clip)
 | 
			
		||||
    {
 | 
			
		||||
      if (!clutter_util_rectangle_equal (&priv->layout, clip))
 | 
			
		||||
        priv->redraw_clip = cairo_region_create_rectangle (clip);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      cairo_region_union_rectangle (priv->redraw_clip, clip);
 | 
			
		||||
 | 
			
		||||
      if (cairo_region_num_rectangles (priv->redraw_clip) == 1)
 | 
			
		||||
        {
 | 
			
		||||
          cairo_rectangle_int_t redraw_clip_extents;
 | 
			
		||||
 | 
			
		||||
          cairo_region_get_extents (priv->redraw_clip, &redraw_clip_extents);
 | 
			
		||||
          if (clutter_util_rectangle_equal (&priv->layout, &redraw_clip_extents))
 | 
			
		||||
            g_clear_pointer (&priv->redraw_clip, cairo_region_destroy);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->has_redraw_clip = TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_stage_view_has_redraw_clip (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
 | 
			
		||||
  return priv->has_redraw_clip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_stage_view_has_full_redraw_clip (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
 | 
			
		||||
  return priv->has_redraw_clip && !priv->redraw_clip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const cairo_region_t *
 | 
			
		||||
clutter_stage_view_peek_redraw_clip (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
 | 
			
		||||
  return priv->redraw_clip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cairo_region_t *
 | 
			
		||||
clutter_stage_view_take_redraw_clip (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
 | 
			
		||||
  priv->has_redraw_clip = FALSE;
 | 
			
		||||
 | 
			
		||||
  return g_steal_pointer (&priv->redraw_clip);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_view_transform_to_onscreen (ClutterStageView *view,
 | 
			
		||||
                                          gfloat           *x,
 | 
			
		||||
@@ -327,6 +411,25 @@ clutter_stage_default_get_offscreen_transformation_matrix (ClutterStageView *vie
 | 
			
		||||
  cogl_matrix_init_identity (matrix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_view_assign_next_scanout (ClutterStageView *view,
 | 
			
		||||
                                        CoglScanout      *scanout)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
 | 
			
		||||
  g_set_object (&priv->next_scanout, scanout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CoglScanout *
 | 
			
		||||
clutter_stage_view_take_scanout (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
 | 
			
		||||
  return g_steal_pointer (&priv->next_scanout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_view_get_property (GObject    *object,
 | 
			
		||||
                                 guint       prop_id,
 | 
			
		||||
@@ -419,6 +522,7 @@ clutter_stage_view_dispose (GObject *object)
 | 
			
		||||
  g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->offscreen_pipeline, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->shadowfb_pipeline, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->redraw_clip, cairo_region_destroy);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_stage_view_parent_class)->dispose (object);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -62,16 +62,6 @@ _clutter_stage_window_set_title (ClutterStageWindow *window,
 | 
			
		||||
    iface->set_title (window, title);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_stage_window_set_cursor_visible (ClutterStageWindow *window,
 | 
			
		||||
                                          gboolean            is_visible)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindowInterface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
 | 
			
		||||
 | 
			
		||||
  if (iface->set_cursor_visible)
 | 
			
		||||
    iface->set_cursor_visible (window, is_visible);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
_clutter_stage_window_realize (ClutterStageWindow *window)
 | 
			
		||||
{
 | 
			
		||||
@@ -178,90 +168,6 @@ _clutter_stage_window_clear_update_time (ClutterStageWindow *window)
 | 
			
		||||
  iface->clear_update_time (window);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_stage_window_add_redraw_clip (ClutterStageWindow    *window,
 | 
			
		||||
                                       cairo_rectangle_int_t *stage_clip)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindowInterface *iface;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
 | 
			
		||||
 | 
			
		||||
  iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
 | 
			
		||||
  if (iface->add_redraw_clip != NULL)
 | 
			
		||||
    iface->add_redraw_clip (window, stage_clip);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Determines if the backend will clip the rendering of the next
 | 
			
		||||
 * frame.
 | 
			
		||||
 *
 | 
			
		||||
 * Note: at the start of each new frame there is an implied clip that
 | 
			
		||||
 * clips everything (i.e. nothing would be drawn) so this function
 | 
			
		||||
 * will return True at the start of a new frame if the backend
 | 
			
		||||
 * supports clipped redraws.
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
_clutter_stage_window_has_redraw_clips (ClutterStageWindow *window)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindowInterface *iface;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
 | 
			
		||||
 | 
			
		||||
  iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
 | 
			
		||||
  if (iface->has_redraw_clips != NULL)
 | 
			
		||||
    return iface->has_redraw_clips (window);
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Determines if the backend will discard any additional redraw clips
 | 
			
		||||
 * and instead promote them to a full stage redraw.
 | 
			
		||||
 *
 | 
			
		||||
 * The ideas is that backend may have some heuristics that cause it to
 | 
			
		||||
 * give up tracking redraw clips so this can be used to avoid the cost
 | 
			
		||||
 * of calculating a redraw clip when we know it's going to be ignored
 | 
			
		||||
 * anyway.
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
_clutter_stage_window_ignoring_redraw_clips (ClutterStageWindow *window)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindowInterface *iface;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
 | 
			
		||||
 | 
			
		||||
  iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
 | 
			
		||||
  if (iface->ignoring_redraw_clips != NULL)
 | 
			
		||||
    return iface->ignoring_redraw_clips (window);
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cairo_region_t *
 | 
			
		||||
_clutter_stage_window_get_redraw_clip (ClutterStageWindow *window)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindowInterface *iface;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
 | 
			
		||||
 | 
			
		||||
  iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
 | 
			
		||||
  if (iface->get_redraw_clip != NULL)
 | 
			
		||||
    return iface->get_redraw_clip (window);
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_stage_window_set_accept_focus (ClutterStageWindow *window,
 | 
			
		||||
                                        gboolean            accept_focus)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindowInterface *iface;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
 | 
			
		||||
 | 
			
		||||
  iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
 | 
			
		||||
  if (iface->set_accept_focus)
 | 
			
		||||
    iface->set_accept_focus (window, accept_focus);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_stage_window_redraw (ClutterStageWindow *window)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,6 @@ struct _ClutterStageWindowInterface
 | 
			
		||||
 | 
			
		||||
  void              (* set_title)               (ClutterStageWindow *stage_window,
 | 
			
		||||
                                                 const gchar        *title);
 | 
			
		||||
  void              (* set_cursor_visible)      (ClutterStageWindow *stage_window,
 | 
			
		||||
                                                 gboolean            cursor_visible);
 | 
			
		||||
 | 
			
		||||
  gboolean          (* realize)                 (ClutterStageWindow *stage_window);
 | 
			
		||||
  void              (* unrealize)               (ClutterStageWindow *stage_window);
 | 
			
		||||
@@ -51,15 +49,6 @@ struct _ClutterStageWindowInterface
 | 
			
		||||
  gint64            (* get_update_time)         (ClutterStageWindow *stage_window);
 | 
			
		||||
  void              (* clear_update_time)       (ClutterStageWindow *stage_window);
 | 
			
		||||
 | 
			
		||||
  void              (* add_redraw_clip)         (ClutterStageWindow    *stage_window,
 | 
			
		||||
                                                 cairo_rectangle_int_t *stage_rectangle);
 | 
			
		||||
  gboolean          (* has_redraw_clips)        (ClutterStageWindow    *stage_window);
 | 
			
		||||
  gboolean          (* ignoring_redraw_clips)   (ClutterStageWindow    *stage_window);
 | 
			
		||||
  cairo_region_t *  (* get_redraw_clip)         (ClutterStageWindow    *stage_window);
 | 
			
		||||
 | 
			
		||||
  void              (* set_accept_focus)        (ClutterStageWindow *stage_window,
 | 
			
		||||
                                                 gboolean            accept_focus);
 | 
			
		||||
 | 
			
		||||
  void              (* redraw)                  (ClutterStageWindow *stage_window);
 | 
			
		||||
 | 
			
		||||
  gboolean          (* can_clip_redraws)        (ClutterStageWindow *stage_window);
 | 
			
		||||
@@ -94,12 +83,6 @@ void              _clutter_stage_window_schedule_update         (ClutterStageWin
 | 
			
		||||
gint64            _clutter_stage_window_get_update_time         (ClutterStageWindow *window);
 | 
			
		||||
void              _clutter_stage_window_clear_update_time       (ClutterStageWindow *window);
 | 
			
		||||
 | 
			
		||||
void              _clutter_stage_window_add_redraw_clip         (ClutterStageWindow    *window,
 | 
			
		||||
                                                                 cairo_rectangle_int_t *stage_clip);
 | 
			
		||||
gboolean          _clutter_stage_window_has_redraw_clips        (ClutterStageWindow    *window);
 | 
			
		||||
gboolean          _clutter_stage_window_ignoring_redraw_clips   (ClutterStageWindow    *window);
 | 
			
		||||
cairo_region_t *  _clutter_stage_window_get_redraw_clip         (ClutterStageWindow    *window);
 | 
			
		||||
 | 
			
		||||
void              _clutter_stage_window_set_accept_focus        (ClutterStageWindow *window,
 | 
			
		||||
                                                                 gboolean            accept_focus);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -78,7 +78,6 @@
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
 | 
			
		||||
#include "cogl/cogl.h"
 | 
			
		||||
#include "cogl/cogl-trace.h"
 | 
			
		||||
 | 
			
		||||
struct _ClutterStageQueueRedrawEntry
 | 
			
		||||
{
 | 
			
		||||
@@ -141,21 +140,12 @@ struct _ClutterStagePrivate
 | 
			
		||||
 | 
			
		||||
  ClutterStageState current_state;
 | 
			
		||||
 | 
			
		||||
  gpointer paint_data;
 | 
			
		||||
  GDestroyNotify paint_notify;
 | 
			
		||||
 | 
			
		||||
  cairo_rectangle_int_t view_clip;
 | 
			
		||||
 | 
			
		||||
  int update_freeze_count;
 | 
			
		||||
 | 
			
		||||
  guint redraw_pending         : 1;
 | 
			
		||||
  guint is_cursor_visible      : 1;
 | 
			
		||||
  guint throttle_motion_events : 1;
 | 
			
		||||
  guint use_alpha              : 1;
 | 
			
		||||
  guint min_size_changed       : 1;
 | 
			
		||||
  guint accept_focus           : 1;
 | 
			
		||||
  guint motion_events_enabled  : 1;
 | 
			
		||||
  guint has_custom_perspective : 1;
 | 
			
		||||
  guint stage_was_relayout     : 1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -164,12 +154,9 @@ enum
 | 
			
		||||
  PROP_0,
 | 
			
		||||
 | 
			
		||||
  PROP_COLOR,
 | 
			
		||||
  PROP_CURSOR_VISIBLE,
 | 
			
		||||
  PROP_PERSPECTIVE,
 | 
			
		||||
  PROP_TITLE,
 | 
			
		||||
  PROP_USE_ALPHA,
 | 
			
		||||
  PROP_KEY_FOCUS,
 | 
			
		||||
  PROP_ACCEPT_FOCUS,
 | 
			
		||||
  PROP_LAST
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -559,6 +546,33 @@ pick_record_contains_point (ClutterStage     *stage,
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_add_redraw_clip (ClutterStage          *stage,
 | 
			
		||||
                               cairo_rectangle_int_t *clip)
 | 
			
		||||
{
 | 
			
		||||
  GList *l;
 | 
			
		||||
 | 
			
		||||
  for (l = clutter_stage_peek_stage_views (stage); l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterStageView *view = l->data;
 | 
			
		||||
 | 
			
		||||
      if (!clip)
 | 
			
		||||
        {
 | 
			
		||||
          clutter_stage_view_add_redraw_clip (view, NULL);
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          cairo_rectangle_int_t view_layout;
 | 
			
		||||
          cairo_rectangle_int_t intersection;
 | 
			
		||||
 | 
			
		||||
          clutter_stage_view_get_layout (view, &view_layout);
 | 
			
		||||
          if (_clutter_util_rectangle_intersection (&view_layout, clip,
 | 
			
		||||
                                                    &intersection))
 | 
			
		||||
            clutter_stage_view_add_redraw_clip (view, &intersection);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
queue_full_redraw (ClutterStage *stage)
 | 
			
		||||
{
 | 
			
		||||
@@ -577,7 +591,7 @@ queue_full_redraw (ClutterStage *stage)
 | 
			
		||||
  if (stage_window == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  _clutter_stage_window_add_redraw_clip (stage_window, NULL);
 | 
			
		||||
  clutter_stage_add_redraw_clip (stage, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
@@ -903,15 +917,19 @@ setup_view_for_pick_or_paint (ClutterStage                *stage,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_do_paint_view (ClutterStage                *stage,
 | 
			
		||||
                             ClutterStageView            *view,
 | 
			
		||||
                             const cairo_rectangle_int_t *clip)
 | 
			
		||||
clutter_stage_do_paint_view (ClutterStage         *stage,
 | 
			
		||||
                             ClutterStageView     *view,
 | 
			
		||||
                             const cairo_region_t *redraw_clip)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintContext *paint_context;
 | 
			
		||||
  cairo_rectangle_int_t clip_rect;
 | 
			
		||||
 | 
			
		||||
  paint_context = clutter_paint_context_new_for_view (view);
 | 
			
		||||
  paint_context = clutter_paint_context_new_for_view (view, redraw_clip,
 | 
			
		||||
                                                      CLUTTER_PAINT_FLAG_NONE);
 | 
			
		||||
 | 
			
		||||
  cairo_region_get_extents (redraw_clip, &clip_rect);
 | 
			
		||||
  setup_view_for_pick_or_paint (stage, view, &clip_rect);
 | 
			
		||||
 | 
			
		||||
  setup_view_for_pick_or_paint (stage, view, clip);
 | 
			
		||||
  clutter_actor_paint (CLUTTER_ACTOR (stage), paint_context);
 | 
			
		||||
  clutter_paint_context_destroy (paint_context);
 | 
			
		||||
}
 | 
			
		||||
@@ -920,9 +938,9 @@ clutter_stage_do_paint_view (ClutterStage                *stage,
 | 
			
		||||
 * for picking or painting...
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_clutter_stage_paint_view (ClutterStage                *stage,
 | 
			
		||||
                           ClutterStageView            *view,
 | 
			
		||||
                           const cairo_rectangle_int_t *clip)
 | 
			
		||||
clutter_stage_paint_view (ClutterStage         *stage,
 | 
			
		||||
                          ClutterStageView     *view,
 | 
			
		||||
                          const cairo_region_t *redraw_clip)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv = stage->priv;
 | 
			
		||||
 | 
			
		||||
@@ -931,15 +949,11 @@ _clutter_stage_paint_view (ClutterStage                *stage,
 | 
			
		||||
 | 
			
		||||
  COGL_TRACE_BEGIN_SCOPED (ClutterStagePaintView, "Paint (view)");
 | 
			
		||||
 | 
			
		||||
  priv->view_clip = *clip;
 | 
			
		||||
 | 
			
		||||
  if (g_signal_has_handler_pending (stage, stage_signals[PAINT_VIEW],
 | 
			
		||||
                                    0, TRUE))
 | 
			
		||||
    g_signal_emit (stage, stage_signals[PAINT_VIEW], 0, view);
 | 
			
		||||
    g_signal_emit (stage, stage_signals[PAINT_VIEW], 0, view, redraw_clip);
 | 
			
		||||
  else
 | 
			
		||||
    CLUTTER_STAGE_GET_CLASS (stage)->paint_view (stage, view);
 | 
			
		||||
 | 
			
		||||
  priv->view_clip = (cairo_rectangle_int_t) { 0 };
 | 
			
		||||
    CLUTTER_STAGE_GET_CLASS (stage)->paint_view (stage, view, redraw_clip);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -1297,15 +1311,9 @@ clutter_stage_queue_actor_relayout (ClutterStage *stage,
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv = stage->priv;
 | 
			
		||||
 | 
			
		||||
  if (g_hash_table_contains (priv->pending_relayouts, stage))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (g_hash_table_size (priv->pending_relayouts) == 0)
 | 
			
		||||
    _clutter_stage_schedule_update (stage);
 | 
			
		||||
 | 
			
		||||
  if (actor == (ClutterActor *) stage)
 | 
			
		||||
    g_hash_table_remove_all (priv->pending_relayouts);
 | 
			
		||||
 | 
			
		||||
  g_hash_table_add (priv->pending_relayouts, g_object_ref (actor));
 | 
			
		||||
  priv->pending_relayouts_version++;
 | 
			
		||||
}
 | 
			
		||||
@@ -1416,16 +1424,12 @@ clutter_stage_do_redraw (ClutterStage *stage)
 | 
			
		||||
static GSList *
 | 
			
		||||
_clutter_stage_check_updated_pointers (ClutterStage *stage)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv = stage->priv;
 | 
			
		||||
  ClutterBackend *backend;
 | 
			
		||||
  ClutterSeat *seat;
 | 
			
		||||
  GSList *updating = NULL;
 | 
			
		||||
  GList *l, *devices;
 | 
			
		||||
  cairo_region_t *clip;
 | 
			
		||||
  graphene_point_t point;
 | 
			
		||||
 | 
			
		||||
  clip = _clutter_stage_window_get_redraw_clip (priv->impl);
 | 
			
		||||
 | 
			
		||||
  backend = clutter_get_default_backend ();
 | 
			
		||||
  seat = clutter_backend_get_default_seat (backend);
 | 
			
		||||
  devices = clutter_seat_list_devices (seat);
 | 
			
		||||
@@ -1433,6 +1437,8 @@ _clutter_stage_check_updated_pointers (ClutterStage *stage)
 | 
			
		||||
  for (l = devices; l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterInputDevice *dev = l->data;
 | 
			
		||||
      ClutterStageView *view;
 | 
			
		||||
      const cairo_region_t *clip;
 | 
			
		||||
 | 
			
		||||
      if (clutter_input_device_get_device_mode (dev) !=
 | 
			
		||||
          CLUTTER_INPUT_MODE_MASTER)
 | 
			
		||||
@@ -1448,6 +1454,11 @@ _clutter_stage_check_updated_pointers (ClutterStage *stage)
 | 
			
		||||
          if (!clutter_input_device_get_coords (dev, NULL, &point))
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
          view = clutter_stage_get_view_at (stage, point.x, point.y);
 | 
			
		||||
          if (!view)
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
          clip = clutter_stage_view_peek_redraw_clip (view);
 | 
			
		||||
          if (!clip || cairo_region_contains_point (clip, point.x, point.y))
 | 
			
		||||
            updating = g_slist_prepend (updating, dev);
 | 
			
		||||
          break;
 | 
			
		||||
@@ -1557,6 +1568,22 @@ clutter_stage_real_queue_relayout (ClutterActor *self)
 | 
			
		||||
  parent_class->queue_relayout (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
is_full_stage_redraw_queued (ClutterStage *stage)
 | 
			
		||||
{
 | 
			
		||||
  GList *l;
 | 
			
		||||
 | 
			
		||||
  for (l = clutter_stage_peek_stage_views (stage); l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterStageView *view = l->data;
 | 
			
		||||
 | 
			
		||||
      if (!clutter_stage_view_has_full_redraw_clip (view))
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_stage_real_queue_redraw (ClutterActor       *actor,
 | 
			
		||||
                                 ClutterActor       *leaf,
 | 
			
		||||
@@ -1578,12 +1605,12 @@ clutter_stage_real_queue_redraw (ClutterActor       *actor,
 | 
			
		||||
  if (stage_window == NULL)
 | 
			
		||||
    return TRUE;
 | 
			
		||||
 | 
			
		||||
  if (_clutter_stage_window_ignoring_redraw_clips (stage_window))
 | 
			
		||||
  if (is_full_stage_redraw_queued (stage))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  if (redraw_clip == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      _clutter_stage_window_add_redraw_clip (stage_window, NULL);
 | 
			
		||||
      clutter_stage_add_redraw_clip (stage, NULL);
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1615,43 +1642,20 @@ clutter_stage_real_queue_redraw (ClutterActor       *actor,
 | 
			
		||||
  stage_clip.width = intersection_box.x2 - stage_clip.x;
 | 
			
		||||
  stage_clip.height = intersection_box.y2 - stage_clip.y;
 | 
			
		||||
 | 
			
		||||
  _clutter_stage_window_add_redraw_clip (stage_window, &stage_clip);
 | 
			
		||||
  clutter_stage_add_redraw_clip (stage, &stage_clip);
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
_clutter_stage_has_full_redraw_queued (ClutterStage *stage)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindow *stage_window = _clutter_stage_get_window (stage);
 | 
			
		||||
 | 
			
		||||
  if (CLUTTER_ACTOR_IN_DESTRUCTION (stage) || stage_window == NULL)
 | 
			
		||||
  if (CLUTTER_ACTOR_IN_DESTRUCTION (stage))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  if (stage->priv->redraw_pending &&
 | 
			
		||||
      !_clutter_stage_window_has_redraw_clips (stage_window))
 | 
			
		||||
    return TRUE;
 | 
			
		||||
  else
 | 
			
		||||
  if (!stage->priv->redraw_pending)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cairo_region_t *
 | 
			
		||||
clutter_stage_get_redraw_clip (ClutterStage *stage)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv;
 | 
			
		||||
  cairo_rectangle_int_t clip;
 | 
			
		||||
  cairo_region_t *region;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_STAGE (stage), NULL);
 | 
			
		||||
 | 
			
		||||
  priv = stage->priv;
 | 
			
		||||
 | 
			
		||||
  region = _clutter_stage_window_get_redraw_clip (priv->impl);
 | 
			
		||||
  if (region)
 | 
			
		||||
    return region;
 | 
			
		||||
 | 
			
		||||
  /* Set clip to the full extents of the stage */
 | 
			
		||||
  _clutter_stage_window_get_geometry (priv->impl, &clip);
 | 
			
		||||
  return cairo_region_create_rectangle (&clip);
 | 
			
		||||
  return is_full_stage_redraw_queued (stage);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterActor *
 | 
			
		||||
@@ -1833,33 +1837,14 @@ clutter_stage_set_property (GObject      *object,
 | 
			
		||||
                                          clutter_value_get_color (value));
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_CURSOR_VISIBLE:
 | 
			
		||||
      if (g_value_get_boolean (value))
 | 
			
		||||
        clutter_stage_show_cursor (stage);
 | 
			
		||||
      else
 | 
			
		||||
        clutter_stage_hide_cursor (stage);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_PERSPECTIVE:
 | 
			
		||||
      clutter_stage_set_perspective (stage, g_value_get_boxed (value));
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_TITLE:
 | 
			
		||||
      clutter_stage_set_title (stage, g_value_get_string (value));
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_USE_ALPHA:
 | 
			
		||||
      clutter_stage_set_use_alpha (stage, g_value_get_boolean (value));
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_KEY_FOCUS:
 | 
			
		||||
      clutter_stage_set_key_focus (stage, g_value_get_object (value));
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_ACCEPT_FOCUS:
 | 
			
		||||
      clutter_stage_set_accept_focus (stage, g_value_get_boolean (value));
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
      break;
 | 
			
		||||
@@ -1886,10 +1871,6 @@ clutter_stage_get_property (GObject    *gobject,
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_CURSOR_VISIBLE:
 | 
			
		||||
      g_value_set_boolean (value, priv->is_cursor_visible);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_PERSPECTIVE:
 | 
			
		||||
      g_value_set_boxed (value, &priv->perspective);
 | 
			
		||||
      break;
 | 
			
		||||
@@ -1898,18 +1879,10 @@ clutter_stage_get_property (GObject    *gobject,
 | 
			
		||||
      g_value_set_string (value, priv->title);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_USE_ALPHA:
 | 
			
		||||
      g_value_set_boolean (value, priv->use_alpha);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_KEY_FOCUS:
 | 
			
		||||
      g_value_set_object (value, priv->key_focused_actor);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_ACCEPT_FOCUS:
 | 
			
		||||
      g_value_set_boolean (value, priv->accept_focus);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
 | 
			
		||||
      break;
 | 
			
		||||
@@ -1973,20 +1946,15 @@ clutter_stage_finalize (GObject *object)
 | 
			
		||||
  if (priv->fps_timer != NULL)
 | 
			
		||||
    g_timer_destroy (priv->fps_timer);
 | 
			
		||||
 | 
			
		||||
  if (priv->paint_notify != NULL)
 | 
			
		||||
    priv->paint_notify (priv->paint_data);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_stage_parent_class)->finalize (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_real_paint_view (ClutterStage     *stage,
 | 
			
		||||
                               ClutterStageView *view)
 | 
			
		||||
clutter_stage_real_paint_view (ClutterStage         *stage,
 | 
			
		||||
                               ClutterStageView     *view,
 | 
			
		||||
                               const cairo_region_t *redraw_clip)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv = stage->priv;
 | 
			
		||||
  const cairo_rectangle_int_t *clip = &priv->view_clip;
 | 
			
		||||
 | 
			
		||||
  clutter_stage_do_paint_view (stage, view, clip);
 | 
			
		||||
  clutter_stage_do_paint_view (stage, view, redraw_clip);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -2019,18 +1987,6 @@ clutter_stage_class_init (ClutterStageClass *klass)
 | 
			
		||||
 | 
			
		||||
  klass->paint_view = clutter_stage_real_paint_view;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterStage:cursor-visible:
 | 
			
		||||
   *
 | 
			
		||||
   * Whether the mouse pointer should be visible
 | 
			
		||||
   */
 | 
			
		||||
  obj_props[PROP_CURSOR_VISIBLE] =
 | 
			
		||||
      g_param_spec_boolean ("cursor-visible",
 | 
			
		||||
                            P_("Cursor Visible"),
 | 
			
		||||
                            P_("Whether the mouse pointer is visible on the main stage"),
 | 
			
		||||
                            TRUE,
 | 
			
		||||
                            CLUTTER_PARAM_READWRITE);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterStage:color:
 | 
			
		||||
   *
 | 
			
		||||
@@ -2060,7 +2016,7 @@ clutter_stage_class_init (ClutterStageClass *klass)
 | 
			
		||||
                          P_("Perspective"),
 | 
			
		||||
                          P_("Perspective projection parameters"),
 | 
			
		||||
                          CLUTTER_TYPE_PERSPECTIVE,
 | 
			
		||||
                          CLUTTER_PARAM_READWRITE);
 | 
			
		||||
                          CLUTTER_PARAM_READABLE);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterStage:title:
 | 
			
		||||
@@ -2076,23 +2032,6 @@ clutter_stage_class_init (ClutterStageClass *klass)
 | 
			
		||||
                           NULL,
 | 
			
		||||
                           CLUTTER_PARAM_READWRITE);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterStage:use-alpha:
 | 
			
		||||
   *
 | 
			
		||||
   * Whether the #ClutterStage should honour the alpha component of the
 | 
			
		||||
   * #ClutterStage:color property when painting. If Clutter is run under
 | 
			
		||||
   * a compositing manager this will result in the stage being blended
 | 
			
		||||
   * with the underlying window(s)
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.2
 | 
			
		||||
   */
 | 
			
		||||
  obj_props[PROP_USE_ALPHA] =
 | 
			
		||||
      g_param_spec_boolean ("use-alpha",
 | 
			
		||||
                            P_("Use Alpha"),
 | 
			
		||||
                            P_("Whether to honour the alpha component of the stage color"),
 | 
			
		||||
                            FALSE,
 | 
			
		||||
                            CLUTTER_PARAM_READWRITE);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterStage:key-focus:
 | 
			
		||||
   *
 | 
			
		||||
@@ -2110,20 +2049,6 @@ clutter_stage_class_init (ClutterStageClass *klass)
 | 
			
		||||
                           CLUTTER_TYPE_ACTOR,
 | 
			
		||||
                           CLUTTER_PARAM_READWRITE);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterStage:accept-focus:
 | 
			
		||||
   *
 | 
			
		||||
   * Whether the #ClutterStage should accept key focus when shown.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.6
 | 
			
		||||
   */
 | 
			
		||||
  obj_props[PROP_ACCEPT_FOCUS] =
 | 
			
		||||
      g_param_spec_boolean ("accept-focus",
 | 
			
		||||
                            P_("Accept Focus"),
 | 
			
		||||
                            P_("Whether the stage should accept focus on show"),
 | 
			
		||||
                            TRUE,
 | 
			
		||||
                            CLUTTER_PARAM_READWRITE);
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_properties (gobject_class, PROP_LAST, obj_props);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@@ -2212,6 +2137,7 @@ clutter_stage_class_init (ClutterStageClass *klass)
 | 
			
		||||
   * ClutterStage::paint-view:
 | 
			
		||||
   * @stage: the stage that received the event
 | 
			
		||||
   * @view: a #ClutterStageView
 | 
			
		||||
   * @redraw_clip: a #cairo_region_t with the redraw clip
 | 
			
		||||
   *
 | 
			
		||||
   * The ::paint-view signal is emitted before a #ClutterStageView is being
 | 
			
		||||
   * painted.
 | 
			
		||||
@@ -2226,8 +2152,9 @@ clutter_stage_class_init (ClutterStageClass *klass)
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterStageClass, paint_view),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_STAGE_VIEW);
 | 
			
		||||
                  G_TYPE_NONE, 2,
 | 
			
		||||
                  CLUTTER_TYPE_STAGE_VIEW,
 | 
			
		||||
                  G_TYPE_POINTER);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterStage::presented: (skip)
 | 
			
		||||
@@ -2296,7 +2223,6 @@ clutter_stage_init (ClutterStage *self)
 | 
			
		||||
 | 
			
		||||
  priv->event_queue = g_queue_new ();
 | 
			
		||||
 | 
			
		||||
  priv->is_cursor_visible = TRUE;
 | 
			
		||||
  priv->throttle_motion_events = TRUE;
 | 
			
		||||
  priv->min_size_changed = FALSE;
 | 
			
		||||
  priv->sync_delay = -1;
 | 
			
		||||
@@ -2419,8 +2345,8 @@ clutter_stage_get_color (ClutterStage *stage,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_set_perspective_internal (ClutterStage       *stage,
 | 
			
		||||
                                        ClutterPerspective *perspective)
 | 
			
		||||
clutter_stage_set_perspective (ClutterStage       *stage,
 | 
			
		||||
                               ClutterPerspective *perspective)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv = stage->priv;
 | 
			
		||||
 | 
			
		||||
@@ -2445,36 +2371,6 @@ clutter_stage_set_perspective_internal (ClutterStage       *stage,
 | 
			
		||||
  clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_set_perspective:
 | 
			
		||||
 * @stage: A #ClutterStage
 | 
			
		||||
 * @perspective: A #ClutterPerspective
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the stage perspective. Using this function is not recommended
 | 
			
		||||
 * because it will disable Clutter's attempts to generate an
 | 
			
		||||
 * appropriate perspective based on the size of the stage.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_set_perspective (ClutterStage       *stage,
 | 
			
		||||
                               ClutterPerspective *perspective)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_STAGE (stage));
 | 
			
		||||
  g_return_if_fail (perspective != NULL);
 | 
			
		||||
  g_return_if_fail (perspective->z_far - perspective->z_near != 0);
 | 
			
		||||
 | 
			
		||||
  priv = stage->priv;
 | 
			
		||||
 | 
			
		||||
  /* If the application ever calls this function then we'll stop
 | 
			
		||||
     automatically updating the perspective when the stage changes
 | 
			
		||||
     size */
 | 
			
		||||
  priv->has_custom_perspective = TRUE;
 | 
			
		||||
 | 
			
		||||
  clutter_stage_set_perspective_internal (stage, perspective);
 | 
			
		||||
  clutter_stage_update_view_perspective (stage);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_get_perspective:
 | 
			
		||||
 * @stage: A #ClutterStage
 | 
			
		||||
@@ -2501,7 +2397,7 @@ clutter_stage_get_perspective (ClutterStage       *stage,
 | 
			
		||||
 *              @stage.
 | 
			
		||||
 *
 | 
			
		||||
 * Retrieves the @stage's projection matrix. This is derived from the
 | 
			
		||||
 * current perspective set using clutter_stage_set_perspective().
 | 
			
		||||
 * current perspective.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.6
 | 
			
		||||
 */
 | 
			
		||||
@@ -2665,72 +2561,6 @@ _clutter_stage_get_viewport (ClutterStage *stage,
 | 
			
		||||
  *height = priv->viewport[3];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_show_cursor:
 | 
			
		||||
 * @stage: a #ClutterStage
 | 
			
		||||
 *
 | 
			
		||||
 * Shows the cursor on the stage window
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_show_cursor (ClutterStage *stage)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_STAGE (stage));
 | 
			
		||||
 | 
			
		||||
  priv = stage->priv;
 | 
			
		||||
  if (!priv->is_cursor_visible)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterStageWindow *impl = CLUTTER_STAGE_WINDOW (priv->impl);
 | 
			
		||||
      ClutterStageWindowInterface *iface;
 | 
			
		||||
 | 
			
		||||
      iface = CLUTTER_STAGE_WINDOW_GET_IFACE (impl);
 | 
			
		||||
      if (iface->set_cursor_visible)
 | 
			
		||||
        {
 | 
			
		||||
          priv->is_cursor_visible = TRUE;
 | 
			
		||||
 | 
			
		||||
          iface->set_cursor_visible (impl, TRUE);
 | 
			
		||||
 | 
			
		||||
          g_object_notify_by_pspec (G_OBJECT (stage),
 | 
			
		||||
                                    obj_props[PROP_CURSOR_VISIBLE]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_hide_cursor:
 | 
			
		||||
 * @stage: a #ClutterStage
 | 
			
		||||
 *
 | 
			
		||||
 * Makes the cursor invisible on the stage window
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.4
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_hide_cursor (ClutterStage *stage)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_STAGE (stage));
 | 
			
		||||
 | 
			
		||||
  priv = stage->priv;
 | 
			
		||||
  if (priv->is_cursor_visible)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterStageWindow *impl = CLUTTER_STAGE_WINDOW (priv->impl);
 | 
			
		||||
      ClutterStageWindowInterface *iface;
 | 
			
		||||
 | 
			
		||||
      iface = CLUTTER_STAGE_WINDOW_GET_IFACE (impl);
 | 
			
		||||
      if (iface->set_cursor_visible)
 | 
			
		||||
        {
 | 
			
		||||
          priv->is_cursor_visible = FALSE;
 | 
			
		||||
 | 
			
		||||
          iface->set_cursor_visible (impl, FALSE);
 | 
			
		||||
 | 
			
		||||
          g_object_notify_by_pspec (G_OBJECT (stage),
 | 
			
		||||
                                    obj_props[PROP_CURSOR_VISIBLE]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_read_pixels:
 | 
			
		||||
 * @stage: A #ClutterStage
 | 
			
		||||
@@ -2803,13 +2633,17 @@ clutter_stage_read_pixels (ClutterStage *stage,
 | 
			
		||||
                                      .height = height,
 | 
			
		||||
                                    });
 | 
			
		||||
  cairo_region_get_extents (clip, &clip_rect);
 | 
			
		||||
  cairo_region_destroy (clip);
 | 
			
		||||
 | 
			
		||||
  if (clip_rect.width == 0 || clip_rect.height == 0)
 | 
			
		||||
    return NULL;
 | 
			
		||||
    {
 | 
			
		||||
      cairo_region_destroy (clip);
 | 
			
		||||
      return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  framebuffer = clutter_stage_view_get_framebuffer (view);
 | 
			
		||||
  clutter_stage_do_paint_view (stage, view, &clip_rect);
 | 
			
		||||
  clutter_stage_do_paint_view (stage, view, clip);
 | 
			
		||||
 | 
			
		||||
  cairo_region_destroy (clip);
 | 
			
		||||
 | 
			
		||||
  view_scale = clutter_stage_view_get_scale (view);
 | 
			
		||||
  pixel_width = roundf (clip_rect.width * view_scale);
 | 
			
		||||
@@ -3278,30 +3112,20 @@ clutter_stage_update_view_perspective (ClutterStage *stage)
 | 
			
		||||
 | 
			
		||||
  perspective = priv->perspective;
 | 
			
		||||
 | 
			
		||||
  /* Ideally we want to regenerate the perspective matrix whenever
 | 
			
		||||
   * the size changes but if the user has provided a custom matrix
 | 
			
		||||
   * then we don't want to override it */
 | 
			
		||||
  if (!priv->has_custom_perspective)
 | 
			
		||||
    {
 | 
			
		||||
      perspective.fovy = 60.0; /* 60 Degrees */
 | 
			
		||||
      perspective.z_near = 0.1;
 | 
			
		||||
      perspective.aspect = priv->viewport[2] / priv->viewport[3];
 | 
			
		||||
      z_2d = calculate_z_translation (perspective.z_near);
 | 
			
		||||
  perspective.fovy = 60.0; /* 60 Degrees */
 | 
			
		||||
  perspective.z_near = 0.1;
 | 
			
		||||
  perspective.aspect = priv->viewport[2] / priv->viewport[3];
 | 
			
		||||
  z_2d = calculate_z_translation (perspective.z_near);
 | 
			
		||||
 | 
			
		||||
      /* NB: z_2d is only enough room for 85% of the stage_height between
 | 
			
		||||
       * the stage and the z_near plane. For behind the stage plane we
 | 
			
		||||
       * want a more consistent gap of 10 times the stage_height before
 | 
			
		||||
       * hitting the far plane so we calculate that relative to the final
 | 
			
		||||
       * height of the stage plane at the z_2d_distance we got... */
 | 
			
		||||
      perspective.z_far = z_2d +
 | 
			
		||||
        tanf (_DEG_TO_RAD (perspective.fovy / 2.0f)) * z_2d * 20.0f;
 | 
			
		||||
  /* NB: z_2d is only enough room for 85% of the stage_height between
 | 
			
		||||
   * the stage and the z_near plane. For behind the stage plane we
 | 
			
		||||
   * want a more consistent gap of 10 times the stage_height before
 | 
			
		||||
   * hitting the far plane so we calculate that relative to the final
 | 
			
		||||
   * height of the stage plane at the z_2d_distance we got... */
 | 
			
		||||
  perspective.z_far = z_2d +
 | 
			
		||||
    tanf (_DEG_TO_RAD (perspective.fovy / 2.0f)) * z_2d * 20.0f;
 | 
			
		||||
 | 
			
		||||
      clutter_stage_set_perspective_internal (stage, &perspective);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      z_2d = calculate_z_translation (perspective.z_near);
 | 
			
		||||
    }
 | 
			
		||||
  clutter_stage_set_perspective (stage, &perspective);
 | 
			
		||||
 | 
			
		||||
  cogl_matrix_init_identity (&priv->view);
 | 
			
		||||
  cogl_matrix_view_2d_in_perspective (&priv->view,
 | 
			
		||||
@@ -3531,56 +3355,6 @@ clutter_stage_get_throttle_motion_events (ClutterStage *stage)
 | 
			
		||||
  return stage->priv->throttle_motion_events;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_set_use_alpha:
 | 
			
		||||
 * @stage: a #ClutterStage
 | 
			
		||||
 * @use_alpha: whether the stage should honour the opacity or the
 | 
			
		||||
 *   alpha channel of the stage color
 | 
			
		||||
 *
 | 
			
		||||
 * Sets whether the @stage should honour the #ClutterActor:opacity and
 | 
			
		||||
 * the alpha channel of the #ClutterStage:color
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.2
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_set_use_alpha (ClutterStage *stage,
 | 
			
		||||
                             gboolean      use_alpha)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_STAGE (stage));
 | 
			
		||||
 | 
			
		||||
  priv = stage->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->use_alpha != use_alpha)
 | 
			
		||||
    {
 | 
			
		||||
      priv->use_alpha = use_alpha;
 | 
			
		||||
 | 
			
		||||
      clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
 | 
			
		||||
 | 
			
		||||
      g_object_notify_by_pspec (G_OBJECT (stage), obj_props[PROP_USE_ALPHA]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_get_use_alpha:
 | 
			
		||||
 * @stage: a #ClutterStage
 | 
			
		||||
 *
 | 
			
		||||
 * Retrieves the value set using clutter_stage_set_use_alpha()
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: %TRUE if the stage should honour the opacity and the
 | 
			
		||||
 *   alpha channel of the stage color
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.2
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_stage_get_use_alpha (ClutterStage *stage)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_STAGE (stage), FALSE);
 | 
			
		||||
 | 
			
		||||
  return stage->priv->use_alpha;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_set_minimum_size:
 | 
			
		||||
 * @stage: a #ClutterStage
 | 
			
		||||
@@ -3927,56 +3701,6 @@ clutter_stage_maybe_finish_queue_redraws (ClutterStage *stage)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_set_accept_focus:
 | 
			
		||||
 * @stage: a #ClutterStage
 | 
			
		||||
 * @accept_focus: %TRUE to accept focus on show
 | 
			
		||||
 *
 | 
			
		||||
 * Sets whether the @stage should accept the key focus when shown.
 | 
			
		||||
 *
 | 
			
		||||
 * This function should be called before showing @stage using
 | 
			
		||||
 * clutter_actor_show().
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.6
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_set_accept_focus (ClutterStage *stage,
 | 
			
		||||
                                gboolean      accept_focus)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_STAGE (stage));
 | 
			
		||||
 | 
			
		||||
  accept_focus = !!accept_focus;
 | 
			
		||||
 | 
			
		||||
  priv = stage->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->accept_focus != accept_focus)
 | 
			
		||||
    {
 | 
			
		||||
      _clutter_stage_window_set_accept_focus (priv->impl, accept_focus);
 | 
			
		||||
      g_object_notify_by_pspec (G_OBJECT (stage), obj_props[PROP_ACCEPT_FOCUS]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_get_accept_focus:
 | 
			
		||||
 * @stage: a #ClutterStage
 | 
			
		||||
 *
 | 
			
		||||
 * Retrieves the value set with clutter_stage_set_accept_focus().
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: %TRUE if the #ClutterStage should accept focus, and %FALSE
 | 
			
		||||
 *   otherwise
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.6
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_stage_get_accept_focus (ClutterStage *stage)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_STAGE (stage), TRUE);
 | 
			
		||||
 | 
			
		||||
  return stage->priv->accept_focus;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_set_motion_events_enabled:
 | 
			
		||||
 * @stage: a #ClutterStage
 | 
			
		||||
@@ -4316,7 +4040,6 @@ capture_view (ClutterStage          *stage,
 | 
			
		||||
                                      texture_width, texture_height);
 | 
			
		||||
  cairo_surface_set_device_scale (image, view_scale, view_scale);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  data = cairo_image_surface_get_data (image);
 | 
			
		||||
  stride = cairo_image_surface_get_stride (image);
 | 
			
		||||
 | 
			
		||||
@@ -4326,6 +4049,20 @@ capture_view (ClutterStage          *stage,
 | 
			
		||||
  cairo_surface_mark_dirty (capture->image);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_capture:
 | 
			
		||||
 * @stage: a #ClutterStage
 | 
			
		||||
 * @paint: whether to pain the frame
 | 
			
		||||
 * @rect: a #cairo_rectangle_int_t in stage coordinates
 | 
			
		||||
 * @out_captures: (out) (array length=out_n_captures): an array of
 | 
			
		||||
 *   #ClutterCapture
 | 
			
		||||
 * @out_n_captures: (out): the number of captures in @out_captures
 | 
			
		||||
 *
 | 
			
		||||
 * Captures the stage pixels of @rect into @captures. @rect is in stage
 | 
			
		||||
 * coordinates.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: %TRUE if a #ClutterCapture has been created, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_stage_capture (ClutterStage          *stage,
 | 
			
		||||
                       gboolean               paint,
 | 
			
		||||
@@ -4427,6 +4164,97 @@ clutter_stage_get_capture_final_size (ClutterStage          *stage,
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_paint_to_framebuffer (ClutterStage                *stage,
 | 
			
		||||
                                    CoglFramebuffer             *framebuffer,
 | 
			
		||||
                                    const cairo_rectangle_int_t *rect,
 | 
			
		||||
                                    float                        scale,
 | 
			
		||||
                                    ClutterPaintFlag             paint_flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv = stage->priv;
 | 
			
		||||
  ClutterPaintContext *paint_context;
 | 
			
		||||
  cairo_region_t *redraw_clip;
 | 
			
		||||
 | 
			
		||||
  redraw_clip = cairo_region_create_rectangle (rect);
 | 
			
		||||
  paint_context =
 | 
			
		||||
    clutter_paint_context_new_for_framebuffer (framebuffer,
 | 
			
		||||
                                               redraw_clip,
 | 
			
		||||
                                               paint_flags);
 | 
			
		||||
  cairo_region_destroy (redraw_clip);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_push_matrix (framebuffer);
 | 
			
		||||
  cogl_framebuffer_set_projection_matrix (framebuffer, &priv->projection);
 | 
			
		||||
  cogl_framebuffer_set_viewport (framebuffer,
 | 
			
		||||
                                 -(rect->x * scale),
 | 
			
		||||
                                 -(rect->y * scale),
 | 
			
		||||
                                 priv->viewport[2] * scale,
 | 
			
		||||
                                 priv->viewport[3] * scale);
 | 
			
		||||
  clutter_actor_paint (CLUTTER_ACTOR (stage), paint_context);
 | 
			
		||||
  cogl_framebuffer_pop_matrix (framebuffer);
 | 
			
		||||
 | 
			
		||||
  clutter_paint_context_destroy (paint_context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_stage_paint_to_buffer (ClutterStage                 *stage,
 | 
			
		||||
                               const cairo_rectangle_int_t  *rect,
 | 
			
		||||
                               float                         scale,
 | 
			
		||||
                               uint8_t                      *data,
 | 
			
		||||
                               int                           stride,
 | 
			
		||||
                               CoglPixelFormat               format,
 | 
			
		||||
                               ClutterPaintFlag              paint_flags,
 | 
			
		||||
                               GError                      **error)
 | 
			
		||||
{
 | 
			
		||||
  ClutterBackend *clutter_backend = clutter_get_default_backend ();
 | 
			
		||||
  CoglContext *cogl_context =
 | 
			
		||||
    clutter_backend_get_cogl_context (clutter_backend);
 | 
			
		||||
  int texture_width, texture_height;
 | 
			
		||||
  CoglTexture2D *texture;
 | 
			
		||||
  CoglOffscreen *offscreen;
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
  CoglBitmap *bitmap;
 | 
			
		||||
 | 
			
		||||
  texture_width = (int) ceilf (rect->width * scale);
 | 
			
		||||
  texture_height = (int) ceilf (rect->height * scale);
 | 
			
		||||
  texture = cogl_texture_2d_new_with_size (cogl_context,
 | 
			
		||||
                                           texture_width,
 | 
			
		||||
                                           texture_height);
 | 
			
		||||
  if (!texture)
 | 
			
		||||
    {
 | 
			
		||||
      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
 | 
			
		||||
                   "Failed to create %dx%d texture",
 | 
			
		||||
                   texture_width, texture_height);
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  offscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (texture));
 | 
			
		||||
  framebuffer = COGL_FRAMEBUFFER (offscreen);
 | 
			
		||||
 | 
			
		||||
  cogl_object_unref (texture);
 | 
			
		||||
 | 
			
		||||
  if (!cogl_framebuffer_allocate (framebuffer, error))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  clutter_stage_paint_to_framebuffer (stage, framebuffer,
 | 
			
		||||
                                      rect, scale, paint_flags);
 | 
			
		||||
 | 
			
		||||
  bitmap = cogl_bitmap_new_for_data (cogl_context,
 | 
			
		||||
                                     texture_width, texture_height,
 | 
			
		||||
                                     format,
 | 
			
		||||
                                     stride,
 | 
			
		||||
                                     data);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_read_pixels_into_bitmap (framebuffer,
 | 
			
		||||
                                            0, 0,
 | 
			
		||||
                                            COGL_READ_PIXELS_COLOR_BUFFER,
 | 
			
		||||
                                            bitmap);
 | 
			
		||||
 | 
			
		||||
  cogl_object_unref (bitmap);
 | 
			
		||||
  cogl_object_unref (framebuffer);
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
capture_view_into (ClutterStage          *stage,
 | 
			
		||||
                   gboolean               paint,
 | 
			
		||||
@@ -4450,8 +4278,12 @@ capture_view_into (ClutterStage          *stage,
 | 
			
		||||
 | 
			
		||||
  if (paint)
 | 
			
		||||
    {
 | 
			
		||||
      cairo_region_t *region;
 | 
			
		||||
 | 
			
		||||
      _clutter_stage_maybe_setup_viewport (stage, view);
 | 
			
		||||
      clutter_stage_do_paint_view (stage, view, rect);
 | 
			
		||||
      region = cairo_region_create_rectangle (rect);
 | 
			
		||||
      clutter_stage_do_paint_view (stage, view, region);
 | 
			
		||||
      cairo_region_destroy (region);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  view_scale = clutter_stage_view_get_scale (view);
 | 
			
		||||
@@ -4477,49 +4309,42 @@ capture_view_into (ClutterStage          *stage,
 | 
			
		||||
  cogl_object_unref (bitmap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterStageView *
 | 
			
		||||
get_view_at_rect (ClutterStage          *stage,
 | 
			
		||||
                  cairo_rectangle_int_t *rect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv = stage->priv;
 | 
			
		||||
  GList *views = _clutter_stage_window_get_views (priv->impl);
 | 
			
		||||
  GList *l;
 | 
			
		||||
 | 
			
		||||
  for (l = views; l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterStageView *view = l->data;
 | 
			
		||||
      cairo_rectangle_int_t view_layout;
 | 
			
		||||
      cairo_region_t *region;
 | 
			
		||||
      cairo_rectangle_int_t view_capture_rect;
 | 
			
		||||
 | 
			
		||||
      clutter_stage_view_get_layout (view, &view_layout);
 | 
			
		||||
      region = cairo_region_create_rectangle (&view_layout);
 | 
			
		||||
      cairo_region_intersect_rectangle (region, rect);
 | 
			
		||||
      cairo_region_get_extents (region, &view_capture_rect);
 | 
			
		||||
      cairo_region_destroy (region);
 | 
			
		||||
 | 
			
		||||
      if (view_capture_rect.width == 0 || view_capture_rect.height == 0)
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      g_assert (view_capture_rect.width == rect->width &&
 | 
			
		||||
                view_capture_rect.height == rect->height);
 | 
			
		||||
      return view;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_capture_into (ClutterStage          *stage,
 | 
			
		||||
                            gboolean               paint,
 | 
			
		||||
                            cairo_rectangle_int_t *rect,
 | 
			
		||||
                            uint8_t               *data)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageView *view;
 | 
			
		||||
  ClutterStagePrivate *priv = stage->priv;
 | 
			
		||||
  GList *l;
 | 
			
		||||
  int bpp = 4;
 | 
			
		||||
  int stride;
 | 
			
		||||
 | 
			
		||||
  view = get_view_at_rect (stage, rect);
 | 
			
		||||
  capture_view_into (stage, paint, view, rect, data, rect->width * bpp);
 | 
			
		||||
  stride = rect->width * 4;
 | 
			
		||||
 | 
			
		||||
  for (l = _clutter_stage_window_get_views (priv->impl); l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterStageView *view = l->data;
 | 
			
		||||
      cairo_rectangle_int_t view_layout;
 | 
			
		||||
      cairo_region_t *region;
 | 
			
		||||
      cairo_rectangle_int_t capture_rect;
 | 
			
		||||
      int x_offset, y_offset;
 | 
			
		||||
 | 
			
		||||
      clutter_stage_view_get_layout (view, &view_layout);
 | 
			
		||||
      region = cairo_region_create_rectangle (&view_layout);
 | 
			
		||||
      cairo_region_intersect_rectangle (region, rect);
 | 
			
		||||
 | 
			
		||||
      cairo_region_get_extents (region, &capture_rect);
 | 
			
		||||
      cairo_region_destroy (region);
 | 
			
		||||
 | 
			
		||||
      x_offset = capture_rect.x - rect->x;
 | 
			
		||||
      y_offset = capture_rect.y - rect->y;
 | 
			
		||||
 | 
			
		||||
      capture_view_into (stage, paint, view,
 | 
			
		||||
                         &capture_rect,
 | 
			
		||||
                         data + (x_offset * bpp) + (y_offset * stride),
 | 
			
		||||
                         stride);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -4577,8 +4402,11 @@ clutter_stage_thaw_updates (ClutterStage *stage)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_stage_peek_stage_views: (skip)
 | 
			
		||||
 */
 | 
			
		||||
GList *
 | 
			
		||||
_clutter_stage_peek_stage_views (ClutterStage *stage)
 | 
			
		||||
clutter_stage_peek_stage_views (ClutterStage *stage)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStagePrivate *priv = stage->priv;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -84,8 +84,9 @@ struct _ClutterStageClass
 | 
			
		||||
  gboolean (* delete_event) (ClutterStage *stage,
 | 
			
		||||
                             ClutterEvent *event);
 | 
			
		||||
 | 
			
		||||
  void (* paint_view) (ClutterStage     *stage,
 | 
			
		||||
                       ClutterStageView *view);
 | 
			
		||||
  void (* paint_view) (ClutterStage         *stage,
 | 
			
		||||
                       ClutterStageView     *view,
 | 
			
		||||
                       const cairo_region_t *redraw_clip);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  /* padding for future expansion */
 | 
			
		||||
@@ -102,8 +103,7 @@ struct _ClutterStageClass
 | 
			
		||||
 * @z_far: the distance from the viewer to the far clipping
 | 
			
		||||
 *   plane (always positive)
 | 
			
		||||
 *
 | 
			
		||||
 * Stage perspective definition. #ClutterPerspective is only used by
 | 
			
		||||
 * the fixed point version of clutter_stage_set_perspective().
 | 
			
		||||
 * Stage perspective definition.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.4
 | 
			
		||||
 */
 | 
			
		||||
@@ -139,17 +139,10 @@ GType clutter_stage_get_type (void) G_GNUC_CONST;
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterActor *  clutter_stage_new                               (void);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_set_perspective                   (ClutterStage          *stage,
 | 
			
		||||
			                                         ClutterPerspective    *perspective);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_get_perspective                   (ClutterStage          *stage,
 | 
			
		||||
			                                         ClutterPerspective    *perspective);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_show_cursor                       (ClutterStage          *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_hide_cursor                       (ClutterStage          *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_set_title                         (ClutterStage          *stage,
 | 
			
		||||
                                                                 const gchar           *title);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
@@ -185,11 +178,6 @@ void            clutter_stage_set_motion_events_enabled         (ClutterStage
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        clutter_stage_get_motion_events_enabled         (ClutterStage          *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_set_accept_focus                  (ClutterStage          *stage,
 | 
			
		||||
                                                                 gboolean               accept_focus);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        clutter_stage_get_accept_focus                  (ClutterStage          *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        clutter_stage_event                             (ClutterStage          *stage,
 | 
			
		||||
                                                                 ClutterEvent          *event);
 | 
			
		||||
 | 
			
		||||
@@ -205,8 +193,6 @@ guchar *        clutter_stage_read_pixels                       (ClutterStage
 | 
			
		||||
                                                                 gint                   width,
 | 
			
		||||
                                                                 gint                   height);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
cairo_region_t * clutter_stage_get_redraw_clip                  (ClutterStage          *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_ensure_viewport                   (ClutterStage          *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
@@ -234,8 +220,8 @@ CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_stage_capture (ClutterStage          *stage,
 | 
			
		||||
                                gboolean               paint,
 | 
			
		||||
                                cairo_rectangle_int_t *rect,
 | 
			
		||||
                                ClutterCapture       **captures,
 | 
			
		||||
                                int                   *n_captures);
 | 
			
		||||
                                ClutterCapture       **out_captures,
 | 
			
		||||
                                int                   *out_n_captures);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterStageView * clutter_stage_get_view_at (ClutterStage *stage,
 | 
			
		||||
                                              float         x,
 | 
			
		||||
 
 | 
			
		||||
@@ -348,13 +348,23 @@ clutter_text_input_focus_request_surrounding (ClutterInputFocus *focus)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_input_focus_delete_surrounding (ClutterInputFocus *focus,
 | 
			
		||||
                                             guint              offset,
 | 
			
		||||
                                             int                offset,
 | 
			
		||||
                                             guint              len)
 | 
			
		||||
{
 | 
			
		||||
  ClutterText *clutter_text = CLUTTER_TEXT_INPUT_FOCUS (focus)->text;
 | 
			
		||||
  int cursor;
 | 
			
		||||
  int start;
 | 
			
		||||
 | 
			
		||||
  cursor = clutter_text_get_cursor_position (clutter_text);
 | 
			
		||||
  start = cursor + offset;
 | 
			
		||||
  if (start < 0)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("The offset '%d' of deleting surrounding is larger than the cursor pos '%d'",
 | 
			
		||||
                 offset, cursor);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  if (clutter_text_get_editable (clutter_text))
 | 
			
		||||
    clutter_text_delete_text (clutter_text, offset, len);
 | 
			
		||||
    clutter_text_delete_text (clutter_text, start, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -1897,14 +1907,6 @@ clutter_text_foreach_selection_rectangle (ClutterText              *self,
 | 
			
		||||
  g_free (utf8);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
add_selection_rectangle_to_path (ClutterText           *text,
 | 
			
		||||
                                 const ClutterActorBox *box,
 | 
			
		||||
                                 gpointer               user_data)
 | 
			
		||||
{
 | 
			
		||||
  cogl_path_rectangle (user_data, box->x1, box->y1, box->x2, box->y2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_foreach_selection_rectangle_prescaled (ClutterText              *self,
 | 
			
		||||
                                                    ClutterTextSelectionFunc  func,
 | 
			
		||||
@@ -1913,6 +1915,60 @@ clutter_text_foreach_selection_rectangle_prescaled (ClutterText              *se
 | 
			
		||||
  clutter_text_foreach_selection_rectangle (self, 1.0f, func, user_data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
paint_selection_rectangle (ClutterText           *self,
 | 
			
		||||
                           const ClutterActorBox *box,
 | 
			
		||||
                           gpointer               user_data)
 | 
			
		||||
{
 | 
			
		||||
  CoglFramebuffer *fb = user_data;
 | 
			
		||||
  ClutterTextPrivate *priv = self->priv;
 | 
			
		||||
  ClutterActor *actor = CLUTTER_ACTOR (self);
 | 
			
		||||
  guint8 paint_opacity = clutter_actor_get_paint_opacity (actor);
 | 
			
		||||
  CoglPipeline *color_pipeline = cogl_pipeline_copy (default_color_pipeline);
 | 
			
		||||
  PangoLayout *layout = clutter_text_get_layout (self);
 | 
			
		||||
  CoglColor cogl_color = { 0, };
 | 
			
		||||
  const ClutterColor *color;
 | 
			
		||||
 | 
			
		||||
  /* Paint selection background */
 | 
			
		||||
  if (priv->selection_color_set)
 | 
			
		||||
    color = &priv->selection_color;
 | 
			
		||||
  else if (priv->cursor_color_set)
 | 
			
		||||
    color = &priv->cursor_color;
 | 
			
		||||
  else
 | 
			
		||||
    color = &priv->text_color;
 | 
			
		||||
 | 
			
		||||
  cogl_color_init_from_4ub (&cogl_color,
 | 
			
		||||
                            color->red,
 | 
			
		||||
                            color->green,
 | 
			
		||||
                            color->blue,
 | 
			
		||||
                            paint_opacity * color->alpha / 255);
 | 
			
		||||
  cogl_color_premultiply (&cogl_color);
 | 
			
		||||
  cogl_pipeline_set_color (color_pipeline, &cogl_color);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_push_rectangle_clip (fb,
 | 
			
		||||
                                        box->x1, box->y1,
 | 
			
		||||
                                        box->x2, box->y2);
 | 
			
		||||
  cogl_framebuffer_draw_rectangle (fb, color_pipeline,
 | 
			
		||||
                                   box->x1, box->y1,
 | 
			
		||||
                                   box->x2, box->y2);
 | 
			
		||||
 | 
			
		||||
  if (priv->selected_text_color_set)
 | 
			
		||||
    color = &priv->selected_text_color;
 | 
			
		||||
  else
 | 
			
		||||
    color = &priv->text_color;
 | 
			
		||||
 | 
			
		||||
  cogl_color_init_from_4ub (&cogl_color,
 | 
			
		||||
                            color->red,
 | 
			
		||||
                            color->green,
 | 
			
		||||
                            color->blue,
 | 
			
		||||
                            paint_opacity * color->alpha / 255);
 | 
			
		||||
 | 
			
		||||
  cogl_pango_show_layout (fb, layout, priv->text_x, 0, &cogl_color);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_pop_clip (fb);
 | 
			
		||||
  cogl_object_unref (color_pipeline);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Draws the selected text, its background, and the cursor */
 | 
			
		||||
static void
 | 
			
		||||
selection_paint (ClutterText     *self,
 | 
			
		||||
@@ -1955,52 +2011,9 @@ selection_paint (ClutterText     *self,
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* Paint selection background first */
 | 
			
		||||
      CoglPipeline *color_pipeline = cogl_pipeline_copy (default_color_pipeline);
 | 
			
		||||
      PangoLayout *layout = clutter_text_get_layout (self);
 | 
			
		||||
      CoglPath *selection_path = cogl_path_new ();
 | 
			
		||||
      CoglColor cogl_color = { 0, };
 | 
			
		||||
 | 
			
		||||
      /* Paint selection background */
 | 
			
		||||
      if (priv->selection_color_set)
 | 
			
		||||
        color = &priv->selection_color;
 | 
			
		||||
      else if (priv->cursor_color_set)
 | 
			
		||||
        color = &priv->cursor_color;
 | 
			
		||||
      else
 | 
			
		||||
        color = &priv->text_color;
 | 
			
		||||
 | 
			
		||||
      cogl_color_init_from_4ub (&cogl_color,
 | 
			
		||||
                                color->red,
 | 
			
		||||
                                color->green,
 | 
			
		||||
                                color->blue,
 | 
			
		||||
                                paint_opacity * color->alpha / 255);
 | 
			
		||||
      cogl_color_premultiply (&cogl_color);
 | 
			
		||||
      cogl_pipeline_set_color (color_pipeline, &cogl_color);
 | 
			
		||||
 | 
			
		||||
      clutter_text_foreach_selection_rectangle_prescaled (self,
 | 
			
		||||
                                                          add_selection_rectangle_to_path,
 | 
			
		||||
                                                          selection_path);
 | 
			
		||||
 | 
			
		||||
      cogl_framebuffer_fill_path (fb, color_pipeline, selection_path);
 | 
			
		||||
 | 
			
		||||
      /* Paint selected text */
 | 
			
		||||
      cogl_framebuffer_push_path_clip (fb, selection_path);
 | 
			
		||||
      cogl_object_unref (selection_path);
 | 
			
		||||
 | 
			
		||||
      if (priv->selected_text_color_set)
 | 
			
		||||
        color = &priv->selected_text_color;
 | 
			
		||||
      else
 | 
			
		||||
        color = &priv->text_color;
 | 
			
		||||
 | 
			
		||||
      cogl_color_init_from_4ub (&cogl_color,
 | 
			
		||||
                                color->red,
 | 
			
		||||
                                color->green,
 | 
			
		||||
                                color->blue,
 | 
			
		||||
                                paint_opacity * color->alpha / 255);
 | 
			
		||||
 | 
			
		||||
      cogl_pango_show_layout (fb, layout, priv->text_x, 0, &cogl_color);
 | 
			
		||||
 | 
			
		||||
      cogl_framebuffer_pop_clip (fb);
 | 
			
		||||
                                                          paint_selection_rectangle,
 | 
			
		||||
                                                          fb);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,6 @@
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:clutter-timeline
 | 
			
		||||
 * @short_description: A class for time-based events
 | 
			
		||||
 * @see_also: #ClutterAnimation, #ClutterAnimator, #ClutterState
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterTimeline is a base class for managing time-based event that cause
 | 
			
		||||
 * Clutter to redraw a stage, such as animations.
 | 
			
		||||
@@ -71,7 +70,7 @@
 | 
			
		||||
 * when reaching completion by using the #ClutterTimeline:auto-reverse property.
 | 
			
		||||
 *
 | 
			
		||||
 * Timelines are used in the Clutter animation framework by classes like
 | 
			
		||||
 * #ClutterAnimation, #ClutterAnimator, and #ClutterState.
 | 
			
		||||
 * #ClutterTransition.
 | 
			
		||||
 *
 | 
			
		||||
 * ## Defining Timelines in ClutterScript
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -79,10 +79,6 @@ typedef struct _ClutterKnot                     ClutterKnot;
 | 
			
		||||
typedef struct _ClutterMargin                   ClutterMargin;
 | 
			
		||||
typedef struct _ClutterPerspective              ClutterPerspective;
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterAlpha            	ClutterAlpha;
 | 
			
		||||
typedef struct _ClutterAnimation                ClutterAnimation;
 | 
			
		||||
typedef struct _ClutterState            	ClutterState;
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterInputDeviceTool          ClutterInputDeviceTool;
 | 
			
		||||
typedef struct _ClutterInputDevice              ClutterInputDevice;
 | 
			
		||||
typedef struct _ClutterVirtualInputDevice       ClutterVirtualInputDevice;
 | 
			
		||||
 
 | 
			
		||||
@@ -214,6 +214,16 @@ _clutter_util_rectangle_intersection (const cairo_rectangle_int_t *src1,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_util_rectangle_equal (const cairo_rectangle_int_t *src1,
 | 
			
		||||
                              const cairo_rectangle_int_t *src2)
 | 
			
		||||
{
 | 
			
		||||
  return ((src1->x == src2->x) &&
 | 
			
		||||
          (src1->y == src2->y) &&
 | 
			
		||||
          (src1->width == src2->width) &&
 | 
			
		||||
          (src1->height == src2->height));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
_clutter_util_matrix_determinant (const ClutterMatrix *matrix)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -56,8 +56,6 @@
 | 
			
		||||
#include "clutter-content.h"
 | 
			
		||||
#include "clutter-deform-effect.h"
 | 
			
		||||
#include "clutter-desaturate-effect.h"
 | 
			
		||||
#include "clutter-drag-action.h"
 | 
			
		||||
#include "clutter-drop-action.h"
 | 
			
		||||
#include "clutter-effect.h"
 | 
			
		||||
#include "clutter-enums.h"
 | 
			
		||||
#include "clutter-enum-types.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@
 | 
			
		||||
#include "clutter-stage-private.h"
 | 
			
		||||
#include "clutter-stage-view-private.h"
 | 
			
		||||
 | 
			
		||||
#include "cogl/cogl-trace.h"
 | 
			
		||||
#define MAX_STACK_RECTS 256
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterStageViewCoglPrivate
 | 
			
		||||
{
 | 
			
		||||
@@ -288,97 +288,6 @@ clutter_stage_cogl_resize (ClutterStageWindow *stage_window,
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_stage_cogl_has_redraw_clips (ClutterStageWindow *stage_window)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
 | 
			
		||||
 | 
			
		||||
  /* NB: at the start of each new frame there is an implied clip that
 | 
			
		||||
   * clips everything (i.e. nothing would be drawn) so we need to make
 | 
			
		||||
   * sure we return True in the un-initialized case here.
 | 
			
		||||
   */
 | 
			
		||||
  if (!stage_cogl->initialized_redraw_clip ||
 | 
			
		||||
      (stage_cogl->initialized_redraw_clip &&
 | 
			
		||||
       stage_cogl->redraw_clip))
 | 
			
		||||
    return TRUE;
 | 
			
		||||
  else
 | 
			
		||||
    return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_stage_cogl_ignoring_redraw_clips (ClutterStageWindow *stage_window)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
 | 
			
		||||
 | 
			
		||||
  /* NB: a NULL clip means a full stage redraw is required */
 | 
			
		||||
  if (stage_cogl->initialized_redraw_clip &&
 | 
			
		||||
      !stage_cogl->redraw_clip)
 | 
			
		||||
    return TRUE;
 | 
			
		||||
  else
 | 
			
		||||
    return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* A redraw clip represents (in stage coordinates) the bounding box of
 | 
			
		||||
 * something that needs to be redrawn. Typically they are added to the
 | 
			
		||||
 * StageWindow as a result of clutter_actor_queue_clipped_redraw() by
 | 
			
		||||
 * actors such as ClutterGLXTexturePixmap. All redraw clips are
 | 
			
		||||
 * discarded after the next paint.
 | 
			
		||||
 *
 | 
			
		||||
 * A NULL stage_clip means the whole stage needs to be redrawn.
 | 
			
		||||
 *
 | 
			
		||||
 * What we do with this information:
 | 
			
		||||
 * - we keep track of the bounding box for all redraw clips
 | 
			
		||||
 * - when we come to redraw; we scissor the redraw to that box and use
 | 
			
		||||
 *   glBlitFramebuffer to present the redraw to the front
 | 
			
		||||
 *   buffer.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_cogl_add_redraw_clip (ClutterStageWindow    *stage_window,
 | 
			
		||||
                                    cairo_rectangle_int_t *stage_clip)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
 | 
			
		||||
 | 
			
		||||
  /* If we are already forced to do a full stage redraw then bail early */
 | 
			
		||||
  if (clutter_stage_cogl_ignoring_redraw_clips (stage_window))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* A NULL stage clip means a full stage redraw has been queued and
 | 
			
		||||
   * we keep track of this by setting a NULL redraw_clip.
 | 
			
		||||
   */
 | 
			
		||||
  if (stage_clip == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      g_clear_pointer (&stage_cogl->redraw_clip, cairo_region_destroy);
 | 
			
		||||
      stage_cogl->initialized_redraw_clip = TRUE;
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Ignore requests to add degenerate/empty clip rectangles */
 | 
			
		||||
  if (stage_clip->width == 0 || stage_clip->height == 0)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (!stage_cogl->redraw_clip)
 | 
			
		||||
    {
 | 
			
		||||
      stage_cogl->redraw_clip = cairo_region_create_rectangle (stage_clip);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      cairo_region_union_rectangle (stage_cogl->redraw_clip, stage_clip);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  stage_cogl->initialized_redraw_clip = TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static cairo_region_t *
 | 
			
		||||
clutter_stage_cogl_get_redraw_clip (ClutterStageWindow *stage_window)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
 | 
			
		||||
 | 
			
		||||
  if (stage_cogl->using_clipped_redraw && stage_cogl->redraw_clip)
 | 
			
		||||
    return cairo_region_copy (stage_cogl->redraw_clip);
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline gboolean
 | 
			
		||||
valid_buffer_age (ClutterStageViewCogl *view_cogl,
 | 
			
		||||
                  int                   age)
 | 
			
		||||
@@ -395,7 +304,8 @@ valid_buffer_age (ClutterStageViewCogl *view_cogl,
 | 
			
		||||
static void
 | 
			
		||||
paint_damage_region (ClutterStageWindow *stage_window,
 | 
			
		||||
                     ClutterStageView   *view,
 | 
			
		||||
                     cairo_region_t     *swap_region)
 | 
			
		||||
                     cairo_region_t     *swap_region,
 | 
			
		||||
                     cairo_region_t     *queued_redraw_clip)
 | 
			
		||||
{
 | 
			
		||||
  CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (view);
 | 
			
		||||
  CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
 | 
			
		||||
@@ -432,8 +342,7 @@ paint_damage_region (ClutterStageWindow *stage_window,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Red for the clip */
 | 
			
		||||
  if (stage_cogl->initialized_redraw_clip &&
 | 
			
		||||
      stage_cogl->redraw_clip)
 | 
			
		||||
  if (queued_redraw_clip)
 | 
			
		||||
    {
 | 
			
		||||
      static CoglPipeline *overlay_red = NULL;
 | 
			
		||||
 | 
			
		||||
@@ -443,13 +352,13 @@ paint_damage_region (ClutterStageWindow *stage_window,
 | 
			
		||||
          cogl_pipeline_set_color4ub (overlay_red, 0x33, 0x00, 0x00, 0x33);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      n_rects = cairo_region_num_rectangles (stage_cogl->redraw_clip);
 | 
			
		||||
      n_rects = cairo_region_num_rectangles (queued_redraw_clip);
 | 
			
		||||
      for (i = 0; i < n_rects; i++)
 | 
			
		||||
        {
 | 
			
		||||
          cairo_rectangle_int_t rect;
 | 
			
		||||
          float x_1, x_2, y_1, y_2;
 | 
			
		||||
 | 
			
		||||
          cairo_region_get_rectangle (stage_cogl->redraw_clip, i, &rect);
 | 
			
		||||
          cairo_region_get_rectangle (queued_redraw_clip, i, &rect);
 | 
			
		||||
          x_1 = rect.x;
 | 
			
		||||
          x_2 = rect.x + rect.width;
 | 
			
		||||
          y_1 = rect.y;
 | 
			
		||||
@@ -471,9 +380,6 @@ swap_framebuffer (ClutterStageWindow *stage_window,
 | 
			
		||||
  CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (view);
 | 
			
		||||
  int *damage, n_rects, i;
 | 
			
		||||
 | 
			
		||||
  if (G_UNLIKELY ((clutter_paint_debug_flags & CLUTTER_DEBUG_PAINT_DAMAGE_REGION)))
 | 
			
		||||
    paint_damage_region (stage_window, view, swap_region);
 | 
			
		||||
 | 
			
		||||
  n_rects = cairo_region_num_rectangles (swap_region);
 | 
			
		||||
  damage = g_newa (int, n_rects * 4);
 | 
			
		||||
  for (i = 0; i < n_rects; i++)
 | 
			
		||||
@@ -536,34 +442,52 @@ scale_and_clamp_rect (const graphene_rect_t *rect,
 | 
			
		||||
  _clutter_util_rectangle_int_extents (&tmp, dest);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static cairo_region_t *
 | 
			
		||||
offset_scale_and_clamp_region (const cairo_region_t *region,
 | 
			
		||||
                               int                   offset_x,
 | 
			
		||||
                               int                   offset_y,
 | 
			
		||||
                               float                 scale)
 | 
			
		||||
{
 | 
			
		||||
  int n_rects, i;
 | 
			
		||||
  cairo_rectangle_int_t *rects;
 | 
			
		||||
  g_autofree cairo_rectangle_int_t *freeme = NULL;
 | 
			
		||||
 | 
			
		||||
  n_rects = cairo_region_num_rectangles (region);
 | 
			
		||||
 | 
			
		||||
  if (n_rects == 0)
 | 
			
		||||
    return cairo_region_create ();
 | 
			
		||||
 | 
			
		||||
  if (n_rects < MAX_STACK_RECTS)
 | 
			
		||||
    rects = g_newa (cairo_rectangle_int_t, n_rects);
 | 
			
		||||
  else
 | 
			
		||||
    rects = freeme = g_new (cairo_rectangle_int_t, n_rects);
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < n_rects; i++)
 | 
			
		||||
    cairo_region_get_rectangle (region, i, &rects[i]);
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < n_rects; i++)
 | 
			
		||||
    {
 | 
			
		||||
      graphene_rect_t tmp;
 | 
			
		||||
 | 
			
		||||
      _clutter_util_rect_from_rectangle (&rects[i], &tmp);
 | 
			
		||||
      graphene_rect_offset (&tmp, offset_x, offset_y);
 | 
			
		||||
      scale_and_clamp_rect (&tmp, scale, &rects[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return cairo_region_create_rectangles (rects, n_rects);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
paint_stage (ClutterStageCogl            *stage_cogl,
 | 
			
		||||
             ClutterStageView            *view,
 | 
			
		||||
             cairo_region_t              *clip)
 | 
			
		||||
paint_stage (ClutterStageCogl *stage_cogl,
 | 
			
		||||
             ClutterStageView *view,
 | 
			
		||||
             cairo_region_t   *redraw_clip)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStage *stage = stage_cogl->wrapper;
 | 
			
		||||
  cairo_rectangle_int_t clip_rect;
 | 
			
		||||
  cairo_rectangle_int_t paint_rect;
 | 
			
		||||
  cairo_rectangle_int_t view_rect;
 | 
			
		||||
  graphene_rect_t rect;
 | 
			
		||||
  float fb_scale;
 | 
			
		||||
 | 
			
		||||
  clutter_stage_view_get_layout (view, &view_rect);
 | 
			
		||||
  fb_scale = clutter_stage_view_get_scale (view);
 | 
			
		||||
 | 
			
		||||
  cairo_region_get_extents (clip, &clip_rect);
 | 
			
		||||
 | 
			
		||||
  _clutter_util_rect_from_rectangle (&clip_rect, &rect);
 | 
			
		||||
  scale_and_clamp_rect (&rect, 1.0f / fb_scale, &paint_rect);
 | 
			
		||||
  _clutter_util_rectangle_offset (&paint_rect,
 | 
			
		||||
                                  view_rect.x,
 | 
			
		||||
                                  view_rect.y,
 | 
			
		||||
                                  &paint_rect);
 | 
			
		||||
 | 
			
		||||
  _clutter_stage_maybe_setup_viewport (stage, view);
 | 
			
		||||
  _clutter_stage_paint_view (stage, view, &paint_rect);
 | 
			
		||||
  clutter_stage_paint_view (stage, view, redraw_clip);
 | 
			
		||||
 | 
			
		||||
  clutter_stage_view_after_paint (view, &paint_rect);
 | 
			
		||||
  clutter_stage_view_after_paint (view);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -683,7 +607,7 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
    clutter_stage_view_cogl_get_instance_private (view_cogl);
 | 
			
		||||
  CoglFramebuffer *fb = clutter_stage_view_get_framebuffer (view);
 | 
			
		||||
  cairo_rectangle_int_t view_rect;
 | 
			
		||||
  gboolean have_clip;
 | 
			
		||||
  gboolean is_full_redraw;
 | 
			
		||||
  gboolean may_use_clipped_redraw;
 | 
			
		||||
  gboolean use_clipped_redraw;
 | 
			
		||||
  gboolean can_blit_sub_buffer;
 | 
			
		||||
@@ -691,7 +615,8 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
  gboolean do_swap_buffer;
 | 
			
		||||
  gboolean swap_with_damage;
 | 
			
		||||
  ClutterActor *wrapper;
 | 
			
		||||
  cairo_region_t *redraw_clip = NULL;
 | 
			
		||||
  cairo_region_t *redraw_clip;
 | 
			
		||||
  cairo_region_t *queued_redraw_clip = NULL;
 | 
			
		||||
  cairo_region_t *fb_clip_region;
 | 
			
		||||
  cairo_region_t *swap_region;
 | 
			
		||||
  cairo_rectangle_int_t redraw_rect;
 | 
			
		||||
@@ -699,6 +624,7 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
  float fb_scale;
 | 
			
		||||
  int subpixel_compensation = 0;
 | 
			
		||||
  int fb_width, fb_height;
 | 
			
		||||
  int buffer_age;
 | 
			
		||||
 | 
			
		||||
  wrapper = CLUTTER_ACTOR (stage_cogl->wrapper);
 | 
			
		||||
 | 
			
		||||
@@ -713,55 +639,46 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
 | 
			
		||||
  has_buffer_age = cogl_is_onscreen (fb) && is_buffer_age_enabled ();
 | 
			
		||||
 | 
			
		||||
  redraw_clip = clutter_stage_view_take_redraw_clip (view);
 | 
			
		||||
  if (G_UNLIKELY (clutter_paint_debug_flags & CLUTTER_DEBUG_PAINT_DAMAGE_REGION))
 | 
			
		||||
    queued_redraw_clip = cairo_region_copy (redraw_clip);
 | 
			
		||||
 | 
			
		||||
  /* NB: a NULL redraw clip == full stage redraw */
 | 
			
		||||
  if (!stage_cogl->redraw_clip)
 | 
			
		||||
    have_clip = FALSE;
 | 
			
		||||
  if (!redraw_clip)
 | 
			
		||||
    is_full_redraw = TRUE;
 | 
			
		||||
  else
 | 
			
		||||
    is_full_redraw = FALSE;
 | 
			
		||||
 | 
			
		||||
  may_use_clipped_redraw =
 | 
			
		||||
    _clutter_stage_window_can_clip_redraws (stage_window) &&
 | 
			
		||||
    (can_blit_sub_buffer || has_buffer_age) &&
 | 
			
		||||
    !is_full_redraw &&
 | 
			
		||||
    /* some drivers struggle to get going and produce some junk
 | 
			
		||||
     * frames when starting up... */
 | 
			
		||||
    cogl_onscreen_get_frame_counter (COGL_ONSCREEN (fb)) > 3;
 | 
			
		||||
 | 
			
		||||
  if (has_buffer_age)
 | 
			
		||||
    {
 | 
			
		||||
      cairo_region_t *view_region;
 | 
			
		||||
      redraw_clip = cairo_region_copy (stage_cogl->redraw_clip);
 | 
			
		||||
 | 
			
		||||
      view_region = cairo_region_create_rectangle (&view_rect);
 | 
			
		||||
      cairo_region_intersect (redraw_clip, view_region);
 | 
			
		||||
 | 
			
		||||
      have_clip = !cairo_region_equal (redraw_clip, view_region);
 | 
			
		||||
      cairo_region_destroy (view_region);
 | 
			
		||||
      buffer_age = cogl_onscreen_get_buffer_age (COGL_ONSCREEN (fb));
 | 
			
		||||
      if (!valid_buffer_age (view_cogl, buffer_age))
 | 
			
		||||
        {
 | 
			
		||||
          CLUTTER_NOTE (CLIPPING, "Invalid back buffer(age=%d): forcing full redraw\n", buffer_age);
 | 
			
		||||
          may_use_clipped_redraw = FALSE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  may_use_clipped_redraw = FALSE;
 | 
			
		||||
  if (_clutter_stage_window_can_clip_redraws (stage_window) &&
 | 
			
		||||
      (can_blit_sub_buffer || has_buffer_age) &&
 | 
			
		||||
      have_clip &&
 | 
			
		||||
      /* some drivers struggle to get going and produce some junk
 | 
			
		||||
       * frames when starting up... */
 | 
			
		||||
      cogl_onscreen_get_frame_counter (COGL_ONSCREEN (fb)) > 3)
 | 
			
		||||
  if (may_use_clipped_redraw)
 | 
			
		||||
    {
 | 
			
		||||
      graphene_rect_t rect;
 | 
			
		||||
      cairo_rectangle_int_t *rects;
 | 
			
		||||
      int n_rects, i;
 | 
			
		||||
 | 
			
		||||
      may_use_clipped_redraw = TRUE;
 | 
			
		||||
 | 
			
		||||
      fb_clip_region = cairo_region_create ();
 | 
			
		||||
 | 
			
		||||
      n_rects = cairo_region_num_rectangles (redraw_clip);
 | 
			
		||||
      rects = g_new (cairo_rectangle_int_t, n_rects);
 | 
			
		||||
      for (i = 0; i < n_rects; i++)
 | 
			
		||||
        {
 | 
			
		||||
          cairo_rectangle_int_t new_fb_clip_rect;
 | 
			
		||||
 | 
			
		||||
          cairo_region_get_rectangle (redraw_clip, i, &rects[i]);
 | 
			
		||||
 | 
			
		||||
          _clutter_util_rect_from_rectangle (&rects[i], &rect);
 | 
			
		||||
          graphene_rect_offset (&rect, -view_rect.x, -view_rect.y);
 | 
			
		||||
          scale_and_clamp_rect (&rect, fb_scale, &new_fb_clip_rect);
 | 
			
		||||
 | 
			
		||||
          cairo_region_union_rectangle (fb_clip_region, &new_fb_clip_rect);
 | 
			
		||||
        }
 | 
			
		||||
      g_free (rects);
 | 
			
		||||
      fb_clip_region = offset_scale_and_clamp_region (redraw_clip,
 | 
			
		||||
                                                      -view_rect.x,
 | 
			
		||||
                                                      -view_rect.y,
 | 
			
		||||
                                                      fb_scale);
 | 
			
		||||
 | 
			
		||||
      if (fb_scale != floorf (fb_scale))
 | 
			
		||||
        {
 | 
			
		||||
          int n_rects, i;
 | 
			
		||||
          cairo_rectangle_int_t *rects;
 | 
			
		||||
 | 
			
		||||
          subpixel_compensation = ceilf (fb_scale);
 | 
			
		||||
 | 
			
		||||
          n_rects = cairo_region_num_rectangles (fb_clip_region);
 | 
			
		||||
@@ -780,10 +697,16 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      cairo_rectangle_int_t rect = { 0, 0, view_rect.width, view_rect.height };
 | 
			
		||||
      fb_clip_region = cairo_region_create_rectangle (&rect);
 | 
			
		||||
      cairo_rectangle_int_t fb_rect;
 | 
			
		||||
 | 
			
		||||
      fb_rect = (cairo_rectangle_int_t) {
 | 
			
		||||
        .width = fb_width,
 | 
			
		||||
        .height = fb_height,
 | 
			
		||||
      };
 | 
			
		||||
      fb_clip_region = cairo_region_create_rectangle (&fb_rect);
 | 
			
		||||
 | 
			
		||||
      g_clear_pointer (&redraw_clip, cairo_region_destroy);
 | 
			
		||||
      redraw_clip = cairo_region_copy (fb_clip_region);
 | 
			
		||||
      redraw_clip = cairo_region_create_rectangle (&view_rect);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (may_use_clipped_redraw &&
 | 
			
		||||
@@ -799,62 +722,43 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
    {
 | 
			
		||||
      if (use_clipped_redraw && !clip_region_empty)
 | 
			
		||||
        {
 | 
			
		||||
          int age;
 | 
			
		||||
          cairo_region_t *fb_damage;
 | 
			
		||||
          cairo_region_t *view_damage;
 | 
			
		||||
          int i;
 | 
			
		||||
 | 
			
		||||
          age = cogl_onscreen_get_buffer_age (COGL_ONSCREEN (fb));
 | 
			
		||||
          fill_current_damage_history (view, fb_clip_region);
 | 
			
		||||
 | 
			
		||||
          if (valid_buffer_age (view_cogl, age))
 | 
			
		||||
          fb_damage = cairo_region_create ();
 | 
			
		||||
 | 
			
		||||
          for (i = 1; i <= buffer_age; i++)
 | 
			
		||||
            {
 | 
			
		||||
              graphene_rect_t rect;
 | 
			
		||||
              cairo_rectangle_int_t damage_region;
 | 
			
		||||
              cairo_rectangle_int_t *rects;
 | 
			
		||||
              int n_rects, i;
 | 
			
		||||
              int damage_index;
 | 
			
		||||
 | 
			
		||||
              fill_current_damage_history (view, fb_clip_region);
 | 
			
		||||
 | 
			
		||||
              for (i = 1; i <= age; i++)
 | 
			
		||||
                {
 | 
			
		||||
                  cairo_region_t *fb_damage =
 | 
			
		||||
                    view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index - i - 1)];
 | 
			
		||||
                  cairo_region_union (fb_clip_region, fb_damage);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              /* Update the redraw clip state with the extra damage. */
 | 
			
		||||
              n_rects = cairo_region_num_rectangles (fb_clip_region);
 | 
			
		||||
              rects = g_newa (cairo_rectangle_int_t, n_rects);
 | 
			
		||||
              for (i = 0; i < n_rects; i++)
 | 
			
		||||
                {
 | 
			
		||||
                  cairo_region_get_rectangle (fb_clip_region, i, &rects[i]);
 | 
			
		||||
                  _clutter_util_rect_from_rectangle (&rects[i], &rect);
 | 
			
		||||
                  scale_and_clamp_rect (&rect, 1.0f / fb_scale, &damage_region);
 | 
			
		||||
                  _clutter_util_rectangle_offset (&damage_region,
 | 
			
		||||
                                                  view_rect.x,
 | 
			
		||||
                                                  view_rect.y,
 | 
			
		||||
                                                  &damage_region);
 | 
			
		||||
                  cairo_region_union_rectangle (stage_cogl->redraw_clip,
 | 
			
		||||
                                                &damage_region);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              CLUTTER_NOTE (CLIPPING, "Reusing back buffer(age=%d) - repairing region: num rects: %d\n",
 | 
			
		||||
                            age,
 | 
			
		||||
                            cairo_region_num_rectangles (fb_clip_region));
 | 
			
		||||
 | 
			
		||||
              swap_with_damage = TRUE;
 | 
			
		||||
              damage_index = DAMAGE_HISTORY (view_priv->damage_index - i - 1);
 | 
			
		||||
              cairo_region_union (fb_damage,
 | 
			
		||||
                                  view_priv->damage_history[damage_index]);
 | 
			
		||||
            }
 | 
			
		||||
          else
 | 
			
		||||
            {
 | 
			
		||||
              cairo_rectangle_int_t fb_damage;
 | 
			
		||||
 | 
			
		||||
              CLUTTER_NOTE (CLIPPING, "Invalid back buffer(age=%d): forcing full redraw\n", age);
 | 
			
		||||
              use_clipped_redraw = FALSE;
 | 
			
		||||
              fb_damage = (cairo_rectangle_int_t) {
 | 
			
		||||
                .x = 0,
 | 
			
		||||
                .y = 0,
 | 
			
		||||
                .width = ceilf (view_rect.width * fb_scale),
 | 
			
		||||
                .height = ceilf (view_rect.height * fb_scale)
 | 
			
		||||
              };
 | 
			
		||||
              fill_current_damage_history_rectangle (view, &fb_damage);
 | 
			
		||||
            }
 | 
			
		||||
          /* Update the fb clip region with the extra damage. */
 | 
			
		||||
          cairo_region_union (fb_clip_region, fb_damage);
 | 
			
		||||
 | 
			
		||||
          view_damage = offset_scale_and_clamp_region (fb_damage,
 | 
			
		||||
                                                       0, 0,
 | 
			
		||||
                                                       1.0f / fb_scale);
 | 
			
		||||
          cairo_region_translate (view_damage, view_rect.x, view_rect.y);
 | 
			
		||||
          cairo_region_intersect_rectangle (view_damage, &view_rect);
 | 
			
		||||
 | 
			
		||||
          /* Update the redraw clip region with the extra damage. */
 | 
			
		||||
          cairo_region_union (redraw_clip, view_damage);
 | 
			
		||||
 | 
			
		||||
          cairo_region_destroy (view_damage);
 | 
			
		||||
          cairo_region_destroy (fb_damage);
 | 
			
		||||
 | 
			
		||||
          CLUTTER_NOTE (CLIPPING, "Reusing back buffer(age=%d) - repairing region: num rects: %d\n",
 | 
			
		||||
                        buffer_age,
 | 
			
		||||
                        cairo_region_num_rectangles (fb_clip_region));
 | 
			
		||||
 | 
			
		||||
          swap_with_damage = TRUE;
 | 
			
		||||
        }
 | 
			
		||||
      else if (!use_clipped_redraw)
 | 
			
		||||
        {
 | 
			
		||||
@@ -879,8 +783,6 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
      cairo_rectangle_int_t clip_rect;
 | 
			
		||||
      cairo_rectangle_int_t scissor_rect;
 | 
			
		||||
 | 
			
		||||
      stage_cogl->using_clipped_redraw = TRUE;
 | 
			
		||||
 | 
			
		||||
      if (cairo_region_num_rectangles (fb_clip_region) == 1)
 | 
			
		||||
        {
 | 
			
		||||
          cairo_region_get_extents (fb_clip_region, &clip_rect);
 | 
			
		||||
@@ -908,11 +810,9 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
          cogl_framebuffer_push_region_clip (fb, fb_clip_region);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      paint_stage (stage_cogl, view, fb_clip_region);
 | 
			
		||||
      paint_stage (stage_cogl, view, redraw_clip);
 | 
			
		||||
 | 
			
		||||
      cogl_framebuffer_pop_clip (fb);
 | 
			
		||||
 | 
			
		||||
      stage_cogl->using_clipped_redraw = FALSE;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
@@ -940,24 +840,13 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
                                              scissor_rect.width,
 | 
			
		||||
                                              scissor_rect.height);
 | 
			
		||||
 | 
			
		||||
          paint_stage (stage_cogl, view, fb_clip_region);
 | 
			
		||||
          paint_stage (stage_cogl, view, redraw_clip);
 | 
			
		||||
 | 
			
		||||
          cogl_framebuffer_pop_clip (fb);
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          cairo_rectangle_int_t clip;
 | 
			
		||||
          cairo_region_t *view_region;
 | 
			
		||||
 | 
			
		||||
          clip = (cairo_rectangle_int_t) {
 | 
			
		||||
            .x = 0,
 | 
			
		||||
            .y = 0,
 | 
			
		||||
            .width = ceilf (view_rect.width * fb_scale),
 | 
			
		||||
            .height = ceilf (view_rect.height * fb_scale)
 | 
			
		||||
          };
 | 
			
		||||
          view_region = cairo_region_create_rectangle (&clip);
 | 
			
		||||
          paint_stage (stage_cogl, view, view_region);
 | 
			
		||||
          cairo_region_destroy (view_region);
 | 
			
		||||
          paint_stage (stage_cogl, view, redraw_clip);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1028,10 +917,8 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
      do_swap_buffer = TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (redraw_clip)
 | 
			
		||||
    cairo_region_destroy (redraw_clip);
 | 
			
		||||
  if (fb_clip_region)
 | 
			
		||||
    cairo_region_destroy (fb_clip_region);
 | 
			
		||||
  g_clear_pointer (&redraw_clip, cairo_region_destroy);
 | 
			
		||||
  g_clear_pointer (&fb_clip_region, cairo_region_destroy);
 | 
			
		||||
 | 
			
		||||
  if (do_swap_buffer)
 | 
			
		||||
    {
 | 
			
		||||
@@ -1051,6 +938,13 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
          swap_region = transformed_swap_region;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      if (queued_redraw_clip)
 | 
			
		||||
        {
 | 
			
		||||
          paint_damage_region (stage_window, view,
 | 
			
		||||
                               swap_region, queued_redraw_clip);
 | 
			
		||||
          cairo_region_destroy (queued_redraw_clip);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      res = swap_framebuffer (stage_window,
 | 
			
		||||
                              view,
 | 
			
		||||
                              swap_region,
 | 
			
		||||
@@ -1062,10 +956,25 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      g_clear_pointer (&queued_redraw_clip, cairo_region_destroy);
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_cogl_scanout_view (ClutterStageCogl *stage_cogl,
 | 
			
		||||
                                 ClutterStageView *view,
 | 
			
		||||
                                 CoglScanout      *scanout)
 | 
			
		||||
{
 | 
			
		||||
  CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view);
 | 
			
		||||
  CoglOnscreen *onscreen;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (cogl_is_onscreen (framebuffer));
 | 
			
		||||
 | 
			
		||||
  onscreen = COGL_ONSCREEN (framebuffer);
 | 
			
		||||
  cogl_onscreen_direct_scanout (onscreen, scanout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_cogl_redraw (ClutterStageWindow *stage_window)
 | 
			
		||||
{
 | 
			
		||||
@@ -1078,9 +987,23 @@ clutter_stage_cogl_redraw (ClutterStageWindow *stage_window)
 | 
			
		||||
  for (l = _clutter_stage_window_get_views (stage_window); l; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterStageView *view = l->data;
 | 
			
		||||
      g_autoptr (CoglScanout) scanout = NULL;
 | 
			
		||||
 | 
			
		||||
      swap_event =
 | 
			
		||||
        clutter_stage_cogl_redraw_view (stage_window, view) || swap_event;
 | 
			
		||||
      if (!clutter_stage_view_has_redraw_clip (view))
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      scanout = clutter_stage_view_take_scanout (view);
 | 
			
		||||
      if (scanout)
 | 
			
		||||
        {
 | 
			
		||||
          clutter_stage_cogl_scanout_view (stage_cogl,
 | 
			
		||||
                                           view,
 | 
			
		||||
                                           scanout);
 | 
			
		||||
          swap_event = TRUE;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          swap_event |= clutter_stage_cogl_redraw_view (stage_window, view);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  _clutter_stage_emit_after_paint (stage_cogl->wrapper);
 | 
			
		||||
@@ -1096,10 +1019,6 @@ clutter_stage_cogl_redraw (ClutterStageWindow *stage_window)
 | 
			
		||||
        stage_cogl->pending_swaps++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* reset the redraw clipping for the next paint... */
 | 
			
		||||
  stage_cogl->initialized_redraw_clip = FALSE;
 | 
			
		||||
  g_clear_pointer (&stage_cogl->redraw_clip, cairo_region_destroy);
 | 
			
		||||
 | 
			
		||||
  stage_cogl->frame_count++;
 | 
			
		||||
 | 
			
		||||
  COGL_TRACE_END (ClutterStageCoglRedraw);
 | 
			
		||||
@@ -1117,10 +1036,6 @@ clutter_stage_window_iface_init (ClutterStageWindowInterface *iface)
 | 
			
		||||
  iface->schedule_update = clutter_stage_cogl_schedule_update;
 | 
			
		||||
  iface->get_update_time = clutter_stage_cogl_get_update_time;
 | 
			
		||||
  iface->clear_update_time = clutter_stage_cogl_clear_update_time;
 | 
			
		||||
  iface->add_redraw_clip = clutter_stage_cogl_add_redraw_clip;
 | 
			
		||||
  iface->has_redraw_clips = clutter_stage_cogl_has_redraw_clips;
 | 
			
		||||
  iface->ignoring_redraw_clips = clutter_stage_cogl_ignoring_redraw_clips;
 | 
			
		||||
  iface->get_redraw_clip = clutter_stage_cogl_get_redraw_clip;
 | 
			
		||||
  iface->redraw = clutter_stage_cogl_redraw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -55,14 +55,6 @@ struct _ClutterStageCogl
 | 
			
		||||
  unsigned int frame_count;
 | 
			
		||||
 | 
			
		||||
  gint last_sync_delay;
 | 
			
		||||
 | 
			
		||||
  cairo_region_t *redraw_clip;
 | 
			
		||||
 | 
			
		||||
  guint initialized_redraw_clip : 1;
 | 
			
		||||
 | 
			
		||||
  /* TRUE if the current paint cycle has a clipped redraw. In that
 | 
			
		||||
     case bounding_redraw_clip specifies the the bounds. */
 | 
			
		||||
  guint using_clipped_redraw : 1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterStageCoglClass
 | 
			
		||||
 
 | 
			
		||||
@@ -1,819 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Authored By Matthew Allum  <mallum@openedhand.com>
 | 
			
		||||
 *             Jorn Baayen  <jorn@openedhand.com>
 | 
			
		||||
 *             Emmanuele Bassi  <ebassi@openedhand.com>
 | 
			
		||||
 *             Tomas Frydrych <tf@openedhand.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2006, 2007, 2008 OpenedHand
 | 
			
		||||
 * Copyright (C) 2009, 2010 Intel Corp.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:clutter-alpha
 | 
			
		||||
 * @short_description: A class for calculating a value as a function of time
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterAlpha is a class for calculating an floating point value
 | 
			
		||||
 * dependent only on the position of a #ClutterTimeline.
 | 
			
		||||
 *
 | 
			
		||||
 * For newly written code, it is recommended to use the
 | 
			
		||||
 * #ClutterTimeline:progress-mode property of #ClutterTimeline, or the
 | 
			
		||||
 * clutter_timeline_set_progress_func() function instead of #ClutterAlpha.
 | 
			
		||||
 * The #ClutterAlpha class will be deprecated in the future, and will not
 | 
			
		||||
 * be available any more in the next major version of Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * A #ClutterAlpha binds a #ClutterTimeline to a progress function which
 | 
			
		||||
 * translates the time T into an adimensional factor alpha.
 | 
			
		||||
 *
 | 
			
		||||
 * You should provide a #ClutterTimeline and bind it to the #ClutterAlpha
 | 
			
		||||
 * instance using clutter_alpha_set_timeline(). You should also set an
 | 
			
		||||
 * "animation mode", by using the #ClutterAnimationMode values that
 | 
			
		||||
 * Clutter provides.
 | 
			
		||||
 *
 | 
			
		||||
 * Instead of a #ClutterAnimationMode you may provide a function returning
 | 
			
		||||
 * the alpha value depending on the progress of the timeline, using
 | 
			
		||||
 * clutter_alpha_set_func() or clutter_alpha_set_closure(). The alpha
 | 
			
		||||
 * function will be executed each time a new frame in the #ClutterTimeline
 | 
			
		||||
 * is reached.
 | 
			
		||||
 *
 | 
			
		||||
 * Since the alpha function is controlled by the timeline instance, you can
 | 
			
		||||
 * pause, stop or resume the #ClutterAlpha from calling the alpha function by
 | 
			
		||||
 * using the appropriate functions of the #ClutterTimeline object.
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterAlpha is available since Clutter 0.2.
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterAlpha is deprecated since Clutter 1.12. #ClutterTimeline and
 | 
			
		||||
 * the #ClutterTimeline:progress-mode property replace this whole class.
 | 
			
		||||
 *
 | 
			
		||||
 * ## ClutterAlpha custom properties for #ClutterScript
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterAlpha defines a custom `function` property for
 | 
			
		||||
 * #ClutterScript which allows to reference a custom alpha function
 | 
			
		||||
 * available in the source code. Setting the `function` property
 | 
			
		||||
 * is equivalent to calling clutter_alpha_set_func() with the
 | 
			
		||||
 * specified function name. No user data or #GDestroyNotify is
 | 
			
		||||
 * available to be passed.
 | 
			
		||||
 *
 | 
			
		||||
 * The following JSON fragment defines a #ClutterAlpha
 | 
			
		||||
 * using a #ClutterTimeline with id "sine-timeline" and an alpha
 | 
			
		||||
 * function called `my_sine_alpha`.
 | 
			
		||||
 *
 | 
			
		||||
 * |[
 | 
			
		||||
 * {
 | 
			
		||||
 *   "id" : "sine-alpha",
 | 
			
		||||
 *   "timeline" : {
 | 
			
		||||
 *     "id" : "sine-timeline",
 | 
			
		||||
 *     "duration" : 500,
 | 
			
		||||
 *     "loop" : true
 | 
			
		||||
 *   },
 | 
			
		||||
 *   "function" : "my_sine_alpha"
 | 
			
		||||
 * }
 | 
			
		||||
 * ]|
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
#include <gmodule.h>
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
 | 
			
		||||
#include "clutter-alpha.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-enum-types.h"
 | 
			
		||||
#include "clutter-easing.h"
 | 
			
		||||
#include "clutter-main.h"
 | 
			
		||||
#include "clutter-marshal.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-scriptable.h"
 | 
			
		||||
#include "clutter-script-private.h"
 | 
			
		||||
 | 
			
		||||
struct _ClutterAlphaPrivate
 | 
			
		||||
{
 | 
			
		||||
  ClutterTimeline *timeline;
 | 
			
		||||
  guint timeline_new_frame_id;
 | 
			
		||||
 | 
			
		||||
  gdouble alpha;
 | 
			
		||||
 | 
			
		||||
  GClosure *closure;
 | 
			
		||||
 | 
			
		||||
  ClutterAlphaFunc func;
 | 
			
		||||
  gpointer user_data;
 | 
			
		||||
  GDestroyNotify notify;
 | 
			
		||||
 | 
			
		||||
  gulong mode;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
  PROP_0,
 | 
			
		||||
  
 | 
			
		||||
  PROP_TIMELINE,
 | 
			
		||||
  PROP_ALPHA,
 | 
			
		||||
  PROP_MODE,
 | 
			
		||||
 | 
			
		||||
  PROP_LAST
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static GParamSpec *obj_props[PROP_LAST];
 | 
			
		||||
 | 
			
		||||
static void clutter_scriptable_iface_init (ClutterScriptableIface *iface);
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE_WITH_CODE (ClutterAlpha,
 | 
			
		||||
                         clutter_alpha,
 | 
			
		||||
                         G_TYPE_INITIALLY_UNOWNED,
 | 
			
		||||
                         G_ADD_PRIVATE (ClutterAlpha)
 | 
			
		||||
                         G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE,
 | 
			
		||||
                                                clutter_scriptable_iface_init));
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
timeline_new_frame_cb (ClutterTimeline *timeline,
 | 
			
		||||
                       guint            msecs,
 | 
			
		||||
                       ClutterAlpha    *alpha)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlphaPrivate *priv = alpha->priv;
 | 
			
		||||
 | 
			
		||||
  /* Update alpha value and notify */
 | 
			
		||||
  priv->alpha = clutter_alpha_get_alpha (alpha);
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_ALPHA]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void 
 | 
			
		||||
clutter_alpha_set_property (GObject      *object, 
 | 
			
		||||
			    guint         prop_id,
 | 
			
		||||
			    const GValue *value, 
 | 
			
		||||
			    GParamSpec   *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlpha *alpha = CLUTTER_ALPHA (object);
 | 
			
		||||
 | 
			
		||||
  switch (prop_id) 
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_TIMELINE:
 | 
			
		||||
      clutter_alpha_set_timeline (alpha, g_value_get_object (value));
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_MODE:
 | 
			
		||||
      clutter_alpha_set_mode (alpha, g_value_get_ulong (value));
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void 
 | 
			
		||||
clutter_alpha_get_property (GObject    *object, 
 | 
			
		||||
			    guint       prop_id,
 | 
			
		||||
			    GValue     *value, 
 | 
			
		||||
			    GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlphaPrivate *priv = CLUTTER_ALPHA (object)->priv;
 | 
			
		||||
 | 
			
		||||
  switch (prop_id) 
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_TIMELINE:
 | 
			
		||||
      g_value_set_object (value, priv->timeline);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_ALPHA:
 | 
			
		||||
      g_value_set_double (value, priv->alpha);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_MODE:
 | 
			
		||||
      g_value_set_ulong (value, priv->mode);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void 
 | 
			
		||||
clutter_alpha_finalize (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlphaPrivate *priv = CLUTTER_ALPHA (object)->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->notify != NULL)
 | 
			
		||||
    priv->notify (priv->user_data);
 | 
			
		||||
  else if (priv->closure != NULL)
 | 
			
		||||
    g_closure_unref (priv->closure);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_alpha_parent_class)->finalize (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void 
 | 
			
		||||
clutter_alpha_dispose (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlpha *self = CLUTTER_ALPHA(object);
 | 
			
		||||
 | 
			
		||||
  clutter_alpha_set_timeline (self, NULL);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_alpha_parent_class)->dispose (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterAlphaFunc
 | 
			
		||||
resolve_alpha_func (const gchar *name)
 | 
			
		||||
{
 | 
			
		||||
  static GModule *module = NULL;
 | 
			
		||||
  ClutterAlphaFunc func;
 | 
			
		||||
 | 
			
		||||
  CLUTTER_NOTE (SCRIPT, "Looking up '%s' alpha function", name);
 | 
			
		||||
 | 
			
		||||
  if (G_UNLIKELY (module == NULL))
 | 
			
		||||
    module = g_module_open (NULL, 0);
 | 
			
		||||
 | 
			
		||||
  if (g_module_symbol (module, name, (gpointer) &func))
 | 
			
		||||
    {
 | 
			
		||||
      CLUTTER_NOTE (SCRIPT, "Found '%s' alpha function in the symbols table",
 | 
			
		||||
                    name);
 | 
			
		||||
      return func;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_alpha_set_custom_property (ClutterScriptable *scriptable,
 | 
			
		||||
                                   ClutterScript     *script,
 | 
			
		||||
                                   const gchar       *name,
 | 
			
		||||
                                   const GValue      *value)
 | 
			
		||||
{
 | 
			
		||||
  if (strncmp (name, "function", 8) == 0)
 | 
			
		||||
    {
 | 
			
		||||
      g_assert (G_VALUE_HOLDS (value, G_TYPE_POINTER));
 | 
			
		||||
      if (g_value_get_pointer (value) != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          clutter_alpha_set_func (CLUTTER_ALPHA (scriptable),
 | 
			
		||||
                                  g_value_get_pointer (value),
 | 
			
		||||
                                  NULL, NULL);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    g_object_set_property (G_OBJECT (scriptable), name, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_alpha_parse_custom_node (ClutterScriptable *scriptable,
 | 
			
		||||
                                 ClutterScript     *script,
 | 
			
		||||
                                 GValue            *value,
 | 
			
		||||
                                 const gchar       *name,
 | 
			
		||||
                                 JsonNode          *node)
 | 
			
		||||
{
 | 
			
		||||
  if (strncmp (name, "function", 8) == 0)
 | 
			
		||||
    {
 | 
			
		||||
      const gchar *func_name = json_node_get_string (node);
 | 
			
		||||
 | 
			
		||||
      g_value_init (value, G_TYPE_POINTER);
 | 
			
		||||
      g_value_set_pointer (value, resolve_alpha_func (func_name));
 | 
			
		||||
 | 
			
		||||
      return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* we need to do this because we use gulong in place
 | 
			
		||||
   * of ClutterAnimationMode for ClutterAlpha:mode
 | 
			
		||||
   */
 | 
			
		||||
  if (strncmp (name, "mode", 4) == 0)
 | 
			
		||||
    {
 | 
			
		||||
      gulong mode;
 | 
			
		||||
 | 
			
		||||
      mode = _clutter_script_resolve_animation_mode (node);
 | 
			
		||||
 | 
			
		||||
      g_value_init (value, G_TYPE_ULONG);
 | 
			
		||||
      g_value_set_ulong (value, mode);
 | 
			
		||||
 | 
			
		||||
      return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_scriptable_iface_init (ClutterScriptableIface *iface)
 | 
			
		||||
{
 | 
			
		||||
  iface->parse_custom_node = clutter_alpha_parse_custom_node;
 | 
			
		||||
  iface->set_custom_property = clutter_alpha_set_custom_property;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_alpha_class_init (ClutterAlphaClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  object_class->set_property = clutter_alpha_set_property;
 | 
			
		||||
  object_class->get_property = clutter_alpha_get_property;
 | 
			
		||||
  object_class->finalize     = clutter_alpha_finalize;
 | 
			
		||||
  object_class->dispose      = clutter_alpha_dispose;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterAlpha:timeline:
 | 
			
		||||
   *
 | 
			
		||||
   * A #ClutterTimeline instance used to drive the alpha function.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 0.2
 | 
			
		||||
   *
 | 
			
		||||
   * Deprecated: 1.12
 | 
			
		||||
   */
 | 
			
		||||
  obj_props[PROP_TIMELINE] =
 | 
			
		||||
    g_param_spec_object ("timeline",
 | 
			
		||||
                               P_("Timeline"),
 | 
			
		||||
                               P_("Timeline used by the alpha"),
 | 
			
		||||
                               CLUTTER_TYPE_TIMELINE,
 | 
			
		||||
                               CLUTTER_PARAM_READWRITE);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterAlpha:alpha:
 | 
			
		||||
   *
 | 
			
		||||
   * The alpha value as computed by the alpha function. The linear
 | 
			
		||||
   * interval is 0.0 to 1.0, but the Alpha allows overshooting by
 | 
			
		||||
   * one unit in each direction, so the valid interval is -1.0 to 2.0.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 0.2
 | 
			
		||||
   * Deprecated: 1.12: Use #ClutterTimeline::new-frame and
 | 
			
		||||
   *   clutter_timeline_get_progress() instead
 | 
			
		||||
   */
 | 
			
		||||
  obj_props[PROP_ALPHA] =
 | 
			
		||||
    g_param_spec_double ("alpha",
 | 
			
		||||
                               P_("Alpha value"),
 | 
			
		||||
                               P_("Alpha value as computed by the alpha"),
 | 
			
		||||
                               -1.0, 2.0,
 | 
			
		||||
                               0.0,
 | 
			
		||||
                               CLUTTER_PARAM_READABLE);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterAlpha:mode:
 | 
			
		||||
   *
 | 
			
		||||
   * The progress function logical id - a value from the
 | 
			
		||||
   * #ClutterAnimationMode enumeration.
 | 
			
		||||
   *
 | 
			
		||||
   * If %CLUTTER_CUSTOM_MODE is used then the function set using
 | 
			
		||||
   * clutter_alpha_set_closure() or clutter_alpha_set_func()
 | 
			
		||||
   * will be used.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.0
 | 
			
		||||
   * Deprecated: 1.12: Use #ClutterTimeline:progress-mode
 | 
			
		||||
   */
 | 
			
		||||
  obj_props[PROP_MODE] =
 | 
			
		||||
    g_param_spec_ulong ("mode",
 | 
			
		||||
                              P_("Mode"),
 | 
			
		||||
                              P_("Progress mode"),
 | 
			
		||||
                              0, G_MAXULONG,
 | 
			
		||||
                              CLUTTER_CUSTOM_MODE,
 | 
			
		||||
                              G_PARAM_CONSTRUCT | CLUTTER_PARAM_READWRITE);
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_properties (object_class,
 | 
			
		||||
                                     PROP_LAST,
 | 
			
		||||
                                     obj_props);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_alpha_init (ClutterAlpha *self)
 | 
			
		||||
{
 | 
			
		||||
  self->priv = clutter_alpha_get_instance_private (self);
 | 
			
		||||
  self->priv->mode = CLUTTER_CUSTOM_MODE;
 | 
			
		||||
  self->priv->alpha = 0.0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_alpha_get_alpha:
 | 
			
		||||
 * @alpha: A #ClutterAlpha
 | 
			
		||||
 *
 | 
			
		||||
 * Query the current alpha value.
 | 
			
		||||
 *
 | 
			
		||||
 * Return Value: The current alpha value for the alpha
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.2
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use clutter_timeline_get_progress()
 | 
			
		||||
 */
 | 
			
		||||
gdouble
 | 
			
		||||
clutter_alpha_get_alpha (ClutterAlpha *alpha)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlphaPrivate *priv;
 | 
			
		||||
  gdouble retval = 0;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_ALPHA (alpha), 0);
 | 
			
		||||
 | 
			
		||||
  priv = alpha->priv;
 | 
			
		||||
 | 
			
		||||
  if (G_LIKELY (priv->func))
 | 
			
		||||
    {
 | 
			
		||||
      return priv->func (alpha, priv->user_data);
 | 
			
		||||
    }
 | 
			
		||||
  else if (priv->closure)
 | 
			
		||||
    {
 | 
			
		||||
      GValue params = G_VALUE_INIT;
 | 
			
		||||
      GValue result_value = G_VALUE_INIT;
 | 
			
		||||
 | 
			
		||||
      g_object_ref (alpha);
 | 
			
		||||
 | 
			
		||||
      g_value_init (&result_value, G_TYPE_DOUBLE);
 | 
			
		||||
 | 
			
		||||
      g_value_init (¶ms, CLUTTER_TYPE_ALPHA);
 | 
			
		||||
      g_value_set_object (¶ms, alpha);
 | 
			
		||||
 | 
			
		||||
      g_closure_invoke (priv->closure, &result_value, 1, ¶ms, NULL);
 | 
			
		||||
 | 
			
		||||
      retval = g_value_get_double (&result_value);
 | 
			
		||||
 | 
			
		||||
      g_value_unset (&result_value);
 | 
			
		||||
      g_value_unset (¶ms);
 | 
			
		||||
 | 
			
		||||
      g_object_unref (alpha);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * clutter_alpha_set_closure_internal:
 | 
			
		||||
 * @alpha: a #ClutterAlpha
 | 
			
		||||
 * @closure: a #GClosure
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the @closure for @alpha. This function does not
 | 
			
		||||
 * set the #ClutterAlpha:mode property and does not emit
 | 
			
		||||
 * the #GObject::notify signal for it.
 | 
			
		||||
 */
 | 
			
		||||
static inline void
 | 
			
		||||
clutter_alpha_set_closure_internal (ClutterAlpha *alpha,
 | 
			
		||||
                                    GClosure     *closure)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlphaPrivate *priv = alpha->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->notify != NULL)
 | 
			
		||||
    priv->notify (priv->user_data);
 | 
			
		||||
  else if (priv->closure != NULL)
 | 
			
		||||
    g_closure_unref (priv->closure);
 | 
			
		||||
 | 
			
		||||
  priv->func = NULL;
 | 
			
		||||
  priv->user_data = NULL;
 | 
			
		||||
  priv->notify = NULL;
 | 
			
		||||
 | 
			
		||||
  if (closure == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* need to take ownership of the closure before sinking it */
 | 
			
		||||
  priv->closure = g_closure_ref (closure);
 | 
			
		||||
  g_closure_sink (closure);
 | 
			
		||||
 | 
			
		||||
  /* set the marshaller */
 | 
			
		||||
  if (G_CLOSURE_NEEDS_MARSHAL (closure))
 | 
			
		||||
    {
 | 
			
		||||
      GClosureMarshal marshal = _clutter_marshal_DOUBLE__VOID;
 | 
			
		||||
 | 
			
		||||
      g_closure_set_marshal (priv->closure, marshal);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_alpha_set_closure:
 | 
			
		||||
 * @alpha: A #ClutterAlpha
 | 
			
		||||
 * @closure: A #GClosure
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the #GClosure used to compute the alpha value at each
 | 
			
		||||
 * frame of the #ClutterTimeline bound to @alpha.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.8
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use clutter_timeline_set_progress_func()
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_alpha_set_closure (ClutterAlpha *alpha,
 | 
			
		||||
                           GClosure     *closure)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlphaPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ALPHA (alpha));
 | 
			
		||||
  g_return_if_fail (closure != NULL);
 | 
			
		||||
 | 
			
		||||
  priv = alpha->priv;
 | 
			
		||||
 | 
			
		||||
  clutter_alpha_set_closure_internal (alpha, closure);
 | 
			
		||||
 | 
			
		||||
  priv->mode = CLUTTER_CUSTOM_MODE;
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_MODE]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_alpha_set_func:
 | 
			
		||||
 * @alpha: A #ClutterAlpha
 | 
			
		||||
 * @func: A #ClutterAlphaFunc
 | 
			
		||||
 * @data: user data to be passed to the alpha function, or %NULL
 | 
			
		||||
 * @destroy: notify function used when disposing the alpha function
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the #ClutterAlphaFunc function used to compute
 | 
			
		||||
 * the alpha value at each frame of the #ClutterTimeline
 | 
			
		||||
 * bound to @alpha.
 | 
			
		||||
 *
 | 
			
		||||
 * This function will not register @func as a global alpha function.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.2
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use clutter_timeline_set_progress_func()
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_alpha_set_func (ClutterAlpha    *alpha,
 | 
			
		||||
		        ClutterAlphaFunc func,
 | 
			
		||||
                        gpointer         data,
 | 
			
		||||
                        GDestroyNotify   destroy)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlphaPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ALPHA (alpha));
 | 
			
		||||
  g_return_if_fail (func != NULL);
 | 
			
		||||
 | 
			
		||||
  priv = alpha->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->notify != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      priv->notify (priv->user_data);
 | 
			
		||||
    }
 | 
			
		||||
  else if (priv->closure != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      g_closure_unref (priv->closure);
 | 
			
		||||
      priv->closure = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->func = func;
 | 
			
		||||
  priv->user_data = data;
 | 
			
		||||
  priv->notify = destroy;
 | 
			
		||||
 | 
			
		||||
  priv->mode = CLUTTER_CUSTOM_MODE;
 | 
			
		||||
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_MODE]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_alpha_set_timeline:
 | 
			
		||||
 * @alpha: A #ClutterAlpha
 | 
			
		||||
 * @timeline: A #ClutterTimeline
 | 
			
		||||
 *
 | 
			
		||||
 * Binds @alpha to @timeline.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.2
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use #ClutterTimeline directly
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_alpha_set_timeline (ClutterAlpha    *alpha,
 | 
			
		||||
                            ClutterTimeline *timeline)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlphaPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ALPHA (alpha));
 | 
			
		||||
  g_return_if_fail (timeline == NULL || CLUTTER_IS_TIMELINE (timeline));
 | 
			
		||||
  
 | 
			
		||||
  priv = alpha->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->timeline == timeline)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (priv->timeline)
 | 
			
		||||
    {
 | 
			
		||||
      g_signal_handlers_disconnect_by_func (priv->timeline,
 | 
			
		||||
                                            timeline_new_frame_cb,
 | 
			
		||||
                                            alpha);
 | 
			
		||||
 | 
			
		||||
      g_object_unref (priv->timeline);
 | 
			
		||||
      priv->timeline = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (timeline)
 | 
			
		||||
    {
 | 
			
		||||
      priv->timeline = g_object_ref (timeline);
 | 
			
		||||
 | 
			
		||||
      g_signal_connect (priv->timeline, "new-frame",
 | 
			
		||||
                        G_CALLBACK (timeline_new_frame_cb),
 | 
			
		||||
                        alpha);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_TIMELINE]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_alpha_get_timeline:
 | 
			
		||||
 * @alpha: A #ClutterAlpha
 | 
			
		||||
 *
 | 
			
		||||
 * Gets the #ClutterTimeline bound to @alpha.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer none): a #ClutterTimeline instance
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.2
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use #ClutterTimeline directlry
 | 
			
		||||
 */
 | 
			
		||||
ClutterTimeline *
 | 
			
		||||
clutter_alpha_get_timeline (ClutterAlpha *alpha)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_ALPHA (alpha), NULL);
 | 
			
		||||
 | 
			
		||||
  return alpha->priv->timeline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_alpha_new:
 | 
			
		||||
 * 
 | 
			
		||||
 * Creates a new #ClutterAlpha instance.  You must set a function
 | 
			
		||||
 * to compute the alpha value using clutter_alpha_set_func() and
 | 
			
		||||
 * bind a #ClutterTimeline object to the #ClutterAlpha instance
 | 
			
		||||
 * using clutter_alpha_set_timeline().
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: the newly created empty #ClutterAlpha instance.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.2
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use #ClutterTimeline instead
 | 
			
		||||
 */
 | 
			
		||||
ClutterAlpha *
 | 
			
		||||
clutter_alpha_new (void)
 | 
			
		||||
{
 | 
			
		||||
  return g_object_new (CLUTTER_TYPE_ALPHA, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_alpha_new_full:
 | 
			
		||||
 * @timeline: #ClutterTimeline timeline
 | 
			
		||||
 * @mode: animation mode
 | 
			
		||||
 *
 | 
			
		||||
 * Creates a new #ClutterAlpha instance and sets the timeline
 | 
			
		||||
 * and animation mode.
 | 
			
		||||
 *
 | 
			
		||||
 * See also clutter_alpha_set_timeline() and clutter_alpha_set_mode().
 | 
			
		||||
 *
 | 
			
		||||
 * Return Value: the newly created #ClutterAlpha
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use #ClutterTimeline instead
 | 
			
		||||
 */
 | 
			
		||||
ClutterAlpha *
 | 
			
		||||
clutter_alpha_new_full (ClutterTimeline *timeline,
 | 
			
		||||
                        gulong           mode)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_TIMELINE (timeline), NULL);
 | 
			
		||||
  g_return_val_if_fail (mode != CLUTTER_ANIMATION_LAST, NULL);
 | 
			
		||||
 | 
			
		||||
  return g_object_new (CLUTTER_TYPE_ALPHA,
 | 
			
		||||
                       "timeline", timeline,
 | 
			
		||||
                       "mode", mode,
 | 
			
		||||
                       NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_alpha_get_mode:
 | 
			
		||||
 * @alpha: a #ClutterAlpha
 | 
			
		||||
 *
 | 
			
		||||
 * Retrieves the #ClutterAnimationMode used by @alpha.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: the animation mode
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use #ClutterTimeline instead
 | 
			
		||||
 */
 | 
			
		||||
gulong
 | 
			
		||||
clutter_alpha_get_mode (ClutterAlpha *alpha)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_ALPHA (alpha), CLUTTER_CUSTOM_MODE);
 | 
			
		||||
 | 
			
		||||
  return alpha->priv->mode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct _AlphaData {
 | 
			
		||||
  guint closure_set : 1;
 | 
			
		||||
 | 
			
		||||
  ClutterAlphaFunc func;
 | 
			
		||||
  gpointer data;
 | 
			
		||||
 | 
			
		||||
  GClosure *closure;
 | 
			
		||||
} AlphaData;
 | 
			
		||||
 | 
			
		||||
static GPtrArray *clutter_alphas = NULL;
 | 
			
		||||
 | 
			
		||||
static gdouble
 | 
			
		||||
clutter_alpha_easing_func (ClutterAlpha *alpha,
 | 
			
		||||
                           gpointer      data G_GNUC_UNUSED)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlphaPrivate *priv = alpha->priv;
 | 
			
		||||
  ClutterTimeline *timeline = priv->timeline;
 | 
			
		||||
  gdouble t, d;
 | 
			
		||||
 | 
			
		||||
  if (G_UNLIKELY (priv->timeline == NULL))
 | 
			
		||||
    return 0.0;
 | 
			
		||||
 | 
			
		||||
  t = clutter_timeline_get_elapsed_time (timeline);
 | 
			
		||||
  d = clutter_timeline_get_duration (timeline);
 | 
			
		||||
 | 
			
		||||
  return clutter_easing_for_mode (priv->mode, t, d);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_alpha_set_mode:
 | 
			
		||||
 * @alpha: a #ClutterAlpha
 | 
			
		||||
 * @mode: a #ClutterAnimationMode
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the progress function of @alpha using the symbolic value
 | 
			
		||||
 * of @mode, as taken by the #ClutterAnimationMode enumeration.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use #ClutterTimeline and
 | 
			
		||||
 *   clutter_timeline_set_progress_mode() instead
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_alpha_set_mode (ClutterAlpha *alpha,
 | 
			
		||||
                        gulong        mode)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlphaPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ALPHA (alpha));
 | 
			
		||||
  g_return_if_fail (mode != CLUTTER_ANIMATION_LAST);
 | 
			
		||||
 | 
			
		||||
  priv = alpha->priv;
 | 
			
		||||
 | 
			
		||||
  if (mode == CLUTTER_CUSTOM_MODE)
 | 
			
		||||
    {
 | 
			
		||||
      priv->mode = mode;
 | 
			
		||||
    }
 | 
			
		||||
  else if (mode < CLUTTER_ANIMATION_LAST)
 | 
			
		||||
    {
 | 
			
		||||
      if (priv->mode == mode)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
      /* sanity check to avoid getting an out of sync
 | 
			
		||||
       * enum/function mapping
 | 
			
		||||
       */
 | 
			
		||||
      g_assert (clutter_get_easing_func_for_mode (mode) != NULL);
 | 
			
		||||
 | 
			
		||||
      clutter_alpha_set_closure_internal (alpha, NULL);
 | 
			
		||||
 | 
			
		||||
      priv->mode = mode;
 | 
			
		||||
 | 
			
		||||
      CLUTTER_NOTE (ANIMATION, "New easing mode '%s'[%lu]\n",
 | 
			
		||||
                    clutter_get_easing_name_for_mode (priv->mode),
 | 
			
		||||
                    priv->mode);
 | 
			
		||||
 | 
			
		||||
      priv->func = clutter_alpha_easing_func;
 | 
			
		||||
      priv->user_data = NULL;
 | 
			
		||||
      priv->notify = NULL;
 | 
			
		||||
    }
 | 
			
		||||
  else if (mode > CLUTTER_ANIMATION_LAST)
 | 
			
		||||
    {
 | 
			
		||||
      AlphaData *alpha_data = NULL;
 | 
			
		||||
      gulong real_index = 0;
 | 
			
		||||
 | 
			
		||||
      if (priv->mode == mode)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
      if (G_UNLIKELY (clutter_alphas == NULL))
 | 
			
		||||
        {
 | 
			
		||||
          g_warning ("No alpha functions defined for ClutterAlpha to use. ");
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      real_index = mode - CLUTTER_ANIMATION_LAST - 1;
 | 
			
		||||
 | 
			
		||||
      alpha_data = g_ptr_array_index (clutter_alphas, real_index);
 | 
			
		||||
      if (G_UNLIKELY (alpha_data == NULL))
 | 
			
		||||
        {
 | 
			
		||||
          g_warning ("No alpha function registered for mode %lu.",
 | 
			
		||||
                     mode);
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      if (alpha_data->closure_set)
 | 
			
		||||
        clutter_alpha_set_closure (alpha, alpha_data->closure);
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          clutter_alpha_set_closure_internal (alpha, NULL);
 | 
			
		||||
 | 
			
		||||
          priv->func = alpha_data->func;
 | 
			
		||||
          priv->user_data = alpha_data->data;
 | 
			
		||||
          priv->notify = NULL;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      priv->mode = mode;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    g_assert_not_reached ();
 | 
			
		||||
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_MODE]);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,138 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Authored By Matthew Allum  <mallum@openedhand.com>
 | 
			
		||||
 *             Jorn Baayen  <jorn@openedhand.com>
 | 
			
		||||
 *             Emmanuele Bassi  <ebassi@openedhand.com>
 | 
			
		||||
 *             Tomas Frydrych <tf@openedhand.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2006, 2007, 2008 OpenedHand
 | 
			
		||||
 * Copyright (C) 2009 Intel Corp.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
 | 
			
		||||
#error "Only <clutter/clutter.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_ALPHA_H__
 | 
			
		||||
#define __CLUTTER_ALPHA_H__
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-timeline.h>
 | 
			
		||||
#include <clutter/clutter-types.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_ALPHA              (clutter_alpha_get_type ())
 | 
			
		||||
#define CLUTTER_ALPHA(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ALPHA, ClutterAlpha))
 | 
			
		||||
#define CLUTTER_ALPHA_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_ALPHA, ClutterAlphaClass))
 | 
			
		||||
#define CLUTTER_IS_ALPHA(obj)           (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ALPHA))
 | 
			
		||||
#define CLUTTER_IS_ALPHA_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_ALPHA))
 | 
			
		||||
#define CLUTTER_ALPHA_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_ALPHA, ClutterAlphaClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterAlphaClass       ClutterAlphaClass;
 | 
			
		||||
typedef struct _ClutterAlphaPrivate     ClutterAlphaPrivate;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterAlphaFunc:
 | 
			
		||||
 * @alpha: a #ClutterAlpha
 | 
			
		||||
 * @user_data: user data passed to the function
 | 
			
		||||
 *
 | 
			
		||||
 * A function returning a value depending on the position of
 | 
			
		||||
 * the #ClutterTimeline bound to @alpha.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: a floating point value
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.2
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use #ClutterTimelineProgressFunc instead.
 | 
			
		||||
 */
 | 
			
		||||
typedef gdouble (*ClutterAlphaFunc) (ClutterAlpha *alpha,
 | 
			
		||||
                                     gpointer      user_data); 
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterAlpha:
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterAlpha combines a #ClutterTimeline and a function.
 | 
			
		||||
 * The contents of the #ClutterAlpha structure are private and should
 | 
			
		||||
 * only be accessed using the provided API.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.2
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use #ClutterTimeline instead
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterAlpha
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  GInitiallyUnowned parent;
 | 
			
		||||
 | 
			
		||||
  ClutterAlphaPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterAlphaClass:
 | 
			
		||||
 *
 | 
			
		||||
 * Base class for #ClutterAlpha
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.2
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use #ClutterTimeline instead
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterAlphaClass
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  GInitiallyUnownedClass parent_class;
 | 
			
		||||
  
 | 
			
		||||
  void (*_clutter_alpha_1) (void);
 | 
			
		||||
  void (*_clutter_alpha_2) (void);
 | 
			
		||||
  void (*_clutter_alpha_3) (void);
 | 
			
		||||
  void (*_clutter_alpha_4) (void);
 | 
			
		||||
  void (*_clutter_alpha_5) (void);
 | 
			
		||||
}; 
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
GType clutter_alpha_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterAlpha *   clutter_alpha_new              (void);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterAlpha *   clutter_alpha_new_full         (ClutterTimeline  *timeline,
 | 
			
		||||
                                                 gulong            mode);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
gdouble          clutter_alpha_get_alpha        (ClutterAlpha     *alpha);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void             clutter_alpha_set_func         (ClutterAlpha     *alpha,
 | 
			
		||||
                                                 ClutterAlphaFunc  func,
 | 
			
		||||
                                                 gpointer          data,
 | 
			
		||||
                                                 GDestroyNotify    destroy);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void             clutter_alpha_set_closure      (ClutterAlpha     *alpha,
 | 
			
		||||
                                                 GClosure         *closure);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void             clutter_alpha_set_timeline     (ClutterAlpha     *alpha,
 | 
			
		||||
                                                 ClutterTimeline  *timeline);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterTimeline *clutter_alpha_get_timeline     (ClutterAlpha     *alpha);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void             clutter_alpha_set_mode         (ClutterAlpha     *alpha,
 | 
			
		||||
                                                 gulong            mode);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
gulong           clutter_alpha_get_mode         (ClutterAlpha     *alpha);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_ALPHA_H__ */
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,152 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2008  Intel Corporation.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author:
 | 
			
		||||
 *   Emmanuele Bassi <ebassi@linux.intel.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
 | 
			
		||||
#error "Only <clutter/clutter.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_ANIMATION_H__
 | 
			
		||||
#define __CLUTTER_ANIMATION_H__
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-types.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_ANIMATION                  (clutter_animation_get_type ())
 | 
			
		||||
#define CLUTTER_ANIMATION(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ANIMATION, ClutterAnimation))
 | 
			
		||||
#define CLUTTER_IS_ANIMATION(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ANIMATION))
 | 
			
		||||
#define CLUTTER_ANIMATION_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_ANIMATION, ClutterAnimationClass))
 | 
			
		||||
#define CLUTTER_IS_ANIMATION_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_ANIMATION))
 | 
			
		||||
#define CLUTTER_ANIMATION_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_ANIMATION, ClutterAnimationClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterAnimationPrivate         ClutterAnimationPrivate;
 | 
			
		||||
typedef struct _ClutterAnimationClass           ClutterAnimationClass;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterAnimation:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterAnimation structure contains only private data and should
 | 
			
		||||
 * be accessed using the provided functions.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use the implicit animation on #ClutterActor
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterAnimation
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  GObject parent_instance;
 | 
			
		||||
 | 
			
		||||
  ClutterAnimationPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterAnimationClass:
 | 
			
		||||
 * @started: class handler for the #ClutterAnimation::started signal
 | 
			
		||||
 * @completed: class handler for the #ClutterAnimation::completed signal
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterAnimationClass structure contains only private data and
 | 
			
		||||
 * should be accessed using the provided functions.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12: Use the implicit animation on #ClutterActor
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterAnimationClass
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  GObjectClass parent_class;
 | 
			
		||||
 | 
			
		||||
  /*< public >*/
 | 
			
		||||
  void (* started)   (ClutterAnimation *animation);
 | 
			
		||||
  void (* completed) (ClutterAnimation *animation);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  /* padding for future expansion */
 | 
			
		||||
  void (*_clutter_reserved1) (void);
 | 
			
		||||
  void (*_clutter_reserved2) (void);
 | 
			
		||||
  void (*_clutter_reserved3) (void);
 | 
			
		||||
  void (*_clutter_reserved4) (void);
 | 
			
		||||
  void (*_clutter_reserved5) (void);
 | 
			
		||||
  void (*_clutter_reserved6) (void);
 | 
			
		||||
  void (*_clutter_reserved7) (void);
 | 
			
		||||
  void (*_clutter_reserved8) (void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
GType clutter_animation_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED_FOR(clutter_property_transition_new)
 | 
			
		||||
ClutterAnimation *      clutter_animation_new                   (void);
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED_FOR(clutter_transition_set_animatable)
 | 
			
		||||
void                    clutter_animation_set_object            (ClutterAnimation     *animation,
 | 
			
		||||
                                                                 GObject              *object);
 | 
			
		||||
CLUTTER_DEPRECATED_FOR(clutter_timeline_set_progress_mode)
 | 
			
		||||
void                    clutter_animation_set_mode              (ClutterAnimation     *animation,
 | 
			
		||||
                                                                 gulong                mode);
 | 
			
		||||
CLUTTER_DEPRECATED_FOR(clutter_timeline_get_progress_mode)
 | 
			
		||||
gulong                  clutter_animation_get_mode              (ClutterAnimation     *animation);
 | 
			
		||||
CLUTTER_DEPRECATED_FOR(clutter_timeline_set_duration)
 | 
			
		||||
void                    clutter_animation_set_duration          (ClutterAnimation     *animation,
 | 
			
		||||
                                                                 guint                 msecs);
 | 
			
		||||
CLUTTER_DEPRECATED_FOR(clutter_timeline_get_duration)
 | 
			
		||||
guint                   clutter_animation_get_duration          (ClutterAnimation     *animation);
 | 
			
		||||
CLUTTER_DEPRECATED_FOR(clutter_timeline_set_repeat_count)
 | 
			
		||||
void                    clutter_animation_set_loop              (ClutterAnimation     *animation,
 | 
			
		||||
                                                                 gboolean              loop);
 | 
			
		||||
CLUTTER_DEPRECATED_FOR(clutter_timeline_get_repeat_count)
 | 
			
		||||
gboolean                clutter_animation_get_loop              (ClutterAnimation     *animation);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void                    clutter_animation_set_timeline          (ClutterAnimation     *animation,
 | 
			
		||||
                                                                 ClutterTimeline      *timeline);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterTimeline *       clutter_animation_get_timeline          (ClutterAnimation     *animation);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
gboolean                clutter_animation_has_property          (ClutterAnimation     *animation,
 | 
			
		||||
                                                                 const gchar          *property_name);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterInterval     *   clutter_animation_get_interval          (ClutterAnimation     *animation,
 | 
			
		||||
                                                                 const gchar          *property_name);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ClutterActor API
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterAnimation *      clutter_actor_animate                   (ClutterActor         *actor,
 | 
			
		||||
                                                                 gulong                mode,
 | 
			
		||||
                                                                 guint                 duration,
 | 
			
		||||
                                                                 const gchar          *first_property_name,
 | 
			
		||||
                                                                 ...) G_GNUC_NULL_TERMINATED;
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterAnimation *      clutter_actor_animate_with_timeline     (ClutterActor         *actor,
 | 
			
		||||
                                                                 gulong                mode,
 | 
			
		||||
                                                                 ClutterTimeline      *timeline,
 | 
			
		||||
                                                                 const gchar          *first_property_name,
 | 
			
		||||
                                                                 ...) G_GNUC_NULL_TERMINATED;
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_ANIMATION_DEPRECATED_H__ */
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,147 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Authored By Øyvind Kolås <pippin@linux.intel.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009 Intel Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_STATE_H__
 | 
			
		||||
#define __CLUTTER_STATE_H__
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-types.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_STATE_KEY          (clutter_state_key_get_type ())
 | 
			
		||||
#define CLUTTER_TYPE_STATE              (clutter_state_get_type ())
 | 
			
		||||
#define CLUTTER_STATE(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_STATE, ClutterState))
 | 
			
		||||
#define CLUTTER_STATE_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_STATE, ClutterStateClass))
 | 
			
		||||
#define CLUTTER_IS_STATE(obj)           (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_STATE))
 | 
			
		||||
#define CLUTTER_IS_STATE_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_STATE))
 | 
			
		||||
#define CLUTTER_STATE_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_STATE, ClutterStateClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterStatePrivate ClutterStatePrivate;
 | 
			
		||||
typedef struct _ClutterStateClass   ClutterStateClass;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterStateKey:
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterStateKey is an opaque structure whose
 | 
			
		||||
 * members cannot be accessed directly
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
typedef struct _ClutterStateKey     ClutterStateKey;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterState:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterState structure contains only
 | 
			
		||||
 * private data and should be accessed using the provided API
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterState
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  GObject        parent;
 | 
			
		||||
  ClutterStatePrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterStateClass:
 | 
			
		||||
 * @completed: class handler for the #ClutterState::completed signal
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterStateClass structure contains
 | 
			
		||||
 * only private data
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterStateClass
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  GObjectClass parent_class;
 | 
			
		||||
 | 
			
		||||
  /*< public >*/
 | 
			
		||||
  void (* completed) (ClutterState *state);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  /* padding for future expansion */
 | 
			
		||||
  gpointer _padding_dummy[8];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
GType clutter_state_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterState    *clutter_state_new            (void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterTimeline * clutter_state_set_state     (ClutterState    *state,
 | 
			
		||||
                                               const gchar     *target_state_name);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterTimeline * clutter_state_warp_to_state (ClutterState    *state,
 | 
			
		||||
                                               const gchar     *target_state_name);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterState *    clutter_state_set_key       (ClutterState    *state,
 | 
			
		||||
                                               const gchar     *source_state_name,
 | 
			
		||||
                                               const gchar     *target_state_name,
 | 
			
		||||
                                               GObject         *object,
 | 
			
		||||
                                               const gchar     *property_name,
 | 
			
		||||
                                               guint            mode,
 | 
			
		||||
                                               const GValue    *value,
 | 
			
		||||
                                               gdouble          pre_delay,
 | 
			
		||||
                                               gdouble          post_delay);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void              clutter_state_set_duration  (ClutterState    *state,
 | 
			
		||||
                                               const gchar     *source_state_name,
 | 
			
		||||
                                               const gchar     *target_state_name,
 | 
			
		||||
                                               guint            duration);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
guint             clutter_state_get_duration  (ClutterState    *state,
 | 
			
		||||
                                               const gchar     *source_state_name,
 | 
			
		||||
                                               const gchar     *target_state_name);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void              clutter_state_set           (ClutterState    *state,
 | 
			
		||||
                                               const gchar     *source_state_name,
 | 
			
		||||
                                               const gchar     *target_state_name,
 | 
			
		||||
                                               gpointer         first_object,
 | 
			
		||||
                                               const gchar     *first_property_name,
 | 
			
		||||
                                               gulong           first_mode,
 | 
			
		||||
                                                ...) G_GNUC_NULL_TERMINATED;
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
GList           * clutter_state_get_states    (ClutterState    *state);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
const gchar *     clutter_state_get_state     (ClutterState    *state);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ClutterStateKey
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
GType                 clutter_state_key_get_type              (void) G_GNUC_CONST;
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
GType                 clutter_state_key_get_property_type     (const ClutterStateKey *key);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_STATE_H__ */
 | 
			
		||||
@@ -30,8 +30,6 @@ clutter_headers = [
 | 
			
		||||
  'clutter-deform-effect.h',
 | 
			
		||||
  'clutter-deprecated.h',
 | 
			
		||||
  'clutter-desaturate-effect.h',
 | 
			
		||||
  'clutter-drag-action.h',
 | 
			
		||||
  'clutter-drop-action.h',
 | 
			
		||||
  'clutter-effect.h',
 | 
			
		||||
  'clutter-enums.h',
 | 
			
		||||
  'clutter-event.h',
 | 
			
		||||
@@ -118,8 +116,6 @@ clutter_sources = [
 | 
			
		||||
  'clutter-content.c',
 | 
			
		||||
  'clutter-deform-effect.c',
 | 
			
		||||
  'clutter-desaturate-effect.c',
 | 
			
		||||
  'clutter-drag-action.c',
 | 
			
		||||
  'clutter-drop-action.c',
 | 
			
		||||
  'clutter-effect.c',
 | 
			
		||||
  'clutter-event.c',
 | 
			
		||||
  'clutter-feature.c',
 | 
			
		||||
@@ -223,24 +219,18 @@ clutter_nonintrospected_sources = [
 | 
			
		||||
 | 
			
		||||
clutter_deprecated_headers = [
 | 
			
		||||
  'deprecated/clutter-actor.h',
 | 
			
		||||
  'deprecated/clutter-alpha.h',
 | 
			
		||||
  'deprecated/clutter-animation.h',
 | 
			
		||||
  'deprecated/clutter-box.h',
 | 
			
		||||
  'deprecated/clutter-container.h',
 | 
			
		||||
  'deprecated/clutter-group.h',
 | 
			
		||||
  'deprecated/clutter-rectangle.h',
 | 
			
		||||
  'deprecated/clutter-stage.h',
 | 
			
		||||
  'deprecated/clutter-state.h',
 | 
			
		||||
  'deprecated/clutter-timeline.h',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
clutter_deprecated_sources = [
 | 
			
		||||
  'deprecated/clutter-alpha.c',
 | 
			
		||||
  'deprecated/clutter-animation.c',
 | 
			
		||||
  'deprecated/clutter-box.c',
 | 
			
		||||
  'deprecated/clutter-group.c',
 | 
			
		||||
  'deprecated/clutter-rectangle.c',
 | 
			
		||||
  'deprecated/clutter-state.c',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
clutter_backend_sources = []
 | 
			
		||||
@@ -341,35 +331,20 @@ clutter_build_config_h = configure_file(
 | 
			
		||||
)
 | 
			
		||||
clutter_built_private_headers += clutter_build_config_h
 | 
			
		||||
 | 
			
		||||
clutter_config_defines = []
 | 
			
		||||
cdata = configuration_data()
 | 
			
		||||
if have_wayland
 | 
			
		||||
  clutter_config_defines += [
 | 
			
		||||
    '#define CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT 1',
 | 
			
		||||
  ]
 | 
			
		||||
  cdata.set10('CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT', true)
 | 
			
		||||
endif
 | 
			
		||||
if have_x11
 | 
			
		||||
  clutter_config_defines += [
 | 
			
		||||
    '#define CLUTTER_WINDOWING_X11 "x11"',
 | 
			
		||||
    '#define CLUTTER_INPUT_X11 "x11"',
 | 
			
		||||
    '#define CLUTTER_WINDOWING_GLX "glx"',
 | 
			
		||||
  ]
 | 
			
		||||
  cdata.set_quoted('CLUTTER_WINDOWING_X11', 'x11')
 | 
			
		||||
  cdata.set_quoted('CLUTTER_INPUT_X11', 'x11')
 | 
			
		||||
  cdata.set_quoted('CLUTTER_WINDOWING_GLX', 'glx')
 | 
			
		||||
endif
 | 
			
		||||
if have_native_backend
 | 
			
		||||
  clutter_config_defines += [
 | 
			
		||||
    '#define CLUTTER_WINDOWING_EGL "eglnative"',
 | 
			
		||||
    '#define CLUTTER_INPUT_EVDEV "evdev"',
 | 
			
		||||
  ]
 | 
			
		||||
  cdata.set_quoted('CLUTTER_WINDOWING_EGL', 'eglnative')
 | 
			
		||||
  cdata.set_quoted('CLUTTER_INPUT_EVDEV', 'evdev')
 | 
			
		||||
endif
 | 
			
		||||
clutter_config_defines += [
 | 
			
		||||
  '#define CLUTTER_INPUT_NULL "null"',
 | 
			
		||||
]
 | 
			
		||||
clutter_config_defines_string = ''
 | 
			
		||||
foreach clutter_config_define : clutter_config_defines
 | 
			
		||||
  clutter_config_defines_string += clutter_config_define + '\n'
 | 
			
		||||
endforeach
 | 
			
		||||
 | 
			
		||||
cdata = configuration_data()
 | 
			
		||||
cdata.set('CLUTTER_CONFIG_DEFINES', clutter_config_defines_string)
 | 
			
		||||
cdata.set_quoted('CLUTTER_INPUT_NULL', 'null')
 | 
			
		||||
 | 
			
		||||
clutter_config_h = configure_file(
 | 
			
		||||
  input: 'clutter-config.h.in',
 | 
			
		||||
@@ -429,7 +404,6 @@ libmutter_clutter = shared_library(libmutter_clutter_name,
 | 
			
		||||
  link_with: [
 | 
			
		||||
    libmutter_cogl,
 | 
			
		||||
    libmutter_cogl_pango,
 | 
			
		||||
    libmutter_cogl_path,
 | 
			
		||||
  ],
 | 
			
		||||
  install_rpath: pkglibdir,
 | 
			
		||||
  install_dir: pkglibdir,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								cogl/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								cogl/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -36,8 +36,6 @@ cogl-egl-defines.h
 | 
			
		||||
cogl-enum-types.c
 | 
			
		||||
cogl-enum-types.h
 | 
			
		||||
cogl-gl-header.h
 | 
			
		||||
cogl-path-enum-types.c
 | 
			
		||||
cogl-path-enum-types.h
 | 
			
		||||
cogl-config.h
 | 
			
		||||
cogl-config.h.in
 | 
			
		||||
cogl-mutter-config.h
 | 
			
		||||
 
 | 
			
		||||
@@ -81,6 +81,7 @@ struct _CoglPangoDisplayListNode
 | 
			
		||||
      GArray *rectangles;
 | 
			
		||||
      /* A primitive representing those vertices */
 | 
			
		||||
      CoglPrimitive *primitive;
 | 
			
		||||
      guint has_color : 1;
 | 
			
		||||
    } texture;
 | 
			
		||||
 | 
			
		||||
    struct
 | 
			
		||||
@@ -420,7 +421,9 @@ _cogl_pango_display_list_render (CoglFramebuffer *fb,
 | 
			
		||||
                                  cogl_color_get_red_byte (&node->color),
 | 
			
		||||
                                  cogl_color_get_green_byte (&node->color),
 | 
			
		||||
                                  cogl_color_get_blue_byte (&node->color),
 | 
			
		||||
                                  cogl_color_get_alpha_byte (color));
 | 
			
		||||
                                  (cogl_color_get_alpha_byte (&node->color) *
 | 
			
		||||
                                   cogl_color_get_alpha_byte (color) /
 | 
			
		||||
                                   255));
 | 
			
		||||
      else
 | 
			
		||||
        draw_color = *color;
 | 
			
		||||
      cogl_color_premultiply (&draw_color);
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,7 @@ PangoFontMap *
 | 
			
		||||
cogl_pango_font_map_new (void)
 | 
			
		||||
{
 | 
			
		||||
  PangoFontMap *fm = pango_cairo_font_map_new ();
 | 
			
		||||
  CoglPangoFontMapPriv *priv = g_new0 (CoglPangoFontMapPriv, 1);
 | 
			
		||||
  g_autofree CoglPangoFontMapPriv *priv = g_new0 (CoglPangoFontMapPriv, 1);
 | 
			
		||||
 | 
			
		||||
  _COGL_GET_CONTEXT (context, NULL);
 | 
			
		||||
 | 
			
		||||
@@ -85,7 +85,7 @@ cogl_pango_font_map_new (void)
 | 
			
		||||
   * for now. */
 | 
			
		||||
  g_object_set_qdata_full (G_OBJECT (fm),
 | 
			
		||||
                           cogl_pango_font_map_get_priv_key (),
 | 
			
		||||
                           priv,
 | 
			
		||||
                           g_steal_pointer (&priv),
 | 
			
		||||
                           free_priv);
 | 
			
		||||
 | 
			
		||||
  return fm;
 | 
			
		||||
 
 | 
			
		||||
@@ -58,27 +58,29 @@ struct _CoglPangoGlyphCacheValue
 | 
			
		||||
 | 
			
		||||
  /* This will be set to TRUE when the glyph atlas is reorganized
 | 
			
		||||
     which means the glyph will need to be redrawn */
 | 
			
		||||
  gboolean   dirty;
 | 
			
		||||
  guint dirty : 1;
 | 
			
		||||
  /* Set to TRUE if the glyph has colors (eg. emoji) */
 | 
			
		||||
  guint has_color : 1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef void (* CoglPangoGlyphCacheDirtyFunc) (PangoFont *font,
 | 
			
		||||
                                               PangoGlyph glyph,
 | 
			
		||||
                                               CoglPangoGlyphCacheValue *value);
 | 
			
		||||
 | 
			
		||||
CoglPangoGlyphCache *
 | 
			
		||||
COGL_EXPORT CoglPangoGlyphCache *
 | 
			
		||||
cogl_pango_glyph_cache_new (CoglContext *ctx,
 | 
			
		||||
                            gboolean use_mipmapping);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
COGL_EXPORT void
 | 
			
		||||
cogl_pango_glyph_cache_free (CoglPangoGlyphCache *cache);
 | 
			
		||||
 | 
			
		||||
CoglPangoGlyphCacheValue *
 | 
			
		||||
COGL_EXPORT CoglPangoGlyphCacheValue *
 | 
			
		||||
cogl_pango_glyph_cache_lookup (CoglPangoGlyphCache *cache,
 | 
			
		||||
                               gboolean             create,
 | 
			
		||||
                               PangoFont           *font,
 | 
			
		||||
                               PangoGlyph           glyph);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
COGL_EXPORT void
 | 
			
		||||
cogl_pango_glyph_cache_clear (CoglPangoGlyphCache *cache);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
 
 | 
			
		||||
@@ -50,6 +50,7 @@
 | 
			
		||||
#include <pango/pangocairo.h>
 | 
			
		||||
#include <pango/pango-renderer.h>
 | 
			
		||||
#include <cairo.h>
 | 
			
		||||
#include <cairo-ft.h>
 | 
			
		||||
 | 
			
		||||
#include "cogl/cogl-debug.h"
 | 
			
		||||
#include "cogl/cogl-context-private.h"
 | 
			
		||||
@@ -526,6 +527,24 @@ cogl_pango_renderer_get_cached_glyph (PangoRenderer *renderer,
 | 
			
		||||
                                        create, font, glyph);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
font_has_color_glyphs (const PangoFont *font)
 | 
			
		||||
{
 | 
			
		||||
  cairo_scaled_font_t *scaled_font;
 | 
			
		||||
  gboolean has_color = FALSE;
 | 
			
		||||
 | 
			
		||||
  scaled_font = pango_cairo_font_get_scaled_font ((PangoCairoFont *) font);
 | 
			
		||||
 | 
			
		||||
  if (cairo_scaled_font_get_type (scaled_font) == CAIRO_FONT_TYPE_FT)
 | 
			
		||||
    {
 | 
			
		||||
      FT_Face ft_face = cairo_ft_scaled_font_lock_face (scaled_font);
 | 
			
		||||
      has_color = (FT_HAS_COLOR (ft_face) != 0);
 | 
			
		||||
      cairo_ft_scaled_font_unlock_face (scaled_font);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return has_color;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cogl_pango_renderer_set_dirty_glyph (PangoFont *font,
 | 
			
		||||
                                     PangoGlyph glyph,
 | 
			
		||||
@@ -600,6 +619,8 @@ cogl_pango_renderer_set_dirty_glyph (PangoFont *font,
 | 
			
		||||
                           cairo_image_surface_get_data (surface));
 | 
			
		||||
 | 
			
		||||
  cairo_surface_destroy (surface);
 | 
			
		||||
 | 
			
		||||
  value->has_color = font_has_color_glyphs (font);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -698,6 +719,7 @@ cogl_pango_renderer_set_color_for_part (PangoRenderer   *renderer,
 | 
			
		||||
                                        PangoRenderPart  part)
 | 
			
		||||
{
 | 
			
		||||
  PangoColor *pango_color = pango_renderer_get_color (renderer, part);
 | 
			
		||||
  uint16_t alpha = pango_renderer_get_alpha (renderer, part);
 | 
			
		||||
  CoglPangoRenderer *priv = COGL_PANGO_RENDERER (renderer);
 | 
			
		||||
 | 
			
		||||
  if (pango_color)
 | 
			
		||||
@@ -708,7 +730,7 @@ cogl_pango_renderer_set_color_for_part (PangoRenderer   *renderer,
 | 
			
		||||
                                pango_color->red >> 8,
 | 
			
		||||
                                pango_color->green >> 8,
 | 
			
		||||
                                pango_color->blue >> 8,
 | 
			
		||||
                                0xff);
 | 
			
		||||
                                alpha ? alpha >> 8 : 0xff);
 | 
			
		||||
 | 
			
		||||
      _cogl_pango_display_list_set_color_override (priv->display_list, &color);
 | 
			
		||||
    }
 | 
			
		||||
@@ -820,14 +842,13 @@ cogl_pango_renderer_draw_glyphs (PangoRenderer    *renderer,
 | 
			
		||||
  CoglPangoGlyphCacheValue *cache_value;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  cogl_pango_renderer_set_color_for_part (renderer,
 | 
			
		||||
					  PANGO_RENDER_PART_FOREGROUND);
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < glyphs->num_glyphs; i++)
 | 
			
		||||
    {
 | 
			
		||||
      PangoGlyphInfo *gi = glyphs->glyphs + i;
 | 
			
		||||
      float x, y;
 | 
			
		||||
 | 
			
		||||
      cogl_pango_renderer_set_color_for_part (renderer,
 | 
			
		||||
                                              PANGO_RENDER_PART_FOREGROUND);
 | 
			
		||||
      cogl_pango_renderer_get_device_units (renderer,
 | 
			
		||||
					    xi + gi->geometry.x_offset,
 | 
			
		||||
					    yi + gi->geometry.y_offset,
 | 
			
		||||
@@ -884,6 +905,19 @@ cogl_pango_renderer_draw_glyphs (PangoRenderer    *renderer,
 | 
			
		||||
	      x += (float)(cache_value->draw_x);
 | 
			
		||||
	      y += (float)(cache_value->draw_y);
 | 
			
		||||
 | 
			
		||||
              /* Do not override color if the glyph/font provide its own */
 | 
			
		||||
              if (cache_value->has_color)
 | 
			
		||||
                {
 | 
			
		||||
                  CoglColor color;
 | 
			
		||||
                  uint16_t alpha;
 | 
			
		||||
 | 
			
		||||
                  alpha = pango_renderer_get_alpha (renderer,
 | 
			
		||||
                                                    PANGO_RENDER_PART_FOREGROUND);
 | 
			
		||||
                  cogl_color_init_from_4ub (&color, 0xff, 0xff, 0xff,
 | 
			
		||||
					    alpha ? alpha >> 8 : 0xff);
 | 
			
		||||
                  _cogl_pango_display_list_set_color_override (priv->display_list, &color);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              cogl_pango_renderer_draw_glyph (priv, cache_value, x, y);
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,7 @@ typedef PangoCairoFontMap CoglPangoFontMap;
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.14
 | 
			
		||||
 */
 | 
			
		||||
PangoFontMap *
 | 
			
		||||
COGL_EXPORT PangoFontMap *
 | 
			
		||||
cogl_pango_font_map_new (void);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -86,7 +86,7 @@ cogl_pango_font_map_new (void);
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer full): the newly created context: free with g_object_unref().
 | 
			
		||||
 */
 | 
			
		||||
PangoContext *
 | 
			
		||||
COGL_EXPORT PangoContext *
 | 
			
		||||
cogl_pango_font_map_create_context (CoglPangoFontMap *font_map);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -102,7 +102,7 @@ cogl_pango_font_map_create_context (CoglPangoFontMap *font_map);
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.14
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
COGL_EXPORT void
 | 
			
		||||
cogl_pango_font_map_set_resolution (CoglPangoFontMap *font_map,
 | 
			
		||||
                                    double dpi);
 | 
			
		||||
 | 
			
		||||
@@ -114,7 +114,7 @@ cogl_pango_font_map_set_resolution (CoglPangoFontMap *font_map,
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
COGL_EXPORT void
 | 
			
		||||
cogl_pango_font_map_clear_glyph_cache (CoglPangoFontMap *font_map);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -129,7 +129,7 @@ cogl_pango_font_map_clear_glyph_cache (CoglPangoFontMap *font_map);
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
COGL_EXPORT void
 | 
			
		||||
cogl_pango_ensure_glyph_cache_for_layout (PangoLayout *layout);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -142,7 +142,7 @@ cogl_pango_ensure_glyph_cache_for_layout (PangoLayout *layout);
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
COGL_EXPORT void
 | 
			
		||||
cogl_pango_font_map_set_use_mipmapping (CoglPangoFontMap *font_map,
 | 
			
		||||
                                        gboolean value);
 | 
			
		||||
 | 
			
		||||
@@ -157,7 +157,7 @@ cogl_pango_font_map_set_use_mipmapping (CoglPangoFontMap *font_map,
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
COGL_EXPORT gboolean
 | 
			
		||||
cogl_pango_font_map_get_use_mipmapping (CoglPangoFontMap *font_map);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -170,7 +170,7 @@ cogl_pango_font_map_get_use_mipmapping (CoglPangoFontMap *font_map);
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
PangoRenderer *
 | 
			
		||||
COGL_EXPORT PangoRenderer *
 | 
			
		||||
cogl_pango_font_map_get_renderer (CoglPangoFontMap *font_map);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -187,7 +187,7 @@ cogl_pango_font_map_get_renderer (CoglPangoFontMap *font_map);
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.14
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
COGL_EXPORT void
 | 
			
		||||
cogl_pango_show_layout (CoglFramebuffer *framebuffer,
 | 
			
		||||
                        PangoLayout *layout,
 | 
			
		||||
                        float x,
 | 
			
		||||
@@ -208,7 +208,7 @@ cogl_pango_show_layout (CoglFramebuffer *framebuffer,
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.14
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
COGL_EXPORT void
 | 
			
		||||
cogl_pango_show_layout_line (CoglFramebuffer *framebuffer,
 | 
			
		||||
                             PangoLayoutLine *line,
 | 
			
		||||
                             float x,
 | 
			
		||||
@@ -227,7 +227,7 @@ cogl_pango_show_layout_line (CoglFramebuffer *framebuffer,
 | 
			
		||||
typedef struct _CoglPangoRenderer      CoglPangoRenderer;
 | 
			
		||||
typedef struct _CoglPangoRendererClass CoglPangoRendererClass;
 | 
			
		||||
 | 
			
		||||
GType cogl_pango_renderer_get_type (void) G_GNUC_CONST;
 | 
			
		||||
COGL_EXPORT GType cogl_pango_renderer_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
global:
 | 
			
		||||
  cogl_pango_*;
 | 
			
		||||
local:
 | 
			
		||||
  *;
 | 
			
		||||
};
 | 
			
		||||
@@ -20,19 +20,13 @@ cogl_pango_deps = [
 | 
			
		||||
  libmutter_cogl_dep,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
libmutter_cogl_pango_map = 'libmutter-cogl-pango.map'
 | 
			
		||||
libmutter_cogl_pango_link_args = [
 | 
			
		||||
  '-Wl,--version-script,@0@/@1@'.format(meson.current_source_dir(),
 | 
			
		||||
      libmutter_cogl_pango_map),
 | 
			
		||||
]
 | 
			
		||||
libmutter_cogl_pango = shared_library('mutter-cogl-pango-' + libmutter_api_version,
 | 
			
		||||
  sources: [cogl_pango_sources, cogl_pango_public_headers],
 | 
			
		||||
  version: '0.0.0',
 | 
			
		||||
  soversion: 0,
 | 
			
		||||
  c_args: cogl_c_args,
 | 
			
		||||
  include_directories: [cogl_includepath, cogl_path_includepath],
 | 
			
		||||
  link_depends: libmutter_cogl_pango_map,
 | 
			
		||||
  link_args: libmutter_cogl_pango_link_args,
 | 
			
		||||
  include_directories: [cogl_includepath],
 | 
			
		||||
  gnu_symbol_visibility: 'hidden',
 | 
			
		||||
  dependencies: [cogl_pango_deps],
 | 
			
		||||
  install_rpath: pkglibdir,
 | 
			
		||||
  install_dir: pkglibdir,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,48 +0,0 @@
 | 
			
		||||
/*** BEGIN file-header ***/
 | 
			
		||||
#include "cogl-config.h"
 | 
			
		||||
 | 
			
		||||
/* We need to undefine this so that we will be sure to include
 | 
			
		||||
 * cogl-path.h instead of cogl2-path.h when we include the framebuffer
 | 
			
		||||
 * header. Otherwise it will include both headers and it won't
 | 
			
		||||
 * compile. */
 | 
			
		||||
#undef COGL_ENABLE_EXPERIMENTAL_2_0_API
 | 
			
		||||
 | 
			
		||||
#include "cogl-path-enum-types.h"
 | 
			
		||||
/*** END file-header ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN file-production ***/
 | 
			
		||||
 | 
			
		||||
/* enumerations from "@filename@" */
 | 
			
		||||
#include "@filename@"
 | 
			
		||||
 | 
			
		||||
/*** END file-production ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN value-header ***/
 | 
			
		||||
GType
 | 
			
		||||
@enum_name@_get_type (void)
 | 
			
		||||
{
 | 
			
		||||
  static volatile gsize g_enum_type_id__volatile = 0;
 | 
			
		||||
 | 
			
		||||
  if (g_once_init_enter (&g_enum_type_id__volatile))
 | 
			
		||||
    {
 | 
			
		||||
      static const G@Type@Value values[] = {
 | 
			
		||||
/*** END value-header ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN value-production ***/
 | 
			
		||||
        { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
 | 
			
		||||
/*** END value-production ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN value-tail ***/
 | 
			
		||||
        { 0, NULL, NULL }
 | 
			
		||||
      };
 | 
			
		||||
      GType g_enum_type_id;
 | 
			
		||||
 | 
			
		||||
      g_enum_type_id =
 | 
			
		||||
        g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
 | 
			
		||||
 | 
			
		||||
      g_once_init_leave (&g_enum_type_id__volatile, g_enum_type_id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return g_enum_type_id__volatile;
 | 
			
		||||
}
 | 
			
		||||
/*** END value-tail ***/
 | 
			
		||||
@@ -1,25 +0,0 @@
 | 
			
		||||
/*** BEGIN file-header ***/
 | 
			
		||||
#ifndef __COGL_PATH_ENUM_TYPES_H__
 | 
			
		||||
#define __COGL_PATH_ENUM_TYPES_H__
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
/*** END file-header ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN file-production ***/
 | 
			
		||||
/* enumerations from "@basename@" */
 | 
			
		||||
/*** END file-production ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN file-tail ***/
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __COGL_PATH_ENUM_TYPES_H__ */
 | 
			
		||||
/*** END file-tail ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN value-header ***/
 | 
			
		||||
GType @enum_name@_get_type (void) G_GNUC_CONST;
 | 
			
		||||
#define COGL_TYPE_@ENUMSHORT@ (@enum_name@_get_type())
 | 
			
		||||
 | 
			
		||||
/*** END value-header ***/
 | 
			
		||||
@@ -1,486 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Cogl
 | 
			
		||||
 *
 | 
			
		||||
 * A Low Level GPU Graphics and Utilities API
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2008,2009,2013 Intel Corporation.
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person
 | 
			
		||||
 * obtaining a copy of this software and associated documentation
 | 
			
		||||
 * files (the "Software"), to deal in the Software without
 | 
			
		||||
 * restriction, including without limitation the rights to use, copy,
 | 
			
		||||
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 | 
			
		||||
 * of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be
 | 
			
		||||
 * included in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
			
		||||
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
			
		||||
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | 
			
		||||
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 | 
			
		||||
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 | 
			
		||||
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
 * SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__COGL_H_INSIDE__) && !defined(COGL_COMPILATION)
 | 
			
		||||
#error "Only <cogl/cogl.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __COGL_PATH_FUNCTIONS_H__
 | 
			
		||||
#define __COGL_PATH_FUNCTIONS_H__
 | 
			
		||||
 | 
			
		||||
#include <cogl/cogl-types.h>
 | 
			
		||||
#ifdef COGL_COMPILATION
 | 
			
		||||
#include "cogl-context.h"
 | 
			
		||||
#else
 | 
			
		||||
#include <cogl/cogl.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_get_gtype:
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: a #GType that can be used with the GLib type system.
 | 
			
		||||
 */
 | 
			
		||||
GType cogl_path_get_gtype (void);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_new cogl2_path_new
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_new:
 | 
			
		||||
 *
 | 
			
		||||
 * Creates a new, empty path object. The default fill rule is
 | 
			
		||||
 * %COGL_PATH_FILL_RULE_EVEN_ODD.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: A pointer to a newly allocated #CoglPath, which can
 | 
			
		||||
 * be freed using cogl_object_unref().
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
CoglPath *
 | 
			
		||||
cogl_path_new (void);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_copy:
 | 
			
		||||
 * @path: A #CoglPath object
 | 
			
		||||
 *
 | 
			
		||||
 * Returns a new copy of the path in @path. The new path has a
 | 
			
		||||
 * reference count of 1 so you should unref it with
 | 
			
		||||
 * cogl_object_unref() if you no longer need it.
 | 
			
		||||
 *
 | 
			
		||||
 * Internally the path will share the data until one of the paths is
 | 
			
		||||
 * modified so copying paths should be relatively cheap.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer full): a copy of the path in @path.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
CoglPath *
 | 
			
		||||
cogl_path_copy (CoglPath *path);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_is_path:
 | 
			
		||||
 * @object: A #CoglObject
 | 
			
		||||
 *
 | 
			
		||||
 * Gets whether the given object references an existing path object.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: %TRUE if the object references a #CoglPath,
 | 
			
		||||
 *   %FALSE otherwise.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
cogl_is_path (void *object);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_move_to cogl2_path_move_to
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_move_to:
 | 
			
		||||
 * @x: X coordinate of the pen location to move to.
 | 
			
		||||
 * @y: Y coordinate of the pen location to move to.
 | 
			
		||||
 *
 | 
			
		||||
 * Moves the pen to the given location. If there is an existing path
 | 
			
		||||
 * this will start a new disjoint subpath.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_move_to (CoglPath *path,
 | 
			
		||||
                   float x,
 | 
			
		||||
                   float y);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_rel_move_to cogl2_path_rel_move_to
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_rel_move_to:
 | 
			
		||||
 * @x: X offset from the current pen location to move the pen to.
 | 
			
		||||
 * @y: Y offset from the current pen location to move the pen to.
 | 
			
		||||
 *
 | 
			
		||||
 * Moves the pen to the given offset relative to the current pen
 | 
			
		||||
 * location. If there is an existing path this will start a new
 | 
			
		||||
 * disjoint subpath.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_rel_move_to (CoglPath *path,
 | 
			
		||||
                       float x,
 | 
			
		||||
                       float y);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_line_to cogl2_path_line_to
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_line_to:
 | 
			
		||||
 * @x: X coordinate of the end line vertex
 | 
			
		||||
 * @y: Y coordinate of the end line vertex
 | 
			
		||||
 *
 | 
			
		||||
 * Adds a straight line segment to the current path that ends at the
 | 
			
		||||
 * given coordinates.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_line_to (CoglPath *path,
 | 
			
		||||
                   float x,
 | 
			
		||||
                   float y);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_rel_line_to cogl2_path_rel_line_to
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_rel_line_to:
 | 
			
		||||
 * @x: X offset from the current pen location of the end line vertex
 | 
			
		||||
 * @y: Y offset from the current pen location of the end line vertex
 | 
			
		||||
 *
 | 
			
		||||
 * Adds a straight line segment to the current path that ends at the
 | 
			
		||||
 * given coordinates relative to the current pen location.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_rel_line_to (CoglPath *path,
 | 
			
		||||
                       float x,
 | 
			
		||||
                       float y);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_arc cogl2_path_arc
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_arc:
 | 
			
		||||
 * @center_x: X coordinate of the elliptical arc center
 | 
			
		||||
 * @center_y: Y coordinate of the elliptical arc center
 | 
			
		||||
 * @radius_x: X radius of the elliptical arc
 | 
			
		||||
 * @radius_y: Y radius of the elliptical arc
 | 
			
		||||
 * @angle_1: Angle in degrees at which the arc begin
 | 
			
		||||
 * @angle_2: Angle in degrees at which the arc ends
 | 
			
		||||
 *
 | 
			
		||||
 * Adds an elliptical arc segment to the current path. A straight line
 | 
			
		||||
 * segment will link the current pen location with the first vertex
 | 
			
		||||
 * of the arc. If you perform a move_to to the arcs start just before
 | 
			
		||||
 * drawing it you create a free standing arc.
 | 
			
		||||
 *
 | 
			
		||||
 * The angles are measured in degrees where 0° is in the direction of
 | 
			
		||||
 * the positive X axis and 90° is in the direction of the positive Y
 | 
			
		||||
 * axis. The angle of the arc begins at @angle_1 and heads towards
 | 
			
		||||
 * @angle_2 (so if @angle_2 is less than @angle_1 it will decrease,
 | 
			
		||||
 * otherwise it will increase).
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_arc (CoglPath *path,
 | 
			
		||||
               float center_x,
 | 
			
		||||
               float center_y,
 | 
			
		||||
               float radius_x,
 | 
			
		||||
               float radius_y,
 | 
			
		||||
               float angle_1,
 | 
			
		||||
               float angle_2);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_curve_to cogl2_path_curve_to
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_curve_to:
 | 
			
		||||
 * @x_1: X coordinate of the second bezier control point
 | 
			
		||||
 * @y_1: Y coordinate of the second bezier control point
 | 
			
		||||
 * @x_2: X coordinate of the third bezier control point
 | 
			
		||||
 * @y_2: Y coordinate of the third bezier control point
 | 
			
		||||
 * @x_3: X coordinate of the fourth bezier control point
 | 
			
		||||
 * @y_3: Y coordinate of the fourth bezier control point
 | 
			
		||||
 *
 | 
			
		||||
 * Adds a cubic bezier curve segment to the current path with the given
 | 
			
		||||
 * second, third and fourth control points and using current pen location
 | 
			
		||||
 * as the first control point.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_curve_to (CoglPath *path,
 | 
			
		||||
                    float x_1,
 | 
			
		||||
                    float y_1,
 | 
			
		||||
                    float x_2,
 | 
			
		||||
                    float y_2,
 | 
			
		||||
                    float x_3,
 | 
			
		||||
                    float y_3);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_rel_curve_to cogl2_path_rel_curve_to
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_rel_curve_to:
 | 
			
		||||
 * @x_1: X coordinate of the second bezier control point
 | 
			
		||||
 * @y_1: Y coordinate of the second bezier control point
 | 
			
		||||
 * @x_2: X coordinate of the third bezier control point
 | 
			
		||||
 * @y_2: Y coordinate of the third bezier control point
 | 
			
		||||
 * @x_3: X coordinate of the fourth bezier control point
 | 
			
		||||
 * @y_3: Y coordinate of the fourth bezier control point
 | 
			
		||||
 *
 | 
			
		||||
 * Adds a cubic bezier curve segment to the current path with the given
 | 
			
		||||
 * second, third and fourth control points and using current pen location
 | 
			
		||||
 * as the first control point. The given coordinates are relative to the
 | 
			
		||||
 * current pen location.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_rel_curve_to (CoglPath *path,
 | 
			
		||||
                        float x_1,
 | 
			
		||||
                        float y_1,
 | 
			
		||||
                        float x_2,
 | 
			
		||||
                        float y_2,
 | 
			
		||||
                        float x_3,
 | 
			
		||||
                        float y_3);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_close cogl2_path_close
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_close:
 | 
			
		||||
 *
 | 
			
		||||
 * Closes the path being constructed by adding a straight line segment
 | 
			
		||||
 * to it that ends at the first vertex of the path.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_close (CoglPath *path);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_line cogl2_path_line
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_line:
 | 
			
		||||
 * @x_1: X coordinate of the start line vertex
 | 
			
		||||
 * @y_1: Y coordinate of the start line vertex
 | 
			
		||||
 * @x_2: X coordinate of the end line vertex
 | 
			
		||||
 * @y_2: Y coordinate of the end line vertex
 | 
			
		||||
 *
 | 
			
		||||
 * Constructs a straight line shape starting and ending at the given
 | 
			
		||||
 * coordinates. If there is an existing path this will start a new
 | 
			
		||||
 * disjoint sub-path.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_line (CoglPath *path,
 | 
			
		||||
                float x_1,
 | 
			
		||||
                float y_1,
 | 
			
		||||
                float x_2,
 | 
			
		||||
                float y_2);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_polyline cogl2_path_polyline
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_polyline:
 | 
			
		||||
 * @coords: (in) (array) (transfer none): A pointer to the first element of an
 | 
			
		||||
 * array of fixed-point values that specify the vertex coordinates.
 | 
			
		||||
 * @num_points: The total number of vertices.
 | 
			
		||||
 *
 | 
			
		||||
 * Constructs a series of straight line segments, starting from the
 | 
			
		||||
 * first given vertex coordinate. If there is an existing path this
 | 
			
		||||
 * will start a new disjoint sub-path. Each subsequent segment starts
 | 
			
		||||
 * where the previous one ended and ends at the next given vertex
 | 
			
		||||
 * coordinate.
 | 
			
		||||
 *
 | 
			
		||||
 * The coords array must contain 2 * num_points values. The first value
 | 
			
		||||
 * represents the X coordinate of the first vertex, the second value
 | 
			
		||||
 * represents the Y coordinate of the first vertex, continuing in the same
 | 
			
		||||
 * fashion for the rest of the vertices. (num_points - 1) segments will
 | 
			
		||||
 * be constructed.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_polyline (CoglPath *path,
 | 
			
		||||
                    const float *coords,
 | 
			
		||||
                    int num_points);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_polygon cogl2_path_polygon
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_polygon:
 | 
			
		||||
 * @coords: (in) (array) (transfer none): A pointer to the first element of
 | 
			
		||||
 * an array of fixed-point values that specify the vertex coordinates.
 | 
			
		||||
 * @num_points: The total number of vertices.
 | 
			
		||||
 *
 | 
			
		||||
 * Constructs a polygonal shape of the given number of vertices. If
 | 
			
		||||
 * there is an existing path this will start a new disjoint sub-path.
 | 
			
		||||
 *
 | 
			
		||||
 * The coords array must contain 2 * num_points values. The first value
 | 
			
		||||
 * represents the X coordinate of the first vertex, the second value
 | 
			
		||||
 * represents the Y coordinate of the first vertex, continuing in the same
 | 
			
		||||
 * fashion for the rest of the vertices.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_polygon (CoglPath *path,
 | 
			
		||||
                   const float *coords,
 | 
			
		||||
                   int num_points);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_rectangle cogl2_path_rectangle
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_rectangle:
 | 
			
		||||
 * @x_1: X coordinate of the top-left corner.
 | 
			
		||||
 * @y_1: Y coordinate of the top-left corner.
 | 
			
		||||
 * @x_2: X coordinate of the bottom-right corner.
 | 
			
		||||
 * @y_2: Y coordinate of the bottom-right corner.
 | 
			
		||||
 *
 | 
			
		||||
 * Constructs a rectangular shape at the given coordinates. If there
 | 
			
		||||
 * is an existing path this will start a new disjoint sub-path.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_rectangle (CoglPath *path,
 | 
			
		||||
                     float x_1,
 | 
			
		||||
                     float y_1,
 | 
			
		||||
                     float x_2,
 | 
			
		||||
                     float y_2);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_ellipse cogl2_path_ellipse
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_ellipse:
 | 
			
		||||
 * @center_x: X coordinate of the ellipse center
 | 
			
		||||
 * @center_y: Y coordinate of the ellipse center
 | 
			
		||||
 * @radius_x: X radius of the ellipse
 | 
			
		||||
 * @radius_y: Y radius of the ellipse
 | 
			
		||||
 *
 | 
			
		||||
 * Constructs an ellipse shape. If there is an existing path this will
 | 
			
		||||
 * start a new disjoint sub-path.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_ellipse (CoglPath *path,
 | 
			
		||||
                   float center_x,
 | 
			
		||||
                   float center_y,
 | 
			
		||||
                   float radius_x,
 | 
			
		||||
                   float radius_y);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_round_rectangle cogl2_path_round_rectangle
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_round_rectangle:
 | 
			
		||||
 * @x_1: X coordinate of the top-left corner.
 | 
			
		||||
 * @y_1: Y coordinate of the top-left corner.
 | 
			
		||||
 * @x_2: X coordinate of the bottom-right corner.
 | 
			
		||||
 * @y_2: Y coordinate of the bottom-right corner.
 | 
			
		||||
 * @radius: Radius of the corner arcs.
 | 
			
		||||
 * @arc_step: Angle increment resolution for subdivision of
 | 
			
		||||
 * the corner arcs.
 | 
			
		||||
 *
 | 
			
		||||
 * Constructs a rectangular shape with rounded corners. If there is an
 | 
			
		||||
 * existing path this will start a new disjoint sub-path.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_round_rectangle (CoglPath *path,
 | 
			
		||||
                           float x_1,
 | 
			
		||||
                           float y_1,
 | 
			
		||||
                           float x_2,
 | 
			
		||||
                           float y_2,
 | 
			
		||||
                           float radius,
 | 
			
		||||
                           float arc_step);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_set_fill_rule cogl2_path_set_fill_rule
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_set_fill_rule:
 | 
			
		||||
 * @fill_rule: The new fill rule.
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the fill rule of the current path to @fill_rule. This will
 | 
			
		||||
 * affect how the path is filled when cogl_path_fill() is later
 | 
			
		||||
 * called. Note that the fill rule state is attached to the path so
 | 
			
		||||
 * calling cogl_get_path() will preserve the fill rule and calling
 | 
			
		||||
 * cogl_path_new() will reset the fill rule back to the default.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_path_set_fill_rule (CoglPath *path, CoglPathFillRule fill_rule);
 | 
			
		||||
 | 
			
		||||
#define cogl_path_get_fill_rule cogl2_path_get_fill_rule
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_path_get_fill_rule:
 | 
			
		||||
 *
 | 
			
		||||
 * Retrieves the fill rule set using cogl_path_set_fill_rule().
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: the fill rule that is used for the current path.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 2.0
 | 
			
		||||
 */
 | 
			
		||||
CoglPathFillRule
 | 
			
		||||
cogl_path_get_fill_rule (CoglPath *path);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_framebuffer_fill_path:
 | 
			
		||||
 * @framebuffer: A #CoglFramebuffer
 | 
			
		||||
 * @pipeline: A #CoglPipeline to render with
 | 
			
		||||
 * @path: The #CoglPath to fill
 | 
			
		||||
 *
 | 
			
		||||
 * Fills the interior of the path using the fragment operations
 | 
			
		||||
 * defined by the pipeline.
 | 
			
		||||
 *
 | 
			
		||||
 * The interior of the shape is determined using the fill rule of the
 | 
			
		||||
 * path. See %CoglPathFillRule for details.
 | 
			
		||||
 *
 | 
			
		||||
 * <note>The result of referencing sliced textures in your current
 | 
			
		||||
 * pipeline when filling a path are undefined. You should pass
 | 
			
		||||
 * the %COGL_TEXTURE_NO_SLICING flag when loading any texture you will
 | 
			
		||||
 * use while filling a path.</note>
 | 
			
		||||
 *
 | 
			
		||||
 * Stability: unstable
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_framebuffer_fill_path (CoglFramebuffer *framebuffer,
 | 
			
		||||
                            CoglPipeline *pipeline,
 | 
			
		||||
                            CoglPath *path);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_framebuffer_stroke_path:
 | 
			
		||||
 * @framebuffer: A #CoglFramebuffer
 | 
			
		||||
 * @pipeline: A #CoglPipeline to render with
 | 
			
		||||
 * @path: The #CoglPath to stroke
 | 
			
		||||
 *
 | 
			
		||||
 * Strokes the edge of the path using the fragment operations defined
 | 
			
		||||
 * by the pipeline. The stroke line will have a width of 1 pixel
 | 
			
		||||
 * regardless of the current transformation matrix.
 | 
			
		||||
 *
 | 
			
		||||
 * Stability: unstable
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_framebuffer_stroke_path (CoglFramebuffer *framebuffer,
 | 
			
		||||
                              CoglPipeline *pipeline,
 | 
			
		||||
                              CoglPath *path);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_framebuffer_push_path_clip:
 | 
			
		||||
 * @framebuffer: A #CoglFramebuffer pointer
 | 
			
		||||
 * @path: The path to clip with.
 | 
			
		||||
 *
 | 
			
		||||
 * Sets a new clipping area using the silhouette of the specified,
 | 
			
		||||
 * filled @path.  The clipping area is intersected with the previous
 | 
			
		||||
 * clipping area. To restore the previous clipping area, call
 | 
			
		||||
 * cogl_framebuffer_pop_clip().
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 * Stability: unstable
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_framebuffer_push_path_clip (CoglFramebuffer *framebuffer,
 | 
			
		||||
                                 CoglPath *path);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __COGL_PATH_FUNCTIONS_H__ */
 | 
			
		||||
 | 
			
		||||
@@ -1,126 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Cogl
 | 
			
		||||
 *
 | 
			
		||||
 * A Low Level GPU Graphics and Utilities API
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010 Intel Corporation.
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person
 | 
			
		||||
 * obtaining a copy of this software and associated documentation
 | 
			
		||||
 * files (the "Software"), to deal in the Software without
 | 
			
		||||
 * restriction, including without limitation the rights to use, copy,
 | 
			
		||||
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 | 
			
		||||
 * of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be
 | 
			
		||||
 * included in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
			
		||||
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
			
		||||
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | 
			
		||||
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 | 
			
		||||
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 | 
			
		||||
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
 * SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __COGL_PATH_PRIVATE_H
 | 
			
		||||
#define __COGL_PATH_PRIVATE_H
 | 
			
		||||
 | 
			
		||||
#include "cogl-object.h"
 | 
			
		||||
#include "cogl-attribute-private.h"
 | 
			
		||||
 | 
			
		||||
typedef struct _floatVec2
 | 
			
		||||
{
 | 
			
		||||
  float x;
 | 
			
		||||
  float y;
 | 
			
		||||
} floatVec2;
 | 
			
		||||
 | 
			
		||||
typedef struct _CoglPathNode
 | 
			
		||||
{
 | 
			
		||||
  float x;
 | 
			
		||||
  float y;
 | 
			
		||||
  unsigned int path_size;
 | 
			
		||||
} CoglPathNode;
 | 
			
		||||
 | 
			
		||||
typedef struct _CoglBezQuad
 | 
			
		||||
{
 | 
			
		||||
  floatVec2 p1;
 | 
			
		||||
  floatVec2 p2;
 | 
			
		||||
  floatVec2 p3;
 | 
			
		||||
} CoglBezQuad;
 | 
			
		||||
 | 
			
		||||
typedef struct _CoglBezCubic
 | 
			
		||||
{
 | 
			
		||||
  floatVec2 p1;
 | 
			
		||||
  floatVec2 p2;
 | 
			
		||||
  floatVec2 p3;
 | 
			
		||||
  floatVec2 p4;
 | 
			
		||||
} CoglBezCubic;
 | 
			
		||||
 | 
			
		||||
typedef struct _CoglPathData CoglPathData;
 | 
			
		||||
 | 
			
		||||
struct _CoglPath
 | 
			
		||||
{
 | 
			
		||||
  CoglObject _parent;
 | 
			
		||||
 | 
			
		||||
  CoglPathData *data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define COGL_PATH_N_ATTRIBUTES 2
 | 
			
		||||
 | 
			
		||||
struct _CoglPathData
 | 
			
		||||
{
 | 
			
		||||
  unsigned int         ref_count;
 | 
			
		||||
 | 
			
		||||
  CoglContext         *context;
 | 
			
		||||
 | 
			
		||||
  CoglPathFillRule     fill_rule;
 | 
			
		||||
 | 
			
		||||
  GArray              *path_nodes;
 | 
			
		||||
 | 
			
		||||
  floatVec2            path_start;
 | 
			
		||||
  floatVec2            path_pen;
 | 
			
		||||
  unsigned int         last_path;
 | 
			
		||||
  floatVec2            path_nodes_min;
 | 
			
		||||
  floatVec2            path_nodes_max;
 | 
			
		||||
 | 
			
		||||
  CoglAttributeBuffer *fill_attribute_buffer;
 | 
			
		||||
  CoglIndices         *fill_vbo_indices;
 | 
			
		||||
  unsigned int         fill_vbo_n_indices;
 | 
			
		||||
  CoglAttribute       *fill_attributes[COGL_PATH_N_ATTRIBUTES + 1];
 | 
			
		||||
  CoglPrimitive       *fill_primitive;
 | 
			
		||||
 | 
			
		||||
  CoglAttributeBuffer *stroke_attribute_buffer;
 | 
			
		||||
  CoglAttribute      **stroke_attributes;
 | 
			
		||||
  unsigned int         stroke_n_attributes;
 | 
			
		||||
 | 
			
		||||
  /* This is used as an optimisation for when the path contains a
 | 
			
		||||
     single contour specified using cogl2_path_rectangle. Cogl is more
 | 
			
		||||
     optimised to handle rectangles than paths so we can detect this
 | 
			
		||||
     case and divert to the journal or a rectangle clip. If it is TRUE
 | 
			
		||||
     then the entire path can be described by calling
 | 
			
		||||
     _cogl_path_get_bounds */
 | 
			
		||||
  gboolean             is_rectangle;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_cogl_add_path_to_stencil_buffer (CoglPath  *path,
 | 
			
		||||
                                  gboolean   merge,
 | 
			
		||||
                                  gboolean   need_clear);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_cogl_path_get_bounds (CoglPath *path,
 | 
			
		||||
                       float *min_x,
 | 
			
		||||
                       float *min_y,
 | 
			
		||||
                       float *max_x,
 | 
			
		||||
                       float *max_y);
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
_cogl_path_is_rectangle (CoglPath *path);
 | 
			
		||||
 | 
			
		||||
#endif /* __COGL_PATH_PRIVATE_H */
 | 
			
		||||
@@ -1,86 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Cogl
 | 
			
		||||
 *
 | 
			
		||||
 * A Low Level GPU Graphics and Utilities API
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2008,2009,2013 Intel Corporation.
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person
 | 
			
		||||
 * obtaining a copy of this software and associated documentation
 | 
			
		||||
 * files (the "Software"), to deal in the Software without
 | 
			
		||||
 * restriction, including without limitation the rights to use, copy,
 | 
			
		||||
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 | 
			
		||||
 * of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be
 | 
			
		||||
 * included in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
			
		||||
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
			
		||||
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | 
			
		||||
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 | 
			
		||||
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 | 
			
		||||
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
 * SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__COGL_H_INSIDE__) && !defined(COGL_COMPILATION)
 | 
			
		||||
#error "Only <cogl/cogl.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __COGL_PATH_TYPES_H__
 | 
			
		||||
#define __COGL_PATH_TYPES_H__
 | 
			
		||||
 | 
			
		||||
#include <cogl/cogl-types.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
typedef struct _CoglPath CoglPath;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * CoglPathFillRule:
 | 
			
		||||
 * @COGL_PATH_FILL_RULE_NON_ZERO: Each time the line crosses an edge of
 | 
			
		||||
 * the path from left to right one is added to a counter and each time
 | 
			
		||||
 * it crosses from right to left the counter is decremented. If the
 | 
			
		||||
 * counter is non-zero then the point will be filled. See <xref
 | 
			
		||||
 * linkend="fill-rule-non-zero"/>.
 | 
			
		||||
 * @COGL_PATH_FILL_RULE_EVEN_ODD: If the line crosses an edge of the
 | 
			
		||||
 * path an odd number of times then the point will filled, otherwise
 | 
			
		||||
 * it won't. See <xref linkend="fill-rule-even-odd"/>.
 | 
			
		||||
 *
 | 
			
		||||
 * #CoglPathFillRule is used to determine how a path is filled. There
 | 
			
		||||
 * are two options - 'non-zero' and 'even-odd'. To work out whether any
 | 
			
		||||
 * point will be filled imagine drawing an infinetely long line in any
 | 
			
		||||
 * direction from that point. The number of times and the direction
 | 
			
		||||
 * that the edges of the path crosses this line determines whether the
 | 
			
		||||
 * line is filled as described below. Any open sub paths are treated
 | 
			
		||||
 * as if there was an extra line joining the first point and the last
 | 
			
		||||
 * point.
 | 
			
		||||
 *
 | 
			
		||||
 * The default fill rule when creating a path is %COGL_PATH_FILL_RULE_EVEN_ODD.
 | 
			
		||||
 *
 | 
			
		||||
 * <figure id="fill-rule-non-zero">
 | 
			
		||||
 *   <title>Example of filling various paths using the non-zero rule</title>
 | 
			
		||||
 *   <graphic fileref="fill-rule-non-zero.png" format="PNG"/>
 | 
			
		||||
 * </figure>
 | 
			
		||||
 *
 | 
			
		||||
 * <figure id="fill-rule-even-odd">
 | 
			
		||||
 *   <title>Example of filling various paths using the even-odd rule</title>
 | 
			
		||||
 *   <graphic fileref="fill-rule-even-odd.png" format="PNG"/>
 | 
			
		||||
 * </figure>
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  COGL_PATH_FILL_RULE_NON_ZERO,
 | 
			
		||||
  COGL_PATH_FILL_RULE_EVEN_ODD
 | 
			
		||||
} CoglPathFillRule;
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __COGL_PATH_TYPES_H__ */
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,60 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Cogl
 | 
			
		||||
 *
 | 
			
		||||
 * A Low Level GPU Graphics and Utilities API
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2008,2009,2013 Intel Corporation.
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person
 | 
			
		||||
 * obtaining a copy of this software and associated documentation
 | 
			
		||||
 * files (the "Software"), to deal in the Software without
 | 
			
		||||
 * restriction, including without limitation the rights to use, copy,
 | 
			
		||||
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 | 
			
		||||
 * of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be
 | 
			
		||||
 * included in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
			
		||||
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
			
		||||
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | 
			
		||||
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 | 
			
		||||
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 | 
			
		||||
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
 * SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __COGL_PATH_H__
 | 
			
		||||
#define __COGL_PATH_H__
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:cogl-paths
 | 
			
		||||
 * @short_description: Functions for constructing and drawing 2D paths.
 | 
			
		||||
 *
 | 
			
		||||
 * There are two levels on which drawing with cogl-paths can be used.
 | 
			
		||||
 * The highest level functions construct various simple primitive
 | 
			
		||||
 * shapes to be either filled or stroked. Using a lower-level set of
 | 
			
		||||
 * functions more complex and arbitrary paths can be constructed by
 | 
			
		||||
 * concatenating straight line, bezier curve and arc segments.
 | 
			
		||||
 *
 | 
			
		||||
 * When constructing arbitrary paths, the current pen location is
 | 
			
		||||
 * initialized using the move_to command. The subsequent path segments
 | 
			
		||||
 * implicitly use the last pen location as their first vertex and move
 | 
			
		||||
 * the pen location to the last vertex they produce at the end. Also
 | 
			
		||||
 * there are special versions of functions that allow specifying the
 | 
			
		||||
 * vertices of the path segments relative to the last pen location
 | 
			
		||||
 * rather then in the absolute coordinates.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <cogl/cogl-defines.h>
 | 
			
		||||
 | 
			
		||||
#include <cogl-path/cogl-path-enum-types.h>
 | 
			
		||||
#include <cogl-path/cogl-path-types.h>
 | 
			
		||||
#include <cogl-path/cogl-path-functions.h>
 | 
			
		||||
 | 
			
		||||
#endif /* __COGL_PATH_H__ */
 | 
			
		||||
 | 
			
		||||
@@ -1,59 +0,0 @@
 | 
			
		||||
/* cogl1-path-functions.h */
 | 
			
		||||
cogl_clip_push_from_path
 | 
			
		||||
cogl_clip_push_from_path_preserve
 | 
			
		||||
cogl_get_path
 | 
			
		||||
cogl_is_path
 | 
			
		||||
cogl_path_arc
 | 
			
		||||
cogl_path_close
 | 
			
		||||
cogl_path_copy
 | 
			
		||||
cogl_path_curve_to
 | 
			
		||||
cogl_path_ellipse
 | 
			
		||||
cogl_path_fill
 | 
			
		||||
cogl_path_fill_preserve
 | 
			
		||||
cogl_path_get_fill_rule
 | 
			
		||||
#ifdef COGL_HAS_GTYPE_SUPPORT
 | 
			
		||||
cogl_path_get_gtype
 | 
			
		||||
#endif
 | 
			
		||||
cogl_path_line
 | 
			
		||||
cogl_path_line_to
 | 
			
		||||
cogl_path_move_to
 | 
			
		||||
cogl_path_new
 | 
			
		||||
cogl_path_polygon
 | 
			
		||||
cogl_path_polyline
 | 
			
		||||
cogl_path_rectangle
 | 
			
		||||
cogl_path_rel_curve_to
 | 
			
		||||
cogl_path_rel_line_to
 | 
			
		||||
cogl_path_rel_move_to
 | 
			
		||||
cogl_path_round_rectangle
 | 
			
		||||
cogl_path_set_fill_rule
 | 
			
		||||
cogl_path_stroke
 | 
			
		||||
cogl_path_stroke_preserve
 | 
			
		||||
cogl_set_path
 | 
			
		||||
 | 
			
		||||
/* cogl2-path-functions.h */
 | 
			
		||||
cogl_framebuffer_fill_path
 | 
			
		||||
cogl_framebuffer_push_path_clip
 | 
			
		||||
cogl_framebuffer_stroke_path
 | 
			
		||||
cogl2_clip_push_from_path
 | 
			
		||||
cogl2_path_arc
 | 
			
		||||
cogl2_path_close
 | 
			
		||||
cogl2_path_curve_to
 | 
			
		||||
cogl2_path_ellipse
 | 
			
		||||
cogl2_path_fill
 | 
			
		||||
cogl2_path_get_fill_rule
 | 
			
		||||
cogl2_path_line
 | 
			
		||||
cogl2_path_line_to
 | 
			
		||||
cogl2_path_move_to
 | 
			
		||||
cogl2_path_new
 | 
			
		||||
cogl2_path_polygon
 | 
			
		||||
cogl2_path_polyline
 | 
			
		||||
cogl2_path_rectangle
 | 
			
		||||
cogl2_path_rel_curve_to
 | 
			
		||||
cogl2_path_rel_line_to
 | 
			
		||||
cogl2_path_rel_move_to
 | 
			
		||||
cogl2_path_round_rectangle
 | 
			
		||||
cogl2_path_set_fill_rule
 | 
			
		||||
cogl2_path_stroke
 | 
			
		||||
 | 
			
		||||
/* cogl-path-enums.h-contents may change as header is generated */
 | 
			
		||||
cogl_path_fill_rule_get_type
 | 
			
		||||
@@ -1,17 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
global:
 | 
			
		||||
  cogl_framebuffer_*;
 | 
			
		||||
  cogl_path_*;
 | 
			
		||||
  cogl_is_*;
 | 
			
		||||
  cogl_clip_*;
 | 
			
		||||
  cogl_get_*;
 | 
			
		||||
  cogl_set_*;
 | 
			
		||||
  cogl2_framebuffer_*;
 | 
			
		||||
  cogl2_path_*;
 | 
			
		||||
  cogl2_is_*;
 | 
			
		||||
  cogl2_clip_*;
 | 
			
		||||
  cogl2_get_*;
 | 
			
		||||
  cogl2_set_*;
 | 
			
		||||
local:
 | 
			
		||||
  *;
 | 
			
		||||
};
 | 
			
		||||
@@ -1,93 +0,0 @@
 | 
			
		||||
cogl_path_includesubdir = join_paths(cogl_includesubdir, 'cogl-path')
 | 
			
		||||
cogl_path_includedir = join_paths(cogl_includedir, 'cogl-path')
 | 
			
		||||
 | 
			
		||||
cogl_path_public_headers = [
 | 
			
		||||
  'cogl-path.h',
 | 
			
		||||
  'cogl-path-functions.h',
 | 
			
		||||
  'cogl-path-types.h',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
cogl_path_sources = [
 | 
			
		||||
  'cogl-path.c',
 | 
			
		||||
  'cogl-path-private.h',
 | 
			
		||||
  'tesselator/dict-list.h',
 | 
			
		||||
  'tesselator/dict.c',
 | 
			
		||||
  'tesselator/dict.h',
 | 
			
		||||
  'tesselator/geom.c',
 | 
			
		||||
  'tesselator/geom.h',
 | 
			
		||||
  'tesselator/gluos.h',
 | 
			
		||||
  'tesselator/memalloc.h',
 | 
			
		||||
  'tesselator/mesh.c',
 | 
			
		||||
  'tesselator/mesh.h',
 | 
			
		||||
  'tesselator/normal.c',
 | 
			
		||||
  'tesselator/normal.h',
 | 
			
		||||
  'tesselator/priorityq-heap.h',
 | 
			
		||||
  'tesselator/priorityq-sort.h',
 | 
			
		||||
  'tesselator/priorityq.c',
 | 
			
		||||
  'tesselator/priorityq.h',
 | 
			
		||||
  'tesselator/render.c',
 | 
			
		||||
  'tesselator/render.h',
 | 
			
		||||
  'tesselator/sweep.c',
 | 
			
		||||
  'tesselator/sweep.h',
 | 
			
		||||
  'tesselator/tess.c',
 | 
			
		||||
  'tesselator/tess.h',
 | 
			
		||||
  'tesselator/tesselator.h',
 | 
			
		||||
  'tesselator/tessmono.c',
 | 
			
		||||
  'tesselator/tessmono.h',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
cogl_path_includepath = include_directories('.')
 | 
			
		||||
 | 
			
		||||
libmutter_cogl_path_enum_types = gnome.mkenums('cogl-path-enum-types',
 | 
			
		||||
  sources: 'cogl-path-types.h',
 | 
			
		||||
  c_template: 'cogl-path-enum-types.c.in',
 | 
			
		||||
  h_template: 'cogl-path-enum-types.h.in',
 | 
			
		||||
  install_dir: cogl_path_includedir,
 | 
			
		||||
  install_header: true,
 | 
			
		||||
)
 | 
			
		||||
libmutter_cogl_path_enum_types_h = libmutter_cogl_path_enum_types[1]
 | 
			
		||||
 | 
			
		||||
cogl_path_sources += libmutter_cogl_path_enum_types
 | 
			
		||||
 | 
			
		||||
cogl_path_c_args = [
 | 
			
		||||
  cogl_c_args,
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
libmutter_cogl_path_map = 'libmutter-cogl-path.map'
 | 
			
		||||
libmutter_cogl_path_link_args = [
 | 
			
		||||
  '-Wl,--version-script,@0@/@1@'.format(meson.current_source_dir(),
 | 
			
		||||
      libmutter_cogl_path_map),
 | 
			
		||||
]
 | 
			
		||||
libmutter_cogl_path = shared_library('mutter-cogl-path-' + libmutter_api_version,
 | 
			
		||||
  sources: [cogl_path_sources, cogl_path_public_headers],
 | 
			
		||||
  version: '0.0.0',
 | 
			
		||||
  soversion: 0,
 | 
			
		||||
  c_args: cogl_path_c_args,
 | 
			
		||||
  include_directories: [cogl_includepath, cogl_path_includepath],
 | 
			
		||||
  link_depends: libmutter_cogl_path_map,
 | 
			
		||||
  link_args: libmutter_cogl_path_link_args,
 | 
			
		||||
  dependencies: libmutter_cogl_dep,
 | 
			
		||||
  install_rpath: pkglibdir,
 | 
			
		||||
  install_dir: pkglibdir,
 | 
			
		||||
  install: true,
 | 
			
		||||
)
 | 
			
		||||
libmutter_cogl_path_dep = declare_dependency(
 | 
			
		||||
  sources: [libmutter_cogl_path_enum_types_h],
 | 
			
		||||
  link_with: libmutter_cogl_path
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
install_headers(cogl_path_public_headers,
 | 
			
		||||
  subdir: cogl_path_includesubdir)
 | 
			
		||||
 | 
			
		||||
pkg.generate(libmutter_cogl_path,
 | 
			
		||||
  name: 'CoglPath',
 | 
			
		||||
  filebase: 'mutter-cogl-path-' + libmutter_api_version,
 | 
			
		||||
  description: 'A 2D path drawing library for Cogl in mutter',
 | 
			
		||||
  subdirs: join_paths(pkgname, 'cogl'),
 | 
			
		||||
  requires: [cogl_pkg_deps, libmutter_cogl_name],
 | 
			
		||||
  version: meson.project_version(),
 | 
			
		||||
  variables: [
 | 
			
		||||
    'apiversion=' + libmutter_api_version,
 | 
			
		||||
  ],
 | 
			
		||||
  install_dir: pcdir,
 | 
			
		||||
)
 | 
			
		||||
@@ -1,13 +0,0 @@
 | 
			
		||||
prefix=@prefix@
 | 
			
		||||
exec_prefix=@exec_prefix@
 | 
			
		||||
apiversion=@LIBMUTTER_API_VERSION@
 | 
			
		||||
libdir=@libdir@/mutter-${apiversion}
 | 
			
		||||
includedir=@includedir@/mutter-${apiversion}
 | 
			
		||||
requires=@COGL_PKG_REQUIRES@ mutter-cogl-${apiversion}
 | 
			
		||||
 | 
			
		||||
Name: Cogl
 | 
			
		||||
Description: A 2D path drawing library for Cogl
 | 
			
		||||
Version: @MUTTER_VERSION@
 | 
			
		||||
Libs: -L${libdir} -lmutter-cogl-path-${apiversion}
 | 
			
		||||
Cflags: -I${includedir}/cogl
 | 
			
		||||
Requires: ${requires}
 | 
			
		||||
@@ -1,446 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
General Polygon Tesselation
 | 
			
		||||
---------------------------
 | 
			
		||||
 | 
			
		||||
  This note describes a tesselator for polygons consisting of one or
 | 
			
		||||
  more closed contours.  It is backward-compatible with the current
 | 
			
		||||
  OpenGL Utilities tesselator, and is intended to replace it.  Here is
 | 
			
		||||
  a summary of the major differences:
 | 
			
		||||
 | 
			
		||||
   - input contours can be intersecting, self-intersecting, or degenerate.
 | 
			
		||||
  
 | 
			
		||||
   - supports a choice of several winding rules for determining which parts
 | 
			
		||||
     of the polygon are on the "interior".  This makes it possible to do
 | 
			
		||||
     CSG operations on polygons.
 | 
			
		||||
  
 | 
			
		||||
   - boundary extraction: instead of tesselating the polygon, returns a
 | 
			
		||||
     set of closed contours which separate the interior from the exterior.
 | 
			
		||||
  
 | 
			
		||||
   - returns the output as a small number of triangle fans and strips,
 | 
			
		||||
     rather than a list of independent triangles (when possible).
 | 
			
		||||
  
 | 
			
		||||
   - output is available as an explicit mesh (a quad-edge structure),
 | 
			
		||||
     in addition to the normal callback interface.
 | 
			
		||||
  
 | 
			
		||||
   - the algorithm used is extremely robust.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
The interface
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
  The tesselator state is maintained in a "tesselator object".
 | 
			
		||||
  These are allocated and destroyed using
 | 
			
		||||
 | 
			
		||||
     GLUtesselator *gluNewTess( void );
 | 
			
		||||
     void gluDeleteTess( GLUtesselator *tess );
 | 
			
		||||
 | 
			
		||||
  Several tesselator objects may be used simultaneously.
 | 
			
		||||
 | 
			
		||||
  Inputs
 | 
			
		||||
  ------
 | 
			
		||||
  
 | 
			
		||||
  The input contours are specified with the following routines:
 | 
			
		||||
 | 
			
		||||
     void gluTessBeginPolygon( GLUtesselator *tess );
 | 
			
		||||
     void gluTessBeginContour( GLUtesselator *tess );
 | 
			
		||||
     void gluTessVertex( GLUtesselator *tess, GLUcoord coords[3], void *data );
 | 
			
		||||
     void gluTessEndContour( GLUtesselator *tess );
 | 
			
		||||
     void gluTessEndPolygon( GLUtesselator *tess );
 | 
			
		||||
 | 
			
		||||
  Within each BeginPolygon/EndPolygon pair, there can be zero or more
 | 
			
		||||
  calls to BeginContour/EndContour.  Within each contour, there are zero
 | 
			
		||||
  or more calls to gluTessVertex().  The vertices specify a closed
 | 
			
		||||
  contour (the last vertex of each contour is automatically linked to
 | 
			
		||||
  the first).
 | 
			
		||||
 | 
			
		||||
  "coords" give the coordinates of the vertex in 3-space.  For useful
 | 
			
		||||
  results, all vertices should lie in some plane, since the vertices
 | 
			
		||||
  are projected onto a plane before tesselation.  "data" is a pointer
 | 
			
		||||
  to a user-defined vertex structure, which typically contains other
 | 
			
		||||
  information such as color, texture coordinates, normal, etc.  It is
 | 
			
		||||
  used to refer to the vertex during rendering.
 | 
			
		||||
 | 
			
		||||
  The library can be compiled in single- or double-precision; the type
 | 
			
		||||
  GLUcoord represents either "float" or "double" accordingly.  The GLU
 | 
			
		||||
  version will be available in double-precision only.  Compile with
 | 
			
		||||
  GLU_TESS_API_FLOAT defined to get the single-precision version.
 | 
			
		||||
 | 
			
		||||
  When EndPolygon is called, the tesselation algorithm determines
 | 
			
		||||
  which regions are interior to the given contours, according to one
 | 
			
		||||
  of several "winding rules" described below.  The interior regions
 | 
			
		||||
  are then tesselated, and the output is provided as callbacks.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  Rendering Callbacks
 | 
			
		||||
  -------------------
 | 
			
		||||
 | 
			
		||||
  Callbacks are specified by the client using
 | 
			
		||||
 | 
			
		||||
     void gluTessCallback( GLUtesselator *tess, GLenum which, void (*fn)());
 | 
			
		||||
 | 
			
		||||
  If "fn" is NULL, any previously defined callback is discarded.
 | 
			
		||||
  
 | 
			
		||||
  The callbacks used to provide output are:	/* which == */
 | 
			
		||||
 | 
			
		||||
     void begin( GLenum type );			/* GLU_TESS_BEGIN */
 | 
			
		||||
     void edgeFlag( GLboolean flag );		/* GLU_TESS_EDGE_FLAG */
 | 
			
		||||
     void vertex( void *data );			/* GLU_TESS_VERTEX */
 | 
			
		||||
     void end( void );				/* GLU_TESS_END */
 | 
			
		||||
 | 
			
		||||
  Any of the callbacks may be left undefined; if so, the corresponding
 | 
			
		||||
  information will not be supplied during rendering.
 | 
			
		||||
 | 
			
		||||
  The "begin" callback indicates the start of a primitive; type is one
 | 
			
		||||
  of GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, or GL_TRIANGLES (but see the
 | 
			
		||||
  notes on "boundary extraction" below).
 | 
			
		||||
  
 | 
			
		||||
  It is followed by any number of "vertex" callbacks, which supply the
 | 
			
		||||
  vertices in the same order as expected by the corresponding glBegin()
 | 
			
		||||
  call.  After the last vertex of a given primitive, there is a callback
 | 
			
		||||
  to "end".
 | 
			
		||||
 | 
			
		||||
  If the "edgeFlag" callback is provided, no triangle fans or strips
 | 
			
		||||
  will be used.  When edgeFlag is called, if "flag" is GL_TRUE then each
 | 
			
		||||
  vertex which follows begins an edge which lies on the polygon boundary
 | 
			
		||||
  (ie. an edge which separates an interior region from an exterior one).
 | 
			
		||||
  If "flag" is GL_FALSE, each vertex which follows begins an edge which lies
 | 
			
		||||
  in the polygon interior.  "edgeFlag" will be called before the first
 | 
			
		||||
  call to "vertex".
 | 
			
		||||
 | 
			
		||||
  Other Callbacks
 | 
			
		||||
  ---------------
 | 
			
		||||
 | 
			
		||||
   void mesh( GLUmesh *mesh );			/* GLU_TESS_MESH */
 | 
			
		||||
 | 
			
		||||
   - Returns an explicit mesh, represented using the quad-edge structure
 | 
			
		||||
     (Guibas/Stolfi '85).  Other implementations of this interface might
 | 
			
		||||
     use a different mesh structure, so this is available only only as an
 | 
			
		||||
     SGI extension.  When the mesh is no longer needed, it should be freed
 | 
			
		||||
     using
 | 
			
		||||
 | 
			
		||||
	void gluDeleteMesh( GLUmesh *mesh );
 | 
			
		||||
 | 
			
		||||
     There is a brief description of this data structure in the include
 | 
			
		||||
     file "mesh.h".  For the full details, see L. Guibas and J. Stolfi,
 | 
			
		||||
     Primitives for the manipulation of general subdivisions and the
 | 
			
		||||
     computation of Voronoi diagrams, ACM Transactions on Graphics,
 | 
			
		||||
     4(2):74-123, April 1985.  For an introduction, see the course notes
 | 
			
		||||
     for CS348a, "Mathematical Foundations of Computer Graphics",
 | 
			
		||||
     available at the Stanford bookstore (and taught during the fall
 | 
			
		||||
     quarter).
 | 
			
		||||
 | 
			
		||||
   void error( GLenum errno );			/* GLU_TESS_ERROR */
 | 
			
		||||
 | 
			
		||||
   - errno is one of	GLU_TESS_MISSING_BEGIN_POLYGON,
 | 
			
		||||
			GLU_TESS_MISSING_END_POLYGON,
 | 
			
		||||
			GLU_TESS_MISSING_BEGIN_CONTOUR,
 | 
			
		||||
			GLU_TESS_MISSING_END_CONTOUR,
 | 
			
		||||
			GLU_TESS_COORD_TOO_LARGE,
 | 
			
		||||
			GLU_TESS_NEED_COMBINE_CALLBACK
 | 
			
		||||
 | 
			
		||||
     The first four are obvious.  The interface recovers from these
 | 
			
		||||
     errors by inserting the missing call(s).
 | 
			
		||||
  
 | 
			
		||||
     GLU_TESS_COORD_TOO_LARGE says that some vertex coordinate exceeded
 | 
			
		||||
     the predefined constant GLU_TESS_MAX_COORD in absolute value, and
 | 
			
		||||
     that the value has been clamped.  (Coordinate values must be small
 | 
			
		||||
     enough so that two can be multiplied together without overflow.)
 | 
			
		||||
 | 
			
		||||
     GLU_TESS_NEED_COMBINE_CALLBACK says that the algorithm detected an
 | 
			
		||||
     intersection between two edges in the input data, and the "combine"
 | 
			
		||||
     callback (below) was not provided.  No output will be generated.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   void combine( GLUcoord coords[3], void *data[4],	/* GLU_TESS_COMBINE */
 | 
			
		||||
		 GLUcoord weight[4], void **outData );
 | 
			
		||||
 | 
			
		||||
   - When the algorithm detects an intersection, or wishes to merge
 | 
			
		||||
     features, it needs to create a new vertex.  The vertex is defined
 | 
			
		||||
     as a linear combination of up to 4 existing vertices, referenced
 | 
			
		||||
     by data[0..3].  The coefficients of the linear combination are
 | 
			
		||||
     given by weight[0..3]; these weights always sum to 1.0.  All vertex
 | 
			
		||||
     pointers are valid even when some of the weights are zero.
 | 
			
		||||
     "coords" gives the location of the new vertex.
 | 
			
		||||
 | 
			
		||||
     The user must allocate another vertex, interpolate parameters
 | 
			
		||||
     using "data" and "weights", and return the new vertex pointer in
 | 
			
		||||
     "outData".  This handle is supplied during rendering callbacks.
 | 
			
		||||
     For example, if the polygon lies in an arbitrary plane in 3-space,
 | 
			
		||||
     and we associate a color with each vertex, the combine callback might
 | 
			
		||||
     look like this:
 | 
			
		||||
    
 | 
			
		||||
     void myCombine( GLUcoord coords[3], VERTEX *d[4],
 | 
			
		||||
                     GLUcoord w[4], VERTEX **dataOut )
 | 
			
		||||
     {
 | 
			
		||||
        VERTEX *new = new_vertex();
 | 
			
		||||
       
 | 
			
		||||
        new->x = coords[0];
 | 
			
		||||
        new->y = coords[1];
 | 
			
		||||
        new->z = coords[2];
 | 
			
		||||
        new->r = w[0]*d[0]->r + w[1]*d[1]->r + w[2]*d[2]->r + w[3]*d[3]->r;
 | 
			
		||||
        new->g = w[0]*d[0]->g + w[1]*d[1]->g + w[2]*d[2]->g + w[3]*d[3]->g;
 | 
			
		||||
        new->b = w[0]*d[0]->b + w[1]*d[1]->b + w[2]*d[2]->b + w[3]*d[3]->b;
 | 
			
		||||
        new->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a + w[3]*d[3]->a;
 | 
			
		||||
        *dataOut = new;
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
     If the algorithm detects an intersection, then the "combine" callback
 | 
			
		||||
     must be defined, and must write a non-NULL pointer into "dataOut".
 | 
			
		||||
     Otherwise the GLU_TESS_NEED_COMBINE_CALLBACK error occurs, and no
 | 
			
		||||
     output is generated.  This is the only error that can occur during
 | 
			
		||||
     tesselation and rendering.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  Control over Tesselation
 | 
			
		||||
  ------------------------
 | 
			
		||||
  
 | 
			
		||||
   void gluTessProperty( GLUtesselator *tess, GLenum which, GLUcoord value );
 | 
			
		||||
 | 
			
		||||
   Properties defined:
 | 
			
		||||
 | 
			
		||||
    - GLU_TESS_WINDING_RULE.  Possible values:
 | 
			
		||||
 | 
			
		||||
	  GLU_TESS_WINDING_ODD
 | 
			
		||||
	  GLU_TESS_WINDING_NONZERO
 | 
			
		||||
	  GLU_TESS_WINDING_POSITIVE
 | 
			
		||||
	  GLU_TESS_WINDING_NEGATIVE
 | 
			
		||||
	  GLU_TESS_WINDING_ABS_GEQ_TWO
 | 
			
		||||
 | 
			
		||||
      The input contours parition the plane into regions.  A winding
 | 
			
		||||
      rule determines which of these regions are inside the polygon.
 | 
			
		||||
      
 | 
			
		||||
      For a single contour C, the winding number of a point x is simply
 | 
			
		||||
      the signed number of revolutions we make around x as we travel
 | 
			
		||||
      once around C (where CCW is positive).  When there are several
 | 
			
		||||
      contours, the individual winding numbers are summed.  This
 | 
			
		||||
      procedure associates a signed integer value with each point x in
 | 
			
		||||
      the plane.  Note that the winding number is the same for all
 | 
			
		||||
      points in a single region.
 | 
			
		||||
 | 
			
		||||
      The winding rule classifies a region as "inside" if its winding
 | 
			
		||||
      number belongs to the chosen category (odd, nonzero, positive,
 | 
			
		||||
      negative, or absolute value of at least two).  The current GLU
 | 
			
		||||
      tesselator implements the "odd" rule.  The "nonzero" rule is another
 | 
			
		||||
      common way to define the interior.  The other three rules are
 | 
			
		||||
      useful for polygon CSG operations (see below).
 | 
			
		||||
 | 
			
		||||
    - GLU_TESS_BOUNDARY_ONLY.  Values: TRUE (non-zero) or FALSE (zero).
 | 
			
		||||
 | 
			
		||||
      If TRUE, returns a set of closed contours which separate the
 | 
			
		||||
      polygon interior and exterior (rather than a tesselation).
 | 
			
		||||
      Exterior contours are oriented CCW with respect to the normal,
 | 
			
		||||
      interior contours are oriented CW.  The GLU_TESS_BEGIN callback
 | 
			
		||||
      uses the type GL_LINE_LOOP for each contour.
 | 
			
		||||
      
 | 
			
		||||
    - GLU_TESS_TOLERANCE.  Value: a real number between 0.0 and 1.0.
 | 
			
		||||
 | 
			
		||||
      This specifies a tolerance for merging features to reduce the size
 | 
			
		||||
      of the output.  For example, two vertices which are very close to
 | 
			
		||||
      each other might be replaced by a single vertex.  The tolerance
 | 
			
		||||
      is multiplied by the largest coordinate magnitude of any input vertex;
 | 
			
		||||
      this specifies the maximum distance that any feature can move as the
 | 
			
		||||
      result of a single merge operation.  If a single feature takes part
 | 
			
		||||
      in several merge operations, the total distance moved could be larger.
 | 
			
		||||
 | 
			
		||||
      Feature merging is completely optional; the tolerance is only a hint.
 | 
			
		||||
      The implementation is free to merge in some cases and not in others,
 | 
			
		||||
      or to never merge features at all.  The default tolerance is zero.
 | 
			
		||||
      
 | 
			
		||||
      The current implementation merges vertices only if they are exactly
 | 
			
		||||
      coincident, regardless of the current tolerance.  A vertex is
 | 
			
		||||
      spliced into an edge only if the implementation is unable to
 | 
			
		||||
      distinguish which side of the edge the vertex lies on.
 | 
			
		||||
      Two edges are merged only when both endpoints are identical.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   void gluTessNormal( GLUtesselator *tess,
 | 
			
		||||
		      GLUcoord x, GLUcoord y, GLUcoord z )
 | 
			
		||||
 | 
			
		||||
    - Lets the user supply the polygon normal, if known.  All input data
 | 
			
		||||
      is projected into a plane perpendicular to the normal before
 | 
			
		||||
      tesselation.  All output triangles are oriented CCW with
 | 
			
		||||
      respect to the normal (CW orientation can be obtained by
 | 
			
		||||
      reversing the sign of the supplied normal).  For example, if
 | 
			
		||||
      you know that all polygons lie in the x-y plane, call
 | 
			
		||||
      "gluTessNormal(tess, 0.0, 0.0, 1.0)" before rendering any polygons.
 | 
			
		||||
      
 | 
			
		||||
    - If the supplied normal is (0,0,0) (the default value), the
 | 
			
		||||
      normal is determined as follows.  The direction of the normal,
 | 
			
		||||
      up to its sign, is found by fitting a plane to the vertices,
 | 
			
		||||
      without regard to how the vertices are connected.  It is
 | 
			
		||||
      expected that the input data lies approximately in plane;
 | 
			
		||||
      otherwise projection perpendicular to the computed normal may
 | 
			
		||||
      substantially change the geometry.  The sign of the normal is
 | 
			
		||||
      chosen so that the sum of the signed areas of all input contours
 | 
			
		||||
      is non-negative (where a CCW contour has positive area).
 | 
			
		||||
    
 | 
			
		||||
    - The supplied normal persists until it is changed by another
 | 
			
		||||
      call to gluTessNormal.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  Backward compatibility with the GLU tesselator
 | 
			
		||||
  ----------------------------------------------
 | 
			
		||||
 | 
			
		||||
  The preferred interface is the one described above.  The following
 | 
			
		||||
  routines are obsolete, and are provided only for backward compatibility:
 | 
			
		||||
 | 
			
		||||
    typedef GLUtesselator GLUtriangulatorObj;	/* obsolete name */
 | 
			
		||||
 | 
			
		||||
    void gluBeginPolygon( GLUtesselator *tess );
 | 
			
		||||
    void gluNextContour( GLUtesselator *tess, GLenum type );
 | 
			
		||||
    void gluEndPolygon( GLUtesselator *tess );
 | 
			
		||||
  
 | 
			
		||||
  "type" is one of GLU_EXTERIOR, GLU_INTERIOR, GLU_CCW, GLU_CW, or
 | 
			
		||||
  GLU_UNKNOWN.  It is ignored by the current GLU tesselator.
 | 
			
		||||
  
 | 
			
		||||
  GLU_BEGIN, GLU_VERTEX, GLU_END, GLU_ERROR, and GLU_EDGE_FLAG are defined
 | 
			
		||||
  as synonyms for GLU_TESS_BEGIN, GLU_TESS_VERTEX, GLU_TESS_END,
 | 
			
		||||
  GLU_TESS_ERROR, and GLU_TESS_EDGE_FLAG.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Polygon CSG operations
 | 
			
		||||
----------------------
 | 
			
		||||
 | 
			
		||||
  The features of the tesselator make it easy to find the union, difference,
 | 
			
		||||
  or intersection of several polygons.
 | 
			
		||||
 | 
			
		||||
  First, assume that each polygon is defined so that the winding number
 | 
			
		||||
  is 0 for each exterior region, and 1 for each interior region.  Under
 | 
			
		||||
  this model, CCW contours define the outer boundary of the polygon, and
 | 
			
		||||
  CW contours define holes.  Contours may be nested, but a nested
 | 
			
		||||
  contour must be oriented oppositely from the contour that contains it.
 | 
			
		||||
 | 
			
		||||
  If the original polygons do not satisfy this description, they can be
 | 
			
		||||
  converted to this form by first running the tesselator with the
 | 
			
		||||
  GLU_TESS_BOUNDARY_ONLY property turned on.  This returns a list of
 | 
			
		||||
  contours satisfying the restriction above.  By allocating two
 | 
			
		||||
  tesselator objects, the callbacks from one tesselator can be fed
 | 
			
		||||
  directly to the input of another.
 | 
			
		||||
 | 
			
		||||
  Given two or more polygons of the form above, CSG operations can be
 | 
			
		||||
  implemented as follows:
 | 
			
		||||
 | 
			
		||||
  Union
 | 
			
		||||
     Draw all the input contours as a single polygon.  The winding number
 | 
			
		||||
     of each resulting region is the number of original polygons
 | 
			
		||||
     which cover it.  The union can be extracted using the
 | 
			
		||||
     GLU_TESS_WINDING_NONZERO or GLU_TESS_WINDING_POSITIVE winding rules.
 | 
			
		||||
     Note that with the nonzero rule, we would get the same result if
 | 
			
		||||
     all contour orientations were reversed.
 | 
			
		||||
 | 
			
		||||
  Intersection (two polygons at a time only)
 | 
			
		||||
     Draw a single polygon using the contours from both input polygons.
 | 
			
		||||
     Extract the result using GLU_TESS_WINDING_ABS_GEQ_TWO.  (Since this
 | 
			
		||||
     winding rule looks at the absolute value, reversing all contour
 | 
			
		||||
     orientations does not change the result.)
 | 
			
		||||
 | 
			
		||||
  Difference
 | 
			
		||||
  
 | 
			
		||||
     Suppose we want to compute A \ (B union C union D).  Draw a single
 | 
			
		||||
     polygon consisting of the unmodified contours from A, followed by
 | 
			
		||||
     the contours of B,C,D with the vertex order reversed (this changes
 | 
			
		||||
     the winding number of the interior regions to -1).  To extract the
 | 
			
		||||
     result, use the GLU_TESS_WINDING_POSITIVE rule.
 | 
			
		||||
   
 | 
			
		||||
     If B,C,D are the result of a GLU_TESS_BOUNDARY_ONLY call, an
 | 
			
		||||
     alternative to reversing the vertex order is to reverse the sign of
 | 
			
		||||
     the supplied normal.  For example in the x-y plane, call
 | 
			
		||||
     gluTessNormal( tess, 0.0, 0.0, -1.0 ).
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
Performance
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
  The tesselator is not intended for immediate-mode rendering; when
 | 
			
		||||
  possible the output should be cached in a user structure or display
 | 
			
		||||
  list.  General polygon tesselation is an inherently difficult problem,
 | 
			
		||||
  especially given the goal of extreme robustness.
 | 
			
		||||
 | 
			
		||||
  The implementation makes an effort to output a small number of fans
 | 
			
		||||
  and strips; this should improve the rendering performance when the
 | 
			
		||||
  output is used in a display list.
 | 
			
		||||
 | 
			
		||||
  Single-contour input polygons are first tested to see whether they can
 | 
			
		||||
  be rendered as a triangle fan with respect to the first vertex (to
 | 
			
		||||
  avoid running the full decomposition algorithm on convex polygons).
 | 
			
		||||
  Non-convex polygons may be rendered by this "fast path" as well, if
 | 
			
		||||
  the algorithm gets lucky in its choice of a starting vertex.
 | 
			
		||||
 | 
			
		||||
  For best performance follow these guidelines:
 | 
			
		||||
 | 
			
		||||
   - supply the polygon normal, if available, using gluTessNormal().
 | 
			
		||||
     This represents about 10% of the computation time.  For example,
 | 
			
		||||
     if all polygons lie in the x-y plane, use gluTessNormal(tess,0,0,1).
 | 
			
		||||
 | 
			
		||||
   - render many polygons using the same tesselator object, rather than
 | 
			
		||||
     allocating a new tesselator for each one.  (In a multi-threaded,
 | 
			
		||||
     multi-processor environment you may get better performance using
 | 
			
		||||
     several tesselators.)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Comparison with the GLU tesselator
 | 
			
		||||
----------------------------------
 | 
			
		||||
 | 
			
		||||
  On polygons which make it through the "fast path", the tesselator is
 | 
			
		||||
  3 to 5 times faster than the GLU tesselator.
 | 
			
		||||
 | 
			
		||||
  On polygons which don't make it through the fast path (but which don't
 | 
			
		||||
  have self-intersections or degeneracies), it is about 2 times slower.
 | 
			
		||||
 | 
			
		||||
  On polygons with self-intersections or degeneraces, there is nothing
 | 
			
		||||
  to compare against.
 | 
			
		||||
 | 
			
		||||
  The new tesselator generates many more fans and strips, reducing the
 | 
			
		||||
  number of vertices that need to be sent to the hardware.
 | 
			
		||||
 | 
			
		||||
  Key to the statistics:
 | 
			
		||||
 | 
			
		||||
	vert		number of input vertices on all contours
 | 
			
		||||
	cntr		number of input contours
 | 
			
		||||
	tri		number of triangles in all output primitives
 | 
			
		||||
	strip		number of triangle strips
 | 
			
		||||
	fan		number of triangle fans
 | 
			
		||||
	ind		number of independent triangles
 | 
			
		||||
	ms		number of milliseconds for tesselation
 | 
			
		||||
			(on a 150MHz R4400 Indy)
 | 
			
		||||
 | 
			
		||||
  Convex polygon examples:
 | 
			
		||||
 | 
			
		||||
New:     3 vert,   1 cntr,     1 tri,   0 strip,   0 fan,     1 ind,  0.0459 ms
 | 
			
		||||
Old:     3 vert,   1 cntr,     1 tri,   0 strip,   0 fan,     1 ind,   0.149 ms
 | 
			
		||||
New:     4 vert,   1 cntr,     2 tri,   0 strip,   1 fan,     0 ind,  0.0459 ms
 | 
			
		||||
Old:     4 vert,   1 cntr,     2 tri,   0 strip,   0 fan,     2 ind,   0.161 ms
 | 
			
		||||
New:    36 vert,   1 cntr,    34 tri,   0 strip,   1 fan,     0 ind,   0.153 ms
 | 
			
		||||
Old:    36 vert,   1 cntr,    34 tri,   0 strip,   0 fan,    34 ind,   0.621 ms
 | 
			
		||||
 | 
			
		||||
  Concave single-contour polygons:
 | 
			
		||||
 | 
			
		||||
New:     5 vert,   1 cntr,     3 tri,   0 strip,   1 fan,     0 ind,   0.052 ms
 | 
			
		||||
Old:     5 vert,   1 cntr,     3 tri,   0 strip,   0 fan,     3 ind,   0.252 ms
 | 
			
		||||
New:    19 vert,   1 cntr,    17 tri,   2 strip,   2 fan,     1 ind,   0.911 ms
 | 
			
		||||
Old:    19 vert,   1 cntr,    17 tri,   0 strip,   0 fan,    17 ind,   0.529 ms
 | 
			
		||||
New:   151 vert,   1 cntr,   149 tri,  13 strip,  18 fan,     3 ind,    6.82 ms
 | 
			
		||||
Old:   151 vert,   1 cntr,   149 tri,   0 strip,   3 fan,   143 ind,     2.7 ms
 | 
			
		||||
New:   574 vert,   1 cntr,   572 tri,  59 strip,  54 fan,    11 ind,    26.6 ms
 | 
			
		||||
Old:   574 vert,   1 cntr,   572 tri,   0 strip,  31 fan,   499 ind,    12.4 ms
 | 
			
		||||
 | 
			
		||||
  Multiple contours, but no intersections:
 | 
			
		||||
 | 
			
		||||
New:     7 vert,   2 cntr,     7 tri,   1 strip,   0 fan,     0 ind,   0.527 ms
 | 
			
		||||
Old:     7 vert,   2 cntr,     7 tri,   0 strip,   0 fan,     7 ind,   0.274 ms
 | 
			
		||||
New:    81 vert,   6 cntr,    89 tri,   9 strip,   7 fan,     6 ind,    3.88 ms
 | 
			
		||||
Old:    81 vert,   6 cntr,    89 tri,   0 strip,  13 fan,    61 ind,     2.2 ms
 | 
			
		||||
New:   391 vert,  19 cntr,   413 tri,  37 strip,  32 fan,    26 ind,    20.2 ms
 | 
			
		||||
Old:   391 vert,  19 cntr,   413 tri,   0 strip,  25 fan,   363 ind,    8.68 ms
 | 
			
		||||
 | 
			
		||||
  Self-intersecting and degenerate examples:
 | 
			
		||||
 | 
			
		||||
Bowtie:  4 vert,   1 cntr,     2 tri,   0 strip,   0 fan,     2 ind,   0.483 ms
 | 
			
		||||
Star:    5 vert,   1 cntr,     5 tri,   0 strip,   0 fan,     5 ind,    0.91 ms
 | 
			
		||||
Random: 24 vert,   7 cntr,    46 tri,   2 strip,  12 fan,     7 ind,    5.32 ms
 | 
			
		||||
Font:  333 vert,   2 cntr,   331 tri,  32 strip,  16 fan,     3 ind,    14.1 ms
 | 
			
		||||
:      167 vert,  35 cntr,   254 tri,   8 strip,  56 fan,    52 ind,    46.3 ms
 | 
			
		||||
:       78 vert,   1 cntr,  2675 tri, 148 strip, 207 fan,   180 ind,     243 ms
 | 
			
		||||
:    12480 vert,   2 cntr, 12478 tri, 736 strip,1275 fan,     5 ind,    1010 ms
 | 
			
		||||
@@ -1,100 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
 | 
			
		||||
 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 * copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice including the dates of first publication and
 | 
			
		||||
 * either this permission notice or a reference to
 | 
			
		||||
 * http://oss.sgi.com/projects/FreeB/
 | 
			
		||||
 * shall be included in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 | 
			
		||||
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
 | 
			
		||||
 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
 * SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Except as contained in this notice, the name of Silicon Graphics, Inc.
 | 
			
		||||
 * shall not be used in advertising or otherwise to promote the sale, use or
 | 
			
		||||
 * other dealings in this Software without prior written authorization from
 | 
			
		||||
 * Silicon Graphics, Inc.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
** Author: Eric Veach, July 1994.
 | 
			
		||||
**
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef __dict_list_h_
 | 
			
		||||
#define __dict_list_h_
 | 
			
		||||
 | 
			
		||||
/* Use #define's so that another heap implementation can use this one */
 | 
			
		||||
 | 
			
		||||
#define DictKey		DictListKey
 | 
			
		||||
#define Dict		DictList
 | 
			
		||||
#define DictNode	DictListNode
 | 
			
		||||
 | 
			
		||||
#define dictNewDict(frame,leq)		__gl_dictListNewDict(frame,leq)
 | 
			
		||||
#define dictDeleteDict(dict)		__gl_dictListDeleteDict(dict)
 | 
			
		||||
 | 
			
		||||
#define dictSearch(dict,key)		__gl_dictListSearch(dict,key)
 | 
			
		||||
#define dictInsert(dict,key)		__gl_dictListInsert(dict,key)
 | 
			
		||||
#define dictInsertBefore(dict,node,key)	__gl_dictListInsertBefore(dict,node,key)
 | 
			
		||||
#define dictDelete(dict,node)		__gl_dictListDelete(dict,node)
 | 
			
		||||
 | 
			
		||||
#define dictKey(n)			__gl_dictListKey(n)
 | 
			
		||||
#define dictSucc(n)			__gl_dictListSucc(n)
 | 
			
		||||
#define dictPred(n)			__gl_dictListPred(n)
 | 
			
		||||
#define dictMin(d)			__gl_dictListMin(d)
 | 
			
		||||
#define dictMax(d)			__gl_dictListMax(d)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef void *DictKey;
 | 
			
		||||
typedef struct Dict Dict;
 | 
			
		||||
typedef struct DictNode DictNode;
 | 
			
		||||
 | 
			
		||||
Dict		*dictNewDict(
 | 
			
		||||
			void *frame,
 | 
			
		||||
			int (*leq)(void *frame, DictKey key1, DictKey key2) );
 | 
			
		||||
			
 | 
			
		||||
void		dictDeleteDict( Dict *dict );
 | 
			
		||||
 | 
			
		||||
/* Search returns the node with the smallest key greater than or equal
 | 
			
		||||
 * to the given key.  If there is no such key, returns a node whose
 | 
			
		||||
 * key is NULL.  Similarly, Succ(Max(d)) has a NULL key, etc.
 | 
			
		||||
 */
 | 
			
		||||
DictNode	*dictSearch( Dict *dict, DictKey key );
 | 
			
		||||
DictNode	*dictInsertBefore( Dict *dict, DictNode *node, DictKey key );
 | 
			
		||||
void		dictDelete( Dict *dict, DictNode *node );
 | 
			
		||||
 | 
			
		||||
#define		__gl_dictListKey(n)	((n)->key)
 | 
			
		||||
#define		__gl_dictListSucc(n)	((n)->next)
 | 
			
		||||
#define		__gl_dictListPred(n)	((n)->prev)
 | 
			
		||||
#define		__gl_dictListMin(d)	((d)->head.next)
 | 
			
		||||
#define		__gl_dictListMax(d)	((d)->head.prev)
 | 
			
		||||
#define	       __gl_dictListInsert(d,k) (dictInsertBefore((d),&(d)->head,(k)))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*** Private data structures ***/
 | 
			
		||||
 | 
			
		||||
struct DictNode {
 | 
			
		||||
  DictKey	key;
 | 
			
		||||
  DictNode	*next;
 | 
			
		||||
  DictNode	*prev;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct Dict {
 | 
			
		||||
  DictNode	head;
 | 
			
		||||
  void		*frame;
 | 
			
		||||
  int		(*leq)(void *frame, DictKey key1, DictKey key2);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,111 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
 | 
			
		||||
 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 * copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice including the dates of first publication and
 | 
			
		||||
 * either this permission notice or a reference to
 | 
			
		||||
 * http://oss.sgi.com/projects/FreeB/
 | 
			
		||||
 * shall be included in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 | 
			
		||||
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
 | 
			
		||||
 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
 * SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Except as contained in this notice, the name of Silicon Graphics, Inc.
 | 
			
		||||
 * shall not be used in advertising or otherwise to promote the sale, use or
 | 
			
		||||
 * other dealings in this Software without prior written authorization from
 | 
			
		||||
 * Silicon Graphics, Inc.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
** Author: Eric Veach, July 1994.
 | 
			
		||||
**
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include "dict-list.h"
 | 
			
		||||
#include "memalloc.h"
 | 
			
		||||
 | 
			
		||||
/* really __gl_dictListNewDict */
 | 
			
		||||
Dict *dictNewDict( void *frame,
 | 
			
		||||
		   int (*leq)(void *frame, DictKey key1, DictKey key2) )
 | 
			
		||||
{
 | 
			
		||||
  Dict *dict = (Dict *) memAlloc( sizeof( Dict ));
 | 
			
		||||
  DictNode *head;
 | 
			
		||||
 | 
			
		||||
  if (dict == NULL) return NULL;
 | 
			
		||||
 | 
			
		||||
  head = &dict->head;
 | 
			
		||||
 | 
			
		||||
  head->key = NULL;
 | 
			
		||||
  head->next = head;
 | 
			
		||||
  head->prev = head;
 | 
			
		||||
 | 
			
		||||
  dict->frame = frame;
 | 
			
		||||
  dict->leq = leq;
 | 
			
		||||
 | 
			
		||||
  return dict;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* really __gl_dictListDeleteDict */
 | 
			
		||||
void dictDeleteDict( Dict *dict )
 | 
			
		||||
{
 | 
			
		||||
  DictNode *node, *next;
 | 
			
		||||
 | 
			
		||||
  for( node = dict->head.next; node != &dict->head; node = next ) {
 | 
			
		||||
    next = node->next;
 | 
			
		||||
    memFree( node );
 | 
			
		||||
  }
 | 
			
		||||
  memFree( dict );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* really __gl_dictListInsertBefore */
 | 
			
		||||
DictNode *dictInsertBefore( Dict *dict, DictNode *node, DictKey key )
 | 
			
		||||
{
 | 
			
		||||
  DictNode *newNode;
 | 
			
		||||
 | 
			
		||||
  do {
 | 
			
		||||
    node = node->prev;
 | 
			
		||||
  } while( node->key != NULL && ! (*dict->leq)(dict->frame, node->key, key));
 | 
			
		||||
 | 
			
		||||
  newNode = (DictNode *) memAlloc( sizeof( DictNode ));
 | 
			
		||||
  if (newNode == NULL) return NULL;
 | 
			
		||||
 | 
			
		||||
  newNode->key = key;
 | 
			
		||||
  newNode->next = node->next;
 | 
			
		||||
  node->next->prev = newNode;
 | 
			
		||||
  newNode->prev = node;
 | 
			
		||||
  node->next = newNode;
 | 
			
		||||
 | 
			
		||||
  return newNode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* really __gl_dictListDelete */
 | 
			
		||||
void dictDelete( Dict *dict, DictNode *node ) /*ARGSUSED*/
 | 
			
		||||
{
 | 
			
		||||
  node->next->prev = node->prev;
 | 
			
		||||
  node->prev->next = node->next;
 | 
			
		||||
  memFree( node );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* really __gl_dictListSearch */
 | 
			
		||||
DictNode *dictSearch( Dict *dict, DictKey key )
 | 
			
		||||
{
 | 
			
		||||
  DictNode *node = &dict->head;
 | 
			
		||||
 | 
			
		||||
  do {
 | 
			
		||||
    node = node->next;
 | 
			
		||||
  } while( node->key != NULL && ! (*dict->leq)(dict->frame, key, node->key));
 | 
			
		||||
 | 
			
		||||
  return node;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,100 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
 | 
			
		||||
 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 * copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice including the dates of first publication and
 | 
			
		||||
 * either this permission notice or a reference to
 | 
			
		||||
 * http://oss.sgi.com/projects/FreeB/
 | 
			
		||||
 * shall be included in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 | 
			
		||||
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
 | 
			
		||||
 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
 * SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Except as contained in this notice, the name of Silicon Graphics, Inc.
 | 
			
		||||
 * shall not be used in advertising or otherwise to promote the sale, use or
 | 
			
		||||
 * other dealings in this Software without prior written authorization from
 | 
			
		||||
 * Silicon Graphics, Inc.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
** Author: Eric Veach, July 1994.
 | 
			
		||||
**
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef __dict_list_h_
 | 
			
		||||
#define __dict_list_h_
 | 
			
		||||
 | 
			
		||||
/* Use #define's so that another heap implementation can use this one */
 | 
			
		||||
 | 
			
		||||
#define DictKey		DictListKey
 | 
			
		||||
#define Dict		DictList
 | 
			
		||||
#define DictNode	DictListNode
 | 
			
		||||
 | 
			
		||||
#define dictNewDict(frame,leq)		__gl_dictListNewDict(frame,leq)
 | 
			
		||||
#define dictDeleteDict(dict)		__gl_dictListDeleteDict(dict)
 | 
			
		||||
 | 
			
		||||
#define dictSearch(dict,key)		__gl_dictListSearch(dict,key)
 | 
			
		||||
#define dictInsert(dict,key)		__gl_dictListInsert(dict,key)
 | 
			
		||||
#define dictInsertBefore(dict,node,key)	__gl_dictListInsertBefore(dict,node,key)
 | 
			
		||||
#define dictDelete(dict,node)		__gl_dictListDelete(dict,node)
 | 
			
		||||
 | 
			
		||||
#define dictKey(n)			__gl_dictListKey(n)
 | 
			
		||||
#define dictSucc(n)			__gl_dictListSucc(n)
 | 
			
		||||
#define dictPred(n)			__gl_dictListPred(n)
 | 
			
		||||
#define dictMin(d)			__gl_dictListMin(d)
 | 
			
		||||
#define dictMax(d)			__gl_dictListMax(d)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef void *DictKey;
 | 
			
		||||
typedef struct Dict Dict;
 | 
			
		||||
typedef struct DictNode DictNode;
 | 
			
		||||
 | 
			
		||||
Dict		*dictNewDict(
 | 
			
		||||
			void *frame,
 | 
			
		||||
			int (*leq)(void *frame, DictKey key1, DictKey key2) );
 | 
			
		||||
			
 | 
			
		||||
void		dictDeleteDict( Dict *dict );
 | 
			
		||||
 | 
			
		||||
/* Search returns the node with the smallest key greater than or equal
 | 
			
		||||
 * to the given key.  If there is no such key, returns a node whose
 | 
			
		||||
 * key is NULL.  Similarly, Succ(Max(d)) has a NULL key, etc.
 | 
			
		||||
 */
 | 
			
		||||
DictNode	*dictSearch( Dict *dict, DictKey key );
 | 
			
		||||
DictNode	*dictInsertBefore( Dict *dict, DictNode *node, DictKey key );
 | 
			
		||||
void		dictDelete( Dict *dict, DictNode *node );
 | 
			
		||||
 | 
			
		||||
#define		__gl_dictListKey(n)	((n)->key)
 | 
			
		||||
#define		__gl_dictListSucc(n)	((n)->next)
 | 
			
		||||
#define		__gl_dictListPred(n)	((n)->prev)
 | 
			
		||||
#define		__gl_dictListMin(d)	((d)->head.next)
 | 
			
		||||
#define		__gl_dictListMax(d)	((d)->head.prev)
 | 
			
		||||
#define	       __gl_dictListInsert(d,k) (dictInsertBefore((d),&(d)->head,(k)))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*** Private data structures ***/
 | 
			
		||||
 | 
			
		||||
struct DictNode {
 | 
			
		||||
  DictKey	key;
 | 
			
		||||
  DictNode	*next;
 | 
			
		||||
  DictNode	*prev;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct Dict {
 | 
			
		||||
  DictNode	head;
 | 
			
		||||
  void		*frame;
 | 
			
		||||
  int		(*leq)(void *frame, DictKey key1, DictKey key2);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,264 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
 | 
			
		||||
 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 * copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice including the dates of first publication and
 | 
			
		||||
 * either this permission notice or a reference to
 | 
			
		||||
 * http://oss.sgi.com/projects/FreeB/
 | 
			
		||||
 * shall be included in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
			
		||||
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 | 
			
		||||
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
 | 
			
		||||
 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
 * SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Except as contained in this notice, the name of Silicon Graphics, Inc.
 | 
			
		||||
 * shall not be used in advertising or otherwise to promote the sale, use or
 | 
			
		||||
 * other dealings in this Software without prior written authorization from
 | 
			
		||||
 * Silicon Graphics, Inc.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
** Author: Eric Veach, July 1994.
 | 
			
		||||
**
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "gluos.h"
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include "mesh.h"
 | 
			
		||||
#include "geom.h"
 | 
			
		||||
 | 
			
		||||
int __gl_vertLeq( GLUvertex *u, GLUvertex *v )
 | 
			
		||||
{
 | 
			
		||||
  /* Returns TRUE if u is lexicographically <= v. */
 | 
			
		||||
 | 
			
		||||
  return VertLeq( u, v );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GLdouble __gl_edgeEval( GLUvertex *u, GLUvertex *v, GLUvertex *w )
 | 
			
		||||
{
 | 
			
		||||
  /* Given three vertices u,v,w such that VertLeq(u,v) && VertLeq(v,w),
 | 
			
		||||
   * evaluates the t-coord of the edge uw at the s-coord of the vertex v.
 | 
			
		||||
   * Returns v->t - (uw)(v->s), ie. the signed distance from uw to v.
 | 
			
		||||
   * If uw is vertical (and thus passes thru v), the result is zero.
 | 
			
		||||
   *
 | 
			
		||||
   * The calculation is extremely accurate and stable, even when v
 | 
			
		||||
   * is very close to u or w.  In particular if we set v->t = 0 and
 | 
			
		||||
   * let r be the negated result (this evaluates (uw)(v->s)), then
 | 
			
		||||
   * r is guaranteed to satisfy MIN(u->t,w->t) <= r <= MAX(u->t,w->t).
 | 
			
		||||
   */
 | 
			
		||||
  GLdouble gapL, gapR;
 | 
			
		||||
 | 
			
		||||
  assert( VertLeq( u, v ) && VertLeq( v, w ));
 | 
			
		||||
  
 | 
			
		||||
  gapL = v->s - u->s;
 | 
			
		||||
  gapR = w->s - v->s;
 | 
			
		||||
 | 
			
		||||
  if( gapL + gapR > 0 ) {
 | 
			
		||||
    if( gapL < gapR ) {
 | 
			
		||||
      return (v->t - u->t) + (u->t - w->t) * (gapL / (gapL + gapR));
 | 
			
		||||
    } else {
 | 
			
		||||
      return (v->t - w->t) + (w->t - u->t) * (gapR / (gapL + gapR));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  /* vertical line */
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GLdouble __gl_edgeSign( GLUvertex *u, GLUvertex *v, GLUvertex *w )
 | 
			
		||||
{
 | 
			
		||||
  /* Returns a number whose sign matches EdgeEval(u,v,w) but which
 | 
			
		||||
   * is cheaper to evaluate.  Returns > 0, == 0 , or < 0
 | 
			
		||||
   * as v is above, on, or below the edge uw.
 | 
			
		||||
   */
 | 
			
		||||
  GLdouble gapL, gapR;
 | 
			
		||||
 | 
			
		||||
  assert( VertLeq( u, v ) && VertLeq( v, w ));
 | 
			
		||||
  
 | 
			
		||||
  gapL = v->s - u->s;
 | 
			
		||||
  gapR = w->s - v->s;
 | 
			
		||||
 | 
			
		||||
  if( gapL + gapR > 0 ) {
 | 
			
		||||
    return (v->t - w->t) * gapL + (v->t - u->t) * gapR;
 | 
			
		||||
  }
 | 
			
		||||
  /* vertical line */
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***********************************************************************
 | 
			
		||||
 * Define versions of EdgeSign, EdgeEval with s and t transposed.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
GLdouble __gl_transEval( GLUvertex *u, GLUvertex *v, GLUvertex *w )
 | 
			
		||||
{
 | 
			
		||||
  /* Given three vertices u,v,w such that TransLeq(u,v) && TransLeq(v,w),
 | 
			
		||||
   * evaluates the t-coord of the edge uw at the s-coord of the vertex v.
 | 
			
		||||
   * Returns v->s - (uw)(v->t), ie. the signed distance from uw to v.
 | 
			
		||||
   * If uw is vertical (and thus passes thru v), the result is zero.
 | 
			
		||||
   *
 | 
			
		||||
   * The calculation is extremely accurate and stable, even when v
 | 
			
		||||
   * is very close to u or w.  In particular if we set v->s = 0 and
 | 
			
		||||
   * let r be the negated result (this evaluates (uw)(v->t)), then
 | 
			
		||||
   * r is guaranteed to satisfy MIN(u->s,w->s) <= r <= MAX(u->s,w->s).
 | 
			
		||||
   */
 | 
			
		||||
  GLdouble gapL, gapR;
 | 
			
		||||
 | 
			
		||||
  assert( TransLeq( u, v ) && TransLeq( v, w ));
 | 
			
		||||
  
 | 
			
		||||
  gapL = v->t - u->t;
 | 
			
		||||
  gapR = w->t - v->t;
 | 
			
		||||
 | 
			
		||||
  if( gapL + gapR > 0 ) {
 | 
			
		||||
    if( gapL < gapR ) {
 | 
			
		||||
      return (v->s - u->s) + (u->s - w->s) * (gapL / (gapL + gapR));
 | 
			
		||||
    } else {
 | 
			
		||||
      return (v->s - w->s) + (w->s - u->s) * (gapR / (gapL + gapR));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  /* vertical line */
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GLdouble __gl_transSign( GLUvertex *u, GLUvertex *v, GLUvertex *w )
 | 
			
		||||
{
 | 
			
		||||
  /* Returns a number whose sign matches TransEval(u,v,w) but which
 | 
			
		||||
   * is cheaper to evaluate.  Returns > 0, == 0 , or < 0
 | 
			
		||||
   * as v is above, on, or below the edge uw.
 | 
			
		||||
   */
 | 
			
		||||
  GLdouble gapL, gapR;
 | 
			
		||||
 | 
			
		||||
  assert( TransLeq( u, v ) && TransLeq( v, w ));
 | 
			
		||||
  
 | 
			
		||||
  gapL = v->t - u->t;
 | 
			
		||||
  gapR = w->t - v->t;
 | 
			
		||||
 | 
			
		||||
  if( gapL + gapR > 0 ) {
 | 
			
		||||
    return (v->s - w->s) * gapL + (v->s - u->s) * gapR;
 | 
			
		||||
  }
 | 
			
		||||
  /* vertical line */
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int __gl_vertCCW( GLUvertex *u, GLUvertex *v, GLUvertex *w )
 | 
			
		||||
{
 | 
			
		||||
  /* For almost-degenerate situations, the results are not reliable.
 | 
			
		||||
   * Unless the floating-point arithmetic can be performed without
 | 
			
		||||
   * rounding errors, *any* implementation will give incorrect results
 | 
			
		||||
   * on some degenerate inputs, so the client must have some way to
 | 
			
		||||
   * handle this situation.
 | 
			
		||||
   */
 | 
			
		||||
  return (u->s*(v->t - w->t) + v->s*(w->t - u->t) + w->s*(u->t - v->t)) >= 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Given parameters a,x,b,y returns the value (b*x+a*y)/(a+b),
 | 
			
		||||
 * or (x+y)/2 if a==b==0.  It requires that a,b >= 0, and enforces
 | 
			
		||||
 * this in the rare case that one argument is slightly negative.
 | 
			
		||||
 * The implementation is extremely stable numerically.
 | 
			
		||||
 * In particular it guarantees that the result r satisfies
 | 
			
		||||
 * MIN(x,y) <= r <= MAX(x,y), and the results are very accurate
 | 
			
		||||
 * even when a and b differ greatly in magnitude.
 | 
			
		||||
 */
 | 
			
		||||
#define RealInterpolate(a,x,b,y)			\
 | 
			
		||||
  (a = (a < 0) ? 0 : a, b = (b < 0) ? 0 : b,		\
 | 
			
		||||
  ((a <= b) ? ((b == 0) ? ((x+y) / 2)			\
 | 
			
		||||
                        : (x + (y-x) * (a/(a+b))))	\
 | 
			
		||||
            : (y + (x-y) * (b/(a+b)))))
 | 
			
		||||
 | 
			
		||||
#ifndef FOR_TRITE_TEST_PROGRAM
 | 
			
		||||
#define Interpolate(a,x,b,y)	RealInterpolate(a,x,b,y)
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
/* Claim: the ONLY property the sweep algorithm relies on is that
 | 
			
		||||
 * MIN(x,y) <= r <= MAX(x,y).  This is a nasty way to test that.
 | 
			
		||||
 */
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
extern int RandomInterpolate;
 | 
			
		||||
 | 
			
		||||
GLdouble Interpolate( GLdouble a, GLdouble x, GLdouble b, GLdouble y)
 | 
			
		||||
{
 | 
			
		||||
printf("*********************%d\n",RandomInterpolate);
 | 
			
		||||
  if( RandomInterpolate ) {
 | 
			
		||||
    a = 1.2 * drand48() - 0.1;
 | 
			
		||||
    a = (a < 0) ? 0 : ((a > 1) ? 1 : a);
 | 
			
		||||
    b = 1.0 - a;
 | 
			
		||||
  }
 | 
			
		||||
  return RealInterpolate(a,x,b,y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define Swap(a,b)	do { GLUvertex *t = a; a = b; b = t; } while (0)
 | 
			
		||||
 | 
			
		||||
void __gl_edgeIntersect( GLUvertex *o1, GLUvertex *d1,
 | 
			
		||||
			 GLUvertex *o2, GLUvertex *d2,
 | 
			
		||||
			 GLUvertex *v )
 | 
			
		||||
/* Given edges (o1,d1) and (o2,d2), compute their point of intersection.
 | 
			
		||||
 * The computed point is guaranteed to lie in the intersection of the
 | 
			
		||||
 * bounding rectangles defined by each edge.
 | 
			
		||||
 */
 | 
			
		||||
{
 | 
			
		||||
  GLdouble z1, z2;
 | 
			
		||||
 | 
			
		||||
  /* This is certainly not the most efficient way to find the intersection
 | 
			
		||||
   * of two line segments, but it is very numerically stable.
 | 
			
		||||
   *
 | 
			
		||||
   * Strategy: find the two middle vertices in the VertLeq ordering,
 | 
			
		||||
   * and interpolate the intersection s-value from these.  Then repeat
 | 
			
		||||
   * using the TransLeq ordering to find the intersection t-value.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  if( ! VertLeq( o1, d1 )) { Swap( o1, d1 ); }
 | 
			
		||||
  if( ! VertLeq( o2, d2 )) { Swap( o2, d2 ); }
 | 
			
		||||
  if( ! VertLeq( o1, o2 )) { Swap( o1, o2 ); Swap( d1, d2 ); }
 | 
			
		||||
 | 
			
		||||
  if( ! VertLeq( o2, d1 )) {
 | 
			
		||||
    /* Technically, no intersection -- do our best */
 | 
			
		||||
    v->s = (o2->s + d1->s) / 2;
 | 
			
		||||
  } else if( VertLeq( d1, d2 )) {
 | 
			
		||||
    /* Interpolate between o2 and d1 */
 | 
			
		||||
    z1 = EdgeEval( o1, o2, d1 );
 | 
			
		||||
    z2 = EdgeEval( o2, d1, d2 );
 | 
			
		||||
    if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; }
 | 
			
		||||
    v->s = Interpolate( z1, o2->s, z2, d1->s );
 | 
			
		||||
  } else {
 | 
			
		||||
    /* Interpolate between o2 and d2 */
 | 
			
		||||
    z1 = EdgeSign( o1, o2, d1 );
 | 
			
		||||
    z2 = -EdgeSign( o1, d2, d1 );
 | 
			
		||||
    if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; }
 | 
			
		||||
    v->s = Interpolate( z1, o2->s, z2, d2->s );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Now repeat the process for t */
 | 
			
		||||
 | 
			
		||||
  if( ! TransLeq( o1, d1 )) { Swap( o1, d1 ); }
 | 
			
		||||
  if( ! TransLeq( o2, d2 )) { Swap( o2, d2 ); }
 | 
			
		||||
  if( ! TransLeq( o1, o2 )) { Swap( o1, o2 ); Swap( d1, d2 ); }
 | 
			
		||||
 | 
			
		||||
  if( ! TransLeq( o2, d1 )) {
 | 
			
		||||
    /* Technically, no intersection -- do our best */
 | 
			
		||||
    v->t = (o2->t + d1->t) / 2;
 | 
			
		||||
  } else if( TransLeq( d1, d2 )) {
 | 
			
		||||
    /* Interpolate between o2 and d1 */
 | 
			
		||||
    z1 = TransEval( o1, o2, d1 );
 | 
			
		||||
    z2 = TransEval( o2, d1, d2 );
 | 
			
		||||
    if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; }
 | 
			
		||||
    v->t = Interpolate( z1, o2->t, z2, d1->t );
 | 
			
		||||
  } else {
 | 
			
		||||
    /* Interpolate between o2 and d2 */
 | 
			
		||||
    z1 = TransSign( o1, o2, d1 );
 | 
			
		||||
    z2 = -TransSign( o1, d2, d1 );
 | 
			
		||||
    if( z1+z2 < 0 ) { z1 = -z1; z2 = -z2; }
 | 
			
		||||
    v->t = Interpolate( z1, o2->t, z2, d2->t );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user