| #!/usr/bin/env python | |
| # Copyright 2016 Google Inc. | |
| # | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| # Experimental Skia Multi-Picture Doc parser. | |
| from __future__ import print_function | |
| import fileinput | |
| import sys | |
| import struct | |
| if len(sys.argv) < 2: | |
| sys.stderr.write('Usage:\n\tpython %s MSKP_FILE [OUTPUT_SKP]\n\n' | |
| % sys.argv[0]) | |
| exit(1) | |
| mskp_src = sys.argv[1] | |
| src = open(mskp_src, 'rb') | |
| magic_constant = b'Skia Multi-Picture Doc\n\n' | |
| magic = src.read(len(magic_constant)) | |
| if magic != magic_constant: | |
| sys.stderr.write('Not a mskp file: "%s"\n' % mskp_src) | |
| exit(2) | |
| version, page_count = struct.unpack('II', src.read(8))[:2] | |
| print('MSKP version: ', version) | |
| print('page count: ', page_count) | |
| if version > 2 or version < 1: | |
| #TODO(halcanary): Remove support for version 1. | |
| sys.stderr.write('unsupported mskp version\n') | |
| exit(3) | |
| offsets = [] | |
| for page in range(page_count): | |
| print('page %3d\t' % page, end='') | |
| if version == 1: | |
| offset, size_x, size_y =struct.unpack('Qff', src.read(16)) | |
| print('offset = %-7d\t' % offset, end='') | |
| offsets.append(offset) | |
| elif version == 2: | |
| size_x, size_y =struct.unpack('ff', src.read(8)) | |
| print('size = (%r,%r)' % (size_x, size_y)) | |
| if len(sys.argv) >= 3: | |
| with open(sys.argv[2], 'wb') as o: | |
| if version == 2 or len(offsets) < 2: | |
| while True: | |
| file_buffer = src.read(8192) | |
| if 0 == len(file_buffer): | |
| break | |
| o.write(file_buffer) | |
| else: | |
| o.write(src.read(offsets[1] - offsets[0])) |