Viewer builds (for Windows) with GN

BUG=skia:

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

Change-Id: Id6a142f90f544bef266d78e385f22e17288d5064
Reviewed-on: https://skia-review.googlesource.com/3599
Reviewed-by: Mike Klein <mtklein@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index 7308fa1..3f976f8 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -905,6 +905,79 @@
     ]
   }
 
+  test_lib("views") {
+    public_include_dirs = [ "include/views" ]
+    sources = [
+      "src/views/SkEvent.cpp",
+      "src/views/SkEventSink.cpp",
+      "src/views/SkOSMenu.cpp",
+      "src/views/SkTagList.cpp",
+      "src/views/SkTouchGesture.cpp",
+      "src/views/SkView.cpp",
+      "src/views/SkViewPriv.cpp",
+    ]
+    libs = []
+    if (!is_android) {
+      sources += [ "src/views/SkWindow.cpp" ]
+    }
+    if (is_android) {
+    } else if (is_linux) {
+      sources += [ "src/views/unix/SkOSWindow_Unix.cpp" ]
+    } else if (is_mac) {
+      sources += [
+        "src/views/mac/SkEventNotifier.mm",
+        "src/views/mac/SkNSView.mm",
+        "src/views/mac/SkOSWindow_Mac.mm",
+        "src/views/mac/SkTextFieldCell.m",
+      ]
+      libs += [
+        "QuartzCore.framework",
+        "Cocoa.framework",
+        "Foundation.framework",
+      ]
+    } else if (is_win) {
+      sources += [ "src/views/win/SkOSWindow_win.cpp" ]
+    }
+  }
+
+  sample_sources = exec_script("gyp/find.py",
+                               [
+                                 "*.c*",
+                                 rebase_path("samplecode"),
+                               ],
+                               "list lines",
+                               [])
+
+  test_lib("samples") {
+    include_dirs = [ "experimental" ]
+    public_include_dirs = [ "samplecode" ]
+    sources = sample_sources
+    sources -= [
+      rebase_path("samplecode/SampleAnimator.cpp"),  # relies on animator
+      rebase_path("samplecode/SampleApp.cpp"),  # part of SampleApp exe, not samples lib
+      rebase_path("samplecode/SampleClamp.cpp"),
+      rebase_path("samplecode/SampleDash.cpp"),
+      rebase_path("samplecode/SampleLua.cpp"),  # no Lua yet in GN
+      rebase_path("samplecode/SamplePathFill.cpp"),
+      rebase_path("samplecode/SamplePictFile.cpp"),  # relies on SK_SUPPORT_LEGACY_DRAWFILTER
+      rebase_path("samplecode/SampleSkLayer.cpp"),  # relies on SkMatrix44 which doesn't compile?
+      rebase_path("samplecode/SampleFontCache.cpp"),  # relies on pthread.h
+    ]
+    sources += [
+      "experimental/SkPerlinNoiseShader2/SkPerlinNoiseShader2.cpp",
+      "experimental/SkSetPoly3To3.cpp",
+      "experimental/SkSetPoly3To3_A.cpp",
+      "experimental/SkSetPoly3To3_D.cpp",
+    ]
+    deps = [
+      ":experimental_svg_model",
+      ":gm",  # Why does SampleFilterQuality.cpp include gm.h ???
+      ":tool_utils",
+      ":views",
+      ":xml",
+    ]
+  }
+
   executable("dm") {
     sources = [
       "dm/DM.cpp",
@@ -1096,4 +1169,49 @@
     ]
     testonly = true
   }
+
+  if (is_win) {
+    executable("viewer") {
+      sources = [
+        "tools/viewer/GMSlide.cpp",
+        "tools/viewer/ImageSlide.cpp",
+        "tools/viewer/SKPSlide.cpp",
+        "tools/viewer/SampleSlide.cpp",
+        "tools/viewer/Viewer.cpp",
+        "tools/viewer/sk_app/CommandSet.cpp",
+        "tools/viewer/sk_app/GLWindowContext.cpp",
+        "tools/viewer/sk_app/Window.cpp",
+        "tools/viewer/sk_app/WindowContext.cpp",
+      ]
+
+      if (is_win) {
+        sources += [
+          "tools/viewer/sk_app/win/GLWindowContext_win.cpp",
+          "tools/viewer/sk_app/win/RasterWindowContext_win.cpp",
+          "tools/viewer/sk_app/win/Window_win.cpp",
+          "tools/viewer/sk_app/win/main_win.cpp",
+        ]
+      }
+
+      if (skia_use_vulkan) {
+        sources += [ "tools/viewer/sk_app/VulkanWindowContext.cpp" ]
+        if (is_win) {
+          sources += [ "tools/viewer/sk_app/win/VulkanWindowContext_win.cpp" ]
+        }
+      }
+
+      include_dirs = []
+      deps = [
+        ":flags",
+        ":gm",
+        ":gpu_tool_utils",
+        ":samples",
+        ":skia",
+        ":tool_utils",
+        ":views",
+        "//third_party/jsoncpp",
+      ]
+      testonly = true
+    }
+  }
 }
