fix skpdiff viewer bug when using relative paths

BUG=skia:1463
R=djsollen@google.com

Review URL: https://codereview.chromium.org/21601002

git-svn-id: http://skia.googlecode.com/svn/trunk@10515 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tools/skpdiff/SkDiffContext.cpp b/tools/skpdiff/SkDiffContext.cpp
index cf2654a..f551ff3 100644
--- a/tools/skpdiff/SkDiffContext.cpp
+++ b/tools/skpdiff/SkDiffContext.cpp
@@ -164,12 +164,15 @@
     while (NULL != currentRecord) {
         stream.writeText("        {\n");
 
+            SkString baselineAbsPath = get_absolute_path(currentRecord->fBaselinePath);
+            SkString testAbsPath = get_absolute_path(currentRecord->fTestPath);
+
             stream.writeText("            \"baselinePath\": \"");
-            stream.writeText(currentRecord->fBaselinePath.c_str());
+            stream.writeText(baselineAbsPath.c_str());
             stream.writeText("\",\n");
 
             stream.writeText("            \"testPath\": \"");
-            stream.writeText(currentRecord->fTestPath.c_str());
+            stream.writeText(testAbsPath.c_str());
             stream.writeText("\",\n");
 
             stream.writeText("            \"diffs\": [\n");
diff --git a/tools/skpdiff/skpdiff_util.cpp b/tools/skpdiff/skpdiff_util.cpp
index 0047959..5b19c73 100644
--- a/tools/skpdiff/skpdiff_util.cpp
+++ b/tools/skpdiff/skpdiff_util.cpp
@@ -15,10 +15,15 @@
 #   include <glob.h>
 #endif
 
+#if SK_BUILD_FOR_MAC
+#   include <sys/syslimits.h> // PATH_MAX is here for Macs
+#endif
+
 #if SK_BUILD_FOR_WIN32
 #   include <windows.h>
 #endif
 
+#include <stdlib.h>
 #include <time.h>
 #include "SkOSFile.h"
 #include "skpdiff_util.h"
@@ -181,3 +186,21 @@
     return false;
 #endif
 }
+
+SkString get_absolute_path(const SkString& path) {
+#if SK_BUILD_FOR_MAC || SK_BUILD_FOR_UNIX || SK_BUILD_FOR_ANDROID
+    SkString fullPath(PATH_MAX + 1);
+    if (realpath(path.c_str(), fullPath.writable_str()) == NULL) {
+        fullPath.reset();
+    }
+    return fullPath;
+#elif SK_BUILD_FOR_WIN32
+    SkString fullPath(MAX_PATH);
+    if (_fullpath(fullPath.writable_str(), path.c_str(), MAX_PATH) == NULL) {
+        fullPath.reset();
+    }
+    return fullPath;
+#else
+    return SkString();
+#endif
+}
diff --git a/tools/skpdiff/skpdiff_util.h b/tools/skpdiff/skpdiff_util.h
index 9df1bc0..8750bf6 100644
--- a/tools/skpdiff/skpdiff_util.h
+++ b/tools/skpdiff/skpdiff_util.h
@@ -49,5 +49,12 @@
  */
 bool glob_files(const char globPattern[], SkTArray<SkString>* entries);
 
+/**
+ * Gets the absolute version of the given path.
+ * @param  path The absolute or relative path to expand
+ * @return      The absolute path of the given path on success, or an empty string on failure.
+ */
+SkString get_absolute_path(const SkString& path);
+
 
 #endif