# Copyright 2014 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.

import("//build/config/ui.gni")
import("//testing/test.gni")

component("compositor") {
  sources = [
    "callback_layer_animation_observer.cc",
    "callback_layer_animation_observer.h",
    "canvas_painter.cc",
    "canvas_painter.h",
    "clip_recorder.cc",
    "clip_recorder.h",
    "closure_animation_observer.cc",
    "closure_animation_observer.h",
    "compositing_recorder.cc",
    "compositing_recorder.h",
    "compositor.cc",
    "compositor.h",
    "compositor_animation_observer.h",
    "compositor_export.h",
    "compositor_observer.h",
    "compositor_switches.cc",
    "compositor_switches.h",
    "compositor_vsync_manager.cc",
    "compositor_vsync_manager.h",
    "debug_utils.cc",
    "debug_utils.h",
    "dip_util.cc",
    "dip_util.h",
    "float_animation_curve_adapter.cc",
    "float_animation_curve_adapter.h",
    "layer.cc",
    "layer.h",
    "layer_animation_delegate.h",
    "layer_animation_element.cc",
    "layer_animation_element.h",
    "layer_animation_observer.cc",
    "layer_animation_observer.h",
    "layer_animation_sequence.cc",
    "layer_animation_sequence.h",
    "layer_animator.cc",
    "layer_animator.h",
    "layer_animator_collection.cc",
    "layer_animator_collection.h",
    "layer_delegate.cc",
    "layer_delegate.h",
    "layer_observer.h",
    "layer_owner.cc",
    "layer_owner.h",
    "layer_threaded_animation_delegate.h",
    "layer_tree_owner.cc",
    "layer_tree_owner.h",
    "layer_type.h",
    "paint_cache.cc",
    "paint_cache.h",
    "paint_context.cc",
    "paint_context.h",
    "paint_recorder.cc",
    "paint_recorder.h",
    "reflector.cc",
    "reflector.h",
    "scoped_animation_duration_scale_mode.cc",
    "scoped_animation_duration_scale_mode.h",
    "scoped_layer_animation_settings.cc",
    "scoped_layer_animation_settings.h",
    "transform_animation_curve_adapter.cc",
    "transform_animation_curve_adapter.h",
    "transform_recorder.cc",
    "transform_recorder.h",
  ]

  defines = [ "COMPOSITOR_IMPLEMENTATION" ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//cc",
    "//cc/animation",
    "//cc/paint",
    "//cc/surfaces",
    "//cc/surfaces:surface_id",
    "//cc/surfaces:surfaces",
    "//gpu/command_buffer/common",
    "//skia",
    "//ui/display",
    "//ui/gfx",
    "//ui/gfx/animation",
    "//ui/gfx/geometry",
    "//ui/gl",
  ]

  if (is_win && use_aura) {
    # TODO(sky): before we make this real need to remove
    # IDR_BITMAP_BRUSH_IMAGE.
    deps += [
      "//third_party/angle:libEGL",
      "//third_party/angle:libGLESv2",
      "//ui/resources",
    ]
  }
}

static_library("test_support") {
  testonly = true
  sources = [
    "test/context_factories_for_test.cc",
    "test/context_factories_for_test.h",
    "test/draw_waiter_for_test.cc",
    "test/draw_waiter_for_test.h",
    "test/fake_context_factory.cc",
    "test/fake_context_factory.h",
    "test/in_process_context_factory.cc",
    "test/in_process_context_factory.h",
    "test/in_process_context_provider.cc",
    "test/in_process_context_provider.h",
    "test/layer_animation_observer_test_api.cc",
    "test/layer_animation_observer_test_api.h",
    "test/layer_animator_test_controller.cc",
    "test/layer_animator_test_controller.h",
    "test/multi_layer_animator_test_controller.cc",
    "test/multi_layer_animator_test_controller.h",
    "test/multi_layer_animator_test_controller_delegate.h",
    "test/test_compositor_host.h",
    "test/test_compositor_host_android.cc",
    "test/test_compositor_host_mac.mm",
    "test/test_compositor_host_win.cc",
    "test/test_layer_animation_delegate.cc",
    "test/test_layer_animation_delegate.h",
    "test/test_layer_animation_observer.cc",
    "test/test_layer_animation_observer.h",
    "test/test_layers.cc",
    "test/test_layers.h",
    "test/test_suite.cc",
    "test/test_suite.h",
    "test/test_utils.cc",
    "test/test_utils.h",
  ]

  public_deps = [
    ":compositor",
  ]
  deps = [
    "//base/test:test_support",
    "//cc",
    "//cc:test_support",
    "//cc/surfaces",
    "//gpu/command_buffer/client:gles2_c_lib",
    "//gpu/command_buffer/client:gles2_implementation",
    "//gpu/command_buffer/common:gles2_utils",
    "//gpu/ipc:gl_in_process_context",
    "//gpu/skia_bindings",
    "//skia",
    "//testing/gtest",
    "//ui/base",
    "//ui/display",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl:test_support",
  ]

  if (use_x11) {
    configs += [ "//build/config/linux:x11" ]
    deps += [ "//ui/gfx/x" ]
  }

  if (use_ozone) {
    sources += [ "test/test_compositor_host_ozone.cc" ]

    deps += [ "//ui/ozone" ]
  } else if (use_x11) {
    sources += [ "test/test_compositor_host_x11.cc" ]
  }
}

test("compositor_unittests") {
  sources = [
    "callback_layer_animation_observer_unittest.cc",
    "compositor_unittest.cc",
    "layer_animation_element_unittest.cc",
    "layer_animation_sequence_unittest.cc",
    "layer_animator_unittest.cc",
    "layer_owner_unittest.cc",
    "layer_unittest.cc",
    "run_all_unittests.cc",
    "transform_animation_curve_adapter_unittest.cc",
  ]

  data = [
    "//ui/gfx/test/data/compositor/",
  ]

  deps = [
    ":compositor",
    ":test_support",
    "//base",
    "//base/test:test_support",
    "//cc",
    "//cc:test_support",
    "//cc/surfaces",
    "//cc/surfaces:surface_id",
    "//skia",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/base",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl",
    "//ui/resources",
  ]
  if (is_linux) {
    deps += [ "//third_party/mesa:osmesa" ]
  }
}
