| Index: xfa/fde/tto/fde_textout.cpp
|
| diff --git a/xfa/fde/tto/fde_textout.cpp b/xfa/fde/tto/fde_textout.cpp
|
| index 7895b785f3dbb32b8a076126be90df69ec296114..a18fbbd0ae97fa49bbe76a6b84cf32a7488ec491 100644
|
| --- a/xfa/fde/tto/fde_textout.cpp
|
| +++ b/xfa/fde/tto/fde_textout.cpp
|
| @@ -10,180 +10,13 @@
|
|
|
| #include "core/fxcrt/include/fx_coordinates.h"
|
| #include "core/fxcrt/include/fx_system.h"
|
| +#include "xfa/fde/cfde_path.h"
|
| +#include "xfa/fde/fde_gedevice.h"
|
| #include "xfa/fde/fde_object.h"
|
| -#include "xfa/fde/fde_renderdevice.h"
|
| #include "xfa/fgas/crt/fgas_memory.h"
|
| #include "xfa/fgas/crt/fgas_utils.h"
|
| #include "xfa/fgas/layout/fgas_textbreak.h"
|
|
|
| -namespace {
|
| -
|
| -struct FDE_TTOPIECE {
|
| - public:
|
| - int32_t iStartChar;
|
| - int32_t iChars;
|
| - uint32_t dwCharStyles;
|
| - CFX_RectF rtPiece;
|
| -};
|
| -typedef FDE_TTOPIECE* FDE_LPTTOPIECE;
|
| -typedef CFX_MassArrayTemplate<FDE_TTOPIECE> CFDE_TTOPieceArray;
|
| -
|
| -class CFDE_TTOLine : public CFX_Target {
|
| - public:
|
| - CFDE_TTOLine();
|
| - CFDE_TTOLine(const CFDE_TTOLine& ttoLine);
|
| - ~CFDE_TTOLine();
|
| - int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece);
|
| - int32_t GetSize() const;
|
| - FDE_LPTTOPIECE GetPtrAt(int32_t index);
|
| - void RemoveLast(int32_t iCount);
|
| - void RemoveAll(FX_BOOL bLeaveMemory);
|
| - FX_BOOL m_bNewReload;
|
| - CFDE_TTOPieceArray m_pieces;
|
| -
|
| - protected:
|
| - int32_t m_iPieceCount;
|
| -};
|
| -typedef CFX_ObjectMassArrayTemplate<CFDE_TTOLine> CFDE_TTOLineArray;
|
| -
|
| -class CFDE_TextOut : public IFDE_TextOut, public CFX_Target {
|
| - public:
|
| - CFDE_TextOut();
|
| - ~CFDE_TextOut();
|
| - virtual void Release() { delete this; }
|
| - virtual void SetFont(IFX_Font* pFont);
|
| - virtual void SetFontSize(FX_FLOAT fFontSize);
|
| - virtual void SetTextColor(FX_ARGB color);
|
| - virtual void SetStyles(uint32_t dwStyles);
|
| - virtual void SetTabWidth(FX_FLOAT fTabWidth);
|
| - virtual void SetEllipsisString(const CFX_WideString& wsEllipsis);
|
| - virtual void SetParagraphBreakChar(FX_WCHAR wch);
|
| - virtual void SetAlignment(int32_t iAlignment);
|
| - virtual void SetLineSpace(FX_FLOAT fLineSpace);
|
| - virtual void SetDIBitmap(CFX_DIBitmap* pDIB);
|
| - virtual void SetRenderDevice(CFX_RenderDevice* pDevice);
|
| - virtual void SetClipRect(const CFX_Rect& rtClip);
|
| - virtual void SetClipRect(const CFX_RectF& rtClip);
|
| - virtual void SetMatrix(const CFX_Matrix& matrix);
|
| - virtual void SetLineBreakTolerance(FX_FLOAT fTolerance);
|
| - virtual void CalcSize(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - CFX_Size& size);
|
| - virtual void CalcSize(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - CFX_SizeF& size);
|
| - virtual void CalcSize(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - CFX_Rect& rect);
|
| - virtual void CalcSize(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - CFX_RectF& rect);
|
| -
|
| - virtual void DrawText(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - int32_t x,
|
| - int32_t y);
|
| - virtual void DrawText(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - FX_FLOAT x,
|
| - FX_FLOAT y);
|
| - virtual void DrawText(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - const CFX_Rect& rect);
|
| - virtual void DrawText(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - const CFX_RectF& rect);
|
| -
|
| - virtual void SetLogicClipRect(const CFX_RectF& rtClip);
|
| - virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - CFX_SizeF& size);
|
| - virtual void CalcLogicSize(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - CFX_RectF& rect);
|
| - virtual void DrawLogicText(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - FX_FLOAT x,
|
| - FX_FLOAT y);
|
| - virtual void DrawLogicText(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - const CFX_RectF& rect);
|
| - virtual int32_t GetTotalLines();
|
| -
|
| - protected:
|
| - void CalcTextSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_RectF& rect);
|
| - FX_BOOL RetrieveLineWidth(uint32_t dwBreakStatus,
|
| - FX_FLOAT& fStartPos,
|
| - FX_FLOAT& fWidth,
|
| - FX_FLOAT& fHeight);
|
| - void SetLineWidth(CFX_RectF& rect);
|
| - void DrawText(const FX_WCHAR* pwsStr,
|
| - int32_t iLength,
|
| - const CFX_RectF& rect,
|
| - const CFX_RectF& rtClip);
|
| - void LoadText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_RectF& rect);
|
| - void LoadEllipsis();
|
| - void ExpandBuffer(int32_t iSize, int32_t iType);
|
| - void RetrieveEllPieces(int32_t*& pCharWidths);
|
| -
|
| - void Reload(const CFX_RectF& rect);
|
| - void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
|
| - FX_BOOL RetriecePieces(uint32_t dwBreakStatus,
|
| - int32_t& iStartChar,
|
| - int32_t& iPieceWidths,
|
| - FX_BOOL bReload,
|
| - const CFX_RectF& rect);
|
| - void AppendPiece(const FDE_TTOPIECE& ttoPiece,
|
| - FX_BOOL bNeedReload,
|
| - FX_BOOL bEnd);
|
| - void ReplaceWidthEllipsis();
|
| - void DoAlignment(const CFX_RectF& rect);
|
| - void OnDraw(const CFX_RectF& rtClip);
|
| - int32_t GetDisplayPos(FDE_LPTTOPIECE pPiece);
|
| - int32_t GetCharRects(FDE_LPTTOPIECE pPiece);
|
| -
|
| - FX_TXTRUN ToTextRun(const FDE_LPTTOPIECE pPiece);
|
| - void DrawLine(const FDE_LPTTOPIECE pPiece, CFDE_Pen*& pPen);
|
| -
|
| - CFX_TxtBreak* m_pTxtBreak;
|
| - IFX_Font* m_pFont;
|
| - FX_FLOAT m_fFontSize;
|
| - FX_FLOAT m_fLineSpace;
|
| - FX_FLOAT m_fLinePos;
|
| - FX_FLOAT m_fTolerance;
|
| - int32_t m_iAlignment;
|
| - int32_t m_iTxtBkAlignment;
|
| - int32_t* m_pCharWidths;
|
| - int32_t m_iChars;
|
| - int32_t* m_pEllCharWidths;
|
| - int32_t m_iEllChars;
|
| - FX_WCHAR m_wParagraphBkChar;
|
| - FX_ARGB m_TxtColor;
|
| - uint32_t m_dwStyles;
|
| - uint32_t m_dwTxtBkStyles;
|
| - CFX_WideString m_wsEllipsis;
|
| - FX_BOOL m_bElliChanged;
|
| - int32_t m_iEllipsisWidth;
|
| - CFX_WideString m_wsText;
|
| - CFX_RectF m_rtClip;
|
| - CFX_RectF m_rtLogicClip;
|
| - CFX_Matrix m_Matrix;
|
| - CFDE_TTOLineArray m_ttoLines;
|
| - int32_t m_iCurLine;
|
| - int32_t m_iCurPiece;
|
| - int32_t m_iTotalLines;
|
| - FXTEXT_CHARPOS* m_pCharPos;
|
| - int32_t m_iCharPosSize;
|
| - IFDE_RenderDevice* m_pRenderDevice;
|
| - CFX_Int32Array m_hotKeys;
|
| - CFX_RectFArray m_rectArray;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -IFDE_TextOut* IFDE_TextOut::Create() {
|
| - return new CFDE_TextOut;
|
| -}
|
| CFDE_TextOut::CFDE_TextOut()
|
| : m_pFont(NULL),
|
| m_fFontSize(12.0f),
|
| @@ -299,19 +132,25 @@ void CFDE_TextOut::SetLineSpace(FX_FLOAT fLineSpace) {
|
| m_fLineSpace = fLineSpace;
|
| }
|
| void CFDE_TextOut::SetDIBitmap(CFX_DIBitmap* pDIB) {
|
| - FXSYS_assert(pDIB != NULL);
|
| - if (m_pRenderDevice != NULL) {
|
| + FXSYS_assert(pDIB);
|
| +
|
| + if (m_pRenderDevice)
|
| m_pRenderDevice->Release();
|
| - }
|
| - m_pRenderDevice = IFDE_RenderDevice::Create(pDIB);
|
| +
|
| + CFX_FxgeDevice* device = new CFX_FxgeDevice;
|
| + device->Attach(pDIB, 0, FALSE);
|
| + m_pRenderDevice = new CFDE_RenderDevice(device, FALSE);
|
| }
|
| +
|
| void CFDE_TextOut::SetRenderDevice(CFX_RenderDevice* pDevice) {
|
| - FXSYS_assert(pDevice != NULL);
|
| - if (m_pRenderDevice != NULL) {
|
| + FXSYS_assert(pDevice);
|
| +
|
| + if (m_pRenderDevice)
|
| m_pRenderDevice->Release();
|
| - }
|
| - m_pRenderDevice = IFDE_RenderDevice::Create(pDevice);
|
| +
|
| + m_pRenderDevice = new CFDE_RenderDevice(pDevice, FALSE);
|
| }
|
| +
|
| 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());
|
| @@ -834,7 +673,7 @@ void CFDE_TextOut::ReplaceWidthEllipsis() {
|
| int32_t iCharCount = 0;
|
| int32_t iPiece = pLine->GetSize();
|
| while (iPiece-- > 0) {
|
| - FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(iPiece);
|
| + FDE_TTOPIECE* pPiece = pLine->GetPtrAt(iPiece);
|
| if (pPiece == NULL) {
|
| break;
|
| }
|
| @@ -876,7 +715,7 @@ 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_LPTTOPIECE pPiece = pLine->GetPtrAt(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();
|
| @@ -911,7 +750,7 @@ void CFDE_TextOut::DoAlignment(const CFX_RectF& rect) {
|
| return;
|
| }
|
| CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(iLines - 1);
|
| - FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(0);
|
| + FDE_TTOPIECE* pPiece = pLine->GetPtrAt(0);
|
| if (pPiece == NULL) {
|
| return;
|
| }
|
| @@ -931,7 +770,7 @@ void CFDE_TextOut::DoAlignment(const CFX_RectF& rect) {
|
| CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i);
|
| int32_t iPieces = pLine->GetSize();
|
| for (int32_t j = 0; j < iPieces; j++) {
|
| - FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(j);
|
| + FDE_TTOPIECE* pPiece = pLine->GetPtrAt(j);
|
| if (bVertical) {
|
| pPiece->rtPiece.left += fInc;
|
| } else {
|
| @@ -959,7 +798,7 @@ void CFDE_TextOut::OnDraw(const CFX_RectF& rtClip) {
|
| CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i);
|
| int32_t iPieces = pLine->GetSize();
|
| for (int32_t j = 0; j < iPieces; j++) {
|
| - FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(j);
|
| + FDE_TTOPIECE* pPiece = pLine->GetPtrAt(j);
|
| if (pPiece == NULL) {
|
| continue;
|
| }
|
| @@ -976,19 +815,19 @@ void CFDE_TextOut::OnDraw(const CFX_RectF& rtClip) {
|
| delete pPen;
|
| }
|
|
|
| -int32_t CFDE_TextOut::GetDisplayPos(FDE_LPTTOPIECE pPiece) {
|
| +int32_t CFDE_TextOut::GetDisplayPos(FDE_TTOPIECE* pPiece) {
|
| FX_TXTRUN tr = ToTextRun(pPiece);
|
| ExpandBuffer(tr.iLength, 2);
|
| return m_pTxtBreak->GetDisplayPos(&tr, m_pCharPos);
|
| }
|
|
|
| -int32_t CFDE_TextOut::GetCharRects(FDE_LPTTOPIECE pPiece) {
|
| +int32_t CFDE_TextOut::GetCharRects(const FDE_TTOPIECE* pPiece) {
|
| FX_TXTRUN tr = ToTextRun(pPiece);
|
| m_rectArray.RemoveAll();
|
| return m_pTxtBreak->GetCharRects(&tr, m_rectArray);
|
| }
|
|
|
| -FX_TXTRUN CFDE_TextOut::ToTextRun(const FDE_LPTTOPIECE 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;
|
| @@ -1002,7 +841,7 @@ FX_TXTRUN CFDE_TextOut::ToTextRun(const FDE_LPTTOPIECE pPiece) {
|
| return tr;
|
| }
|
|
|
| -void CFDE_TextOut::DrawLine(const FDE_LPTTOPIECE pPiece, CFDE_Pen*& pPen) {
|
| +void CFDE_TextOut::DrawLine(const FDE_TTOPIECE* pPiece, CFDE_Pen*& pPen) {
|
| FX_BOOL bUnderLine = !!(m_dwStyles & FDE_TTOSTYLE_Underline);
|
| FX_BOOL bStrikeOut = !!(m_dwStyles & FDE_TTOSTYLE_Strikeout);
|
| FX_BOOL bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey);
|
| @@ -1014,7 +853,7 @@ void CFDE_TextOut::DrawLine(const FDE_LPTTOPIECE pPiece, CFDE_Pen*& pPen) {
|
| pPen = new CFDE_Pen;
|
| pPen->SetColor(m_TxtColor);
|
| }
|
| - IFDE_Path* pPath = IFDE_Path::Create();
|
| + CFDE_Path* pPath = new CFDE_Path;
|
| int32_t iLineCount = 0;
|
| CFX_RectF rtText = pPiece->rtPiece;
|
| CFX_PointF pt1, pt2;
|
| @@ -1100,7 +939,7 @@ int32_t CFDE_TTOLine::AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece) {
|
| int32_t CFDE_TTOLine::GetSize() const {
|
| return m_iPieceCount;
|
| }
|
| -FDE_LPTTOPIECE CFDE_TTOLine::GetPtrAt(int32_t index) {
|
| +FDE_TTOPIECE* CFDE_TTOLine::GetPtrAt(int32_t index) {
|
| if (index >= m_iPieceCount) {
|
| return NULL;
|
| }
|
|
|