2014-03-03 14:29:37 +00:00
|
|
|
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
PLEASE DO NOT DO WORK ON TOP OF THIS BRANCH.
|
|
|
|
I INTEND TO REWRITE HISTORY LATER!!!
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
|
|
|
|
This branch is where I (jmarc) try to implement string-wise metrics
|
|
|
|
computation. The goal is to have both good metrics computation (and
|
|
|
|
font with proper kerning and ligatures) and better performance than
|
|
|
|
what we have with force_paint_single_char. Moreover there has been
|
|
|
|
some code factorization in TextMetrics, where the same row-breaking
|
|
|
|
algorithm was basically implemented 3 times.
|
2013-07-23 14:24:01 +00:00
|
|
|
|
|
|
|
Currently everything is supposed to work for LTR text, and RTL text
|
|
|
|
should work too except possibly metrics with Arabic and Hebrew fonts.
|
2014-03-03 14:29:37 +00:00
|
|
|
|
|
|
|
When KEEP_OLD_METRICS_CODE is defined in TextMetrics.cpp, the new code
|
|
|
|
is tested against the old one in getPosNearX and cursorX. This can be
|
|
|
|
helpful when looking for discrepancies between the algorithms. Note
|
|
|
|
that this only makes sense when force_paint_single_char=true, since
|
|
|
|
this enforces char-by-char metrics computation.
|
2013-06-18 08:18:32 +00:00
|
|
|
|
|
|
|
What is done:
|
2013-07-23 14:24:01 +00:00
|
|
|
|
2013-06-18 08:18:32 +00:00
|
|
|
* Make TextMetrics methods operate on Row objects: breakRow and
|
2013-06-25 06:18:25 +00:00
|
|
|
setRowHeight instead of rowBreakPoint and rowHeight.
|
|
|
|
|
2014-03-03 14:29:37 +00:00
|
|
|
* Change breakRow operation to operate at strings level to compute
|
|
|
|
metrics The list of elements is stored in the row object in visual
|
|
|
|
ordering, not logical. This will eventually allow to get rid of the
|
|
|
|
Bidi class.
|
2013-06-25 06:18:25 +00:00
|
|
|
|
2013-12-20 13:02:31 +00:00
|
|
|
* rename getColumnNearX to getPosNearX (and change code accordingly).
|
|
|
|
It does not make sense to return a position relative to the start of
|
|
|
|
row, since nobody needs this.
|
|
|
|
|
|
|
|
* Re-implement cursorX and getPosNearX using row elements.
|
2013-07-21 18:22:32 +00:00
|
|
|
|
2013-06-25 06:18:25 +00:00
|
|
|
* Implement proper string metrics computation (with cache), when
|
2013-07-21 18:22:32 +00:00
|
|
|
lyxrc.force_paint_single_char is false. In this case, remove also
|
|
|
|
useless workarounds which disable kerning and ligatures.
|
2013-06-18 08:18:32 +00:00
|
|
|
|
2013-06-25 06:18:25 +00:00
|
|
|
|
2014-03-19 13:44:53 +00:00
|
|
|
Next steps:
|
2013-10-11 14:12:20 +00:00
|
|
|
|
2014-03-03 14:29:37 +00:00
|
|
|
* check what happens with Arabic and/or Hebrew text. There may be some
|
2013-10-11 14:12:20 +00:00
|
|
|
problems related to compose characters. I suspect that some code is
|
|
|
|
needed in FontMetrics::width.
|
|
|
|
|
2014-03-03 14:29:37 +00:00
|
|
|
* investigate whether RtL strings could be drawn on a string-wise basis.
|
|
|
|
|
|
|
|
* investigate whether Row::SEPARATOR elements could be used only in
|
|
|
|
justified text. This would speed-up painting in other cases by
|
|
|
|
lowering the number of strings to draw.
|
|
|
|
|
|
|
|
* get lots of testing.
|
|
|
|
|
2013-10-11 14:12:20 +00:00
|
|
|
* Get rid of old code in cursorX and getColumnNearX; it has been
|
2013-07-21 18:22:32 +00:00
|
|
|
kept for comparison purpose, guarded with KEEP_OLD_METRICS_CODE in
|
2013-10-11 14:12:20 +00:00
|
|
|
order to check computations.
|
2013-06-25 06:18:25 +00:00
|
|
|
|
2014-03-03 14:29:37 +00:00
|
|
|
* Profile and see how performance can be improved.
|
|
|
|
|
|
|
|
|
|
|
|
Steps for later (aka out of the scope of this branch):
|
|
|
|
|
2013-07-23 14:24:01 +00:00
|
|
|
* Re-implement row painting using row elements. This is not difficult
|
|
|
|
in principle, but the code is intricate and needs some careful
|
2014-03-03 14:29:37 +00:00
|
|
|
analysis. The first thing that needs to be done is to break row
|
|
|
|
elements with the same criteria. Currently TextMetrics::breakRow
|
|
|
|
does not consider on-the-fly spell-checking and selection changes,
|
|
|
|
but it is 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.
|
2013-06-25 06:18:25 +00:00
|
|
|
|
2014-03-03 14:29:37 +00:00
|
|
|
This would allow to get rid of the Bidi code.
|
2013-06-18 08:18:32 +00:00
|
|
|
|
2013-07-17 22:25:08 +00:00
|
|
|
|
2014-03-03 14:29:37 +00:00
|
|
|
Known bugs:
|
|
|
|
|
|
|
|
* in RtL paragraphs, the end-of-paragraph marker moves the row to the
|
|
|
|
right (ticket #9040, already present in master).
|
|
|
|
|
|
|
|
* there are still difference in what breaks words. In particular,
|
|
|
|
RowPainter breaks strings at: selection end, spell-checking
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
Other differences in behavior (aka bug fixes):
|
2013-07-21 18:22:32 +00:00
|
|
|
|
2013-06-18 08:18:32 +00:00
|
|
|
* end of paragraph markers metrics are computed with the font of the
|
2013-07-21 18:22:32 +00:00
|
|
|
actual text, not default font.
|
2013-06-18 08:18:32 +00:00
|
|
|
|
2014-03-03 14:29:37 +00:00
|
|
|
* When cursor is after a LtR separator just before a RtL chunk, the
|
2013-10-11 14:12:20 +00:00
|
|
|
cursor position is computed better with the new code.
|
2013-07-17 22:25:08 +00:00
|
|
|
|
2013-07-23 14:24:01 +00:00
|
|
|
|