The branch, str-metrics, has been updated. - Log -----------------------------------------------------------------
commit f6637dcbc89a67d0238f5979f7457f2bbc9c9e9b Author: Jean-Marc Lasgouttes <lasgout...@lyx.org> Date: Mon Mar 3 15:29:37 2014 +0100 Update README and do a small code cleanup diff --git a/00README_STR_METRICS_BRANCH b/00README_STR_METRICS_BRANCH index 1983dfe..962bfad 100644 --- a/00README_STR_METRICS_BRANCH +++ b/00README_STR_METRICS_BRANCH @@ -1,4 +1,4 @@ -This branch is where I (jmarc) try to implement string_wise metrics +This branch is where I (jmarc) try to implement string-wise metrics computation. This is done through a series of cleanups. The goal is to have both good metrics computation (and font with proper kerning and ligatures) and better performance than what we have with @@ -8,6 +8,7 @@ Currently everything is supposed to work for LTR text, and RTL text should work too except possibly metrics with Arabic and Hebrew fonts. We'll see what to do after some feedback. + What is done: * Make TextMetrics methods operate on Row objects: breakRow and @@ -34,21 +35,50 @@ Next steps: problems related to compose characters. I suspect that some code is needed in FontMetrics::width. +* investigate whether RtL strings could be drawn on a word-wise basis. + +* investigate whether Row::SEPARATOR elements could be used ony in + justified text. This would speed-up painting in other cases by + lowering the number of strings to draw. + +* get lots of testing. + * Get rid of old code in cursorX and getColumnNearX; it has been kept for comparison purpose, guarded with KEEP_OLD_METRICS_CODE in order to check computations. +* Profile and see how performance can be improved. + + +Steps for later (aka out of the scope of this branch): + * Re-implement row painting using row elements. This is not difficult in principle, but the code is intricate and needs some careful analysis. First thing that needs to be done is to break row elements with the same criterions. Currently TextMetrics::breakRow does not consider on-the-fly spellchecking and selection changes, but it is - not clear to me that it is required. + not clear to me that it is required. Moreover, this thing would only + work if we are sure that the Row object is up-to-date when drawing + happens. This depends on the update machinery. -* Profile and see how performance can be improved. + This would allow to get rid of the Bidi code. -Difference in behavior (aka bug fixes) +Known bugs: + +* in RtL paragraphs, the end-of-paragraph marker moves the row to the right. + +* problem with strings not found (ticket #8837). + +* there are still difference in what breaks words. In particular, + RowPainter breaks strings at: selection end, spellchecking + extremities. This seems to be harmless. + +* when clicking in the right margin, GetColumnNearX does not return + the same value as before. I am not sure whether this is important. + + +Difference in behavior (aka bug fixes): * end of paragraph markers metrics are computed with the font of the actual text, not default font. @@ -57,11 +87,3 @@ Difference in behavior (aka bug fixes) cursor position is computed better with the new code. -Other differences (aka real bugs) - -* there are still difference in what breaks words. In particular, - RowPainter breaks strings at: selection end, spellchecking - extremities. - -* when clicking in the right margin, GetColumnNearX does not return - the same value as before. diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 15c8589..aab52ee 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -15,7 +15,7 @@ * Full author contact details are available in file CREDITS. */ -#define KEEP_OLD_METRICS_CODE 1 +//#define KEEP_OLD_METRICS_CODE 1 #include <config.h> @@ -1598,15 +1598,12 @@ int TextMetrics::cursorX(CursorSlice const & sl, bool boundary) const { LASSERT(sl.text() == text_, return 0); - pit_type const pit = sl.pit(); - pos_type pos = sl.pos(); - ParagraphMetrics const & pm = par_metrics_[pit]; + ParagraphMetrics const & pm = par_metrics_[sl.pit()]; if (pm.rows().empty()) return 0; Row const & row = pm.getRow(sl.pos(), boundary); - - double x = row.x; + pos_type const pos = sl.pos(); /** * When boundary is true, position i is in the row element (pos, endpos) @@ -1622,9 +1619,10 @@ int TextMetrics::cursorX(CursorSlice const & sl, if (row.empty() || (row.begin()->font.isVisibleRightToLeft() && pos == row.begin()->endpos)) - return int(x); + return int(row.x); Row::const_iterator cit = row.begin(); + double x = row.x; for ( ; cit != row.end() ; ++cit) { if (pos + boundary_corr >= cit->pos && pos + boundary_corr < cit->endpos) { @@ -1640,6 +1638,7 @@ int TextMetrics::cursorX(CursorSlice const & sl, << ", " << boundary_corr << "): NOT FOUND! " << row); #ifdef KEEP_OLD_METRICS_CODE + pit_type const pit = sl.pit(); Paragraph const & par = text_->paragraphs()[pit]; // Correct position in front of big insets ----------------------------------------------------------------------- Summary of changes: 00README_STR_METRICS_BRANCH | 46 +++++++++++++++++++++++++++++++----------- src/TextMetrics.cpp | 13 +++++------ 2 files changed, 40 insertions(+), 19 deletions(-) hooks/post-receive -- Repository for new features