# 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")

component("compositor") {
  sources = [
    "compositor.cc",
    "compositor.h",
    "compositor_export.h",
    "compositor_observer.h",
    "compositor_vsync_manager.cc",
    "compositor_vsync_manager.h",
    "compositor_switches.cc",
    "compositor_switches.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_delegate.h",
    "layer_owner.cc",
    "layer_owner.h",
    "layer_tree_owner.cc",
    "layer_tree_owner.h",
    "layer_type.h",
    "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",
  ]

  defines = [ "COMPOSITOR_IMPLEMENTATION" ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//cc",
    "//gpu/command_buffer/common",
    "//skia",
    "//ui/gfx",
    "//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 += [
      "//ui/resources",
      "//third_party/angle:libEGL",
      "//third_party/angle:libGLESv2",
    ]
  }
}

source_set("test_support") {
  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/in_process_context_factory.cc",
    "test/in_process_context_factory.h",
    "test/layer_animator_test_controller.cc",
    "test/layer_animator_test_controller.h",
    "test/test_compositor_host.h",
    "test/test_compositor_host_mac.mm",
    "test/test_compositor_host_ozone.cc",
    "test/test_compositor_host_win.cc",
    "test/test_compositor_host_x11.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",
  ]

  deps = [
    ":compositor",
    "//base",
    "//cc",
    "//cc:test_support",
    "//skia",
    "//testing/gtest",
    #"//third_party/WebKit/public:blink_minimal",  TODO(GYP)
    "//ui/base",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl",
    #'<(DEPTH)/webkit/common/gpu/webkit_gpu.gyp:webkit_gpu',  TODO(GYP)
  ]

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

# TODO(GYP) enable this when all dependencies are complete and it links.
#test("compositor_unittests") {
#  sources = [
#    "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",
#  ]
#
#  deps = [
#    ":compositor",
#    ":test_support",
#    "//base",
#    "//base/allocator",
#    "//base/test:test_support",
#    "//cc",
#    "//cc:test_support",
#    "//skia",
#    "//testing/gtest",
#    "//ui/base",
#    "//ui/gfx",
#    "//ui/gfx/geometry",
#    "//ui/gl",
#    "//ui/resources",
#  ]
#
#  if (is_linux) {
#    #deps += [ "//third_party/mesa:osmesa" ]  # TODO(GYP)
#  }
#}
