#!/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]))
