Skip to content

Commit 524364b

Browse files
committed
decode_r11: fix wrong ltype size for POLYLINE/VERTEX
Fixes GH #832
1 parent 088dcf0 commit 524364b

File tree

3 files changed

+28
-13
lines changed

3 files changed

+28
-13
lines changed

src/decode.c

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6488,6 +6488,7 @@ decode_preR13_entities (BITCODE_RL start, BITCODE_RL end,
64886488
{
64896489
Dwg_Object *obj;
64906490
Dwg_Object_Type_r11 abstype;
6491+
BITCODE_RC pline_flag;
64916492

64926493
if (!num)
64936494
dwg->object
@@ -6687,7 +6688,6 @@ decode_preR13_entities (BITCODE_RL start, BITCODE_RL end,
66876688
BITCODE_RC extra_r11 = 0;
66886689
BITCODE_RS eed_size;
66896690
BITCODE_RC handling_len;
6690-
BITCODE_RC pline_flag;
66916691
size_t start_byte;
66926692
LOG_TRACE ("Detect polyline:");
66936693
start_byte = dat->byte;
@@ -6707,12 +6707,17 @@ decode_preR13_entities (BITCODE_RL start, BITCODE_RL end,
67076707
if (flag_r11 & FLAG_R11_HAS_COLOR)
67086708
dat->byte += 1;
67096709
if (flag_r11 & FLAG_R11_HAS_LTYPE)
6710-
dat->byte += 2;
6710+
{
6711+
PRE (R_11)
6712+
dat->byte += 1;
6713+
else
6714+
dat->byte += 2;
6715+
}
67116716
if (flag_r11 & FLAG_R11_HAS_THICKNESS)
67126717
dat->byte += 8;
67136718
if (flag_r11 & FLAG_R11_HAS_ELEVATION)
67146719
dat->byte += 8;
6715-
if (extra_r11 && extra_r11 & EXTRA_R11_HAS_EED)
6720+
if (extra_r11 & EXTRA_R11_HAS_EED)
67166721
{
67176722
eed_size = bit_read_RS (dat);
67186723
LOG_TRACE (", eed_size: %d", eed_size);
@@ -6724,10 +6729,11 @@ decode_preR13_entities (BITCODE_RL start, BITCODE_RL end,
67246729
LOG_TRACE (", handling_len: %d", handling_len);
67256730
dat->byte += handling_len;
67266731
}
6727-
if (extra_r11 && extra_r11 & EXTRA_R11_HAS_VIEWPORT)
6732+
if (extra_r11 & EXTRA_R11_HAS_VIEWPORT)
67286733
dat->byte += 2;
67296734
pline_flag = bit_read_RC (dat);
6730-
LOG_TRACE (", pline_flag: 0x%x\n", pline_flag);
6735+
LOG_TRACE (", pline_flag: 0x%x", pline_flag);
6736+
LOG_POS;
67316737
dat->byte = start_byte;
67326738
if (pline_flag & FLAG_POLYLINE_3D)
67336739
error |= dwg_decode_POLYLINE_3D (dat, obj);
@@ -6766,7 +6772,12 @@ decode_preR13_entities (BITCODE_RL start, BITCODE_RL end,
67666772
if (flag_r11 & FLAG_R11_HAS_COLOR)
67676773
dat->byte += 1;
67686774
if (flag_r11 & FLAG_R11_HAS_LTYPE)
6769-
dat->byte += 2;
6775+
{
6776+
PRE (R_11)
6777+
dat->byte += 1;
6778+
else
6779+
dat->byte += 2;
6780+
}
67706781
if (flag_r11 & FLAG_R11_HAS_THICKNESS)
67716782
dat->byte += 8;
67726783
if (flag_r11 & FLAG_R11_HAS_ELEVATION)
@@ -6801,17 +6812,18 @@ decode_preR13_entities (BITCODE_RL start, BITCODE_RL end,
68016812
if (opts_r11 & OPTS_R11_VERTEX_HAS_FLAG)
68026813
{
68036814
vertex_flag = bit_read_RC (dat);
6804-
LOG_TRACE (", vertex_flag: 0x%x\n", vertex_flag);
6815+
LOG_TRACE (", vertex_flag: 0x%x", vertex_flag);
6816+
LOG_POS;
68056817
dat->byte = start_byte;
6806-
if (vertex_flag & FLAG_VERTEX_3D)
6807-
error |= dwg_decode_VERTEX_3D (dat, obj);
6808-
else if (vertex_flag & FLAG_VERTEX_MESH
6818+
if (vertex_flag & FLAG_VERTEX_MESH
68096819
&& vertex_flag & FLAG_VERTEX_PFACE_MESH)
68106820
error |= dwg_decode_VERTEX_PFACE (dat, obj);
68116821
else if (vertex_flag & FLAG_VERTEX_MESH)
68126822
error |= dwg_decode_VERTEX_MESH (dat, obj);
68136823
else if (vertex_flag & FLAG_VERTEX_PFACE_MESH)
68146824
error |= dwg_decode_VERTEX_PFACE_FACE (dat, obj);
6825+
else if (vertex_flag & FLAG_VERTEX_3D)
6826+
error |= dwg_decode_VERTEX_3D (dat, obj);
68156827
else
68166828
error |= dwg_decode_VERTEX_2D (dat, obj);
68176829
}

src/decode_r11.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,8 @@ decode_preR13_section_hdr (const char *restrict name, Dwg_Section_Type_r11 id,
209209
LOG_ERROR ("%s.size overflow %zu > %zu", tbl->name,
210210
(size_t)(tbl->address + (tbl->number * tbl->size)),
211211
dat->size);
212-
return DWG_ERR_INVALIDDWG;
212+
// VPORT.size bug in DWG, ignore it.
213+
return id == SECTION_VPORT ? 0 : 1;
213214
}
214215
return 0;
215216
}

src/dwg.spec

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,8 +1140,10 @@ DWG_ENTITY (VERTEX_3D)
11401140
PRE (R_13b1)
11411141
{
11421142
FIELD_2RD (point, 10);
1143-
FIELD_RC (flag, 0);
1144-
LOG_FLAG_VERTEX
1143+
if (R11OPTS (8)) {
1144+
FIELD_RC (flag, 0);
1145+
LOG_FLAG_VERTEX
1146+
}
11451147
}
11461148
LATER_VERSIONS {
11471149
FIELD_RC (flag, 0);

0 commit comments

Comments
 (0)