Index: xfa/fxfa/parser/cxfa_box.cpp |
diff --git a/xfa/fxfa/parser/cxfa_box.cpp b/xfa/fxfa/parser/cxfa_box.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fc572017506597191a3e79fc4cef35064bb037b5 |
--- /dev/null |
+++ b/xfa/fxfa/parser/cxfa_box.cpp |
@@ -0,0 +1,168 @@ |
+// Copyright 2016 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/parser/cxfa_box.h" |
+ |
+#include "xfa/fxfa/parser/cxfa_corner.h" |
+#include "xfa/fxfa/parser/xfa_object.h" |
+ |
+namespace { |
+ |
+void GetStrokesInternal(CXFA_Node* pNode, |
+ CXFA_StrokeArray& strokes, |
+ FX_BOOL bNULL) { |
+ strokes.RemoveAll(); |
+ if (!pNode) |
+ return; |
+ |
+ strokes.SetSize(8); |
+ int32_t i, j; |
+ for (i = 0, j = 0; i < 4; i++) { |
+ CXFA_Corner corner = |
+ CXFA_Corner(pNode->GetProperty(i, XFA_ELEMENT_Corner, i == 0)); |
+ if (corner || i == 0) |
+ strokes.SetAt(j, corner); |
+ else if (bNULL) |
+ strokes.SetAt(j, CXFA_Stroke(nullptr)); |
+ else if (i == 1) |
+ strokes.SetAt(j, strokes[0]); |
+ else if (i == 2) |
+ strokes.SetAt(j, strokes[0]); |
+ else |
+ strokes.SetAt(j, strokes[2]); |
+ |
+ j++; |
+ CXFA_Edge edge = CXFA_Edge(pNode->GetProperty(i, XFA_ELEMENT_Edge, i == 0)); |
+ if (edge || i == 0) |
+ strokes.SetAt(j, edge); |
+ else if (bNULL) |
+ strokes.SetAt(j, CXFA_Stroke(nullptr)); |
+ else if (i == 1) |
+ strokes.SetAt(j, strokes[1]); |
+ else if (i == 2) |
+ strokes.SetAt(j, strokes[1]); |
+ else |
+ strokes.SetAt(j, strokes[3]); |
+ |
+ j++; |
+ } |
+} |
+ |
+static int32_t Style3D(const CXFA_StrokeArray& strokes, CXFA_Stroke& stroke) { |
+ int32_t iCount = strokes.GetSize(); |
+ if (iCount < 1) |
+ return 0; |
+ |
+ stroke = strokes[0]; |
+ for (int32_t i = 1; i < iCount; i++) { |
+ CXFA_Stroke find = strokes[i]; |
+ if (!find) |
+ continue; |
+ |
+ if (!stroke) |
+ stroke = find; |
+ else if (stroke.GetStrokeType() != find.GetStrokeType()) |
+ stroke = find; |
+ break; |
+ } |
+ int32_t iType = stroke.GetStrokeType(); |
+ if (iType == XFA_ATTRIBUTEENUM_Lowered || iType == XFA_ATTRIBUTEENUM_Raised || |
+ iType == XFA_ATTRIBUTEENUM_Etched || |
+ iType == XFA_ATTRIBUTEENUM_Embossed) { |
+ return iType; |
+ } |
+ return 0; |
+} |
+ |
+} // namespace |
+ |
+int32_t CXFA_Box::GetHand() const { |
+ if (!m_pNode) |
+ return XFA_ATTRIBUTEENUM_Even; |
+ return m_pNode->GetEnum(XFA_ATTRIBUTE_Hand); |
+} |
+ |
+int32_t CXFA_Box::GetPresence() const { |
+ if (!m_pNode) |
+ return XFA_ATTRIBUTEENUM_Hidden; |
+ return m_pNode->GetEnum(XFA_ATTRIBUTE_Presence); |
+} |
+ |
+int32_t CXFA_Box::CountEdges() const { |
+ if (!m_pNode) |
+ return 0; |
+ return m_pNode->CountChildren(XFA_ELEMENT_Edge); |
+} |
+ |
+CXFA_Edge CXFA_Box::GetEdge(int32_t nIndex) const { |
+ return CXFA_Edge( |
+ m_pNode ? m_pNode->GetProperty(nIndex, XFA_ELEMENT_Edge, nIndex == 0) |
+ : nullptr); |
+} |
+ |
+void CXFA_Box::GetStrokes(CXFA_StrokeArray& strokes) const { |
+ GetStrokesInternal(m_pNode, strokes, FALSE); |
+} |
+ |
+FX_BOOL CXFA_Box::IsCircular() const { |
+ if (!m_pNode) |
+ return FALSE; |
+ return m_pNode->GetBoolean(XFA_ATTRIBUTE_Circular); |
+} |
+ |
+FX_BOOL CXFA_Box::GetStartAngle(FX_FLOAT& fStartAngle) const { |
+ fStartAngle = 0; |
+ if (!m_pNode) |
+ return FALSE; |
+ |
+ CXFA_Measurement ms; |
+ FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_StartAngle, ms, FALSE); |
+ if (bRet) |
+ fStartAngle = ms.GetValue(); |
+ |
+ return bRet; |
+} |
+ |
+FX_BOOL CXFA_Box::GetSweepAngle(FX_FLOAT& fSweepAngle) const { |
+ fSweepAngle = 360; |
+ if (!m_pNode) |
+ return FALSE; |
+ |
+ CXFA_Measurement ms; |
+ FX_BOOL bRet = m_pNode->TryMeasure(XFA_ATTRIBUTE_SweepAngle, ms, FALSE); |
+ if (bRet) |
+ fSweepAngle = ms.GetValue(); |
+ |
+ return bRet; |
+} |
+ |
+CXFA_Fill CXFA_Box::GetFill(FX_BOOL bModified) const { |
+ if (!m_pNode) |
+ return CXFA_Fill(nullptr); |
+ |
+ CXFA_Node* pFillNode = m_pNode->GetProperty(0, XFA_ELEMENT_Fill, bModified); |
+ return CXFA_Fill(pFillNode); |
+} |
+ |
+CXFA_Margin CXFA_Box::GetMargin() const { |
+ return CXFA_Margin(m_pNode ? m_pNode->GetChild(0, XFA_ELEMENT_Margin) |
+ : nullptr); |
+} |
+ |
+int32_t CXFA_Box::Get3DStyle(FX_BOOL& bVisible, FX_FLOAT& fThickness) const { |
+ if (IsArc()) |
+ return 0; |
+ |
+ CXFA_StrokeArray strokes; |
+ GetStrokesInternal(m_pNode, strokes, TRUE); |
+ CXFA_Stroke stroke(NULL); |
+ int32_t iType = Style3D(strokes, stroke); |
+ if (iType) { |
+ bVisible = stroke.IsVisible(); |
+ fThickness = stroke.GetThickness(); |
+ } |
+ return iType; |
+} |