X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fcoordcache.h;h=dba9b89fd4d283a2a27c7c31e9ecf2dac1a4c379;hb=52eb91c94fb70d58dceef430659c8781de2eccda;hp=a2d82353c193e141189be0f5beaefb9996015805;hpb=aabd481ab63fd50606dd0d984c0b407e4b27e6a7;p=lyx.git diff --git a/src/coordcache.h b/src/coordcache.h index a2d82353c1..dba9b89fd4 100644 --- a/src/coordcache.h +++ b/src/coordcache.h @@ -11,17 +11,20 @@ #ifndef COORDCACHE_H #define COORDCACHE_H -class InsetBase; -class LyXText; -class MathArray; -class Paragraph; +// It seems that MacOSX define the check macro. +#undef check #include "support/types.h" -#include - #include +namespace lyx { + +class InsetBase; +class LyXText; +class MathArray; +class Paragraph; + void lyxbreaker(void const * data, const char * hint, int size); class Point { @@ -30,18 +33,11 @@ public: : x_(0), y_(0) {} - Point(int x, int y) : x_(x), y_(y) - { - BOOST_ASSERT(x > -3000); - BOOST_ASSERT(x < 4000); - BOOST_ASSERT(y > -3000); - BOOST_ASSERT(y < 4000); - } + Point(int x, int y); int x_, y_; }; - template class CoordCacheBase { public: void clear() @@ -49,6 +45,11 @@ public: data_.clear(); } + bool const empty() const + { + return data_.empty(); + } + void add(T const * thing, int x, int y) { data_[thing] = Point(x, y); @@ -94,59 +95,67 @@ private: typedef std::map cache_type; cache_type data_; + +public: + cache_type const & getData() const { return data_; } }; /** * A global cache that allows us to come from a paragraph in a document * to a position point on the screen. * All points cached in this cache are only valid between subsequent - * updated. (x,y) == (0,0) is the upper left screen corner, x increases + * updates. (x,y) == (0,0) is the upper left screen corner, x increases * to the right, y increases downwords. - * The cache is built in BufferView::Pimpl::metrics which is called - * from BufferView::Pimpl::update. The individual points are added + * The cache is built in BufferView::updateMetrics which is called + * from BufferView::update. The individual points are added * while we paint them. See for instance paintPar in RowPainter.C. */ class CoordCache { public: - CoordCache() : updating(false) { } - /// In order to find bugs, we record when we start updating the cache - void startUpdating(); - /// When we are done, we record that to help find bugs - void doneUpdating(); - void clear(); - Point get(LyXText const *, lyx::pit_type); + Point get(LyXText const *, pit_type) const; /// A map from paragraph index number to screen point - typedef std::map InnerParPosCache; + typedef std::map InnerParPosCache; /// A map from a LyXText to the map of paragraphs to screen points typedef std::map ParPosCache; + /// A map from a CursorSlice to screen points + typedef std::map SliceCache; /// A map from MathArray to position on the screen - CoordCacheBase & arrays() { BOOST_ASSERT(updating); return arrays_; } + CoordCacheBase & arrays() { return arrays_; } CoordCacheBase const & getArrays() const { return arrays_; } /// A map from insets to positions on the screen - CoordCacheBase & insets() { BOOST_ASSERT(updating); return insets_; } + CoordCacheBase & insets() { return insets_; } CoordCacheBase const & getInsets() const { return insets_; } /// A map from (LyXText, paragraph) pair to screen positions - ParPosCache & parPos() { BOOST_ASSERT(updating); return pars_; } + ParPosCache & parPos() { return pars_; } ParPosCache const & getParPos() const { return pars_; } + /// + SliceCache & slice(bool boundary) + { + return boundary ? slices1_ : slices0_; + } + SliceCache const & getSlice(bool boundary) const + { + return boundary ? slices1_ : slices0_; + } + + /// Dump the contents of the cache to lyxerr in debugging form + void dump() const; private: + /// MathArrays CoordCacheBase arrays_; - - // all insets + // All insets CoordCacheBase insets_; - - // paragraph grouped by owning text + /// Paragraph grouped by owning text ParPosCache pars_; - - /** - * Debugging flag only: Set to true while the cache is being built. - * No changes to the structure are allowed unless we are updating. - */ - bool updating; + /// Used with boundary == 0 + SliceCache slices0_; + /// Used with boundary == 1 + SliceCache slices1_; }; -extern CoordCache theCoords; +} // namespace lyx #endif