Chromium Code Reviews| Index: xfa/fde/fde_gedevice.cpp |
| diff --git a/xfa/fde/fde_gedevice.cpp b/xfa/fde/fde_gedevice.cpp |
| index 28bf889e1facb78c1a6d08dd1ef8bb3d3f7cb1fc..e289ef9ec257f7e45fbe34e56a5e6ddb2f1f1532 100644 |
| --- a/xfa/fde/fde_gedevice.cpp |
| +++ b/xfa/fde/fde_gedevice.cpp |
| @@ -8,11 +8,9 @@ |
| #include <algorithm> |
| -#include "xfa/fde/fde_brush.h" |
| #include "xfa/fde/fde_geobject.h" |
| #include "xfa/fde/fde_image.h" |
| #include "xfa/fde/fde_object.h" |
| -#include "xfa/fde/fde_pen.h" |
| IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_DIBitmap* pBitmap, |
| FX_BOOL bRgbByteOrder) { |
| @@ -116,7 +114,7 @@ FX_BOOL CFDE_FxgeDevice::DrawImage(CFX_DIBSource* pDib, |
| m_pDevice->CancelDIBits(handle); |
| return handle != NULL; |
| } |
| -FX_BOOL CFDE_FxgeDevice::DrawString(IFDE_Brush* pBrush, |
| +FX_BOOL CFDE_FxgeDevice::DrawString(CFDE_Brush* pBrush, |
| IFX_Font* pFont, |
| const FXTEXT_CHARPOS* pCharPos, |
| int32_t iCount, |
| @@ -126,89 +124,91 @@ FX_BOOL CFDE_FxgeDevice::DrawString(IFDE_Brush* pBrush, |
| iCount > 0); |
| CFX_FontCache* pCache = CFX_GEModule::Get()->GetFontCache(); |
| CFX_Font* pFxFont = (CFX_Font*)pFont->GetDevFont(); |
| - switch (pBrush->GetType()) { |
| - case FDE_BRUSHTYPE_Solid: { |
| - FX_ARGB argb = ((IFDE_SolidBrush*)pBrush)->GetColor(); |
| - if ((pFont->GetFontStyles() & FX_FONTSTYLE_Italic) != 0 && |
| - !pFxFont->IsItalic()) { |
| - FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos; |
| - FX_FLOAT* pAM; |
| - for (int32_t i = 0; i < iCount; ++i) { |
| - static const FX_FLOAT mc = 0.267949f; |
| - pAM = pCP->m_AdjustMatrix; |
| - pAM[2] = mc * pAM[0] + pAM[2]; |
| - pAM[3] = mc * pAM[1] + pAM[3]; |
| - pCP++; |
| - } |
| - } |
| - FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos; |
| - IFX_Font* pCurFont = NULL; |
| - IFX_Font* pSTFont = NULL; |
| - FXTEXT_CHARPOS* pCurCP = NULL; |
| - int32_t iCurCount = 0; |
| -#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| - uint32_t dwFontStyle = pFont->GetFontStyles(); |
| - CFX_Font FxFont; |
| - CFX_SubstFont SubstFxFont; |
| - FxFont.SetSubstFont(&SubstFxFont); |
| - SubstFxFont.m_Weight = dwFontStyle & FX_FONTSTYLE_Bold ? 700 : 400; |
| - SubstFxFont.m_WeightCJK = SubstFxFont.m_Weight; |
| - SubstFxFont.m_ItalicAngle = dwFontStyle & FX_FONTSTYLE_Italic ? -12 : 0; |
| - SubstFxFont.m_bItlicCJK = !!(dwFontStyle & FX_FONTSTYLE_Italic); |
| -#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| - for (int32_t i = 0; i < iCount; ++i) { |
| - pSTFont = pFont->GetSubstFont((int32_t)pCP->m_GlyphIndex); |
| - pCP->m_GlyphIndex &= 0x00FFFFFF; |
| - pCP->m_bFontStyle = FALSE; |
| - if (pCurFont != pSTFont) { |
| - if (pCurFont != NULL) { |
| - pFxFont = (CFX_Font*)pCurFont->GetDevFont(); |
| + |
| + FX_ARGB argb = pBrush->GetColor(); |
| + if ((pFont->GetFontStyles() & FX_FONTSTYLE_Italic) != 0 && |
| + !pFxFont->IsItalic()) { |
| + FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos; |
| + FX_FLOAT* pAM; |
| + for (int32_t i = 0; i < iCount; ++i) { |
| + static const FX_FLOAT mc = 0.267949f; |
| + pAM = pCP->m_AdjustMatrix; |
| + pAM[2] = mc * pAM[0] + pAM[2]; |
| + pAM[3] = mc * pAM[1] + pAM[3]; |
| + pCP++; |
| + } |
| + } |
| + FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos; |
| + IFX_Font* pCurFont = NULL; |
| + IFX_Font* pSTFont = NULL; |
| + FXTEXT_CHARPOS* pCurCP = NULL; |
| + int32_t iCurCount = 0; |
| + |
| #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| - FxFont.SetFace(pFxFont->GetFace()); |
| - m_pDevice->DrawNormalText(iCurCount, pCurCP, &FxFont, pCache, |
| - -fFontSize, (const CFX_Matrix*)pMatrix, |
| - argb, FXTEXT_CLEARTYPE); |
| -#else |
| - m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache, |
| - -fFontSize, (const CFX_Matrix*)pMatrix, |
| - argb, FXTEXT_CLEARTYPE); |
| + uint32_t dwFontStyle = pFont->GetFontStyles(); |
| + CFX_Font FxFont; |
| + CFX_SubstFont SubstFxFont; |
| + FxFont.SetSubstFont(&SubstFxFont); |
| + SubstFxFont.m_Weight = dwFontStyle & FX_FONTSTYLE_Bold ? 700 : 400; |
| + SubstFxFont.m_WeightCJK = SubstFxFont.m_Weight; |
| + SubstFxFont.m_ItalicAngle = dwFontStyle & FX_FONTSTYLE_Italic ? -12 : 0; |
| + SubstFxFont.m_bItlicCJK = !!(dwFontStyle & FX_FONTSTYLE_Italic); |
| #endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| - } |
| - pCurFont = pSTFont; |
| - pCurCP = pCP; |
| - iCurCount = 1; |
| - } else { |
| - iCurCount++; |
| - } |
| - pCP++; |
| - } |
| - if (pCurFont != NULL && iCurCount) { |
| + |
| + for (int32_t i = 0; i < iCount; ++i) { |
| + pSTFont = pFont->GetSubstFont((int32_t)pCP->m_GlyphIndex); |
| + pCP->m_GlyphIndex &= 0x00FFFFFF; |
| + pCP->m_bFontStyle = FALSE; |
| + if (pCurFont != pSTFont) { |
| + if (pCurFont != NULL) { |
| pFxFont = (CFX_Font*)pCurFont->GetDevFont(); |
| + |
| #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| FxFont.SetFace(pFxFont->GetFace()); |
| - FX_BOOL bRet = m_pDevice->DrawNormalText( |
| - iCurCount, pCurCP, &FxFont, pCache, -fFontSize, |
| - (const CFX_Matrix*)pMatrix, argb, FXTEXT_CLEARTYPE); |
| - FxFont.SetSubstFont(nullptr); |
| - FxFont.SetFace(nullptr); |
| - return bRet; |
| + m_pDevice->DrawNormalText(iCurCount, pCurCP, &FxFont, pCache, |
| + -fFontSize, (const CFX_Matrix*)pMatrix, argb, |
| + FXTEXT_CLEARTYPE); |
| #else |
| - return m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache, |
| - -fFontSize, (const CFX_Matrix*)pMatrix, |
| - argb, FXTEXT_CLEARTYPE); |
| + m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache, |
| + -fFontSize, (const CFX_Matrix*)pMatrix, argb, |
| + FXTEXT_CLEARTYPE); |
| #endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| } |
| + pCurFont = pSTFont; |
| + pCurCP = pCP; |
| + iCurCount = 1; |
| + } else { |
| + iCurCount++; |
| + } |
| + pCP++; |
| + } |
| + if (pCurFont != NULL && iCurCount) { |
| + pFxFont = (CFX_Font*)pCurFont->GetDevFont(); |
| + |
| #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| - FxFont.SetSubstFont(nullptr); |
| - FxFont.SetFace(nullptr); |
| + FxFont.SetFace(pFxFont->GetFace()); |
| + FX_BOOL bRet = m_pDevice->DrawNormalText( |
| + iCurCount, pCurCP, &FxFont, pCache, -fFontSize, |
| + (const CFX_Matrix*)pMatrix, argb, FXTEXT_CLEARTYPE); |
| + FxFont.SetSubstFont(nullptr); |
| + FxFont.SetFace(nullptr); |
| + return bRet; |
| +#else |
| + return m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, pCache, |
| + -fFontSize, (const CFX_Matrix*)pMatrix, |
| + argb, FXTEXT_CLEARTYPE); |
| #endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| - return TRUE; |
| - } break; |
| - default: |
| - return FALSE; |
| } |
| + |
| +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| + FxFont.SetSubstFont(nullptr); |
| + FxFont.SetFace(nullptr); |
| +#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| + |
| + return TRUE; |
| } |
| -FX_BOOL CFDE_FxgeDevice::DrawBezier(IFDE_Pen* pPen, |
| + |
| +FX_BOOL CFDE_FxgeDevice::DrawBezier(CFDE_Pen* pPen, |
| FX_FLOAT fPenWidth, |
| const CFX_PointF& pt1, |
| const CFX_PointF& pt2, |
| @@ -224,7 +224,7 @@ FX_BOOL CFDE_FxgeDevice::DrawBezier(IFDE_Pen* pPen, |
| path.AddBezier(points); |
| return DrawPath(pPen, fPenWidth, &path, pMatrix); |
| } |
| -FX_BOOL CFDE_FxgeDevice::DrawCurve(IFDE_Pen* pPen, |
| +FX_BOOL CFDE_FxgeDevice::DrawCurve(CFDE_Pen* pPen, |
| FX_FLOAT fPenWidth, |
| const CFX_PointsF& points, |
| FX_BOOL bClosed, |
| @@ -234,7 +234,7 @@ FX_BOOL CFDE_FxgeDevice::DrawCurve(IFDE_Pen* pPen, |
| path.AddCurve(points, bClosed, fTension); |
| return DrawPath(pPen, fPenWidth, &path, pMatrix); |
| } |
| -FX_BOOL CFDE_FxgeDevice::DrawEllipse(IFDE_Pen* pPen, |
| +FX_BOOL CFDE_FxgeDevice::DrawEllipse(CFDE_Pen* pPen, |
| FX_FLOAT fPenWidth, |
| const CFX_RectF& rect, |
| const CFX_Matrix* pMatrix) { |
| @@ -242,7 +242,7 @@ FX_BOOL CFDE_FxgeDevice::DrawEllipse(IFDE_Pen* pPen, |
| path.AddEllipse(rect); |
| return DrawPath(pPen, fPenWidth, &path, pMatrix); |
| } |
| -FX_BOOL CFDE_FxgeDevice::DrawLines(IFDE_Pen* pPen, |
| +FX_BOOL CFDE_FxgeDevice::DrawLines(CFDE_Pen* pPen, |
| FX_FLOAT fPenWidth, |
| const CFX_PointsF& points, |
| const CFX_Matrix* pMatrix) { |
| @@ -250,7 +250,7 @@ FX_BOOL CFDE_FxgeDevice::DrawLines(IFDE_Pen* pPen, |
| path.AddLines(points); |
| return DrawPath(pPen, fPenWidth, &path, pMatrix); |
| } |
| -FX_BOOL CFDE_FxgeDevice::DrawLine(IFDE_Pen* pPen, |
| +FX_BOOL CFDE_FxgeDevice::DrawLine(CFDE_Pen* pPen, |
| FX_FLOAT fPenWidth, |
| const CFX_PointF& pt1, |
| const CFX_PointF& pt2, |
| @@ -259,7 +259,7 @@ FX_BOOL CFDE_FxgeDevice::DrawLine(IFDE_Pen* pPen, |
| path.AddLine(pt1, pt2); |
| return DrawPath(pPen, fPenWidth, &path, pMatrix); |
| } |
| -FX_BOOL CFDE_FxgeDevice::DrawPath(IFDE_Pen* pPen, |
| +FX_BOOL CFDE_FxgeDevice::DrawPath(CFDE_Pen* pPen, |
| FX_FLOAT fPenWidth, |
| const IFDE_Path* pPath, |
| const CFX_Matrix* pMatrix) { |
| @@ -274,7 +274,7 @@ FX_BOOL CFDE_FxgeDevice::DrawPath(IFDE_Pen* pPen, |
| return m_pDevice->DrawPath(&pGePath->m_Path, (const CFX_Matrix*)pMatrix, |
| &graphState, 0, pPen->GetColor(), 0); |
| } |
| -FX_BOOL CFDE_FxgeDevice::DrawPolygon(IFDE_Pen* pPen, |
| +FX_BOOL CFDE_FxgeDevice::DrawPolygon(CFDE_Pen* pPen, |
| FX_FLOAT fPenWidth, |
| const CFX_PointsF& points, |
| const CFX_Matrix* pMatrix) { |
| @@ -282,7 +282,7 @@ FX_BOOL CFDE_FxgeDevice::DrawPolygon(IFDE_Pen* pPen, |
| path.AddPolygon(points); |
| return DrawPath(pPen, fPenWidth, &path, pMatrix); |
| } |
| -FX_BOOL CFDE_FxgeDevice::DrawRectangle(IFDE_Pen* pPen, |
| +FX_BOOL CFDE_FxgeDevice::DrawRectangle(CFDE_Pen* pPen, |
| FX_FLOAT fPenWidth, |
| const CFX_RectF& rect, |
| const CFX_Matrix* pMatrix) { |
| @@ -290,7 +290,7 @@ FX_BOOL CFDE_FxgeDevice::DrawRectangle(IFDE_Pen* pPen, |
| path.AddRectangle(rect); |
| return DrawPath(pPen, fPenWidth, &path, pMatrix); |
| } |
| -FX_BOOL CFDE_FxgeDevice::FillClosedCurve(IFDE_Brush* pBrush, |
| +FX_BOOL CFDE_FxgeDevice::FillClosedCurve(CFDE_Brush* pBrush, |
| const CFX_PointsF& points, |
| FX_FLOAT fTension, |
| const CFX_Matrix* pMatrix) { |
| @@ -298,95 +298,50 @@ FX_BOOL CFDE_FxgeDevice::FillClosedCurve(IFDE_Brush* pBrush, |
| path.AddCurve(points, TRUE, fTension); |
| return FillPath(pBrush, &path, pMatrix); |
| } |
| -FX_BOOL CFDE_FxgeDevice::FillEllipse(IFDE_Brush* pBrush, |
| +FX_BOOL CFDE_FxgeDevice::FillEllipse(CFDE_Brush* pBrush, |
| const CFX_RectF& rect, |
| const CFX_Matrix* pMatrix) { |
| CFDE_Path path; |
| path.AddEllipse(rect); |
| return FillPath(pBrush, &path, pMatrix); |
| } |
| -FX_BOOL CFDE_FxgeDevice::FillPolygon(IFDE_Brush* pBrush, |
| +FX_BOOL CFDE_FxgeDevice::FillPolygon(CFDE_Brush* pBrush, |
| const CFX_PointsF& points, |
| const CFX_Matrix* pMatrix) { |
| CFDE_Path path; |
| path.AddPolygon(points); |
| return FillPath(pBrush, &path, pMatrix); |
| } |
| -FX_BOOL CFDE_FxgeDevice::FillRectangle(IFDE_Brush* pBrush, |
| +FX_BOOL CFDE_FxgeDevice::FillRectangle(CFDE_Brush* pBrush, |
| const CFX_RectF& rect, |
| const CFX_Matrix* pMatrix) { |
| CFDE_Path path; |
| path.AddRectangle(rect); |
| return FillPath(pBrush, &path, pMatrix); |
| } |
| -FX_BOOL CFDE_FxgeDevice::CreatePen(IFDE_Pen* pPen, |
| +FX_BOOL CFDE_FxgeDevice::CreatePen(CFDE_Pen* pPen, |
| FX_FLOAT fPenWidth, |
| CFX_GraphStateData& graphState) { |
| - if (pPen == NULL) { |
| + if (!pPen) |
| return FALSE; |
| - } |
| - graphState.m_LineCap = (CFX_GraphStateData::LineCap)pPen->GetLineCap(); |
| - graphState.m_LineJoin = (CFX_GraphStateData::LineJoin)pPen->GetLineJoin(); |
| + |
| + graphState.m_LineCap = CFX_GraphStateData::LineCapButt; |
|
dsinclair
2016/04/12 19:10:04
We never called the setter methods on the pen, so
|
| + graphState.m_LineJoin = CFX_GraphStateData::LineJoinMiter; |
| graphState.m_LineWidth = fPenWidth; |
| - graphState.m_MiterLimit = pPen->GetMiterLimit(); |
| - graphState.m_DashPhase = pPen->GetDashPhase(); |
| - CFX_FloatArray dashArray; |
| - switch (pPen->GetDashStyle()) { |
| - case FDE_DASHSTYLE_Dash: |
| - dashArray.Add(3); |
| - dashArray.Add(1); |
| - break; |
| - case FDE_DASHSTYLE_Dot: |
| - dashArray.Add(1); |
| - dashArray.Add(1); |
| - break; |
| - case FDE_DASHSTYLE_DashDot: |
| - dashArray.Add(3); |
| - dashArray.Add(1); |
| - dashArray.Add(1); |
| - dashArray.Add(1); |
| - break; |
| - case FDE_DASHSTYLE_DashDotDot: |
| - dashArray.Add(3); |
| - dashArray.Add(1); |
| - dashArray.Add(1); |
| - dashArray.Add(1); |
| - dashArray.Add(1); |
| - dashArray.Add(1); |
| - break; |
| - case FDE_DASHSTYLE_Customized: |
| - pPen->GetDashArray(dashArray); |
| - break; |
| - } |
| - int32_t iDashCount = dashArray.GetSize(); |
| - if (iDashCount > 0) { |
| - graphState.SetDashCount(iDashCount); |
| - for (int32_t i = 0; i < iDashCount; ++i) { |
| - graphState.m_DashArray[i] = dashArray[i] * fPenWidth; |
| - } |
| - } |
| + graphState.m_MiterLimit = 10; |
| + graphState.m_DashPhase = 0; |
| return TRUE; |
| } |
| -FX_BOOL CFDE_FxgeDevice::FillPath(IFDE_Brush* pBrush, |
| +FX_BOOL CFDE_FxgeDevice::FillPath(CFDE_Brush* pBrush, |
| const IFDE_Path* pPath, |
| const CFX_Matrix* pMatrix) { |
| CFDE_Path* pGePath = (CFDE_Path*)pPath; |
| if (!pGePath) |
| return FALSE; |
| - |
| if (!pBrush) |
| return FALSE; |
| - |
| - return FillSolidPath(pBrush, &pGePath->m_Path, pMatrix); |
| + return m_pDevice->DrawPath(&pGePath->m_Path, pMatrix, nullptr, |
| + pBrush->GetColor(), 0, FXFILL_WINDING); |
| } |
| -FX_BOOL CFDE_FxgeDevice::FillSolidPath(IFDE_Brush* pBrush, |
| - const CFX_PathData* pPath, |
| - const CFX_Matrix* pMatrix) { |
| - FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Solid); |
| - |
| - IFDE_SolidBrush* pSolidBrush = static_cast<IFDE_SolidBrush*>(pBrush); |
| - return m_pDevice->DrawPath(pPath, (const CFX_Matrix*)pMatrix, NULL, |
| - pSolidBrush->GetColor(), 0, FXFILL_WINDING); |
| -} |