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

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" ]
    } else {
      include_dirs = [ "//third_party/skia" ]
    }

    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" ]
    }
  }
}
