# 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 = [ ":*" ]
  defines = [ "SKIA_IMPLEMENTATION=1" ]
}

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

core_gypi = exec_script("gn/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("gn/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("gn/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("gn/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("gn/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("gn/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

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

source_set("opts_sse41") {
  configs += skia_library_configs

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

source_set("opts_avx") {
  configs += skia_library_configs

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

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

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

  libs = [ "pthread" ]

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

  if (is_fuchsia) {
    sources += [ "src/ports/SkFontMgr_empty_factory.cpp" ]
  }
}

executable("example") {
  sources = [
    "cmake/example.cpp",
  ]
  deps = [
    ":skia",
  ]

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