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 void ToTextRun(const FDE_LPTTOPIECE pPiece, FX_TXTRUN& tr); | |
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 int32_t CFDE_TextOut::GetDisplayPos(FDE_LPTTOPIECE pPiece) { | 817 int32_t CFDE_TextOut::GetDisplayPos(FDE_TTOPIECE* pPiece) { |
979 FX_TXTRUN tr; | 818 FX_TXTRUN tr; |
980 ToTextRun(pPiece, tr); | 819 ToTextRun(pPiece, tr); |
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 int32_t CFDE_TextOut::GetCharRects(FDE_LPTTOPIECE pPiece) { | 823 int32_t CFDE_TextOut::GetCharRects(const FDE_TTOPIECE* pPiece) { |
985 FX_TXTRUN tr; | 824 FX_TXTRUN tr; |
986 ToTextRun(pPiece, tr); | 825 ToTextRun(pPiece, tr); |
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 void CFDE_TextOut::ToTextRun(const FDE_LPTTOPIECE pPiece, FX_TXTRUN& tr) { | 829 void CFDE_TextOut::ToTextRun(const FDE_TTOPIECE* pPiece, FX_TXTRUN& tr) { |
991 tr.pAccess = NULL; | 830 tr.pAccess = NULL; |
992 tr.pIdentity = NULL; | 831 tr.pIdentity = NULL; |
993 tr.pStr = (m_wsText + pPiece->iStartChar).c_str(); | 832 tr.pStr = (m_wsText + pPiece->iStartChar).c_str(); |
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.iCharRotation = 0; | 838 tr.iCharRotation = 0; |
1000 tr.dwCharStyles = pPiece->dwCharStyles; | 839 tr.dwCharStyles = pPiece->dwCharStyles; |
1001 tr.wLineBreakChar = m_wParagraphBkChar; | 840 tr.wLineBreakChar = m_wParagraphBkChar; |
1002 tr.pRect = &pPiece->rtPiece; | 841 tr.pRect = &pPiece->rtPiece; |
1003 } | 842 } |
1004 void CFDE_TextOut::DrawLine(const FDE_LPTTOPIECE pPiece, CFDE_Pen*& pPen) { | 843 void CFDE_TextOut::DrawLine(const FDE_TTOPIECE* pPiece, CFDE_Pen*& pPen) { |
1005 FX_BOOL bUnderLine = !!(m_dwStyles & FDE_TTOSTYLE_Underline); | 844 FX_BOOL bUnderLine = !!(m_dwStyles & FDE_TTOSTYLE_Underline); |
1006 FX_BOOL bStrikeOut = !!(m_dwStyles & FDE_TTOSTYLE_Strikeout); | 845 FX_BOOL bStrikeOut = !!(m_dwStyles & FDE_TTOSTYLE_Strikeout); |
1007 FX_BOOL bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey); | 846 FX_BOOL bHotKey = !!(m_dwStyles & FDE_TTOSTYLE_HotKey); |
1008 FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout); | 847 FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout); |
1009 if (!bUnderLine && !bStrikeOut && !bHotKey) { | 848 if (!bUnderLine && !bStrikeOut && !bHotKey) { |
1010 return; | 849 return; |
1011 } | 850 } |
1012 if (pPen == NULL) { | 851 if (pPen == NULL) { |
1013 pPen = new CFDE_Pen; | 852 pPen = new CFDE_Pen; |
1014 pPen->SetColor(m_TxtColor); | 853 pPen->SetColor(m_TxtColor); |
1015 } | 854 } |
1016 IFDE_Path* pPath = IFDE_Path::Create(); | 855 CFDE_Path* pPath = new CFDE_Path; |
1017 int32_t iLineCount = 0; | 856 int32_t iLineCount = 0; |
1018 CFX_RectF rtText = pPiece->rtPiece; | 857 CFX_RectF rtText = pPiece->rtPiece; |
1019 CFX_PointF pt1, pt2; | 858 CFX_PointF pt1, pt2; |
1020 if (bUnderLine) { | 859 if (bUnderLine) { |
1021 if (bVertical) { | 860 if (bVertical) { |
1022 pt1.x = rtText.left; | 861 pt1.x = rtText.left; |
1023 pt1.y = rtText.top; | 862 pt1.y = rtText.top; |
1024 pt2.x = rtText.left; | 863 pt2.x = rtText.left; |
1025 pt2.y = rtText.bottom(); | 864 pt2.y = rtText.bottom(); |
1026 } else { | 865 } else { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1092 m_iPieceCount++; | 931 m_iPieceCount++; |
1093 } else { | 932 } else { |
1094 FDE_TTOPIECE& piece = m_pieces.GetAt(index); | 933 FDE_TTOPIECE& piece = m_pieces.GetAt(index); |
1095 piece = ttoPiece; | 934 piece = ttoPiece; |
1096 } | 935 } |
1097 return index; | 936 return index; |
1098 } | 937 } |
1099 int32_t CFDE_TTOLine::GetSize() const { | 938 int32_t CFDE_TTOLine::GetSize() const { |
1100 return m_iPieceCount; | 939 return m_iPieceCount; |
1101 } | 940 } |
1102 FDE_LPTTOPIECE CFDE_TTOLine::GetPtrAt(int32_t index) { | 941 FDE_TTOPIECE* CFDE_TTOLine::GetPtrAt(int32_t index) { |
1103 if (index >= m_iPieceCount) { | 942 if (index >= m_iPieceCount) { |
1104 return NULL; | 943 return NULL; |
1105 } | 944 } |
1106 return m_pieces.GetPtrAt(index); | 945 return m_pieces.GetPtrAt(index); |
1107 } | 946 } |
1108 void CFDE_TTOLine::RemoveLast(int32_t iCount) { | 947 void CFDE_TTOLine::RemoveLast(int32_t iCount) { |
1109 m_pieces.RemoveLast(iCount); | 948 m_pieces.RemoveLast(iCount); |
1110 } | 949 } |
1111 void CFDE_TTOLine::RemoveAll(FX_BOOL bLeaveMemory) { | 950 void CFDE_TTOLine::RemoveAll(FX_BOOL bLeaveMemory) { |
1112 m_pieces.RemoveAll(bLeaveMemory); | 951 m_pieces.RemoveAll(bLeaveMemory); |
1113 } | 952 } |
OLD | NEW |