tune performance by elimate unnecessary reference to nsIWordBreaker in nsTexTransformer. Add NS_PRECONDITION code into nsTextTransformer to make code better

git-svn-id: svn://10.0.0.236/trunk@42948 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
ftang%netscape.com 1999-08-10 07:23:56 +00:00
parent d91b29eccc
commit d4536e263f
4 changed files with 110 additions and 72 deletions

View File

@ -937,9 +937,9 @@ nsTextFrame::PaintUnicodeText(nsIPresContext* aPresContext,
// Transform text from content into renderable form
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,wb);
// nsCOMPtr<nsIWordBreaker> wb;
// doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,nsnull);
PrepareUnicodeText(tx, (displaySelection ? ip : nsnull),
paintBuf, &textLength);
PRUnichar* text = paintBuf;
@ -1049,9 +1049,9 @@ nsTextFrame::GetPositionSlowly(nsIPresContext& aPresContext,
// Transform text from content into renderable form
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE, lb,wb);
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE, lb,nsnull);
PrepareUnicodeText(tx, ip, paintBuf, &textLength);
if (textLength <= 0)
return NS_ERROR_FAILURE;
@ -1375,9 +1375,9 @@ nsTextFrame::PaintTextSlowly(nsIPresContext* aPresContext,
// Transform text from content into renderable form
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE, lb,wb);
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE, lb,nsnull);
aTextStyle.mNumSpaces = PrepareUnicodeText(tx,
displaySelection ? ip : nsnull,
paintBuf, &textLength);
@ -1496,9 +1496,9 @@ nsTextFrame::PaintAsciiText(nsIPresContext* aPresContext,
// Transform text from content into renderable form
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,wb);
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,nsnull);
PrepareUnicodeText(tx, (displaySelection ? ip : nsnull),
rawPaintBuf, &textLength);
// Translate unicode data into ascii for rendering
@ -1698,9 +1698,9 @@ nsTextFrame::GetPosition(nsIPresContext& aCX,
// Get the renderable form of the text
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,wb);
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,nsnull);
PrepareUnicodeText(tx, ip, paintBuf, &textLength);
if (textLength <=0) //invalid frame to get position on
return NS_ERROR_FAILURE;
@ -1905,9 +1905,9 @@ nsTextFrame::GetPointFromOffset(nsIPresContext* aPresContext,
// Transform text from content into renderable form
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE, lb,wb);
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE, lb,nsnull);
PrepareUnicodeText(tx, ip, paintBuf, &textLength);
ip[mContentLength] = ip[mContentLength-1];
if ((ip[mContentLength]-mContentOffset) < textLength)//must set up last one for selection beyond edge if in boundary
@ -2011,20 +2011,8 @@ nsTextFrame::PeekOffset(nsIFocusTracker *aTracker,
paintBuf = new PRUnichar[mContentLength];
}
PRInt32 textLength;
// Transform text from content into renderable form
nsresult result(NS_OK);
nsIDocument* doc;
result = mContent->GetDocument(doc);
if (NS_FAILED(result) || !doc)
return result;
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
NS_RELEASE(doc);
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,wb);
switch (aAmount){
case eSelectNoAmount : {
@ -2035,6 +2023,19 @@ nsTextFrame::PeekOffset(nsIFocusTracker *aTracker,
}
break;
case eSelectCharacter : {
// Transform text from content into renderable form
nsIDocument* doc;
result = mContent->GetDocument(doc);
if (NS_FAILED(result) || !doc)
return result;
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
NS_RELEASE(doc);
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,nsnull);
PrepareUnicodeText(tx, ip, paintBuf, &textLength);
ip[mContentLength] = ip[mContentLength-1];
if ((ip[mContentLength]-mContentOffset) < textLength)//must set up last one for selection beyond edge if in boundary
@ -2091,6 +2092,20 @@ nsTextFrame::PeekOffset(nsIFocusTracker *aTracker,
}
break;
case eSelectWord : {
// Transform text from content into renderable form
nsIDocument* doc;
result = mContent->GetDocument(doc);
if (NS_FAILED(result) || !doc)
return result;
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
NS_RELEASE(doc);
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,wb);
PrepareUnicodeText(tx, ip, paintBuf, &textLength);
nsIFrame *frameUsed = nsnull;
PRBool keepSearching; //if you run out of chars before you hit the end of word, maybe next frame has more text to select?
PRInt32 start;
@ -2369,9 +2384,9 @@ nsTextFrame::Reflow(nsIPresContext& aPresContext,
PRUnichar wordBuf[WORD_BUF_SIZE];
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBuf, WORD_BUF_SIZE,lb,wb);
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBuf, WORD_BUF_SIZE,lb,nsnull);
nsresult rv = tx.Init(/**textRun, XXX*/ this, startingOffset);
if (NS_OK != rv) {
return rv;
@ -2879,11 +2894,11 @@ nsTextFrame::ComputeWordFragmentWidth(nsIPresContext* aPresContext,
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
NS_IF_RELEASE(doc);
nsTextTransformer tx(buf, TEXT_BUF_SIZE,lb,wb);
nsTextTransformer tx(buf, TEXT_BUF_SIZE,lb,nsnull);
// XXX we need the content-offset of the text frame!!! 0 won't
// always be right when continuations are in action
tx.Init(/**textRun, XXX*/ aTextFrame, 0);

View File

@ -165,6 +165,8 @@ nsTextTransformer::GetNextWord(PRBool aInWord,
PRBool aForLineBreak)
{
NS_PRECONDITION(mOffset <= mContentLength, "bad offset");
NS_PRECONDITION(((nsnull != mLineBreaker)||(!aForLineBreak)), "null in line breaker");
NS_PRECONDITION(((nsnull != mWordBreaker)||( aForLineBreak)), "null in word breaker");
// See if the content has been exhausted
if (mOffset == mContentLength) {
@ -405,6 +407,8 @@ nsTextTransformer::GetPrevWord(PRBool aInWord,
PRBool aForLineBreak)
{
NS_PRECONDITION(mOffset <= mContentLength, "bad offset");
NS_PRECONDITION(((nsnull != mLineBreaker)||(!aForLineBreak)), "null in line breaker");
NS_PRECONDITION(((nsnull != mWordBreaker)||( aForLineBreak)), "null in word breaker");
// See if the content has been exhausted
if (mOffset == 0) {

View File

@ -937,9 +937,9 @@ nsTextFrame::PaintUnicodeText(nsIPresContext* aPresContext,
// Transform text from content into renderable form
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,wb);
// nsCOMPtr<nsIWordBreaker> wb;
// doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,nsnull);
PrepareUnicodeText(tx, (displaySelection ? ip : nsnull),
paintBuf, &textLength);
PRUnichar* text = paintBuf;
@ -1049,9 +1049,9 @@ nsTextFrame::GetPositionSlowly(nsIPresContext& aPresContext,
// Transform text from content into renderable form
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE, lb,wb);
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE, lb,nsnull);
PrepareUnicodeText(tx, ip, paintBuf, &textLength);
if (textLength <= 0)
return NS_ERROR_FAILURE;
@ -1375,9 +1375,9 @@ nsTextFrame::PaintTextSlowly(nsIPresContext* aPresContext,
// Transform text from content into renderable form
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE, lb,wb);
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE, lb,nsnull);
aTextStyle.mNumSpaces = PrepareUnicodeText(tx,
displaySelection ? ip : nsnull,
paintBuf, &textLength);
@ -1496,9 +1496,9 @@ nsTextFrame::PaintAsciiText(nsIPresContext* aPresContext,
// Transform text from content into renderable form
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,wb);
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,nsnull);
PrepareUnicodeText(tx, (displaySelection ? ip : nsnull),
rawPaintBuf, &textLength);
// Translate unicode data into ascii for rendering
@ -1698,9 +1698,9 @@ nsTextFrame::GetPosition(nsIPresContext& aCX,
// Get the renderable form of the text
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,wb);
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,nsnull);
PrepareUnicodeText(tx, ip, paintBuf, &textLength);
if (textLength <=0) //invalid frame to get position on
return NS_ERROR_FAILURE;
@ -1905,9 +1905,9 @@ nsTextFrame::GetPointFromOffset(nsIPresContext* aPresContext,
// Transform text from content into renderable form
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE, lb,wb);
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE, lb,nsnull);
PrepareUnicodeText(tx, ip, paintBuf, &textLength);
ip[mContentLength] = ip[mContentLength-1];
if ((ip[mContentLength]-mContentOffset) < textLength)//must set up last one for selection beyond edge if in boundary
@ -2011,20 +2011,8 @@ nsTextFrame::PeekOffset(nsIFocusTracker *aTracker,
paintBuf = new PRUnichar[mContentLength];
}
PRInt32 textLength;
// Transform text from content into renderable form
nsresult result(NS_OK);
nsIDocument* doc;
result = mContent->GetDocument(doc);
if (NS_FAILED(result) || !doc)
return result;
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
NS_RELEASE(doc);
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,wb);
switch (aAmount){
case eSelectNoAmount : {
@ -2035,6 +2023,19 @@ nsTextFrame::PeekOffset(nsIFocusTracker *aTracker,
}
break;
case eSelectCharacter : {
// Transform text from content into renderable form
nsIDocument* doc;
result = mContent->GetDocument(doc);
if (NS_FAILED(result) || !doc)
return result;
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
NS_RELEASE(doc);
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,nsnull);
PrepareUnicodeText(tx, ip, paintBuf, &textLength);
ip[mContentLength] = ip[mContentLength-1];
if ((ip[mContentLength]-mContentOffset) < textLength)//must set up last one for selection beyond edge if in boundary
@ -2091,6 +2092,20 @@ nsTextFrame::PeekOffset(nsIFocusTracker *aTracker,
}
break;
case eSelectWord : {
// Transform text from content into renderable form
nsIDocument* doc;
result = mContent->GetDocument(doc);
if (NS_FAILED(result) || !doc)
return result;
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
NS_RELEASE(doc);
nsTextTransformer tx(wordBufMem, WORD_BUF_SIZE,lb,wb);
PrepareUnicodeText(tx, ip, paintBuf, &textLength);
nsIFrame *frameUsed = nsnull;
PRBool keepSearching; //if you run out of chars before you hit the end of word, maybe next frame has more text to select?
PRInt32 start;
@ -2369,9 +2384,9 @@ nsTextFrame::Reflow(nsIPresContext& aPresContext,
PRUnichar wordBuf[WORD_BUF_SIZE];
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBuf, WORD_BUF_SIZE,lb,wb);
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
nsTextTransformer tx(wordBuf, WORD_BUF_SIZE,lb,nsnull);
nsresult rv = tx.Init(/**textRun, XXX*/ this, startingOffset);
if (NS_OK != rv) {
return rv;
@ -2879,11 +2894,11 @@ nsTextFrame::ComputeWordFragmentWidth(nsIPresContext* aPresContext,
nsCOMPtr<nsILineBreaker> lb;
doc->GetLineBreaker(getter_AddRefs(lb));
nsCOMPtr<nsIWordBreaker> wb;
doc->GetWordBreaker(getter_AddRefs(wb));
//nsCOMPtr<nsIWordBreaker> wb;
//doc->GetWordBreaker(getter_AddRefs(wb));
NS_IF_RELEASE(doc);
nsTextTransformer tx(buf, TEXT_BUF_SIZE,lb,wb);
nsTextTransformer tx(buf, TEXT_BUF_SIZE,lb,nsnull);
// XXX we need the content-offset of the text frame!!! 0 won't
// always be right when continuations are in action
tx.Init(/**textRun, XXX*/ aTextFrame, 0);

View File

@ -165,6 +165,8 @@ nsTextTransformer::GetNextWord(PRBool aInWord,
PRBool aForLineBreak)
{
NS_PRECONDITION(mOffset <= mContentLength, "bad offset");
NS_PRECONDITION(((nsnull != mLineBreaker)||(!aForLineBreak)), "null in line breaker");
NS_PRECONDITION(((nsnull != mWordBreaker)||( aForLineBreak)), "null in word breaker");
// See if the content has been exhausted
if (mOffset == mContentLength) {
@ -405,6 +407,8 @@ nsTextTransformer::GetPrevWord(PRBool aInWord,
PRBool aForLineBreak)
{
NS_PRECONDITION(mOffset <= mContentLength, "bad offset");
NS_PRECONDITION(((nsnull != mLineBreaker)||(!aForLineBreak)), "null in line breaker");
NS_PRECONDITION(((nsnull != mWordBreaker)||( aForLineBreak)), "null in word breaker");
// See if the content has been exhausted
if (mOffset == 0) {