| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fde/tto/fde_textout.h" | 7 #include "xfa/fde/tto/fde_textout.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| 11 #include "core/fxcrt/include/fx_coordinates.h" | 11 #include "core/fxcrt/include/fx_coordinates.h" |
| 12 #include "core/fxcrt/include/fx_system.h" | 12 #include "core/fxcrt/include/fx_system.h" |
| 13 #include "xfa/fde/cfde_path.h" |
| 14 #include "xfa/fde/fde_gedevice.h" |
| 13 #include "xfa/fde/fde_object.h" | 15 #include "xfa/fde/fde_object.h" |
| 14 #include "xfa/fde/fde_renderdevice.h" | |
| 15 #include "xfa/fgas/crt/fgas_memory.h" | 16 #include "xfa/fgas/crt/fgas_memory.h" |
| 16 #include "xfa/fgas/crt/fgas_utils.h" | 17 #include "xfa/fgas/crt/fgas_utils.h" |
| 17 #include "xfa/fgas/layout/fgas_textbreak.h" | 18 #include "xfa/fgas/layout/fgas_textbreak.h" |
| 18 | 19 |
| 19 namespace { | |
| 20 | |
| 21 struct FDE_TTOPIECE { | |
| 22 public: | |
| 23 int32_t iStartChar; | |
| 24 int32_t iChars; | |
| 25 uint32_t dwCharStyles; | |
| 26 CFX_RectF rtPiece; | |
| 27 }; | |
| 28 typedef FDE_TTOPIECE* FDE_LPTTOPIECE; | |
| 29 typedef CFX_MassArrayTemplate<FDE_TTOPIECE> CFDE_TTOPieceArray; | |
| 30 | |
| 31 class CFDE_TTOLine : public CFX_Target { | |
| 32 public: | |
| 33 CFDE_TTOLine(); | |
| 34 CFDE_TTOLine(const CFDE_TTOLine& ttoLine); | |
| 35 ~CFDE_TTOLine(); | |
| 36 int32_t AddPiece(int32_t index, const FDE_TTOPIECE& ttoPiece); | |
| 37 int32_t GetSize() const; | |
| 38 FDE_LPTTOPIECE GetPtrAt(int32_t index); | |
| 39 void RemoveLast(int32_t iCount); | |
| 40 void RemoveAll(FX_BOOL bLeaveMemory); | |
| 41 FX_BOOL m_bNewReload; | |
| 42 CFDE_TTOPieceArray m_pieces; | |
| 43 | |
| 44 protected: | |
| 45 int32_t m_iPieceCount; | |
| 46 }; | |
| 47 typedef CFX_ObjectMassArrayTemplate<CFDE_TTOLine> CFDE_TTOLineArray; | |
| 48 | |
| 49 class CFDE_TextOut : public IFDE_TextOut, public CFX_Target { | |
| 50 public: | |
| 51 CFDE_TextOut(); | |
| 52 ~CFDE_TextOut(); | |
| 53 virtual void Release() { delete this; } | |
| 54 virtual void SetFont(IFX_Font* pFont); | |
| 55 virtual void SetFontSize(FX_FLOAT fFontSize); | |
| 56 virtual void SetTextColor(FX_ARGB color); | |
| 57 virtual void SetStyles(uint32_t dwStyles); | |
| 58 virtual void SetTabWidth(FX_FLOAT fTabWidth); | |
| 59 virtual void SetEllipsisString(const CFX_WideString& wsEllipsis); | |
| 60 virtual void SetParagraphBreakChar(FX_WCHAR wch); | |
| 61 virtual void SetAlignment(int32_t iAlignment); | |
| 62 virtual void SetLineSpace(FX_FLOAT fLineSpace); | |
| 63 virtual void SetDIBitmap(CFX_DIBitmap* pDIB); | |
| 64 virtual void SetRenderDevice(CFX_RenderDevice* pDevice); | |
| 65 virtual void SetClipRect(const CFX_Rect& rtClip); | |
| 66 virtual void SetClipRect(const CFX_RectF& rtClip); | |
| 67 virtual void SetMatrix(const CFX_Matrix& matrix); | |
| 68 virtual void SetLineBreakTolerance(FX_FLOAT fTolerance); | |
| 69 virtual void CalcSize(const FX_WCHAR* pwsStr, | |
| 70 int32_t iLength, | |
| 71 CFX_Size& size); | |
| 72 virtual void CalcSize(const FX_WCHAR* pwsStr, | |
| 73 int32_t iLength, | |
| 74 CFX_SizeF& size); | |
| 75 virtual void CalcSize(const FX_WCHAR* pwsStr, | |
| 76 int32_t iLength, | |
| 77 CFX_Rect& rect); | |
| 78 virtual void CalcSize(const FX_WCHAR* pwsStr, | |
| 79 int32_t iLength, | |
| 80 CFX_RectF& rect); | |
| 81 | |
| 82 virtual void DrawText(const FX_WCHAR* pwsStr, | |
| 83 int32_t iLength, | |
| 84 int32_t x, | |
| 85 int32_t y); | |
| 86 virtual void DrawText(const FX_WCHAR* pwsStr, | |
| 87 int32_t iLength, | |
| 88 FX_FLOAT x, | |
| 89 FX_FLOAT y); | |
| 90 virtual void DrawText(const FX_WCHAR* pwsStr, | |
| 91 int32_t iLength, | |
| 92 const CFX_Rect& rect); | |
| 93 virtual void DrawText(const FX_WCHAR* pwsStr, | |
| 94 int32_t iLength, | |
| 95 const CFX_RectF& rect); | |
| 96 | |
| 97 virtual void SetLogicClipRect(const CFX_RectF& rtClip); | |
| 98 virtual void CalcLogicSize(const FX_WCHAR* pwsStr, | |
| 99 int32_t iLength, | |
| 100 CFX_SizeF& size); | |
| 101 virtual void CalcLogicSize(const FX_WCHAR* pwsStr, | |
| 102 int32_t iLength, | |
| 103 CFX_RectF& rect); | |
| 104 virtual void DrawLogicText(const FX_WCHAR* pwsStr, | |
| 105 int32_t iLength, | |
| 106 FX_FLOAT x, | |
| 107 FX_FLOAT y); | |
| 108 virtual void DrawLogicText(const FX_WCHAR* pwsStr, | |
| 109 int32_t iLength, | |
| 110 const CFX_RectF& rect); | |
| 111 virtual int32_t GetTotalLines(); | |
| 112 | |
| 113 protected: | |
| 114 void CalcTextSize(const FX_WCHAR* pwsStr, int32_t iLength, CFX_RectF& rect); | |
| 115 FX_BOOL RetrieveLineWidth(uint32_t dwBreakStatus, | |
| 116 FX_FLOAT& fStartPos, | |
| 117 FX_FLOAT& fWidth, | |
| 118 FX_FLOAT& fHeight); | |
| 119 void SetLineWidth(CFX_RectF& rect); | |
| 120 void DrawText(const FX_WCHAR* pwsStr, | |
| 121 int32_t iLength, | |
| 122 const CFX_RectF& rect, | |
| 123 const CFX_RectF& rtClip); | |
| 124 void LoadText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_RectF& rect); | |
| 125 void LoadEllipsis(); | |
| 126 void ExpandBuffer(int32_t iSize, int32_t iType); | |
| 127 void RetrieveEllPieces(int32_t*& pCharWidths); | |
| 128 | |
| 129 void Reload(const CFX_RectF& rect); | |
| 130 void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect); | |
| 131 FX_BOOL RetriecePieces(uint32_t dwBreakStatus, | |
| 132 int32_t& iStartChar, | |
| 133 int32_t& iPieceWidths, | |
| 134 FX_BOOL bReload, | |
| 135 const CFX_RectF& rect); | |
| 136 void AppendPiece(const FDE_TTOPIECE& ttoPiece, | |
| 137 FX_BOOL bNeedReload, | |
| 138 FX_BOOL bEnd); | |
| 139 void ReplaceWidthEllipsis(); | |
| 140 void DoAlignment(const CFX_RectF& rect); | |
| 141 void OnDraw(const CFX_RectF& rtClip); | |
| 142 int32_t GetDisplayPos(FDE_LPTTOPIECE pPiece); | |
| 143 int32_t GetCharRects(FDE_LPTTOPIECE pPiece); | |
| 144 | |
| 145 FX_TXTRUN ToTextRun(const FDE_LPTTOPIECE pPiece); | |
| 146 void DrawLine(const FDE_LPTTOPIECE pPiece, CFDE_Pen*& pPen); | |
| 147 | |
| 148 CFX_TxtBreak* m_pTxtBreak; | |
| 149 IFX_Font* m_pFont; | |
| 150 FX_FLOAT m_fFontSize; | |
| 151 FX_FLOAT m_fLineSpace; | |
| 152 FX_FLOAT m_fLinePos; | |
| 153 FX_FLOAT m_fTolerance; | |
| 154 int32_t m_iAlignment; | |
| 155 int32_t m_iTxtBkAlignment; | |
| 156 int32_t* m_pCharWidths; | |
| 157 int32_t m_iChars; | |
| 158 int32_t* m_pEllCharWidths; | |
| 159 int32_t m_iEllChars; | |
| 160 FX_WCHAR m_wParagraphBkChar; | |
| 161 FX_ARGB m_TxtColor; | |
| 162 uint32_t m_dwStyles; | |
| 163 uint32_t m_dwTxtBkStyles; | |
| 164 CFX_WideString m_wsEllipsis; | |
| 165 FX_BOOL m_bElliChanged; | |
| 166 int32_t m_iEllipsisWidth; | |
| 167 CFX_WideString m_wsText; | |
| 168 CFX_RectF m_rtClip; | |
| 169 CFX_RectF m_rtLogicClip; | |
| 170 CFX_Matrix m_Matrix; | |
| 171 CFDE_TTOLineArray m_ttoLines; | |
| 172 int32_t m_iCurLine; | |
| 173 int32_t m_iCurPiece; | |
| 174 int32_t m_iTotalLines; | |
| 175 FXTEXT_CHARPOS* m_pCharPos; | |
| 176 int32_t m_iCharPosSize; | |
| 177 IFDE_RenderDevice* m_pRenderDevice; | |
| 178 CFX_Int32Array m_hotKeys; | |
| 179 CFX_RectFArray m_rectArray; | |
| 180 }; | |
| 181 | |
| 182 } // namespace | |
| 183 | |
| 184 IFDE_TextOut* IFDE_TextOut::Create() { | |
| 185 return new CFDE_TextOut; | |
| 186 } | |
| 187 CFDE_TextOut::CFDE_TextOut() | 20 CFDE_TextOut::CFDE_TextOut() |
| 188 : m_pFont(NULL), | 21 : m_pFont(NULL), |
| 189 m_fFontSize(12.0f), | 22 m_fFontSize(12.0f), |
| 190 m_fLineSpace(m_fFontSize), | 23 m_fLineSpace(m_fFontSize), |
| 191 m_fLinePos(0.0f), | 24 m_fLinePos(0.0f), |
| 192 m_fTolerance(0.0f), | 25 m_fTolerance(0.0f), |
| 193 m_iAlignment(0), | 26 m_iAlignment(0), |
| 194 m_iTxtBkAlignment(0), | 27 m_iTxtBkAlignment(0), |
| 195 m_pCharWidths(NULL), | 28 m_pCharWidths(NULL), |
| 196 m_iChars(0), | 29 m_iChars(0), |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 m_iTxtBkAlignment = FX_TXTLINEALIGNMENT_Left; | 125 m_iTxtBkAlignment = FX_TXTLINEALIGNMENT_Left; |
| 293 break; | 126 break; |
| 294 } | 127 } |
| 295 m_pTxtBreak->SetAlignment(m_iTxtBkAlignment); | 128 m_pTxtBreak->SetAlignment(m_iTxtBkAlignment); |
| 296 } | 129 } |
| 297 void CFDE_TextOut::SetLineSpace(FX_FLOAT fLineSpace) { | 130 void CFDE_TextOut::SetLineSpace(FX_FLOAT fLineSpace) { |
| 298 FXSYS_assert(fLineSpace > 1.0f); | 131 FXSYS_assert(fLineSpace > 1.0f); |
| 299 m_fLineSpace = fLineSpace; | 132 m_fLineSpace = fLineSpace; |
| 300 } | 133 } |
| 301 void CFDE_TextOut::SetDIBitmap(CFX_DIBitmap* pDIB) { | 134 void CFDE_TextOut::SetDIBitmap(CFX_DIBitmap* pDIB) { |
| 302 FXSYS_assert(pDIB != NULL); | 135 FXSYS_assert(pDIB); |
| 303 if (m_pRenderDevice != NULL) { | 136 |
| 137 if (m_pRenderDevice) |
| 304 m_pRenderDevice->Release(); | 138 m_pRenderDevice->Release(); |
| 305 } | 139 |
| 306 m_pRenderDevice = IFDE_RenderDevice::Create(pDIB); | 140 CFX_FxgeDevice* device = new CFX_FxgeDevice; |
| 141 device->Attach(pDIB, 0, FALSE); |
| 142 m_pRenderDevice = new CFDE_RenderDevice(device, FALSE); |
| 307 } | 143 } |
| 144 |
| 308 void CFDE_TextOut::SetRenderDevice(CFX_RenderDevice* pDevice) { | 145 void CFDE_TextOut::SetRenderDevice(CFX_RenderDevice* pDevice) { |
| 309 FXSYS_assert(pDevice != NULL); | 146 FXSYS_assert(pDevice); |
| 310 if (m_pRenderDevice != NULL) { | 147 |
| 148 if (m_pRenderDevice) |
| 311 m_pRenderDevice->Release(); | 149 m_pRenderDevice->Release(); |
| 312 } | 150 |
| 313 m_pRenderDevice = IFDE_RenderDevice::Create(pDevice); | 151 m_pRenderDevice = new CFDE_RenderDevice(pDevice, FALSE); |
| 314 } | 152 } |
| 153 |
| 315 void CFDE_TextOut::SetClipRect(const CFX_Rect& rtClip) { | 154 void CFDE_TextOut::SetClipRect(const CFX_Rect& rtClip) { |
| 316 m_rtClip.Set((FX_FLOAT)rtClip.left, (FX_FLOAT)rtClip.top, | 155 m_rtClip.Set((FX_FLOAT)rtClip.left, (FX_FLOAT)rtClip.top, |
| 317 (FX_FLOAT)rtClip.Width(), (FX_FLOAT)rtClip.Height()); | 156 (FX_FLOAT)rtClip.Width(), (FX_FLOAT)rtClip.Height()); |
| 318 } | 157 } |
| 319 void CFDE_TextOut::SetClipRect(const CFX_RectF& rtClip) { | 158 void CFDE_TextOut::SetClipRect(const CFX_RectF& rtClip) { |
| 320 m_rtClip = rtClip; | 159 m_rtClip = rtClip; |
| 321 } | 160 } |
| 322 void CFDE_TextOut::SetLogicClipRect(const CFX_RectF& rtClip) { | 161 void CFDE_TextOut::SetLogicClipRect(const CFX_RectF& rtClip) { |
| 323 m_rtLogicClip = rtClip; | 162 m_rtLogicClip = rtClip; |
| 324 } | 163 } |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 827 for (int32_t i = 0; i < iLines; i++) { | 666 for (int32_t i = 0; i < iLines; i++) { |
| 828 CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i); | 667 CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i); |
| 829 if (!pLine->m_bNewReload) { | 668 if (!pLine->m_bNewReload) { |
| 830 continue; | 669 continue; |
| 831 } | 670 } |
| 832 int32_t iEllipsisCharIndex = iLength - 1; | 671 int32_t iEllipsisCharIndex = iLength - 1; |
| 833 int32_t iCharWidth = 0; | 672 int32_t iCharWidth = 0; |
| 834 int32_t iCharCount = 0; | 673 int32_t iCharCount = 0; |
| 835 int32_t iPiece = pLine->GetSize(); | 674 int32_t iPiece = pLine->GetSize(); |
| 836 while (iPiece-- > 0) { | 675 while (iPiece-- > 0) { |
| 837 FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(iPiece); | 676 FDE_TTOPIECE* pPiece = pLine->GetPtrAt(iPiece); |
| 838 if (pPiece == NULL) { | 677 if (pPiece == NULL) { |
| 839 break; | 678 break; |
| 840 } | 679 } |
| 841 for (int32_t j = pPiece->iChars - 1; j >= 0; j--) { | 680 for (int32_t j = pPiece->iChars - 1; j >= 0; j--) { |
| 842 if (iEllipsisCharIndex < 0) { | 681 if (iEllipsisCharIndex < 0) { |
| 843 break; | 682 break; |
| 844 } | 683 } |
| 845 int32_t index = pPiece->iStartChar + j; | 684 int32_t index = pPiece->iStartChar + j; |
| 846 iCharWidth += m_pCharWidths[index]; | 685 iCharWidth += m_pCharWidths[index]; |
| 847 iCharCount++; | 686 iCharCount++; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 869 } | 708 } |
| 870 m_iCurLine = i; | 709 m_iCurLine = i; |
| 871 m_iCurPiece = 0; | 710 m_iCurPiece = 0; |
| 872 ReloadLinePiece(pLine, rect); | 711 ReloadLinePiece(pLine, rect); |
| 873 } | 712 } |
| 874 } | 713 } |
| 875 void CFDE_TextOut::ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect) { | 714 void CFDE_TextOut::ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect) { |
| 876 const FX_WCHAR* pwsStr = m_wsText.c_str(); | 715 const FX_WCHAR* pwsStr = m_wsText.c_str(); |
| 877 FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout); | 716 FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout); |
| 878 int32_t iPieceWidths = 0; | 717 int32_t iPieceWidths = 0; |
| 879 FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(0); | 718 FDE_TTOPIECE* pPiece = pLine->GetPtrAt(0); |
| 880 int32_t iStartChar = pPiece->iStartChar; | 719 int32_t iStartChar = pPiece->iStartChar; |
| 881 m_fLinePos = bVertical ? pPiece->rtPiece.left : pPiece->rtPiece.top; | 720 m_fLinePos = bVertical ? pPiece->rtPiece.left : pPiece->rtPiece.top; |
| 882 int32_t iPieceCount = pLine->GetSize(); | 721 int32_t iPieceCount = pLine->GetSize(); |
| 883 int32_t iPieceIndex = 0; | 722 int32_t iPieceIndex = 0; |
| 884 uint32_t dwBreakStatus = 0; | 723 uint32_t dwBreakStatus = 0; |
| 885 FX_WCHAR wch; | 724 FX_WCHAR wch; |
| 886 while (iPieceIndex < iPieceCount) { | 725 while (iPieceIndex < iPieceCount) { |
| 887 int32_t iStar = iStartChar; | 726 int32_t iStar = iStartChar; |
| 888 int32_t iEnd = pPiece->iChars + iStar; | 727 int32_t iEnd = pPiece->iChars + iStar; |
| 889 while (iStar < iEnd) { | 728 while (iStar < iEnd) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 904 m_pTxtBreak->Reset(); | 743 m_pTxtBreak->Reset(); |
| 905 } | 744 } |
| 906 void CFDE_TextOut::DoAlignment(const CFX_RectF& rect) { | 745 void CFDE_TextOut::DoAlignment(const CFX_RectF& rect) { |
| 907 FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout); | 746 FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout); |
| 908 FX_FLOAT fLineStopS = bVertical ? rect.right() : rect.bottom(); | 747 FX_FLOAT fLineStopS = bVertical ? rect.right() : rect.bottom(); |
| 909 int32_t iLines = m_ttoLines.GetSize(); | 748 int32_t iLines = m_ttoLines.GetSize(); |
| 910 if (iLines < 1) { | 749 if (iLines < 1) { |
| 911 return; | 750 return; |
| 912 } | 751 } |
| 913 CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(iLines - 1); | 752 CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(iLines - 1); |
| 914 FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(0); | 753 FDE_TTOPIECE* pPiece = pLine->GetPtrAt(0); |
| 915 if (pPiece == NULL) { | 754 if (pPiece == NULL) { |
| 916 return; | 755 return; |
| 917 } | 756 } |
| 918 FX_FLOAT fLineStopD = | 757 FX_FLOAT fLineStopD = |
| 919 bVertical ? pPiece->rtPiece.right() : pPiece->rtPiece.bottom(); | 758 bVertical ? pPiece->rtPiece.right() : pPiece->rtPiece.bottom(); |
| 920 FX_FLOAT fInc = fLineStopS - fLineStopD; | 759 FX_FLOAT fInc = fLineStopS - fLineStopD; |
| 921 if (m_iAlignment >= FDE_TTOALIGNMENT_CenterLeft && | 760 if (m_iAlignment >= FDE_TTOALIGNMENT_CenterLeft && |
| 922 m_iAlignment < FDE_TTOALIGNMENT_BottomLeft) { | 761 m_iAlignment < FDE_TTOALIGNMENT_BottomLeft) { |
| 923 fInc /= 2.0f; | 762 fInc /= 2.0f; |
| 924 } else if (m_iAlignment < FDE_TTOALIGNMENT_CenterLeft) { | 763 } else if (m_iAlignment < FDE_TTOALIGNMENT_CenterLeft) { |
| 925 fInc = 0.0f; | 764 fInc = 0.0f; |
| 926 } | 765 } |
| 927 if (fInc < 1.0f) { | 766 if (fInc < 1.0f) { |
| 928 return; | 767 return; |
| 929 } | 768 } |
| 930 for (int32_t i = 0; i < iLines; i++) { | 769 for (int32_t i = 0; i < iLines; i++) { |
| 931 CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i); | 770 CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i); |
| 932 int32_t iPieces = pLine->GetSize(); | 771 int32_t iPieces = pLine->GetSize(); |
| 933 for (int32_t j = 0; j < iPieces; j++) { | 772 for (int32_t j = 0; j < iPieces; j++) { |
| 934 FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(j); | 773 FDE_TTOPIECE* pPiece = pLine->GetPtrAt(j); |
| 935 if (bVertical) { | 774 if (bVertical) { |
| 936 pPiece->rtPiece.left += fInc; | 775 pPiece->rtPiece.left += fInc; |
| 937 } else { | 776 } else { |
| 938 pPiece->rtPiece.top += fInc; | 777 pPiece->rtPiece.top += fInc; |
| 939 } | 778 } |
| 940 } | 779 } |
| 941 } | 780 } |
| 942 } | 781 } |
| 943 void CFDE_TextOut::OnDraw(const CFX_RectF& rtClip) { | 782 void CFDE_TextOut::OnDraw(const CFX_RectF& rtClip) { |
| 944 if (m_pRenderDevice == NULL) { | 783 if (m_pRenderDevice == NULL) { |
| 945 return; | 784 return; |
| 946 } | 785 } |
| 947 int32_t iLines = m_ttoLines.GetSize(); | 786 int32_t iLines = m_ttoLines.GetSize(); |
| 948 if (iLines < 1) { | 787 if (iLines < 1) { |
| 949 return; | 788 return; |
| 950 } | 789 } |
| 951 CFDE_Brush* pBrush = new CFDE_Brush; | 790 CFDE_Brush* pBrush = new CFDE_Brush; |
| 952 pBrush->SetColor(m_TxtColor); | 791 pBrush->SetColor(m_TxtColor); |
| 953 CFDE_Pen* pPen = NULL; | 792 CFDE_Pen* pPen = NULL; |
| 954 FDE_HDEVICESTATE hDev = m_pRenderDevice->SaveState(); | 793 FDE_HDEVICESTATE hDev = m_pRenderDevice->SaveState(); |
| 955 if (rtClip.Width() > 0.0f && rtClip.Height() > 0.0f) { | 794 if (rtClip.Width() > 0.0f && rtClip.Height() > 0.0f) { |
| 956 m_pRenderDevice->SetClipRect(rtClip); | 795 m_pRenderDevice->SetClipRect(rtClip); |
| 957 } | 796 } |
| 958 for (int32_t i = 0; i < iLines; i++) { | 797 for (int32_t i = 0; i < iLines; i++) { |
| 959 CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i); | 798 CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(i); |
| 960 int32_t iPieces = pLine->GetSize(); | 799 int32_t iPieces = pLine->GetSize(); |
| 961 for (int32_t j = 0; j < iPieces; j++) { | 800 for (int32_t j = 0; j < iPieces; j++) { |
| 962 FDE_LPTTOPIECE pPiece = pLine->GetPtrAt(j); | 801 FDE_TTOPIECE* pPiece = pLine->GetPtrAt(j); |
| 963 if (pPiece == NULL) { | 802 if (pPiece == NULL) { |
| 964 continue; | 803 continue; |
| 965 } | 804 } |
| 966 int32_t iCount = GetDisplayPos(pPiece); | 805 int32_t iCount = GetDisplayPos(pPiece); |
| 967 if (iCount > 0) { | 806 if (iCount > 0) { |
| 968 m_pRenderDevice->DrawString(pBrush, m_pFont, m_pCharPos, iCount, | 807 m_pRenderDevice->DrawString(pBrush, m_pFont, m_pCharPos, iCount, |
| 969 m_fFontSize, &m_Matrix); | 808 m_fFontSize, &m_Matrix); |
| 970 } | 809 } |
| 971 DrawLine(pPiece, pPen); | 810 DrawLine(pPiece, pPen); |
| 972 } | 811 } |
| 973 } | 812 } |
| 974 m_pRenderDevice->RestoreState(hDev); | 813 m_pRenderDevice->RestoreState(hDev); |
| 975 delete pBrush; | 814 delete pBrush; |
| 976 delete pPen; | 815 delete pPen; |
| 977 } | 816 } |
| 978 | 817 |
| 979 int32_t CFDE_TextOut::GetDisplayPos(FDE_LPTTOPIECE pPiece) { | 818 int32_t CFDE_TextOut::GetDisplayPos(FDE_TTOPIECE* pPiece) { |
| 980 FX_TXTRUN tr = ToTextRun(pPiece); | 819 FX_TXTRUN tr = ToTextRun(pPiece); |
| 981 ExpandBuffer(tr.iLength, 2); | 820 ExpandBuffer(tr.iLength, 2); |
| 982 return m_pTxtBreak->GetDisplayPos(&tr, m_pCharPos); | 821 return m_pTxtBreak->GetDisplayPos(&tr, m_pCharPos); |
| 983 } | 822 } |
| 984 | 823 |
| 985 int32_t CFDE_TextOut::GetCharRects(FDE_LPTTOPIECE pPiece) { | 824 int32_t CFDE_TextOut::GetCharRects(const FDE_TTOPIECE* pPiece) { |
| 986 FX_TXTRUN tr = ToTextRun(pPiece); | 825 FX_TXTRUN tr = ToTextRun(pPiece); |
| 987 m_rectArray.RemoveAll(); | 826 m_rectArray.RemoveAll(); |
| 988 return m_pTxtBreak->GetCharRects(&tr, m_rectArray); | 827 return m_pTxtBreak->GetCharRects(&tr, m_rectArray); |
| 989 } | 828 } |
| 990 | 829 |
| 991 FX_TXTRUN CFDE_TextOut::ToTextRun(const FDE_LPTTOPIECE pPiece) { | 830 FX_TXTRUN CFDE_TextOut::ToTextRun(const FDE_TTOPIECE* pPiece) { |
| 992 FX_TXTRUN tr; | 831 FX_TXTRUN tr; |
| 993 tr.wsStr = m_wsText + pPiece->iStartChar; | 832 tr.wsStr = m_wsText + pPiece->iStartChar; |
| 994 tr.pWidths = m_pCharWidths + pPiece->iStartChar; | 833 tr.pWidths = m_pCharWidths + pPiece->iStartChar; |
| 995 tr.iLength = pPiece->iChars; | 834 tr.iLength = pPiece->iChars; |
| 996 tr.pFont = m_pFont; | 835 tr.pFont = m_pFont; |
| 997 tr.fFontSize = m_fFontSize; | 836 tr.fFontSize = m_fFontSize; |
| 998 tr.dwStyles = m_dwTxtBkStyles; | 837 tr.dwStyles = m_dwTxtBkStyles; |
| 999 tr.dwCharStyles = pPiece->dwCharStyles; | 838 tr.dwCharStyles = pPiece->dwCharStyles; |
| 1000 tr.wLineBreakChar = m_wParagraphBkChar; | 839 tr.wLineBreakChar = m_wParagraphBkChar; |
| 1001 tr.pRect = &pPiece->rtPiece; | 840 tr.pRect = &pPiece->rtPiece; |
| 1002 return tr; | 841 return tr; |
| 1003 } | 842 } |
| 1004 | 843 |
| 1005 void CFDE_TextOut::DrawLine(const FDE_LPTTOPIECE pPiece, CFDE_Pen*& pPen) { | 844 void CFDE_TextOut::DrawLine(const FDE_TTOPIECE* pPiece, CFDE_Pen*& pPen) { |
| 1006 FX_BOOL bUnderLine = !!(m_dwStyles & FDE_TTOSTYLE_Underline); | 845 FX_BOOL bUnderLine = !!(m_dwStyles & FDE_TTOSTYLE_Underline); |
| 1007 FX_BOOL bStrikeOut = !!(m_dwStyles & FDE_TTOSTYLE_Strikeout); | 846 FX_BOOL bStrikeOut = !!(m_dwStyles & FDE_TTOSTYLE_Strikeout); |
| 1008 FX_BOOL bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey); | 847 FX_BOOL bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey); |
| 1009 FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout); | 848 FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout); |
| 1010 if (!bUnderLine && !bStrikeOut && !bHotKey) { | 849 if (!bUnderLine && !bStrikeOut && !bHotKey) { |
| 1011 return; | 850 return; |
| 1012 } | 851 } |
| 1013 if (pPen == NULL) { | 852 if (pPen == NULL) { |
| 1014 pPen = new CFDE_Pen; | 853 pPen = new CFDE_Pen; |
| 1015 pPen->SetColor(m_TxtColor); | 854 pPen->SetColor(m_TxtColor); |
| 1016 } | 855 } |
| 1017 IFDE_Path* pPath = IFDE_Path::Create(); | 856 CFDE_Path* pPath = new CFDE_Path; |
| 1018 int32_t iLineCount = 0; | 857 int32_t iLineCount = 0; |
| 1019 CFX_RectF rtText = pPiece->rtPiece; | 858 CFX_RectF rtText = pPiece->rtPiece; |
| 1020 CFX_PointF pt1, pt2; | 859 CFX_PointF pt1, pt2; |
| 1021 if (bUnderLine) { | 860 if (bUnderLine) { |
| 1022 if (bVertical) { | 861 if (bVertical) { |
| 1023 pt1.x = rtText.left; | 862 pt1.x = rtText.left; |
| 1024 pt1.y = rtText.top; | 863 pt1.y = rtText.top; |
| 1025 pt2.x = rtText.left; | 864 pt2.x = rtText.left; |
| 1026 pt2.y = rtText.bottom(); | 865 pt2.y = rtText.bottom(); |
| 1027 } else { | 866 } else { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1093 m_iPieceCount++; | 932 m_iPieceCount++; |
| 1094 } else { | 933 } else { |
| 1095 FDE_TTOPIECE& piece = m_pieces.GetAt(index); | 934 FDE_TTOPIECE& piece = m_pieces.GetAt(index); |
| 1096 piece = ttoPiece; | 935 piece = ttoPiece; |
| 1097 } | 936 } |
| 1098 return index; | 937 return index; |
| 1099 } | 938 } |
| 1100 int32_t CFDE_TTOLine::GetSize() const { | 939 int32_t CFDE_TTOLine::GetSize() const { |
| 1101 return m_iPieceCount; | 940 return m_iPieceCount; |
| 1102 } | 941 } |
| 1103 FDE_LPTTOPIECE CFDE_TTOLine::GetPtrAt(int32_t index) { | 942 FDE_TTOPIECE* CFDE_TTOLine::GetPtrAt(int32_t index) { |
| 1104 if (index >= m_iPieceCount) { | 943 if (index >= m_iPieceCount) { |
| 1105 return NULL; | 944 return NULL; |
| 1106 } | 945 } |
| 1107 return m_pieces.GetPtrAt(index); | 946 return m_pieces.GetPtrAt(index); |
| 1108 } | 947 } |
| 1109 void CFDE_TTOLine::RemoveLast(int32_t iCount) { | 948 void CFDE_TTOLine::RemoveLast(int32_t iCount) { |
| 1110 m_pieces.RemoveLast(iCount); | 949 m_pieces.RemoveLast(iCount); |
| 1111 } | 950 } |
| 1112 void CFDE_TTOLine::RemoveAll(FX_BOOL bLeaveMemory) { | 951 void CFDE_TTOLine::RemoveAll(FX_BOOL bLeaveMemory) { |
| 1113 m_pieces.RemoveAll(bLeaveMemory); | 952 m_pieces.RemoveAll(bLeaveMemory); |
| 1114 } | 953 } |
| OLD | NEW |