diff options
Diffstat (limited to 'src/ui/widget/canvas/stores.h')
-rw-r--r-- | src/ui/widget/canvas/stores.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/ui/widget/canvas/stores.h b/src/ui/widget/canvas/stores.h new file mode 100644 index 0000000..70b10cc --- /dev/null +++ b/src/ui/widget/canvas/stores.h @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Abstraction of the store/snapshot mechanism. + * Copyright (C) 2022 PBS <pbs3141@gmail.com> + * Released under GNU GPL v2+, read the file 'COPYING' for more information. + */ +#ifndef INKSCAPE_UI_WIDGET_CANVAS_STORES_H +#define INKSCAPE_UI_WIDGET_CANVAS_STORES_H + +#include "fragment.h" +#include "util.h" + +namespace Inkscape { +namespace UI { +namespace Widget { +struct Fragment; +class Prefs; +class Graphics; + +class Stores +{ +public: + enum class Mode + { + None, /// Not initialised or just reset; no stores exist yet. + Normal, /// Normal mode consisting of just a backing store. + Decoupled /// Decoupled mode consisting of both a backing store and a snapshot store. + }; + + enum class Action + { + None, /// The backing store was not changed. + Recreated, /// The backing store was completely recreated. + Shifted /// The backing store was shifted into a new rectangle. + }; + + struct Store : Fragment + { + /** + * The region of space containing drawn content. + * For the snapshot, this region is transformed to store space and approximated inwards. + */ + Cairo::RefPtr<Cairo::Region> drawn; + }; + + /// Construct a blank object with no stores. + Stores(Prefs const &prefs) + : _mode(Mode::None) + , _graphics(nullptr) + , _prefs(prefs) {} + + /// Set the pointer to the graphics object. + void set_graphics(Graphics *g) { _graphics = g; } + + /// Discards all stores. (The actual operation on the graphics is performed on the next update().) + void reset(); + + /// Respond to a viewport change. (Requires a valid graphics.) + Action update(Fragment const &view); + + /// Respond to drawing of the backing store having finished. (Requires a valid graphics.) + Action finished_draw(Fragment const &view); + + /// Record a rectangle as being drawn to the store. + void mark_drawn(Geom::IntRect const &rect) { _store.drawn->do_union(geom_to_cairo(rect)); } + + // Getters. + Store const &store() const { return _store; } + Store const &snapshot() const { return _snapshot; } + Mode mode() const { return _mode; } + +private: + // Internal state. + Mode _mode; + Store _store, _snapshot; + + // The graphics object that executes the operations on the stores. + Graphics *_graphics; + + // The preferences object we read preferences from. + Prefs const &_prefs; + + // Internal actions. + Geom::IntRect centered(Fragment const &view) const; + void recreate_store(Fragment const &view); + void shift_store(Fragment const &view); + void take_snapshot(Fragment const &view); + void snapshot_combine(Fragment const &view); +}; + +} // namespace Widget +} // namespace UI +} // namespace Inkscape + +#endif // INKSCAPE_UI_WIDGET_CANVAS_STORES_H + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 : |