GN: more optional components: jpeg, pdf, png, xml

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2267343004

Review-Url: https://codereview.chromium.org/2267343004
diff --git a/BUILD.gn b/BUILD.gn
index cdc1cb9..49e3e50 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -4,8 +4,13 @@
 # found in the LICENSE file.
 
 declare_args() {
+  skia_use_expat = true
   skia_use_giflib = !is_fuchsia
+  skia_use_libjpeg_turbo = true
+  skia_use_libpng = true
   skia_use_libwebp = !is_fuchsia
+  skia_use_sfntly = !is_fuchsia
+  skia_use_zlib = true
 }
 
 skia_public_includes = [
@@ -60,15 +65,7 @@
     "third_party/ktx",
   ]
 
-  defines = [
-    "SK_GAMMA_APPLY_TO_A8",
-
-    "SK_HAS_JPEG_LIBRARY",
-    "SK_HAS_PNG_LIBRARY",
-
-    # TODO(halcanary): make this the default; this is the value Android uses.
-    "SK_SFNTLY_SUBSETTER=\"sample/chromium/font_subsetter.h\"",
-  ]
+  defines = [ "SK_GAMMA_APPLY_TO_A8" ]
   if (is_linux) {
     defines += [ "SK_SAMPLES_FOR_X" ]
   }
@@ -219,6 +216,57 @@
   ]
 }
 
+optional("jpeg") {
+  enabled = skia_use_libjpeg_turbo
+  public_defines = [ "SK_HAS_JPEG_LIBRARY" ]
+
+  configs += skia_library_configs
+  deps = [
+    "//third_party/libjpeg-turbo:libjpeg",
+  ]
+  sources = [
+    "src/codec/SkJpegCodec.cpp",
+    "src/codec/SkJpegDecoderMgr.cpp",
+    "src/codec/SkJpegUtility.cpp",
+    "src/images/SkJPEGImageEncoder.cpp",
+    "src/images/SkJPEGWriteUtility.cpp",
+  ]
+}
+
+optional("pdf") {
+  enabled = skia_use_zlib
+  public_defines = []
+
+  configs += skia_library_configs
+  deps = [
+    "//third_party/zlib",
+  ]
+  sources = pdf_gypi.sources
+
+  if (skia_use_sfntly) {
+    deps += [ "//third_party/sfntly" ]
+    public_defines += [
+      # TODO(halcanary): make this the default; this is the value Android uses.
+      "SK_SFNTLY_SUBSETTER=\"sample/chromium/font_subsetter.h\"",
+    ]
+  }
+}
+
+optional("png") {
+  enabled = skia_use_libpng
+  public_defines = [ "SK_HAS_PNG_LIBRARY" ]
+
+  configs += skia_library_configs
+  deps = [
+    "//third_party/libpng",
+  ]
+  sources = [
+    "src/codec/SkIcoCodec.cpp",
+    "src/codec/SkPngCodec.cpp",
+    "src/images/SkPNGImageEncoder.cpp",
+  ]
+}
+
 optional("webp") {
   enabled = skia_use_libwebp
   public_defines = [ "SK_HAS_WEBP_LIBRARY" ]
@@ -234,18 +282,32 @@
   ]
 }
 
