X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=development%2FPAINTING_ANALYSIS;h=3ddfc7435227e26c4e16531cb455b5343507a68d;hb=c7c9744368cfabfaf29a6071954eb6c1500e6d55;hp=d1da54baa2c55baf0a91b96b708bf63e438c7457;hpb=26eb5092fb69464d181caaf212d6a4d9c9cff2f0;p=lyx.git diff --git a/development/PAINTING_ANALYSIS b/development/PAINTING_ANALYSIS index d1da54baa2..3ddfc74352 100644 --- a/development/PAINTING_ANALYSIS +++ b/development/PAINTING_ANALYSIS @@ -58,15 +58,58 @@ The global idea would be to extend FitCursor to cover also horizontal cursor. -* Proposals +* Clean-up of drawing code -** set inset position during metrics phase +The goal is to make painting with drawing disable fast enough that it +can be used after every metrics computation. Then we can separate real +drawing from metrics. -This implies to set inset positions relative to outer inset during -metrics phase and then in a second loop to descend into insets and -update positions correctly. +Other changes are only clean-ups. -Effect: avoid going through the painter machinery when it is not necessary. +** When a paragraph ends with a newline, compute correctly the height of the extra row. +** Rewrite TextMetrics::editXY, checkInsetHit using row information (getPosNearX)? + + The helper version should return a Row::Element instead of an InsetTable. + +** Remember rtl status in the row object + +This will avoid to pass a Paragraph object to methods that do not need it. + +** Rewrite RowPainter::paintSelection using row information + +Currently it uses some very complicated code. It should be possible to +reuse the logic of paintStringAndSel. + +** Set inset position during metrics phase + +In order to do that, a no-paint drawing will be initiated after every +redoParagraph. This code path will need to be made as fast as possible. + +Effect: avoid depending on actual drawing having taken place. In turn, +it will allow to do drawing on paint events, like any reasonable +application would do. + +** Cleanup after complete metrics + Then the following can be done: + + remove hack in InsetMathNest::drawSelection + + remove painting when not inside in drawParagraph + + remove Cursor::inCoordCache? + +** Use Row for MathData + +It may not be so difficult. Implement x2pos and pos2x from +the TM:cursorX and TM::getPosNearX, and use them for both text and +math. + +Will the strings display OK if drawing string-wise? + +Then it would be possible to streamline drawing with disabled painter. + +** Paint directly to screen + +Instead of using an intermediary pixmap. I have no idea of how +difficult it will prove. +One benefit will be that subpixel aliasing will work again (#9972) ** Merging bv::updateMetrics and tm::metrics @@ -75,16 +118,10 @@ paragraphs that are rebroken, the version that is used for inner inset does not try any such optimization. This can be very bad for very tall insets. We should re-use the bv::updateMetrics logic: + transfer all the logic of bv::updateMetrics to tm. - + Main InsetText should not be special. - -** Metrics outside of visible area + + Main InsetText should not be special. -Currently metrics are computed for current visible paet of text, the -page above and the page below. It should be possible to compute hidden -rows ony on demand, although it might be a bit slow. - -There was a proposal to always compute _all_ rows, but this may become -expensive for large files. This would though help scrolling. +The difficuly for a tall table cell for example, is that it may be +necessary to break the whole contents to know the width of the cell. * Description of current drawing mechanism @@ -127,12 +164,8 @@ update flag is Update::None. ** Metrics computation This is triggered by bv::updateMetrics, which calls tm::redoParagraph for - + all visible paragraphs - + paragraph above the screen (up to one page) - + paragraphs below the screen (up to one page again) - -The paragraphs outside of the screen are required to make PageUp/Down -work. +all visible paragraphs. Paragraphs above or below the screen (needed +for page up/down) and computed as needed. tm::redoParagraph will call Inset::metrics for each inset. In the case of text insets, this will invoke recursively tm::metrics, which redoes