# Copyright 2017 The Fuchsia Authors. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#    * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#    * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
config("freetype_config") {
  include_dirs = [
    "include",
  ]
  cflags = []
  if (is_clang) {
    cflags += [
      "-Wno-conversion",
      "-Wno-unused-function",
      "-Wno-unused-variable",
      "-Wno-macro-redefined",
    ]
  }
}
config("freetype_config_for_rust_host") {
  # Without `-fPIC`, we get the error:
  # > ld.lld: error: can't create dynamic relocation R_X86_64_64 against local symbol in readonly
  # > segment
  cflags = ["-fPIC"]
}
#TODO(mikejurka): Remove once we've migrated to the freetype2 target everywhere
group("freetype") {
  public_deps = [
    ":freetype2",
  ]
}
template("freetype_library") {
  target(invoker.library_type, target_name) {
    forward_variables_from(invoker, "*")
    if (!defined(rust_host)) {
      rust_host = false
    }
    shared_lib = (library_type == "shared_library")
    sources = [
      "src/autofit/autofit.c",
      "src/base/ftbase.c",
      "src/base/ftbbox.c",
      "src/base/ftbdf.c",
      "src/base/ftbitmap.c",
      "src/base/ftdebug.c",
      "src/base/ftfstype.c",
      "src/base/ftgasp.c",
      "src/base/ftglyph.c",
      "src/base/ftinit.c",
      "src/base/ftmm.c",
      "src/base/ftstroke.c",
      "src/base/ftsystem.c",
      "src/base/fttype1.c",
      "src/base/ftsynth.c",
      "src/gzip/ftgzip.c",
      "src/lzw/ftlzw.c",
      "src/psaux/psaux.c",
      "src/pshinter/pshinter.c",
      "src/psnames/psnames.c",
      "src/sfnt/sfnt.c",
      "src/smooth/smooth.c",
      # Font Drivers. Drivers need to be enabled in ftmodule.h explicitly.
      "src/cff/cff.c",           # OpenType, (.cff, .cef)
      "src/truetype/truetype.c", # TrueType
    ]
    defines = [
      "FT2_BUILD_LIBRARY",
      "DARWIN_NO_CARBON",
      # Long directory name to avoid accidentally using wrong headers.
      "FT_CONFIG_MODULES_H=<freetype-fuchsia-config/ftmodule.h>",
      "FT_CONFIG_OPTIONS_H=<freetype-fuchsia-config/ftoption.h>",
    ]
    if (shared_lib) {
      defines += [
        "FT_EXPORT(x)=extern __attribute__(( visibility( \"default\" ) )) x",
        "FT_EXPORT_DEF(x)=extern __attribute__(( visibility( \"default\" ) )) x",
        "FT_EXPORT_VAR(x)=extern __attribute__(( visibility( \"default\" ) )) x",
      ]
    } else {
      # Reduce visibility of symbols.
      defines += [ "FT_EXPORT(x)=x" ]
    }
    if (!rust_host) {
      defines += [ "FT_CONFIG_OPTION_USE_PNG" ]
    }
    public_configs = [ ":freetype_config" ]
    if (rust_host) {
      public_configs += [":freetype_config_for_rust_host"]
    }
    if (rust_host) {
      deps = ["//third_party/zlib:zlib_for_rust_host"]
    } else {
      deps = [
        "//third_party/libpng",
        "//third_party/zlib"
      ]
    }
  }
}
freetype_library("freetype2") {
  # Shared libs are disabled in host toolchain.
  if (current_toolchain == host_toolchain) {
    library_type = "source_set"
  } else {
    library_type = "shared_library"
  }
}
# TODO(36315): Remove workaround for Rust host_toolchain
freetype_library("freetype2_for_rust_host") {
  library_type = "static_library"
  rust_host = true
}
