X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCompare.cpp;h=cd54e43bb4b938274276bd539b933af031e507c3;hb=b64d17e9dcaeb84a94095622c93a051e4d93eab7;hp=aabbed7e3cd6228f61f94f3639fa6dab928befb4;hpb=acefad32e4d1c4e8f824007ea530b37ff7e70eca;p=lyx.git diff --git a/src/Compare.cpp b/src/Compare.cpp index aabbed7e3c..cd54e43bb4 100644 --- a/src/Compare.cpp +++ b/src/Compare.cpp @@ -14,6 +14,7 @@ #include "BufferParams.h" #include "Changes.h" +#include "Font.h" #include "insets/InsetText.h" @@ -271,7 +272,7 @@ private: /// around the middle snake. void diff_i(DocRangePair const & rp); - /// Processes the splitted chunks. It either adds them as deleted, + /// Processes the split chunks. It either adds them as deleted, /// as added, or call diff_i for further processing. void diffPart(DocRangePair const & rp); @@ -444,6 +445,13 @@ static bool equal(Inset const * i_o, Inset const * i_n) static bool equal(DocIterator & o, DocIterator & n) { + // Explicitly check for this, so we won't call + // Paragraph::getChar for the last pos. + bool const o_lastpos = o.pos() == o.lastpos(); + bool const n_lastpos = n.pos() == n.lastpos(); + if (o_lastpos || n_lastpos) + return o_lastpos && n_lastpos; + Paragraph const & old_par = o.text()->getPar(o.pit()); Paragraph const & new_par = n.text()->getPar(n.pit()); @@ -518,6 +526,7 @@ void Compare::Impl::furthestDpathKdiagonal(int D, int k, // Where do we take the step from ? int const kk = vertical_step ? k + 1 : k - 1; DocPair p(op[kk], np[kk]); + DocPair const s(os[kk], ns[kk]); // If D==0 we simulate a vertical step from (0,-1) by doing nothing. if (D != 0) { @@ -539,8 +548,8 @@ void Compare::Impl::furthestDpathKdiagonal(int D, int k, ns[k] = p.n; } else { // Copy last snake from the previous step - os[k] = os[kk]; - ns[k] = ns[kk]; + os[k] = s.o; + ns[k] = s.n; } //Record new position @@ -683,7 +692,9 @@ bool Compare::Impl::diff(Buffer const * new_buf, Buffer const * old_buf, processSnake(snake); // Start the recursive algorithm - diff_i(rp); + DocRangePair rp_new(from, rp.to()); + if (!rp_new.o.empty() || !rp_new.n.empty()) + diff_i(rp_new); for (pit_type p = 0; p < (pit_type)dest_pars_->size(); ++p) { (*dest_pars_)[p].setBuffer(const_cast(*dest_buf));