mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-15 17:25:59 +01:00
52 lines
1.1 KiB
C++
52 lines
1.1 KiB
C++
#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();
|
|
}
|