From f1569dbb9e1cbb1c71c0d574c051d219d03ffe0c Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Thu, 15 Jan 2004 07:15:37 +0000 Subject: [PATCH] Moved some headers here so they can be included by Globals.cpp in the interface kit folder git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6092 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../private/interface/TextViewSupportBuffer.h | 149 ++++++++++++++++++ headers/private/interface/WidthBuffer.h | 41 +++++ headers/private/interface/moreUTF8.h | 45 ++++++ 3 files changed, 235 insertions(+) create mode 100644 headers/private/interface/TextViewSupportBuffer.h create mode 100644 headers/private/interface/WidthBuffer.h create mode 100644 headers/private/interface/moreUTF8.h diff --git a/headers/private/interface/TextViewSupportBuffer.h b/headers/private/interface/TextViewSupportBuffer.h new file mode 100644 index 0000000000..58575336ce --- /dev/null +++ b/headers/private/interface/TextViewSupportBuffer.h @@ -0,0 +1,149 @@ +//------------------------------------------------------------------------------ +// Copyright (c) 2001-2003, OpenBeOS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// File Name: TextViewSupportBuffer.h +// Author: Marc Flerackers (mflerackers@androme.be) +// Description: Template class used to implement the various BTextView +// buffer classes. +//------------------------------------------------------------------------------ + +#ifndef __TEXT_VIEW_SUPPORT_BUFFER__H__ +#define __TEXT_VIEW_SUPPORT_BUFFER__H__ + +// Standard Includes ----------------------------------------------------------- +#include +#include + +// System Includes ------------------------------------------------------------- +#include + +// Project Includes ------------------------------------------------------------ + +// Local Includes -------------------------------------------------------------- + +// Local Defines --------------------------------------------------------------- + +// Globals --------------------------------------------------------------------- + +// _BTextViewSupportBuffer_ class ---------------------------------------------- +template +class _BTextViewSupportBuffer_ { + +public: + _BTextViewSupportBuffer_(int32 inExtraCount = 0, int32 inCount = 0); +virtual ~_BTextViewSupportBuffer_(); + + void InsertItemsAt(int32 inNumItems, int32 inAtIndex, const T *inItem); + void RemoveItemsAt(int32 inNumItems, int32 inAtIndex); + + int32 ItemCount() const; + +protected: + int32 fExtraCount; + int32 fItemCount; + int32 fBufferCount; + T* fBuffer; +}; +//------------------------------------------------------------------------------ +template +_BTextViewSupportBuffer_::_BTextViewSupportBuffer_(int32 inExtraCount, + int32 inCount) + : fExtraCount(inExtraCount), + fItemCount(inCount), + fBufferCount(fExtraCount + fItemCount), + fBuffer(NULL) +{ + fBuffer = (T *)calloc(fExtraCount + fItemCount, sizeof(T)); +} +//------------------------------------------------------------------------------ +template +_BTextViewSupportBuffer_::~_BTextViewSupportBuffer_() +{ + free(fBuffer); +} +//------------------------------------------------------------------------------ +template +void _BTextViewSupportBuffer_::InsertItemsAt(int32 inNumItems, + int32 inAtIndex, + const T *inItem) +{ + if (inNumItems < 1) + return; + + inAtIndex = (inAtIndex > fItemCount) ? fItemCount : inAtIndex; + inAtIndex = (inAtIndex < 0) ? 0 : inAtIndex; + + int32 delta = inNumItems * sizeof(T); + int32 logSize = fItemCount * sizeof(T); + if ((logSize + delta) >= fBufferCount) { + fBufferCount = logSize + delta + (fExtraCount * sizeof(T)); + fBuffer = (T *)realloc(fBuffer, fBufferCount); + } + + T *loc = fBuffer + inAtIndex; + memmove(loc + inNumItems, loc, (fItemCount - inAtIndex) * sizeof(T)); + memcpy(loc, inItem, delta); + + fItemCount += inNumItems; +} +//------------------------------------------------------------------------------ +template +void +_BTextViewSupportBuffer_::RemoveItemsAt(int32 inNumItems, + int32 inAtIndex) +{ + if (inNumItems < 1) + return; + + inAtIndex = (inAtIndex > fItemCount - 1) ? (fItemCount - 1) : inAtIndex; + inAtIndex = (inAtIndex < 0) ? 0 : inAtIndex; + + T *loc = fBuffer + inAtIndex; + memmove(loc, loc + inNumItems, + (fItemCount - (inNumItems + inAtIndex)) * sizeof(T)); + + int32 delta = inNumItems * sizeof(T); + int32 logSize = fItemCount * sizeof(T); + uint32 extraSize = fBufferCount - (logSize - delta); + if (extraSize > (fExtraCount * sizeof(T))) { + fBufferCount = (logSize - delta) + (fExtraCount * sizeof(T)); + fBuffer = (T *)realloc(fBuffer, fBufferCount); + } + + fItemCount -= inNumItems; +} +//------------------------------------------------------------------------------ +template +inline int32 +_BTextViewSupportBuffer_::ItemCount() const +{ + return fItemCount; +} +//------------------------------------------------------------------------------ + +#endif // __TEXT_VIEW_SUPPORT_BUFFER__H__ + +/* + * $Log $ + * + * $Id $ + * + */ diff --git a/headers/private/interface/WidthBuffer.h b/headers/private/interface/WidthBuffer.h new file mode 100644 index 0000000000..0c1ea6197c --- /dev/null +++ b/headers/private/interface/WidthBuffer.h @@ -0,0 +1,41 @@ +#ifndef __WIDTHBUFFER_H +#define __WIDTHBUFFER_H + +#include "TextGapBuffer.h" +#include "TextViewSupportBuffer.h" + + +struct _width_table_ { +#if B_BEOS_VERSION_DANO + BFont font; // corresponding font +#else + int32 fontCode; // font code + float fontSize; // font size +#endif + int32 hashCount; // number of hashed items + int32 tableCount; // size of table + void *widths; // width table +}; + + +class _BWidthBuffer_ : public _BTextViewSupportBuffer_<_width_table_> { +public: + _BWidthBuffer_(); + virtual ~_BWidthBuffer_(); + + float StringWidth(const char *inText, int32 fromOffset, int32 length, + const BFont *inStyle); + float StringWidth(_BTextGapBuffer_ &, int32 fromOffset, int32 length, + const BFont *inStyle); + +private: + bool FindTable(const BFont *font, int32 *outIndex); + int32 InsertTable(const BFont *font); + + bool GetEscapement(uint32, int32, float *); + float HashEscapements(const char *, int32, int32, int32, const BFont *); + + static uint32 Hash(uint32); +}; + +#endif // __WIDTHBUFFER_H diff --git a/headers/private/interface/moreUTF8.h b/headers/private/interface/moreUTF8.h new file mode 100644 index 0000000000..88ca0172f7 --- /dev/null +++ b/headers/private/interface/moreUTF8.h @@ -0,0 +1,45 @@ +#ifndef __MOREUTF8 +#define __MOREUTF8 + + +static inline bool +IsInsideGlyph(uchar ch) +{ + return (ch & 0xC0) == 0x80; +} + + +static inline uint32 +UTF8NextCharLen(const char *text) +{ + const char *ptr = text; + + if (ptr == NULL || *ptr == 0) + return 0; + + do { + ptr++; + } while (IsInsideGlyph(*ptr)); + + return ptr - text; +} + + +static inline uint32 +UTF8PreviousCharLen(const char *text, const char *limit) +{ + const char *ptr = text; + + if (ptr == NULL || limit == NULL) + return 0; + + do { + if (ptr == limit) + break; + ptr--; + } while (IsInsideGlyph(*ptr)); + + return text - ptr; +} + +#endif