void CFDE_TextOut::ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect) { const FX_WCHAR* pwsStr = m_wsText.c_str(); FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout); int32_t iPieceWidths = 0; FDE_TTOPIECE* pPiece = pLine->GetPtrAt(0); int32_t iStartChar = pPiece->iStartChar; m_fLinePos = bVertical ? pPiece->rtPiece.left : pPiece->rtPiece.top; int32_t iPieceCount = pLine->GetSize(); int32_t iPieceIndex = 0; uint32_t dwBreakStatus = 0; FX_WCHAR wch; while (iPieceIndex < iPieceCount) { int32_t iStar = iStartChar; int32_t iEnd = pPiece->iChars + iStar; while (iStar < iEnd) { wch = *(pwsStr + iStar); dwBreakStatus = m_pTxtBreak->AppendChar(wch); if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, TRUE, rect); } iStar++; } iPieceIndex++; pPiece = pLine->GetPtrAt(iPieceIndex); } dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, TRUE, rect); } m_pTxtBreak->Reset(); }
void CFDE_TextOut::LoadText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_RectF& rect) { FX_WCHAR* pStr = m_wsText.GetBuffer(iLength); int32_t iTxtLength = iLength; ExpandBuffer(iTxtLength, 0); bool bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey); bool bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout); bool bLineWrap = !!(m_dwStyles & FDE_TTOSTYLE_LineWrap); FX_FLOAT fLineStep = (m_fLineSpace > m_fFontSize) ? m_fLineSpace : m_fFontSize; FX_FLOAT fLineStop = bVertical ? rect.left : rect.bottom(); m_fLinePos = bVertical ? rect.right() : rect.top; if (bVertical) { fLineStep = -fLineStep; } m_hotKeys.RemoveAll(); int32_t iStartChar = 0; int32_t iChars = 0; int32_t iPieceWidths = 0; uint32_t dwBreakStatus; FX_WCHAR wch; bool bRet = false; while (iTxtLength-- > 0) { wch = *pwsStr++; if (bHotKey && wch == L'&' && *(pStr - 1) != L'&') { if (iTxtLength > 0) m_hotKeys.Add(iChars); continue; } *pStr++ = wch; iChars++; dwBreakStatus = m_pTxtBreak->AppendChar(wch); if (dwBreakStatus > FX_TXTBREAK_PieceBreak) { bool bEndofLine = RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, false, rect); if (bEndofLine && (bLineWrap || (dwBreakStatus > FX_TXTBREAK_LineBreak && !bLineWrap))) { iPieceWidths = 0; m_iCurLine++; m_fLinePos += fLineStep; } if ((bVertical && m_fLinePos + fLineStep < fLineStop) || (!bVertical && m_fLinePos + fLineStep > fLineStop)) { int32_t iCurLine = bEndofLine ? m_iCurLine - 1 : m_iCurLine; m_ttoLines[iCurLine].SetNewReload(true); bRet = true; break; } } } dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); if (dwBreakStatus > FX_TXTBREAK_PieceBreak && !bRet) { RetriecePieces(dwBreakStatus, iStartChar, iPieceWidths, false, rect); } m_pTxtBreak->ClearBreakPieces(); m_pTxtBreak->Reset(); m_wsText.ReleaseBuffer(iLength); }