diff --git a/fatamorgana/basic.py b/fatamorgana/basic.py index 7619b27..4db5ba0 100644 --- a/fatamorgana/basic.py +++ b/fatamorgana/basic.py @@ -1302,25 +1302,38 @@ def read_point_list(stream: io.BufferedIOBase) -> List[List[int]]: """ list_type = read_uint(stream) list_len = read_uint(stream) - #TODO: Implicit close point for 1del if list_type == 0: points = [] + dx, dy = 0, 0 for i in range(list_len): point = [0, 0] - n = read_uint(stream) + n = read_sint(stream) if n == 0: raise InvalidDataError('Zero-sized 1-delta') point[i % 2] = n points.append(point) + if i % 2: + dy += n + else: + dx += n + points.append([-dx, 0]) + points.append([0, -dy]) elif list_type == 1: points = [] + dx, dy = 0, 0 for i in range(list_len): point = [0, 0] - n = read_uint(stream) + n = read_sint(stream) if n == 0: raise Exception('Zero-sized 1-delta') point[(i + 1) % 2] = n points.append(point) + if i % 2: + dx += n + else: + dy += n + points.append([0, -dy]) + points.append([-dx, 0]) elif list_type == 2: points = [ManhattanDelta.read(stream).as_list() for _ in range(list_len)] elif list_type == 3: diff --git a/fatamorgana/records.py b/fatamorgana/records.py index aabc3b4..f76682e 100644 --- a/fatamorgana/records.py +++ b/fatamorgana/records.py @@ -18,7 +18,7 @@ import zlib import io import logging import pprint - +from warnings import warn from .basic import AString, NString, repetition_t, property_value_t, real_t, \ ReuseRepetition, OffsetTable, Validation, read_point_list, read_property_value, \ read_bstring, read_uint, read_sint, read_real, read_repetition, read_interval, \ @@ -1630,7 +1630,7 @@ class Polygon(Record): if point_list is not None: if len(point_list) < 3: - raise InvalidDataError('Polygon with < 3 points') + warn('Polygon with < 3 points') def merge_with_modals(self, modals: Modals): adjust_coordinates(self, modals, 'geometry_x', 'geometry_y')