# 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_use_system_zlib = is_official_build
}

import("../third_party.gni")

if (skia_use_system_zlib) {
  system("zlib") {
    libs = [ "z" ]
  }
} else {
  # ARM optimizations disabled for Windows on Arm MSVC builds, see http://crbug.com/v8/10012.
  use_arm_neon_optimizations =
      (current_cpu == "arm" || current_cpu == "arm64") && !(is_win && !is_clang)
  use_x86_x64_optimizations =
      (current_cpu == "x86" || current_cpu == "x64") && !is_ios

  config("zlib_simd_config") {
    defines = []
    if (use_x86_x64_optimizations) {
      if (is_win) {
        defines += [ "X86_WINDOWS" ]
      } else {
        defines += [ "X86_NOT_WINDOWS" ]
      }
      defines += [ "ADLER32_SIMD_SSSE3" ]  # Strangely this is needed for
                                           # cpu_features.c
    }
    if (use_arm_neon_optimizations) {
      if (is_android) {
        defines += [ "ARMV8_OS_ANDROID" ]  # also compatible with v7
      } else if (is_linux || is_chromeos) {
        defines += [ "ARMV8_OS_LINUX" ]
      } else if (is_fuchsia) {
        defines += [ "ARMV8_OS_FUCHSIA" ]
      } else if (is_win) {
        defines += [ "ARMV8_OS_WINDOWS" ]
      } else if (is_ios) {
        # iOS@ARM is a special case where we always have NEON but don't check
        # for crypto extensions.
        defines += [ "ARM_OS_IOS" ]
      } else {
        assert(false, "Unsupported ARM OS")
      }
    }

    # Warnings are just noise if we're not maintaining the code.
    if (is_win) {
      cflags = [ "/w" ]
    } else {
      cflags = [ "-w" ]
    }
  }

  source_set("zlib_adler32_simd") {
    visibility = [ ":*" ]
    configs += [ ":zlib_simd_config" ]
    if (use_x86_x64_optimizations) {
      defines = [ "ADLER32_SIMD_SSSE3" ]
      if (!is_win || is_clang) {
        cflags = [ "-mssse3" ]
      }
    }
    if (use_arm_neon_optimizations) {
      defines = [ "ADLER32_SIMD_NEON" ]
    }
    sources = [ "../externals/zlib/adler32_simd.c" ]
  }

  source_set("zlib_crc32_simd") {
    visibility = [ ":*" ]
    configs += [ ":zlib_simd_config" ]

    # Disabled for iPhone, as described in DDI0487C_a_armv8_arm:
    #  "All implementations of the ARMv8.1 architecture are required to
    #   implement the CRC32* instructions. These are optional in ARMv8.0."
    if (!is_ios && use_arm_neon_optimizations) {
      defines = [ "CRC32_ARMV8_CRC32" ]

      # An ARMv7 GCC build will fail to compile without building this target
      # for ARMv8-a+crc and letting runtime cpu detection select the correct
      # function.
      if (!is_win && !is_clang) {
        cflags_c = [ "-march=armv8-a+crc" ]
      }
    }

    if (use_x86_x64_optimizations) {
      defines = [ "CRC32_SIMD_SSE42_PCLMUL" ]
      if (!is_win || is_clang) {
        cflags = [
          "-msse4.2",
          "-mpclmul",
        ]
      }
    }

    sources = [ "../externals/zlib/crc32_simd.c" ]
  }

  source_set("zlib_inflate_chunk_simd") {
    visibility = [ ":*" ]
    configs += [ ":zlib_simd_config" ]
    if (use_x86_x64_optimizations) {
      defines = [ "INFLATE_CHUNK_SIMD_SSE2" ]
      if (current_cpu == "x64") {
        defines += [ "INFLATE_CHUNK_READ_64LE" ]
      }
    }
    if (use_arm_neon_optimizations) {
      defines = [ "INFLATE_CHUNK_SIMD_NEON" ]
      if (current_cpu == "arm64") {
        defines += [ "INFLATE_CHUNK_READ_64LE" ]
      }
    }
    if (use_x86_x64_optimizations || use_arm_neon_optimizations) {
      include_dirs = [
        "../externals/zlib/",
        "../externals/zlib/contrib/optimizations/",
      ]
      sources = [
        "../externals/zlib/contrib/optimizations/inffast_chunk.c",
        "../externals/zlib/contrib/optimizations/inflate.c",
      ]
    }
  }

  source_set("zlib_x86_x64_simd") {
    visibility = [ ":*" ]
    configs += [ ":zlib_simd_config" ]
    if (use_x86_x64_optimizations) {
      defines = [
        "CRC32_SIMD_SSE42_PCLMUL",
        "DEFLATE_FILL_WINDOW_SSE2",
      ]
      if (!is_win || is_clang) {
        cflags = [
          "-msse4.2",
          "-mpclmul",
        ]
      }
      sources = [
        "../externals/zlib/crc_folding.c",
        "../externals/zlib/fill_window_sse.c",
      ]
    }
  }

  third_party("zlib") {
    public_include_dirs = [ "../externals/zlib" ]
    defines = [ "ZLIB_IMPLEMENTATION" ]
    deps = []

    sources = [
      "../externals/zlib/adler32.c",
      "../externals/zlib/compress.c",
      "../externals/zlib/cpu_features.c",
      "../externals/zlib/crc32.c",
      "../externals/zlib/deflate.c",
      "../externals/zlib/gzclose.c",
      "../externals/zlib/gzlib.c",
      "../externals/zlib/gzread.c",
      "../externals/zlib/gzwrite.c",
      "../externals/zlib/infback.c",
      "../externals/zlib/inffast.c",
      "../externals/zlib/inftrees.c",
      "../externals/zlib/trees.c",
      "../externals/zlib/uncompr.c",
      "../externals/zlib/zutil.c",
    ]

    if (is_android) {
      deps += [ "//third_party/cpu-features" ]
    }

    if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) {
      defines += [ "CPU_NO_SIMD" ]
      sources += [ "../externals/zlib/inflate.c" ]
    } else {
      configs += [ ":zlib_simd_config" ]
      deps += [
        ":zlib_adler32_simd",
        ":zlib_crc32_simd",
        ":zlib_inflate_chunk_simd",
        ":zlib_x86_x64_simd",
      ]
    }
  }
}

config("zlib_config") {
}

third_party("compression_utils_portable") {
  visibility = [ "//third_party/externals/angle2:*" ]
  public_include_dirs = [ "../externals/zlib/google" ]
  sources = [
    "../externals/zlib/google/compression_utils_portable.cc",
    "../externals/zlib/google/compression_utils_portable.h",
  ]
  public_deps = [ ":zlib" ]  # either system or from source
}
