def load_ora(self, filename, feedback_cb=None): """Loads from an OpenRaster file""" logger.info('load_ora: %r', filename) t0 = time.time() tempdir = tempfile.mkdtemp('mypaint') if not isinstance(tempdir, unicode): tempdir = tempdir.decode(sys.getfilesystemencoding()) z = zipfile.ZipFile(filename) logger.debug('mimetype: %r', z.read('mimetype').strip()) xml = z.read('stack.xml') image = ET.fromstring(xml) stack = image.find('stack') image_w = int(image.attrib['w']) image_h = int(image.attrib['h']) def get_pixbuf(filename): t1 = time.time() try: fp = z.open(filename, mode='r') except KeyError: # support for bad zip files (saved by old versions of the GIMP ORA plugin) fp = z.open(filename.encode('utf-8'), mode='r') logger.warning( 'Bad OpenRaster ZIP file. There is an utf-8 ' 'encoded filename that does not have the ' 'utf-8 flag set: %r', filename) res = self._pixbuf_from_stream(fp, feedback_cb) fp.close() logger.debug('%.3fs loading pixbuf %s', time.time() - t1, filename) return res def get_layers_list(root, x=0, y=0): res = [] for item in root: if item.tag == 'layer': if 'x' in item.attrib: item.attrib['x'] = int(item.attrib['x']) + x if 'y' in item.attrib: item.attrib['y'] = int(item.attrib['y']) + y res.append(item) elif item.tag == 'stack': stack_x = int(item.attrib.get('x', 0)) stack_y = int(item.attrib.get('y', 0)) res += get_layers_list(item, stack_x, stack_y) else: logger.warning('ignoring unsupported tag %r', item.tag) return res self.clear() # this leaves one empty layer no_background = True selected_layer = None for layer in get_layers_list(stack): a = layer.attrib if 'background_tile' in a: assert no_background try: logger.debug("background tile: %r", a['background_tile']) self.set_background(get_pixbuf(a['background_tile'])) no_background = False continue except tiledsurface.BackgroundError, e: logger.warning('ORA background tile not usable: %r', e) src = a.get('src', '') if not src.lower().endswith('.png'): logger.warning('Ignoring non-png layer %r', src) continue name = a.get('name', '') x = int(a.get('x', '0')) y = int(a.get('y', '0')) opac = float(a.get('opacity', '1.0')) compositeop = str(a.get('composite-op', DEFAULT_COMPOSITE_OP)) if compositeop not in VALID_COMPOSITE_OPS: compositeop = DEFAULT_COMPOSITE_OP selected = self.__xsd2bool(a.get("selected", 'false')) locked = self.__xsd2bool(a.get("edit-locked", 'false')) visible = not 'hidden' in a.get('visibility', 'visible') self.add_layer(insert_idx=0, name=name) t1 = time.time() # extract the png form the zip into a file first # the overhead for doing so seems to be neglegible (around 5%) z.extract(src, tempdir) tmp_filename = join(tempdir, src) self.load_layer_from_png(tmp_filename, x, y, feedback_cb) os.remove(tmp_filename) layer = self.layers[0] self.set_layer_opacity(helpers.clamp(opac, 0.0, 1.0), layer) self.set_layer_compositeop(compositeop, layer) self.set_layer_visibility(visible, layer) self.set_layer_locked(locked, layer) if selected: selected_layer = layer logger.debug('%.3fs loading and converting layer png', time.time() - t1) # strokemap fname = a.get('mypaint_strokemap_v2', None) if fname: sio = StringIO(z.read(fname)) layer.load_strokemap_from_file(sio, x, y) sio.close()
def load_ora(self, filename, feedback_cb=None): """Loads from an OpenRaster file""" print 'load_ora:' t0 = time.time() z = zipfile.ZipFile(filename) print 'mimetype:', z.read('mimetype').strip() xml = z.read('stack.xml') image = ET.fromstring(xml) stack = image.find('stack') w = int(image.attrib['w']) h = int(image.attrib['h']) def round_up_to_n(value, n): assert value >= 0, "function undefined for negative numbers" residual = value % n if residual: value = value - residual + n return int(value) def get_pixbuf(filename): t1 = time.time() try: fp = z.open(filename, mode='r') except KeyError: # support for bad zip files (saved by old versions of the GIMP ORA plugin) fp = z.open(filename.encode('utf-8'), mode='r') print 'WARNING: bad OpenRaster ZIP file. There is an utf-8 encoded filename that does not have the utf-8 flag set:', repr(filename) res = self._pixbuf_from_stream(fp, feedback_cb) fp.close() print ' %.3fs loading %s' % (time.time() - t1, filename) return res def get_layers_list(root, x=0,y=0): res = [] for item in root: if item.tag == 'layer': if 'x' in item.attrib: item.attrib['x'] = int(item.attrib['x']) + x if 'y' in item.attrib: item.attrib['y'] = int(item.attrib['y']) + y res.append(item) elif item.tag == 'stack': stack_x = int( item.attrib.get('x', 0) ) stack_y = int( item.attrib.get('y', 0) ) res += get_layers_list(item, stack_x, stack_y) else: print 'Warning: ignoring unsupported tag:', item.tag return res self.clear() # this leaves one empty layer no_background = True # FIXME: don't require tile alignment for frame self.set_frame(width=round_up_to_n(w, N), height=round_up_to_n(h, N)) for layer in get_layers_list(stack): a = layer.attrib if 'background_tile' in a: assert no_background try: print a['background_tile'] self.set_background(get_pixbuf(a['background_tile'])) no_background = False continue except backgroundsurface.BackgroundError, e: print 'ORA background tile not usable:', e src = a.get('src', '') if not src.lower().endswith('.png'): print 'Warning: ignoring non-png layer' continue pixbuf = get_pixbuf(src) name = a.get('name', '') x = int(a.get('x', '0')) y = int(a.get('y', '0')) opac = float(a.get('opacity', '1.0')) visible = not 'hidden' in a.get('visibility', 'visible') self.add_layer(insert_idx=0, name=name) last_pixbuf = pixbuf t1 = time.time() self.load_layer_from_pixbuf(pixbuf, x, y) layer = self.layers[0] self.set_layer_opacity(helpers.clamp(opac, 0.0, 1.0), layer) self.set_layer_visibility(visible, layer) print ' %.3fs converting pixbuf to layer format' % (time.time() - t1) # strokemap fname = a.get('mypaint_strokemap_v2', None) if fname: if x % N or y % N: print 'Warning: dropping non-aligned strokemap' else: sio = StringIO(z.read(fname)) layer.load_strokemap_from_file(sio, x, y) sio.close()
def load_ora(self, filename, feedback_cb=None): """Loads from an OpenRaster file""" print 'load_ora:' t0 = time.time() tempdir = tempfile.mkdtemp('mypaint') if not isinstance(tempdir, unicode): tempdir = tempdir.decode(sys.getfilesystemencoding()) z = zipfile.ZipFile(filename) print 'mimetype:', z.read('mimetype').strip() xml = z.read('stack.xml') image = ET.fromstring(xml) stack = image.find('stack') w = int(image.attrib['w']) h = int(image.attrib['h']) def get_pixbuf(filename): t1 = time.time() try: fp = z.open(filename, mode='r') except KeyError: # support for bad zip files (saved by old versions of the GIMP ORA plugin) fp = z.open(filename.encode('utf-8'), mode='r') print 'WARNING: bad OpenRaster ZIP file. There is an utf-8 encoded filename that does not have the utf-8 flag set:', repr(filename) res = self._pixbuf_from_stream(fp, feedback_cb) fp.close() print ' %.3fs loading %s' % (time.time() - t1, filename) return res def get_layers_list(root, x=0,y=0): res = [] for item in root: if item.tag == 'layer': if 'x' in item.attrib: item.attrib['x'] = int(item.attrib['x']) + x if 'y' in item.attrib: item.attrib['y'] = int(item.attrib['y']) + y res.append(item) elif item.tag == 'stack': stack_x = int( item.attrib.get('x', 0) ) stack_y = int( item.attrib.get('y', 0) ) res += get_layers_list(item, stack_x, stack_y) else: print 'Warning: ignoring unsupported tag:', item.tag return res self.clear() # this leaves one empty layer no_background = True self.set_frame(width=w, height=h) selected_layer = None for layer in get_layers_list(stack): a = layer.attrib if 'background_tile' in a: assert no_background try: print a['background_tile'] self.set_background(get_pixbuf(a['background_tile'])) no_background = False continue except tiledsurface.BackgroundError, e: print 'ORA background tile not usable:', e src = a.get('src', '') if not src.lower().endswith('.png'): print 'Warning: ignoring non-png layer' continue name = a.get('name', '') x = int(a.get('x', '0')) y = int(a.get('y', '0')) opac = float(a.get('opacity', '1.0')) compositeop = str(a.get('composite-op', DEFAULT_COMPOSITE_OP)) if compositeop not in VALID_COMPOSITE_OPS: compositeop = DEFAULT_COMPOSITE_OP selected = self.__xsd2bool(a.get("selected", 'false')) locked = self.__xsd2bool(a.get("edit-locked", 'false')) visible = not 'hidden' in a.get('visibility', 'visible') self.add_layer(insert_idx=0, name=name) t1 = time.time() # extract the png form the zip into a file first # the overhead for doing so seems to be neglegible (around 5%) z.extract(src, tempdir) tmp_filename = join(tempdir, src) self.load_layer_from_png(tmp_filename, x, y, feedback_cb) os.remove(tmp_filename) layer = self.layers[0] self.set_layer_opacity(helpers.clamp(opac, 0.0, 1.0), layer) self.set_layer_compositeop(compositeop, layer) self.set_layer_visibility(visible, layer) self.set_layer_locked(locked, layer) if selected: selected_layer = layer print ' %.3fs loading and converting layer png' % (time.time() - t1) # strokemap fname = a.get('mypaint_strokemap_v2', None) if fname: if x % N or y % N: print 'Warning: dropping non-aligned strokemap' else: sio = StringIO(z.read(fname)) layer.load_strokemap_from_file(sio, x, y) sio.close()
def load_ora(self, filename, feedback_cb=None): """Loads from an OpenRaster file""" print 'load_ora:' t0 = time.time() z = zipfile.ZipFile(filename) print 'mimetype:', z.read('mimetype').strip() xml = z.read('stack.xml') image = ET.fromstring(xml) stack = image.find('stack') w = int(image.attrib['w']) h = int(image.attrib['h']) def round_up_to_n(value, n): assert value >= 0, "function undefined for negative numbers" residual = value % n if residual: value = value - residual + n return int(value) def get_pixbuf(filename): t1 = time.time() try: fp = z.open(filename, mode='r') except KeyError: # support for bad zip files (saved by old versions of the GIMP ORA plugin) fp = z.open(filename.encode('utf-8'), mode='r') print 'WARNING: bad OpenRaster ZIP file. There is an utf-8 encoded filename that does not have the utf-8 flag set:', repr(filename) res = self._pixbuf_from_stream(fp, feedback_cb) fp.close() print ' %.3fs loading %s' % (time.time() - t1, filename) return res def get_layers_list(root, x=0,y=0): res = [] for item in root: if item.tag == 'layer': if 'x' in item.attrib: item.attrib['x'] = int(item.attrib['x']) + x if 'y' in item.attrib: item.attrib['y'] = int(item.attrib['y']) + y res.append(item) elif item.tag == 'stack': stack_x = int( item.attrib.get('x', 0) ) stack_y = int( item.attrib.get('y', 0) ) res += get_layers_list(item, stack_x, stack_y) else: print 'Warning: ignoring unsupported tag:', item.tag return res self.clear() # this leaves one empty layer no_background = True # FIXME: don't require tile alignment for frame self.set_frame(width=round_up_to_n(w, N), height=round_up_to_n(h, N)) for layer in get_layers_list(stack): a = layer.attrib if 'background_tile' in a: assert no_background try: print a['background_tile'] self.set_background(get_pixbuf(a['background_tile'])) no_background = False continue except backgroundsurface.BackgroundError, e: print 'ORA background tile not usable:', e src = a.get('src', '') if not src.lower().endswith('.png'): print 'Warning: ignoring non-png layer' continue pixbuf = get_pixbuf(src) name = a.get('name', '') x = int(a.get('x', '0')) y = int(a.get('y', '0')) opac = float(a.get('opacity', '1.0')) compositeop = str(a.get('composite-op', DEFAULT_COMPOSITE_OP)) if compositeop not in VALID_COMPOSITE_OPS: compositeop = DEFAULT_COMPOSITE_OP visible = not 'hidden' in a.get('visibility', 'visible') self.add_layer(insert_idx=0, name=name) last_pixbuf = pixbuf t1 = time.time() self.load_layer_from_pixbuf(pixbuf, x, y) layer = self.layers[0] self.set_layer_opacity(helpers.clamp(opac, 0.0, 1.0), layer) self.set_layer_compositeop(compositeop, layer) self.set_layer_visibility(visible, layer) print ' %.3fs converting pixbuf to layer format' % (time.time() - t1) # strokemap fname = a.get('mypaint_strokemap_v2', None) if fname: if x % N or y % N: print 'Warning: dropping non-aligned strokemap' else: sio = StringIO(z.read(fname)) layer.load_strokemap_from_file(sio, x, y) sio.close()