X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCoordCache.h;h=9871819c10aa1d1a961c7c01b094b7778572fc7d;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=2b63e6d340a2c5430c45c217355aa28febe62792;hpb=a7058ad9c7f5ca37d965330ad695acb29af9c1fa;p=lyx.git diff --git a/src/CoordCache.h b/src/CoordCache.h index 2b63e6d340..9871819c10 100644 --- a/src/CoordCache.h +++ b/src/CoordCache.h @@ -3,7 +3,7 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author André Pönitz + * \author André Pönitz * * Full author contact details are available in file CREDITS. */ @@ -16,8 +16,6 @@ #include "Dimension.h" -#include "support/types.h" - #include namespace lyx { @@ -29,18 +27,6 @@ class Paragraph; void lyxbreaker(void const * data, const char * hint, int size); -class Point { -public: - Point() - : x_(0), y_(0) - {} - - Point(int x, int y); - - int x_, y_; -}; - - struct Geometry { Point pos; Dimension dim; @@ -52,6 +38,25 @@ struct Geometry { && y >= pos.y_ - dim.asc && y <= pos.y_ + dim.des; } + + int squareDistance(int x, int y) const + { + int xx = 0; + int yy = 0; + + if (x < pos.x_) + xx = pos.x_ - x; + else if (x > pos.x_ + dim.wid) + xx = x - pos.x_ - dim.wid; + + if (y < pos.y_ - dim.asc) + yy = pos.y_ - dim.asc - y; + else if (y > pos.y_ + dim.des) + yy = y - pos.y_ - dim.des; + + // Optimisation: We avoid to compute the sqrt on purpose. + return xx*xx + yy*yy; + } }; @@ -74,12 +79,20 @@ public: void add(T const * thing, Dimension const & dim) { + if (!has(thing)) + data_[thing].pos = Point(-10000, -10000); data_[thing].dim = dim; } + Geometry const & geometry(T const * thing) const + { + check(thing, "geometry"); + return data_.find(thing)->second; + } + Dimension const & dim(T const * thing) const { - check(thing, "dim"); + checkDim(thing, "dim"); return data_.find(thing)->second.dim; } @@ -102,19 +115,42 @@ public: } bool has(T const * thing) const + { + typename cache_type::const_iterator it = data_.find(thing); + + if (it == data_.end()) + return false; + return it->second.pos.x_ != -10000; + } + + bool hasDim(T const * thing) const { return data_.find(thing) != data_.end(); } bool covers(T const * thing, int x, int y) const { - cache_type::const_iterator it = data_.find(thing); + typename cache_type::const_iterator it = data_.find(thing); return it != data_.end() && it->second.covers(x, y); } + int squareDistance(T const * thing, int x, int y) const + { + typename cache_type::const_iterator it = data_.find(thing); + if (it == data_.end()) + return 1000000; + return it->second.squareDistance(x, y); + } + private: friend class CoordCache; + void checkDim(T const * thing, char const * hint) const + { + if (!hasDim(thing)) + lyxbreaker(thing, hint, data_.size()); + } + void check(T const * thing, char const * hint) const { if (!has(thing)) @@ -123,9 +159,6 @@ private: typedef std::map cache_type; cache_type data_; - -public: - cache_type const & getData() const { return data_; } }; /** @@ -134,10 +167,10 @@ public: * All points cached in this cache are only valid between subsequent * updates. (x,y) == (0,0) is the upper left screen corner, x increases * to the right, y increases downwords. - * The dimension part is built in BufferView::updateMetrics() and the + * The dimension part is built in BufferView::updateMetrics() and the * diverse Inset::metrics() calls. * The individual points are added at drawing time in - * BufferView::updateMetrics(). The math inset position are cached in + * BufferView::draw(). The math inset position are cached in * the diverse InsetMathXXX::draw() calls and the in-text inset position * are cached in RowPainter::paintInset(). * FIXME: For mathed, it would be nice if the insets did not saves their @@ -149,19 +182,21 @@ public: void clear(); /// A map from MathData to position on the screen - CoordCacheBase & arrays() { return arrays_; } - CoordCacheBase const & getArrays() const { return arrays_; } + typedef CoordCacheBase Arrays; + Arrays & arrays() { return arrays_; } + Arrays const & getArrays() const { return arrays_; } /// A map from insets to positions on the screen - CoordCacheBase & insets() { return insets_; } - CoordCacheBase const & getInsets() const { return insets_; } + typedef CoordCacheBase Insets; + Insets & insets() { return insets_; } + Insets const & getInsets() const { return insets_; } /// Dump the contents of the cache to lyxerr in debugging form void dump() const; private: /// MathDatas - CoordCacheBase arrays_; + Arrays arrays_; // All insets - CoordCacheBase insets_; + Insets insets_; }; } // namespace lyx