14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_box.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_corner.h" 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_measurement.h" 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_object.h" 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace { 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid GetStrokesInternal(CXFA_Node* pNode, 1633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann std::vector<CXFA_Stroke>* strokes, 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bNull) { 1833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann strokes->clear(); 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pNode) 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann strokes->resize(8); 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i, j; 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = 0, j = 0; i < 4; i++) { 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Corner corner = 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Corner(pNode->GetProperty(i, XFA_Element::Corner, i == 0)); 2733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (corner || i == 0) { 2833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann (*strokes)[j] = corner; 2933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann } else if (!bNull) { 3033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (i == 1 || i == 2) 3133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann (*strokes)[j] = (*strokes)[0]; 3233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann else 3333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann (*strokes)[j] = (*strokes)[2]; 3433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann } 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j++; 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Edge edge = 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Edge(pNode->GetProperty(i, XFA_Element::Edge, i == 0)); 3833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (edge || i == 0) { 3933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann (*strokes)[j] = edge; 4033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann } else if (!bNull) { 4133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (i == 1 || i == 2) 4233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann (*strokes)[j] = (*strokes)[1]; 4333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann else 4433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann (*strokes)[j] = (*strokes)[3]; 4533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann } 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann j++; 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannstatic int32_t Style3D(const std::vector<CXFA_Stroke>& strokes, 5133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann CXFA_Stroke& stroke) { 5233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (strokes.empty()) 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann stroke = strokes[0]; 5633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann for (size_t i = 1; i < strokes.size(); i++) { 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Stroke find = strokes[i]; 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!find) 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!stroke) 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann stroke = find; 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (stroke.GetStrokeType() != find.GetStrokeType()) 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann stroke = find; 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iType = stroke.GetStrokeType(); 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iType == XFA_ATTRIBUTEENUM_Lowered || iType == XFA_ATTRIBUTEENUM_Raised || 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iType == XFA_ATTRIBUTEENUM_Etched || 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iType == XFA_ATTRIBUTEENUM_Embossed) { 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iType; 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} // namespace 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_Box::GetHand() const { 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pNode) 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return XFA_ATTRIBUTEENUM_Even; 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand); 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_Box::GetPresence() const { 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pNode) 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return XFA_ATTRIBUTEENUM_Hidden; 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence); 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_Box::CountEdges() const { 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pNode) 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pNode->CountChildren(XFA_Element::Edge); 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Edge CXFA_Box::GetEdge(int32_t nIndex) const { 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CXFA_Edge( 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pNode ? m_pNode->GetProperty(nIndex, XFA_Element::Edge, nIndex == 0) 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : nullptr); 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannvoid CXFA_Box::GetStrokes(std::vector<CXFA_Stroke>* strokes) const { 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetStrokesInternal(m_pNode, strokes, false); 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_Box::IsCircular() const { 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pNode) 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pNode->GetBoolean(XFA_ATTRIBUTE_Circular); 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_Box::GetStartAngle(FX_FLOAT& fStartAngle) const { 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStartAngle = 0; 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pNode) 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Measurement ms; 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_StartAngle, ms, false); 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bRet) 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fStartAngle = ms.GetValue(); 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return bRet; 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_Box::GetSweepAngle(FX_FLOAT& fSweepAngle) const { 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fSweepAngle = 360; 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pNode) 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Measurement ms; 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_SweepAngle, ms, false); 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bRet) 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fSweepAngle = ms.GetValue(); 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return bRet; 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Fill CXFA_Box::GetFill(bool bModified) const { 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pNode) 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CXFA_Fill(nullptr); 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pFillNode = m_pNode->GetProperty(0, XFA_Element::Fill, bModified); 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CXFA_Fill(pFillNode); 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Margin CXFA_Box::GetMargin() const { 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CXFA_Margin(m_pNode ? m_pNode->GetChild(0, XFA_Element::Margin) 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : nullptr); 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_Box::Get3DStyle(bool& bVisible, FX_FLOAT& fThickness) const { 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (IsArc()) 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann std::vector<CXFA_Stroke> strokes; 15633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann GetStrokesInternal(m_pNode, &strokes, true); 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Stroke stroke(nullptr); 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iType = Style3D(strokes, stroke); 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iType) { 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bVisible = stroke.IsVisible(); 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann fThickness = stroke.GetThickness(); 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return iType; 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 165