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