3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
14 // It seems that MacOSX define the check macro.
17 #include "Dimension.h"
19 #include <unordered_map>
26 void lyxbreaker(void const * data, const char * hint, int size);
29 Point pos = {-10000, -10000 };
32 bool covers(int x, int y) const
35 && x <= pos.x + dim.wid
36 && y >= pos.y - dim.asc
37 && y <= pos.y + dim.des;
40 int squareDistance(int x, int y) const
47 else if (x > pos.x + dim.wid)
48 xx = x - pos.x - dim.wid;
50 if (y < pos.y - dim.asc)
51 yy = pos.y - dim.asc - y;
52 else if (y > pos.y + dim.des)
53 yy = y - pos.y - dim.des;
55 // Optimisation: We avoid to compute the sqrt on purpose.
61 template <class T> class CoordCacheBase {
73 void add(T const * thing, int x, int y)
75 data_[thing].pos = Point(x, y);
78 // this returns true if a change is done
79 bool add(T const * thing, Dimension const & dim)
83 auto const result = data_.insert(std::make_pair(thing, g));
84 // did a new entry get inserted?
87 // otherwise, if the existing value is different, update it
88 else if (result.first->second.dim != dim) {
89 result.first->second.dim = dim;
95 Geometry & geometry(T const * thing)
97 checkDim(thing, "geometry");
98 return data_.find(thing)->second;
101 Geometry const & geometry(T const * thing) const
103 checkDim(thing, "geometry");
104 return data_.find(thing)->second;
107 Dimension const & dim(T const * thing) const
109 checkDim(thing, "dim");
110 return data_.find(thing)->second.dim;
113 int x(T const * thing) const
116 return data_.find(thing)->second.pos.x;
119 int y(T const * thing) const
122 return data_.find(thing)->second.pos.y;
125 Point xy(T const * thing) const
128 return data_.find(thing)->second.pos;
131 bool has(T const * thing) const
133 typename cache_type::const_iterator it = data_.find(thing);
135 if (it == data_.end())
137 return it->second.pos.x != -10000;
140 bool hasDim(T const * thing) const
142 return data_.find(thing) != data_.end();
145 bool covers(T const * thing, int x, int y) const
147 typename cache_type::const_iterator it = data_.find(thing);
148 return it != data_.end() && it->second.covers(x, y);
151 int squareDistance(T const * thing, int x, int y) const
153 typename cache_type::const_iterator it = data_.find(thing);
154 if (it == data_.end())
156 return it->second.squareDistance(x, y);
160 friend class CoordCache;
162 #ifdef ENABLE_ASSERTIONS
163 void checkDim(T const * thing, char const * hint) const
166 lyxbreaker(thing, hint, data_.size());
169 void check(T const * thing, char const * hint) const
172 lyxbreaker(thing, hint, data_.size());
175 void checkDim(T const *, char const * const ) const {}
177 void check(T const *, char const *) const {}
180 typedef std::unordered_map<T const *, Geometry> cache_type;
185 * A BufferView dependent cache that allows us to come from an inset in
186 * a document to a position point and dimension on the screen.
187 * All points cached in this cache are only valid between subsequent
188 * updates. (x,y) == (0,0) is the upper left screen corner, x increases
189 * to the right, y increases downwords.
190 * The dimension part is built in BufferView::updateMetrics() and the
191 * diverse Inset::metrics() calls.
192 * The individual points are added at drawing time in
193 * BufferView::draw(). The math inset position are cached in
194 * the diverse InsetMathXXX::draw() calls and the in-text inset position
195 * are cached in RowPainter::paintInset().
196 * FIXME: For mathed, it would be nice if the insets did not saves their
197 * position themselves. That should be the duty of the containing math
204 /// A map from MathData to position on the screen
205 typedef CoordCacheBase<MathData> Arrays;
206 Arrays & arrays() { return arrays_; }
207 Arrays const & getArrays() const { return arrays_; }
208 /// A map from insets to positions on the screen
209 typedef CoordCacheBase<Inset> Insets;
210 Insets & insets() { return insets_; }
211 Insets const & getInsets() const { return insets_; }
213 /// Dump the contents of the cache to lyxerr in debugging form