HaikuDepot: TextDocument-Layout and -View optimize drawing...

... by drawing only the paragraphs that intersect with the
 update rect.
This commit is contained in:
Stephan Aßmus 2013-09-08 19:08:26 +02:00
parent 375dff4eaa
commit d6bd4f068d
3 changed files with 11 additions and 4 deletions

View File

@ -88,14 +88,19 @@ TextDocumentLayout::Height()
void
TextDocumentLayout::Draw(BView* view, const BPoint& offset)
TextDocumentLayout::Draw(BView* view, const BPoint& offset,
const BRect& updateRect)
{
_ValidateLayout();
int layoutCount = fParagraphLayouts.CountItems();
for (int i = 0; i < layoutCount; i++) {
const ParagraphLayoutInfo& layout = fParagraphLayouts.ItemAtFast(i);
layout.layout->Draw(view, BPoint(offset.x, offset.y + layout.y));
BPoint location(offset.x, offset.y + layout.y);
if (location.y > updateRect.bottom)
break;
if (location.y + layout.layout->Height() > updateRect.top)
layout.layout->Draw(view, location);
}
}

View File

@ -83,7 +83,8 @@ public:
{ return fWidth; }
float Height();
void Draw(BView* view, const BPoint& offset);
void Draw(BView* view, const BPoint& offset,
const BRect& updateRect);
private:
void _Init();

View File

@ -36,7 +36,7 @@ TextDocumentView::Draw(BRect updateRect)
FillRect(updateRect, B_SOLID_LOW);
fTextDocumentLayout.SetWidth(_TextLayoutWidth(Bounds().Width()));
fTextDocumentLayout.Draw(this, BPoint(fInsetLeft, fInsetTop));
fTextDocumentLayout.Draw(this, BPoint(fInsetLeft, fInsetTop), updateRect);
}
@ -107,6 +107,7 @@ TextDocumentView::SetTextDocument(const TextDocumentRef& document)
fTextDocument = document;
fTextDocumentLayout.SetTextDocument(fTextDocument);
InvalidateLayout();
_UpdateScrollBars();
}