haiku/headers/private/interface/WidthBuffer.h

85 lines
1.6 KiB
C
Raw Normal View History

/*
* Copyright 2003-2010, Haiku, Inc.
* Distributed under the terms of the MIT License.
*/
#ifndef __WIDTHBUFFER_H
#define __WIDTHBUFFER_H
#include <Locker.h>
Quite a cleanup action to avoid polluting the global namespace with private BTextView classes: * Declared the directly used BTextView helper classes as private BTextView classes and changed all affected files. * Realized that Tracker's BPoseView was (accidentally?) using what used to be _BWidthBuffer_. It had declared it's own class with the same name and same members/size in headers/private/tracker/TextViewSupport.h, but the implementation was nowhere to be found. I can only explain this that the BTextView implementation was then actually linked and used. But the big problem was that it was used without locking (unlike in BTextView)! When many Tracker windows opened during system startup or later and they happened to each request characters not yet in the cache, I imagine things could have gone bad and corrupted memory. Anyways, since I can see the usefulness of the cache, BPoseView uses BTextView::WidthBuffer on purpose now. And I moved the locking inside BTextView::WidthBuffer::StringWidth(). * Adjusted InterfaceDefs.cpp accordingly. * TODO: Move subsequent classes into BTextView namespace as well, ie derived classes that BTextView doesn't directly know about. All stuff in src/kits/ inteface/textview_support/ * Added preliminary and not yet implemented layout friendly BTextView constructors. * I will try to handle the insets imposed by BTextView::fTextRect a bit differently when used inside the new layout management framework. For this, I added BTextView::SetInsets() and GetInsets(). SetInsets() doesn't do anything yet. So far, everything seems to work still... ;-) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27654 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-20 19:08:40 +04:00
#include <TextView.h>
#include "TextViewSupportBuffer.h"
Quite a cleanup action to avoid polluting the global namespace with private BTextView classes: * Declared the directly used BTextView helper classes as private BTextView classes and changed all affected files. * Realized that Tracker's BPoseView was (accidentally?) using what used to be _BWidthBuffer_. It had declared it's own class with the same name and same members/size in headers/private/tracker/TextViewSupport.h, but the implementation was nowhere to be found. I can only explain this that the BTextView implementation was then actually linked and used. But the big problem was that it was used without locking (unlike in BTextView)! When many Tracker windows opened during system startup or later and they happened to each request characters not yet in the cache, I imagine things could have gone bad and corrupted memory. Anyways, since I can see the usefulness of the cache, BPoseView uses BTextView::WidthBuffer on purpose now. And I moved the locking inside BTextView::WidthBuffer::StringWidth(). * Adjusted InterfaceDefs.cpp accordingly. * TODO: Move subsequent classes into BTextView namespace as well, ie derived classes that BTextView doesn't directly know about. All stuff in src/kits/ inteface/textview_support/ * Added preliminary and not yet implemented layout friendly BTextView constructors. * I will try to handle the insets imposed by BTextView::fTextRect a bit differently when used inside the new layout management framework. For this, I added BTextView::SetInsets() and GetInsets(). SetInsets() doesn't do anything yet. So far, everything seems to work still... ;-) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27654 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-09-20 19:08:40 +04:00
class BFont;
namespace BPrivate {
class TextGapBuffer;
struct _width_table_ {
BFont font; // corresponding font
int32 hashCount; // number of hashed items
int32 tableCount; // size of table
void* widths; // width table
};
class WidthBuffer : public _BTextViewSupportBuffer_<_width_table_> {
public:
WidthBuffer();
virtual ~WidthBuffer();
float StringWidth(const char* inText,
int32 fromOffset, int32 length,
const BFont* inStyle);
float StringWidth(TextGapBuffer& gapBuffer,
int32 fromOffset, int32 length,
const BFont* inStyle);
private:
bool FindTable(const BFont* font, int32* outIndex);
int32 InsertTable(const BFont* font);
bool GetEscapement(uint32 value, int32 index,
float* escapement);
float HashEscapements(const char* chars,
int32 numChars, int32 numBytes,
int32 tableIndex, const BFont* font);
static uint32 Hash(uint32);
private:
BLocker fLock;
};
extern WidthBuffer* gWidthBuffer;
} // namespace BPrivate
using BPrivate::WidthBuffer;
#if __GNUC__ < 3
//! NetPositive binary compatibility support
class _BWidthBuffer_ : public _BTextViewSupportBuffer_<BPrivate::_width_table_> {
_BWidthBuffer_();
virtual ~_BWidthBuffer_();
};
extern
_BWidthBuffer_* gCompatibilityWidthBuffer;
#endif // __GNUC__ < 3
#endif // __WIDTHBUFFER_H