blob: 7041295f21c6e504ffa2c31f0c031ff7c507e212 [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 Reedac9f0c92020-12-23 10:11:33 -050010#include "include/core/SkBitmap.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkData.h"
12#include "include/core/SkExecutor.h"
13#include "include/core/SkImage.h"
14#include "include/core/SkPixmap.h"
15#include "include/core/SkStream.h"
16#include "include/effects/SkGradientShader.h"
17#include "include/private/SkTo.h"
18#include "include/utils/SkRandom.h"
19#include "src/core/SkAutoPixmapStorage.h"
20#include "src/pdf/SkPDFUnion.h"
21#include "src/utils/SkFloatToDecimal.h"
22#include "tools/Resources.h"
halcanary1abea462016-02-24 09:25:58 -080023
24namespace {
Hal Canary43fb7a02016-12-30 13:09:03 -050025struct WStreamWriteTextBenchmark : public Benchmark {
26 std::unique_ptr<SkWStream> fWStream;
Mike Reed2a65cc02017-03-22 10:01:53 -040027 WStreamWriteTextBenchmark() : fWStream(new SkNullWStream) {}
Hal Canary43fb7a02016-12-30 13:09:03 -050028 const char* onGetName() override { return "WStreamWriteText"; }
29 bool isSuitableFor(Backend backend) override {
30 return backend == kNonRendering_Backend;
31 }
32 void onDraw(int loops, SkCanvas*) override {
33 while (loops-- > 0) {
34 for (int i = 1000; i-- > 0;) {
35 fWStream->writeText("HELLO SKIA!\n");
36 }
37 }
38 }
39};
40} // namespace
41
42DEF_BENCH(return new WStreamWriteTextBenchmark;)
43
Hal Canary3c36ef62018-01-02 16:25:53 -050044// Test speed of SkFloatToDecimal for typical floats that
45// might be found in a PDF document.
46struct PDFScalarBench : public Benchmark {
Hal Canaryb4a8a622018-02-21 15:49:41 -050047 PDFScalarBench(const char* n, float (*f)(SkRandom*)) : fName(n), fNextFloat(f) {}
48 const char* fName;
49 float (*fNextFloat)(SkRandom*);
Hal Canary3c36ef62018-01-02 16:25:53 -050050 bool isSuitableFor(Backend b) override {
51 return b == kNonRendering_Backend;
52 }
Hal Canaryb4a8a622018-02-21 15:49:41 -050053 const char* onGetName() override { return fName; }
Hal Canary3c36ef62018-01-02 16:25:53 -050054 void onDraw(int loops, SkCanvas*) override {
55 SkRandom random;
56 char dst[kMaximumSkFloatToDecimalLength];
57 while (loops-- > 0) {
Hal Canaryb4a8a622018-02-21 15:49:41 -050058 auto f = fNextFloat(&random);
Hal Canary3c36ef62018-01-02 16:25:53 -050059 (void)SkFloatToDecimal(f, dst);
60 }
61 }
62};
63
Hal Canaryb4a8a622018-02-21 15:49:41 -050064float next_common(SkRandom* random) {
65 return random->nextRangeF(-500.0f, 1500.0f);
66}
67float next_any(SkRandom* random) {
68 union { uint32_t u; float f; };
69 u = random->nextU();
70 static_assert(sizeof(float) == sizeof(uint32_t), "");
71 return f;
72}
73
74DEF_BENCH(return new PDFScalarBench("PDFScalar_common", next_common);)
75DEF_BENCH(return new PDFScalarBench("PDFScalar_random", next_any);)
Hal Canary3c36ef62018-01-02 16:25:53 -050076
Hal Canary43fb7a02016-12-30 13:09:03 -050077#ifdef SK_SUPPORT_PDF
78
Mike Kleinc0bd9f92019-04-23 12:05:21 -050079#include "src/pdf/SkPDFBitmap.h"
80#include "src/pdf/SkPDFDocumentPriv.h"
81#include "src/pdf/SkPDFShader.h"
82#include "src/pdf/SkPDFUtils.h"
Hal Canary43fb7a02016-12-30 13:09:03 -050083
84namespace {
halcanary1abea462016-02-24 09:25:58 -080085class PDFImageBench : public Benchmark {
86public:
87 PDFImageBench() {}
Brian Salomond3b65972017-03-22 12:05:03 -040088 ~PDFImageBench() override {}
halcanary1abea462016-02-24 09:25:58 -080089
90protected:
91 const char* onGetName() override { return "PDFImage"; }
92 bool isSuitableFor(Backend backend) override {
93 return backend == kNonRendering_Backend;
94 }
95 void onDelayedSetup() override {
Hal Canaryc465d132017-12-08 10:21:31 -050096 sk_sp<SkImage> img(GetResourceAsImage("images/color_wheel.png"));
halcanary1abea462016-02-24 09:25:58 -080097 if (img) {
98 // force decoding, throw away reference to encoded data.
99 SkAutoPixmapStorage pixmap;
100 pixmap.alloc(SkImageInfo::MakeN32Premul(img->dimensions()));
Adlai Hollerbcfc5542020-08-27 12:44:07 -0400101 if (img->readPixels(nullptr, pixmap, 0, 0)) {
reed9ce9d672016-03-17 10:51:11 -0700102 fImage = SkImage::MakeRasterCopy(pixmap);
halcanary1abea462016-02-24 09:25:58 -0800103 }
104 }
105 }
106 void onDraw(int loops, SkCanvas*) override {
107 if (!fImage) {
108 return;
109 }
110 while (loops-- > 0) {
Hal Canarya1211832018-11-13 16:45:14 -0500111 SkNullWStream nullStream;
112 SkPDFDocument doc(&nullStream, SkPDF::Metadata());
113 doc.beginPage(256, 256);
114 (void)SkPDFSerializeImage(fImage.get(), &doc);
halcanary1abea462016-02-24 09:25:58 -0800115 }
116 }
117
118private:
reed9ce9d672016-03-17 10:51:11 -0700119 sk_sp<SkImage> fImage;
halcanary1abea462016-02-24 09:25:58 -0800120};
121
122class PDFJpegImageBench : public Benchmark {
123public:
124 PDFJpegImageBench() {}
Brian Salomond3b65972017-03-22 12:05:03 -0400125 ~PDFJpegImageBench() override {}
halcanary1abea462016-02-24 09:25:58 -0800126
127protected:
128 const char* onGetName() override { return "PDFJpegImage"; }
129 bool isSuitableFor(Backend backend) override {
130 return backend == kNonRendering_Backend;
131 }
132 void onDelayedSetup() override {
Hal Canaryc465d132017-12-08 10:21:31 -0500133 sk_sp<SkImage> img(GetResourceAsImage("images/mandrill_512_q075.jpg"));
halcanary1abea462016-02-24 09:25:58 -0800134 if (!img) { return; }
Mike Reed6409f842017-07-11 16:03:13 -0400135 sk_sp<SkData> encoded = img->refEncodedData();
halcanary1abea462016-02-24 09:25:58 -0800136 SkASSERT(encoded);
137 if (!encoded) { return; }
reed9ce9d672016-03-17 10:51:11 -0700138 fImage = img;
halcanary1abea462016-02-24 09:25:58 -0800139 }
140 void onDraw(int loops, SkCanvas*) override {
141 if (!fImage) {
142 SkDEBUGFAIL("");
143 return;
144 }
145 while (loops-- > 0) {
Hal Canarya1211832018-11-13 16:45:14 -0500146 SkNullWStream nullStream;
147 SkPDFDocument doc(&nullStream, SkPDF::Metadata());
148 doc.beginPage(256, 256);
149 (void)SkPDFSerializeImage(fImage.get(), &doc);
halcanary1abea462016-02-24 09:25:58 -0800150 }
151 }
152
153private:
reed9ce9d672016-03-17 10:51:11 -0700154 sk_sp<SkImage> fImage;
halcanary1abea462016-02-24 09:25:58 -0800155};
156
halcanary1e440512016-02-24 15:17:19 -0800157/** Test calling DEFLATE on a 78k PDF command stream. Used for measuring
158 alternate zlib settings, usage, and library versions. */
159class PDFCompressionBench : public Benchmark {
160public:
161 PDFCompressionBench() {}
Brian Salomond3b65972017-03-22 12:05:03 -0400162 ~PDFCompressionBench() override {}
halcanary1e440512016-02-24 15:17:19 -0800163
164protected:
165 const char* onGetName() override { return "PDFCompression"; }
166 bool isSuitableFor(Backend backend) override {
167 return backend == kNonRendering_Backend;
168 }
169 void onDelayedSetup() override {
Mike Reed71f867c2017-07-23 13:14:10 -0400170 fAsset = GetResourceAsStream("pdf_command_stream.txt");
halcanary1e440512016-02-24 15:17:19 -0800171 }
172 void onDraw(int loops, SkCanvas*) override {
173 SkASSERT(fAsset);
174 if (!fAsset) { return; }
175 while (loops-- > 0) {
Hal Canary9a3f5542018-12-10 19:59:07 -0500176 SkNullWStream wStream;
177 SkPDFDocument doc(&wStream, SkPDF::Metadata());
178 doc.beginPage(256, 256);
179 (void)SkPDFStreamOut(nullptr, fAsset->duplicate(), &doc, true);
180 }
halcanary1e440512016-02-24 15:17:19 -0800181 }
182
183private:
Ben Wagner145dbcd2016-11-03 14:40:50 -0400184 std::unique_ptr<SkStreamAsset> fAsset;
halcanary1e440512016-02-24 15:17:19 -0800185};
186
halcanaryeb92cb32016-07-15 13:41:27 -0700187struct PDFColorComponentBench : public Benchmark {
188 bool isSuitableFor(Backend b) override {
189 return b == kNonRendering_Backend;
190 }
191 const char* onGetName() override { return "PDFColorComponent"; }
192 void onDraw(int loops, SkCanvas*) override {
193 char dst[5];
194 while (loops-- > 0) {
195 for (int i = 0; i < 256; ++i) {
196 (void)SkPDFUtils::ColorToDecimal(SkToU8(i), dst);
197 }
198 }
199 }
200};
201
halcanaryd11c7262016-03-25 05:52:57 -0700202struct PDFShaderBench : public Benchmark {
203 sk_sp<SkShader> fShader;
204 const char* onGetName() final { return "PDFShader"; }
205 bool isSuitableFor(Backend b) final { return b == kNonRendering_Backend; }
206 void onDelayedSetup() final {
207 const SkPoint pts[2] = {{0.0f, 0.0f}, {100.0f, 100.0f}};
208 const SkColor colors[] = {
209 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE,
210 SK_ColorWHITE, SK_ColorBLACK,
211 };
212 fShader = SkGradientShader::MakeLinear(
213 pts, colors, nullptr, SK_ARRAY_COUNT(colors),
Mike Reedfae8fce2019-04-03 10:27:45 -0400214 SkTileMode::kClamp);
halcanaryd11c7262016-03-25 05:52:57 -0700215 }
216 void onDraw(int loops, SkCanvas*) final {
217 SkASSERT(fShader);
218 while (loops-- > 0) {
Mike Reed2a65cc02017-03-22 10:01:53 -0400219 SkNullWStream nullStream;
Hal Canary23564b92018-09-07 14:33:14 -0400220 SkPDFDocument doc(&nullStream, SkPDF::Metadata());
Hal Canary9a3f5542018-12-10 19:59:07 -0500221 doc.beginPage(256, 256);
222 (void) SkPDFMakeShader(&doc, fShader.get(), SkMatrix::I(),
Hal Canaryfcea9a92019-05-30 09:19:53 -0400223 {0, 0, 400, 400}, SkColors::kBlack);
halcanaryd11c7262016-03-25 05:52:57 -0700224 }
225 }
226};
227
halcanaryee41b752016-06-23 14:08:11 -0700228struct WritePDFTextBenchmark : public Benchmark {
229 std::unique_ptr<SkWStream> fWStream;
Mike Reed2a65cc02017-03-22 10:01:53 -0400230 WritePDFTextBenchmark() : fWStream(new SkNullWStream) {}
halcanaryee41b752016-06-23 14:08:11 -0700231 const char* onGetName() override { return "WritePDFText"; }
232 bool isSuitableFor(Backend backend) override {
233 return backend == kNonRendering_Backend;
234 }
235 void onDraw(int loops, SkCanvas*) override {
236 static const char kHello[] = "HELLO SKIA!\n";
237 static const char kBinary[] = "\001\002\003\004\005\006";
238 while (loops-- > 0) {
239 for (int i = 1000; i-- > 0;) {
Hal Canarye650b852018-09-12 09:12:36 -0400240 SkPDFWriteString(fWStream.get(), kHello, strlen(kHello));
241 SkPDFWriteString(fWStream.get(), kBinary, strlen(kBinary));
halcanaryee41b752016-06-23 14:08:11 -0700242 }
243 }
244 }
245};
246
Hal Canaryf1869002019-04-05 11:51:03 -0400247// Test for regression chromium:947381
248// with 5c83ae81aa : 2364.99 microsec
249// without 5c83ae81aa : 302821.78 microsec
250struct PDFClipPathBenchmark : public Benchmark {
251 SkPath fPath;
252 void onDelayedSetup() override {
253 SkBitmap bitmap;
254 bitmap.allocN32Pixels(256, 256);
255 bitmap.eraseColor(SK_ColorWHITE);
256 {
257 SkCanvas tmp(bitmap);
258 SkPaint paint;
259 paint.setAntiAlias(false);
260 paint.setStyle(SkPaint::kStroke_Style);
261 paint.setStrokeWidth(10);
262 for (int r : {20, 40, 60, 80, 100, 120}) {
263 tmp.drawCircle(128, 128, (float)r, paint);
264 }
265 }
266 fPath.reset();
267 for (int y = 0; y < 256; ++y) {
268 SkColor current = bitmap.getColor(0, y);
269 int start = 0;
270 for (int x = 0; x < 256; ++x) {
271 SkColor color = bitmap.getColor(x, y);
272 if (color == current) {
273 continue;
274 }
275 if (color == SK_ColorBLACK) {
276 start = x;
277 } else {
278 fPath.addRect(SkRect::Make(SkIRect{start, y, x, y + 1}));
279 }
280 current = color;
281 }
282 if (current == SK_ColorBLACK) {
283 fPath.addRect(SkRect::Make(SkIRect{start, y, 256, y + 1}));
284 }
285 }
286 }
287 const char* onGetName() override { return "PDFClipPath"; }
288 bool isSuitableFor(Backend backend) override {
289 return backend == kNonRendering_Backend;
290 }
291 void onDraw(int loops, SkCanvas*) override {
292 while (loops-- > 0) {
293 SkNullWStream wStream;
294 SkPDFDocument doc(&wStream, SkPDF::Metadata());
295 SkCanvas* canvas = doc.beginPage(256, 256);
296 canvas->clipPath(fPath);
297 canvas->translate(4.0f/3, 4.0f/3);
298 canvas->clipPath(fPath);
299 canvas->clear(SK_ColorRED);
300 doc.endPage();
301 }
302 }
303};
304
halcanary1abea462016-02-24 09:25:58 -0800305} // namespace
306DEF_BENCH(return new PDFImageBench;)
307DEF_BENCH(return new PDFJpegImageBench;)
halcanary1e440512016-02-24 15:17:19 -0800308DEF_BENCH(return new PDFCompressionBench;)
halcanaryeb92cb32016-07-15 13:41:27 -0700309DEF_BENCH(return new PDFColorComponentBench;)
halcanaryd11c7262016-03-25 05:52:57 -0700310DEF_BENCH(return new PDFShaderBench;)
halcanaryee41b752016-06-23 14:08:11 -0700311DEF_BENCH(return new WritePDFTextBenchmark;)
Hal Canaryf1869002019-04-05 11:51:03 -0400312DEF_BENCH(return new PDFClipPathBenchmark;)
Hal Canary43fb7a02016-12-30 13:09:03 -0500313
Hal Canary28db53d2019-01-09 15:32:35 -0500314#ifdef SK_PDF_ENABLE_SLOW_TESTS
Mike Kleinc0bd9f92019-04-23 12:05:21 -0500315#include "include/core/SkExecutor.h"
Hal Canary9a3f5542018-12-10 19:59:07 -0500316namespace {
Hal Canary28db53d2019-01-09 15:32:35 -0500317void big_pdf_test(SkDocument* doc, const SkBitmap& background) {
Hal Canary9a3f5542018-12-10 19:59:07 -0500318 static const char* kText[] = {
319 "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do",
320 "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad",
321 "minim veniam, quis nostrud exercitation ullamco laboris nisi ut",
322 "aliquip ex ea commodo consequat. Duis aute irure dolor in",
323 "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla",
324 "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in",
325 "culpa qui officia deserunt mollit anim id est laborum.",
326 "",
327 "Sed ut perspiciatis, unde omnis iste natus error sit voluptatem",
328 "accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae",
329 "ab illo inventore veritatis et quasi architecto beatae vitae dicta",
330 "sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit,",
331 "aspernatur aut odit aut fugit, sed quia consequuntur magni dolores",
332 "eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est,",
333 "qui dolorem ipsum, quia dolor sit amet consectetur adipiscing velit,",
334 "sed quia non numquam do eius modi tempora incididunt, ut labore et",
335 "dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam,",
336 "quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi",
337 "ut aliquid ex ea commodi consequatur? Quis autem vel eum iure",
338 "reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae",
339 "consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla",
340 "pariatur?",
341 "",
342 "At vero eos et accusamus et iusto odio dignissimos ducimus, qui",
343 "blanditiis praesentium voluptatum deleniti atque corrupti, quos",
344 "dolores et quas molestias excepturi sint, obcaecati cupiditate non",
345 "provident, similique sunt in culpa, qui officia deserunt mollitia",
346 "animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis",
347 "est et expedita distinctio. Nam libero tempore, cum soluta nobis est",
348 "eligendi optio, cumque nihil impedit, quo minus id, quod maxime",
349 "placeat, facere possimus, omnis voluptas assumenda est, omnis dolor",
350 "repellendus. Temporibus autem quibusdam et aut officiis debitis aut",
351 "rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint",
352 "et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente",
353 "delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut",
354 "perferendis doloribus asperiores repellat",
355 "",
356 "Sed ut perspiciatis, unde omnis iste natus error sit voluptatem",
357 "accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae",
358 "ab illo inventore veritatis et quasi architecto beatae vitae dicta",
359 "sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit,",
360 "aspernatur aut odit aut fugit, sed quia consequuntur magni dolores",
361 "eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est,",
362 "qui dolorem ipsum, quia dolor sit amet consectetur adipiscing velit,",
363 "sed quia non numquam do eius modi tempora incididunt, ut labore et",
364 "dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam,",
365 "quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi",
366 "ut aliquid ex ea commodi consequatur? Quis autem vel eum iure",
367 "reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae",
368 "consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla",
369 "pariatur?",
370 "",
371 };
Hal Canary9a3f5542018-12-10 19:59:07 -0500372 SkCanvas* canvas = nullptr;
373 float x = 36;
374 float y = 36;
375 constexpr size_t kLineCount = SK_ARRAY_COUNT(kText);
376 constexpr int kLoopCount = 200;
Hal Canary28db53d2019-01-09 15:32:35 -0500377 SkFont font;
Hal Canary9a3f5542018-12-10 19:59:07 -0500378 SkPaint paint;
Hal Canary9a3f5542018-12-10 19:59:07 -0500379 for (int loop = 0; loop < kLoopCount; ++loop) {
380 for (size_t line = 0; line < kLineCount; ++line) {
Hal Canary28db53d2019-01-09 15:32:35 -0500381 y += font.getSpacing();
Hal Canary9a3f5542018-12-10 19:59:07 -0500382 if (!canvas || y > 792 - 36) {
Hal Canary28db53d2019-01-09 15:32:35 -0500383 y = 36 + font.getSpacing();
Hal Canary9a3f5542018-12-10 19:59:07 -0500384 canvas = doc->beginPage(612, 792);
385 background.notifyPixelsChanged();
386 canvas->drawBitmap(background, 0, 0);
387 }
Hal Canary28db53d2019-01-09 15:32:35 -0500388 canvas->drawString(kText[line], x, y, font, paint);
Hal Canary9a3f5542018-12-10 19:59:07 -0500389 }
390 }
391}
392
393SkBitmap make_background() {
394 SkBitmap background;
395 SkBitmap bitmap;
396 bitmap.allocN32Pixels(32, 32);
397 bitmap.eraseColor(SK_ColorWHITE);
398 SkCanvas tmp(bitmap);
399 SkPaint gray;
400 gray.setColor(SkColorSetARGB(0xFF, 0xEE, 0xEE, 0xEE));
401 tmp.drawRect({0,0,16,16}, gray);
402 tmp.drawRect({16,16,32,32}, gray);
403 SkPaint shader;
404 shader.setShader(
405 SkShader::MakeBitmapShader(
406 bitmap, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode));
407 background.allocN32Pixels(612, 792);
408 SkCanvas tmp2(background);
409 tmp2.drawPaint(shader);
410 return background;
411}
412
413struct PDFBigDocBench : public Benchmark {
Hal Canary28db53d2019-01-09 15:32:35 -0500414 bool fFast;
Hal Canary9a3f5542018-12-10 19:59:07 -0500415 SkBitmap fBackground;
Hal Canary28db53d2019-01-09 15:32:35 -0500416 std::unique_ptr<SkExecutor> fExecutor;
417 PDFBigDocBench(bool fast) : fFast(fast) {}
418 void onDelayedSetup() override {
419 fBackground = make_background();
420 fExecutor = fFast ? SkExecutor::MakeFIFOThreadPool() : nullptr;
Hal Canary9a3f5542018-12-10 19:59:07 -0500421 }
Hal Canary28db53d2019-01-09 15:32:35 -0500422 const char* onGetName() override {
423 static const char kNameFast[] = "PDFBigDocBench_fast";
424 static const char kNameSlow[] = "PDFBigDocBench_slow";
425 return fFast ? kNameFast : kNameSlow;
426 }
427 bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
Hal Canary9a3f5542018-12-10 19:59:07 -0500428 void onDraw(int loops, SkCanvas*) override {
Hal Canary28db53d2019-01-09 15:32:35 -0500429 while (loops-- > 0) {
430 #ifdef SK_PDF_TEST_BIGDOCBENCH_OUTPUT
431 SkFILEWStream wStream("/tmp/big_pdf.pdf");
432 #else
433 SkNullWStream wStream;
434 #endif
435 SkPDF::Metadata metadata;
436 metadata.fExecutor = fExecutor.get();
Hal Canary3026d4b2019-01-07 10:00:48 -0500437 auto doc = SkPDF::MakeDocument(&wStream, metadata);
Hal Canary28db53d2019-01-09 15:32:35 -0500438 big_pdf_test(doc.get(), fBackground);
439 }
Hal Canary9a3f5542018-12-10 19:59:07 -0500440 }
441};
442} // namespace
Hal Canary28db53d2019-01-09 15:32:35 -0500443DEF_BENCH(return new PDFBigDocBench(false);)
444DEF_BENCH(return new PDFBigDocBench(true);)
Hal Canary43fb7a02016-12-30 13:09:03 -0500445#endif
446
Hal Canary9a3f5542018-12-10 19:59:07 -0500447#endif // SK_SUPPORT_PDF