Merge cherrypicks of [2461233, 2461302, 2461279, 2461176, 2461341, 2461280, 2461290, 2461342, 2461291, 2461216, 2461217, 2461304, 2461306, 2461381, 2461307, 2461234, 2461195, 2461308, 2461362, 2461235, 2461218, 2461363, 2461323, 2461382, 2461345] into oc-release

Change-Id: I742af6b7f49c6f1a7111a07c305da76336a21feb
diff --git a/src/ports/SkOSFile_posix.cpp b/src/ports/SkOSFile_posix.cpp
index 4002824..48b5b95 100644
--- a/src/ports/SkOSFile_posix.cpp
+++ b/src/ports/SkOSFile_posix.cpp
@@ -19,25 +19,6 @@
 #include <sys/types.h>
 #include <unistd.h>
 
-size_t sk_fgetsize(FILE* f) {
-    int fd = fileno(f);
-    if (fd < 0) {
-        return 0;
-    }
-
-    struct stat status;
-    if (0 != fstat(fd, &status)) {
-        return 0;
-    }
-    if (!S_ISREG(status.st_mode)) {
-        return 0;
-    }
-    if (!SkTFitsIn<size_t>(status.st_size)) {
-        return 0;
-    }
-    return static_cast<size_t>(status.st_size);
-}
-
 bool sk_exists(const char *path, SkFILE_Flags flags) {
     int mode = F_OK;
     if (flags & kRead_SkFILE_Flag) {
diff --git a/src/ports/SkOSFile_stdio.cpp b/src/ports/SkOSFile_stdio.cpp
index e79d87f..68c2d3d 100644
--- a/src/ports/SkOSFile_stdio.cpp
+++ b/src/ports/SkOSFile_stdio.cpp
@@ -87,6 +87,24 @@
     return file;
 }
 
+size_t sk_fgetsize(FILE* f) {
+    SkASSERT(f);
+
+    long curr = ftell(f); // remember where we are
+    if (curr < 0) {
+        return 0;
+    }
+
+    fseek(f, 0, SEEK_END); // go to the end
+    long size = ftell(f); // record the size
+    if (size < 0) {
+        size = 0;
+    }
+
+    fseek(f, curr, SEEK_SET); // go back to our prev location
+    return size;
+}
+
 size_t sk_fwrite(const void* buffer, size_t byteCount, FILE* f) {
     SkASSERT(f);
     return fwrite(buffer, 1, byteCount, f);
diff --git a/src/ports/SkOSFile_win.cpp b/src/ports/SkOSFile_win.cpp
index e66bcb8..7e194cf 100644
--- a/src/ports/SkOSFile_win.cpp
+++ b/src/ports/SkOSFile_win.cpp
@@ -17,27 +17,6 @@
 #include <stdio.h>
 #include <sys/stat.h>
 
-size_t sk_fgetsize(FILE* f) {
-    int fileno = sk_fileno(f);
-    if (fileno < 0) {
-        return 0;
-    }
-
-    HANDLE file = (HANDLE)_get_osfhandle(fileno);
-    if (INVALID_HANDLE_VALUE == file) {
-        return 0;
-    }
-
-    LARGE_INTEGER fileSize;
-    if (0 == GetFileSizeEx(file, &fileSize)) {
-        return 0;
-    }
-    if (!SkTFitsIn<size_t>(fileSize.QuadPart)) {
-        return 0;
-    }
-    return static_cast<size_t>(fileSize.QuadPart);
-}
-
 bool sk_exists(const char *path, SkFILE_Flags flags) {
     int mode = 0; // existence
     if (flags & kRead_SkFILE_Flag) {