# 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/jumbo.gni")
import("//build/config/ui.gni")
import("//testing/test.gni")

# Reset sources_assignment_filter for the BUILD.gn file to prevent
# regression during the migration of Chromium away from the feature.
# See build/no_sources_assignment_filter.md for more information.
# TODO(crbug.com/1018739): remove this when migration is done.
set_sources_assignment_filter([])

jumbo_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",
    "compositor.cc",
    "compositor.h",
    "compositor_animation_observer.h",
    "compositor_export.h",
    "compositor_lock.cc",
    "compositor_lock.h",
    "compositor_observer.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_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.cc",
    "layer_type.h",
    "overscroll/scroll_input_handler.cc",
    "overscroll/scroll_input_handler.h",
    "paint_cache.cc",
    "paint_cache.h",
    "paint_context.cc",
    "paint_context.h",
    "paint_recorder.cc",
    "paint_recorder.h",
    "property_change_reason.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",
  ]

  if (is_mac) {
    sources += [
      "recyclable_compositor_mac.cc",
      "recyclable_compositor_mac.h",
    ]
  }

  defines = [ "COMPOSITOR_IMPLEMENTATION" ]

  public_deps = [
    "//cc",
  ]
  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//cc/animation",
    "//cc/paint",
    "//components/viz/host",
    "//components/viz/service",
    "//gpu/command_buffer/common",
    "//skia",
    "//ui/base",
    "//ui/display",
    "//ui/events",
    "//ui/gfx",
    "//ui/gfx/animation",
    "//ui/gfx/geometry",
    "//ui/gl",
  ]

  if (is_mac) {
    deps += [ "//ui/accelerated_widget_mac" ]
  }

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

jumbo_static_library("test_support") {
  testonly = true
  sources = [
    "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_context_factories.cc",
    "test/test_context_factories.h",
    "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",
  ]

  if (is_android) {
    sources += [ "test/test_compositor_host_android.cc" ]
  }

  if (is_mac) {
    sources += [ "test/test_compositor_host_mac.mm" ]
  }

  if (is_win) {
    sources += [ "test/test_compositor_host_win.cc" ]
  }

  public_deps = [
    ":compositor",
  ]
  deps = [
    "//base/test:test_support",
    "//cc",
    "//cc:test_support",
    "//components/viz/host",
    "//components/viz/service",
    "//components/viz/test:test_support",
    "//gpu/command_buffer/client:gles2_implementation",
    "//gpu/command_buffer/client:raster",
    "//gpu/command_buffer/common",
    "//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/events/x",
      "//ui/gfx/x",
    ]
  }

  if (is_mac) {
    deps += [
      "//gpu/ipc/service:service",
      "//ui/accelerated_widget_mac",
    ]
  }

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

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

test("compositor_unittests") {
  sources = [
    "callback_layer_animation_observer_unittest.cc",
    "canvas_painter_unittest.cc",
    "compositor_lock_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",
    "//components/viz/common",
    "//components/viz/service",
    "//components/viz/test:test_support",
    "//mojo/core/embedder",
    "//skia",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/base",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl",
    "//ui/resources",
  ]

  if (is_linux) {
    deps += [ "//third_party/mesa_headers" ]
  }
}
