# 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")
import("//testing/libfuzzer/fuzzer_test.gni")

if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
}

# Several targets want to include this header file, and some of them are
# child dependencies of "gfx". Therefore, we separate it out here so multiple
# targets can all have a dependency for header checking purposes without
# creating circular dependencies.
source_set("gfx_export") {
  sources = [
    "gfx_export.h",
  ]
}

component("gfx") {
  sources = [
    "android/device_display_info.cc",
    "android/device_display_info.h",
    "android/gfx_jni_registrar.cc",
    "android/gfx_jni_registrar.h",
    "android/java_bitmap.cc",
    "android/java_bitmap.h",
    "android/shared_device_display_info.cc",
    "android/shared_device_display_info.h",
    "android/view_configuration.cc",
    "android/view_configuration.h",
    "animation/animation.cc",
    "animation/animation.h",
    "animation/animation_container.cc",
    "animation/animation_container.h",
    "animation/animation_container_element.h",
    "animation/animation_container_observer.h",
    "animation/animation_delegate.h",
    "animation/animation_mac.mm",
    "animation/animation_win.cc",
    "animation/linear_animation.cc",
    "animation/linear_animation.h",
    "animation/multi_animation.cc",
    "animation/multi_animation.h",
    "animation/slide_animation.cc",
    "animation/slide_animation.h",
    "animation/throb_animation.cc",
    "animation/throb_animation.h",
    "animation/tween.cc",
    "animation/tween.h",
    "break_list.h",
    "codec/jpeg_codec.cc",
    "codec/jpeg_codec.h",
    "codec/png_codec.cc",
    "codec/png_codec.h",
    "color_analysis.cc",
    "color_analysis.h",
    "color_palette.h",
    "color_space.cc",
    "color_space.h",
    "color_transform.cc",
    "color_transform.h",
    "color_utils.cc",
    "color_utils.h",
    "decorated_text.cc",
    "decorated_text.h",
    "favicon_size.cc",
    "favicon_size.h",
    "font.cc",
    "font.h",
    "font_fallback.h",
    "font_fallback_linux.cc",
    "font_fallback_linux.h",
    "font_fallback_mac.mm",
    "font_fallback_win.cc",
    "font_fallback_win.h",
    "font_list.cc",
    "font_list.h",
    "font_list_impl.cc",
    "font_list_impl.h",
    "font_render_params.cc",
    "font_render_params.h",
    "font_render_params_android.cc",
    "font_render_params_linux.cc",
    "font_render_params_mac.cc",
    "font_render_params_win.cc",
    "gdi_util.cc",
    "gdi_util.h",
    "gfx_paths.cc",
    "gfx_paths.h",
    "icc_profile.cc",
    "icc_profile.h",
    "icc_profile_mac.mm",
    "icc_profile_win.cc",
    "icc_profile_x11.cc",
    "icon_util.cc",
    "icon_util.h",
    "image/image.cc",
    "image/image.h",
    "image/image_family.cc",
    "image/image_family.h",
    "image/image_ios.mm",
    "image/image_mac.mm",
    "image/image_png_rep.cc",
    "image/image_png_rep.h",
    "image/image_skia.cc",
    "image/image_skia.h",
    "image/image_skia_rep.cc",
    "image/image_skia_rep.h",
    "image/image_skia_source.cc",
    "image/image_skia_source.h",
    "image/image_skia_util_ios.h",
    "image/image_skia_util_ios.mm",
    "image/image_skia_util_mac.h",
    "image/image_skia_util_mac.mm",
    "image/image_util.cc",
    "image/image_util.h",
    "image/image_util_ios.mm",
    "interpolated_transform.cc",
    "interpolated_transform.h",
    "ios/NSString+CrStringDrawing.h",
    "ios/NSString+CrStringDrawing.mm",
    "ios/uikit_util.h",
    "ios/uikit_util.mm",
    "linux_font_delegate.cc",
    "linux_font_delegate.h",
    "mac/coordinate_conversion.h",
    "mac/coordinate_conversion.mm",
    "mac/nswindow_frame_controls.h",
    "mac/nswindow_frame_controls.mm",
    "mac/scoped_cocoa_disable_screen_updates.h",
    "nine_image_painter.cc",
    "nine_image_painter.h",
    "path.cc",
    "path.h",
    "path_mac.h",
    "path_mac.mm",
    "path_win.cc",
    "path_win.h",
    "path_x11.cc",
    "path_x11.h",
    "platform_font.h",
    "platform_font_android.cc",
    "platform_font_ios.h",
    "platform_font_ios.mm",
    "platform_font_linux.cc",
    "platform_font_linux.h",
    "platform_font_mac.h",
    "platform_font_mac.mm",
    "platform_font_win.cc",
    "platform_font_win.h",
    "scoped_cg_context_save_gstate_mac.h",
    "scoped_ns_graphics_context_save_gstate_mac.h",
    "scoped_ns_graphics_context_save_gstate_mac.mm",
    "scoped_ui_graphics_push_context_ios.h",
    "scoped_ui_graphics_push_context_ios.mm",
    "scrollbar_size.cc",
    "scrollbar_size.h",
    "selection_model.cc",
    "selection_model.h",
    "sequential_id_generator.cc",
    "sequential_id_generator.h",
    "shadow_value.cc",
    "shadow_value.h",
    "skbitmap_operations.cc",
    "skbitmap_operations.h",
    "skia_util.cc",
    "skia_util.h",
    "switches.cc",
    "switches.h",
    "sys_color_change_listener.cc",
    "sys_color_change_listener.h",
    "text_constants.h",
    "text_elider.cc",
    "text_elider.h",
    "text_utils.cc",
    "text_utils.h",
    "text_utils_android.cc",
    "text_utils_ios.mm",
    "transform.cc",
    "transform.h",
    "transform_util.cc",
    "transform_util.h",
    "ui_gfx_exports.cc",
    "utf16_indexing.cc",
    "utf16_indexing.h",
    "vsync_provider.cc",
    "vsync_provider.h",
    "win/direct_manipulation.cc",
    "win/direct_manipulation.h",
    "win/direct_write.cc",
    "win/direct_write.h",
    "win/hwnd_util.cc",
    "win/hwnd_util.h",
    "win/physical_size.cc",
    "win/physical_size.h",
    "win/rendering_window_manager.cc",
    "win/rendering_window_manager.h",
    "win/scoped_set_map_mode.h",
    "win/singleton_hwnd.cc",
    "win/singleton_hwnd.h",
    "win/singleton_hwnd_observer.cc",
    "win/singleton_hwnd_observer.h",
    "win/text_analysis_source.cc",
    "win/text_analysis_source.h",
    "win/window_impl.cc",
    "win/window_impl.h",
  ]
  if (!is_ios) {
    sources += [
      "blit.cc",
      "blit.h",
      "canvas.cc",
      "canvas.h",
      "canvas_notimplemented.cc",
      "canvas_paint_mac.h",
      "canvas_paint_mac.mm",
      "canvas_skia.cc",
      "canvas_skia_paint.h",
      "image/canvas_image_source.cc",
      "image/canvas_image_source.h",
      "image/image_skia_operations.cc",
      "image/image_skia_operations.h",
      "paint_throbber.cc",
      "paint_throbber.h",
      "scoped_canvas.cc",
      "scoped_canvas.h",
    ]
  }

  configs += [
    "//build/config:precompiled_headers",

    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
    "//build/config/compiler:no_size_t_to_int_warning",
  ]

  # This is part of the gfx component in the component build.
  defines = [ "GFX_IMPLEMENTATION" ]

  public_deps = [
    ":memory_buffer_sources",
    ":native_widget_types",
    ":selection_bound_sources",
    "//base",
    "//skia",
    "//third_party/icu",
    "//ui/gfx/geometry",
    "//ui/gfx/range",
  ]
  deps = [
    ":gfx_export",
    "//base",
    "//base:base_static",
    "//base:i18n",
    "//base/third_party/dynamic_annotations",
    "//skia",
    "//third_party/harfbuzz-ng",
    "//third_party/libpng",
    "//third_party/qcms",
    "//third_party/zlib",
  ]

  # Text rendering conditions (complicated so separated out).
  if (use_aura || is_mac) {
    # Mac doesn't use RenderTextHarfBuzz by default yet.
    sources += [
      "harfbuzz_font_skia.cc",
      "harfbuzz_font_skia.h",
      "render_text_harfbuzz.cc",
      "render_text_harfbuzz.h",
      "render_text_mac.h",
      "render_text_mac.mm",
      "text_utils_skia.cc",
    ]

    if (!is_ios) {
      sources += [
        "render_text.cc",
        "render_text.h",
      ]
    }
  } else {
    # We don't support RenderText on these platforms.
  }

  if (is_android && use_aura) {
    sources -= [
      "platform_font_android.cc",
      "text_utils_android.cc",
    ]
    set_sources_assignment_filter([])
    sources += [ "platform_font_linux.cc" ]
    set_sources_assignment_filter(sources_assignment_filter)
  }

  # iOS.
  if (is_ios) {
    sources -= [
      "codec/jpeg_codec.cc",
      "codec/jpeg_codec.h",
    ]
    set_sources_assignment_filter([])
    sources += [ "scoped_cg_context_save_gstate_mac.h" ]
    set_sources_assignment_filter(sources_assignment_filter)
  } else {
    deps += [ "//third_party:jpeg" ]
  }

  # Android.
  if (is_android) {
    if (use_aura) {
      sources -= [ "canvas_notimplemented.cc" ]
      sources += [ "font_fallback_android.cc" ]
    } else {
      sources -= [
        "animation/throb_animation.cc",
        "canvas_skia.cc",
        "path.cc",
        "selection_model.cc",
      ]
    }

    if (!is_debug) {
      configs -= [ "//build/config/compiler:default_optimization" ]
      configs += [ "//build/config/compiler:optimize_max" ]
    }

    deps += [ ":gfx_jni_headers" ]
    libs = [
      "android",
      "jnigraphics",
    ]
  } else if (!is_ios) {
    sources -= [ "canvas_notimplemented.cc" ]
  }

  # Desktop only.
  if (use_aura || (!is_ios && !is_android)) {
    sources += [
      "paint_vector_icon.cc",
      "paint_vector_icon.h",
      "vector_icon_types.h",
      "vector_icons_public.h",
    ]
    deps += [ "//ui/gfx/vector_icons" ]
  }

  # Windows.
  if (is_win) {
    cflags = [ "/wd4324" ]  # Structure was padded due to __declspec(align()), which is
                            # uninteresting.

    libs = [
      "setupapi.lib",
      "dwrite.lib",
    ]
  } else {
    sources -= [
      "gdi_util.cc",
      "gdi_util.h",
      "icon_util.cc",
      "icon_util.h",
      "sys_color_change_listener.cc",
      "sys_color_change_listener.h",
    ]
  }

  # Linux.
  if (is_linux) {
    deps += [ "//build/linux:fontconfig" ]
  }

  # Chrome OS
  if (is_chromeos) {
    # Robust JPEG decoding for the login screen.
    sources += [
      "chromeos/codec/jpeg_codec_robust_slow.cc",
      "chromeos/codec/jpeg_codec_robust_slow.h",
    ]
    deps += [ "//third_party/libjpeg" ]
  }

  if (is_mac) {
    libs = [
      "AppKit.framework",
      "CoreFoundation.framework",
      "CoreGraphics.framework",
      "CoreText.framework",
      "IOSurface.framework",
    ]
  }

  if (!use_aura) {
    if (!toolkit_views) {
      sources -= [
        "nine_image_painter.cc",
        "nine_image_painter.h",
      ]
    }
  }

  if (use_x11) {
    deps += [ "//ui/gfx/x" ]
    configs += [ "//build/config/linux:x11" ]
  } else {
    sources -= [
      "icc_profile_x11.cc",
      "path_x11.cc",
    ]
  }

  if (use_cairo) {
    configs += [ "//build/config/linux/pangocairo" ]
  }
}