+optional("xml") {
+  enabled = skia_use_expat
+  public_defines = []
+
+  configs += skia_library_configs
+  deps = [
+    "//third_party/expat",
+  ]
+  sources = [
+    "src/xml/SkDOM.cpp",
+    "src/xml/SkXMLParser.cpp",
+    "src/xml/SkXMLWriter.cpp",
+  ]
+}
+
 component("skia") {
   public_configs = [ ":skia_public" ]
   configs += skia_library_configs
 
   deps = [
     ":gif",
+    ":jpeg",
+    ":pdf",
+    ":png",
     ":webp",
-    "//third_party/expat",
-    "//third_party/libjpeg-turbo:libjpeg",
-    "//third_party/libpng",
-    "//third_party/sfntly",
-    "//third_party/zlib",
+    ":xml",
   ]
   if (is_x86) {
     deps += [
@@ -267,7 +329,6 @@
   sources += core_gypi.sources
   sources += effects_gypi.sources
   sources += gpu_gypi.skgpu_sources
-  sources += pdf_gypi.sources
   sources += utils_gypi.sources
   sources += [
     "src/android/SkBitmapRegionCodec.cpp",
@@ -279,13 +340,8 @@
     "src/codec/SkBmpStandardCodec.cpp",
     "src/codec/SkCodec.cpp",
     "src/codec/SkCodecImageGenerator.cpp",
-    "src/codec/SkIcoCodec.cpp",
-    "src/codec/SkJpegCodec.cpp",
-    "src/codec/SkJpegDecoderMgr.cpp",
-    "src/codec/SkJpegUtility.cpp",
     "src/codec/SkMaskSwizzler.cpp",
     "src/codec/SkMasks.cpp",
-    "src/codec/SkPngCodec.cpp",
     "src/codec/SkSampledCodec.cpp",
     "src/codec/SkSampler.cpp",
     "src/codec/SkSwizzler.cpp",
@@ -293,10 +349,7 @@
     "src/gpu/gl/GrGLDefaultInterface_native.cpp",
     "src/images/SkImageEncoder.cpp",
     "src/images/SkImageEncoder_Factory.cpp",
-    "src/images/SkJPEGImageEncoder.cpp",
-    "src/images/SkJPEGWriteUtility.cpp",
     "src/images/SkKTXImageEncoder.cpp",
-    "src/images/SkPNGImageEncoder.cpp",
     "src/ports/SkDiscardableMemory_none.cpp",
     "src/ports/SkGlobalInitialization_default.cpp",
     "src/ports/SkImageGenerator_skia.cpp",
@@ -307,9 +360,6 @@
     "src/svg/SkSVGCanvas.cpp",
     "src/svg/SkSVGDevice.cpp",
     "src/utils/mac/SkStream_mac.cpp",
-    "src/xml/SkDOM.cpp",
-    "src/xml/SkXMLParser.cpp",
-    "src/xml/SkXMLWriter.cpp",
     "third_party/etc1/etc1.cpp",
     "third_party/ktx/ktx.cpp",
   ]
diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp
index 0d73ad0..7096933 100644
--- a/src/codec/SkPngCodec.cpp
+++ b/src/codec/SkPngCodec.cpp
@@ -20,6 +20,8 @@
 #include "SkTemplates.h"
 #include "SkUtils.h"
 
+#include "png.h"
+
 // This warning triggers false postives way too often in here.
 #if defined(__GNUC__) && !defined(__clang__)
     #pragma GCC diagnostic ignored "-Wclobbered"
diff --git a/src/codec/SkPngCodec.h b/src/codec/SkPngCodec.h
index aace7b1..7bb833d 100644
--- a/src/codec/SkPngCodec.h
+++ b/src/codec/SkPngCodec.h
@@ -14,7 +14,11 @@
 #include "SkRefCnt.h"
 #include "SkSwizzler.h"
 
-#include "png.h"
+// Instead of including png.h here, forward declare the few types we refer to.
+struct png_struct_def;
+struct png_info_def;
+typedef png_struct_def png_struct;
+typedef png_info_def png_info;
 
 class SkStream;
 
@@ -47,11 +51,11 @@
                          int startRow) = 0;
 
     SkPngCodec(const SkEncodedInfo&, const SkImageInfo&, SkStream*, SkPngChunkReader*,
-            png_structp, png_infop, int, int);
+               png_struct*, png_info*, int, int);
 
     SkAutoTUnref<SkPngChunkReader>     fPngChunkReader;
-    png_structp                        fPng_ptr;
-    png_infop                          fInfo_ptr;
+    png_struct*                        fPng_ptr;
+    png_info*                          fInfo_ptr;
 
     // These are stored here so they can be used both by normal decoding and scanline decoding.
     SkAutoTUnref<SkColorTable>         fColorTable;    // May be unpremul.
diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp
index 887f950..a05462c 100644
--- a/src/pdf/SkPDFFont.cpp
+++ b/src/pdf/SkPDFFont.cpp
@@ -142,9 +142,11 @@
     return !SkToBool(metrics.fFlags & SkAdvancedTypefaceMetrics::kNotEmbeddable_FontFlag);
 }
 
+#ifdef SK_SFNTLY_SUBSETTER
 static bool can_subset(const SkAdvancedTypefaceMetrics& metrics) {
     return !SkToBool(metrics.fFlags & SkAdvancedTypefaceMetrics::kNotSubsettable_FontFlag);
 }
+#endif
 
 int SkPDFFont::glyphsToPDFFontEncoding(SkGlyphID* glyphIDs, int numGlyphs) const {
     // A font with multibyte glyphs will support all glyph IDs in a single font.
@@ -415,7 +417,7 @@
                 return;
             }
 
-            #ifdef SK_SFNTLY_SUBSETTER
+        #ifdef SK_SFNTLY_SUBSETTER
             if (can_subset(metrics)) {
                 // Generate glyph id array. in format needed by sfntly
                 SkTDArray<uint32_t> glyphIDs;
@@ -432,7 +434,7 @@
                 // If subsetting fails, fall back to original font data.
                 fontAsset.reset(face->openStream(&ttcIndex));
             }
-            #endif  // SK_SFNTLY_SUBSETTER
+        #endif  // SK_SFNTLY_SUBSETTER
             auto fontStream = sk_make_sp<SkPDFSharedStream>(std::move(fontAsset));
             fontStream->dict()->insertInt("Length1", fontSize);
             descriptor->insertObjRef("FontFile2", std::move(fontStream));