// Copyright 2017 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #include "xfa/fxfa/cxfa_ffline.h" #include "xfa/fxgraphics/cxfa_color.h" #include "xfa/fxgraphics/cxfa_graphics.h" #include "xfa/fxgraphics/cxfa_path.h" CXFA_FFLine::CXFA_FFLine(CXFA_WidgetAcc* pDataAcc) : CXFA_FFDraw(pDataAcc) {} CXFA_FFLine::~CXFA_FFLine() {} void CXFA_FFLine::GetRectFromHand(CFX_RectF& rect, int32_t iHand, float fLineWidth) { float fHalfWidth = fLineWidth / 2.0f; if (rect.height < 1.0f) { switch (iHand) { case XFA_ATTRIBUTEENUM_Left: rect.top -= fHalfWidth; break; case XFA_ATTRIBUTEENUM_Right: rect.top += fHalfWidth; } } else if (rect.width < 1.0f) { switch (iHand) { case XFA_ATTRIBUTEENUM_Left: rect.left += fHalfWidth; break; case XFA_ATTRIBUTEENUM_Right: rect.left += fHalfWidth; break; } } else { switch (iHand) { case XFA_ATTRIBUTEENUM_Left: rect.Inflate(fHalfWidth, fHalfWidth); break; case XFA_ATTRIBUTEENUM_Right: rect.Deflate(fHalfWidth, fHalfWidth); break; } } } void CXFA_FFLine::RenderWidget(CXFA_Graphics* pGS, const CFX_Matrix& matrix, uint32_t dwStatus) { if (!IsMatchVisibleStatus(dwStatus)) return; CXFA_ValueData valueData = m_pDataAcc->GetFormValueData(); if (!valueData) return; CXFA_LineData lineData = valueData.GetLineData(); FX_ARGB lineColor = 0xFF000000; int32_t iStrokeType = 0; float fLineWidth = 1.0f; int32_t iCap = 0; CXFA_EdgeData edgeData = lineData.GetEdgeData(); if (edgeData) { if (edgeData.GetPresence() != XFA_ATTRIBUTEENUM_Visible) return; lineColor = edgeData.GetColor(); iStrokeType = edgeData.GetStrokeType(); fLineWidth = edgeData.GetThickness(); iCap = edgeData.GetCapType(); } CFX_Matrix mtRotate = GetRotateMatrix(); mtRotate.Concat(matrix); CFX_RectF rtLine = GetRectWithoutRotate(); if (CXFA_MarginData marginData = m_pDataAcc->GetMarginData()) XFA_RectWidthoutMargin(rtLine, marginData); GetRectFromHand(rtLine, lineData.GetHand(), fLineWidth); CXFA_Path linePath; if (lineData.GetSlope() && rtLine.right() > 0.0f && rtLine.bottom() > 0.0f) linePath.AddLine(rtLine.TopRight(), rtLine.BottomLeft()); else linePath.AddLine(rtLine.TopLeft(), rtLine.BottomRight()); pGS->SaveGraphState(); pGS->SetLineWidth(fLineWidth); pGS->EnableActOnDash(); XFA_StrokeTypeSetLineDash(pGS, iStrokeType, iCap); pGS->SetStrokeColor(CXFA_Color(lineColor)); pGS->SetLineCap(XFA_LineCapToFXGE(iCap)); pGS->StrokePath(&linePath, &mtRotate); pGS->RestoreGraphState(); }