# Depend on this to use native_widget_types.h without pulling in all of gfx.
source_set("native_widget_types") {
  public = [
    "native_widget_types.h",
  ]

  public_deps = [
    "//base",
  ]
}

group("selection_bound") {
  if (is_component_build) {
    public_deps = [
      ":gfx",
    ]
  } else {
    public_deps = [
      ":selection_bound_sources",
    ]
  }
}

# Depend on this to use selection_bound.h without pulling in all of gfx.
# Cannot be a static_library in component builds due to exported functions
source_set("selection_bound_sources") {
  visibility = [ ":*" ]

  sources = [
    "gfx_export.h",
    "selection_bound.cc",
    "selection_bound.h",
  ]

  defines = [ "GFX_IMPLEMENTATION" ]

  public_deps = [
    "//base",
    "//ui/gfx/geometry",
  ]
}

# The GPU memory buffer stuff is separate from "gfx" to allow GPU-related
# things to use these files without pulling in all of gfx, which includes large
# things like Skia.
#
# The structure here allows the memory buffer to be part of the gfx component
# in the component build, but be a separate source set in a static build.
group("memory_buffer") {
  if (is_component_build) {
    public_deps = [
      ":gfx",
    ]
  } else {
    public_deps = [
      ":memory_buffer_sources",
    ]
  }
}

