1 // debugging
2 #define DWG_TYPE DWG_TYPE_MPOLYGON
3 #include "common.c"
4
5 void
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 hatch_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",
67 _obj->pattern_type);
68 CHK_ENTITY_TYPE (_obj, MPOLYGON, angle, BD);
69 CHK_ENTITY_TYPE (_obj, MPOLYGON, scale_spacing, BD);
70 CHK_ENTITY_TYPE (_obj, MPOLYGON, double_flag, B);
71 CHK_ENTITY_TYPE (_obj, MPOLYGON, num_deflines, BS);
72
73 if (!dwg_dynapi_entity_value (_obj, "MPOLYGON", "colors", &colors, NULL))
74 fail ("MPOLYGON.colors");
75 if (num_colors)
76 {
77 if (!is_gradient_fill)
78 fail ("MPOLYGON.num_colors without is_gradient_fill");
79 if (!colors)
80 fail ("MPOLYGON.colors");
81 else
82 for (i = 0; i < num_colors; i++)
83 {
84 CHK_SUBCLASS_TYPE (colors[i], HATCH_Color, shift_value, BD);
85 CHK_SUBCLASS_CMC (colors[i], HATCH_Color, color);
86 }
87 }
88
89 if (!dwg_dynapi_entity_value (_obj, "MPOLYGON", "paths", &paths, NULL))
90 fail ("MPOLYGON.paths");
91 if (num_paths)
92 {
93 if (!paths)
94 fail ("MPOLYGON.paths");
95 else
96 for (i = 0; i < num_paths; i++)
97 {
98 CHK_SUBCLASS_TYPE (paths[i], HATCH_Path, flag, BLx);
99 CHK_SUBCLASS_MAX (paths[i], HATCH_Path, flag, BL, 0x400);
100 CHK_SUBCLASS_TYPE (paths[i], HATCH_Path, num_segs_or_paths, BL);
101 if (!(paths[i].flag & 2))
102 {
103 for (BITCODE_BL j = 0; j < paths[i].num_segs_or_paths; j++)
104 {
105 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
106 curve_type, RC);
107 if (paths[i].segs[j].curve_type > 4)
108 fail ("Invalid MPOLYGON.paths[%d].segs[%d].curve_type "
109 "%d > 4",
110 i, j, paths[i].segs[j].curve_type);
111 if (paths[i].segs[j].curve_type == 1)
112 {
113 CHK_SUBCLASS_2RD (paths[i].segs[j], HATCH_PathSeg,
114 first_endpoint);
115 CHK_SUBCLASS_2RD (paths[i].segs[j], HATCH_PathSeg,
116 second_endpoint);
117 }
118 else if (paths[i].segs[j].curve_type == 2)
119 { /* CIRCULAR ARC */
120 CHK_SUBCLASS_2RD (paths[i].segs[j], HATCH_PathSeg,
121 center);
122 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
123 radius, BD);
124 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
125 start_angle, BD);
126 // CHK_ENTITY_MAX (_obj, HATCH_PathSeg, start_angle,
127 // BD, MAX_ANGLE);
128 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
129 end_angle, BD);
130 // CHK_ENTITY_MAX (_obj, HATCH_PathSeg, end_angle, BD,
131 // MAX_ANGLE);
132 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
133 is_ccw, B);
134 }
135 else if (paths[i].segs[j].curve_type == 3)
136 { /* ELLIPTICAL ARC */
137 CHK_SUBCLASS_2RD (paths[i].segs[j], HATCH_PathSeg,
138 center);
139 CHK_SUBCLASS_2RD (paths[i].segs[j], HATCH_PathSeg,
140 endpoint);
141 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
142 minor_major_ratio, BD);
143 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
144 start_angle, BD);
145 // CHK_ENTITY_MAX (_obj, HATCH_PathSeg, start_angle,
146 // BD, MAX_ANGLE);
147 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
148 end_angle, BD);
149 // CHK_ENTITY_MAX (_obj, HATCH_PathSeg, end_angle, BD,
150 // MAX_ANGLE);
151 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
152 is_ccw, B);
153 }
154 else if (paths[i].segs[j].curve_type == 4)
155 { /* SPLINE */
156 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
157 degree, BL);
158 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
159 is_rational, B);
160 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
161 is_periodic, B);
162 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
163 num_knots, BL);
164 CHK_SUBCLASS_TYPE (paths[i].segs[j], HATCH_PathSeg,
165 num_control_points, BL);
166 // knots: BD vector
167 // control_points: HATCH_ControlPoint
168 }
169 }
170 }
171 else
172 {
173 CHK_SUBCLASS_TYPE (paths[i], HATCH_Path, bulges_present, B);
174 CHK_SUBCLASS_TYPE (paths[i], HATCH_Path, closed, B);
175 CHK_SUBCLASS_TYPE (paths[i], HATCH_Path, num_segs_or_paths,
176 BL);
177 for (BITCODE_BL j = 0; j < paths[i].num_segs_or_paths; j++)
178 {
179 CHK_SUBCLASS_2RD (paths[i].polyline_paths[j],
180 HATCH_PolylinePath, point);
181 CHK_SUBCLASS_TYPE (paths[i].polyline_paths[j],
182 HATCH_PolylinePath, bulge, BD);
183 if (paths[i].polyline_paths[j].bulge != 0.0
184 && paths[i].bulges_present)
185 fail ("Illegal HATCH_PolylinePath.bulge %f without "
186 "paths[i].bulges_present",
187 paths[i].polyline_paths[j].bulge);
188 }
189 }
190 CHK_SUBCLASS_TYPE (paths[i], HATCH_Path, num_boundary_handles, BL);
191 }
192 }
193
194 if (!dwg_dynapi_entity_value (_obj, "MPOLYGON", "deflines", &deflines, NULL))
195 fail ("MPOLYGON.deflines");
196 // only with !solid_fill
197 if (num_deflines)
198 {
199 if (is_solid_fill)
200 fail ("MPOLYGON.num_deflines with solid_fill");
201 if (!deflines)
202 fail ("MPOLYGON.deflines");
203 else
204 {
205 for (i = 0; i < num_deflines; i++)
206 {
207 CHK_SUBCLASS_TYPE (deflines[i], HATCH_DefLine, angle, BD);
208 CHK_SUBCLASS_2RD (deflines[i], HATCH_DefLine, pt0);
209 CHK_SUBCLASS_2RD (deflines[i], HATCH_DefLine, offset);
210 CHK_SUBCLASS_TYPE (deflines[i], HATCH_DefLine, num_dashes, BS);
211 for (BITCODE_BS j = 0; j < deflines[i].num_dashes; j++)
212 {
213 ok ("MPOLYGON.deflines[%d].dashes[%d]: %f", i, j,
214 deflines[i].dashes[j]);
215 }
216 }
217 }
218 }
219
220 CHK_ENTITY_TYPE (_obj, MPOLYGON, num_boundary_handles, BL);
221 if (!dwg_dynapi_entity_value (_obj, "MPOLYGON", "boundary_handles",
222 &boundary_handles, NULL))
223 fail ("MPOLYGON.boundary_handles");
224 if (num_boundary_handles)
225 {
226 if (!boundary_handles)
227 fail ("MPOLYGON.boundary_handles");
228 else
229 for (i = 0; i < num_boundary_handles; i++)
230 {
231 ok ("MPOLYGON.boundary_handles[%d]: " FORMAT_REF, i,
232 ARGS_REF (boundary_handles[i]));
233 }
234 }
235 else if (boundary_handles)
236 fail ("MPOLYGON.boundary_handles with !num_boundary_handles");
237
238 CHK_ENTITY_CMC (_obj, MPOLYGON, hatch_color);
239 CHK_ENTITY_2RD (_obj, MPOLYGON, x_dir);
240 CHK_ENTITY_TYPE (_obj, MPOLYGON, num_boundary_handles, BL);
241 #endif
242 }