# Copyright 2016 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

declare_args() {
}

# Skia public API, generally provided by :skia.
config("skia_public") {
  include_dirs = [
    "include/c",
    "include/config",
    "include/core",
    "include/effects",
    "include/gpu",
    "include/images",
    "include/lazy",
    "include/pathops",
    "include/ports",
    "include/utils",
    "include/utils/mac",
  ]
  defines = [ "SKIA_DLL" ]
}

# Skia internal APIs, used by Skia itself and a few test tools.
config("skia_private") {
  visibility = [ ":*" ]

  include_dirs = [
    "include/private",
    "src/c",
    "src/config",
    "src/core",
    "src/effects",
    "src/gpu",
    "src/image",
    "src/images",
    "src/lazy",
    "src/opts",
    "src/pathops",
    "src/ports",
    "src/sfnt",
    "src/utils",
    "third_party/etc1",
    "third_party/ktx",
  ]
}

# Any code that's linked into Skia-the-library should use this config via += skia_library_configs.
config("skia_library") {
  visibility = [ ":*" ]

  cflags = [
    "-Winit-self",
    "-Wpointer-arith",
    "-Wsign-compare",
    "-Wvla",
    "-fstrict-aliasing",
  ]
  cflags_cc = [ "-Wnon-virtual-dtor" ]

  defines = [ "SKIA_IMPLEMENTATION=1" ]
}

skia_library_configs = [
  ":skia_public",
  ":skia_private",
  ":skia_library",
]

# Chrome's GN environment is mostly helpful, but a couple default configs tend to get in the way.
unwanted_configs = [
  "//build/config/clang:find_bad_constructs",  # Chrome style checks.
  "//build/config:feature_flags",  # A bunch of #defines we don't care about.
]

core_gypi = exec_script("build/gypi_to_gn.py",
                        [
                          rebase_path("gyp/core.gypi"),
                          "--replace=<(skia_include_path)=include",
                          "--replace=<(skia_src_path)=src",
                        ],
                        "scope",
                        [ "gyp/core.gypi" ])

effects_gypi = exec_script("build/gypi_to_gn.py",
                           [
                             rebase_path("gyp/effects.gypi"),
                             "--replace=<(skia_include_path)=include",
                             "--replace=<(skia_src_path)=src",
                           ],
                           "scope",
                           [ "gyp/effects.gypi" ])

gpu_gypi = exec_script("build/gypi_to_gn.py",
                       [
                         rebase_path("gyp/gpu.gypi"),
                         "--replace=<(skia_include_path)=include",
                         "--replace=<(skia_src_path)=src",
                       ],
                       "scope",
                       [ "gyp/gpu.gypi" ])

opts_gypi = exec_script("build/gypi_to_gn.py",
                        [
                          rebase_path("gyp/opts.gypi"),
                          "--replace=<(skia_include_path)=include",
                          "--replace=<(skia_src_path)=src",
                        ],
                        "scope",
                        [ "gyp/opts.gypi" ])

pdf_gypi = exec_script("build/gypi_to_gn.py",
                       [
                         rebase_path("gyp/pdf.gypi"),
                         "--replace=<(skia_include_path)=include",
                         "--replace=<(skia_src_path)=src",
                       ],
                       "scope",
                       [ "gyp/pdf.gypi" ])

utils_gypi = exec_script("build/gypi_to_gn.py",
                         [
                           rebase_path("gyp/utils.gypi"),
                           "--replace=<(skia_include_path)=include",
                           "--replace=<(skia_src_path)=src",
                         ],
                         "scope",
                         [ "gyp/utils.gypi" ])

source_set("opts_ssse3") {
  configs += skia_library_configs
  configs -= unwanted_configs

  sources = opts_gypi.ssse3_sources
  cflags = [ "-mssse3" ]
}

source_set("opts_sse41") {
  configs += skia_library_configs
  configs -= unwanted_configs

  sources = opts_gypi.sse41_sources
  cflags = [ "-msse4.1" ]
}

source_set("opts_avx") {
  configs += skia_library_configs
  configs -= unwanted_configs

  sources = opts_gypi.avx_sources
  cflags = [ "-mavx" ]
}

component("skia") {
  public_configs = [ ":skia_public" ]
  configs += skia_library_configs
  configs -= unwanted_configs

  deps = [
    ":opts_avx",
    ":opts_sse41",
    ":opts_ssse3",
    "third_party:zlib",
  ]

  libs = []

  sources = []
  sources += core_gypi.sources
  sources += effects_gypi.sources
  sources += gpu_gypi.skgpu_sources
  sources += opts_gypi.sse2_sources
  sources += pdf_gypi.sources
  sources += utils_gypi.sources
  sources += [
    "src/images/SkImageEncoder.cpp",
    "src/images/SkImageEncoder_Factory.cpp",
    "src/ports/SkDiscardableMemory_none.cpp",
    "src/ports/SkGlobalInitialization_default.cpp",
    "src/ports/SkImageGenerator_none.cpp",
    "src/ports/SkMemory_malloc.cpp",
    "src/ports/SkOSFile_stdio.cpp",
    "src/sfnt/SkOTTable_name.cpp",
    "src/sfnt/SkOTUtils.cpp",
    "src/utils/mac/SkStream_mac.cpp",
    "third_party/etc1/etc1.cpp",
    "third_party/ktx/ktx.cpp",
  ]

  if (is_win) {
    sources += [
      "src/ports/SkDebug_win.cpp",
      "src/ports/SkFontHost_win.cpp",
      "src/ports/SkFontMgr_win_dw.cpp",
      "src/ports/SkFontMgr_win_dw_factory.cpp",
      "src/ports/SkImageEncoder_WIC.cpp",
      "src/ports/SkImageGeneratorWIC.cpp",
      "src/ports/SkOSFile_win.cpp",
      "src/ports/SkScalerContext_win_dw.cpp",
      "src/ports/SkTLS_win.cpp",
      "src/ports/SkTypeface_win_dw.cpp",
    ]
  } else {
    sources += [
      "src/ports/SkDebug_stdio.cpp",
      "src/ports/SkOSFile_posix.cpp",
      "src/ports/SkTLS_pthread.cpp",
    ]
  }

  if (is_linux) {
    deps += [
      "third_party:fontconfig",
      "third_party:freetype2",
      "third_party:libjpeg-turbo",
      "third_party:libpng",
    ]
    sources += [
      "src/fonts/SkFontMgr_fontconfig.cpp",
      "src/images/SkJPEGImageEncoder.cpp",
      "src/images/SkJPEGWriteUtility.cpp",
      "src/images/SkPNGImageEncoder.cpp",
      "src/ports/SkFontConfigInterface_direct.cpp",
      "src/ports/SkFontConfigInterface_direct_factory.cpp",
      "src/ports/SkFontHost_FreeType.cpp",
      "src/ports/SkFontHost_FreeType_common.cpp",
      "src/ports/SkFontHost_fontconfig.cpp",
    ]
  }

  if (is_mac) {
    sources += [
      "src/ports/SkFontHost_mac.cpp",
      "src/ports/SkImageEncoder_CG.cpp",
      "src/ports/SkImageGeneratorCG.cpp",
    ]
    libs += [ "ApplicationServices.framework" ]
  }
}

executable("example") {
  configs -= unwanted_configs

  sources = [
    "cmake/example.cpp",
  ]
  deps = [
    ":skia",
  ]

  libs = []
  if (is_mac) {
    libs += [ "OpenGL.framework" ]
  }
}
