Example #1
0
 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
Example #3
0
 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
Example #4
0
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
Example #5
0
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
Example #6
0
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