summaryrefslogtreecommitdiff
path: root/src/helpers/DamageRing.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-06-19 18:25:20 +0200
committerVaxry <vaxry@vaxry.net>2024-06-19 18:25:25 +0200
commitdef5fcb2128304392e9e76bcc081d088b316a197 (patch)
tree9cbaf0621bc541eec13699c433fd3bd6be0fbe24 /src/helpers/DamageRing.cpp
parent65f04f265c268d9752d6c2534c2b078d0e54a150 (diff)
damageRing: move to hyprland impl
A small wlroots utility we were still using.
Diffstat (limited to 'src/helpers/DamageRing.cpp')
-rw-r--r--src/helpers/DamageRing.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/helpers/DamageRing.cpp b/src/helpers/DamageRing.cpp
new file mode 100644
index 00000000..093e7ca6
--- /dev/null
+++ b/src/helpers/DamageRing.cpp
@@ -0,0 +1,52 @@
+#include "DamageRing.hpp"
+
+void CDamageRing::setSize(const Vector2D& size_) {
+ if (size_ == size)
+ return;
+
+ size = size_;
+
+ damageEntire();
+}
+
+bool CDamageRing::damage(const CRegion& rg) {
+ CRegion clipped = rg.copy().intersect(CBox{{}, size});
+ if (clipped.empty())
+ return false;
+
+ current.add(clipped);
+ return true;
+}
+
+void CDamageRing::damageEntire() {
+ damage(CBox{{}, size});
+}
+
+void CDamageRing::rotate() {
+ previousIdx = (previousIdx + DAMAGE_RING_PREVIOUS_LEN - 1) % DAMAGE_RING_PREVIOUS_LEN;
+
+ previous[previousIdx] = current;
+ current.clear();
+}
+
+CRegion CDamageRing::getBufferDamage(int age) {
+ if (age <= 0 || age > DAMAGE_RING_PREVIOUS_LEN + 1)
+ return CBox{{}, size};
+
+ CRegion damage = current;
+
+ for (int i = 0; i < age - 1; ++i) {
+ int j = (previousIdx + i) % DAMAGE_RING_PREVIOUS_LEN;
+ damage.add(previous.at(j));
+ }
+
+ // don't return a ludicrous amount of rects
+ if (damage.getRects().size() > 8)
+ return damage.getExtents();
+
+ return damage;
+}
+
+bool CDamageRing::hasChanged() {
+ return !current.empty();
+}