1/* -*- c -*- */
2
3  #include "spec.h"
4  //Dwg_Object_Entity* _obj = ent;
5
6  // p20.4.1
7  SINCE (R_13) {
8    FIELD_B (preview_exists, 0);
9    if (ent->preview_exists)
10      {
11        // was DXF 160 (used for block previews?).
12        // 92 also for all PROXY vector preview data with klass->is_zombie
13#ifdef IS_DECODER
14        if (obj->klass && obj->klass->is_zombie)
15          ent->preview_is_proxy = 1;
16#endif
17#if defined(IS_JSON)
18        FIELD_B (preview_is_proxy, 0);
19        FIELD_BLL (preview_size, 0);
20#else
21        VERSIONS (R_13, R_2007)
22          {
23            FIELD_CAST (preview_size, RL, BLL, 92);
24          }
25        SINCE (R_2010)
26          {
27            FIELD_BLL (preview_size, 160);
28          }
29#endif
30        if ((int)ent->preview_size >= 0 && ent->preview_size < 210210)
31          {
32            FIELD_BINARY (preview, ent->preview_size, 310);
33          }
34#ifndef IS_FREE
35        else
36          {
37            LOG_ERROR ("Invalid preview_size: %lu kB",
38                      (unsigned long)(ent->preview_size / 1000));
39            error |= DWG_ERR_VALUEOUTOFBOUNDS;
40          }
41#endif
42      }
43  }
44
45  VERSIONS (R_13, R_14)
46    {
47#ifdef IS_DECODER
48      obj->bitsize = bit_read_RL (dat); // until the handles
49#endif
50#ifdef IS_ENCODER
51      bit_write_RL (dat, obj->bitsize);
52#endif
53#ifndef IS_FREE
54      LOG_TRACE ("bitsize: " FORMAT_BL " @%lu.%u\n", obj->bitsize,
55                 dat->byte, dat->bit)
56#endif
57#ifdef IS_DECODER
58    if (obj->bitsize > obj->size * 8)
59      {
60        LOG_ERROR ("Invalid bitsize " FORMAT_RL " => " FORMAT_RL, obj->bitsize,
61                   obj->size * 8);
62        obj->bitsize = obj->size * 8;
63        error |= DWG_ERR_VALUEOUTOFBOUNDS;
64      }
65    else
66      error |= obj_handle_stream (dat, obj, hdl_dat);
67#endif
68    }
69
70  // TODO: r13-r14: 6B flags + 6B common params
71  FIELD_BB (entmode, 0);
72  FIELD_BL (num_reactors, 0); //ODA bug: BB as BS
73
74  VERSIONS (R_13, R_14) //ODA bug
75    {
76      FIELD_B (isbylayerlt, 0);
77#ifdef IS_DECODER
78      if (FIELD_VALUE (isbylayerlt))
79        FIELD_VALUE (ltype_flags) = FIELD_VALUE (isbylayerlt) ? 0 : 3;
80#endif
81    }
82  SINCE (R_2004) //ODA bug
83    {
84      FIELD_B (is_xdic_missing, 0);
85    }
86  PRE (R_2004) //ODA bug
87    {
88      FIELD_B (nolinks, 0)
89    }
90  SINCE (R_2013)
91    {
92      FIELD_B (has_ds_data, 0);
93#ifdef IS_DECODER
94      if (_obj->has_ds_data && dwg_obj_is_3dsolid (obj))
95        {
96          // not global, needs to be freed individually. (SHIFT_HV)
97          BITCODE_H ref = dwg_add_handleref_free (5, obj->handle.value);
98          PUSH_HV (obj->parent, num_acis_sab_hdl, acis_sab_hdl, ref);
99        }
100#endif
101    }
102
103  // no ENC type as it's only used once, here, and we would need to write
104  // handlers for all 3 importers, and 3 exporters.
105  SINCE (R_2004) // ENC (entity color encoding)
106    {
107      BITCODE_BS flags;
108#ifdef IS_JSON
109      field_cmc (dat, "color", &ent->color);
110#else
111      DXF {
112        // 0: byblock
113        if (ent->color.index != 256) // not bylayer
114          FIELD_BS (color.index, 62);
115      } else {
116        FIELD_BSx (color.raw, 0);
117      }
118#ifdef IS_DECODER
119      ent->color.flag = ent->color.raw >> 8;
120      ent->color.index = ent->color.raw & 0x1ff; // 256 / -1 needed for ByLayer
121      ent->color.rgb = 0L;
122      if (ent->color.index != ent->color.raw)
123        LOG_TRACE (" color.index: %d [ENC 62]\n", ent->color.index);
124      if (ent->color.flag > 1)
125        LOG_TRACE (" color.flag: 0x%x\n", ent->color.flag);
126#endif
127      flags = ent->color.flag;
128      if (flags & 0x20)
129        {
130#ifndef IS_DXF
131          FIELD_BLx (color.alpha, 0);
132#endif
133#ifdef IS_DECODER
134          /* 0 BYLAYER, 1 BYBLOCK, 3 alpha */
135          ent->color.alpha_type = ent->color.alpha >> 24;
136          ent->color.alpha = ent->color.alpha & 0xFF;
137          LOG_TRACE (" color.alpha_type: %d [ENC 440]\n", ent->color.alpha_type);
138#endif
139          JSON {
140            FIELD_BB (color.alpha_type, 0);
141          }
142        }
143      if (flags & 0x40)
144        {
145          FIELD_HANDLE (color.handle, 0, 430); // DBCOLOR 1E9F74 => 1F05B9
146        }
147      else if (flags & 0x80) // and not a reference
148        {
149          DXF {
150            VALUE_BL (ent->color.rgb & 0x00ffffff, 420);
151          } else {
152            FIELD_BLx (color.rgb, 420); // ODA bug, documented as BS
153          }
154        }
155      if ((flags & 0x41) == 0x41)
156        {
157          FIELD_TV (color.name, 430);
158        }
159      if ((flags & 0x42) == 0x42)
160        {
161          FIELD_TV (color.book_name, 430);
162        }
163      DXF {
164        if (flags & 0x20 && ent->color.alpha_type == 3) {
165          FIELD_BL (color.alpha, 440);
166        }
167      }
168#endif
169    }
170  OTHER_VERSIONS {
171    DXF {
172      if (ent->color.index != 256) // not bylayer
173        FIELD_BS (color.index, 62);
174    }
175    else
176      FIELD_CMC (color, 62);
177  }
178
179#ifndef IS_DXF
180  FIELD_BD1 (ltype_scale, 48);
181#endif
182  SINCE (R_2000)
183    {
184      // 00 BYLAYER, 01 BYBLOCK, 10 CONTINUOUS, 11 ltype handle
185      FIELD_BB (ltype_flags, 0);
186      // 00 BYLAYER, 01 BYBLOCK, 10 CONTINUOUS, 11 plotstyle handle
187      FIELD_BB (plotstyle_flags, 0);
188    }
189  SINCE (R_2007)
190    {
191      FIELD_BB (material_flags, 0); //if not BYLAYER 00: 347 material handle
192      DXF {
193        if (FIELD_VALUE (material_flags))
194          FIELD_HANDLE (material, 0, 347)
195      }
196      FIELD_RC0 (shadow_flags, 284); /* r2007+: 0 both, 1 receives, 2 casts, 3 no */
197    }
198  SINCE (R_2010)
199    {
200      FIELD_B (has_full_visualstyle, 0); // DXF?
201      FIELD_B (has_face_visualstyle, 0);
202      FIELD_B (has_edge_visualstyle, 0);
203    }
204
205  DXF {
206    if (FIELD_VALUE (invisible) & 1) { // skip bit 1
207      VALUE_BS (1, 60)
208    }
209  } else {
210    FIELD_BS (invisible, 60); //bit 0: 0 visible, 1 invisible
211  }
212
213  SINCE (R_2000) {
214    // DXF later after 6, see common_entity_handle_data.spec
215    // Ideally CMC 60 should be deferred after layer 8, before linewt 370 also
216#ifndef IS_DXF
217    FIELD_RC (linewt, 370);
218#endif
219  }
220