(root)/
libredwg-0.13/
test/
unit-testing/
mpolygon.c
       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  }