1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef XFA_FXFA_PARSER_CXFA_BOX_H_
8 #define XFA_FXFA_PARSER_CXFA_BOX_H_
9 
10 #include <memory>
11 #include <tuple>
12 #include <vector>
13 
14 #include "core/fxcrt/fx_coordinates.h"
15 #include "xfa/fxfa/parser/cxfa_node.h"
16 #include "xfa/fxgraphics/cxfa_gepath.h"
17 
18 class CXFA_Edge;
19 class CXFA_Fill;
20 class CXFA_Graphics;
21 class CXFA_Margin;
22 class CXFA_Stroke;
23 
24 class CXFA_Box : public CXFA_Node {
25  public:
26   ~CXFA_Box() override;
27 
28   XFA_AttributeEnum GetPresence();
29   std::tuple<XFA_AttributeEnum, bool, float> Get3DStyle();
30 
31   int32_t CountEdges();
32   CXFA_Edge* GetEdgeIfExists(int32_t nIndex);
33   CXFA_Fill* GetOrCreateFillIfPossible();
34 
35   std::vector<CXFA_Stroke*> GetStrokes();
36 
37   void Draw(CXFA_Graphics* pGS,
38             const CFX_RectF& rtWidget,
39             const CFX_Matrix& matrix,
40             bool forceRound);
41 
42  protected:
43   CXFA_Box(CXFA_Document* pDoc,
44            XFA_PacketType ePacket,
45            uint32_t validPackets,
46            XFA_ObjectType oType,
47            XFA_Element eType,
48            const PropertyData* properties,
49            const AttributeData* attributes,
50            const WideStringView& elementName,
51            std::unique_ptr<CJX_Object> js_node);
52 
53   XFA_AttributeEnum GetHand();
54 
55  private:
56   bool IsCircular();
57   Optional<int32_t> GetStartAngle();
58   Optional<int32_t> GetSweepAngle();
59 
60   std::vector<CXFA_Stroke*> GetStrokesInternal(bool bNull);
61   void DrawFill(const std::vector<CXFA_Stroke*>& strokes,
62                 CXFA_Graphics* pGS,
63                 CFX_RectF rtWidget,
64                 const CFX_Matrix& matrix,
65                 bool forceRound);
66   void StrokeArcOrRounded(CXFA_Graphics* pGS,
67                           CFX_RectF rtWidget,
68                           const CFX_Matrix& matrix,
69                           bool forceRound);
70   void GetPathArcOrRounded(CFX_RectF rtDraw,
71                            CXFA_GEPath& fillPath,
72                            bool forceRound);
73 };
74 
75 #endif  // XFA_FXFA_PARSER_CXFA_BOX_H_
76