diff --git a/gyp/viewer.gyp b/gyp/viewer.gyp
index 4317b8a..033232a 100644
--- a/gyp/viewer.gyp
+++ b/gyp/viewer.gyp
@@ -52,6 +52,7 @@
       ],
       'dependencies': [
         'flags.gyp:flags',
+        'flags.gyp:flags_common',
         'gputest.gyp:skgputest',
         'jsoncpp.gyp:jsoncpp',
         'skia_lib.gyp:skia_lib',
diff --git a/include/views/SkWindow.h b/include/views/SkWindow.h
index 1c4b5ae..e34bbb6 100644
--- a/include/views/SkWindow.h
+++ b/include/views/SkWindow.h
@@ -93,8 +93,8 @@
     virtual bool onHandleChar(SkUnichar);
     virtual bool onHandleKey(SkKey);
     virtual bool onHandleKeyUp(SkKey);
-    virtual void onAddMenu(const SkOSMenu*) {};
-    virtual void onUpdateMenu(const SkOSMenu*) {};
+    virtual void onAddMenu(const SkOSMenu*) {}
+    virtual void onUpdateMenu(const SkOSMenu*) {}
     virtual void onSetTitle(const char title[]) {}
 
     // overrides from SkView
diff --git a/samplecode/SampleAAGeometry.cpp b/samplecode/SampleAAGeometry.cpp
index 4b7a374..506b1bc 100644
--- a/samplecode/SampleAAGeometry.cpp
+++ b/samplecode/SampleAAGeometry.cpp
@@ -940,7 +940,7 @@
         SET_CONTROL(Res);
         SET_CONTROL(Filter);
         SET_CONTROL(Weight);
-    };
+    }
     
     #undef SET_CONTROL
 
diff --git a/samplecode/SampleBevel.cpp b/samplecode/SampleBevel.cpp
index cbeb249..fce8885 100644
--- a/samplecode/SampleBevel.cpp
+++ b/samplecode/SampleBevel.cpp
@@ -105,11 +105,11 @@
 
     // Overriden by sub-class to handle clicks. Do not call directly, click() modulates by relative
     // position. Return true if holding mouse capture
-    virtual bool onClick(const SkPoint& clickPos) { return false; };
+    virtual bool onClick(const SkPoint& clickPos) { return false; }
 
     // Overriden by sub-classes with controls. Should return true if clickPos lands inside a control
     // region, to enable mouse caputre.
-    virtual bool onIsInCtrlRegion(const SkPoint& clickPos) const { return false; };
+    virtual bool onIsInCtrlRegion(const SkPoint& clickPos) const { return false; }
 
     // The position of the control relative to it's parent
     SkPoint fRelativePos;
diff --git a/samplecode/SampleText.cpp b/samplecode/SampleText.cpp
index ca09cc7..730c47c 100644
--- a/samplecode/SampleText.cpp
+++ b/samplecode/SampleText.cpp
@@ -47,7 +47,8 @@
         SkScalar xpos = x;
         SkASSERT(length <= SK_ARRAY_COUNT(pts));
         for (size_t i = 0; i < length; i++) {
-            pts[i].set(xpos, y), xpos += paint.getTextSize();
+            pts[i].set(xpos, y);
+            xpos += paint.getTextSize();
         }
         canvas->drawPosText(text, length, pts, paint);
     }
diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp
index 99570a2..84b1eea 100644
--- a/tools/viewer/Viewer.cpp
+++ b/tools/viewer/Viewer.cpp
@@ -50,7 +50,8 @@
 }
 
 DEFINE_bool2(fullscreen, f, true, "Run fullscreen.");
-DEFINE_string(key, "", "Space-separated key/value pairs to add to JSON identifying this builder.");
+
+static
 DEFINE_string2(match, m, nullptr,
                "[~][^]substring[$] [...] of bench name to run.\n"
                "Multiple matches may be separated by spaces.\n"
@@ -68,9 +69,11 @@
 #endif
 
 #ifdef SK_BUILD_FOR_ANDROID
+static
 DEFINE_string(skps, "/data/local/tmp/skia", "Directory to read skps from.");
 DEFINE_string(jpgs, "/data/local/tmp/skia", "Directory to read jpgs from.");
 #else
+static
 DEFINE_string(skps, "skps", "Directory to read skps from.");
 DEFINE_string(jpgs, "jpgs", "Directory to read jpgs from.");
 #endif