diff --git a/CHANGES b/CHANGES index 0d571b6c0..c0ef45bc6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,6 @@ CHANGES IN FLTK 1.3.0 + - Added flexible gap size for text buffer (STR #2046) - Fixed static linking of image libraries (STR #1962) - Fixed fl_set_spot() for Windows (STR #2101) - Added sorting to Fl_Browser_ (STR #2113) diff --git a/FL/Fl_Text_Buffer.H b/FL/Fl_Text_Buffer.H index 4101b2954..967cda148 100644 --- a/FL/Fl_Text_Buffer.H +++ b/FL/Fl_Text_Buffer.H @@ -97,7 +97,7 @@ typedef void (*Fl_Text_Predelete_Cb)(int pos, int nDeleted, void* cbArg); */ class FL_EXPORT Fl_Text_Buffer { public: - Fl_Text_Buffer(int requestedSize = 0); + Fl_Text_Buffer(int requestedSize = 0, int preferredGapSize = 1024); ~Fl_Text_Buffer(); /** Returns the number of characters in the buffer. */ @@ -312,6 +312,9 @@ class FL_EXPORT Fl_Text_Buffer { use it */ char mCanUndo; /**< if this buffer is used for attributes, it must not do any undo calls */ + int mPreferredGapSize; /**< the default allocation for the text gap is 1024 + bytes and should only be increased if frequent + and large changes in buffer size are expected */ }; #endif diff --git a/src/Fl_Text_Buffer.cxx b/src/Fl_Text_Buffer.cxx index 2720b30b3..4b230ce24 100644 --- a/src/Fl_Text_Buffer.cxx +++ b/src/Fl_Text_Buffer.cxx @@ -34,11 +34,6 @@ #include -#define PREFERRED_GAP_SIZE 1024 -/* Initial size for the buffer gap (empty space -in the buffer where text might be inserted -if the user is typing sequential chars) */ - static void histogramCharacters(const char *string, int length, char hist[ 256 ], int init); static void subsChars(char *string, int length, char fromChar, char toChar); @@ -122,16 +117,21 @@ static void undobuffersize(int n) { } /** - Create an empty text buffer of a pre-determined size (use this to - avoid unnecessary re-allocation if you know exactly how much the buffer - will need to hold + Create an empty text buffer of a pre-determined size. + + \param requestedSize use this to avoid unnecessary re-allocation + if you know exactly how much the buffer will need to hold + \param preferredGapSize Initial size for the buffer gap (empty space + in the buffer where text might be inserted + if the user is typing sequential chars) */ /** Creates a new text buffer of the specified initial size.*/ -Fl_Text_Buffer::Fl_Text_Buffer(int requestedSize) { +Fl_Text_Buffer::Fl_Text_Buffer(int requestedSize, int preferredGapSize) { mLength = 0; - mBuf = (char *)malloc(requestedSize + PREFERRED_GAP_SIZE); + mPreferredGapSize = preferredGapSize; + mBuf = (char *)malloc(requestedSize + mPreferredGapSize); mGapStart = 0; - mGapEnd = PREFERRED_GAP_SIZE; + mGapEnd = mPreferredGapSize; mTabDist = 8; mUseTabs = 1; mPrimary.mSelected = 0; @@ -197,12 +197,12 @@ void Fl_Text_Buffer::text(const char *t) { deletedLength = mLength; free((void *)mBuf); - /* Start a new buffer with a gap of PREFERRED_GAP_SIZE in the center */ + /* Start a new buffer with a gap of mPreferredGapSize in the center */ insertedLength = strlen(t); - mBuf = (char *)malloc(insertedLength + PREFERRED_GAP_SIZE); + mBuf = (char *)malloc(insertedLength + mPreferredGapSize); mLength = insertedLength; mGapStart = insertedLength / 2; - mGapEnd = mGapStart + PREFERRED_GAP_SIZE; + mGapEnd = mGapStart + mPreferredGapSize; memcpy(mBuf, t, mGapStart); memcpy(&mBuf[ mGapEnd ], &t[ mGapStart ], insertedLength - mGapStart); #ifdef PURIFY @@ -347,9 +347,9 @@ void Fl_Text_Buffer::copy(Fl_Text_Buffer *fromBuf, int fromStart, the current buffer, just move the gap (if necessary) to where the text should be inserted. If the new text is too large, reallocate the buffer with a gap large enough to accomodate the new text and a - gap of PREFERRED_GAP_SIZE */ + gap of mPreferredGapSize */ if (copiedLength > mGapEnd - mGapStart) - reallocate_with_gap(toPos, copiedLength + PREFERRED_GAP_SIZE); + reallocate_with_gap(toPos, copiedLength + mPreferredGapSize); else if (toPos != mGapStart) move_gap(toPos); @@ -1439,9 +1439,9 @@ int Fl_Text_Buffer::insert_(int pos, const char *text) { the current buffer, just move the gap (if necessary) to where the text should be inserted. If the new text is too large, reallocate the buffer with a gap large enough to accomodate the new text and a - gap of PREFERRED_GAP_SIZE */ + gap of mPreferredGapSize */ if (insertedLength > mGapEnd - mGapStart) - reallocate_with_gap(pos, insertedLength + PREFERRED_GAP_SIZE); + reallocate_with_gap(pos, insertedLength + mPreferredGapSize); else if (pos != mGapStart) move_gap(pos);