blob: 920a02da4ac14017a98cc692dadc4596fcd9e15b [file] [log] [blame]
halcanary1abea462016-02-24 09:25:58 -08001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "Benchmark.h"
9#include "Resources.h"
robertphillipsc5035e72016-03-17 06:58:39 -070010#include "SkAutoPixmapStorage.h"
halcanary1abea462016-02-24 09:25:58 -080011#include "SkData.h"
halcanary1e440512016-02-24 15:17:19 -080012#include "SkImage.h"
halcanary1abea462016-02-24 09:25:58 -080013#include "SkPDFBitmap.h"
halcanarycf430132016-03-09 10:49:23 -080014#include "SkPDFUtils.h"
halcanary1e440512016-02-24 15:17:19 -080015#include "SkPixmap.h"
halcanarycf430132016-03-09 10:49:23 -080016#include "SkRandom.h"
halcanary1abea462016-02-24 09:25:58 -080017
18namespace {
19struct NullWStream : public SkWStream {
20 NullWStream() : fN(0) {}
21 bool write(const void*, size_t n) override { fN += n; return true; }
22 size_t bytesWritten() const override { return fN; }
23 size_t fN;
24};
25
halcanary1e440512016-02-24 15:17:19 -080026static void test_pdf_object_serialization(SkPDFObject* object) {
halcanary1abea462016-02-24 09:25:58 -080027 // SkDebugWStream wStream;
28 NullWStream wStream;
29 SkPDFSubstituteMap substitutes;
30 SkPDFObjNumMap objNumMap;
31 objNumMap.addObjectRecursively(object, substitutes);
32 for (int i = 0; i < objNumMap.objects().count(); ++i) {
33 SkPDFObject* object = objNumMap.objects()[i];
34 wStream.writeDecAsText(i + 1);
35 wStream.writeText(" 0 obj\n");
36 object->emitObject(&wStream, objNumMap, substitutes);
37 wStream.writeText("\nendobj\n");
38 }
39}
40
41class PDFImageBench : public Benchmark {
42public:
43 PDFImageBench() {}
44 virtual ~PDFImageBench() {}
45
46protected:
47 const char* onGetName() override { return "PDFImage"; }
48 bool isSuitableFor(Backend backend) override {
49 return backend == kNonRendering_Backend;
50 }
51 void onDelayedSetup() override {
reed9ce9d672016-03-17 10:51:11 -070052 sk_sp<SkImage> img(GetResourceAsImage("color_wheel.png"));
halcanary1abea462016-02-24 09:25:58 -080053 if (img) {
54 // force decoding, throw away reference to encoded data.
55 SkAutoPixmapStorage pixmap;
56 pixmap.alloc(SkImageInfo::MakeN32Premul(img->dimensions()));
57 if (img->readPixels(pixmap, 0, 0)) {
reed9ce9d672016-03-17 10:51:11 -070058 fImage = SkImage::MakeRasterCopy(pixmap);
halcanary1abea462016-02-24 09:25:58 -080059 }
60 }
61 }
62 void onDraw(int loops, SkCanvas*) override {
63 if (!fImage) {
64 return;
65 }
66 while (loops-- > 0) {
halcanary1e440512016-02-24 15:17:19 -080067 SkAutoTUnref<SkPDFObject> object(
reed9ce9d672016-03-17 10:51:11 -070068 SkPDFCreateBitmapObject(fImage.get(), nullptr));
halcanary1e440512016-02-24 15:17:19 -080069 SkASSERT(object);
70 if (!object) {
71 return;
72 }
73 test_pdf_object_serialization(object);
halcanary1abea462016-02-24 09:25:58 -080074 }
75 }
76
77private:
reed9ce9d672016-03-17 10:51:11 -070078 sk_sp<SkImage> fImage;
halcanary1abea462016-02-24 09:25:58 -080079};
80
81class PDFJpegImageBench : public Benchmark {
82public:
83 PDFJpegImageBench() {}
84 virtual ~PDFJpegImageBench() {}
85
86protected:
87 const char* onGetName() override { return "PDFJpegImage"; }
88 bool isSuitableFor(Backend backend) override {
89 return backend == kNonRendering_Backend;
90 }
91 void onDelayedSetup() override {
reed9ce9d672016-03-17 10:51:11 -070092 sk_sp<SkImage> img(GetResourceAsImage("mandrill_512_q075.jpg"));
halcanary1abea462016-02-24 09:25:58 -080093 if (!img) { return; }
94 SkAutoTUnref<SkData> encoded(img->refEncoded());
95 SkASSERT(encoded);
96 if (!encoded) { return; }
reed9ce9d672016-03-17 10:51:11 -070097 fImage = img;
halcanary1abea462016-02-24 09:25:58 -080098 }
99 void onDraw(int loops, SkCanvas*) override {
100 if (!fImage) {
101 SkDEBUGFAIL("");
102 return;
103 }
104 while (loops-- > 0) {
halcanary1e440512016-02-24 15:17:19 -0800105 SkAutoTUnref<SkPDFObject> object(
reed9ce9d672016-03-17 10:51:11 -0700106 SkPDFCreateBitmapObject(fImage.get(), nullptr));
halcanary1e440512016-02-24 15:17:19 -0800107 SkASSERT(object);
108 if (!object) {
109 return;
110 }
111 test_pdf_object_serialization(object);
halcanary1abea462016-02-24 09:25:58 -0800112 }
113 }
114
115private:
reed9ce9d672016-03-17 10:51:11 -0700116 sk_sp<SkImage> fImage;
halcanary1abea462016-02-24 09:25:58 -0800117};
118
halcanary1e440512016-02-24 15:17:19 -0800119/** Test calling DEFLATE on a 78k PDF command stream. Used for measuring
120 alternate zlib settings, usage, and library versions. */
121class PDFCompressionBench : public Benchmark {
122public:
123 PDFCompressionBench() {}
124 virtual ~PDFCompressionBench() {}
125
126protected:
127 const char* onGetName() override { return "PDFCompression"; }
128 bool isSuitableFor(Backend backend) override {
129 return backend == kNonRendering_Backend;
130 }
131 void onDelayedSetup() override {
132 fAsset.reset(GetResourceAsStream("pdf_command_stream.txt"));
133 }
134 void onDraw(int loops, SkCanvas*) override {
135 SkASSERT(fAsset);
136 if (!fAsset) { return; }
137 while (loops-- > 0) {
138 SkAutoTUnref<SkPDFObject> object(
139 new SkPDFSharedStream(fAsset->duplicate()));
140 test_pdf_object_serialization(object);
141 }
142 }
143
144private:
145 SkAutoTDelete<SkStreamAsset> fAsset;
146};
147
halcanarycf430132016-03-09 10:49:23 -0800148// Test speed of SkPDFUtils::FloatToDecimal for typical floats that
149// might be found in a PDF document.
150struct PDFScalarBench : public Benchmark {
151 bool isSuitableFor(Backend b) override {
152 return b == kNonRendering_Backend;
153 }
154 const char* onGetName() override { return "PDFScalar"; }
155 void onDraw(int loops, SkCanvas*) override {
156 SkRandom random;
157 char dst[SkPDFUtils::kMaximumFloatDecimalLength];
158 while (loops-- > 0) {
159 auto f = random.nextRangeF(-500.0f, 1500.0f);
160 (void)SkPDFUtils::FloatToDecimal(f, dst);
161 }
162 }
163};
164
halcanary1abea462016-02-24 09:25:58 -0800165} // namespace
166DEF_BENCH(return new PDFImageBench;)
167DEF_BENCH(return new PDFJpegImageBench;)
halcanary1e440512016-02-24 15:17:19 -0800168DEF_BENCH(return new PDFCompressionBench;)
halcanarycf430132016-03-09 10:49:23 -0800169DEF_BENCH(return new PDFScalarBench;)