# 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 || is_mac) {
        # 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
}
