Hyprland/src/helpers/DamageRing.cpp

53 lines
1.1 KiB
C++
Raw Normal View History

#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();
}