From b545073f089282445eaf00a96e2b8f4699079c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Thu, 6 Nov 2008 11:31:40 +0000 Subject: [PATCH] * Moved the global BPrivate::WidthBuffer from BTextView into BPrivate as gWidthBuffer. * Tracker PoseView now uses BPrivate::gWidthBuffer instead of it's own instance. * TextView.h and PoseView.h are now a little cleaner. * InterfaceDefs.cpp now deletes gWidthBuffer in _fini_interface_kit_(). * Added binary compatibility support for NetPositive in WidthBuffer.h and .cpp. Obviously it kind of defeats the purpose of having WidthBuffer neatly tucked away in the BPrivate namespace, but Haiku should run NetPositive, I guess. Fixes #2879. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28532 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/interface/TextView.h | 7 ----- headers/private/interface/WidthBuffer.h | 17 ++++++++++ src/kits/interface/InterfaceDefs.cpp | 8 +++-- src/kits/interface/TextView.cpp | 8 ++--- .../textview_support/WidthBuffer.cpp | 31 ++++++++++++++++++- src/kits/tracker/PoseView.cpp | 6 ++-- src/kits/tracker/PoseView.h | 7 ----- 7 files changed, 58 insertions(+), 26 deletions(-) diff --git a/headers/os/interface/TextView.h b/headers/os/interface/TextView.h index a2d27e2f73..dd928b2174 100644 --- a/headers/os/interface/TextView.h +++ b/headers/os/interface/TextView.h @@ -16,9 +16,6 @@ class BFile; class BList; class BMessageRunner; -extern "C" status_t _init_interface_kit_(); - - struct text_run { int32 offset; BFont font; @@ -40,7 +37,6 @@ enum undo_state { }; namespace BPrivate { - class WidthBuffer; class TextGapBuffer; } // namespace BPrivate @@ -276,7 +272,6 @@ private: class TypingUndoBuffer; friend class TextTrackState; - friend status_t _init_interface_kit_(); virtual void _ReservedTextView3(); virtual void _ReservedTextView4(); @@ -417,8 +412,6 @@ private: LayoutData* fLayoutData; uint32 _reserved[8]; - - static BPrivate::WidthBuffer* sWidths; }; #endif // _TEXTVIEW_H diff --git a/headers/private/interface/WidthBuffer.h b/headers/private/interface/WidthBuffer.h index 2b2d42b1ba..1baf9fd2b9 100644 --- a/headers/private/interface/WidthBuffer.h +++ b/headers/private/interface/WidthBuffer.h @@ -78,6 +78,23 @@ private: static uint32 Hash(uint32); }; +extern WidthBuffer* gWidthBuffer; + } // namespace BPrivate +using BPrivate::WidthBuffer; + +#if __GNUC__ < 3 +//! NetPositive binary compatibility support + +class _BWidthBuffer_ : public _BTextViewSupportBuffer_ { + _BWidthBuffer_(); + virtual ~_BWidthBuffer_(); +}; + +extern +_BWidthBuffer_* gCompatibilityWidthBuffer; + +#endif // __GNUC__ < 3 + #endif // __WIDTHBUFFER_H diff --git a/src/kits/interface/InterfaceDefs.cpp b/src/kits/interface/InterfaceDefs.cpp index 2fdf18cf04..a402401dc9 100644 --- a/src/kits/interface/InterfaceDefs.cpp +++ b/src/kits/interface/InterfaceDefs.cpp @@ -904,7 +904,7 @@ _init_interface_kit_() if (status < B_OK) return status; - BTextView::sWidths = new BPrivate::WidthBuffer; + BPrivate::gWidthBuffer = new BPrivate::WidthBuffer; _init_global_fonts_(); @@ -927,7 +927,10 @@ _init_interface_kit_() extern "C" status_t _fini_interface_kit_() { - //TODO: Implement ? + delete BPrivate::gWidthBuffer; + BPrivate::gWidthBuffer = NULL; + + // TODO: Anything else? return B_OK; } @@ -1470,4 +1473,3 @@ truncate_string(const char* string, uint32 mode, float width, strlcpy(dest, source, length + 1); } } - diff --git a/src/kits/interface/TextView.cpp b/src/kits/interface/TextView.cpp index 9d63acfed2..5c0f0d81cf 100644 --- a/src/kits/interface/TextView.cpp +++ b/src/kits/interface/TextView.cpp @@ -152,9 +152,6 @@ struct BTextView::LayoutData { bool valid; }; -// Initialized/finalized by init/fini_interface_kit -BPrivate::WidthBuffer* BTextView::sWidths = NULL; - const static rgb_color kBlackColor = { 0, 0, 0, 255 }; const static rgb_color kBlueInputColor = { 152, 203, 255, 255 }; @@ -3824,8 +3821,9 @@ BTextView::_StyledWidth(int32 fromOffset, int32 length, float *outAscent, #if USE_WIDTHBUFFER // Use _BWidthBuffer_ if possible - if (sWidths != NULL) { - result += sWidths->StringWidth(*fText, fromOffset, numChars, font); + if (BPrivate::gWidthBuffer != NULL) { + result += BPrivate::gWidthBuffer->StringWidth(*fText, fromOffset, + numChars, font); } else { #endif const char* text = fText->GetString(fromOffset, &numChars); diff --git a/src/kits/interface/textview_support/WidthBuffer.cpp b/src/kits/interface/textview_support/WidthBuffer.cpp index 807bc3b405..0b73dee3f6 100644 --- a/src/kits/interface/textview_support/WidthBuffer.cpp +++ b/src/kits/interface/textview_support/WidthBuffer.cpp @@ -20,12 +20,16 @@ #include +//! NetPositive binary compatibility support +class _BWidthBuffer_; + namespace BPrivate { const static uint32 kTableCount = 128; const static uint32 kInvalidCode = 0xFFFFFFFF; static BLocker sWidthLocker = BLocker("width buffer lock"); - +WidthBuffer* gWidthBuffer = NULL; + // initialized in InterfaceDefs.cpp struct hashed_escapement { uint32 code; @@ -363,3 +367,28 @@ WidthBuffer::HashEscapements(const char *inText, int32 numChars, int32 textLen, } // namespace BPrivate + +#if __GNUC__ < 3 +//! NetPositive binary compatibility support + +_BWidthBuffer_::_BWidthBuffer_() +{ +} + +_BWidthBuffer_::~_BWidthBuffer_() +{ +} + +_BWidthBuffer_* gCompatibilityWidthBuffer = NULL; + +extern "C" +float +StringWidth__14_BWidthBuffer_PCcllPC5BFont(_BWidthBuffer_* widthBuffer, + const char *inText, int32 fromOffset, int32 length, const BFont *inStyle) +{ + return BPrivate::gWidthBuffer->StringWidth(inText, fromOffset, length, + inStyle); +} + +#endif // __GNUC__ < 3 + diff --git a/src/kits/tracker/PoseView.cpp b/src/kits/tracker/PoseView.cpp index 90dd490f86..2da2744b86 100644 --- a/src/kits/tracker/PoseView.cpp +++ b/src/kits/tracker/PoseView.cpp @@ -641,7 +641,8 @@ BPoseView::SaveState(BMessage &message) const float BPoseView::StringWidth(const char *str) const { - return sWidthBuffer->StringWidth(str, 0, (int32)strlen(str), &sCurrentFont); + return BPrivate::gWidthBuffer->StringWidth(str, 0, (int32)strlen(str), + &sCurrentFont); } @@ -649,7 +650,7 @@ float BPoseView::StringWidth(const char *str, int32 len) const { ASSERT(strlen(str) == (uint32)len); - return sWidthBuffer->StringWidth(str, 0, len, &sCurrentFont); + return BPrivate::gWidthBuffer->StringWidth(str, 0, len, &sCurrentFont); } @@ -9321,7 +9322,6 @@ TPoseViewFilter::Filter(BMessage *message, BHandler **) float BPoseView::sFontHeight = -1; font_height BPoseView::sFontInfo = { 0, 0, 0 }; bigtime_t BPoseView::sLastKeyTime = 0; -BPrivate::WidthBuffer* BPoseView::sWidthBuffer = new BPrivate::WidthBuffer; BFont BPoseView::sCurrentFont; OffscreenBitmap *BPoseView::sOffscreen = new OffscreenBitmap; char BPoseView::sMatchString[] = ""; diff --git a/src/kits/tracker/PoseView.h b/src/kits/tracker/PoseView.h index 0965029ab5..c5e0a53beb 100644 --- a/src/kits/tracker/PoseView.h +++ b/src/kits/tracker/PoseView.h @@ -62,10 +62,6 @@ All rights reserved. class BRefFilter; class BList; -// TODO: Get rid of this. -#include - // for BTextView::WidthBuffer; - namespace BPrivate { class BCountView; @@ -665,9 +661,6 @@ class BPoseView : public BView { bigtime_t fLastDeskbarFrameCheckTime; BRect fDeskbarFrame; - // TODO: Get rid of this. - static BPrivate::WidthBuffer *sWidthBuffer; - static OffscreenBitmap *sOffscreen; typedef BView _inherited;