From 7ae974066f958dd06cd4e31e858526e283104d0c Mon Sep 17 00:00:00 2001 From: Philippe Houdoin Date: Thu, 9 Sep 2010 15:13:37 +0000 Subject: [PATCH] Cache text width to avoid calling StringWidth() too much while both text and font don't change. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38591 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/interface/StringView.h | 1 + src/kits/interface/StringView.cpp | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/headers/os/interface/StringView.h b/headers/os/interface/StringView.h index 17237cb785..26fc8da8ba 100644 --- a/headers/os/interface/StringView.h +++ b/headers/os/interface/StringView.h @@ -78,6 +78,7 @@ private: private: char* fText; + float fTextWidth; alignment fAlign; BSize fPreferredSize; diff --git a/src/kits/interface/StringView.cpp b/src/kits/interface/StringView.cpp index d168908958..c7f36cdf04 100644 --- a/src/kits/interface/StringView.cpp +++ b/src/kits/interface/StringView.cpp @@ -29,6 +29,7 @@ BStringView::BStringView(BRect frame, const char* name, const char* text, uint32 resizeMask, uint32 flags) : BView(frame, name, resizeMask, flags | B_FULL_UPDATE_ON_RESIZE), fText(text ? strdup(text) : NULL), + fTextWidth(text ? StringWidth(text) : 0.0), fAlign(B_ALIGN_LEFT), fPreferredSize(-1, -1) { @@ -38,6 +39,7 @@ BStringView::BStringView(BRect frame, const char* name, const char* text, BStringView::BStringView(const char* name, const char* text, uint32 flags) : BView(name, flags | B_FULL_UPDATE_ON_RESIZE), fText(text ? strdup(text) : NULL), + fTextWidth(text ? StringWidth(text) : 0.0), fAlign(B_ALIGN_LEFT), fPreferredSize(-1, -1) { @@ -47,6 +49,7 @@ BStringView::BStringView(const char* name, const char* text, uint32 flags) BStringView::BStringView(BMessage* data) : BView(data), fText(NULL), + fTextWidth(0.0), fPreferredSize(-1, -1) { int32 align; @@ -241,11 +244,11 @@ BStringView::Draw(BRect updateRect) float x; switch (fAlign) { case B_ALIGN_RIGHT: - x = bounds.Width() - StringWidth(fText); + x = bounds.Width() - fTextWidth; break; case B_ALIGN_CENTER: - x = (bounds.Width() - StringWidth(fText)) / 2.0; + x = (bounds.Width() - fTextWidth) / 2.0; break; default: @@ -294,13 +297,14 @@ BStringView::SetText(const char* text) if ((text && fText && !strcmp(text, fText)) || (!text && !fText)) return; - float oldWidth = StringWidth(fText); - free(fText); fText = text ? strdup(text) : NULL; - if (oldWidth != StringWidth(fText)) + float newTextWidth = StringWidth(fText); + if (fTextWidth != newTextWidth) { + fTextWidth = newTextWidth; InvalidateLayout(); + } Invalidate(); } @@ -348,6 +352,8 @@ BStringView::SetFont(const BFont* font, uint32 mask) { BView::SetFont(font, mask); + fTextWidth = StringWidth(fText); + Invalidate(); InvalidateLayout(); } @@ -434,13 +440,13 @@ BStringView::_ValidatePreferredSize() { if (fPreferredSize.width < 0) { // width - fPreferredSize.width = ceilf(StringWidth(fText)); + fPreferredSize.width = ceilf(fTextWidth); // height font_height fontHeight; GetFontHeight(&fontHeight); - - fPreferredSize.height = ceilf(fontHeight.ascent + fontHeight.descent + + fPreferredSize.height = ceilf(fontHeight.ascent + fontHeight.descent + fontHeight.leading); ResetLayoutInvalidation();