X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=development%2FPAINTING_ANALYSIS;h=c287710ef8c34326212a3b11a507fcf97c3d4bc4;hb=3e7665f2c67a694e928724c3bc058f2f66c30b52;hp=08afa500ed7c84a59b7a73c24358438df52e0e08;hpb=c4da9b9e37848909a0f6be2053c5d49225c1a641;p=lyx.git diff --git a/development/PAINTING_ANALYSIS b/development/PAINTING_ANALYSIS index 08afa500ed..c287710ef8 100644 --- a/development/PAINTING_ANALYSIS +++ b/development/PAINTING_ANALYSIS @@ -33,38 +33,78 @@ is acted on. ** Buffer::change issues When calling Buffer::changed outside of bv::processUpdateFlags, -how do we now that the update strategy is set correctly? It is +how do we know that the update strategy is set correctly? It is possible to reset the strategy at the end of bv::draw. What would be a good value? NoScreenUpdate? On a related note, what is the semantics of a call to Buffer::changed(false)? What does the caller mean? -** What happens with FitCursor when the cursor is already OK? +** How to avoid redraw with FitCursor when the cursor is already OK? -In this case, we invoke Buffer::change(false) with drawing disabled, -which means that the paint machinery is invoked to update inset -positions. +In this case, we invoke Buffer::change(false) with drawing disabled +and NoScreenUpdate strategy. -Actually, this was added as part of the horizontal scrolling GSoC -work. We need to investigate how costly this is. +In the draw phase, bv::checkCursorScrollOffset (the horizontal +scrolling machinery) will change the strategy to FullScreenUpdate if +the current row needs further scrolling. +When the update strategy it kept to NoScreenUpdate, there is currently +a no-draw full repaint, which should not be necessary. It would be +possible to avoid that if the call to checkCursorScrollOffset was done +in bv::processUpdateFlags instead of bv::draw. -* Proposals +The global idea would be to extend FitCursor to cover also horizontal +cursor. -** get rid of pm::insetDimension. -The information contained there is already in bv::coordCache. +* Clean-up of drawing code -Effect: only code simplification. +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. -** set inset position during metrics phase +Other changes are only clean-ups. -This implies to set inset positions relative to outer isnet during -metrics phase and then in a second loop to descend into insets and -update positions correctly. +** When a paragraph ends with a newline, compute correctly the height of the extra row. +** Rewrite TextMetrics::editXY, checkInsetHit using row information (getPosNearX)? -Effect: avoid going through the painter machinery when it is not necessary. + 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. + +** 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 @@ -73,26 +113,21 @@ 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. + + Main InsetText should not be special. -** Metrics outside of visible area +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. -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. +* Description of current drawing mechanism - -* Two phase drawing +** Two stage drawing There are two parts to drawing the work area: + the metrics phase computes the size of insets and breaks the paragraphs into rows. It stores the dimension of insets (both - normal and math) in bv::coordCache, and the size of normal - insets in pm::insetDimension. + normal and math) in bv::coordCache. + the drawing phase draws the contents and caches the inset positions. Since the caching of positions is useful in itself, @@ -100,7 +135,6 @@ There are two parts to drawing the work area: thing we want is to cache inset positions (Painter::setDrawingEnabled). - The machinery is controlled via bv::processUpdateFlags. This method is called at the end of bv::mouseEventDispatch and in GuiApplication::dispatch, via the updateCurrentView method. There are @@ -122,22 +156,18 @@ The screen is drawn (with appropriate update strategy), except when update flag is Update::None. -* Metrics computation +** 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 all the paragraphs of the inset. -* Drawing the work area. +** Drawing the work area. This is done in bv::draw. This method is triggered mainly by Buffer::changed, which draws all the work areas that show the given buffer.