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/fde_gedevice.h" | 7 #include "xfa/fde/fde_gedevice.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
11 #include "xfa/fde/fde_brush.h" | |
12 #include "xfa/fde/fde_geobject.h" | 11 #include "xfa/fde/fde_geobject.h" |
13 #include "xfa/fde/fde_image.h" | 12 #include "xfa/fde/fde_image.h" |
14 #include "xfa/fde/fde_object.h" | 13 #include "xfa/fde/fde_object.h" |
15 #include "xfa/fde/fde_pen.h" | |
16 | 14 |
17 IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_DIBitmap* pBitmap, | 15 IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_DIBitmap* pBitmap, |
18 FX_BOOL bRgbByteOrder) { | 16 FX_BOOL bRgbByteOrder) { |
19 if (pBitmap == NULL) { | 17 if (pBitmap == NULL) { |
20 return NULL; | 18 return NULL; |
21 } | 19 } |
22 CFX_FxgeDevice* pDevice = new CFX_FxgeDevice; | 20 CFX_FxgeDevice* pDevice = new CFX_FxgeDevice; |
23 pDevice->Attach(pBitmap, 0, bRgbByteOrder); | 21 pDevice->Attach(pBitmap, 0, bRgbByteOrder); |
24 return new CFDE_FxgeDevice(pDevice, TRUE); | 22 return new CFDE_FxgeDevice(pDevice, TRUE); |
25 } | 23 } |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 dib2fxdev.Concat(*pDevMatrix); | 107 dib2fxdev.Concat(*pDevMatrix); |
110 } | 108 } |
111 void* handle = NULL; | 109 void* handle = NULL; |
112 m_pDevice->StartDIBits(pDib, 255, 0, (const CFX_Matrix*)&dib2fxdev, 0, | 110 m_pDevice->StartDIBits(pDib, 255, 0, (const CFX_Matrix*)&dib2fxdev, 0, |
113 handle); | 111 handle); |
114 while (m_pDevice->ContinueDIBits(handle, NULL)) { | 112 while (m_pDevice->ContinueDIBits(handle, NULL)) { |
115 } | 113 } |
116 m_pDevice->CancelDIBits(handle); | 114 m_pDevice->CancelDIBits(handle); |
117 return handle != NULL; | 115 return handle != NULL; |
118 } | 116 } |
119 FX_BOOL CFDE_FxgeDevice::DrawString(IFDE_Brush* pBrush, | 117 FX_BOOL CFDE_FxgeDevice::DrawString(CFDE_Brush* pBrush, |
120 IFX_Font* pFont, | 118 IFX_Font* pFont, |
121 const FXTEXT_CHARPOS* pCharPos, | 119 const FXTEXT_CHARPOS* pCharPos, |
122 int32_t iCount, | 120 int32_t iCount, |
123 FX_FLOAT fFontSize, | 121 FX_FLOAT fFontSize, |
124 const CFX_Matrix* pMatrix) { | 122 const CFX_Matrix* pMatrix) { |
125 FXSYS_assert(pBrush != NULL && pFont != NULL && pCharPos != NULL && | 123 FXSYS_assert(pBrush != NULL && pFont != NULL && pCharPos != NULL && |
126 iCount > 0); | 124 iCount > 0); |
127 CFX_FontCache* pCache = CFX_GEModule::Get()->GetFontCache(); | 125 CFX_FontCache* pCache = CFX_GEModule::Get()->GetFontCache(); |
128 CFX_Font* pFxFont = (CFX_Font*)pFont->GetDevFont(); | 126 CFX_Font* pFxFont = (CFX_Font*)pFont->GetDevFont(); |
129 switch (pBrush->GetType()) { | 127 |
130 case FDE_BRUSHTYPE_Solid: { | 128 FX_ARGB argb = pBrush->GetColor(); |
131 FX_ARGB argb = ((IFDE_SolidBrush*)pBrush)->GetColor(); | 129 if ((pFont->GetFontStyles() & FX_FONTSTYLE_Italic) != 0 && |
132 if ((pFont->GetFontStyles() & FX_FONTSTYLE_Italic) != 0 && | 130 !pFxFont->IsItalic()) { |
133 !pFxFont->IsItalic()) { | 131 FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos; |
134 FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos; | 132 FX_FLOAT* pAM; |
135 FX_FLOAT* pAM; | 133 for (int32_t i = 0; i < iCount; ++i) { |
136 for (int32_t i = 0; i < iCount; ++i) { | 134 static const FX_FLOAT mc = 0.267949f; |
137 static const FX_FLOAT mc = 0.267949f; | 135 pAM = pCP->m_AdjustMatrix; |
138 pAM = pCP->m_AdjustMatrix; | 136 pAM[2] = mc * pAM[0] + pAM[2]; |
139 pAM[2] = mc * pAM[0] + pAM[2]; | 137 pAM[3] = mc * pAM[1] + pAM[3]; |
140 pAM[3] = mc * pAM[1] + pAM[3]; | 138 pCP++; |
141 pCP++; | 139 } |
142 } | 140 } |
143 } | 141 FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos; |
144 FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos; | 142 IFX_Font* pCurFont = NULL; |
145 IFX_Font* pCurFont = NULL; | 143 IFX_Font* pSTFont = NULL; |
146 IFX_Font* pSTFont = NULL; | 144 FXTEXT_CHARPOS* pCurCP = NULL; |
147 FXTEXT_CHARPOS* pCurCP = NULL; | 145 int32_t iCurCount = 0; |
148 int32_t iCurCount = 0; | 146 |
149 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 147 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
150 uint32_t dwFontStyle = pFont->GetFontStyles(); | 148 uint32_t dwFontStyle = pFont->GetFontStyles(); |
151 CFX_Font FxFont; | 149 CFX_Font FxFont; |
152 CFX_SubstFont SubstFxFont; | 150 CFX_SubstFont SubstFxFont; |
153 FxFont.SetSubstFont(&SubstFxFont); | 151 FxFont.SetSubstFont(&SubstFxFont); |
154 SubstFxFont.m_Weight = dwFontStyle & FX_FONTSTYLE_Bold ? 700 : 400; | 152 SubstFxFont.m_Weight = dwFontStyle & FX_FONTSTYLE_Bold ? 700 : 400; |
155 SubstFxFont.m_WeightCJK = SubstFxFont.m_Weight; | 153 SubstFxFont.m_WeightCJK = SubstFxFont.m_Weight; |
156 SubstFxFont.m_ItalicAngle = dwFontStyle & FX_FONTSTYLE_Italic ? -12 : 0; | 154 SubstFxFont.m_ItalicAngle = dwFontStyle & FX_FONTSTYLE_Italic ? -12 : 0; |
157 SubstFxFont.m_bItlicCJK = !!(dwFontStyle & FX_FONTSTYLE_Italic); | 155 SubstFxFont.m_bItlicCJK = !!(dwFontStyle & FX_FONTSTYLE_Italic); |
158 #endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 156 #endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
159 for (int32_t i = 0; i < iCount; ++i) { | 157 |
160 pSTFont = pFont->GetSubstFont((int32_t)pCP->m_GlyphIndex); | 158 for (int32_t i = 0; i < iCount; ++i) { |
161 pCP->m_GlyphIndex &= 0x00FFFFFF; | 159 pSTFont = pFont->GetSubstFont((int32_t)pCP->m_GlyphIndex); |
162 pCP->m_bFontStyle = FALSE; | 160 pCP->m_GlyphIndex &= 0x00FFFFFF; |
163 if (pCurFont != pSTFont) { | 161 pCP->m_bFontStyle = FALSE; |
164 if (pCurFont != NULL) { | 162 if (pCurFont != pSTFont) { |
165 pFxFont = (CFX_Font*)pCurFont->GetDevFont(); | 163 if (pCurFont != NULL) { |
166 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | |
167 FxFont.SetFace(pFxFont->GetFace()); | |
168 m_pDevice->DrawNormalText(iCurCount, pCurCP, &FxFont, pCache, | |
169 -fFontSize, (const CFX_Matrix*)pMatrix, | |
170 argb, FXTEXT_CLEARTYPE); | |
171 #else | |
172 m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache, | |
173 -fFontSize, (const CFX_Matrix*)pMatrix, | |
174 argb, FXTEXT_CLEARTYPE); | |
175 #endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | |
176 } | |
177 pCurFont = pSTFont; | |
178 pCurCP = pCP; | |
179 iCurCount = 1; | |
180 } else { | |
181 iCurCount++; | |
182 } | |
183 pCP++; | |
184 } | |
185 if (pCurFont != NULL && iCurCount) { | |
186 pFxFont = (CFX_Font*)pCurFont->GetDevFont(); | 164 pFxFont = (CFX_Font*)pCurFont->GetDevFont(); |
| 165 |
187 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 166 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
188 FxFont.SetFace(pFxFont->GetFace()); | 167 FxFont.SetFace(pFxFont->GetFace()); |
189 FX_BOOL bRet = m_pDevice->DrawNormalText( | 168 m_pDevice->DrawNormalText(iCurCount, pCurCP, &FxFont, pCache, |
190 iCurCount, pCurCP, &FxFont, pCache, -fFontSize, | 169 -fFontSize, (const CFX_Matrix*)pMatrix, argb, |
191 (const CFX_Matrix*)pMatrix, argb, FXTEXT_CLEARTYPE); | 170 FXTEXT_CLEARTYPE); |
192 FxFont.SetSubstFont(nullptr); | |
193 FxFont.SetFace(nullptr); | |
194 return bRet; | |
195 #else | 171 #else |
196 return m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache, | 172 m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache, |
197 -fFontSize, (const CFX_Matrix*)pMatrix, | 173 -fFontSize, (const CFX_Matrix*)pMatrix, argb, |
198 argb, FXTEXT_CLEARTYPE); | 174 FXTEXT_CLEARTYPE); |
199 #endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 175 #endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
200 } | 176 } |
| 177 pCurFont = pSTFont; |
| 178 pCurCP = pCP; |
| 179 iCurCount = 1; |
| 180 } else { |
| 181 iCurCount++; |
| 182 } |
| 183 pCP++; |
| 184 } |
| 185 if (pCurFont != NULL && iCurCount) { |
| 186 pFxFont = (CFX_Font*)pCurFont->GetDevFont(); |
| 187 |
201 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 188 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
202 FxFont.SetSubstFont(nullptr); | 189 FxFont.SetFace(pFxFont->GetFace()); |
203 FxFont.SetFace(nullptr); | 190 FX_BOOL bRet = m_pDevice->DrawNormalText( |
| 191 iCurCount, pCurCP, &FxFont, pCache, -fFontSize, |
| 192 (const CFX_Matrix*)pMatrix, argb, FXTEXT_CLEARTYPE); |
| 193 FxFont.SetSubstFont(nullptr); |
| 194 FxFont.SetFace(nullptr); |
| 195 return bRet; |
| 196 #else |
| 197 return m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache, |
| 198 -fFontSize, (const CFX_Matrix*)pMatrix, |
| 199 argb, FXTEXT_CLEARTYPE); |
204 #endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 200 #endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
205 return TRUE; | |
206 } break; | |
207 default: | |
208 return FALSE; | |
209 } | 201 } |
| 202 |
| 203 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| 204 FxFont.SetSubstFont(nullptr); |
| 205 FxFont.SetFace(nullptr); |
| 206 #endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| 207 |
| 208 return TRUE; |
210 } | 209 } |
211 FX_BOOL CFDE_FxgeDevice::DrawBezier(IFDE_Pen* pPen, | 210 |
| 211 FX_BOOL CFDE_FxgeDevice::DrawBezier(CFDE_Pen* pPen, |
212 FX_FLOAT fPenWidth, | 212 FX_FLOAT fPenWidth, |
213 const CFX_PointF& pt1, | 213 const CFX_PointF& pt1, |
214 const CFX_PointF& pt2, | 214 const CFX_PointF& pt2, |
215 const CFX_PointF& pt3, | 215 const CFX_PointF& pt3, |
216 const CFX_PointF& pt4, | 216 const CFX_PointF& pt4, |
217 const CFX_Matrix* pMatrix) { | 217 const CFX_Matrix* pMatrix) { |
218 CFX_PointsF points; | 218 CFX_PointsF points; |
219 points.Add(pt1); | 219 points.Add(pt1); |
220 points.Add(pt2); | 220 points.Add(pt2); |
221 points.Add(pt3); | 221 points.Add(pt3); |
222 points.Add(pt4); | 222 points.Add(pt4); |
223 CFDE_Path path; | 223 CFDE_Path path; |
224 path.AddBezier(points); | 224 path.AddBezier(points); |
225 return DrawPath(pPen, fPenWidth, &path, pMatrix); | 225 return DrawPath(pPen, fPenWidth, &path, pMatrix); |
226 } | 226 } |
227 FX_BOOL CFDE_FxgeDevice::DrawCurve(IFDE_Pen* pPen, | 227 FX_BOOL CFDE_FxgeDevice::DrawCurve(CFDE_Pen* pPen, |
228 FX_FLOAT fPenWidth, | 228 FX_FLOAT fPenWidth, |
229 const CFX_PointsF& points, | 229 const CFX_PointsF& points, |
230 FX_BOOL bClosed, | 230 FX_BOOL bClosed, |
231 FX_FLOAT fTension, | 231 FX_FLOAT fTension, |
232 const CFX_Matrix* pMatrix) { | 232 const CFX_Matrix* pMatrix) { |
233 CFDE_Path path; | 233 CFDE_Path path; |
234 path.AddCurve(points, bClosed, fTension); | 234 path.AddCurve(points, bClosed, fTension); |
235 return DrawPath(pPen, fPenWidth, &path, pMatrix); | 235 return DrawPath(pPen, fPenWidth, &path, pMatrix); |
236 } | 236 } |
237 FX_BOOL CFDE_FxgeDevice::DrawEllipse(IFDE_Pen* pPen, | 237 FX_BOOL CFDE_FxgeDevice::DrawEllipse(CFDE_Pen* pPen, |
238 FX_FLOAT fPenWidth, | 238 FX_FLOAT fPenWidth, |
239 const CFX_RectF& rect, | 239 const CFX_RectF& rect, |
240 const CFX_Matrix* pMatrix) { | 240 const CFX_Matrix* pMatrix) { |
241 CFDE_Path path; | 241 CFDE_Path path; |
242 path.AddEllipse(rect); | 242 path.AddEllipse(rect); |
243 return DrawPath(pPen, fPenWidth, &path, pMatrix); | 243 return DrawPath(pPen, fPenWidth, &path, pMatrix); |
244 } | 244 } |
245 FX_BOOL CFDE_FxgeDevice::DrawLines(IFDE_Pen* pPen, | 245 FX_BOOL CFDE_FxgeDevice::DrawLines(CFDE_Pen* pPen, |
246 FX_FLOAT fPenWidth, | 246 FX_FLOAT fPenWidth, |
247 const CFX_PointsF& points, | 247 const CFX_PointsF& points, |
248 const CFX_Matrix* pMatrix) { | 248 const CFX_Matrix* pMatrix) { |
249 CFDE_Path path; | 249 CFDE_Path path; |
250 path.AddLines(points); | 250 path.AddLines(points); |
251 return DrawPath(pPen, fPenWidth, &path, pMatrix); | 251 return DrawPath(pPen, fPenWidth, &path, pMatrix); |
252 } | 252 } |
253 FX_BOOL CFDE_FxgeDevice::DrawLine(IFDE_Pen* pPen, | 253 FX_BOOL CFDE_FxgeDevice::DrawLine(CFDE_Pen* pPen, |
254 FX_FLOAT fPenWidth, | 254 FX_FLOAT fPenWidth, |
255 const CFX_PointF& pt1, | 255 const CFX_PointF& pt1, |
256 const CFX_PointF& pt2, | 256 const CFX_PointF& pt2, |
257 const CFX_Matrix* pMatrix) { | 257 const CFX_Matrix* pMatrix) { |
258 CFDE_Path path; | 258 CFDE_Path path; |
259 path.AddLine(pt1, pt2); | 259 path.AddLine(pt1, pt2); |
260 return DrawPath(pPen, fPenWidth, &path, pMatrix); | 260 return DrawPath(pPen, fPenWidth, &path, pMatrix); |
261 } | 261 } |
262 FX_BOOL CFDE_FxgeDevice::DrawPath(IFDE_Pen* pPen, | 262 FX_BOOL CFDE_FxgeDevice::DrawPath(CFDE_Pen* pPen, |
263 FX_FLOAT fPenWidth, | 263 FX_FLOAT fPenWidth, |
264 const IFDE_Path* pPath, | 264 const IFDE_Path* pPath, |
265 const CFX_Matrix* pMatrix) { | 265 const CFX_Matrix* pMatrix) { |
266 CFDE_Path* pGePath = (CFDE_Path*)pPath; | 266 CFDE_Path* pGePath = (CFDE_Path*)pPath; |
267 if (pGePath == NULL) { | 267 if (pGePath == NULL) { |
268 return FALSE; | 268 return FALSE; |
269 } | 269 } |
270 CFX_GraphStateData graphState; | 270 CFX_GraphStateData graphState; |
271 if (!CreatePen(pPen, fPenWidth, graphState)) { | 271 if (!CreatePen(pPen, fPenWidth, graphState)) { |
272 return FALSE; | 272 return FALSE; |
273 } | 273 } |
274 return m_pDevice->DrawPath(&pGePath->m_Path, (const CFX_Matrix*)pMatrix, | 274 return m_pDevice->DrawPath(&pGePath->m_Path, (const CFX_Matrix*)pMatrix, |
275 &graphState, 0, pPen->GetColor(), 0); | 275 &graphState, 0, pPen->GetColor(), 0); |
276 } | 276 } |
277 FX_BOOL CFDE_FxgeDevice::DrawPolygon(IFDE_Pen* pPen, | 277 FX_BOOL CFDE_FxgeDevice::DrawPolygon(CFDE_Pen* pPen, |
278 FX_FLOAT fPenWidth, | 278 FX_FLOAT fPenWidth, |
279 const CFX_PointsF& points, | 279 const CFX_PointsF& points, |
280 const CFX_Matrix* pMatrix) { | 280 const CFX_Matrix* pMatrix) { |
281 CFDE_Path path; | 281 CFDE_Path path; |
282 path.AddPolygon(points); | 282 path.AddPolygon(points); |
283 return DrawPath(pPen, fPenWidth, &path, pMatrix); | 283 return DrawPath(pPen, fPenWidth, &path, pMatrix); |
284 } | 284 } |
285 FX_BOOL CFDE_FxgeDevice::DrawRectangle(IFDE_Pen* pPen, | 285 FX_BOOL CFDE_FxgeDevice::DrawRectangle(CFDE_Pen* pPen, |
286 FX_FLOAT fPenWidth, | 286 FX_FLOAT fPenWidth, |
287 const CFX_RectF& rect, | 287 const CFX_RectF& rect, |
288 const CFX_Matrix* pMatrix) { | 288 const CFX_Matrix* pMatrix) { |
289 CFDE_Path path; | 289 CFDE_Path path; |
290 path.AddRectangle(rect); | 290 path.AddRectangle(rect); |
291 return DrawPath(pPen, fPenWidth, &path, pMatrix); | 291 return DrawPath(pPen, fPenWidth, &path, pMatrix); |
292 } | 292 } |
293 FX_BOOL CFDE_FxgeDevice::FillClosedCurve(IFDE_Brush* pBrush, | 293 FX_BOOL CFDE_FxgeDevice::FillClosedCurve(CFDE_Brush* pBrush, |
294 const CFX_PointsF& points, | 294 const CFX_PointsF& points, |
295 FX_FLOAT fTension, | 295 FX_FLOAT fTension, |
296 const CFX_Matrix* pMatrix) { | 296 const CFX_Matrix* pMatrix) { |
297 CFDE_Path path; | 297 CFDE_Path path; |
298 path.AddCurve(points, TRUE, fTension); | 298 path.AddCurve(points, TRUE, fTension); |
299 return FillPath(pBrush, &path, pMatrix); | 299 return FillPath(pBrush, &path, pMatrix); |
300 } | 300 } |
301 FX_BOOL CFDE_FxgeDevice::FillEllipse(IFDE_Brush* pBrush, | 301 FX_BOOL CFDE_FxgeDevice::FillEllipse(CFDE_Brush* pBrush, |
302 const CFX_RectF& rect, | 302 const CFX_RectF& rect, |
303 const CFX_Matrix* pMatrix) { | 303 const CFX_Matrix* pMatrix) { |
304 CFDE_Path path; | 304 CFDE_Path path; |
305 path.AddEllipse(rect); | 305 path.AddEllipse(rect); |
306 return FillPath(pBrush, &path, pMatrix); | 306 return FillPath(pBrush, &path, pMatrix); |
307 } | 307 } |
308 FX_BOOL CFDE_FxgeDevice::FillPolygon(IFDE_Brush* pBrush, | 308 FX_BOOL CFDE_FxgeDevice::FillPolygon(CFDE_Brush* pBrush, |
309 const CFX_PointsF& points, | 309 const CFX_PointsF& points, |
310 const CFX_Matrix* pMatrix) { | 310 const CFX_Matrix* pMatrix) { |
311 CFDE_Path path; | 311 CFDE_Path path; |
312 path.AddPolygon(points); | 312 path.AddPolygon(points); |
313 return FillPath(pBrush, &path, pMatrix); | 313 return FillPath(pBrush, &path, pMatrix); |
314 } | 314 } |
315 FX_BOOL CFDE_FxgeDevice::FillRectangle(IFDE_Brush* pBrush, | 315 FX_BOOL CFDE_FxgeDevice::FillRectangle(CFDE_Brush* pBrush, |
316 const CFX_RectF& rect, | 316 const CFX_RectF& rect, |
317 const CFX_Matrix* pMatrix) { | 317 const CFX_Matrix* pMatrix) { |
318 CFDE_Path path; | 318 CFDE_Path path; |
319 path.AddRectangle(rect); | 319 path.AddRectangle(rect); |
320 return FillPath(pBrush, &path, pMatrix); | 320 return FillPath(pBrush, &path, pMatrix); |
321 } | 321 } |
322 FX_BOOL CFDE_FxgeDevice::CreatePen(IFDE_Pen* pPen, | 322 FX_BOOL CFDE_FxgeDevice::CreatePen(CFDE_Pen* pPen, |
323 FX_FLOAT fPenWidth, | 323 FX_FLOAT fPenWidth, |
324 CFX_GraphStateData& graphState) { | 324 CFX_GraphStateData& graphState) { |
325 if (pPen == NULL) { | 325 if (!pPen) |
326 return FALSE; | 326 return FALSE; |
327 } | 327 |
328 graphState.m_LineCap = (CFX_GraphStateData::LineCap)pPen->GetLineCap(); | 328 graphState.m_LineCap = CFX_GraphStateData::LineCapButt; |
329 graphState.m_LineJoin = (CFX_GraphStateData::LineJoin)pPen->GetLineJoin(); | 329 graphState.m_LineJoin = CFX_GraphStateData::LineJoinMiter; |
330 graphState.m_LineWidth = fPenWidth; | 330 graphState.m_LineWidth = fPenWidth; |
331 graphState.m_MiterLimit = pPen->GetMiterLimit(); | 331 graphState.m_MiterLimit = 10; |
332 graphState.m_DashPhase = pPen->GetDashPhase(); | 332 graphState.m_DashPhase = 0; |
333 CFX_FloatArray dashArray; | |
334 switch (pPen->GetDashStyle()) { | |
335 case FDE_DASHSTYLE_Dash: | |
336 dashArray.Add(3); | |
337 dashArray.Add(1); | |
338 break; | |
339 case FDE_DASHSTYLE_Dot: | |
340 dashArray.Add(1); | |
341 dashArray.Add(1); | |
342 break; | |
343 case FDE_DASHSTYLE_DashDot: | |
344 dashArray.Add(3); | |
345 dashArray.Add(1); | |
346 dashArray.Add(1); | |
347 dashArray.Add(1); | |
348 break; | |
349 case FDE_DASHSTYLE_DashDotDot: | |
350 dashArray.Add(3); | |
351 dashArray.Add(1); | |
352 dashArray.Add(1); | |
353 dashArray.Add(1); | |
354 dashArray.Add(1); | |
355 dashArray.Add(1); | |
356 break; | |
357 case FDE_DASHSTYLE_Customized: | |
358 pPen->GetDashArray(dashArray); | |
359 break; | |
360 } | |
361 int32_t iDashCount = dashArray.GetSize(); | |
362 if (iDashCount > 0) { | |
363 graphState.SetDashCount(iDashCount); | |
364 for (int32_t i = 0; i < iDashCount; ++i) { | |
365 graphState.m_DashArray[i] = dashArray[i] * fPenWidth; | |
366 } | |
367 } | |
368 return TRUE; | 333 return TRUE; |
369 } | 334 } |
370 | 335 |
371 FX_BOOL CFDE_FxgeDevice::FillPath(IFDE_Brush* pBrush, | 336 FX_BOOL CFDE_FxgeDevice::FillPath(CFDE_Brush* pBrush, |
372 const IFDE_Path* pPath, | 337 const IFDE_Path* pPath, |
373 const CFX_Matrix* pMatrix) { | 338 const CFX_Matrix* pMatrix) { |
374 CFDE_Path* pGePath = (CFDE_Path*)pPath; | 339 CFDE_Path* pGePath = (CFDE_Path*)pPath; |
375 if (!pGePath) | 340 if (!pGePath) |
376 return FALSE; | 341 return FALSE; |
377 | |
378 if (!pBrush) | 342 if (!pBrush) |
379 return FALSE; | 343 return FALSE; |
380 | 344 return m_pDevice->DrawPath(&pGePath->m_Path, pMatrix, nullptr, |
381 return FillSolidPath(pBrush, &pGePath->m_Path, pMatrix); | 345 pBrush->GetColor(), 0, FXFILL_WINDING); |
382 } | 346 } |
383 | 347 |
384 FX_BOOL CFDE_FxgeDevice::FillSolidPath(IFDE_Brush* pBrush, | |
385 const CFX_PathData* pPath, | |
386 const CFX_Matrix* pMatrix) { | |
387 FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Solid); | |
388 | |
389 IFDE_SolidBrush* pSolidBrush = static_cast<IFDE_SolidBrush*>(pBrush); | |
390 return m_pDevice->DrawPath(pPath, (const CFX_Matrix*)pMatrix, NULL, | |
391 pSolidBrush->GetColor(), 0, FXFILL_WINDING); | |
392 } | |
OLD | NEW |