# Cannot be a static_library in component builds due to exported functions
source_set("memory_buffer_sources") {
  visibility = [ ":*" ]  # Depend on through ":memory_buffer".

  # TODO(brettw) refactor this so these sources are in a coherent directory
  # structure rather than random samplings of ui/gfx and ui/gfx/mac.
  sources = [
    "buffer_format_util.cc",
    "buffer_format_util.h",
    "buffer_types.h",
    "generic_shared_memory_id.cc",
    "generic_shared_memory_id.h",
    "gfx_export.h",
    "mac/io_surface.cc",
    "mac/io_surface.h",
    "native_pixmap_handle.cc",
    "native_pixmap_handle.h",
  ]

  if (!is_ios) {
    sources += [
      "gpu_memory_buffer.cc",
      "gpu_memory_buffer.h",
      "gpu_memory_buffer_tracing.cc",
      "gpu_memory_buffer_tracing.h",
    ]
  }

  defines = [ "GFX_IMPLEMENTATION" ]

  deps = [
    "//base",
    "//ui/gfx/geometry",
  ]
}

static_library("test_support") {
  testonly = true
  sources = [
    "image/image_unittest_util.cc",
    "image/image_unittest_util.h",
    "image/image_unittest_util_ios.mm",
    "image/image_unittest_util_mac.mm",
    "test/fontconfig_util_linux.cc",
    "test/fontconfig_util_linux.h",
    "test/gfx_util.cc",
    "test/gfx_util.h",
    "test/ui_cocoa_test_helper.h",
    "test/ui_cocoa_test_helper.mm",
  ]

  public_deps = [
    ":gfx",
  ]

  deps = [
    "//base",
    "//base/test:test_support",
    "//skia",
    "//testing/gtest",
    "//ui/gfx/geometry",
  ]

  if (is_ios) {
    # The cocoa files don't apply to iOS.
    sources -= [
      "test/ui_cocoa_test_helper.h",
      "test/ui_cocoa_test_helper.mm",
    ]
  }
  if (is_linux) {
    deps += [ "//build/linux:fontconfig" ]
  }
}

