#!/usr/bin/env python
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import getopt
import os
import re
import sys

import Image


BACKGROUND_COLOR = (255, 255, 255)
DEFAULT_OUTPUT_EXT = '.bmp'


def parse_scale_factor(pattern, original_size):
  # Format: w%xh%, or wxh!
  factor = re.findall(r'^([0-9]+)%x([0-9]+)%$', pattern)
  if factor:
    w, h = factor[0]
    return (int(int(w) / 100.0 * original_size[0]),
            int(int(h) / 100.0 * original_size[1]))

  factor = re.findall(r'^([0-9]+)x([0-9]+)!?$', pattern)
  if factor:
    return map(int, factor[0])

  raise Exception('Unknown scaling parameter: %s', pattern)


def convert_to_bmp(input_file, scale, outdir, background=BACKGROUND_COLOR):
  source = Image.open(input_file)
  output_file = os.path.join(
      outdir,
      os.path.basename(input_file).rpartition('.')[0] + DEFAULT_OUTPUT_EXT)

  # Process alpha channel and transparency.
  if source.mode == 'RGBA':
    target = Image.new('RGB', source.size, background)
    source.load()  # required for source.split()
    mask = source.split()[-1]
    target.paste(source, mask=mask)
  elif (source.mode == 'P') and ('transparency' in source.info):
    exit('Sorry, PNG with RGBA palette is not supported.')
  elif source.mode != 'RGB':
    target = source.convert('RGB')
  else:
    target = source

  # Process scaling
  if scale:
    new_size = parse_scale_factor(scale, source.size)
    target = target.resize(new_size, Image.BICUBIC)

  # Export and downsample color space.
  target.convert('P', dither=None, palette=Image.ADAPTIVE).save(output_file)


def parse_color_param(param):
  """Parses a color parameter in format rrggbb into color tuple."""
  if len(param) != 6:
    exit("Sorry, color param '%s' is not supported." % param)
  return (int(param[0:2], 16),
          int(param[2:4], 16),
          int(param[4:6], 16))

def main(argv):
  scale_param = ''
  outdir = ''
  background = BACKGROUND_COLOR
  try:
    opts, args = getopt.getopt(argv[1:], '',
                               ('scale=', 'outdir=', 'background='))
    for key, value in opts:
      if key == '--scale':
        scale_param = value
      elif key == '--outdir':
        outdir = value
      elif key == '--background':
        background = parse_color_param(value)
    if len(args) < 1:
      raise Exception('need more param')
  except:
    exit('Usage: ' + argv[0] + '[--scale WxH! | --scale W%xH%] [--outdir DIR] '
         '[--background rrggbb] files(s)...')

  if outdir and not os.path.isdir(outdir):
    os.makedirs(outdir)

  for source_file in args:
    convert_to_bmp(source_file, scale_param, outdir, background)


if __name__ == '__main__':
  main(sys.argv)
