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


""" Helper functions to be used in bench_pictures.cfg. """


def Config(**kwargs):
  config = {}
  for key in kwargs:
    config[key] = kwargs[key]
  return config


def TileArgs(tile_x, tile_y):
  return {'mode': ['tile', str(tile_x), str(tile_y)],
          # TODO(borenet): Turn this back on once the parser is working.
          #'timeIndividualTiles': True
          }


def BitmapConfig(**kwargs):
  return Config(device='bitmap', **kwargs)


def GPUConfig(**kwargs):
  return Config(device='gpu', **kwargs)


def TiledBitmapConfig(tile_x, tile_y, **kwargs):
  return BitmapConfig(**dict(TileArgs(tile_x, tile_y).items() + kwargs.items()))


def TiledGPUConfig(tile_x, tile_y, **kwargs):
  return GPUConfig(**dict(TileArgs(tile_x, tile_y).items() + kwargs.items()))


def ViewportBitmapConfig(viewport_x, viewport_y, **kwargs):
  return BitmapConfig(viewport=[str(viewport_x), str(viewport_y)], **kwargs)


def ViewportGPUConfig(viewport_x, viewport_y, **kwargs):
  return GPUConfig(viewport=[str(viewport_x), str(viewport_y)], **kwargs)


def ViewportRTreeConfig(viewport_x, viewport_y, **kwargs):
  return RTreeConfig(mode='simple', viewport=[str(viewport_x), str(viewport_y)],
                     **kwargs)


def ViewportGridConfig(viewport_x, viewport_y, **kwargs):
  return GridConfig(viewport_x, viewport_y, mode='simple',
                    viewport=[str(viewport_x), str(viewport_y)], **kwargs)


def CopyTilesConfig(tile_x, tile_y, **kwargs):
  return BitmapConfig(mode=['copyTile', str(tile_x), str(tile_y)], **kwargs)


def RecordConfig(**kwargs):
  return BitmapConfig(mode='record', **kwargs)


def PlaybackCreationConfig(**kwargs):
  return BitmapConfig(mode='playbackCreation', **kwargs)


def MultiThreadTileConfig(threads, tile_x, tile_y, **kwargs):
  return TiledBitmapConfig(multi=str(threads), tile_x=tile_x, tile_y=tile_y,
                           **kwargs)


def RTreeConfig(**kwargs):
  return BitmapConfig(bbh='rtree', **kwargs)


def GridConfig(tile_x, tile_y, mode, **kwargs):
  return BitmapConfig(mode=mode, bbh=['grid', str(tile_x), str(tile_y)],
                      **kwargs)


def RecordRTreeConfig(**kwargs):
  return RTreeConfig(mode='record', **kwargs)


def PlaybackCreationRTreeConfig(**kwargs):
  return RTreeConfig(mode='playbackCreation', **kwargs)


def TileRTreeConfig(tile_x, tile_y, **kwargs):
  return RTreeConfig(**dict(TileArgs(tile_x, tile_y).items() + kwargs.items()))


def RecordGridConfig(tile_x, tile_y, **kwargs):
  return GridConfig(tile_x=tile_x, tile_y=tile_y, mode='record', **kwargs)


def PlaybackCreationGridConfig(tile_x, tile_y, **kwargs):
  return GridConfig(tile_x, tile_y, mode='playbackCreation')


def TileGridConfig(tile_x, tile_y, **kwargs):
  return GridConfig(tile_x, tile_y,
                    **dict(TileArgs(tile_x, tile_y).items() + kwargs.items()))