test("gfx_unittests") {
  sources = [
    "font_names_testing.cc",
    "font_names_testing.h",
    "font_render_params_linux_unittest.cc",
    "font_unittest.cc",
    "image/image_family_unittest.cc",
    "image/image_ios_unittest.mm",
    "image/image_skia_unittest.cc",
    "image/image_unittest.cc",
    "ios/NSString+CrStringDrawing_unittest.mm",
    "ios/uikit_util_unittest.mm",
    "platform_font_linux_unittest.cc",
    "test/run_all_unittests.cc",
    "text_elider_unittest.cc",
    "text_utils_unittest.cc",
  ]

  data = [
    "test/data/",
    "$root_out_dir/ui_test.pak",
  ]

  if (!is_ios) {
    sources += [
      "animation/animation_container_unittest.cc",
      "animation/animation_unittest.cc",
      "animation/multi_animation_unittest.cc",
      "animation/slide_animation_unittest.cc",
      "animation/tween_unittest.cc",
      "blit_unittest.cc",
      "break_list_unittest.cc",
      "canvas_unittest.cc",
      "canvas_unittest_mac.mm",
      "codec/jpeg_codec_unittest.cc",
      "codec/png_codec_unittest.cc",
      "color_analysis_unittest.cc",
      "color_transform_unittest.cc",
      "color_utils_unittest.cc",
      "font_fallback_mac_unittest.cc",
      "font_list_unittest.cc",
      "geometry/box_unittest.cc",
      "geometry/cubic_bezier_unittest.cc",
      "geometry/insets_unittest.cc",
      "geometry/matrix3_unittest.cc",
      "geometry/point3_unittest.cc",
      "geometry/point_unittest.cc",
      "geometry/quad_unittest.cc",
      "geometry/rect_unittest.cc",
      "geometry/safe_integer_conversions_unittest.cc",
      "geometry/scroll_offset_unittest.cc",
      "geometry/size_unittest.cc",
      "geometry/vector2d_unittest.cc",
      "geometry/vector3d_unittest.cc",
      "image/image_mac_unittest.mm",
      "image/image_util_unittest.cc",
      "mac/coordinate_conversion_unittest.mm",
      "mojo/struct_traits_unittest.cc",
      "nine_image_painter_unittest.cc",
      "path_mac_unittest.mm",
      "platform_font_mac_unittest.mm",
      "range/range_mac_unittest.mm",
      "range/range_unittest.cc",
      "range/range_win_unittest.cc",
      "selection_bound_unittest.cc",
      "sequential_id_generator_unittest.cc",
      "shadow_value_unittest.cc",
      "skbitmap_operations_unittest.cc",
      "skrect_conversion_unittest.cc",
      "transform_util_unittest.cc",
      "utf16_indexing_unittest.cc",
    ]
  }

  if (!is_android && !is_ios) {
    sources += [ "render_text_unittest.cc" ]
  }

  # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  deps = [
    ":gfx",
    ":test_support",
    "//base",
    "//base/test:test_support",
    "//skia",
    "//testing/gtest",
    "//third_party/icu:icuuc",
    "//third_party/libpng",
    "//third_party/zlib",
    "//ui/base",
    "//ui/gfx/geometry",
    "//ui/gfx/range",
    "//ui/resources:ui_test_pak",
  ]

  data_deps = [
    "//ui/resources:ui_test_pak",
  ]

  if (!is_mac && !is_ios) {
    sources += [
      "interpolated_transform_unittest.cc",
      "transform_unittest.cc",
    ]
  }

  if (is_android) {
    deps += [ "//ui/android:ui_java" ]
  }

  if (!use_aura && !is_ios) {
    sources -= [ "nine_image_painter_unittest.cc" ]
  }

  if (is_chromeos) {
    sources += [ "chromeos/codec/jpeg_codec_robust_slow_unittest.cc" ]
  }

  if (is_win) {
    sources += [
      "font_fallback_win_unittest.cc",
      "icon_util_unittest.cc",
      "icon_util_unittests.rc",
      "path_win_unittest.cc",
      "platform_font_win_unittest.cc",
      "win/text_analysis_source_unittest.cc",
    ]

    ldflags = [
      "/DELAYLOAD:d2d1.dll",
      "/DELAYLOAD:d3d10_1.dll",
    ]

    libs = [
      "d2d1.lib",
      "d3d10_1.lib",
      "dwrite.lib",
      "imm32.lib",
      "oleacc.lib",
    ]
  }

  if (!is_ios) {
    deps += [
      "//mojo/edk/system",
      "//mojo/public/cpp/bindings",
      "//ui/gfx/geometry/mojo:unit_test",
      "//ui/gfx/mojo:test_interfaces",
    ]
  }
}

if (is_android) {
  generate_jni("gfx_jni_headers") {
    sources = [
      "../android/java/src/org/chromium/ui/gfx/BitmapHelper.java",
      "../android/java/src/org/chromium/ui/gfx/DeviceDisplayInfo.java",
      "../android/java/src/org/chromium/ui/gfx/ViewConfigurationHelper.java",
    ]
    jni_package = "gfx"
  }
}

fuzzer_test("color_transform_fuzztest") {
  sources = [
    "color_transform_fuzzer.cc",
  ]
  deps = [
    ":gfx",
  ]
  libfuzzer_options = [ "max_len=1024" ]
}
