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