diff --git a/src/apps/activitymonitor/ActivityView.cpp b/src/apps/activitymonitor/ActivityView.cpp index a4e1ee2b0e..5fea2cd6b4 100644 --- a/src/apps/activitymonitor/ActivityView.cpp +++ b/src/apps/activitymonitor/ActivityView.cpp @@ -553,7 +553,7 @@ const float kDraggerSize = 7; ActivityView::ActivityView(BRect frame, const char* name, const BMessage* settings, uint32 resizingMode) : BView(frame, name, resizingMode, - B_WILL_DRAW | B_SUBPIXEL_PRECISE | B_FULL_UPDATE_ON_RESIZE | B_FRAME_EVENTS), + B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_FRAME_EVENTS), fSourcesLock("data sources") { _Init(settings); @@ -598,6 +598,7 @@ ActivityView::ActivityView(BMessage* archive) ActivityView::~ActivityView() { + delete fOffscreen; delete fSystemInfoHandler; } @@ -608,6 +609,7 @@ ActivityView::_Init(const BMessage* settings) fHistoryBackgroundColor = (rgb_color){255, 255, 240}; fLegendBackgroundColor = LowColor(); // the low color is restored by the BView unarchiving + fOffscreen = NULL; #ifdef __HAIKU__ fHistoryLayoutItem = NULL; fLegendLayoutItem = NULL; @@ -924,6 +926,51 @@ ActivityView::MinSize() #endif +void +ActivityView::FrameResized(float /*width*/, float /*height*/) +{ + _UpdateOffscreenBitmap(); +} + + +void +ActivityView::_UpdateOffscreenBitmap() +{ + BRect frame = _HistoryFrame(); + frame.OffsetTo(B_ORIGIN); + + if (fOffscreen != NULL && frame == fOffscreen->Bounds()) + return; + + delete fOffscreen; + + // create offscreen bitmap + + fOffscreen = new(std::nothrow) BBitmap(frame, B_BITMAP_ACCEPTS_VIEWS, + B_RGB32); + if (fOffscreen == NULL || fOffscreen->InitCheck() != B_OK) { + delete fOffscreen; + fOffscreen = NULL; + return; + } + + BView* view = new BView(frame, NULL, B_FOLLOW_NONE, B_SUBPIXEL_PRECISE); + view->SetViewColor(fHistoryBackgroundColor); + view->SetLowColor(view->ViewColor()); + fOffscreen->AddChild(view); +} + + +BView* +ActivityView::_OffscreenView() +{ + if (fOffscreen == NULL) + return NULL; + + return fOffscreen->ChildAt(0); +} + + void ActivityView::MouseDown(BPoint where) { @@ -1279,7 +1326,13 @@ ActivityView::_PositionForValue(DataSource* source, DataHistory* values, void ActivityView::_DrawHistory() { + _UpdateOffscreenBitmap(); + BView* view = this; + if (fOffscreen != NULL) { + fOffscreen->Lock(); + view = _OffscreenView(); + } BRect frame = _HistoryFrame(); BRect outerFrame = frame.InsetByCopy(-2, -2); @@ -1378,9 +1431,12 @@ ActivityView::_DrawHistory() view->EndLineArray(); } - view->SetPenSize(1); - // TODO: add marks when an app started or quit + view->Sync(); + if (fOffscreen != NULL) { + fOffscreen->Unlock(); + DrawBitmap(fOffscreen, outerFrame.LeftTop()); + } } diff --git a/src/apps/activitymonitor/ActivityView.h b/src/apps/activitymonitor/ActivityView.h index 82ed245d24..9983f1f323 100644 --- a/src/apps/activitymonitor/ActivityView.h +++ b/src/apps/activitymonitor/ActivityView.h @@ -86,6 +86,7 @@ protected: virtual BSize MinSize(); #endif + virtual void FrameResized(float width, float height); virtual void MouseDown(BPoint where); virtual void MouseUp(BPoint where); virtual void MouseMoved(BPoint where, uint32 transit, @@ -100,6 +101,8 @@ private: ::Scale* _ScaleFor(scale_type type); void _Refresh(); static status_t _RefreshThread(void* self); + void _UpdateOffscreenBitmap(); + BView* _OffscreenView(); void _UpdateFrame(); BRect _HistoryFrame() const; float _LegendHeight() const; @@ -121,6 +124,7 @@ private: rgb_color fHistoryBackgroundColor; rgb_color fLegendBackgroundColor; + BBitmap* fOffscreen; #ifdef __HAIKU__ BLayoutItem* fHistoryLayoutItem; BLayoutItem* fLegendLayoutItem;