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