|  | # Copyright 2013 The PDFium Authors | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | import("//build/config/features.gni") | 
|  | import("//build/config/freetype/freetype.gni") | 
|  | import("//build/config/ui.gni") | 
|  | import("//testing/test.gni") | 
|  | import("//third_party/skia/gn/codec.gni") | 
|  | import("//third_party/skia/gn/shared_sources.gni") | 
|  | import("//third_party/skia/modules/skcms/skcms.gni") | 
|  | import("../pdfium.gni") | 
|  | import("features.gni") | 
|  |  | 
|  | if (current_cpu == "arm") { | 
|  | import("//build/config/arm.gni") | 
|  | } | 
|  | if (current_cpu == "mipsel" || current_cpu == "mips64el") { | 
|  | import("//build/config/mips.gni") | 
|  | } | 
|  |  | 
|  | if (pdf_enable_fontations) { | 
|  | import("//build/rust/rust_static_library.gni") | 
|  | } | 
|  |  | 
|  | skia_use_ganesh_backend = !is_ios | 
|  | skia_support_pdf = false | 
|  |  | 
|  | if (pdf_enable_fontations) { | 
|  | source_set("path_bridge") { | 
|  | sources = skia_fontations_path_bridge_sources | 
|  | } | 
|  |  | 
|  | rust_static_library("bridge_rust_side") { | 
|  | allow_unsafe = true | 
|  | crate_root = skia_fontations_bridge_root | 
|  | sources = skia_ports_fontations_bridge_rust_side_sources | 
|  | cxx_bindings = [ skia_fontations_bridge_root ] | 
|  | deps = [ | 
|  | ":path_bridge", | 
|  | "//third_party/rust/font_types/v0_9:lib", | 
|  | "//third_party/rust/read_fonts/v0_31:lib", | 
|  | "//third_party/rust/skrifa/v0_33:lib", | 
|  | ] | 
|  | configs -= [ "//build/config/compiler:chromium_code" ] | 
|  | configs += [ | 
|  | ":skia_config", | 
|  | "//build/config/compiler:no_chromium_code", | 
|  | ] | 
|  | } | 
|  | } | 
|  |  | 
|  | # External-facing config for dependent code. | 
|  | config("skia_config") { | 
|  | include_dirs = [ "//third_party/skia" ] | 
|  |  | 
|  | defines = [ | 
|  | "SK_ENCODE_PNG", | 
|  | "SK_USER_CONFIG_HEADER=\"../../skia/config/SkPdfiumUserConfig.h\"", | 
|  | "SK_DISABLE_LEGACY_INIT_DECODERS", | 
|  | "SK_DISABLE_LEGACY_PNG_WRITEBUFFER", | 
|  | ] | 
|  |  | 
|  | if (is_win) { | 
|  | defines += [ "SK_FREETYPE_MINIMUM_RUNTIME_VERSION=(((FREETYPE_MAJOR) * 0x01000000) | ((FREETYPE_MINOR) * 0x00010000) | ((FREETYPE_PATCH) * 0x00000100))" ] | 
|  | } | 
|  |  | 
|  | if (is_component_build) { | 
|  | defines += [ | 
|  | "SKIA_DLL", | 
|  | "GR_GL_IGNORE_ES3_MSAA=0", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (skia_use_ganesh_backend) { | 
|  | defines += [ "SK_GANESH" ] | 
|  | } | 
|  |  | 
|  | if (skia_use_gl) { | 
|  | defines += [ "SK_GL" ] | 
|  | } | 
|  |  | 
|  | if (is_android) { | 
|  | defines += [ | 
|  | "SK_BUILD_FOR_ANDROID", | 
|  | "USE_CHROMIUM_SKIA", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (is_mac) { | 
|  | defines += [ "SK_BUILD_FOR_MAC" ] | 
|  | } | 
|  |  | 
|  | if (is_win) { | 
|  | defines += [ "GR_GL_FUNCTION_TYPE=__stdcall" ] | 
|  | } | 
|  |  | 
|  | if (pdf_enable_fontations) { | 
|  | include_dirs += [ "$root_gen_dir/third_party/skia" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | # Internal-facing config for Skia library code. | 
|  | config("skia_library_config") { | 
|  | # Turn on SK_API to export Skia's public API | 
|  | defines = [ | 
|  | "IS_SKIA_IMPL=1", | 
|  | "SKIA_IMPLEMENTATION=1", | 
|  | ] | 
|  |  | 
|  | if (use_blink && !use_system_freetype) { | 
|  | defines += [ "SK_FREETYPE_MINIMUM_RUNTIME_VERSION=(((FREETYPE_MAJOR) * 0x01000000) | ((FREETYPE_MINOR) * 0x00010000) | ((FREETYPE_PATCH) * 0x00000100))" ] | 
|  | } | 
|  | if (use_blink) { | 
|  | defines += [ "SK_TYPEFACE_FACTORY_FREETYPE" ] | 
|  | } | 
|  | if (is_win) { | 
|  | defines += [ "SK_TYPEFACE_FACTORY_DIRECTWRITE" ] | 
|  | } | 
|  | if (is_apple) { | 
|  | defines += [ "SK_TYPEFACE_FACTORY_CORETEXT" ] | 
|  | } | 
|  |  | 
|  | if (current_cpu == "arm") { | 
|  | if (arm_use_neon) { | 
|  | defines += [ "SK_ARM_HAS_NEON" ] | 
|  | } else if (arm_optionally_use_neon) { | 
|  | defines += [ "SK_ARM_HAS_OPTIONAL_NEON" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | # Settings for text blitting, chosen to approximate the system browser. | 
|  | if (is_linux || is_chromeos) { | 
|  | defines += [ | 
|  | "SK_GAMMA_EXPONENT=1.2", | 
|  | "SK_GAMMA_CONTRAST=0.2", | 
|  | ] | 
|  | } else if (is_android) { | 
|  | defines += [ | 
|  | "SK_GAMMA_APPLY_TO_A8", | 
|  | "SK_GAMMA_EXPONENT=1.4", | 
|  | "SK_GAMMA_CONTRAST=0.0", | 
|  | ] | 
|  | } else if (is_win) { | 
|  | defines += [ | 
|  | "SK_GAMMA_SRGB", | 
|  | "SK_GAMMA_CONTRAST=0.5", | 
|  | ] | 
|  | } else if (is_mac) { | 
|  | defines += [ | 
|  | "SK_GAMMA_SRGB", | 
|  | "SK_GAMMA_CONTRAST=0.0", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (is_android) { | 
|  | defines += [ | 
|  | # Android devices are typically more memory constrained, so default to a | 
|  | # smaller glyph cache (it may be overriden at runtime when the renderer | 
|  | # starts up, depending on the actual device memory). | 
|  | "SK_DEFAULT_FONT_CACHE_LIMIT=1048576",  # 1024 * 1024 | 
|  | ] | 
|  | } else { | 
|  | defines += [ "SK_DEFAULT_FONT_CACHE_LIMIT=20971520" ]  # 20 * 1024 * 1024 | 
|  | } | 
|  |  | 
|  | if (is_win) { | 
|  | defines += [ | 
|  | # On windows, GDI handles are a scarse system-wide resource so we have to | 
|  | # keep the glyph cache, which holds up to 4 GDI handles per entry, to a | 
|  | # fairly small size. http://crbug.com/314387 | 
|  | "SK_DEFAULT_FONT_CACHE_COUNT_LIMIT=256", | 
|  | ] | 
|  | } | 
|  | } | 
|  |  | 
|  | component("skia") { | 
|  | deps = [] | 
|  |  | 
|  | sources = [ | 
|  | # PDFium sources. | 
|  | "config/SkPdfiumUserConfig.h", | 
|  | "ext/google_logging.cc", | 
|  | ] | 
|  |  | 
|  | # The skia sources values are relative to the skia_dir, so we need to rebase. | 
|  | sources += skia_core_public | 
|  | sources += skia_pathops_sources | 
|  | sources += skia_sksl_pipeline_sources | 
|  | sources += skia_sksl_codegen_sources | 
|  | sources += skia_sksl_core_sources | 
|  | sources += skia_sksl_core_module_sources | 
|  | sources += skia_utils_private | 
|  | sources += skia_xps_sources | 
|  | sources += skia_codec_decode_bmp | 
|  | sources += skia_codec_libpng_srcs | 
|  | sources += skia_codec_png_base | 
|  | sources += skia_codec_shared | 
|  | sources += skia_encode_libpng_srcs | 
|  | sources += skia_encode_png_base | 
|  | sources += skia_encode_srcs | 
|  | sources += skia_ports_sources | 
|  | sources += [ | 
|  | "//third_party/skia/src/ports/SkImageGenerator_none.cpp", | 
|  | "//third_party/skia/src/sfnt/SkOTTable_name.cpp", | 
|  | "//third_party/skia/src/sfnt/SkOTUtils.cpp", | 
|  |  | 
|  | #pdfium | 
|  | "//third_party/skia/src/ports/SkDiscardableMemory_none.cpp", | 
|  | "//third_party/skia/src/ports/SkMemory_malloc.cpp", | 
|  | ] | 
|  |  | 
|  | # This and skia_opts are really the same conceptual target so share headers. | 
|  | allow_circular_includes_from = [ ":skia_opts" ] | 
|  |  | 
|  | # GPU | 
|  | if (skia_use_ganesh_backend) { | 
|  | sources += skia_gpu_public | 
|  | sources += skia_ganesh_private | 
|  | sources += skia_null_gpu_sources | 
|  | sources += skia_shared_gpu_sources | 
|  | if (skia_use_gl) { | 
|  | sources += skia_gpu_gl_public | 
|  | sources += skia_gpu_gl_private | 
|  | } | 
|  | } | 
|  |  | 
|  | # Remove unused util files include in utils.gni | 
|  | sources -= [ | 
|  | "//third_party/skia/src/utils/SkCamera.cpp", | 
|  | "//third_party/skia/src/utils/SkParsePath.cpp", | 
|  | ] | 
|  |  | 
|  | if (is_win) { | 
|  | libs = [ "fontsub.lib" ] | 
|  | } | 
|  |  | 
|  | # need separate win section to handle chromes auto gn filter | 
|  | # (build/config/BUILDCONFIG.gn) | 
|  | if (is_win) { | 
|  | sources -= [ | 
|  | #windows | 
|  | "//third_party/skia/src/utils/win/SkWGL_win.cpp", | 
|  | ] | 
|  | } | 
|  |  | 
|  | # Select Skia ports. | 
|  |  | 
|  | # FreeType is needed everywhere (except on iOS), on Linux and Android as main | 
|  | # font backend, on Windows and Mac as fallback backend for Variations. | 
|  | if (!is_ios) { | 
|  | sources += skia_ports_freetype_sources | 
|  | } | 
|  |  | 
|  | if (is_win) { | 
|  | # See SK_TYPEFACE_FACTORY_DIRECTWRITE | 
|  | sources += skia_ports_windows_fonts_sources | 
|  | sources += skia_ports_windows_sources | 
|  | } else { | 
|  | sources += [ "//third_party/skia/src/ports/SkOSFile_posix.cpp" ] | 
|  | } | 
|  |  | 
|  | frameworks = [] | 
|  | if (is_apple) { | 
|  | # See SK_TYPEFACE_FACTORY_CORETEXT | 
|  | sources += skia_ports_fontmgr_coretext_sources | 
|  | frameworks += [ | 
|  | "CoreFoundation.framework", | 
|  | "CoreGraphics.framework", | 
|  | "CoreText.framework", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (is_linux || is_chromeos) { | 
|  | sources += skia_ports_fci_sources | 
|  | sources += skia_ports_fontmgr_custom_sources | 
|  | sources += skia_ports_fontmgr_empty_sources | 
|  | sources += skia_ports_typeface_proxy_sources | 
|  | } | 
|  |  | 
|  | if (is_android) { | 
|  | # Unlike Chromium, standalone PDFium on Linux and Chrome OS does not | 
|  | # require these files, since PDFium does not perform Android emulation. | 
|  | # Note that this requires expat. | 
|  | sources += skia_ports_fontmgr_android_sources | 
|  | } | 
|  |  | 
|  | if (is_win || (is_apple && use_blink)) { | 
|  | # Add the FreeType custom font manager as a fallback backend for variable fonts. | 
|  | sources += skia_ports_fontmgr_custom_sources | 
|  | sources += skia_ports_fontmgr_empty_sources | 
|  | } | 
|  |  | 
|  | if (pdf_enable_fontations) { | 
|  | sources += skia_ports_typeface_fontations_sources | 
|  |  | 
|  | # Fontations Rust/C++ bridge interfaces. | 
|  | deps += [ | 
|  | ":bridge_rust_side", | 
|  | ":path_bridge", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (is_clang) { | 
|  | # Skia won't compile with some of the more strict clang warnings. | 
|  | # e.g. it does: | 
|  | #  SkASSERT(!"sk_out_of_memory"); | 
|  | configs -= [ "//build/config/clang:extra_warnings" ] | 
|  | } | 
|  |  | 
|  | configs -= [ "//build/config/compiler:chromium_code" ] | 
|  | configs += [ | 
|  | ":skia_config", | 
|  | ":skia_library_config", | 
|  | "//build/config/compiler:no_chromium_code", | 
|  | ] | 
|  | public_configs = [ ":skia_config" ] | 
|  |  | 
|  | deps += [ | 
|  | ":skcms", | 
|  | ":skia_opts", | 
|  | "../third_party:png", | 
|  | "../third_party:zlib", | 
|  | "//:freetype_common", | 
|  | ] | 
|  | public_deps = [ ":skia_core_and_effects" ] | 
|  |  | 
|  | if (is_linux || is_chromeos) { | 
|  | deps += [ | 
|  | "//third_party:fontconfig", | 
|  | "//third_party/icu:icuuc", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (is_android) { | 
|  | deps += [ | 
|  | "//third_party/cpu_features:ndk_compat", | 
|  | "//third_party/expat", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (is_android && !is_debug) { | 
|  | configs -= [ "//build/config/compiler:default_optimization" ] | 
|  | configs += [ "//build/config/compiler:optimize_max" ] | 
|  | } | 
|  |  | 
|  | if (is_ios) { | 
|  | frameworks += [ "ImageIO.framework" ] | 
|  | } | 
|  |  | 
|  | if (skia_support_pdf) { | 
|  | sources += skia_pdf_sources | 
|  | } else { | 
|  | sources += [ "//third_party/skia/src/pdf/SkDocument_PDF_None.cpp" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | # Template for things that are logically part of :skia, but need to be split out | 
|  | # so custom compile flags can be applied. | 
|  | # | 
|  | # These are all opted out of check_includes, due to (logically) being part of | 
|  | # skia. | 
|  | template("skia_source_set") { | 
|  | source_set(target_name) { | 
|  | forward_variables_from(invoker, "*") | 
|  |  | 
|  | check_includes = false | 
|  |  | 
|  | if (!is_debug) { | 
|  | configs -= [ "//build/config/compiler:default_optimization" ] | 
|  | configs += [ "//build/config/compiler:optimize_max" ] | 
|  | } | 
|  |  | 
|  | configs -= [ "//build/config/compiler:chromium_code" ] | 
|  | configs += [ | 
|  | ":skia_config", | 
|  | ":skia_library_config", | 
|  | "//build/config/compiler:no_chromium_code", | 
|  | ] | 
|  | public_configs = [ ":skia_config" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | skia_source_set("skia_core_and_effects") { | 
|  | defines = [] | 
|  | sources = skia_core_sources | 
|  | sources += skia_effects_sources | 
|  | sources += skia_colorfilters_sources | 
|  | sources += skia_effects_imagefilter_sources | 
|  |  | 
|  | visibility = [ ":skia" ] | 
|  | } | 
|  |  | 
|  | # Bits that involve special vector-y hardware. | 
|  | if (current_cpu == "x86" || current_cpu == "x64") { | 
|  | skia_source_set("skia_opts_hsw") { | 
|  | sources = skia_opts.hsw_sources | 
|  | if (!is_win) { | 
|  | cflags = [ | 
|  | "-mavx2", | 
|  | "-mbmi", | 
|  | "-mbmi2", | 
|  | "-mf16c", | 
|  | "-mfma", | 
|  | ] | 
|  | } | 
|  | if (is_win) { | 
|  | cflags = [ "/arch:AVX2" ] | 
|  | } | 
|  | visibility = [ ":skia_opts" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | skia_source_set("skia_opts") { | 
|  | cflags = [] | 
|  | defines = [] | 
|  |  | 
|  | if (current_cpu == "x86" || current_cpu == "x64") { | 
|  | deps = [ ":skia_opts_hsw" ] | 
|  | } else if (current_cpu == "arm") { | 
|  | # The assembly uses the frame pointer register (r7 in Thumb/r11 in | 
|  | # ARM), the compiler doesn't like that. | 
|  | cflags += [ "-fomit-frame-pointer" ] | 
|  |  | 
|  | if (arm_version >= 7) { | 
|  | if (arm_use_neon || arm_optionally_use_neon) { | 
|  | # Root build config sets -mfpu=$arm_fpu, which we expect to be neon | 
|  | # when running this. | 
|  | if (!arm_use_neon) { | 
|  | configs -= [ "//build/config/compiler:compiler_arm_fpu" ] | 
|  | cflags += [ "-mfpu=neon" ] | 
|  | } | 
|  | } | 
|  | } | 
|  | } else if (current_cpu == "arm64") { | 
|  | # Conditional and empty body needed to avoid assert below | 
|  | } else if (current_cpu == "mipsel" || current_cpu == "mips64el") { | 
|  | cflags += [ "-fomit-frame-pointer" ] | 
|  | } else { | 
|  | assert(false, "Unsupported target CPU " + current_cpu) | 
|  | } | 
|  |  | 
|  | if (is_android && !is_debug) { | 
|  | configs -= [ "//build/config/compiler:default_optimization" ] | 
|  | configs += [ "//build/config/compiler:optimize_max" ] | 
|  | } | 
|  |  | 
|  | visibility = [ ":skia" ] | 
|  | } | 
|  |  | 
|  | if (current_cpu == "x64") { | 
|  | skia_source_set("skcms_TransformHsw") { | 
|  | sources = skcms_TransformHsw | 
|  | if (!is_win) { | 
|  | cflags = [ | 
|  | "-w", | 
|  | "-march=haswell", | 
|  | "-std=c11", | 
|  | ] | 
|  | } else { | 
|  | cflags = [ "/arch:AVX2" ] | 
|  | } | 
|  | visibility = [ ":skcms" ] | 
|  | } | 
|  | skia_source_set("skcms_TransformSkx") { | 
|  | sources = skcms_TransformSkx | 
|  | if (!is_win) { | 
|  | cflags = [ | 
|  | "-w", | 
|  | "-march=skylake-avx512", | 
|  | "-std=c11", | 
|  | ] | 
|  | } else { | 
|  | cflags = [ "/arch:AVX512" ] | 
|  | } | 
|  | visibility = [ ":skcms" ] | 
|  | } | 
|  | } else { | 
|  | skia_source_set("skcms_TransformHsw") { | 
|  | sources = [] | 
|  | visibility = [ ":skcms" ] | 
|  | } | 
|  | skia_source_set("skcms_TransformSkx") { | 
|  | sources = [] | 
|  | visibility = [ ":skcms" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | source_set("skcms_TransformBaseline_and_public") { | 
|  | if (!is_win || is_clang) { | 
|  | cflags = [ | 
|  | "-w", | 
|  | "-std=c11", | 
|  | ] | 
|  | } else { | 
|  | cflags = [] | 
|  | } | 
|  |  | 
|  | # LLVM automatically sets the equivalent of GCC's -mfp16-format=ieee on ARM | 
|  | # builds by default, while GCC itself does not. We need it to enable support | 
|  | # for half-precision floating point data types used by SKCMS on ARM. | 
|  | if ((is_linux || is_chromeos) && !is_clang && current_cpu == "arm") { | 
|  | cflags += [ "-mfp16-format=ieee" ] | 
|  | } | 
|  |  | 
|  | sources = rebase_path(skcms_TransformBaseline + skcms_public, | 
|  | ".", | 
|  | "//third_party/skia/modules/skcms") | 
|  | } | 
|  |  | 
|  | source_set("skcms") { | 
|  | deps = [ | 
|  | ":skcms_TransformBaseline_and_public", | 
|  | ":skcms_TransformHsw", | 
|  | ":skcms_TransformSkx", | 
|  | ] | 
|  | public = | 
|  | rebase_path(skcms_public_headers, ".", "//third_party/skia/modules/skcms") | 
|  | include_dirs = [ "//third_party/skia/modules/skcms" ] | 
|  | } |