blob: f78bd22091983c146ea8c7e6791b57409d52ec22 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "bench/Benchmark.h"
Hal Canary43fb7a02016-12-30 13:09:03 -05009
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "include/core/SkData.h"
11#include "include/core/SkExecutor.h"
12#include "include/core/SkImage.h"
13#include "include/core/SkPixmap.h"
14#include "include/core/SkStream.h"
15#include "include/effects/SkGradientShader.h"
16#include "include/private/SkTo.h"
17#include "include/utils/SkRandom.h"
18#include "src/core/SkAutoPixmapStorage.h"
19#include "src/pdf/SkPDFUnion.h"
20#include "src/utils/SkFloatToDecimal.h"
21#include "tools/Resources.h"
halcanary1abea462016-02-24 09:25:58 -080022
23namespace {
Hal Canary43fb7a02016-12-30 13:09:03 -050024struct WStreamWriteTextBenchmark : public Benchmark {
25 std::unique_ptr<SkWStream> fWStream;
Mike Reed2a65cc02017-03-22 10:01:53 -040026 WStreamWriteTextBenchmark() : fWStream(new SkNullWStream) {}
Hal Canary43fb7a02016-12-30 13:09:03 -050027 const char* onGetName() override { return "WStreamWriteText"; }
28 bool isSuitableFor(Backend backend) override {
29 return backend == kNonRendering_Backend;
30 }
31 void onDraw(int loops, SkCanvas*) override {
32 while (loops-- > 0) {
33 for (int i = 1000; i-- > 0;) {
34 fWStream->writeText("HELLO SKIA!\n");
35 }
36 }
37 }
38};
39} // namespace
40
41DEF_BENCH(return new WStreamWriteTextBenchmark;)
42
Hal Canary3c36ef62018-01-02 16:25:53 -050043// Test speed of SkFloatToDecimal for typical floats that
44// might be found in a PDF document.
45struct PDFScalarBench : public Benchmark {
Hal Canaryb4a8a622018-02-21 15:49:41 -050046 PDFScalarBench(const char* n, float (*f)(SkRandom*)) : fName(n), fNextFloat(f) {}
47 const char* fName;
48 float (*fNextFloat)(SkRandom*);
Hal Canary3c36ef62018-01-02 16:25:53 -050049 bool isSuitableFor(Backend b) override {
50 return b == kNonRendering_Backend;
51 }
Hal Canaryb4a8a622018-02-21 15:49:41 -050052 const char* onGetName() override { return fName; }
Hal Canary3c36ef62018-01-02 16:25:53 -050053 void onDraw(int loops, SkCanvas*) override {
54 SkRandom random;
55 char dst[kMaximumSkFloatToDecimalLength];
56 while (loops-- > 0) {
Hal Canaryb4a8a622018-02-21 15:49:41 -050057 auto f = fNextFloat(&random);
Hal Canary3c36ef62018-01-02 16:25:53 -050058 (void)SkFloatToDecimal(f, dst);
59 }
60 }
61};
62
Hal Canaryb4a8a622018-02-21 15:49:41 -050063float next_common(SkRandom* random) {
64 return random->nextRangeF(-500.0f, 1500.0f);
65}
66float next_any(SkRandom* random) {
67 union { uint32_t u; float f; };
68 u = random->nextU();
69 static_assert(sizeof(float) == sizeof(uint32_t), "");
70 return f;
71}
72
73DEF_BENCH(return new PDFScalarBench("PDFScalar_common", next_common);)
74DEF_BENCH(return new PDFScalarBench("PDFScalar_random", next_any);)
Hal Canary3c36ef62018-01-02 16:25:53 -050075
Hal Canary43fb7a02016-12-30 13:09:03 -050076#ifdef SK_SUPPORT_PDF
77
Mike Kleinc0bd9f92019-04-23 12:05:21 -050078#include "src/pdf/SkPDFBitmap.h"
79#include "src/pdf/SkPDFDocumentPriv.h"
80#include "src/pdf/SkPDFShader.h"
81#include "src/pdf/SkPDFUtils.h"
Hal Canary43fb7a02016-12-30 13:09:03 -050082
83namespace {
halcanary1abea462016-02-24 09:25:58 -080084class PDFImageBench : public Benchmark {
85public:
86 PDFImageBench() {}
Brian Salomond3b65972017-03-22 12:05:03 -040087 ~PDFImageBench() override {}
halcanary1abea462016-02-24 09:25:58 -080088
89protected:
90 const char* onGetName() override { return "PDFImage"; }
91 bool isSuitableFor(Backend backend) override {
92 return backend == kNonRendering_Backend;
93 }
94 void onDelayedSetup() override {
Hal Canaryc465d132017-12-08 10:21:31 -050095 sk_sp<SkImage> img(GetResourceAsImage("images/color_wheel.png"));
halcanary1abea462016-02-24 09:25:58 -080096 if (img) {
97 // force decoding, throw away reference to encoded data.
98 SkAutoPixmapStorage pixmap;
99 pixmap.alloc(SkImageInfo::MakeN32Premul(img->dimensions()));
100 if (img->readPixels(pixmap, 0, 0)) {
reed9ce9d672016-03-17 10:51:11 -0700101 fImage = SkImage::MakeRasterCopy(pixmap);
halcanary1abea462016-02-24 09:25:58 -0800102 }
103 }
104 }
105 void onDraw(int loops, SkCanvas*) override {
106 if (!fImage) {
107 return;
108 }
109 while (loops-- > 0) {
Hal Canarya1211832018-11-13 16:45:14 -0500110 SkNullWStream nullStream;
111 SkPDFDocument doc(&nullStream, SkPDF::Metadata());
112 doc.beginPage(256, 256);
113 (void)SkPDFSerializeImage(fImage.get(), &doc);
halcanary1abea462016-02-24 09:25:58 -0800114 }
115 }
116
117private:
reed9ce9d672016-03-17 10:51:11 -0700118 sk_sp<SkImage> fImage;
halcanary1abea462016-02-24 09:25:58 -0800119};
120
121class PDFJpegImageBench : public Benchmark {
122public:
123 PDFJpegImageBench() {}
Brian Salomond3b65972017-03-22 12:05:03 -0400124 ~PDFJpegImageBench() override {}
halcanary1abea462016-02-24 09:25:58 -0800125
126protected:
127 const char* onGetName() override { return "PDFJpegImage"; }
128 bool isSuitableFor(Backend backend) override {
129 return backend == kNonRendering_Backend;
130 }
131 void onDelayedSetup() override {
Hal Canaryc465d132017-12-08 10:21:31 -0500132 sk_sp<SkImage> img(GetResourceAsImage("images/mandrill_512_q075.jpg"));
halcanary1abea462016-02-24 09:25:58 -0800133 if (!img) { return; }
Mike Reed6409f842017-07-11 16:03:13 -0400134 sk_sp<SkData> encoded = img->refEncodedData();
halcanary1abea462016-02-24 09:25:58 -0800135 SkASSERT(encoded);
136 if (!encoded) { return; }
reed9ce9d672016-03-17 10:51:11 -0700137 fImage = img;
halcanary1abea462016-02-24 09:25:58 -0800138 }
139 void onDraw(int loops, SkCanvas*) override {
140 if (!fImage) {
141 SkDEBUGFAIL("");
142 return;
143 }
144 while (loops-- > 0) {
Hal Canarya1211832018-11-13 16:45:14 -0500145 SkNullWStream nullStream;
146 SkPDFDocument doc(&nullStream, SkPDF::Metadata());
147 doc.beginPage(256, 256);
148 (void)SkPDFSerializeImage(fImage.get(), &doc);
halcanary1abea462016-02-24 09:25:58 -0800149 }
150 }
151
152private:
reed9ce9d672016-03-17 10:51:11 -0700153 sk_sp<SkImage> fImage;
halcanary1abea462016-02-24 09:25:58 -0800154};
155
halcanary1e440512016-02-24 15:17:19 -0800156/** Test calling DEFLATE on a 78k PDF command stream. Used for measuring
157 alternate zlib settings, usage, and library versions. */
158class PDFCompressionBench : public Benchmark {
159public:
160 PDFCompressionBench() {}
Brian Salomond3b65972017-03-22 12:05:03 -0400161 ~PDFCompressionBench() override {}
halcanary1e440512016-02-24 15:17:19 -0800162
163protected:
164 const char* onGetName() override { return "PDFCompression"; }
165 bool isSuitableFor(Backend backend) override {
166 return backend == kNonRendering_Backend;
167 }
168 void onDelayedSetup() override {
Mike Reed71f867c2017-07-23 13:14:10 -0400169 fAsset = GetResourceAsStream("pdf_command_stream.txt");
halcanary1e440512016-02-24 15:17:19 -0800170 }
171 void onDraw(int loops, SkCanvas*) override {
172 SkASSERT(fAsset);
173 if (!fAsset) { return; }
174 while (loops-- > 0) {
Hal Canary9a3f5542018-12-10 19:59:07 -0500175 SkNullWStream wStream;
176 SkPDFDocument doc(&wStream, SkPDF::Metadata());
177 doc.beginPage(256, 256);
178 (void)SkPDFStreamOut(nullptr, fAsset->duplicate(), &doc, true);
179 }
halcanary1e440512016-02-24 15:17:19 -0800180 }
181
182private:
Ben Wagner145dbcd2016-11-03 14:40:50 -0400183 std::unique_ptr<SkStreamAsset> fAsset;
halcanary1e440512016-02-24 15:17:19 -0800184};
185
halcanaryeb92cb32016-07-15 13:41:27 -0700186struct PDFColorComponentBench : public Benchmark {
187 bool isSuitableFor(Backend b) override {
188 return b == kNonRendering_Backend;
189 }
190 const char* onGetName() override { return "PDFColorComponent"; }
191 void onDraw(int loops, SkCanvas*) override {
192 char dst[5];
193 while (loops-- > 0) {
194 for (int i = 0; i < 256; ++i) {
195 (void)SkPDFUtils::ColorToDecimal(SkToU8(i), dst);
196 }
197 }
198 }
199};
200
halcanaryd11c7262016-03-25 05:52:57 -0700201struct PDFShaderBench : public Benchmark {
202 sk_sp<SkShader> fShader;
203 const char* onGetName() final { return "PDFShader"; }
204 bool isSuitableFor(Backend b) final { return b == kNonRendering_Backend; }
205 void onDelayedSetup() final {
206 const SkPoint pts[2] = {{0.0f, 0.0f}, {100.0f, 100.0f}};
207 const SkColor colors[] = {
208 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE,
209 SK_ColorWHITE, SK_ColorBLACK,
210 };
211 fShader = SkGradientShader::MakeLinear(
212 pts, colors, nullptr, SK_ARRAY_COUNT(colors),
Mike Reedfae8fce2019-04-03 10:27:45 -0400213 SkTileMode::kClamp);
halcanaryd11c7262016-03-25 05:52:57 -0700214 }
215 void onDraw(int loops, SkCanvas*) final {
216 SkASSERT(fShader);
217 while (loops-- > 0) {
Mike Reed2a65cc02017-03-22 10:01:53 -0400218 SkNullWStream nullStream;
Hal Canary23564b92018-09-07 14:33:14 -0400219 SkPDFDocument doc(&nullStream, SkPDF::Metadata());
Hal Canary9a3f5542018-12-10 19:59:07 -0500220 doc.beginPage(256, 256);
221 (void) SkPDFMakeShader(&doc, fShader.get(), SkMatrix::I(),
Hal Canaryfcea9a92019-05-30 09:19:53 -0400222 {0, 0, 400, 400}, SkColors::kBlack);
halcanaryd11c7262016-03-25 05:52:57 -0700223 }
224 }
225};
226
halcanaryee41b752016-06-23 14:08:11 -0700227struct WritePDFTextBenchmark : public Benchmark {
228 std::unique_ptr<SkWStream> fWStream;
Mike Reed2a65cc02017-03-22 10:01:53 -0400229 WritePDFTextBenchmark() : fWStream(new SkNullWStream) {}
halcanaryee41b752016-06-23 14:08:11 -0700230 const char* onGetName() override { return "WritePDFText"; }
231 bool isSuitableFor(Backend backend) override {
232 return backend == kNonRendering_Backend;
233 }
234 void onDraw(int loops, SkCanvas*) override {
235 static const char kHello[] = "HELLO SKIA!\n";
236 static const char kBinary[] = "\001\002\003\004\005\006";
237 while (loops-- > 0) {
238 for (int i = 1000; i-- > 0;) {
Hal Canarye650b852018-09-12 09:12:36 -0400239 SkPDFWriteString(fWStream.get(), kHello, strlen(kHello));
240 SkPDFWriteString(fWStream.get(), kBinary, strlen(kBinary));
halcanaryee41b752016-06-23 14:08:11 -0700241 }
242 }
243 }
244};
245
Hal Canaryf1869002019-04-05 11:51:03 -0400246// Test for regression chromium:947381
247// with 5c83ae81aa : 2364.99 microsec
248// without 5c83ae81aa : 302821.78 microsec
249struct PDFClipPathBenchmark : public Benchmark {
250 SkPath fPath;
251 void onDelayedSetup() override {
252 SkBitmap bitmap;
253 bitmap.allocN32Pixels(256, 256);
254 bitmap.eraseColor(SK_ColorWHITE);
255 {
256 SkCanvas tmp(bitmap);
257 SkPaint paint;
258 paint.setAntiAlias(false);
259 paint.setStyle(SkPaint::kStroke_Style);
260 paint.setStrokeWidth(10);
261 for (int r : {20, 40, 60, 80, 100, 120}) {
262 tmp.drawCircle(128, 128, (float)r, paint);
263 }
264 }
265 fPath.reset();
266 for (int y = 0; y < 256; ++y) {
267 SkColor current = bitmap.getColor(0, y);
268 int start = 0;
269 for (int x = 0; x < 256; ++x) {
270 SkColor color = bitmap.getColor(x, y);
271 if (color == current) {
272 continue;
273 }
274 if (color == SK_ColorBLACK) {
275 start = x;
276 } else {
277 fPath.addRect(SkRect::Make(SkIRect{start, y, x, y + 1}));
278 }
279 current = color;
280 }
281 if (current == SK_ColorBLACK) {
282 fPath.addRect(SkRect::Make(SkIRect{start, y, 256, y + 1}));
283 }
284 }
285 }
286 const char* onGetName() override { return "PDFClipPath"; }
287 bool isSuitableFor(Backend backend) override {
288 return backend == kNonRendering_Backend;
289 }
290 void onDraw(int loops, SkCanvas*) override {
291 while (loops-- > 0) {
292 SkNullWStream wStream;
293 SkPDFDocument doc(&wStream, SkPDF::Metadata());
294 SkCanvas* canvas = doc.beginPage(256, 256);
295 canvas->clipPath(fPath);
296 canvas->translate(4.0f/3, 4.0f/3);
297 canvas->clipPath(fPath);
298 canvas->clear(SK_ColorRED);
299 doc.endPage();
300 }
301 }
302};
303
halcanary1abea462016-02-24 09:25:58 -0800304} // namespace
305DEF_BENCH(return new PDFImageBench;)
306DEF_BENCH(return new PDFJpegImageBench;)
halcanary1e440512016-02-24 15:17:19 -0800307DEF_BENCH(return new PDFCompressionBench;)
halcanaryeb92cb32016-07-15 13:41:27 -0700308DEF_BENCH(return new PDFColorComponentBench;)
halcanaryd11c7262016-03-25 05:52:57 -0700309DEF_BENCH(return new PDFShaderBench;)
halcanaryee41b752016-06-23 14:08:11 -0700310DEF_BENCH(return new WritePDFTextBenchmark;)
Hal Canaryf1869002019-04-05 11:51:03 -0400311DEF_BENCH(return new PDFClipPathBenchmark;)
Hal Canary43fb7a02016-12-30 13:09:03 -0500312
Hal Canary28db53d2019-01-09 15:32:35 -0500313#ifdef SK_PDF_ENABLE_SLOW_TESTS
Mike Kleinc0bd9f92019-04-23 12:05:21 -0500314#include "include/core/SkExecutor.h"
Hal Canary9a3f5542018-12-10 19:59:07 -0500315namespace {
Hal Canary28db53d2019-01-09 15:32:35 -0500316void big_pdf_test(SkDocument* doc, const SkBitmap& background) {
Hal Canary9a3f5542018-12-10 19:59:07 -0500317 static const char* kText[] = {
318 "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do",
319 "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad",
320 "minim veniam, quis nostrud exercitation ullamco laboris nisi ut",
321 "aliquip ex ea commodo consequat. Duis aute irure dolor in",
322 "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla",
323 "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in",
324 "culpa qui officia deserunt mollit anim id est laborum.",
325 "",
326 "Sed ut perspiciatis, unde omnis iste natus error sit voluptatem",
327 "accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae",
328 "ab illo inventore veritatis et quasi architecto beatae vitae dicta",
329 "sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit,",
330 "aspernatur aut odit aut fugit, sed quia consequuntur magni dolores",
331 "eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est,",
332 "qui dolorem ipsum, quia dolor sit amet consectetur adipiscing velit,",
333 "sed quia non numquam do eius modi tempora incididunt, ut labore et",
334 "dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam,",
335 "quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi",
336 "ut aliquid ex ea commodi consequatur? Quis autem vel eum iure",
337 "reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae",
338 "consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla",
339 "pariatur?",
340 "",
341 "At vero eos et accusamus et iusto odio dignissimos ducimus, qui",
342 "blanditiis praesentium voluptatum deleniti atque corrupti, quos",
343 "dolores et quas molestias excepturi sint, obcaecati cupiditate non",
344 "provident, similique sunt in culpa, qui officia deserunt mollitia",
345 "animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis",
346 "est et expedita distinctio. Nam libero tempore, cum soluta nobis est",
347 "eligendi optio, cumque nihil impedit, quo minus id, quod maxime",
348 "placeat, facere possimus, omnis voluptas assumenda est, omnis dolor",
349 "repellendus. Temporibus autem quibusdam et aut officiis debitis aut",
350 "rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint",
351 "et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente",
352 "delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut",
353 "perferendis doloribus asperiores repellat",
354 "",
355 "Sed ut perspiciatis, unde omnis iste natus error sit voluptatem",
356 "accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae",
357 "ab illo inventore veritatis et quasi architecto beatae vitae dicta",
358 "sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit,",
359 "aspernatur aut odit aut fugit, sed quia consequuntur magni dolores",
360 "eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est,",
361 "qui dolorem ipsum, quia dolor sit amet consectetur adipiscing velit,",
362 "sed quia non numquam do eius modi tempora incididunt, ut labore et",
363 "dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam,",
364 "quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi",
365 "ut aliquid ex ea commodi consequatur? Quis autem vel eum iure",
366 "reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae",
367 "consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla",
368 "pariatur?",
369 "",
370 };
Hal Canary9a3f5542018-12-10 19:59:07 -0500371 SkCanvas* canvas = nullptr;
372 float x = 36;
373 float y = 36;
374 constexpr size_t kLineCount = SK_ARRAY_COUNT(kText);
375 constexpr int kLoopCount = 200;
Hal Canary28db53d2019-01-09 15:32:35 -0500376 SkFont font;
Hal Canary9a3f5542018-12-10 19:59:07 -0500377 SkPaint paint;
Hal Canary9a3f5542018-12-10 19:59:07 -0500378 for (int loop = 0; loop < kLoopCount; ++loop) {
379 for (size_t line = 0; line < kLineCount; ++line) {
Hal Canary28db53d2019-01-09 15:32:35 -0500380 y += font.getSpacing();
Hal Canary9a3f5542018-12-10 19:59:07 -0500381 if (!canvas || y > 792 - 36) {
Hal Canary28db53d2019-01-09 15:32:35 -0500382 y = 36 + font.getSpacing();
Hal Canary9a3f5542018-12-10 19:59:07 -0500383 canvas = doc->beginPage(612, 792);
384 background.notifyPixelsChanged();
385 canvas->drawBitmap(background, 0, 0);
386 }
Hal Canary28db53d2019-01-09 15:32:35 -0500387 canvas->drawString(kText[line], x, y, font, paint);
Hal Canary9a3f5542018-12-10 19:59:07 -0500388 }
389 }
390}
391
392SkBitmap make_background() {
393 SkBitmap background;
394 SkBitmap bitmap;
395 bitmap.allocN32Pixels(32, 32);
396 bitmap.eraseColor(SK_ColorWHITE);
397 SkCanvas tmp(bitmap);
398 SkPaint gray;
399 gray.setColor(SkColorSetARGB(0xFF, 0xEE, 0xEE, 0xEE));
400 tmp.drawRect({0,0,16,16}, gray);
401 tmp.drawRect({16,16,32,32}, gray);
402 SkPaint shader;
403 shader.setShader(
404 SkShader::MakeBitmapShader(
405 bitmap, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode));
406 background.allocN32Pixels(612, 792);
407 SkCanvas tmp2(background);
408 tmp2.drawPaint(shader);
409 return background;
410}
411
412struct PDFBigDocBench : public Benchmark {
Hal Canary28db53d2019-01-09 15:32:35 -0500413 bool fFast;
Hal Canary9a3f5542018-12-10 19:59:07 -0500414 SkBitmap fBackground;
Hal Canary28db53d2019-01-09 15:32:35 -0500415 std::unique_ptr<SkExecutor> fExecutor;
416 PDFBigDocBench(bool fast) : fFast(fast) {}
417 void onDelayedSetup() override {
418 fBackground = make_background();
419 fExecutor = fFast ? SkExecutor::MakeFIFOThreadPool() : nullptr;
Hal Canary9a3f5542018-12-10 19:59:07 -0500420 }
Hal Canary28db53d2019-01-09 15:32:35 -0500421 const char* onGetName() override {
422 static const char kNameFast[] = "PDFBigDocBench_fast";
423 static const char kNameSlow[] = "PDFBigDocBench_slow";
424 return fFast ? kNameFast : kNameSlow;
425 }
426 bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
Hal Canary9a3f5542018-12-10 19:59:07 -0500427 void onDraw(int loops, SkCanvas*) override {
Hal Canary28db53d2019-01-09 15:32:35 -0500428 while (loops-- > 0) {
429 #ifdef SK_PDF_TEST_BIGDOCBENCH_OUTPUT
430 SkFILEWStream wStream("/tmp/big_pdf.pdf");
431 #else
432 SkNullWStream wStream;
433 #endif
434 SkPDF::Metadata metadata;
435 metadata.fExecutor = fExecutor.get();
Hal Canary3026d4b2019-01-07 10:00:48 -0500436 auto doc = SkPDF::MakeDocument(&wStream, metadata);
Hal Canary28db53d2019-01-09 15:32:35 -0500437 big_pdf_test(doc.get(), fBackground);
438 }
Hal Canary9a3f5542018-12-10 19:59:07 -0500439 }
440};
441} // namespace
Hal Canary28db53d2019-01-09 15:32:35 -0500442DEF_BENCH(return new PDFBigDocBench(false);)
443DEF_BENCH(return new PDFBigDocBench(true);)
Hal Canary43fb7a02016-12-30 13:09:03 -0500444#endif
445
Hal Canary9a3f5542018-12-10 19:59:07 -0500446#endif // SK_SUPPORT_PDF