From 7460f0c6e2db7013deba9146b2955098d70db80b Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Mon, 11 Nov 2024 01:21:28 +0100 Subject: [PATCH] LibGfx: Delete unused DisjointRectSet --- Libraries/LibGfx/DisjointRectSet.h | 292 ------------------- Libraries/LibGfx/Forward.h | 6 - Libraries/LibWeb/Painting/ShadowPainting.cpp | 1 - 3 files changed, 299 deletions(-) delete mode 100644 Libraries/LibGfx/DisjointRectSet.h diff --git a/Libraries/LibGfx/DisjointRectSet.h b/Libraries/LibGfx/DisjointRectSet.h deleted file mode 100644 index abc18bc012a..00000000000 --- a/Libraries/LibGfx/DisjointRectSet.h +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Copyright (c) 2018-2020, Andreas Kling - * Copyright (c) 2022, Sam Atkins - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include -#include - -namespace Gfx { - -template -class DisjointRectSet { -public: - DisjointRectSet(DisjointRectSet const&) = delete; - DisjointRectSet& operator=(DisjointRectSet const&) = delete; - - DisjointRectSet() = default; - ~DisjointRectSet() = default; - - DisjointRectSet(Rect const& rect) - { - m_rects.append(rect); - } - - DisjointRectSet(DisjointRectSet&&) = default; - DisjointRectSet& operator=(DisjointRectSet&&) = default; - - DisjointRectSet clone() const - { - DisjointRectSet rects; - rects.m_rects = m_rects; - return rects; - } - - void move_by(T dx, T dy) - { - for (auto& r : m_rects) - r.translate_by(dx, dy); - } - void move_by(Point const& delta) - { - move_by(delta.x(), delta.y()); - } - - void add(Rect const& rect) - { - if (add_no_shatter(rect) && m_rects.size() > 1) - shatter(); - } - - template - void add_many(Container const& rects) - { - bool added = false; - for (auto const& rect : rects) { - if (add_no_shatter(rect)) - added = true; - } - if (added && m_rects.size() > 1) - shatter(); - } - - void add(DisjointRectSet const& rect_set) - { - if (this == &rect_set) - return; - if (m_rects.is_empty()) { - m_rects = rect_set.m_rects; - } else { - add_many(rect_set.rects()); - } - } - - DisjointRectSet shatter(Rect const& hammer) const - { - if (hammer.is_empty()) - return clone(); - - DisjointRectSet shards; - for (auto& rect : m_rects) { - for (auto& shard : rect.shatter(hammer)) - shards.add_no_shatter(shard); - } - // Since there should be no overlaps, we don't need to call shatter() - return shards; - } - DisjointRectSet shatter(DisjointRectSet const& hammer) const - { - if (this == &hammer) - return {}; - if (hammer.is_empty() || !intersects(hammer)) - return clone(); - - // TODO: This could use some optimization - DisjointRectSet shards = shatter(hammer.m_rects[0]); - auto rects_count = hammer.m_rects.size(); - for (size_t i = 1; i < rects_count && !shards.is_empty(); i++) { - if (hammer.m_rects[i].intersects(shards.m_rects)) { - auto shattered = shards.shatter(hammer.m_rects[i]); - shards = move(shattered); - } - } - // Since there should be no overlaps, we don't need to call shatter() - return shards; - } - - bool contains(Rect const& rect) const - { - if (is_empty() || rect.is_empty()) - return false; - - // TODO: This could use some optimization - DisjointRectSet remainder(rect); - for (auto& r : m_rects) { - auto shards = remainder.shatter(r); - if (shards.is_empty()) - return true; - remainder = move(shards); - } - return false; - } - - bool intersects(Rect const& rect) const - { - for (auto& r : m_rects) { - if (r.intersects(rect)) - return true; - } - return false; - } - bool intersects(DisjointRectSet const& rects) const - { - if (this == &rects) - return true; - - for (auto& r : m_rects) { - for (auto& r2 : rects.m_rects) { - if (r.intersects(r2)) - return true; - } - } - return false; - } - - DisjointRectSet intersected(Rect const& rect) const - { - DisjointRectSet intersected_rects; - intersected_rects.m_rects.ensure_capacity(m_rects.capacity()); - for (auto& r : m_rects) { - auto intersected_rect = r.intersected(rect); - if (!intersected_rect.is_empty()) - intersected_rects.m_rects.append(intersected_rect); - } - // Since there should be no overlaps, we don't need to call shatter() - return intersected_rects; - } - DisjointRectSet intersected(DisjointRectSet const& rects) const - { - if (&rects == this) - return clone(); - if (is_empty() || rects.is_empty()) - return {}; - - DisjointRectSet intersected_rects; - intersected_rects.m_rects.ensure_capacity(m_rects.capacity()); - for (auto& r : m_rects) { - for (auto& r2 : rects.m_rects) { - auto intersected_rect = r.intersected(r2); - if (!intersected_rect.is_empty()) - intersected_rects.m_rects.append(intersected_rect); - } - } - // Since there should be no overlaps, we don't need to call shatter() - return intersected_rects; - } - - template - IterationDecision for_each_intersected(Rect const& rect, Function f) const - { - if (is_empty() || rect.is_empty()) - return IterationDecision::Continue; - for (auto& r : m_rects) { - auto intersected_rect = r.intersected(rect); - if (intersected_rect.is_empty()) - continue; - IterationDecision decision = f(intersected_rect); - if (decision != IterationDecision::Continue) - return decision; - } - return IterationDecision::Continue; - } - - template - IterationDecision for_each_intersected(DisjointRectSet const& rects, Function f) const - { - if (is_empty() || rects.is_empty()) - return IterationDecision::Continue; - if (this == &rects) { - for (auto& r : m_rects) { - IterationDecision decision = f(r); - if (decision != IterationDecision::Continue) - return decision; - } - } else { - for (auto& r : m_rects) { - for (auto& r2 : rects.m_rects) { - auto intersected_rect = r.intersected(r2); - if (intersected_rect.is_empty()) - continue; - IterationDecision decision = f(intersected_rect); - if (decision != IterationDecision::Continue) - return decision; - } - } - } - return IterationDecision::Continue; - } - - bool is_empty() const { return m_rects.is_empty(); } - size_t size() const { return m_rects.size(); } - - void clear() { m_rects.clear(); } - void clear_with_capacity() { m_rects.clear_with_capacity(); } - Vector, 32> const& rects() const { return m_rects; } - Vector, 32> take_rects() { return move(m_rects); } - - void translate_by(T dx, T dy) - { - for (auto& rect : m_rects) - rect.translate_by(dx, dy); - } - void translate_by(Point const& delta) - { - for (auto& rect : m_rects) - rect.translate_by(delta); - } - -private: - bool add_no_shatter(Rect const& new_rect) - { - if (new_rect.is_empty()) - return false; - for (auto& rect : m_rects) { - if (rect.contains(new_rect)) - return false; - } - - m_rects.append(new_rect); - return true; - } - - void shatter() - { - Vector, 32> output; - output.ensure_capacity(m_rects.size()); - bool pass_had_intersections = false; - do { - pass_had_intersections = false; - output.clear_with_capacity(); - for (size_t i = 0; i < m_rects.size(); ++i) { - auto& r1 = m_rects[i]; - for (size_t j = 0; j < m_rects.size(); ++j) { - if (i == j) - continue; - auto& r2 = m_rects[j]; - if (!r1.intersects(r2)) - continue; - pass_had_intersections = true; - auto pieces = r1.shatter(r2); - for (auto& piece : pieces) - output.append(piece); - m_rects.remove(i); - for (; i < m_rects.size(); ++i) - output.append(m_rects[i]); - goto next_pass; - } - output.append(r1); - } - next_pass: - swap(output, m_rects); - } while (pass_had_intersections); - } - - Vector, 32> m_rects; -}; - -} diff --git a/Libraries/LibGfx/Forward.h b/Libraries/LibGfx/Forward.h index b9839cff4d9..06b9246a0d8 100644 --- a/Libraries/LibGfx/Forward.h +++ b/Libraries/LibGfx/Forward.h @@ -13,9 +13,6 @@ class CMYKBitmap; class ImmutableBitmap; class Color; -template -class DisjointRectSet; - class Emoji; class Font; class ImageDecoder; @@ -51,9 +48,6 @@ class Rect; template class Quad; -using DisjointIntRectSet = DisjointRectSet; -using DisjointFloatRectSet = DisjointRectSet; - using IntLine = Line; using FloatLine = Line; diff --git a/Libraries/LibWeb/Painting/ShadowPainting.cpp b/Libraries/LibWeb/Painting/ShadowPainting.cpp index 784d691cff2..12af8867e91 100644 --- a/Libraries/LibWeb/Painting/ShadowPainting.cpp +++ b/Libraries/LibWeb/Painting/ShadowPainting.cpp @@ -6,7 +6,6 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include #include #include #include