def tile_layer_from_element(self, cls, elem, map, options): layer = cls( map, elem.attrib.pop('name'), opacity=float(elem.attrib.pop('opacity', 1)), visible=bool(int(elem.attrib.pop('visible', 1))), id=int_or_none(elem.attrib.pop('id', None)), ) layer_size = (int(elem.attrib.pop('width')), int(elem.attrib.pop('height'))) assert layer_size == map.size assert not elem.attrib, ('Unexpected tile layer attributes: %s' % elem.attrib) data_set = False for subelem in elem: if subelem.tag == 'properties': layer.properties.update(self.read_properties(subelem)) elif subelem.tag == 'data': assert data_set is False data = subelem.text.encode('ascii') encoding = subelem.attrib.pop('encoding') if encoding == 'base64': data = base64.b64decode(data) layer.encoding = 'base64' elif encoding == 'csv': # Handled below pass else: raise ValueError('Bad encoding %s' % encoding) compression = subelem.attrib.pop('compression', None) if compression == 'gzip': filelike = io.BytesIO(data) gzfile = gzip.GzipFile(fileobj=filelike) data = gzfile.read() gzfile.close() layer.compression = 'gzip' elif compression == 'zlib': data = zlib.decompress(data) layer.compression = 'zlib' elif compression: raise ValueError('Bad compression %s' % compression) else: layer.compression = None if encoding == 'csv': result = [] for line in csv.reader(data.decode().splitlines()): result.append(int(i) for i in line) layer.data = result layer.encoding = 'csv' else: layer.data = array.array( 'L', [(ord_(a) + (ord_(b) << 8) + (ord_(c) << 16) + (ord_(d) << 24)) for a, b, c, d in zip(*(data[x::4] for x in range(4)))]) data_set = True else: raise ValueError('Unknown tag %s' % subelem.tag) assert data_set return layer
def tile_layer_from_element(self, cls, elem, map): layer = cls(map, elem.attrib.pop('name'), opacity=float(elem.attrib.pop('opacity', 1)), visible=bool(int(elem.attrib.pop('visible', 1)))) layer_size = (int(elem.attrib.pop('width')), int(elem.attrib.pop('height'))) assert layer_size == map.size assert not elem.attrib, ( 'Unexpected tile layer attributes: %s' % elem.attrib) data_set = False for subelem in elem: if subelem.tag == 'properties': layer.properties.update(self.read_properties(subelem)) elif subelem.tag == 'data': assert data_set is False data = subelem.text.encode('ascii') encoding = subelem.attrib.pop('encoding') if encoding == 'base64': data = base64.b64decode(data) layer.encoding = 'base64' else: raise ValueError('Bad encoding %s' % encoding) compression = subelem.attrib.pop('compression', None) if compression == 'gzip': filelike = io.BytesIO(data) gzfile = gzip.GzipFile(fileobj=filelike) data = gzfile.read() gzfile.close() layer.compression = 'gzip' elif compression == 'zlib': data = zlib.decompress(data) layer.compression = 'zlib' elif compression: raise ValueError( 'Bad compression %s' % compression) else: layer.compression = None layer.data = array.array('L', [( ord_(a) + (ord_(b) << 8) + (ord_(c) << 16) + (ord_(d) << 24)) for a, b, c, d in zip(*(data[x::4] for x in range(4)))]) data_set = True else: raise ValueError('Unknown tag %s' % subelem.tag) assert data_set return layer
def tile_layer_from_element(self, cls, elem, map): layer = cls( map, elem.attrib.pop("name"), opacity=float(elem.attrib.pop("opacity", 1)), visible=bool(int(elem.attrib.pop("visible", 1))), ) layer_size = (int(elem.attrib.pop("width")), int(elem.attrib.pop("height"))) assert layer_size == map.size assert not elem.attrib, "Unexpected tile layer attributes: %s" % elem.attrib data_set = False for subelem in elem: if subelem.tag == "properties": layer.properties.update(self.read_properties(subelem)) elif subelem.tag == "data": assert data_set is False data = subelem.text.encode("ascii") encoding = subelem.attrib.pop("encoding") if encoding == "base64": data = base64.b64decode(data) layer.encoding = "base64" else: raise ValueError("Bad encoding %s" % encoding) compression = subelem.attrib.pop("compression", None) if compression == "gzip": filelike = io.BytesIO(data) gzfile = gzip.GzipFile(fileobj=filelike) data = gzfile.read() gzfile.close() layer.compression = "gzip" elif compression == "zlib": data = zlib.decompress(data) layer.compression = "zlib" elif compression: raise ValueError("Bad compression %s" % compression) else: layer.compression = None layer.data = array.array( "L", [ (ord_(a) + (ord_(b) << 8) + (ord_(c) << 16) + (ord_(d) << 24)) for a, b, c, d in zip(*(data[x::4] for x in range(4))) ], ) data_set = True else: raise ValueError("Unknown tag %s" % subelem.tag) assert data_set return layer
def assert_pil_images_equal(a, b, epsilon=0): abytes = a.convert('RGBA').tobytes() bbytes = b.convert('RGBA').tobytes() if abytes != bbytes: from tmxlib_test.image_to_term import image_to_term256 from PIL import ImageChops, ImageOps print("Expected: ({im.size[0]}x{im.size[1]})".format(im=a)) print(image_to_term256(a)) print("Got: ({im.size[0]}x{im.size[1]})".format(im=b)) print(image_to_term256(b)) diff = ImageChops.difference(a, b).convert('RGB') diff = ImageOps.autocontrast(diff) print('Difference:') print(image_to_term256(diff)) assert len(abytes) == len(bbytes), 'unequal image size' max_pixel_delta = 0 zero_alphas = 0 try: Counter = collections.Counter except AttributeError: # pragma: no cover -- Python 2.6 counters = None else: counters = [Counter() for i in range(4)] for bands in grouper(zip(abytes, bbytes), 4): alpha_a, alpha_b = bands[-1] if alpha_a == alpha_b == b'\0': zero_alphas += 1 continue for band_index, (ba, bb) in enumerate(bands): pixel_delta = ord_(ba) - ord_(bb) max_pixel_delta = max(abs(pixel_delta), max_pixel_delta) if counters: counters[band_index][pixel_delta] += 1 print('Ignored pixels (zero alpha):', zero_alphas) if counters: print("Pixel deltas:") for band_index, counter in enumerate(counters): print(' {0}:'.format('RGBA'[band_index])) for delta, count in sorted(counter.items()): print(' {0:4}: {1}x'.format(delta, count)) print('Max |pixel delta|:', max_pixel_delta) assert max_pixel_delta <= epsilon
def assert_png_repr_equal(image, filename, epsilon=0): data = image._repr_png_() a = pil_image_open(get_test_filename(filename)) b = pil_image_open(BytesIO(data)) assert b.format == 'PNG' abytes = a.convert('RGBA').tobytes() bbytes = b.convert('RGBA').tobytes() if abytes != bbytes: from tmxlib_test.image_to_term import image_to_term256 from PIL import ImageChops, ImageOps print("Expected: ({im.size[0]}x{im.size[1]})".format(im=a)) print(image_to_term256(a)) print("Got: ({im.size[0]}x{im.size[1]})".format(im=b)) print(image_to_term256(b)) diff = ImageChops.difference(a, b).convert('RGB') diff = ImageOps.autocontrast(diff) print('Difference:') print(image_to_term256(diff)) assert len(abytes) == len(bbytes), 'unequal image size' max_pixel_delta = 0 try: Counter = collections.Counter except AttributeError: # pragma: no cover -- Python 2.6 counters = None else: counters = [Counter() for i in range(4)] for i, (ba, bb) in enumerate(zip(abytes, bbytes)): pixel_delta = ord_(ba) - ord_(bb) max_pixel_delta = max(abs(pixel_delta), max_pixel_delta) if counters: counters[i % 4][pixel_delta] += 1 if counters: print("Pixel deltas:") for band_index, counter in enumerate(counters): print(' {0}:'.format('RGBA'[band_index])) for delta, count in sorted(counter.items()): print(' {0:4}: {1}x'.format(delta, count)) print('Max |pixel delta|:', max_pixel_delta) assert max_pixel_delta <= epsilon