1 // debugging
2 #define DWG_TYPE DWG_TYPE_MPOLYGON
3 #include "common.c"
4 
5 void
api_process(dwg_object * obj)6 api_process (dwg_object *obj)
7 {
8   int error, isnew;
9   BITCODE_BL i;
10   BITCODE_BL is_gradient_fill;
11   BITCODE_BL reserved;
12   BITCODE_BD gradient_angle;
13   BITCODE_BD gradient_shift;
14   BITCODE_BL single_color_gradient;
15   BITCODE_BD gradient_tint;
16   BITCODE_BL num_colors;
17   BITCODE_T gradient_name;
18   BITCODE_BD elevation;
19   BITCODE_BE extrusion;
20   BITCODE_TV name;
21   BITCODE_B is_solid_fill;
22   BITCODE_B is_associative;
23   BITCODE_BL num_paths;
24   BITCODE_BS style;
25   BITCODE_BS pattern_type;
26   BITCODE_BD angle;
27   BITCODE_BD scale_spacing;
28   BITCODE_B double_flag;
29   BITCODE_BS num_deflines;
30   BITCODE_BL num_boundary_handles;
31   BITCODE_H* boundary_handles;
32   Dwg_HATCH_Color* colors;
33   Dwg_HATCH_Path* paths;
34   Dwg_HATCH_DefLine * deflines;
35 
36   BITCODE_CMC color;
37   BITCODE_2RD x_dir;
38 
39   Dwg_Version_Type dwg_version = obj->parent->header.version;
40 #ifdef DEBUG_CLASSES
41   dwg_ent_mpolygon *_obj = dwg_object_to_MPOLYGON (obj);
42 
43   CHK_ENTITY_TYPE (_obj, MPOLYGON, is_gradient_fill, BL);
44   if (is_gradient_fill)
45     {
46       CHK_ENTITY_TYPE (_obj, MPOLYGON, reserved, BL);
47       CHK_ENTITY_TYPE (_obj, MPOLYGON, gradient_angle, BD);
48       CHK_ENTITY_MAX (_obj, MPOLYGON, gradient_angle, BD, MAX_ANGLE);
49       CHK_ENTITY_TYPE (_obj, MPOLYGON, gradient_shift, BD);
50       CHK_ENTITY_TYPE (_obj, MPOLYGON, single_color_gradient, BL);
51       CHK_ENTITY_TYPE (_obj, MPOLYGON, gradient_tint, BD);
52       CHK_ENTITY_UTF8TEXT (_obj, MPOLYGON, gradient_name);
53     }
54   CHK_ENTITY_TYPE (_obj, MPOLYGON, num_colors, BL);
55   CHK_ENTITY_TYPE (_obj, MPOLYGON, elevation, BD);
56   CHK_ENTITY_3RD (_obj, MPOLYGON, extrusion);
57   CHK_ENTITY_UTF8TEXT (_obj, MPOLYGON, name);
58   CHK_ENTITY_TYPE (_obj, MPOLYGON, is_solid_fill, B);
59   CHK_ENTITY_TYPE (_obj, MPOLYGON, is_associative, B);
60   CHK_ENTITY_TYPE (_obj, MPOLYGON, num_paths, BL);
61   CHK_ENTITY_TYPE (_obj, MPOLYGON, style, BS);
62   if (_obj->style > 2)
63     fail ("Invalid MPOLYGON.style " FORMAT_BS " > 2", _obj->style);
64   CHK_ENTITY_TYPE (_obj, MPOLYGON, pattern_type, BS);
65   if (_obj->pattern_type > 2)
66     fail ("Invalid MPOLYGON.pattern_type " FORMAT_BS " > 2", _obj->pattern_type);
67   CHK_ENTITY_TYPE (_obj, MPOLYGON, angle, BD);
68   CHK_ENTITY_TYPE (_obj, MPOLYGON, scale_spacing, BD);
69   CHK_ENTITY_TYPE (_obj, MPOLYGON, double_flag, B);
70   CHK_ENTITY_TYPE (_obj, MPOLYGON, num_deflines, BS);
71 
72   if (!dwg_dynapi_entity_value (_obj, "MPOLYGON", "colors", &colors, NULL))
73     fail ("MPOLYGON.colors");
74   if (num_colors)
75     {
76       if (!is_gradient_fill)
77         fail ("MPOLYGON.num_colors without is_gradient_fill");
78       if (!colors)
79         fail ("MPOLYGON.colors");
80       else
81         for (i = 0; i < num_colors; i++)
82           {
83             CHK_SUBCLASS_TYPE (colors[i], HATCH_Color, shift_value, BD);
84             CHK_SUBCLASS_CMC (colors[i], HATCH_Color, color);
85           }
86     }
87 
88   if (!dwg_dynapi_entity_value (_obj, "MPOLYGON", "paths", &paths, NULL))
89     fail ("MPOLYGON.paths");
90   if (num_paths)
91     {
92       if (!paths)
93         fail ("MPOLYGON.paths");
94       else
95         for (i = 0; i < num_paths; i++)
96           {
97             CHK_SUBCLASS_TYPE (paths[i], HATCH_Path, flag, BLx);
98             CHK_SUBCLASS_MAX (paths[i], HATCH_Path, flag, BL, 0x400);
99             CHK_SUBCLASS_TYPE (paths[i], HATCH_Path, num_segs_or_paths, BL);
100             if (!(paths[i].flag & 2))
101               {
102                 for (BITCODE_BL j = 0; j < paths[i].num_segs_or_paths; j++)
103                   {
104                     CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, curve_type, RC);
105                     if (paths[i].segs[j].curve_type > 4)
106                       fail ("Invalid MPOLYGON.paths[%d].segs[%d].curve_type %d > 4",
107                             i, j, paths[i].segs[j].curve_type);
108                     if (paths[i].segs[j].curve_type == 1)
109                       {
110                         CHK_SUBCLASS_2RD (paths[i].segs[j], HATCH_PathSeg, first_endpoint);
111                         CHK_SUBCLASS_2RD (paths[i].segs[j], HATCH_PathSeg, second_endpoint);
112                       }
113                     else if (paths[i].segs[j].curve_type == 2)
114                       { /* CIRCULAR ARC */
115                         CHK_SUBCLASS_2RD (paths[i].segs[j], HATCH_PathSeg, center);
116                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, radius, BD);
117                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, start_angle, BD);
118                         //CHK_ENTITY_MAX (_obj, HATCH_PathSeg, start_angle, BD, MAX_ANGLE);
119                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, end_angle, BD);
120                         //CHK_ENTITY_MAX (_obj, HATCH_PathSeg, end_angle, BD, MAX_ANGLE);
121                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, is_ccw, B);
122                       }
123                     else if (paths[i].segs[j].curve_type == 3)
124                       { /* ELLIPTICAL ARC */
125                         CHK_SUBCLASS_2RD (paths[i].segs[j], HATCH_PathSeg, center);
126                         CHK_SUBCLASS_2RD (paths[i].segs[j], HATCH_PathSeg, endpoint);
127                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, minor_major_ratio, BD);
128                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, start_angle, BD);
129                         //CHK_ENTITY_MAX (_obj, HATCH_PathSeg, start_angle, BD, MAX_ANGLE);
130                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, end_angle, BD);
131                         //CHK_ENTITY_MAX (_obj, HATCH_PathSeg, end_angle, BD, MAX_ANGLE);
132                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, is_ccw, B);
133                       }
134                     else if (paths[i].segs[j].curve_type == 4)
135                       { /* SPLINE */
136                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, degree, BL);
137                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, is_rational, B);
138                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, is_periodic, B);
139                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, num_knots, BL);
140                         CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg, num_control_points, BL);
141                         // knots: BD vector
142                         // control_points: HATCH_ControlPoint
143                       }
144                   }
145               }
146             else
147               {
148                 CHK_SUBCLASS_TYPE (paths[i], HATCH_Path, bulges_present, B);
149                 CHK_SUBCLASS_TYPE (paths[i], HATCH_Path, closed, B);
150                 CHK_SUBCLASS_TYPE (paths[i], HATCH_Path, num_segs_or_paths, BL);
151                 for (BITCODE_BL j = 0; j < paths[i].num_segs_or_paths; j++)
152                   {
153                     CHK_SUBCLASS_2RD (paths[i].polyline_paths[j], HATCH_PolylinePath, point);
154                     CHK_SUBCLASS_TYPE (paths[i].polyline_paths[j], HATCH_PolylinePath, bulge, BD);
155                     if (paths[i].polyline_paths[j].bulge != 0.0 && paths[i].bulges_present)
156                       fail ("Illegal HATCH_PolylinePath.bulge %f without paths[i].bulges_present",
157                             paths[i].polyline_paths[j].bulge);
158                   }
159               }
160             CHK_SUBCLASS_TYPE (paths[i], HATCH_Path, num_boundary_handles, BL);
161           }
162     }
163 
164   if (!dwg_dynapi_entity_value (_obj, "MPOLYGON", "deflines", &deflines, NULL))
165     fail ("MPOLYGON.deflines");
166   // only with !solid_fill
167   if (num_deflines)
168     {
169       if (is_solid_fill)
170         fail ("MPOLYGON.num_deflines with solid_fill");
171       if (!deflines)
172         fail ("MPOLYGON.deflines");
173       else
174         {
175           for (i = 0; i < num_deflines; i++)
176             {
177               CHK_SUBCLASS_TYPE (deflines[i], HATCH_DefLine, angle, BD);
178               CHK_SUBCLASS_2RD (deflines[i], HATCH_DefLine, pt0);
179               CHK_SUBCLASS_2RD (deflines[i], HATCH_DefLine, offset);
180               CHK_SUBCLASS_TYPE (deflines[i], HATCH_DefLine, num_dashes, BS);
181               for (BITCODE_BS j = 0; j < deflines[i].num_dashes; j++)
182                 {
183                   ok ("MPOLYGON.deflines[%d].dashes[%d]: %f", i, j, deflines[i].dashes[j]);
184                 }
185             }
186         }
187     }
188 
189   if (!dwg_dynapi_entity_value (_obj, "MPOLYGON", "boundary_handles", &boundary_handles, NULL))
190     fail ("MPOLYGON.boundary_handles");
191   if (num_boundary_handles)
192     {
193       if (!boundary_handles)
194         fail ("MPOLYGON.boundary_handles");
195       else
196         for (i = 0; i < num_boundary_handles; i++)
197           {
198             ok ("MPOLYGON.boundary_handles[%d]: " FORMAT_REF, i, ARGS_REF (boundary_handles[i]));
199           }
200     }
201   else if (boundary_handles)
202     fail ("MPOLYGON.boundary_handles with !num_boundary_handles");
203 
204   CHK_ENTITY_CMC (_obj, MPOLYGON, color);
205   CHK_ENTITY_2RD (_obj, MPOLYGON, x_dir);
206   CHK_ENTITY_TYPE (_obj, MPOLYGON, num_boundary_handles, BL);
207 #endif
208 }
209