Index: bench/PDFBench.cpp |
diff --git a/bench/PDFBench.cpp b/bench/PDFBench.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8b9eb520dcb0bbb84e6711fce11a22ff2b914e7a |
--- /dev/null |
+++ b/bench/PDFBench.cpp |
@@ -0,0 +1,120 @@ |
+/* |
+ * Copyright 2016 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "Benchmark.h" |
+#include "Resources.h" |
+#include "SkImage.h" |
+#include "SkPixmap.h" |
+#include "SkData.h" |
+ |
+#if SK_SUPPORT_PDF |
+ |
+#include "SkPDFBitmap.h" |
+ |
+namespace { |
+struct NullWStream : public SkWStream { |
+ NullWStream() : fN(0) {} |
+ bool write(const void*, size_t n) override { fN += n; return true; } |
+ size_t bytesWritten() const override { return fN; } |
+ size_t fN; |
+}; |
+ |
+static void test_pdf_image_serialization(SkImage* img) { |
+ SkAutoTUnref<SkPDFObject> object( |
+ SkPDFCreateBitmapObject(img, nullptr)); |
+ if (!object) { |
+ SkDEBUGFAIL(""); |
+ return; |
+ } |
+ // SkDebugWStream wStream; |
+ NullWStream wStream; |
+ SkPDFSubstituteMap substitutes; |
+ SkPDFObjNumMap objNumMap; |
+ objNumMap.addObjectRecursively(object, substitutes); |
+ for (int i = 0; i < objNumMap.objects().count(); ++i) { |
+ SkPDFObject* object = objNumMap.objects()[i]; |
+ wStream.writeDecAsText(i + 1); |
+ wStream.writeText(" 0 obj\n"); |
+ object->emitObject(&wStream, objNumMap, substitutes); |
+ wStream.writeText("\nendobj\n"); |
+ } |
+} |
+ |
+class PDFImageBench : public Benchmark { |
+public: |
+ PDFImageBench() {} |
+ virtual ~PDFImageBench() {} |
+ |
+protected: |
+ const char* onGetName() override { return "PDFImage"; } |
+ bool isSuitableFor(Backend backend) override { |
+ return backend == kNonRendering_Backend; |
+ } |
+ void onDelayedSetup() override { |
+ SkAutoTUnref<SkImage> img(GetResourceAsImage("color_wheel.png")); |
+ if (img) { |
+ // force decoding, throw away reference to encoded data. |
+ SkAutoPixmapStorage pixmap; |
+ pixmap.alloc(SkImageInfo::MakeN32Premul(img->dimensions())); |
+ if (img->readPixels(pixmap, 0, 0)) { |
+ fImage.reset(SkImage::NewRasterCopy( |
+ pixmap.info(), pixmap.addr(), |
+ pixmap.rowBytes(), pixmap.ctable())); |
+ } |
+ } |
+ } |
+ void onDraw(int loops, SkCanvas*) override { |
+ if (!fImage) { |
+ return; |
+ } |
+ while (loops-- > 0) { |
+ test_pdf_image_serialization(fImage); |
+ } |
+ } |
+ |
+private: |
+ SkAutoTUnref<SkImage> fImage; |
+}; |
+ |
+class PDFJpegImageBench : public Benchmark { |
+public: |
+ PDFJpegImageBench() {} |
+ virtual ~PDFJpegImageBench() {} |
+ |
+protected: |
+ const char* onGetName() override { return "PDFJpegImage"; } |
+ bool isSuitableFor(Backend backend) override { |
+ return backend == kNonRendering_Backend; |
+ } |
+ void onDelayedSetup() override { |
+ SkAutoTUnref<SkImage> img( |
+ GetResourceAsImage("mandrill_512_q075.jpg")); |
+ if (!img) { return; } |
+ SkAutoTUnref<SkData> encoded(img->refEncoded()); |
+ SkASSERT(encoded); |
+ if (!encoded) { return; } |
+ fImage.reset(img.release()); |
+ } |
+ void onDraw(int loops, SkCanvas*) override { |
+ if (!fImage) { |
+ SkDEBUGFAIL(""); |
+ return; |
+ } |
+ while (loops-- > 0) { |
+ test_pdf_image_serialization(fImage); |
+ } |
+ } |
+ |
+private: |
+ SkAutoTUnref<SkImage> fImage; |
+}; |
+ |
+} // namespace |
+DEF_BENCH(return new PDFImageBench;) |
+DEF_BENCH(return new PDFJpegImageBench;) |
+ |
+#endif // SK_SUPPORT_PDF |