From 5030d60fe8a9cf8f74aa2f2ab24eae1c89d697b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 28 Oct 2005 09:52:26 +0000 Subject: [PATCH] Connected the painter stuff to the temporary font lock work-around. This seem to enhance the stability of the app_server by a magnitude (at least I can now run apps like Installer and Media without an instant crash). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14549 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/servers/app/ServerFont.h | 3 ++ .../app/drawing/DisplayDriverPainter.cpp | 36 ++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/headers/private/servers/app/ServerFont.h b/headers/private/servers/app/ServerFont.h index 68a6b0c3cb..6c32fc950b 100644 --- a/headers/private/servers/app/ServerFont.h +++ b/headers/private/servers/app/ServerFont.h @@ -140,6 +140,9 @@ class ServerFont { float StringWidth(const char* string, int32 numBytes) const; + bool Lock() const { return fStyle->Lock(); } + void Unlock() const { fStyle->Unlock(); } + FT_Face GetFTFace() const { return fStyle->GetFTFace(); }; diff --git a/src/servers/app/drawing/DisplayDriverPainter.cpp b/src/servers/app/drawing/DisplayDriverPainter.cpp index 7b20f1a0c0..c6c9bd931c 100644 --- a/src/servers/app/drawing/DisplayDriverPainter.cpp +++ b/src/servers/app/drawing/DisplayDriverPainter.cpp @@ -44,6 +44,36 @@ extend_by_stroke_width(BRect& rect, const DrawData* context) rect.InsetBy(inset, inset); } + +class FontLocker { + public: + FontLocker(const DrawData* context) + : + fFont(&context->Font()) + { + fFont->Lock(); + } + + FontLocker(const ServerFont* font) + : + fFont(font) + { + fFont->Lock(); + } + + ~FontLocker() + { + fFont->Unlock(); + } + + private: + const ServerFont* fFont; +}; + + +// pragma mark - + + // constructor DisplayDriverPainter::DisplayDriverPainter(HWInterface* interface) : DisplayDriver(), @@ -1086,6 +1116,7 @@ DisplayDriverPainter::DrawString(const char* string, int32 length, { // TODO: use delta if (Lock()) { + FontLocker locker(d); fPainter->SetDrawData(d); //bigtime_t now = system_time(); // TODO: BoundingBox is quite slow!! Optimizing it will be beneficial. @@ -1120,6 +1151,7 @@ DisplayDriverPainter::StringWidth(const char* string, int32 length, // TODO: use delta float width = 0.0; if (Lock()) { + FontLocker locker(d); fPainter->SetDrawData(d); width = fPainter->StringWidth(string, length); Unlock(); @@ -1134,6 +1166,7 @@ DisplayDriverPainter::StringWidth(const char* string, int32 length, escapement_delta* delta) { // TODO: use delta + FontLocker locker(&font); static DrawData d; d.SetFont(font); return StringWidth(string, length, &d); @@ -1146,6 +1179,7 @@ DisplayDriverPainter::StringHeight(const char *string, int32 length, { float height = 0.0; if (Lock()) { + FontLocker locker(d); fPainter->SetDrawData(d); static BPoint dummy(0.0, 0.0); height = fPainter->BoundingBox(string, length, dummy).Height(); @@ -1157,7 +1191,7 @@ DisplayDriverPainter::StringHeight(const char *string, int32 length, // Lock bool DisplayDriverPainter::Lock() -{ +{ return fGraphicsCard->WriteLock(); }