# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/chromecast_build.gni")
import("//build/config/arm.gni")
import("//build/config/mips.gni")

config("libpng_config") {
  include_dirs = [ "." ]

  defines = []

  if (is_win) {
    if (is_component_build) {
      defines += [
        "PNG_USE_DLL",
        "PNG_NO_MODULEDEF",
      ]
    }
  }
}

# Must be in a config because of how GN orders flags (otherwise -Wall will
# appear after this, and turn it back on).
config("clang_warnings") {
  if (is_clang) {
    cflags = [
      # libpng checks that the width is not greater than PNG_SIZE_MAX.
      # On platforms where size_t is 64-bits, this comparison will always
      # be false.
      "-Wno-tautological-constant-out-of-range-compare",
    ]
  }
}

# Cannot be a static_library in component builds
source_set("libpng_sources") {
  sources = [
    "png.c",
    "png.h",
    "pngconf.h",
    "pngdebug.h",
    "pngerror.c",
    "pngget.c",
    "pnginfo.h",
    "pnglibconf.h",
    "pngmem.c",
    "pngpread.c",
    "pngprefix.h",
    "pngpriv.h",
    "pngread.c",
    "pngrio.c",
    "pngrtran.c",
    "pngrutil.c",
    "pngset.c",
    "pngstruct.h",
    "pngtrans.c",
    "pngwio.c",
    "pngwrite.c",
    "pngwtran.c",
    "pngwutil.c",
  ]

  defines = [ "PNG_SET_OPTION_SUPPORTED" ]
  cflags = []

  if (current_cpu == "x86" || current_cpu == "x64") {
    sources += [
      "intel/filter_sse2_intrinsics.c",
      "intel/intel_init.c",
    ]
    defines += [ "PNG_INTEL_SSE_OPT=1" ]
  } else if ((current_cpu == "arm" || current_cpu == "arm64") && arm_use_neon) {
    sources += [
      "arm/arm_init.c",
      "arm/filter_neon_intrinsics.c",
      "arm/palette_neon_intrinsics.c",
    ]
    defines += [
      "PNG_ARM_NEON_OPT=2",
      "PNG_ARM_NEON_IMPLEMENTATION=1",
    ]
  } else if (current_cpu == "mips64el" && mips_use_msa) {
    sources += [
      "mips/filter_msa_intrinsics.c",
      "mips/mips_init.c",
    ]
  }

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [ "//build/config/compiler:no_chromium_code" ]

  if (is_win) {
    # Unary minus applied to unsigned type.
    cflags += [ "/wd4146" ]
  }

  if (is_win && is_component_build) {
    defines += [ "PNG_BUILD_DLL" ]
  }

  public_configs = [ ":libpng_config" ]

  public_deps = [
    "//third_party/zlib",
  ]

  configs += [ ":clang_warnings" ]
}

if (is_win) {
  component("libpng") {
    public_deps = [
      ":libpng_sources",
    ]
  }
} else {
  group("libpng") {
    public_deps = [
      ":libpng_sources",
    ]
  }
}
