# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//cobalt/renderer/rasterizer/skia/skia/skia_next.gni")
import("//cobalt/renderer/rasterizer/skia/skia/skia_sources.gni")
import("//cobalt/renderer/rasterizer/skia/skia/skia_template.gni")

# skia_opts_none and skia_opts targets contain the platform-specific optimizations for Skia
config("skia_opts_none") {
  include_dirs = [
    "//third_party/$skia_subdir/include/core",
    "//third_party/$skia_subdir/include/effects",
    "//third_party/$skia_subdir/src/core",
    "//third_party/$skia_subdir/src/utils",
  ]
}

config("skia_opts") {
  include_dirs = [
    "//third_party/$skia_subdir/include/core",
    "//third_party/$skia_subdir/include/effects",
    "//third_party/$skia_subdir/src/core",
    "//third_party/$skia_subdir/src/opts",
    "//third_party/$skia_subdir/src/utils",
  ]
}

# Skia's core code from the Skia repository that should be compiled
# without ASAN. This is done to avoid drastic slowdown in debug unit
# tests.
skia_common("skia_library_no_asan") {
  check_includes = false
  sources = skia_effects_imagefilter_sources_no_asan
  if (use_skia_next) {
    include_dirs = [ skia_include_dir ]
    defines = [ "USE_SKIA_NEXT" ]
    cflags_cc = [ "-Wno-c++17-extensions" ]
  }

  # TODO(b/207398024): If this is a target we need to build, then we'll
  # need to rework the configuration framework to be able to remove this
  # flag -fsanitize=address, as it's mostly added in the
  # platform_configuration config.
}

# Skia's core code from the Skia repository.
config("skia_library_config") {
  if (is_linux) {
    cflags = [ "-Wno-deprecated-declarations" ]
  }
}

config("skia_library_config_public") {
  include_dirs = [
    #temporary until we can hide SkFontHost
    "//third_party/$skia_subdir",
    "//third_party/$skia_subdir/src/core",
    "//third_party/$skia_subdir/src/utils",
    "//third_party/$skia_subdir/include/core",
    "//third_party/$skia_subdir/include/effects",
    "//third_party/$skia_subdir/include/gpu",
    "//third_party/$skia_subdir/include/lazy",
    "//third_party/$skia_subdir/include/pathops",
    "//third_party/$skia_subdir/include/pipe",
    "//third_party/$skia_subdir/include/ports",
    "//third_party/$skia_subdir/include/private",
    "//third_party/$skia_subdir/include/utils",
  ]

  defines = [ "SK_BUILD_NO_OPTS" ]

  if (use_skia_next) {
    defines += [ "USE_SKIA_NEXT" ]
    cflags_cc = [ "-Wno-c++17-extensions" ]
  }
}

skia_common("skia_library") {
  sources = combined_sources + sksl_sources

  configs = [
    ":skia_library_config",
    ":skia_opts",
  ]

  public_configs = [ ":skia_library_config_public" ]

  deps = [
    ":skia_library_no_asan",
    "//base",
    "//starboard/common",
    "//third_party/$skia_subdir/third_party/skcms",
    "//third_party/freetype2",
    "//third_party/libpng",
    "//third_party/zlib",
  ]
}

# This is the target that all Cobalt modules should depend on if they
# wish to use Skia.  It augments skia_library (Skia's core code) with
# Cobalt specific code such as platform-specific implementations of certain functions.
skia_common("skia") {
  sources = [
    "config/SkUserConfig.h",
    "src/google_logging.cc",
    "src/gpu/gl/GrGLMakeNativeInterface_cobalt.cc",
    "src/ports/SkFontConfigParser_cobalt.cc",
    "src/ports/SkFontConfigParser_cobalt.h",
    "src/ports/SkFontMgr_cobalt.cc",
    "src/ports/SkFontMgr_cobalt.h",
    "src/ports/SkFontMgr_cobalt_factory.cc",
    "src/ports/SkFontStyleSet_cobalt.cc",
    "src/ports/SkFontStyleSet_cobalt.h",
    "src/ports/SkFontUtil_cobalt.cc",
    "src/ports/SkFontUtil_cobalt.h",
    "src/ports/SkFreeType_cobalt.cc",
    "src/ports/SkFreeType_cobalt.h",
    "src/ports/SkOSFile_cobalt.cc",
    "src/ports/SkOSFile_cobalt.h",
    "src/ports/SkStream_cobalt.cc",
    "src/ports/SkStream_cobalt.h",
    "src/ports/SkTLS_cobalt.cc",
    "src/ports/SkTime_cobalt.cc",
    "src/ports/SkTypeface_cobalt.cc",
    "src/ports/SkTypeface_cobalt.h",
  ]

  if (is_starboard) {
    sources += [ "src/ports/SkMemory_starboard.cc" ]
  }

  include_dirs = [ target_gen_dir ]

  if (use_skia_next) {
    include_dirs += [ skia_include_dir ]
  }

  deps = [
    "//base",
    "//cobalt/base",
    "//cobalt/configuration:configuration",
    "//cobalt/renderer:renderer_headers_only",
    "//starboard:starboard_headers_only",
    "//starboard/common",
    "//third_party/freetype2",
    "//third_party/libxml",
  ]

  public_deps = [ ":skia_library" ]
}
