pdfviewer: measure mem usage, command line flags library.

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

git-svn-id: http://skia.googlecode.com/svn/trunk@9996 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp b/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp
index 8bd14cc..bd46577 100644
--- a/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp
+++ b/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.cpp
@@ -416,3 +416,11 @@
     // TODO(edisonn): fix the mess with const, probably we need to remove it pretty much everywhere
     return (SkPdfObject*)ref;
 }
+
+size_t SkNativeParsedPDF::bytesUsed() {
+    return fAllocator->bytesUsed() +
+           fContentLength +
+           fObjects.count() * sizeof(PublicObjectEntry) +
+           fPages.count() * sizeof(SkPdfPageObjectDictionary*) +
+           sizeof(*this);
+}
diff --git a/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.h b/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.h
index f61114b..48442fd 100644
--- a/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.h
+++ b/experimental/PdfViewer/pdfparser/native/SkNativeParsedPDF.h
@@ -17,8 +17,6 @@
 class SkPdfPageObjectDictionary;
 class SkPdfPageTreeNodeDictionary;
 
-
-
 class SkPdfNativeTokenizer;
 
 class SkNativeParsedPDF {
@@ -63,6 +61,9 @@
 
     SkPdfObject* resolveReference(const SkPdfObject* ref);
 
+    // Reports an approximation of all the memory usage.
+    size_t bytesUsed();
+
 private:
 
     unsigned char* readCrossReferenceSection(unsigned char* xrefStart, unsigned char* trailerEnd);
diff --git a/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp b/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp
index 6caca8f..de49e35 100644
--- a/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp
+++ b/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp
@@ -651,6 +651,7 @@
 }
 
 SkPdfObject* SkPdfAllocator::allocBlock() {
+    fSizeInBytes += BUFFER_SIZE * sizeof(SkPdfObject);
     return new SkPdfObject[BUFFER_SIZE];
 }
 
@@ -675,6 +676,7 @@
         fHistory.push(fCurrent);
         fCurrent = allocBlock();
         fCurrentUsed = 0;
+        fSizeInBytes += sizeof(SkPdfObject*);
     }
     fCurrentUsed++;
     return &fCurrent[fCurrentUsed - 1];
diff --git a/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.h b/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.h
index 333d9dc..f544ff3 100644
--- a/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.h
+++ b/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.h
@@ -83,9 +83,11 @@
     int fCurrentUsed;
 
     SkPdfObject* allocBlock();
+    size_t fSizeInBytes;
 
 public:
     SkPdfAllocator() {
+        fSizeInBytes = sizeof(*this);
         fCurrent = allocBlock();
         fCurrentUsed = 0;
     }
@@ -98,8 +100,13 @@
     void* alloc(size_t bytes) {
         void* data = malloc(bytes);
         fHandles.push(data);
+        fSizeInBytes += bytes;
         return data;
     }
+
+    size_t bytesUsed() {
+        return fSizeInBytes;
+    }
 };
 
 class SkNativeParsedPDF;