From 66125fa907c64c612d397ec266c27ee6265018d6 Mon Sep 17 00:00:00 2001 From: "kipp%netscape.com" Date: Fri, 15 Oct 1999 23:36:07 +0000 Subject: [PATCH] r=troy; revised nsITextContent api to simplify it and the consumers; this is done as prep work for bug 9101 git-svn-id: svn://10.0.0.236/trunk@50895 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/content/base/public/nsITextContent.h | 5 +- mozilla/content/base/src/nsCommentNode.cpp | 9 +- .../content/base/src/nsGenericDOMDataNode.cpp | 6 +- .../content/base/src/nsGenericDOMDataNode.h | 8 +- .../html/content/src/nsAttributeContent.cpp | 9 +- mozilla/layout/base/nsCSSFrameConstructor.cpp | 69 +-- mozilla/layout/base/public/nsITextContent.h | 5 +- mozilla/layout/base/src/nsCommentNode.cpp | 9 +- .../layout/base/src/nsGenericDOMDataNode.cpp | 6 +- .../layout/base/src/nsGenericDOMDataNode.h | 8 +- mozilla/layout/generic/nsTextFrame.cpp | 96 +--- mozilla/layout/generic/nsTextTransformer.cpp | 497 ++++++++---------- mozilla/layout/generic/nsTextTransformer.h | 4 +- mozilla/layout/html/base/src/nsTextFrame.cpp | 96 +--- .../html/base/src/nsTextTransformer.cpp | 497 ++++++++---------- .../layout/html/base/src/nsTextTransformer.h | 4 +- .../html/content/src/nsAttributeContent.cpp | 9 +- .../html/style/src/nsCSSFrameConstructor.cpp | 69 +-- 18 files changed, 556 insertions(+), 850 deletions(-) diff --git a/mozilla/content/base/public/nsITextContent.h b/mozilla/content/base/public/nsITextContent.h index 41fabc50d02..92a8ad45faf 100644 --- a/mozilla/content/base/public/nsITextContent.h +++ b/mozilla/content/base/public/nsITextContent.h @@ -36,10 +36,9 @@ public: static const nsIID& GetIID() { static nsIID iid = NS_ITEXT_CONTENT_IID; return iid; } /** - * Get direct access to the text in the text content. + * Get direct access (but read only) to the text in the text content. */ - NS_IMETHOD GetText(const nsTextFragment*& aFragmentsResult, - PRInt32& aNumFragmentsResult) = 0; + NS_IMETHOD GetText(const nsTextFragment** aFragmentsResult) = 0; /** * Get the length of the text content. diff --git a/mozilla/content/base/src/nsCommentNode.cpp b/mozilla/content/base/src/nsCommentNode.cpp index 37233b091e2..321b8cd57d0 100644 --- a/mozilla/content/base/src/nsCommentNode.cpp +++ b/mozilla/content/base/src/nsCommentNode.cpp @@ -182,9 +182,8 @@ public: return NS_OK; } - NS_IMETHOD GetText(const nsTextFragment*& aFragmentsResult, - PRInt32& aNumFragmentsResult) - { return mInner.GetText(aFragmentsResult, aNumFragmentsResult); } + NS_IMETHOD GetText(const nsTextFragment** aFragmentsResult) + { return mInner.GetText(aFragmentsResult); } NS_IMETHOD GetTextLength(PRInt32* aLengthResult) { return mInner.GetTextLength(aLengthResult); } @@ -364,11 +363,11 @@ nsCommentNode::ConvertContentToXIF(nsXIFConverter& aConverter) const return res; const nsTextFragment* textFrag; - PRInt32 numFragments; + // XXX This method is const, but GetText() isn't, // XXX so cast away the constness of mInner: nsGenericDOMDataNode* inner = (nsGenericDOMDataNode*)&mInner; - res = inner->GetText(textFrag, numFragments); + res = inner->GetText(&textFrag); if (!NS_SUCCEEDED(res)) return res; #ifdef DEBUG_akkana diff --git a/mozilla/content/base/src/nsGenericDOMDataNode.cpp b/mozilla/content/base/src/nsGenericDOMDataNode.cpp index 2e93450fbcd..21d6e11b273 100644 --- a/mozilla/content/base/src/nsGenericDOMDataNode.cpp +++ b/mozilla/content/base/src/nsGenericDOMDataNode.cpp @@ -889,11 +889,9 @@ nsGenericDOMDataNode::SplitText(PRUint32 aOffset, nsIDOMText** aReturn) // Implementation of the nsITextContent interface nsresult -nsGenericDOMDataNode::GetText(const nsTextFragment*& aFragmentsResult, - PRInt32& aNumFragmentsResult) +nsGenericDOMDataNode::GetText(const nsTextFragment** aFragmentsResult) { - aFragmentsResult = &mText; - aNumFragmentsResult = 1; + *aFragmentsResult = &mText; return NS_OK; } diff --git a/mozilla/content/base/src/nsGenericDOMDataNode.h b/mozilla/content/base/src/nsGenericDOMDataNode.h index 998afbb0d22..fba6e86fae7 100644 --- a/mozilla/content/base/src/nsGenericDOMDataNode.h +++ b/mozilla/content/base/src/nsGenericDOMDataNode.h @@ -210,8 +210,7 @@ struct nsGenericDOMDataNode { nsresult SplitText(PRUint32 aOffset, nsIDOMText** aReturn); - nsresult GetText(const nsTextFragment*& aFragmentsResult, - PRInt32& aNumFragmentsResult); + nsresult GetText(const nsTextFragment** aFragmentsResult); nsresult GetTextLength(PRInt32* aLengthResult); nsresult CopyText(nsString& aResult); nsresult SetText(const PRUnichar* aBuffer, @@ -494,9 +493,8 @@ struct nsGenericDOMDataNode { * generic character data content object. */ #define NS_IMPL_ITEXTCONTENT_USING_GENERIC_DOM_DATA(_g) \ - NS_IMETHOD GetText(const nsTextFragment*& aFragmentsResult, \ - PRInt32& aNumFragmentsResult){ \ - return mInner.GetText(aFragmentsResult, aNumFragmentsResult); \ + NS_IMETHOD GetText(const nsTextFragment** aFragmentsResult) { \ + return mInner.GetText(aFragmentsResult); \ } \ NS_IMETHOD GetTextLength(PRInt32* aLengthResult) { \ return mInner.GetTextLength(aLengthResult); \ diff --git a/mozilla/content/html/content/src/nsAttributeContent.cpp b/mozilla/content/html/content/src/nsAttributeContent.cpp index f5de1bea8b9..0c3593b6153 100644 --- a/mozilla/content/html/content/src/nsAttributeContent.cpp +++ b/mozilla/content/html/content/src/nsAttributeContent.cpp @@ -168,8 +168,7 @@ public: /////////////////// // Implementation for nsITextContent - NS_IMETHOD GetText(const nsTextFragment*& aFragmentsResult, - PRInt32& aNumFragmentsResult); + NS_IMETHOD GetText(const nsTextFragment** aFragmentsResult); NS_IMETHOD GetTextLength(PRInt32* aLengthResult); NS_IMETHOD CopyText(nsString& aResult); NS_IMETHOD SetText(const PRUnichar* aBuffer, @@ -422,13 +421,11 @@ nsAttributeContent::ValidateTextFragment() } nsresult -nsAttributeContent::GetText(const nsTextFragment*& aFragmentsResult, - PRInt32& aNumFragmentsResult) +nsAttributeContent::GetText(const nsTextFragment** aFragmentsResult) { ValidateTextFragment(); if (nsnull != mContent) { - aFragmentsResult = &mText; - aNumFragmentsResult = 1; + *aFragmentsResult = &mText; return NS_OK; } // XXX is this a good idea, or should we just return an empty diff --git a/mozilla/layout/base/nsCSSFrameConstructor.cpp b/mozilla/layout/base/nsCSSFrameConstructor.cpp index f65a0d5b4ce..eb5c56e40c4 100644 --- a/mozilla/layout/base/nsCSSFrameConstructor.cpp +++ b/mozilla/layout/base/nsCSSFrameConstructor.cpp @@ -9068,52 +9068,40 @@ nsCSSFrameConstructor::InsertFirstLineFrames( // Determine how many characters in the text fragment apply to the // first letter static PRInt32 -FirstLetterCount(nsTextFragment* aFragments, PRInt32 aNumFragments) +FirstLetterCount(const nsTextFragment* aFragment) { PRInt32 count = 0; PRInt32 firstLetterLength = 0; PRBool done = PR_FALSE; - while (aNumFragments && !done) { - PRInt32 i, n = aFragments->GetLength(); - for (i = 0; i < n; i++) { - PRUnichar ch = aFragments->CharAt(i); - if (XP_IS_SPACE(ch)) { - if (firstLetterLength) { - done = PR_TRUE; - break; - } - count++; - continue; - } - // XXX I18n - if ((ch == '\'') || (ch == '\"')) { - if (firstLetterLength) { - done = PR_TRUE; - break; - } - // keep looping - firstLetterLength = 1; - } - else { - count++; + + PRInt32 i, n = aFragment->GetLength(); + for (i = 0; i < n; i++) { + PRUnichar ch = aFragment->CharAt(i); + if (XP_IS_SPACE(ch)) { + if (firstLetterLength) { done = PR_TRUE; break; } + count++; + continue; + } + // XXX I18n + if ((ch == '\'') || (ch == '\"')) { + if (firstLetterLength) { + done = PR_TRUE; + break; + } + // keep looping + firstLetterLength = 1; + } + else { + count++; + done = PR_TRUE; + break; } - aFragments++; - aNumFragments--; } - return count; -} -static PRInt32 -TotalLength(nsTextFragment* aFragments, PRInt32 aNumFragments) -{ - PRInt32 sum = 0; - while (--aNumFragments >= 0) { - sum += aFragments->GetLength(); - } - return sum; + return count; } static PRBool @@ -9125,11 +9113,10 @@ NeedFirstLetterContinuation(nsIContent* aContent) if (aContent) { nsCOMPtr tc(do_QueryInterface(aContent)); if (tc) { - nsTextFragment* frags = nsnull; - PRInt32 numFrags = 0; - tc->GetText((const nsTextFragment*&)frags, numFrags); - PRInt32 flc = FirstLetterCount(frags, numFrags); - PRInt32 tl = TotalLength(frags, numFrags); + const nsTextFragment* frag = nsnull; + tc->GetText(&frag); + PRInt32 flc = FirstLetterCount(frag); + PRInt32 tl = frag->GetLength(); if (flc < tl) { result = PR_TRUE; } diff --git a/mozilla/layout/base/public/nsITextContent.h b/mozilla/layout/base/public/nsITextContent.h index 41fabc50d02..92a8ad45faf 100644 --- a/mozilla/layout/base/public/nsITextContent.h +++ b/mozilla/layout/base/public/nsITextContent.h @@ -36,10 +36,9 @@ public: static const nsIID& GetIID() { static nsIID iid = NS_ITEXT_CONTENT_IID; return iid; } /** - * Get direct access to the text in the text content. + * Get direct access (but read only) to the text in the text content. */ - NS_IMETHOD GetText(const nsTextFragment*& aFragmentsResult, - PRInt32& aNumFragmentsResult) = 0; + NS_IMETHOD GetText(const nsTextFragment** aFragmentsResult) = 0; /** * Get the length of the text content. diff --git a/mozilla/layout/base/src/nsCommentNode.cpp b/mozilla/layout/base/src/nsCommentNode.cpp index 37233b091e2..321b8cd57d0 100644 --- a/mozilla/layout/base/src/nsCommentNode.cpp +++ b/mozilla/layout/base/src/nsCommentNode.cpp @@ -182,9 +182,8 @@ public: return NS_OK; } - NS_IMETHOD GetText(const nsTextFragment*& aFragmentsResult, - PRInt32& aNumFragmentsResult) - { return mInner.GetText(aFragmentsResult, aNumFragmentsResult); } + NS_IMETHOD GetText(const nsTextFragment** aFragmentsResult) + { return mInner.GetText(aFragmentsResult); } NS_IMETHOD GetTextLength(PRInt32* aLengthResult) { return mInner.GetTextLength(aLengthResult); } @@ -364,11 +363,11 @@ nsCommentNode::ConvertContentToXIF(nsXIFConverter& aConverter) const return res; const nsTextFragment* textFrag; - PRInt32 numFragments; + // XXX This method is const, but GetText() isn't, // XXX so cast away the constness of mInner: nsGenericDOMDataNode* inner = (nsGenericDOMDataNode*)&mInner; - res = inner->GetText(textFrag, numFragments); + res = inner->GetText(&textFrag); if (!NS_SUCCEEDED(res)) return res; #ifdef DEBUG_akkana diff --git a/mozilla/layout/base/src/nsGenericDOMDataNode.cpp b/mozilla/layout/base/src/nsGenericDOMDataNode.cpp index 2e93450fbcd..21d6e11b273 100644 --- a/mozilla/layout/base/src/nsGenericDOMDataNode.cpp +++ b/mozilla/layout/base/src/nsGenericDOMDataNode.cpp @@ -889,11 +889,9 @@ nsGenericDOMDataNode::SplitText(PRUint32 aOffset, nsIDOMText** aReturn) // Implementation of the nsITextContent interface nsresult -nsGenericDOMDataNode::GetText(const nsTextFragment*& aFragmentsResult, - PRInt32& aNumFragmentsResult) +nsGenericDOMDataNode::GetText(const nsTextFragment** aFragmentsResult) { - aFragmentsResult = &mText; - aNumFragmentsResult = 1; + *aFragmentsResult = &mText; return NS_OK; } diff --git a/mozilla/layout/base/src/nsGenericDOMDataNode.h b/mozilla/layout/base/src/nsGenericDOMDataNode.h index 998afbb0d22..fba6e86fae7 100644 --- a/mozilla/layout/base/src/nsGenericDOMDataNode.h +++ b/mozilla/layout/base/src/nsGenericDOMDataNode.h @@ -210,8 +210,7 @@ struct nsGenericDOMDataNode { nsresult SplitText(PRUint32 aOffset, nsIDOMText** aReturn); - nsresult GetText(const nsTextFragment*& aFragmentsResult, - PRInt32& aNumFragmentsResult); + nsresult GetText(const nsTextFragment** aFragmentsResult); nsresult GetTextLength(PRInt32* aLengthResult); nsresult CopyText(nsString& aResult); nsresult SetText(const PRUnichar* aBuffer, @@ -494,9 +493,8 @@ struct nsGenericDOMDataNode { * generic character data content object. */ #define NS_IMPL_ITEXTCONTENT_USING_GENERIC_DOM_DATA(_g) \ - NS_IMETHOD GetText(const nsTextFragment*& aFragmentsResult, \ - PRInt32& aNumFragmentsResult){ \ - return mInner.GetText(aFragmentsResult, aNumFragmentsResult); \ + NS_IMETHOD GetText(const nsTextFragment** aFragmentsResult) { \ + return mInner.GetText(aFragmentsResult); \ } \ NS_IMETHOD GetTextLength(PRInt32* aLengthResult) { \ return mInner.GetTextLength(aLengthResult); \ diff --git a/mozilla/layout/generic/nsTextFrame.cpp b/mozilla/layout/generic/nsTextFrame.cpp index c794025fa16..9ef4b005b83 100644 --- a/mozilla/layout/generic/nsTextFrame.cpp +++ b/mozilla/layout/generic/nsTextFrame.cpp @@ -556,7 +556,7 @@ public: PRUint32 &aWordBufLen, PRUint32 aWordBufSize); - void ToCString(nsString& aBuf, PRInt32* aContentLength) const; + void ToCString(nsString& aBuf, PRInt32* aTotalContentLength) const; protected: virtual ~nsTextFrame(); @@ -2968,53 +2968,6 @@ nsTextFrame::Reflow(nsIPresContext& aPresContext, NS_IMETHODIMP nsTextFrame::AdjustFrameSize(nscoord aExtraSpace, nscoord& aUsedSpace) { - // Get the text fragments that make up our content - const nsTextFragment* frag; - PRInt32 numFrags; - nsITextContent* tc; - if (NS_OK == mContent->QueryInterface(kITextContentIID, (void**) &tc)) { - tc->GetText(frag, numFrags); - NS_RELEASE(tc); - - // Find fragment that contains the end of the mapped content - PRInt32 endIndex = mContentOffset + mContentLength; - PRInt32 offset = 0; - const nsTextFragment* lastFrag = frag + numFrags; - while (frag < lastFrag) { - PRInt32 fragLen = frag->GetLength(); - if (endIndex <= offset + fragLen) { - offset = mContentOffset - offset; - if (frag->Is2b()) { - const PRUnichar* cp = frag->Get2b() + offset; - const PRUnichar* end = cp + mContentLength; - while (cp < end) { - PRUnichar ch = *cp++; - if (XP_IS_SPACE(ch)) { - aUsedSpace = aExtraSpace; - mRect.width += aExtraSpace; - return NS_OK; - } - } - } - else { - const unsigned char* cp = - ((const unsigned char*)frag->Get1b()) + offset; - const unsigned char* end = cp + mContentLength; - while (cp < end) { - PRUnichar ch = PRUnichar(*cp++); - if (XP_IS_SPACE(ch)) { - aUsedSpace = aExtraSpace; - mRect.width += aExtraSpace; - return NS_OK; - } - } - } - break; - } - offset += fragLen; - frag++; - } - } aUsedSpace = 0; return NS_OK; } @@ -3035,8 +2988,7 @@ nsTextFrame::TrimTrailingWhiteSpace(nsIPresContext* aPresContext, nsCOMPtr tc = do_QueryInterface(mContent); if (tc) { const nsTextFragment* frag; - PRInt32 numFrags; - tc->GetText(frag, numFrags); + tc->GetText(&frag); PRInt32 lastCharIndex = mContentOffset + mContentLength - 1; if (lastCharIndex < frag->GetLength()) { PRUnichar ch = frag->CharAt(lastCharIndex); @@ -3230,46 +3182,29 @@ nsTextFrame::ComputeWordFragmentWidth(nsIPresContext* aPresContext, // Translate the mapped content into a string that's printable void -nsTextFrame::ToCString(nsString& aBuf, PRInt32* aContentLength) const +nsTextFrame::ToCString(nsString& aBuf, PRInt32* aTotalContentLength) const { const nsTextFragment* frag; - PRInt32 numFrags; // Get the frames text content nsITextContent* tc; if (NS_OK != mContent->QueryInterface(kITextContentIID, (void**) &tc)) { return; } - tc->GetText(frag, numFrags); + tc->GetText(&frag); NS_RELEASE(tc); // Compute the total length of the text content. - PRInt32 sum = 0; - PRInt32 i, n = numFrags; - for (i = 0; i < n; i++) { - sum += frag[i].GetLength(); - } - *aContentLength = sum; + *aTotalContentLength = frag->GetLength(); // Set current fragment and current fragment offset - PRInt32 fragOffset = 0, offset = 0; - n = numFrags; - while (--n >= 0) { - if (mContentOffset < offset + frag->GetLength()) { - fragOffset = mContentOffset - offset; - break; - } - offset += frag->GetLength(); - frag++; - } - if (0 == mContentLength) { return; } - - n = mContentLength; - for (;;) { - PRUnichar ch = frag->CharAt(fragOffset); + PRInt32 fragOffset = mContentOffset; + PRInt32 n = mContentLength; + while (fragOffset < n) { + PRUnichar ch = frag->CharAt(fragOffset++); if (ch == '\r') { aBuf.Append("\\r"); } else if (ch == '\n') { @@ -3282,13 +3217,6 @@ nsTextFrame::ToCString(nsString& aBuf, PRInt32* aContentLength) const } else { aBuf.Append(ch); } - if (--n == 0) { - break; - } - if (++fragOffset == frag->GetLength()) { - frag++; - fragOffset = 0; - } } } @@ -3331,12 +3259,12 @@ nsTextFrame::List(FILE* out, PRInt32 aIndent) const fprintf(out, " [view=%p]", view); } - PRInt32 contentLength; + PRInt32 totalContentLength; nsAutoString tmp; - ToCString(tmp, &contentLength); + ToCString(tmp, &totalContentLength); // Output the first/last content offset and prev/next in flow info - PRBool isComplete = (mContentOffset + mContentLength) == contentLength; + PRBool isComplete = (mContentOffset + mContentLength) == totalContentLength; fprintf(out, "[%d,%d,%c] ", mContentOffset, mContentLength, isComplete ? 'T':'F'); diff --git a/mozilla/layout/generic/nsTextTransformer.cpp b/mozilla/layout/generic/nsTextTransformer.cpp index 751c217e9fa..6f74a63fa57 100644 --- a/mozilla/layout/generic/nsTextTransformer.cpp +++ b/mozilla/layout/generic/nsTextTransformer.cpp @@ -82,37 +82,16 @@ nsTextTransformer::Init(nsIFrame* aFrame, if (NS_OK != aContent->QueryInterface(kITextContentIID, (void**) &tc)) { return NS_OK; } - tc->GetText(mFrags, mNumFrags); + tc->GetText(&mFrag); NS_RELEASE(tc); mStartingOffset = aStartingOffset; mOffset = mStartingOffset; // Compute the total length of the text content. - PRInt32 sum = 0; - PRInt32 n = mNumFrags; - const nsTextFragment* frag = mFrags; - for (; --n >= 0; frag++) { - sum += frag->GetLength(); - } - mContentLength = sum; + mContentLength = mFrag->GetLength(); - // Set current fragment and current fragment offset - mCurrentFrag = mFrags; - mCurrentFragOffset = 0; - PRInt32 offset = 0; - n = mNumFrags; - for (frag = mFrags; --n >= 0; frag++) { - if (aStartingOffset < offset + frag->GetLength()) { - mCurrentFrag = frag; - mCurrentFragOffset = aStartingOffset - offset; - break; - } - offset += frag->GetLength(); - } - if (mNumFrags && aStartingOffset == mContentLength){ - mCurrentFrag = mFrags + (mNumFrags -1); - mCurrentFragOffset = mCurrentFrag->GetLength(); - } + // Set current fragment offset + mCurrentFragOffset = aStartingOffset; // Get the frames style and choose a transform proc const nsStyleText* styleText; @@ -167,10 +146,11 @@ nsTextTransformer::GetNextWord(PRBool aInWord, return nsnull; } + PRInt32 numChars; + PRInt32 fragLen; PRUnichar* bp = mBuffer; PRUnichar* bufEnd = mBuffer + mBufferLength; - const nsTextFragment* frag = mCurrentFrag; - const nsTextFragment* lastFrag = mFrags + mNumFrags; + const nsTextFragment* frag = mFrag; PRInt32 wordLen = 1; PRInt32 contentLen = 1; @@ -211,154 +191,141 @@ nsTextTransformer::GetNextWord(PRBool aInWord, } if (firstChar > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; *bp++ = firstChar; - if (offset == frag->GetLength()) { - mCurrentFrag = ++frag; - offset = 0; - } mCurrentFragOffset = offset; if (isWhitespace && mPreformatted) { goto really_done; } - PRInt32 numChars; - while (frag < lastFrag) { - PRInt32 fragLen = frag->GetLength(); + fragLen = frag->GetLength(); - // Scan characters in this fragment that are the same kind as the - // isWhitespace flag indicates. - if (frag->Is2b()) { - const PRUnichar* cp0 = frag->Get2b(); - const PRUnichar* end = cp0 + fragLen; - const PRUnichar* cp = cp0 + offset; - if (isWhitespace) { - while (cp < end) { - PRUnichar ch = *cp; - if (XP_IS_SPACE(ch)) { - cp++; - continue; - } - numChars = (cp - offset) - cp0; - contentLen += numChars; - mCurrentFragOffset += numChars; - goto done; + // Scan characters in this fragment that are the same kind as the + // isWhitespace flag indicates. + if (frag->Is2b()) { + const PRUnichar* cp0 = frag->Get2b(); + const PRUnichar* end = cp0 + fragLen; + const PRUnichar* cp = cp0 + offset; + if (isWhitespace) { + while (cp < end) { + PRUnichar ch = *cp; + if (XP_IS_SPACE(ch)) { + cp++; + continue; } numChars = (cp - offset) - cp0; contentLen += numChars; + mCurrentFragOffset += numChars; + goto done; } - else { - if(wordLen > 0) { - nsresult res = NS_OK; - PRBool breakBetween = PR_FALSE; - if(aForLineBreak) - res = mLineBreaker->BreakInBetween(mBuffer, wordLen, - cp, (fragLen-offset), &breakBetween); - else - res = mWordBreaker->BreakInBetween(mBuffer, wordLen, - cp, (fragLen-offset), &breakBetween); - if ( breakBetween ) - goto done; - - PRBool tryNextFrag = PR_FALSE; - PRUint32 next; - - // Find next position - - if(aForLineBreak) - res = mLineBreaker->Next(cp0, fragLen, offset, &next, &tryNextFrag); - else - res = mWordBreaker->Next(cp0, fragLen, offset, &next, &tryNextFrag); - - - numChars = (next - offset); - // check buffer size before copy - while((bp + numChars ) > bufEnd) { - PRInt32 delta = bp - mBuffer; - if(!GrowBuffer()) { - goto done; - } - bp = mBuffer + delta; - bufEnd = mBuffer + mBufferLength; - } - - wordLen += numChars; - mCurrentFragOffset += numChars; - contentLen += numChars; - end = cp + numChars; - - // 1. convert nbsp into space - // 2. check mHasMultibyte flag - // 3. copy buffer - - while(cp < end) { - PRUnichar ch = *cp++; - if (CH_NBSP == ch) ch = ' '; - if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; - *bp++ = ch; - } - if(! tryNextFrag) { - // can decide break position inside this TextFrag - goto done; - } - } - } + numChars = (cp - offset) - cp0; + contentLen += numChars; } else { - const unsigned char* cp0 = (const unsigned char*) frag->Get1b(); - const unsigned char* end = cp0 + fragLen; - const unsigned char* cp = cp0 + offset; - if (isWhitespace) { - while (cp < end) { - PRUnichar ch = PRUnichar(*cp); - if (XP_IS_SPACE(ch)) { - cp++; - continue; - } - numChars = (cp - offset) - cp0; - contentLen += numChars; - mCurrentFragOffset += numChars; + if(wordLen > 0) { + nsresult res = NS_OK; + PRBool breakBetween = PR_FALSE; + if(aForLineBreak) + res = mLineBreaker->BreakInBetween(mBuffer, wordLen, + cp, (fragLen-offset), &breakBetween); + else + res = mWordBreaker->BreakInBetween(mBuffer, wordLen, + cp, (fragLen-offset), &breakBetween); + if ( breakBetween ) goto done; + + PRBool tryNextFrag = PR_FALSE; + PRUint32 next; + + // Find next position + + if(aForLineBreak) + res = mLineBreaker->Next(cp0, fragLen, offset, &next, &tryNextFrag); + else + res = mWordBreaker->Next(cp0, fragLen, offset, &next, &tryNextFrag); + + + numChars = (next - offset); + // check buffer size before copy + while((bp + numChars ) > bufEnd) { + PRInt32 delta = bp - mBuffer; + if(!GrowBuffer()) { + goto done; + } + bp = mBuffer + delta; + bufEnd = mBuffer + mBufferLength; + } + + wordLen += numChars; + mCurrentFragOffset += numChars; + contentLen += numChars; + end = cp + numChars; + + // 1. convert nbsp into space + // 2. check mHasMultibyte flag + // 3. copy buffer + + while(cp < end) { + PRUnichar ch = *cp++; + if (CH_NBSP == ch) ch = ' '; + if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; + *bp++ = ch; + } + if(! tryNextFrag) { + // can decide break position inside this TextFrag + goto done; + } + } + } + } + else { + const unsigned char* cp0 = (const unsigned char*) frag->Get1b(); + const unsigned char* end = cp0 + fragLen; + const unsigned char* cp = cp0 + offset; + if (isWhitespace) { + while (cp < end) { + PRUnichar ch = PRUnichar(*cp); + if (XP_IS_SPACE(ch)) { + cp++; + continue; } numChars = (cp - offset) - cp0; contentLen += numChars; + mCurrentFragOffset += numChars; + goto done; } - else { - while (cp < end) { - PRUnichar ch = PRUnichar(*cp); - if (!XP_IS_SPACE(ch)) { - if (CH_NBSP == ch) ch = ' '; - if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; - cp++; + numChars = (cp - offset) - cp0; + contentLen += numChars; + } + else { + while (cp < end) { + PRUnichar ch = PRUnichar(*cp); + if (!XP_IS_SPACE(ch)) { + if (CH_NBSP == ch) ch = ' '; + if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; + cp++; - // Store character in buffer; grow buffer if we have to - NS_ASSERTION(bp < bufEnd, "whoops"); - *bp++ = ch; - if (bp == bufEnd) { - PRInt32 delta = bp - mBuffer; - if (!GrowBuffer()) { - goto done; - } - bp = mBuffer + delta; - bufEnd = mBuffer + mBufferLength; + // Store character in buffer; grow buffer if we have to + NS_ASSERTION(bp < bufEnd, "whoops"); + *bp++ = ch; + if (bp == bufEnd) { + PRInt32 delta = bp - mBuffer; + if (!GrowBuffer()) { + goto done; } - continue; + bp = mBuffer + delta; + bufEnd = mBuffer + mBufferLength; } - numChars = (cp - offset) - cp0; - wordLen += numChars; - contentLen += numChars; - mCurrentFragOffset += numChars; - goto done; + continue; } numChars = (cp - offset) - cp0; wordLen += numChars; contentLen += numChars; + mCurrentFragOffset += numChars; + goto done; } + numChars = (cp - offset) - cp0; + wordLen += numChars; + contentLen += numChars; } - - // Advance to next text fragment - frag++; - mCurrentFrag = frag; - mCurrentFragOffset = 0; - offset = 0; } done:; @@ -411,8 +378,7 @@ nsTextTransformer::GetPrevWord(PRBool aInWord, PRUnichar* bp = mBuffer+mBufferLength-1; PRUnichar* bufEnd = mBuffer ; - const nsTextFragment* frag = mCurrentFrag; - const nsTextFragment* lastFrag = mFrags;//1st is the last + const nsTextFragment* frag = mFrag; PRInt32 wordLen = 1; PRInt32 contentLen = 1; @@ -461,164 +427,147 @@ nsTextTransformer::GetPrevWord(PRBool aInWord, *bp-- = firstChar; mCurrentFragOffset = offset +1; if (offset < 0) { - if (mCurrentFrag == mFrags){ - goto really_done; - } - mCurrentFrag = --frag; - offset = mCurrentFrag->GetLength()-1; + goto really_done; } if (isWhitespace && mPreformatted) { goto really_done; } PRInt32 numChars; - do { - // Scan characters in this fragment that are the same kind as the - // isWhitespace flag indicates. - if (frag->Is2b()) { - const PRUnichar* cp0 = frag->Get2b(); - const PRUnichar* end = cp0; - const PRUnichar* cp = cp0 + offset; - if (isWhitespace) { - while (cp > end) { - PRUnichar ch = *cp; - if (XP_IS_SPACE(ch)) { - cp--; - continue; - } - numChars = (cp0 + offset) - cp; - contentLen += numChars; - mCurrentFragOffset -= numChars; - goto done; + + // Scan characters in this fragment that are the same kind as the + // isWhitespace flag indicates. + if (frag->Is2b()) { + const PRUnichar* cp0 = frag->Get2b(); + const PRUnichar* end = cp0; + const PRUnichar* cp = cp0 + offset; + if (isWhitespace) { + while (cp > end) { + PRUnichar ch = *cp; + if (XP_IS_SPACE(ch)) { + cp--; + continue; } numChars = (cp0 + offset) - cp; contentLen += numChars; + mCurrentFragOffset -= numChars; + goto done; } - else { - if(wordLen > 0) { - nsresult res = NS_OK; - PRBool breakBetween = PR_FALSE; - if(aForLineBreak) - res = mLineBreaker->BreakInBetween( - cp0, offset+1, - &(mBuffer[mBufferLength-wordLen]), wordLen, - &breakBetween); - else - res = mWordBreaker->BreakInBetween( - cp0, offset+1, - &(mBuffer[mBufferLength-wordLen]), wordLen, - &breakBetween); - if ( breakBetween ) - goto done; + numChars = (cp0 + offset) - cp; + contentLen += numChars; + } + else { + if(wordLen > 0) { + nsresult res = NS_OK; + PRBool breakBetween = PR_FALSE; + if(aForLineBreak) + res = mLineBreaker->BreakInBetween( + cp0, offset+1, + &(mBuffer[mBufferLength-wordLen]), wordLen, + &breakBetween); + else + res = mWordBreaker->BreakInBetween( + cp0, offset+1, + &(mBuffer[mBufferLength-wordLen]), wordLen, + &breakBetween); + if ( breakBetween ) + goto done; - PRBool tryPrevFrag = PR_FALSE; - PRUint32 prev; + PRBool tryPrevFrag = PR_FALSE; + PRUint32 prev; - // Find prev position + // Find prev position - if(aForLineBreak) - res = mLineBreaker->Prev(cp0, offset, offset, &prev, &tryPrevFrag); - else - res = mWordBreaker->Prev(cp0, offset, offset, &prev, &tryPrevFrag); + if(aForLineBreak) + res = mLineBreaker->Prev(cp0, offset, offset, &prev, &tryPrevFrag); + else + res = mWordBreaker->Prev(cp0, offset, offset, &prev, &tryPrevFrag); - numChars = (offset - prev)+1; - // check buffer size before copy - while((bp - numChars ) < bufEnd) { - PRInt32 delta = (&(mBuffer[mBufferLength])) - bp -1 ; - if(!GrowBuffer()) { - goto done; - } - bp = (&(mBuffer[mBufferLength])) - delta - 1; - bufEnd = mBuffer; - } + numChars = (offset - prev)+1; + // check buffer size before copy + while((bp - numChars ) < bufEnd) { + PRInt32 delta = (&(mBuffer[mBufferLength])) - bp -1 ; + if(!GrowBuffer()) { + goto done; + } + bp = (&(mBuffer[mBufferLength])) - delta - 1; + bufEnd = mBuffer; + } - wordLen += numChars; - mCurrentFragOffset -= numChars; - contentLen += numChars; - end = cp - numChars; + wordLen += numChars; + mCurrentFragOffset -= numChars; + contentLen += numChars; + end = cp - numChars; - // 1. convert nbsp into space - // 2. check mHasMultibyte flag - // 3. copy buffer + // 1. convert nbsp into space + // 2. check mHasMultibyte flag + // 3. copy buffer - while(cp > end) { - PRUnichar ch = *cp--; - if (CH_NBSP == ch) ch = ' '; - if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; - *bp-- = ch; - } - if(! tryPrevFrag) { - // can decide break position inside this TextFrag - goto done; - } + while(cp > end) { + PRUnichar ch = *cp--; + if (CH_NBSP == ch) ch = ' '; + if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; + *bp-- = ch; + } + if(! tryPrevFrag) { + // can decide break position inside this TextFrag + goto done; } } } - else { - const unsigned char* cp0 = (const unsigned char*) frag->Get1b(); - const unsigned char* end = cp0; - const unsigned char* cp = cp0 + offset; - if (isWhitespace) { - while (cp > end) { - PRUnichar ch = PRUnichar(*cp); - if (XP_IS_SPACE(ch)) { - cp--; - continue; - } - numChars = (cp0 + offset) - cp; - contentLen += numChars; - mCurrentFragOffset -= numChars; - goto done; + } + else { + const unsigned char* cp0 = (const unsigned char*) frag->Get1b(); + const unsigned char* end = cp0; + const unsigned char* cp = cp0 + offset; + if (isWhitespace) { + while (cp > end) { + PRUnichar ch = PRUnichar(*cp); + if (XP_IS_SPACE(ch)) { + cp--; + continue; } numChars = (cp0 + offset) - cp; contentLen += numChars; + mCurrentFragOffset -= numChars; + goto done; } - else { - while (cp >= end) { - PRUnichar ch = PRUnichar(*cp); - if (!XP_IS_SPACE(ch)) { - if (CH_NBSP == ch) ch = ' '; - if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; - cp--; + numChars = (cp0 + offset) - cp; + contentLen += numChars; + } + else { + while (cp >= end) { + PRUnichar ch = PRUnichar(*cp); + if (!XP_IS_SPACE(ch)) { + if (CH_NBSP == ch) ch = ' '; + if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; + cp--; - // Store character in buffer; grow buffer if we have to - NS_ASSERTION(bp > bufEnd, "whoops"); - *bp-- = ch; - if (bp == bufEnd) { - PRInt32 delta = (&(mBuffer[mBufferLength])) - bp - 1; - if (!GrowBuffer(PR_FALSE)) { - goto done; - } - bp = (&(mBuffer[mBufferLength])) - delta - 1; - bufEnd = mBuffer; + // Store character in buffer; grow buffer if we have to + NS_ASSERTION(bp > bufEnd, "whoops"); + *bp-- = ch; + if (bp == bufEnd) { + PRInt32 delta = (&(mBuffer[mBufferLength])) - bp - 1; + if (!GrowBuffer(PR_FALSE)) { + goto done; } - continue; + bp = (&(mBuffer[mBufferLength])) - delta - 1; + bufEnd = mBuffer; } - numChars = (cp0 + offset) - cp; - wordLen += numChars; - contentLen += numChars; - mCurrentFragOffset -= numChars; - goto done; + continue; } numChars = (cp0 + offset) - cp; wordLen += numChars; contentLen += numChars; + mCurrentFragOffset -= numChars; + goto done; } + numChars = (cp0 + offset) - cp; + wordLen += numChars; + contentLen += numChars; } - - // Advance to next text fragment - if (frag != lastFrag) - { - frag--; - mCurrentFrag = frag; - mCurrentFragOffset = mCurrentFrag->GetLength()-1; - offset = mCurrentFragOffset; - } - else - mCurrentFragOffset = 0; } - while (frag > lastFrag); done:; diff --git a/mozilla/layout/generic/nsTextTransformer.h b/mozilla/layout/generic/nsTextTransformer.h index 3c11dae6d01..433f18cf059 100644 --- a/mozilla/layout/generic/nsTextTransformer.h +++ b/mozilla/layout/generic/nsTextTransformer.h @@ -102,9 +102,7 @@ protected: PRInt32 mStartingOffset; PRInt32 mOffset; - const nsTextFragment* mFrags; - PRInt32 mNumFrags; - const nsTextFragment* mCurrentFrag; + const nsTextFragment* mFrag; PRInt32 mCurrentFragOffset; PRUint8 mTextTransform; diff --git a/mozilla/layout/html/base/src/nsTextFrame.cpp b/mozilla/layout/html/base/src/nsTextFrame.cpp index c794025fa16..9ef4b005b83 100644 --- a/mozilla/layout/html/base/src/nsTextFrame.cpp +++ b/mozilla/layout/html/base/src/nsTextFrame.cpp @@ -556,7 +556,7 @@ public: PRUint32 &aWordBufLen, PRUint32 aWordBufSize); - void ToCString(nsString& aBuf, PRInt32* aContentLength) const; + void ToCString(nsString& aBuf, PRInt32* aTotalContentLength) const; protected: virtual ~nsTextFrame(); @@ -2968,53 +2968,6 @@ nsTextFrame::Reflow(nsIPresContext& aPresContext, NS_IMETHODIMP nsTextFrame::AdjustFrameSize(nscoord aExtraSpace, nscoord& aUsedSpace) { - // Get the text fragments that make up our content - const nsTextFragment* frag; - PRInt32 numFrags; - nsITextContent* tc; - if (NS_OK == mContent->QueryInterface(kITextContentIID, (void**) &tc)) { - tc->GetText(frag, numFrags); - NS_RELEASE(tc); - - // Find fragment that contains the end of the mapped content - PRInt32 endIndex = mContentOffset + mContentLength; - PRInt32 offset = 0; - const nsTextFragment* lastFrag = frag + numFrags; - while (frag < lastFrag) { - PRInt32 fragLen = frag->GetLength(); - if (endIndex <= offset + fragLen) { - offset = mContentOffset - offset; - if (frag->Is2b()) { - const PRUnichar* cp = frag->Get2b() + offset; - const PRUnichar* end = cp + mContentLength; - while (cp < end) { - PRUnichar ch = *cp++; - if (XP_IS_SPACE(ch)) { - aUsedSpace = aExtraSpace; - mRect.width += aExtraSpace; - return NS_OK; - } - } - } - else { - const unsigned char* cp = - ((const unsigned char*)frag->Get1b()) + offset; - const unsigned char* end = cp + mContentLength; - while (cp < end) { - PRUnichar ch = PRUnichar(*cp++); - if (XP_IS_SPACE(ch)) { - aUsedSpace = aExtraSpace; - mRect.width += aExtraSpace; - return NS_OK; - } - } - } - break; - } - offset += fragLen; - frag++; - } - } aUsedSpace = 0; return NS_OK; } @@ -3035,8 +2988,7 @@ nsTextFrame::TrimTrailingWhiteSpace(nsIPresContext* aPresContext, nsCOMPtr tc = do_QueryInterface(mContent); if (tc) { const nsTextFragment* frag; - PRInt32 numFrags; - tc->GetText(frag, numFrags); + tc->GetText(&frag); PRInt32 lastCharIndex = mContentOffset + mContentLength - 1; if (lastCharIndex < frag->GetLength()) { PRUnichar ch = frag->CharAt(lastCharIndex); @@ -3230,46 +3182,29 @@ nsTextFrame::ComputeWordFragmentWidth(nsIPresContext* aPresContext, // Translate the mapped content into a string that's printable void -nsTextFrame::ToCString(nsString& aBuf, PRInt32* aContentLength) const +nsTextFrame::ToCString(nsString& aBuf, PRInt32* aTotalContentLength) const { const nsTextFragment* frag; - PRInt32 numFrags; // Get the frames text content nsITextContent* tc; if (NS_OK != mContent->QueryInterface(kITextContentIID, (void**) &tc)) { return; } - tc->GetText(frag, numFrags); + tc->GetText(&frag); NS_RELEASE(tc); // Compute the total length of the text content. - PRInt32 sum = 0; - PRInt32 i, n = numFrags; - for (i = 0; i < n; i++) { - sum += frag[i].GetLength(); - } - *aContentLength = sum; + *aTotalContentLength = frag->GetLength(); // Set current fragment and current fragment offset - PRInt32 fragOffset = 0, offset = 0; - n = numFrags; - while (--n >= 0) { - if (mContentOffset < offset + frag->GetLength()) { - fragOffset = mContentOffset - offset; - break; - } - offset += frag->GetLength(); - frag++; - } - if (0 == mContentLength) { return; } - - n = mContentLength; - for (;;) { - PRUnichar ch = frag->CharAt(fragOffset); + PRInt32 fragOffset = mContentOffset; + PRInt32 n = mContentLength; + while (fragOffset < n) { + PRUnichar ch = frag->CharAt(fragOffset++); if (ch == '\r') { aBuf.Append("\\r"); } else if (ch == '\n') { @@ -3282,13 +3217,6 @@ nsTextFrame::ToCString(nsString& aBuf, PRInt32* aContentLength) const } else { aBuf.Append(ch); } - if (--n == 0) { - break; - } - if (++fragOffset == frag->GetLength()) { - frag++; - fragOffset = 0; - } } } @@ -3331,12 +3259,12 @@ nsTextFrame::List(FILE* out, PRInt32 aIndent) const fprintf(out, " [view=%p]", view); } - PRInt32 contentLength; + PRInt32 totalContentLength; nsAutoString tmp; - ToCString(tmp, &contentLength); + ToCString(tmp, &totalContentLength); // Output the first/last content offset and prev/next in flow info - PRBool isComplete = (mContentOffset + mContentLength) == contentLength; + PRBool isComplete = (mContentOffset + mContentLength) == totalContentLength; fprintf(out, "[%d,%d,%c] ", mContentOffset, mContentLength, isComplete ? 'T':'F'); diff --git a/mozilla/layout/html/base/src/nsTextTransformer.cpp b/mozilla/layout/html/base/src/nsTextTransformer.cpp index 751c217e9fa..6f74a63fa57 100644 --- a/mozilla/layout/html/base/src/nsTextTransformer.cpp +++ b/mozilla/layout/html/base/src/nsTextTransformer.cpp @@ -82,37 +82,16 @@ nsTextTransformer::Init(nsIFrame* aFrame, if (NS_OK != aContent->QueryInterface(kITextContentIID, (void**) &tc)) { return NS_OK; } - tc->GetText(mFrags, mNumFrags); + tc->GetText(&mFrag); NS_RELEASE(tc); mStartingOffset = aStartingOffset; mOffset = mStartingOffset; // Compute the total length of the text content. - PRInt32 sum = 0; - PRInt32 n = mNumFrags; - const nsTextFragment* frag = mFrags; - for (; --n >= 0; frag++) { - sum += frag->GetLength(); - } - mContentLength = sum; + mContentLength = mFrag->GetLength(); - // Set current fragment and current fragment offset - mCurrentFrag = mFrags; - mCurrentFragOffset = 0; - PRInt32 offset = 0; - n = mNumFrags; - for (frag = mFrags; --n >= 0; frag++) { - if (aStartingOffset < offset + frag->GetLength()) { - mCurrentFrag = frag; - mCurrentFragOffset = aStartingOffset - offset; - break; - } - offset += frag->GetLength(); - } - if (mNumFrags && aStartingOffset == mContentLength){ - mCurrentFrag = mFrags + (mNumFrags -1); - mCurrentFragOffset = mCurrentFrag->GetLength(); - } + // Set current fragment offset + mCurrentFragOffset = aStartingOffset; // Get the frames style and choose a transform proc const nsStyleText* styleText; @@ -167,10 +146,11 @@ nsTextTransformer::GetNextWord(PRBool aInWord, return nsnull; } + PRInt32 numChars; + PRInt32 fragLen; PRUnichar* bp = mBuffer; PRUnichar* bufEnd = mBuffer + mBufferLength; - const nsTextFragment* frag = mCurrentFrag; - const nsTextFragment* lastFrag = mFrags + mNumFrags; + const nsTextFragment* frag = mFrag; PRInt32 wordLen = 1; PRInt32 contentLen = 1; @@ -211,154 +191,141 @@ nsTextTransformer::GetNextWord(PRBool aInWord, } if (firstChar > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; *bp++ = firstChar; - if (offset == frag->GetLength()) { - mCurrentFrag = ++frag; - offset = 0; - } mCurrentFragOffset = offset; if (isWhitespace && mPreformatted) { goto really_done; } - PRInt32 numChars; - while (frag < lastFrag) { - PRInt32 fragLen = frag->GetLength(); + fragLen = frag->GetLength(); - // Scan characters in this fragment that are the same kind as the - // isWhitespace flag indicates. - if (frag->Is2b()) { - const PRUnichar* cp0 = frag->Get2b(); - const PRUnichar* end = cp0 + fragLen; - const PRUnichar* cp = cp0 + offset; - if (isWhitespace) { - while (cp < end) { - PRUnichar ch = *cp; - if (XP_IS_SPACE(ch)) { - cp++; - continue; - } - numChars = (cp - offset) - cp0; - contentLen += numChars; - mCurrentFragOffset += numChars; - goto done; + // Scan characters in this fragment that are the same kind as the + // isWhitespace flag indicates. + if (frag->Is2b()) { + const PRUnichar* cp0 = frag->Get2b(); + const PRUnichar* end = cp0 + fragLen; + const PRUnichar* cp = cp0 + offset; + if (isWhitespace) { + while (cp < end) { + PRUnichar ch = *cp; + if (XP_IS_SPACE(ch)) { + cp++; + continue; } numChars = (cp - offset) - cp0; contentLen += numChars; + mCurrentFragOffset += numChars; + goto done; } - else { - if(wordLen > 0) { - nsresult res = NS_OK; - PRBool breakBetween = PR_FALSE; - if(aForLineBreak) - res = mLineBreaker->BreakInBetween(mBuffer, wordLen, - cp, (fragLen-offset), &breakBetween); - else - res = mWordBreaker->BreakInBetween(mBuffer, wordLen, - cp, (fragLen-offset), &breakBetween); - if ( breakBetween ) - goto done; - - PRBool tryNextFrag = PR_FALSE; - PRUint32 next; - - // Find next position - - if(aForLineBreak) - res = mLineBreaker->Next(cp0, fragLen, offset, &next, &tryNextFrag); - else - res = mWordBreaker->Next(cp0, fragLen, offset, &next, &tryNextFrag); - - - numChars = (next - offset); - // check buffer size before copy - while((bp + numChars ) > bufEnd) { - PRInt32 delta = bp - mBuffer; - if(!GrowBuffer()) { - goto done; - } - bp = mBuffer + delta; - bufEnd = mBuffer + mBufferLength; - } - - wordLen += numChars; - mCurrentFragOffset += numChars; - contentLen += numChars; - end = cp + numChars; - - // 1. convert nbsp into space - // 2. check mHasMultibyte flag - // 3. copy buffer - - while(cp < end) { - PRUnichar ch = *cp++; - if (CH_NBSP == ch) ch = ' '; - if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; - *bp++ = ch; - } - if(! tryNextFrag) { - // can decide break position inside this TextFrag - goto done; - } - } - } + numChars = (cp - offset) - cp0; + contentLen += numChars; } else { - const unsigned char* cp0 = (const unsigned char*) frag->Get1b(); - const unsigned char* end = cp0 + fragLen; - const unsigned char* cp = cp0 + offset; - if (isWhitespace) { - while (cp < end) { - PRUnichar ch = PRUnichar(*cp); - if (XP_IS_SPACE(ch)) { - cp++; - continue; - } - numChars = (cp - offset) - cp0; - contentLen += numChars; - mCurrentFragOffset += numChars; + if(wordLen > 0) { + nsresult res = NS_OK; + PRBool breakBetween = PR_FALSE; + if(aForLineBreak) + res = mLineBreaker->BreakInBetween(mBuffer, wordLen, + cp, (fragLen-offset), &breakBetween); + else + res = mWordBreaker->BreakInBetween(mBuffer, wordLen, + cp, (fragLen-offset), &breakBetween); + if ( breakBetween ) goto done; + + PRBool tryNextFrag = PR_FALSE; + PRUint32 next; + + // Find next position + + if(aForLineBreak) + res = mLineBreaker->Next(cp0, fragLen, offset, &next, &tryNextFrag); + else + res = mWordBreaker->Next(cp0, fragLen, offset, &next, &tryNextFrag); + + + numChars = (next - offset); + // check buffer size before copy + while((bp + numChars ) > bufEnd) { + PRInt32 delta = bp - mBuffer; + if(!GrowBuffer()) { + goto done; + } + bp = mBuffer + delta; + bufEnd = mBuffer + mBufferLength; + } + + wordLen += numChars; + mCurrentFragOffset += numChars; + contentLen += numChars; + end = cp + numChars; + + // 1. convert nbsp into space + // 2. check mHasMultibyte flag + // 3. copy buffer + + while(cp < end) { + PRUnichar ch = *cp++; + if (CH_NBSP == ch) ch = ' '; + if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; + *bp++ = ch; + } + if(! tryNextFrag) { + // can decide break position inside this TextFrag + goto done; + } + } + } + } + else { + const unsigned char* cp0 = (const unsigned char*) frag->Get1b(); + const unsigned char* end = cp0 + fragLen; + const unsigned char* cp = cp0 + offset; + if (isWhitespace) { + while (cp < end) { + PRUnichar ch = PRUnichar(*cp); + if (XP_IS_SPACE(ch)) { + cp++; + continue; } numChars = (cp - offset) - cp0; contentLen += numChars; + mCurrentFragOffset += numChars; + goto done; } - else { - while (cp < end) { - PRUnichar ch = PRUnichar(*cp); - if (!XP_IS_SPACE(ch)) { - if (CH_NBSP == ch) ch = ' '; - if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; - cp++; + numChars = (cp - offset) - cp0; + contentLen += numChars; + } + else { + while (cp < end) { + PRUnichar ch = PRUnichar(*cp); + if (!XP_IS_SPACE(ch)) { + if (CH_NBSP == ch) ch = ' '; + if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; + cp++; - // Store character in buffer; grow buffer if we have to - NS_ASSERTION(bp < bufEnd, "whoops"); - *bp++ = ch; - if (bp == bufEnd) { - PRInt32 delta = bp - mBuffer; - if (!GrowBuffer()) { - goto done; - } - bp = mBuffer + delta; - bufEnd = mBuffer + mBufferLength; + // Store character in buffer; grow buffer if we have to + NS_ASSERTION(bp < bufEnd, "whoops"); + *bp++ = ch; + if (bp == bufEnd) { + PRInt32 delta = bp - mBuffer; + if (!GrowBuffer()) { + goto done; } - continue; + bp = mBuffer + delta; + bufEnd = mBuffer + mBufferLength; } - numChars = (cp - offset) - cp0; - wordLen += numChars; - contentLen += numChars; - mCurrentFragOffset += numChars; - goto done; + continue; } numChars = (cp - offset) - cp0; wordLen += numChars; contentLen += numChars; + mCurrentFragOffset += numChars; + goto done; } + numChars = (cp - offset) - cp0; + wordLen += numChars; + contentLen += numChars; } - - // Advance to next text fragment - frag++; - mCurrentFrag = frag; - mCurrentFragOffset = 0; - offset = 0; } done:; @@ -411,8 +378,7 @@ nsTextTransformer::GetPrevWord(PRBool aInWord, PRUnichar* bp = mBuffer+mBufferLength-1; PRUnichar* bufEnd = mBuffer ; - const nsTextFragment* frag = mCurrentFrag; - const nsTextFragment* lastFrag = mFrags;//1st is the last + const nsTextFragment* frag = mFrag; PRInt32 wordLen = 1; PRInt32 contentLen = 1; @@ -461,164 +427,147 @@ nsTextTransformer::GetPrevWord(PRBool aInWord, *bp-- = firstChar; mCurrentFragOffset = offset +1; if (offset < 0) { - if (mCurrentFrag == mFrags){ - goto really_done; - } - mCurrentFrag = --frag; - offset = mCurrentFrag->GetLength()-1; + goto really_done; } if (isWhitespace && mPreformatted) { goto really_done; } PRInt32 numChars; - do { - // Scan characters in this fragment that are the same kind as the - // isWhitespace flag indicates. - if (frag->Is2b()) { - const PRUnichar* cp0 = frag->Get2b(); - const PRUnichar* end = cp0; - const PRUnichar* cp = cp0 + offset; - if (isWhitespace) { - while (cp > end) { - PRUnichar ch = *cp; - if (XP_IS_SPACE(ch)) { - cp--; - continue; - } - numChars = (cp0 + offset) - cp; - contentLen += numChars; - mCurrentFragOffset -= numChars; - goto done; + + // Scan characters in this fragment that are the same kind as the + // isWhitespace flag indicates. + if (frag->Is2b()) { + const PRUnichar* cp0 = frag->Get2b(); + const PRUnichar* end = cp0; + const PRUnichar* cp = cp0 + offset; + if (isWhitespace) { + while (cp > end) { + PRUnichar ch = *cp; + if (XP_IS_SPACE(ch)) { + cp--; + continue; } numChars = (cp0 + offset) - cp; contentLen += numChars; + mCurrentFragOffset -= numChars; + goto done; } - else { - if(wordLen > 0) { - nsresult res = NS_OK; - PRBool breakBetween = PR_FALSE; - if(aForLineBreak) - res = mLineBreaker->BreakInBetween( - cp0, offset+1, - &(mBuffer[mBufferLength-wordLen]), wordLen, - &breakBetween); - else - res = mWordBreaker->BreakInBetween( - cp0, offset+1, - &(mBuffer[mBufferLength-wordLen]), wordLen, - &breakBetween); - if ( breakBetween ) - goto done; + numChars = (cp0 + offset) - cp; + contentLen += numChars; + } + else { + if(wordLen > 0) { + nsresult res = NS_OK; + PRBool breakBetween = PR_FALSE; + if(aForLineBreak) + res = mLineBreaker->BreakInBetween( + cp0, offset+1, + &(mBuffer[mBufferLength-wordLen]), wordLen, + &breakBetween); + else + res = mWordBreaker->BreakInBetween( + cp0, offset+1, + &(mBuffer[mBufferLength-wordLen]), wordLen, + &breakBetween); + if ( breakBetween ) + goto done; - PRBool tryPrevFrag = PR_FALSE; - PRUint32 prev; + PRBool tryPrevFrag = PR_FALSE; + PRUint32 prev; - // Find prev position + // Find prev position - if(aForLineBreak) - res = mLineBreaker->Prev(cp0, offset, offset, &prev, &tryPrevFrag); - else - res = mWordBreaker->Prev(cp0, offset, offset, &prev, &tryPrevFrag); + if(aForLineBreak) + res = mLineBreaker->Prev(cp0, offset, offset, &prev, &tryPrevFrag); + else + res = mWordBreaker->Prev(cp0, offset, offset, &prev, &tryPrevFrag); - numChars = (offset - prev)+1; - // check buffer size before copy - while((bp - numChars ) < bufEnd) { - PRInt32 delta = (&(mBuffer[mBufferLength])) - bp -1 ; - if(!GrowBuffer()) { - goto done; - } - bp = (&(mBuffer[mBufferLength])) - delta - 1; - bufEnd = mBuffer; - } + numChars = (offset - prev)+1; + // check buffer size before copy + while((bp - numChars ) < bufEnd) { + PRInt32 delta = (&(mBuffer[mBufferLength])) - bp -1 ; + if(!GrowBuffer()) { + goto done; + } + bp = (&(mBuffer[mBufferLength])) - delta - 1; + bufEnd = mBuffer; + } - wordLen += numChars; - mCurrentFragOffset -= numChars; - contentLen += numChars; - end = cp - numChars; + wordLen += numChars; + mCurrentFragOffset -= numChars; + contentLen += numChars; + end = cp - numChars; - // 1. convert nbsp into space - // 2. check mHasMultibyte flag - // 3. copy buffer + // 1. convert nbsp into space + // 2. check mHasMultibyte flag + // 3. copy buffer - while(cp > end) { - PRUnichar ch = *cp--; - if (CH_NBSP == ch) ch = ' '; - if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; - *bp-- = ch; - } - if(! tryPrevFrag) { - // can decide break position inside this TextFrag - goto done; - } + while(cp > end) { + PRUnichar ch = *cp--; + if (CH_NBSP == ch) ch = ' '; + if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; + *bp-- = ch; + } + if(! tryPrevFrag) { + // can decide break position inside this TextFrag + goto done; } } } - else { - const unsigned char* cp0 = (const unsigned char*) frag->Get1b(); - const unsigned char* end = cp0; - const unsigned char* cp = cp0 + offset; - if (isWhitespace) { - while (cp > end) { - PRUnichar ch = PRUnichar(*cp); - if (XP_IS_SPACE(ch)) { - cp--; - continue; - } - numChars = (cp0 + offset) - cp; - contentLen += numChars; - mCurrentFragOffset -= numChars; - goto done; + } + else { + const unsigned char* cp0 = (const unsigned char*) frag->Get1b(); + const unsigned char* end = cp0; + const unsigned char* cp = cp0 + offset; + if (isWhitespace) { + while (cp > end) { + PRUnichar ch = PRUnichar(*cp); + if (XP_IS_SPACE(ch)) { + cp--; + continue; } numChars = (cp0 + offset) - cp; contentLen += numChars; + mCurrentFragOffset -= numChars; + goto done; } - else { - while (cp >= end) { - PRUnichar ch = PRUnichar(*cp); - if (!XP_IS_SPACE(ch)) { - if (CH_NBSP == ch) ch = ' '; - if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; - cp--; + numChars = (cp0 + offset) - cp; + contentLen += numChars; + } + else { + while (cp >= end) { + PRUnichar ch = PRUnichar(*cp); + if (!XP_IS_SPACE(ch)) { + if (CH_NBSP == ch) ch = ' '; + if (ch > MAX_UNIBYTE) mHasMultibyte = PR_TRUE; + cp--; - // Store character in buffer; grow buffer if we have to - NS_ASSERTION(bp > bufEnd, "whoops"); - *bp-- = ch; - if (bp == bufEnd) { - PRInt32 delta = (&(mBuffer[mBufferLength])) - bp - 1; - if (!GrowBuffer(PR_FALSE)) { - goto done; - } - bp = (&(mBuffer[mBufferLength])) - delta - 1; - bufEnd = mBuffer; + // Store character in buffer; grow buffer if we have to + NS_ASSERTION(bp > bufEnd, "whoops"); + *bp-- = ch; + if (bp == bufEnd) { + PRInt32 delta = (&(mBuffer[mBufferLength])) - bp - 1; + if (!GrowBuffer(PR_FALSE)) { + goto done; } - continue; + bp = (&(mBuffer[mBufferLength])) - delta - 1; + bufEnd = mBuffer; } - numChars = (cp0 + offset) - cp; - wordLen += numChars; - contentLen += numChars; - mCurrentFragOffset -= numChars; - goto done; + continue; } numChars = (cp0 + offset) - cp; wordLen += numChars; contentLen += numChars; + mCurrentFragOffset -= numChars; + goto done; } + numChars = (cp0 + offset) - cp; + wordLen += numChars; + contentLen += numChars; } - - // Advance to next text fragment - if (frag != lastFrag) - { - frag--; - mCurrentFrag = frag; - mCurrentFragOffset = mCurrentFrag->GetLength()-1; - offset = mCurrentFragOffset; - } - else - mCurrentFragOffset = 0; } - while (frag > lastFrag); done:; diff --git a/mozilla/layout/html/base/src/nsTextTransformer.h b/mozilla/layout/html/base/src/nsTextTransformer.h index 3c11dae6d01..433f18cf059 100644 --- a/mozilla/layout/html/base/src/nsTextTransformer.h +++ b/mozilla/layout/html/base/src/nsTextTransformer.h @@ -102,9 +102,7 @@ protected: PRInt32 mStartingOffset; PRInt32 mOffset; - const nsTextFragment* mFrags; - PRInt32 mNumFrags; - const nsTextFragment* mCurrentFrag; + const nsTextFragment* mFrag; PRInt32 mCurrentFragOffset; PRUint8 mTextTransform; diff --git a/mozilla/layout/html/content/src/nsAttributeContent.cpp b/mozilla/layout/html/content/src/nsAttributeContent.cpp index f5de1bea8b9..0c3593b6153 100644 --- a/mozilla/layout/html/content/src/nsAttributeContent.cpp +++ b/mozilla/layout/html/content/src/nsAttributeContent.cpp @@ -168,8 +168,7 @@ public: /////////////////// // Implementation for nsITextContent - NS_IMETHOD GetText(const nsTextFragment*& aFragmentsResult, - PRInt32& aNumFragmentsResult); + NS_IMETHOD GetText(const nsTextFragment** aFragmentsResult); NS_IMETHOD GetTextLength(PRInt32* aLengthResult); NS_IMETHOD CopyText(nsString& aResult); NS_IMETHOD SetText(const PRUnichar* aBuffer, @@ -422,13 +421,11 @@ nsAttributeContent::ValidateTextFragment() } nsresult -nsAttributeContent::GetText(const nsTextFragment*& aFragmentsResult, - PRInt32& aNumFragmentsResult) +nsAttributeContent::GetText(const nsTextFragment** aFragmentsResult) { ValidateTextFragment(); if (nsnull != mContent) { - aFragmentsResult = &mText; - aNumFragmentsResult = 1; + *aFragmentsResult = &mText; return NS_OK; } // XXX is this a good idea, or should we just return an empty diff --git a/mozilla/layout/html/style/src/nsCSSFrameConstructor.cpp b/mozilla/layout/html/style/src/nsCSSFrameConstructor.cpp index f65a0d5b4ce..eb5c56e40c4 100644 --- a/mozilla/layout/html/style/src/nsCSSFrameConstructor.cpp +++ b/mozilla/layout/html/style/src/nsCSSFrameConstructor.cpp @@ -9068,52 +9068,40 @@ nsCSSFrameConstructor::InsertFirstLineFrames( // Determine how many characters in the text fragment apply to the // first letter static PRInt32 -FirstLetterCount(nsTextFragment* aFragments, PRInt32 aNumFragments) +FirstLetterCount(const nsTextFragment* aFragment) { PRInt32 count = 0; PRInt32 firstLetterLength = 0; PRBool done = PR_FALSE; - while (aNumFragments && !done) { - PRInt32 i, n = aFragments->GetLength(); - for (i = 0; i < n; i++) { - PRUnichar ch = aFragments->CharAt(i); - if (XP_IS_SPACE(ch)) { - if (firstLetterLength) { - done = PR_TRUE; - break; - } - count++; - continue; - } - // XXX I18n - if ((ch == '\'') || (ch == '\"')) { - if (firstLetterLength) { - done = PR_TRUE; - break; - } - // keep looping - firstLetterLength = 1; - } - else { - count++; + + PRInt32 i, n = aFragment->GetLength(); + for (i = 0; i < n; i++) { + PRUnichar ch = aFragment->CharAt(i); + if (XP_IS_SPACE(ch)) { + if (firstLetterLength) { done = PR_TRUE; break; } + count++; + continue; + } + // XXX I18n + if ((ch == '\'') || (ch == '\"')) { + if (firstLetterLength) { + done = PR_TRUE; + break; + } + // keep looping + firstLetterLength = 1; + } + else { + count++; + done = PR_TRUE; + break; } - aFragments++; - aNumFragments--; } - return count; -} -static PRInt32 -TotalLength(nsTextFragment* aFragments, PRInt32 aNumFragments) -{ - PRInt32 sum = 0; - while (--aNumFragments >= 0) { - sum += aFragments->GetLength(); - } - return sum; + return count; } static PRBool @@ -9125,11 +9113,10 @@ NeedFirstLetterContinuation(nsIContent* aContent) if (aContent) { nsCOMPtr tc(do_QueryInterface(aContent)); if (tc) { - nsTextFragment* frags = nsnull; - PRInt32 numFrags = 0; - tc->GetText((const nsTextFragment*&)frags, numFrags); - PRInt32 flc = FirstLetterCount(frags, numFrags); - PRInt32 tl = TotalLength(frags, numFrags); + const nsTextFragment* frag = nsnull; + tc->GetText(&frag); + PRInt32 flc = FirstLetterCount(frag); + PRInt32 tl = frag->GetLength(); if (flc < tl) { result = PR_TRUE; }