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

# This file handles the removal of platform-specific files from the
# Skia build.

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

template("skia_common") {
  # This list will contain all defines that also need to be exported to
  # dependent components.
  skia_export_defines = [
    "SK_DISABLE_EFFECT_DESERIALIZATION=1",
    "SK_SUPPORT_GPU=1",
    "SK_USER_CONFIG_HEADER=\"cobalt/renderer/rasterizer/skia/skia/config/SkUserConfig.h\"",
  ]

  if (target_os == "win") {
    skia_export_defines += [
      # Required define by Skia to take certain code paths, such
      # as including windows.h in various places.
      "SK_BUILD_FOR_WIN32",
    ]
  }

  # The |default_font_cache_limit| specifies the max size of the glyph cache,
  # which contains path and metrics information for glyphs, before it will
  # start purging entries. The current value matches the limit used by
  # Android. Set the value to 1*1024*1024.
  default_font_cache_limit = 1048576

  config("skia_common_config_$target_name") {
    if (is_clang) {
      cflags = [ "-Wno-tautological-compare" ]
    }
  }

  config("skia_common_config_public_$target_name") {
    defines = skia_export_defines

    # We would prefer this to be direct_dependent_settings,
    # however we currently have no means to enforce that direct dependents
    # re-export if they include Skia headers in their public headers.
    include_dirs = [ "config" ]
  }

  static_library(target_name) {
    forward_variables_from(invoker, "*", [ "configs" ])

    if (defined(include_dirs)) {
      include_dirs += [ "//third_party/$skia_subdir" ]
    } else {
      include_dirs = [ "//third_party/$skia_subdir" ]
    }

    if (!defined(defines)) {
      defines = []
    }

    defines += [
      # skia uses static initializers to initialize the serialization logic
      # of its "pictures" library. This is currently not used in Cobalt; if
      # it ever gets used the processes that use it need to call
      # SkGraphics::Init().
      "SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=0",

      # ETC1 texture encoding is not supported in Cobalt by default.
      "SK_IGNORE_ETC1_SUPPORT",

      "SK_DEFAULT_FONT_CACHE_LIMIT=$default_font_cache_limit",

      # Use scalar portable implementations instead of Clang/GCC vector extensions
      # in SkVx.h, as this causes an internal compiler error for raspi-2.
      "SKNX_NO_SIMD",
    ]

    configs += [ ":skia_common_config_$target_name" ]

    if (defined(invoker.configs)) {
      configs += invoker.configs
    }

    if (defined(public_configs)) {
      public_configs += [ ":skia_common_config_public_$target_name" ]
    } else {
      public_configs = [ ":skia_common_config_public_$target_name" ]
    }

    if (defined(deps)) {
      deps += [ "//starboard:starboard_headers_only" ]
    } else {
      deps = [ "//starboard:starboard_headers_only" ]
    }
  }
}
