| Index: xfa/fde/tto/fde_textout.cpp
|
| diff --git a/xfa/fde/tto/fde_textout.cpp b/xfa/fde/tto/fde_textout.cpp
|
| index a29a42021632e41953457b16129922ce2b529017..c83afc1ad6837dba6592beb8b15550bde30bdc54 100644
|
| --- a/xfa/fde/tto/fde_textout.cpp
|
| +++ b/xfa/fde/tto/fde_textout.cpp
|
| @@ -18,17 +18,14 @@
|
| #include "xfa/fgas/layout/fgas_textbreak.h"
|
|
|
| CFDE_TextOut::CFDE_TextOut()
|
| - : m_pFont(nullptr),
|
| + : m_pTxtBreak(new CFX_TxtBreak(FX_TXTBREAKPOLICY_None)),
|
| + m_pFont(nullptr),
|
| m_fFontSize(12.0f),
|
| m_fLineSpace(m_fFontSize),
|
| m_fLinePos(0.0f),
|
| m_fTolerance(0.0f),
|
| m_iAlignment(0),
|
| m_iTxtBkAlignment(0),
|
| - m_pCharWidths(nullptr),
|
| - m_iChars(0),
|
| - m_pEllCharWidths(nullptr),
|
| - m_iEllChars(0),
|
| m_wParagraphBkChar(L'\n'),
|
| m_TxtColor(0xFF000000),
|
| m_dwStyles(0),
|
| @@ -38,34 +35,32 @@ CFDE_TextOut::CFDE_TextOut()
|
| m_ttoLines(5),
|
| m_iCurLine(0),
|
| m_iCurPiece(0),
|
| - m_iTotalLines(0),
|
| - m_pCharPos(nullptr),
|
| - m_iCharPosSize(0) {
|
| - m_pTxtBreak = new CFX_TxtBreak(FX_TXTBREAKPOLICY_None);
|
| + m_iTotalLines(0) {
|
| m_Matrix.SetIdentity();
|
| m_rtClip.Reset();
|
| m_rtLogicClip.Reset();
|
| }
|
| +
|
| CFDE_TextOut::~CFDE_TextOut() {
|
| - delete m_pTxtBreak;
|
| - FX_Free(m_pCharWidths);
|
| - FX_Free(m_pEllCharWidths);
|
| - FX_Free(m_pCharPos);
|
| m_ttoLines.RemoveAll(FALSE);
|
| }
|
| +
|
| void CFDE_TextOut::SetFont(CFGAS_GEFont* pFont) {
|
| ASSERT(pFont);
|
| m_pFont = pFont;
|
| m_pTxtBreak->SetFont(pFont);
|
| }
|
| +
|
| void CFDE_TextOut::SetFontSize(FX_FLOAT fFontSize) {
|
| ASSERT(fFontSize > 0);
|
| m_fFontSize = fFontSize;
|
| m_pTxtBreak->SetFontSize(fFontSize);
|
| }
|
| +
|
| void CFDE_TextOut::SetTextColor(FX_ARGB color) {
|
| m_TxtColor = color;
|
| }
|
| +
|
| void CFDE_TextOut::SetStyles(uint32_t dwStyles) {
|
| m_dwStyles = dwStyles;
|
| m_dwTxtBkStyles = 0;
|
| @@ -90,18 +85,22 @@ void CFDE_TextOut::SetStyles(uint32_t dwStyles) {
|
| }
|
| m_pTxtBreak->SetLayoutStyles(m_dwTxtBkStyles);
|
| }
|
| +
|
| void CFDE_TextOut::SetTabWidth(FX_FLOAT fTabWidth) {
|
| ASSERT(fTabWidth > 1.0f);
|
| m_pTxtBreak->SetTabWidth(fTabWidth, FALSE);
|
| }
|
| +
|
| void CFDE_TextOut::SetEllipsisString(const CFX_WideString& wsEllipsis) {
|
| m_bElliChanged = TRUE;
|
| m_wsEllipsis = wsEllipsis;
|
| }
|
| +
|
| void CFDE_TextOut::SetParagraphBreakChar(FX_WCHAR wch) {
|
| m_wParagraphBkChar = wch;
|
| m_pTxtBreak->SetParagraphBreakChar(wch);
|
| }
|
| +
|
| void CFDE_TextOut::SetAlignment(int32_t iAlignment) {
|
| m_iAlignment = iAlignment;
|
| switch (m_iAlignment) {
|
| @@ -121,6 +120,7 @@ void CFDE_TextOut::SetAlignment(int32_t iAlignment) {
|
| }
|
| m_pTxtBreak->SetAlignment(m_iTxtBkAlignment);
|
| }
|
| +
|
| void CFDE_TextOut::SetLineSpace(FX_FLOAT fLineSpace) {
|
| ASSERT(fLineSpace > 1.0f);
|
| m_fLineSpace = fLineSpace;
|
| @@ -144,22 +144,28 @@ void CFDE_TextOut::SetClipRect(const CFX_Rect& rtClip) {
|
| m_rtClip.Set((FX_FLOAT)rtClip.left, (FX_FLOAT)rtClip.top,
|
| (FX_FLOAT)rtClip.Width(), (FX_FLOAT)rtClip.Height());
|
| }
|
| +
|
| void CFDE_TextOut::SetClipRect(const CFX_RectF& rtClip) {
|
| m_rtClip = rtClip;
|
| }
|
| +
|
| void CFDE_TextOut::SetLogicClipRect(const CFX_RectF& rtClip) {
|
| m_rtLogicClip = rtClip;
|
| }
|
| +
|
| void CFDE_TextOut::SetMatrix(const CFX_Matrix& matrix) {
|
| m_Matrix = matrix;
|
| }
|
| +
|
| void CFDE_TextOut::SetLineBreakTolerance(FX_FLOAT fTolerance) {
|
| m_fTolerance = fTolerance;
|
| m_pTxtBreak->SetLineBreakTolerance(m_fTolerance);
|
| }
|
| +
|
| int32_t CFDE_TextOut::GetTotalLines() {
|
| return m_iTotalLines;
|
| }
|
| +
|
| void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| CFX_Size& size) {
|
| @@ -169,6 +175,7 @@ void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
|
| size.x = (int32_t)rtText.Width();
|
| size.y = (int32_t)rtText.Height();
|
| }
|
| +
|
| void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| CFX_SizeF& size) {
|
| @@ -178,6 +185,7 @@ void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
|
| size.x = rtText.Width();
|
| size.y = rtText.Height();
|
| }
|
| +
|
| void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| CFX_Rect& rect) {
|
| @@ -188,6 +196,7 @@ void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
|
| rect.Set((int32_t)rtText.left, (int32_t)rtText.top, (int32_t)rtText.Width(),
|
| (int32_t)rtText.Height());
|
| }
|
| +
|
| void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| CFX_RectF& rect) {
|
| @@ -202,6 +211,7 @@ void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
|
| m_Matrix.TransformRect(rect);
|
| }
|
| }
|
| +
|
| void CFDE_TextOut::CalcLogicSize(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| CFX_SizeF& size) {
|
| @@ -211,6 +221,7 @@ void CFDE_TextOut::CalcLogicSize(const FX_WCHAR* pwsStr,
|
| size.x = rtText.Width();
|
| size.y = rtText.Height();
|
| }
|
| +
|
| void CFDE_TextOut::CalcLogicSize(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| CFX_RectF& rect) {
|
| @@ -221,6 +232,7 @@ void CFDE_TextOut::CalcLogicSize(const FX_WCHAR* pwsStr,
|
| CalcTextSize(pwsStr, iLength, rect);
|
| }
|
| }
|
| +
|
| void CFDE_TextOut::CalcTextSize(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| CFX_RectF& rect) {
|
| @@ -283,6 +295,7 @@ void CFDE_TextOut::CalcTextSize(const FX_WCHAR* pwsStr,
|
| }
|
| }
|
| }
|
| +
|
| void CFDE_TextOut::SetLineWidth(CFX_RectF& rect) {
|
| if ((m_dwStyles & FDE_TTOSTYLE_SingleLine) == 0) {
|
| FX_FLOAT fLineWidth = 0.0f;
|
| @@ -300,6 +313,7 @@ void CFDE_TextOut::SetLineWidth(CFX_RectF& rect) {
|
| m_pTxtBreak->SetLineWidth(fLineWidth);
|
| }
|
| }
|
| +
|
| FX_BOOL CFDE_TextOut::RetrieveLineWidth(uint32_t dwBreakStatus,
|
| FX_FLOAT& fStartPos,
|
| FX_FLOAT& fWidth,
|
| @@ -330,6 +344,7 @@ FX_BOOL CFDE_TextOut::RetrieveLineWidth(uint32_t dwBreakStatus,
|
| m_iTotalLines++;
|
| return TRUE;
|
| }
|
| +
|
| void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| int32_t x,
|
| @@ -339,6 +354,7 @@ void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
|
| m_fFontSize * 1000.0f);
|
| DrawText(pwsStr, iLength, rtText);
|
| }
|
| +
|
| void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| FX_FLOAT x,
|
| @@ -347,6 +363,7 @@ void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
|
| rtText.Set(x, y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f);
|
| DrawText(pwsStr, iLength, rtText);
|
| }
|
| +
|
| void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| const CFX_Rect& rect) {
|
| @@ -355,6 +372,7 @@ void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
|
| (FX_FLOAT)rect.height);
|
| DrawText(pwsStr, iLength, rtText);
|
| }
|
| +
|
| void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| const CFX_RectF& rect) {
|
| @@ -365,6 +383,7 @@ void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
|
| rm.TransformRect(rtText);
|
| DrawText(pwsStr, iLength, rtText, m_rtClip);
|
| }
|
| +
|
| void CFDE_TextOut::DrawLogicText(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| FX_FLOAT x,
|
| @@ -373,6 +392,7 @@ void CFDE_TextOut::DrawLogicText(const FX_WCHAR* pwsStr,
|
| rtText.Set(x, y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f);
|
| DrawLogicText(pwsStr, iLength, rtText);
|
| }
|
| +
|
| void CFDE_TextOut::DrawLogicText(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| const CFX_RectF& rect) {
|
| @@ -382,6 +402,7 @@ void CFDE_TextOut::DrawLogicText(const FX_WCHAR* pwsStr,
|
| m_Matrix.TransformRect(rtClip);
|
| DrawText(pwsStr, iLength, rect, rtClip);
|
| }
|
| +
|
| void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| const CFX_RectF& rect,
|
| @@ -408,39 +429,26 @@ void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
|
| DoAlignment(rect);
|
| OnDraw(rtClip);
|
| }
|
| +
|
| void CFDE_TextOut::ExpandBuffer(int32_t iSize, int32_t iType) {
|
| + ASSERT(iSize >= 0);
|
| + size_t size = iSize;
|
| switch (iType) {
|
| case 0:
|
| - if (!m_pCharWidths) {
|
| - m_pCharWidths = FX_Alloc(int32_t, iSize);
|
| - m_iChars = iSize;
|
| - } else if (m_iChars < iSize) {
|
| - m_pCharWidths = FX_Realloc(int32_t, m_pCharWidths, iSize);
|
| - m_iChars = iSize;
|
| - }
|
| - FXSYS_memset(m_pCharWidths, 0, iSize * sizeof(int32_t));
|
| + if (m_CharWidths.size() < size)
|
| + m_CharWidths.resize(size, 0);
|
| break;
|
| case 1:
|
| - if (!m_pEllCharWidths) {
|
| - m_pEllCharWidths = FX_Alloc(int32_t, iSize);
|
| - m_iEllChars = iSize;
|
| - } else if (m_iEllChars < iSize) {
|
| - m_pEllCharWidths = FX_Realloc(int32_t, m_pEllCharWidths, iSize);
|
| - m_iEllChars = iSize;
|
| - }
|
| - FXSYS_memset(m_pEllCharWidths, 0, iSize * sizeof(int32_t));
|
| + if (m_EllCharWidths.size() < size)
|
| + m_EllCharWidths.resize(size, 0);
|
| break;
|
| case 2:
|
| - if (!m_pCharPos) {
|
| - m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, iSize);
|
| - m_iCharPosSize = iSize;
|
| - } else if (m_iCharPosSize < iSize) {
|
| - m_pCharPos = FX_Realloc(FXTEXT_CHARPOS, m_pCharPos, iSize);
|
| - m_iCharPosSize = iSize;
|
| - }
|
| + if (m_CharPos.size() < size)
|
| + m_CharPos.resize(size, FXTEXT_CHARPOS());
|
| break;
|
| }
|
| }
|
| +
|
| void CFDE_TextOut::LoadEllipsis() {
|
| if (!m_bElliChanged) {
|
| return;
|
| @@ -453,41 +461,36 @@ void CFDE_TextOut::LoadEllipsis() {
|
| }
|
| ExpandBuffer(iLength, 1);
|
| const FX_WCHAR* pStr = m_wsEllipsis.c_str();
|
| - int32_t* pCharWidths = m_pEllCharWidths;
|
| uint32_t dwBreakStatus;
|
| FX_WCHAR wch;
|
| while (iLength-- > 0) {
|
| wch = *pStr++;
|
| dwBreakStatus = m_pTxtBreak->AppendChar(wch);
|
| - if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
|
| - RetrieveEllPieces(pCharWidths);
|
| - }
|
| + if (dwBreakStatus > FX_TXTBREAK_PieceBreak)
|
| + RetrieveEllPieces(&m_EllCharWidths);
|
| }
|
| dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
|
| - if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
|
| - RetrieveEllPieces(pCharWidths);
|
| - }
|
| + if (dwBreakStatus > FX_TXTBREAK_PieceBreak)
|
| + RetrieveEllPieces(&m_EllCharWidths);
|
| m_pTxtBreak->Reset();
|
| }
|
| -void CFDE_TextOut::RetrieveEllPieces(int32_t*& pCharWidths) {
|
| +
|
| +void CFDE_TextOut::RetrieveEllPieces(std::vector<int32_t>* pCharWidths) {
|
| int32_t iCount = m_pTxtBreak->CountBreakPieces();
|
| - CFX_Char* pTC;
|
| + int32_t iCharIndex = 0;
|
| for (int32_t i = 0; i < iCount; i++) {
|
| const CFX_TxtPiece* pPiece = m_pTxtBreak->GetBreakPiece(i);
|
| int32_t iPieceChars = pPiece->GetLength();
|
| for (int32_t j = 0; j < iPieceChars; j++) {
|
| - pTC = pPiece->GetCharPtr(j);
|
| - if (pTC->m_iCharWidth <= 0) {
|
| - *pCharWidths = 0;
|
| - } else {
|
| - *pCharWidths = pTC->m_iCharWidth;
|
| - }
|
| - m_iEllipsisWidth += *pCharWidths;
|
| - pCharWidths++;
|
| + CFX_Char* pTC = pPiece->GetCharPtr(j);
|
| + (*pCharWidths)[iCharIndex] = std::max(pTC->m_iCharWidth, 0);
|
| + m_iEllipsisWidth += (*pCharWidths)[iCharIndex];
|
| + iCharIndex++;
|
| }
|
| }
|
| m_pTxtBreak->ClearBreakPieces();
|
| }
|
| +
|
| void CFDE_TextOut::LoadText(const FX_WCHAR* pwsStr,
|
| int32_t iLength,
|
| const CFX_RectF& rect) {
|
| @@ -551,6 +554,7 @@ void CFDE_TextOut::LoadText(const FX_WCHAR* pwsStr,
|
| m_pTxtBreak->Reset();
|
| m_wsText.ReleaseBuffer(iLength);
|
| }
|
| +
|
| FX_BOOL CFDE_TextOut::RetriecePieces(uint32_t dwBreakStatus,
|
| int32_t& iStartChar,
|
| int32_t& iPieceWidths,
|
| @@ -585,7 +589,7 @@ FX_BOOL CFDE_TextOut::RetriecePieces(uint32_t dwBreakStatus,
|
| }
|
| }
|
| iWidth += iCurCharWidth;
|
| - m_pCharWidths[iChar++] = iCurCharWidth;
|
| + m_CharWidths[iChar++] = iCurCharWidth;
|
| }
|
| if (j == 0 && !bReload) {
|
| CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(m_iCurLine);
|
| @@ -621,6 +625,7 @@ FX_BOOL CFDE_TextOut::RetriecePieces(uint32_t dwBreakStatus,
|
| dwBreakStatus == FX_TXTBREAK_ParagraphBreak;
|
| return bRet;
|
| }
|
| +
|
| void CFDE_TextOut::AppendPiece(const FDE_TTOPIECE& ttoPiece,
|
| FX_BOOL bNeedReload,
|
| FX_BOOL bEnd) {
|
| @@ -644,6 +649,7 @@ void CFDE_TextOut::AppendPiece(const FDE_TTOPIECE& ttoPiece,
|
| m_iCurPiece = 0;
|
| }
|
| }
|
| +
|
| void CFDE_TextOut::ReplaceWidthEllipsis() {
|
| LoadEllipsis();
|
| int32_t iLength = m_wsEllipsis.GetLength();
|
| @@ -670,14 +676,14 @@ void CFDE_TextOut::ReplaceWidthEllipsis() {
|
| break;
|
| }
|
| int32_t index = pPiece->iStartChar + j;
|
| - iCharWidth += m_pCharWidths[index];
|
| + iCharWidth += m_CharWidths[index];
|
| iCharCount++;
|
| if (iCharCount <= iLength) {
|
| m_wsText.SetAt(index, m_wsEllipsis.GetAt(iEllipsisCharIndex));
|
| - m_pCharWidths[index] = m_pEllCharWidths[iEllipsisCharIndex];
|
| + m_CharWidths[index] = m_EllCharWidths[iEllipsisCharIndex];
|
| } else if (iCharWidth <= m_iEllipsisWidth) {
|
| m_wsText.SetAt(index, 0);
|
| - m_pCharWidths[index] = 0;
|
| + m_CharWidths[index] = 0;
|
| }
|
| iEllipsisCharIndex--;
|
| }
|
| @@ -687,6 +693,7 @@ void CFDE_TextOut::ReplaceWidthEllipsis() {
|
| }
|
| }
|
| }
|
| +
|
| void CFDE_TextOut::Reload(const CFX_RectF& rect) {
|
| int32_t iCount = m_ttoLines.GetSize();
|
| for (int32_t i = 0; i < iCount; i++) {
|
| @@ -699,6 +706,7 @@ void CFDE_TextOut::Reload(const CFX_RectF& rect) {
|
| ReloadLinePiece(pLine, rect);
|
| }
|
| }
|
| +
|
| 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);
|
| @@ -730,6 +738,7 @@ void CFDE_TextOut::ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect) {
|
| }
|
| m_pTxtBreak->Reset();
|
| }
|
| +
|
| void CFDE_TextOut::DoAlignment(const CFX_RectF& rect) {
|
| FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
|
| FX_FLOAT fLineStopS = bVertical ? rect.right() : rect.bottom();
|
| @@ -763,6 +772,7 @@ void CFDE_TextOut::DoAlignment(const CFX_RectF& rect) {
|
| }
|
| }
|
| }
|
| +
|
| void CFDE_TextOut::OnDraw(const CFX_RectF& rtClip) {
|
| if (!m_pRenderDevice)
|
| return;
|
| @@ -788,7 +798,7 @@ void CFDE_TextOut::OnDraw(const CFX_RectF& rtClip) {
|
|
|
| int32_t iCount = GetDisplayPos(pPiece);
|
| if (iCount > 0) {
|
| - m_pRenderDevice->DrawString(pBrush, m_pFont, m_pCharPos, iCount,
|
| + m_pRenderDevice->DrawString(pBrush, m_pFont, m_CharPos.data(), iCount,
|
| m_fFontSize, &m_Matrix);
|
| }
|
| DrawLine(pPiece, pPen);
|
| @@ -802,7 +812,7 @@ void CFDE_TextOut::OnDraw(const CFX_RectF& rtClip) {
|
| int32_t CFDE_TextOut::GetDisplayPos(FDE_TTOPIECE* pPiece) {
|
| FX_TXTRUN tr = ToTextRun(pPiece);
|
| ExpandBuffer(tr.iLength, 2);
|
| - return m_pTxtBreak->GetDisplayPos(&tr, m_pCharPos);
|
| + return m_pTxtBreak->GetDisplayPos(&tr, m_CharPos.data());
|
| }
|
|
|
| int32_t CFDE_TextOut::GetCharRects(const FDE_TTOPIECE* pPiece) {
|
| @@ -814,7 +824,7 @@ int32_t CFDE_TextOut::GetCharRects(const FDE_TTOPIECE* pPiece) {
|
| FX_TXTRUN CFDE_TextOut::ToTextRun(const FDE_TTOPIECE* pPiece) {
|
| FX_TXTRUN tr;
|
| tr.wsStr = m_wsText + pPiece->iStartChar;
|
| - tr.pWidths = m_pCharWidths + pPiece->iStartChar;
|
| + tr.pWidths = &m_CharWidths[pPiece->iStartChar];
|
| tr.iLength = pPiece->iChars;
|
| tr.pFont = m_pFont;
|
| tr.fFontSize = m_fFontSize;
|
| @@ -922,18 +932,22 @@ int32_t CFDE_TTOLine::AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece) {
|
| }
|
| return index;
|
| }
|
| +
|
| int32_t CFDE_TTOLine::GetSize() const {
|
| return m_iPieceCount;
|
| }
|
| +
|
| FDE_TTOPIECE* CFDE_TTOLine::GetPtrAt(int32_t index) {
|
| if (index >= m_iPieceCount) {
|
| return nullptr;
|
| }
|
| return m_pieces.GetPtrAt(index);
|
| }
|
| +
|
| void CFDE_TTOLine::RemoveLast(int32_t iCount) {
|
| m_pieces.RemoveLast(iCount);
|
| }
|
| +
|
| void CFDE_TTOLine::RemoveAll(FX_BOOL bLeaveMemory) {
|
| m_pieces.RemoveAll(bLeaveMemory);
|
| }
|
|
|