diff --git a/src/kits/interface/TextView.cpp b/src/kits/interface/TextView.cpp index 35437c627f..52de606aab 100644 --- a/src/kits/interface/TextView.cpp +++ b/src/kits/interface/TextView.cpp @@ -1233,8 +1233,9 @@ BTextView::Copy(BClipboard *clipboard) BMessage *clip = clipboard->Data(); if (clip != NULL) { - clip->AddData("text/plain", B_MIME_TYPE, Text() + fSelStart, - fSelEnd - fSelStart); + int32 numBytes = fSelEnd - fSelStart; + const char* text = fText->GetString(fSelStart, &numBytes); + clip->AddData("text/plain", B_MIME_TYPE, text, numBytes); int32 size; if (fStylable) { @@ -2642,9 +2643,10 @@ BTextView::GetDragParameters(BMessage *drag, BBitmap **bitmap, BPoint *point, drag->AddInt32("be_actions", B_TRASH_TARGET); // add the text - drag->AddData("text/plain", B_MIME_TYPE, fText->RealText() + fSelStart, - fSelEnd - fSelStart); - + int32 numBytes = fSelEnd - fSelStart; + const char* text = fText->GetString(fSelStart, &numBytes); + drag->AddData("text/plain", B_MIME_TYPE, text, numBytes); + // add the corresponding styles int32 size = 0; text_run_array *styles = RunArray(fSelStart, fSelEnd, &size); @@ -3422,10 +3424,15 @@ BTextView::_StyledWidth(int32 fromOffset, int32 length, float *outAscent, LockWidthBuffer(); result += sWidths->StringWidth(*fText, fromOffset, numChars, font); UnlockWidthBuffer(); - } else + } else { #endif - result += font->StringWidth(fText->RealText() + fromOffset, numChars); - + const char* text = fText->GetString(fromOffset, &numChars); + result += font->StringWidth(text, numChars); + +#if USE_WIDTHBUFFER + } +#endif + fromOffset += numChars; length -= numChars; } diff --git a/src/kits/interface/textview_support/TextGapBuffer.cpp b/src/kits/interface/textview_support/TextGapBuffer.cpp index 6fd200efcc..13765c5f97 100644 --- a/src/kits/interface/textview_support/TextGapBuffer.cpp +++ b/src/kits/interface/textview_support/TextGapBuffer.cpp @@ -205,7 +205,7 @@ _BTextGapBuffer_::GetString(int32 fromOffset, int32 *_numBytes) uint32 numChars = UTF8CountChars(result, numBytes); uint32 charLen = UTF8CountBytes(B_UTF8_BULLET, 1); uint32 newSize = numChars * charLen; - + if ((uint32)fScratchSize < newSize) { fScratchBuffer = (char *)realloc(fScratchBuffer, newSize); fScratchSize = newSize; @@ -217,7 +217,8 @@ _BTextGapBuffer_::GetString(int32 fromOffset, int32 *_numBytes) memcpy(scratchPtr, B_UTF8_BULLET, charLen); scratchPtr += charLen; } - *_numBytes = newSize - 1; + + *_numBytes = newSize; } return result; diff --git a/src/kits/interface/textview_support/WidthBuffer.cpp b/src/kits/interface/textview_support/WidthBuffer.cpp index b045a5bcb4..3a0ec41560 100644 --- a/src/kits/interface/textview_support/WidthBuffer.cpp +++ b/src/kits/interface/textview_support/WidthBuffer.cpp @@ -148,7 +148,8 @@ float _BWidthBuffer_::StringWidth(_BTextGapBuffer_ &inBuffer, int32 fromOffset, int32 length, const BFont *inStyle) { - return StringWidth(inBuffer.Text(), fromOffset, length, inStyle); + const char* text = inBuffer.GetString(fromOffset, &length); + return StringWidth(text, 0, length, inStyle); }