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 "support/types.h"
30 void lyxbreaker(void const * data
, const char * hint
, int size
);
36 bool covers(int x
, int y
) const
39 && x
<= pos
.x_
+ dim
.wid
40 && y
>= pos
.y_
- dim
.asc
41 && y
<= pos
.y_
+ dim
.des
;
44 int squareDistance(int x
, int y
) const
51 else if (x
> pos
.x_
+ dim
.wid
)
52 xx
= x
- pos
.x_
- dim
.wid
;
54 if (y
< pos
.y_
- dim
.asc
)
55 yy
= pos
.y_
- dim
.asc
- y
;
56 else if (y
> pos
.y_
+ dim
.des
)
57 yy
= y
- pos
.y_
- dim
.des
;
59 // Optimisation: We avoid to compute the sqrt on purpose.
65 template <class T
> class CoordCacheBase
{
77 void add(T
const * thing
, int x
, int y
)
79 data_
[thing
].pos
= Point(x
, y
);
82 void add(T
const * thing
, Dimension
const & dim
)
84 data_
[thing
].dim
= dim
;
87 Geometry
const & geometry(T
const * thing
) const
89 check(thing
, "geometry");
90 return data_
.find(thing
)->second
;
93 Dimension
const & dim(T
const * thing
) const
96 return data_
.find(thing
)->second
.dim
;
99 int x(T
const * thing
) const
102 return data_
.find(thing
)->second
.pos
.x_
;
105 int y(T
const * thing
) const
108 return data_
.find(thing
)->second
.pos
.y_
;
111 Point
xy(T
const * thing
) const
114 return data_
.find(thing
)->second
.pos
;
117 bool has(T
const * thing
) const
119 return data_
.find(thing
) != data_
.end();
122 bool covers(T
const * thing
, int x
, int y
) const
124 typename
cache_type::const_iterator it
= data_
.find(thing
);
125 return it
!= data_
.end() && it
->second
.covers(x
, y
);
128 int squareDistance(T
const * thing
, int x
, int y
) const
130 typename
cache_type::const_iterator it
= data_
.find(thing
);
131 if (it
== data_
.end())
133 return it
->second
.squareDistance(x
, y
);
137 friend class CoordCache
;
139 void check(T
const * thing
, char const * hint
) const
142 lyxbreaker(thing
, hint
, data_
.size());
145 typedef std::map
<T
const *, Geometry
> cache_type
;
149 cache_type
const & getData() const { return data_
; }
153 * A BufferView dependent cache that allows us to come from an inset in
154 * a document to a position point and dimension on the screen.
155 * All points cached in this cache are only valid between subsequent
156 * updates. (x,y) == (0,0) is the upper left screen corner, x increases
157 * to the right, y increases downwords.
158 * The dimension part is built in BufferView::updateMetrics() and the
159 * diverse Inset::metrics() calls.
160 * The individual points are added at drawing time in
161 * BufferView::updateMetrics(). The math inset position are cached in
162 * the diverse InsetMathXXX::draw() calls and the in-text inset position
163 * are cached in RowPainter::paintInset().
164 * FIXME: For mathed, it would be nice if the insets did not saves their
165 * position themselves. That should be the duty of the containing math
172 /// A map from MathData to position on the screen
173 CoordCacheBase
<MathData
> & arrays() { return arrays_
; }
174 CoordCacheBase
<MathData
> const & getArrays() const { return arrays_
; }
175 /// A map from insets to positions on the screen
176 CoordCacheBase
<Inset
> & insets() { return insets_
; }
177 CoordCacheBase
<Inset
> const & getInsets() const { return insets_
; }
179 /// Dump the contents of the cache to lyxerr in debugging form
183 CoordCacheBase
<MathData
> arrays_
;
185 CoordCacheBase
<Inset
> insets_
;