1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2016 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "bench/Benchmark.h"
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h"
11cb93a386Sopenharmony_ci#include "include/core/SkData.h"
12cb93a386Sopenharmony_ci#include "include/core/SkExecutor.h"
13cb93a386Sopenharmony_ci#include "include/core/SkImage.h"
14cb93a386Sopenharmony_ci#include "include/core/SkPixmap.h"
15cb93a386Sopenharmony_ci#include "include/core/SkStream.h"
16cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h"
17cb93a386Sopenharmony_ci#include "include/private/SkTo.h"
18cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h"
19cb93a386Sopenharmony_ci#include "src/core/SkAutoPixmapStorage.h"
20cb93a386Sopenharmony_ci#include "src/pdf/SkPDFUnion.h"
21cb93a386Sopenharmony_ci#include "src/utils/SkFloatToDecimal.h"
22cb93a386Sopenharmony_ci#include "tools/Resources.h"
23cb93a386Sopenharmony_ci
24cb93a386Sopenharmony_cinamespace {
25cb93a386Sopenharmony_cistruct WStreamWriteTextBenchmark : public Benchmark {
26cb93a386Sopenharmony_ci    std::unique_ptr<SkWStream> fWStream;
27cb93a386Sopenharmony_ci    WStreamWriteTextBenchmark() : fWStream(new SkNullWStream) {}
28cb93a386Sopenharmony_ci    const char* onGetName() override { return "WStreamWriteText"; }
29cb93a386Sopenharmony_ci    bool isSuitableFor(Backend backend) override {
30cb93a386Sopenharmony_ci        return backend == kNonRendering_Backend;
31cb93a386Sopenharmony_ci    }
32cb93a386Sopenharmony_ci    void onDraw(int loops, SkCanvas*) override {
33cb93a386Sopenharmony_ci        while (loops-- > 0) {
34cb93a386Sopenharmony_ci            for (int i = 1000; i-- > 0;) {
35cb93a386Sopenharmony_ci                fWStream->writeText("HELLO SKIA!\n");
36cb93a386Sopenharmony_ci            }
37cb93a386Sopenharmony_ci        }
38cb93a386Sopenharmony_ci    }
39cb93a386Sopenharmony_ci};
40cb93a386Sopenharmony_ci}  // namespace
41cb93a386Sopenharmony_ci
42cb93a386Sopenharmony_ciDEF_BENCH(return new WStreamWriteTextBenchmark;)
43cb93a386Sopenharmony_ci
44cb93a386Sopenharmony_ci// Test speed of SkFloatToDecimal for typical floats that
45cb93a386Sopenharmony_ci// might be found in a PDF document.
46cb93a386Sopenharmony_cistruct PDFScalarBench : public Benchmark {
47cb93a386Sopenharmony_ci    PDFScalarBench(const char* n, float (*f)(SkRandom*)) : fName(n), fNextFloat(f) {}
48cb93a386Sopenharmony_ci    const char* fName;
49cb93a386Sopenharmony_ci    float (*fNextFloat)(SkRandom*);
50cb93a386Sopenharmony_ci    bool isSuitableFor(Backend b) override {
51cb93a386Sopenharmony_ci        return b == kNonRendering_Backend;
52cb93a386Sopenharmony_ci    }
53cb93a386Sopenharmony_ci    const char* onGetName() override { return fName; }
54cb93a386Sopenharmony_ci    void onDraw(int loops, SkCanvas*) override {
55cb93a386Sopenharmony_ci        SkRandom random;
56cb93a386Sopenharmony_ci        char dst[kMaximumSkFloatToDecimalLength];
57cb93a386Sopenharmony_ci        while (loops-- > 0) {
58cb93a386Sopenharmony_ci            auto f = fNextFloat(&random);
59cb93a386Sopenharmony_ci            (void)SkFloatToDecimal(f, dst);
60cb93a386Sopenharmony_ci        }
61cb93a386Sopenharmony_ci    }
62cb93a386Sopenharmony_ci};
63cb93a386Sopenharmony_ci
64cb93a386Sopenharmony_cifloat next_common(SkRandom* random) {
65cb93a386Sopenharmony_ci    return random->nextRangeF(-500.0f, 1500.0f);
66cb93a386Sopenharmony_ci}
67cb93a386Sopenharmony_cifloat next_any(SkRandom* random) {
68cb93a386Sopenharmony_ci    union { uint32_t u; float f; };
69cb93a386Sopenharmony_ci    u = random->nextU();
70cb93a386Sopenharmony_ci    static_assert(sizeof(float) == sizeof(uint32_t), "");
71cb93a386Sopenharmony_ci    return f;
72cb93a386Sopenharmony_ci}
73cb93a386Sopenharmony_ci
74cb93a386Sopenharmony_ciDEF_BENCH(return new PDFScalarBench("PDFScalar_common", next_common);)
75cb93a386Sopenharmony_ciDEF_BENCH(return new PDFScalarBench("PDFScalar_random", next_any);)
76cb93a386Sopenharmony_ci
77cb93a386Sopenharmony_ci#ifdef SK_SUPPORT_PDF
78cb93a386Sopenharmony_ci
79cb93a386Sopenharmony_ci#include "src/pdf/SkPDFBitmap.h"
80cb93a386Sopenharmony_ci#include "src/pdf/SkPDFDocumentPriv.h"
81cb93a386Sopenharmony_ci#include "src/pdf/SkPDFShader.h"
82cb93a386Sopenharmony_ci#include "src/pdf/SkPDFUtils.h"
83cb93a386Sopenharmony_ci
84cb93a386Sopenharmony_cinamespace {
85cb93a386Sopenharmony_ciclass PDFImageBench : public Benchmark {
86cb93a386Sopenharmony_cipublic:
87cb93a386Sopenharmony_ci    PDFImageBench() {}
88cb93a386Sopenharmony_ci    ~PDFImageBench() override {}
89cb93a386Sopenharmony_ci
90cb93a386Sopenharmony_ciprotected:
91cb93a386Sopenharmony_ci    const char* onGetName() override { return "PDFImage"; }
92cb93a386Sopenharmony_ci    bool isSuitableFor(Backend backend) override {
93cb93a386Sopenharmony_ci        return backend == kNonRendering_Backend;
94cb93a386Sopenharmony_ci    }
95cb93a386Sopenharmony_ci    void onDelayedSetup() override {
96cb93a386Sopenharmony_ci        sk_sp<SkImage> img(GetResourceAsImage("images/color_wheel.png"));
97cb93a386Sopenharmony_ci        if (img) {
98cb93a386Sopenharmony_ci            // force decoding, throw away reference to encoded data.
99cb93a386Sopenharmony_ci            SkAutoPixmapStorage pixmap;
100cb93a386Sopenharmony_ci            pixmap.alloc(SkImageInfo::MakeN32Premul(img->dimensions()));
101cb93a386Sopenharmony_ci            if (img->readPixels(nullptr, pixmap, 0, 0)) {
102cb93a386Sopenharmony_ci                fImage = SkImage::MakeRasterCopy(pixmap);
103cb93a386Sopenharmony_ci            }
104cb93a386Sopenharmony_ci        }
105cb93a386Sopenharmony_ci    }
106cb93a386Sopenharmony_ci    void onDraw(int loops, SkCanvas*) override {
107cb93a386Sopenharmony_ci        if (!fImage) {
108cb93a386Sopenharmony_ci            return;
109cb93a386Sopenharmony_ci        }
110cb93a386Sopenharmony_ci        while (loops-- > 0) {
111cb93a386Sopenharmony_ci            SkNullWStream nullStream;
112cb93a386Sopenharmony_ci            SkPDFDocument doc(&nullStream, SkPDF::Metadata());
113cb93a386Sopenharmony_ci            doc.beginPage(256, 256);
114cb93a386Sopenharmony_ci            (void)SkPDFSerializeImage(fImage.get(), &doc);
115cb93a386Sopenharmony_ci        }
116cb93a386Sopenharmony_ci    }
117cb93a386Sopenharmony_ci
118cb93a386Sopenharmony_ciprivate:
119cb93a386Sopenharmony_ci    sk_sp<SkImage> fImage;
120cb93a386Sopenharmony_ci};
121cb93a386Sopenharmony_ci
122cb93a386Sopenharmony_ciclass PDFJpegImageBench : public Benchmark {
123cb93a386Sopenharmony_cipublic:
124cb93a386Sopenharmony_ci    PDFJpegImageBench() {}
125cb93a386Sopenharmony_ci    ~PDFJpegImageBench() override {}
126cb93a386Sopenharmony_ci
127cb93a386Sopenharmony_ciprotected:
128cb93a386Sopenharmony_ci    const char* onGetName() override { return "PDFJpegImage"; }
129cb93a386Sopenharmony_ci    bool isSuitableFor(Backend backend) override {
130cb93a386Sopenharmony_ci        return backend == kNonRendering_Backend;
131cb93a386Sopenharmony_ci    }
132cb93a386Sopenharmony_ci    void onDelayedSetup() override {
133cb93a386Sopenharmony_ci        sk_sp<SkImage> img(GetResourceAsImage("images/mandrill_512_q075.jpg"));
134cb93a386Sopenharmony_ci        if (!img) { return; }
135cb93a386Sopenharmony_ci        sk_sp<SkData> encoded = img->refEncodedData();
136cb93a386Sopenharmony_ci        SkASSERT(encoded);
137cb93a386Sopenharmony_ci        if (!encoded) { return; }
138cb93a386Sopenharmony_ci        fImage = img;
139cb93a386Sopenharmony_ci    }
140cb93a386Sopenharmony_ci    void onDraw(int loops, SkCanvas*) override {
141cb93a386Sopenharmony_ci        if (!fImage) {
142cb93a386Sopenharmony_ci            SkDEBUGFAIL("");
143cb93a386Sopenharmony_ci            return;
144cb93a386Sopenharmony_ci        }
145cb93a386Sopenharmony_ci        while (loops-- > 0) {
146cb93a386Sopenharmony_ci            SkNullWStream nullStream;
147cb93a386Sopenharmony_ci            SkPDFDocument doc(&nullStream, SkPDF::Metadata());
148cb93a386Sopenharmony_ci            doc.beginPage(256, 256);
149cb93a386Sopenharmony_ci            (void)SkPDFSerializeImage(fImage.get(), &doc);
150cb93a386Sopenharmony_ci        }
151cb93a386Sopenharmony_ci    }
152cb93a386Sopenharmony_ci
153cb93a386Sopenharmony_ciprivate:
154cb93a386Sopenharmony_ci    sk_sp<SkImage> fImage;
155cb93a386Sopenharmony_ci};
156cb93a386Sopenharmony_ci
157cb93a386Sopenharmony_ci/** Test calling DEFLATE on a 78k PDF command stream. Used for measuring
158cb93a386Sopenharmony_ci    alternate zlib settings, usage, and library versions. */
159cb93a386Sopenharmony_ciclass PDFCompressionBench : public Benchmark {
160cb93a386Sopenharmony_cipublic:
161cb93a386Sopenharmony_ci    PDFCompressionBench() {}
162cb93a386Sopenharmony_ci    ~PDFCompressionBench() override {}
163cb93a386Sopenharmony_ci
164cb93a386Sopenharmony_ciprotected:
165cb93a386Sopenharmony_ci    const char* onGetName() override { return "PDFCompression"; }
166cb93a386Sopenharmony_ci    bool isSuitableFor(Backend backend) override {
167cb93a386Sopenharmony_ci        return backend == kNonRendering_Backend;
168cb93a386Sopenharmony_ci    }
169cb93a386Sopenharmony_ci    void onDelayedSetup() override {
170cb93a386Sopenharmony_ci        fAsset = GetResourceAsStream("pdf_command_stream.txt");
171cb93a386Sopenharmony_ci    }
172cb93a386Sopenharmony_ci    void onDraw(int loops, SkCanvas*) override {
173cb93a386Sopenharmony_ci        SkASSERT(fAsset);
174cb93a386Sopenharmony_ci        if (!fAsset) { return; }
175cb93a386Sopenharmony_ci        while (loops-- > 0) {
176cb93a386Sopenharmony_ci            SkNullWStream wStream;
177cb93a386Sopenharmony_ci            SkPDFDocument doc(&wStream, SkPDF::Metadata());
178cb93a386Sopenharmony_ci            doc.beginPage(256, 256);
179cb93a386Sopenharmony_ci            (void)SkPDFStreamOut(nullptr, fAsset->duplicate(), &doc, true);
180cb93a386Sopenharmony_ci       }
181cb93a386Sopenharmony_ci    }
182cb93a386Sopenharmony_ci
183cb93a386Sopenharmony_ciprivate:
184cb93a386Sopenharmony_ci    std::unique_ptr<SkStreamAsset> fAsset;
185cb93a386Sopenharmony_ci};
186cb93a386Sopenharmony_ci
187cb93a386Sopenharmony_cistruct PDFColorComponentBench : public Benchmark {
188cb93a386Sopenharmony_ci    bool isSuitableFor(Backend b) override {
189cb93a386Sopenharmony_ci        return b == kNonRendering_Backend;
190cb93a386Sopenharmony_ci    }
191cb93a386Sopenharmony_ci    const char* onGetName() override { return "PDFColorComponent"; }
192cb93a386Sopenharmony_ci    void onDraw(int loops, SkCanvas*) override {
193cb93a386Sopenharmony_ci        char dst[5];
194cb93a386Sopenharmony_ci        while (loops-- > 0) {
195cb93a386Sopenharmony_ci            for (int i = 0; i < 256; ++i) {
196cb93a386Sopenharmony_ci                (void)SkPDFUtils::ColorToDecimal(SkToU8(i), dst);
197cb93a386Sopenharmony_ci            }
198cb93a386Sopenharmony_ci        }
199cb93a386Sopenharmony_ci    }
200cb93a386Sopenharmony_ci};
201cb93a386Sopenharmony_ci
202cb93a386Sopenharmony_cistruct PDFShaderBench : public Benchmark {
203cb93a386Sopenharmony_ci    sk_sp<SkShader> fShader;
204cb93a386Sopenharmony_ci    const char* onGetName() final { return "PDFShader"; }
205cb93a386Sopenharmony_ci    bool isSuitableFor(Backend b) final { return b == kNonRendering_Backend; }
206cb93a386Sopenharmony_ci    void onDelayedSetup() final {
207cb93a386Sopenharmony_ci        const SkPoint pts[2] = {{0.0f, 0.0f}, {100.0f, 100.0f}};
208cb93a386Sopenharmony_ci        const SkColor colors[] = {
209cb93a386Sopenharmony_ci            SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE,
210cb93a386Sopenharmony_ci            SK_ColorWHITE, SK_ColorBLACK,
211cb93a386Sopenharmony_ci        };
212cb93a386Sopenharmony_ci        fShader = SkGradientShader::MakeLinear(
213cb93a386Sopenharmony_ci                pts, colors, nullptr, SK_ARRAY_COUNT(colors),
214cb93a386Sopenharmony_ci                SkTileMode::kClamp);
215cb93a386Sopenharmony_ci    }
216cb93a386Sopenharmony_ci    void onDraw(int loops, SkCanvas*) final {
217cb93a386Sopenharmony_ci        SkASSERT(fShader);
218cb93a386Sopenharmony_ci        while (loops-- > 0) {
219cb93a386Sopenharmony_ci            SkNullWStream nullStream;
220cb93a386Sopenharmony_ci            SkPDFDocument doc(&nullStream, SkPDF::Metadata());
221cb93a386Sopenharmony_ci            doc.beginPage(256, 256);
222cb93a386Sopenharmony_ci            (void) SkPDFMakeShader(&doc, fShader.get(), SkMatrix::I(),
223cb93a386Sopenharmony_ci                                   {0, 0, 400, 400}, SkColors::kBlack);
224cb93a386Sopenharmony_ci        }
225cb93a386Sopenharmony_ci    }
226cb93a386Sopenharmony_ci};
227cb93a386Sopenharmony_ci
228cb93a386Sopenharmony_cistruct WritePDFTextBenchmark : public Benchmark {
229cb93a386Sopenharmony_ci    std::unique_ptr<SkWStream> fWStream;
230cb93a386Sopenharmony_ci    WritePDFTextBenchmark() : fWStream(new SkNullWStream) {}
231cb93a386Sopenharmony_ci    const char* onGetName() override { return "WritePDFText"; }
232cb93a386Sopenharmony_ci    bool isSuitableFor(Backend backend) override {
233cb93a386Sopenharmony_ci        return backend == kNonRendering_Backend;
234cb93a386Sopenharmony_ci    }
235cb93a386Sopenharmony_ci    void onDraw(int loops, SkCanvas*) override {
236cb93a386Sopenharmony_ci        static const char kHello[] = "HELLO SKIA!\n";
237cb93a386Sopenharmony_ci        static const char kBinary[] = "\001\002\003\004\005\006";
238cb93a386Sopenharmony_ci        while (loops-- > 0) {
239cb93a386Sopenharmony_ci            for (int i = 1000; i-- > 0;) {
240cb93a386Sopenharmony_ci                SkPDFWriteString(fWStream.get(), kHello, strlen(kHello));
241cb93a386Sopenharmony_ci                SkPDFWriteString(fWStream.get(), kBinary, strlen(kBinary));
242cb93a386Sopenharmony_ci            }
243cb93a386Sopenharmony_ci        }
244cb93a386Sopenharmony_ci    }
245cb93a386Sopenharmony_ci};
246cb93a386Sopenharmony_ci
247cb93a386Sopenharmony_ci// Test for regression chromium:947381
248cb93a386Sopenharmony_ci// with    5c83ae81aa :   2364.99 microsec
249cb93a386Sopenharmony_ci// without 5c83ae81aa : 302821.78 microsec
250cb93a386Sopenharmony_cistruct PDFClipPathBenchmark : public Benchmark {
251cb93a386Sopenharmony_ci    SkPath fPath;
252cb93a386Sopenharmony_ci    void onDelayedSetup() override {
253cb93a386Sopenharmony_ci        SkBitmap bitmap;
254cb93a386Sopenharmony_ci        bitmap.allocN32Pixels(256, 256);
255cb93a386Sopenharmony_ci        bitmap.eraseColor(SK_ColorWHITE);
256cb93a386Sopenharmony_ci        {
257cb93a386Sopenharmony_ci            SkCanvas tmp(bitmap);
258cb93a386Sopenharmony_ci            SkPaint paint;
259cb93a386Sopenharmony_ci            paint.setAntiAlias(false);
260cb93a386Sopenharmony_ci            paint.setStyle(SkPaint::kStroke_Style);
261cb93a386Sopenharmony_ci            paint.setStrokeWidth(10);
262cb93a386Sopenharmony_ci            for (int r : {20, 40, 60, 80, 100, 120}) {
263cb93a386Sopenharmony_ci                tmp.drawCircle(128, 128, (float)r, paint);
264cb93a386Sopenharmony_ci            }
265cb93a386Sopenharmony_ci        }
266cb93a386Sopenharmony_ci        fPath.reset();
267cb93a386Sopenharmony_ci        for (int y = 0; y < 256; ++y) {
268cb93a386Sopenharmony_ci            SkColor current = bitmap.getColor(0, y);
269cb93a386Sopenharmony_ci            int start = 0;
270cb93a386Sopenharmony_ci            for (int x = 0; x < 256; ++x) {
271cb93a386Sopenharmony_ci                SkColor color = bitmap.getColor(x, y);
272cb93a386Sopenharmony_ci                if (color == current) {
273cb93a386Sopenharmony_ci                    continue;
274cb93a386Sopenharmony_ci                }
275cb93a386Sopenharmony_ci                if (color == SK_ColorBLACK) {
276cb93a386Sopenharmony_ci                    start = x;
277cb93a386Sopenharmony_ci                } else {
278cb93a386Sopenharmony_ci                    fPath.addRect(SkRect::Make(SkIRect{start, y, x, y + 1}));
279cb93a386Sopenharmony_ci                }
280cb93a386Sopenharmony_ci                current = color;
281cb93a386Sopenharmony_ci            }
282cb93a386Sopenharmony_ci            if (current == SK_ColorBLACK) {
283cb93a386Sopenharmony_ci                fPath.addRect(SkRect::Make(SkIRect{start, y, 256, y + 1}));
284cb93a386Sopenharmony_ci            }
285cb93a386Sopenharmony_ci        }
286cb93a386Sopenharmony_ci    }
287cb93a386Sopenharmony_ci    const char* onGetName() override { return "PDFClipPath"; }
288cb93a386Sopenharmony_ci    bool isSuitableFor(Backend backend) override {
289cb93a386Sopenharmony_ci        return backend == kNonRendering_Backend;
290cb93a386Sopenharmony_ci    }
291cb93a386Sopenharmony_ci    void onDraw(int loops, SkCanvas*) override {
292cb93a386Sopenharmony_ci        while (loops-- > 0) {
293cb93a386Sopenharmony_ci            SkNullWStream wStream;
294cb93a386Sopenharmony_ci            SkPDFDocument doc(&wStream, SkPDF::Metadata());
295cb93a386Sopenharmony_ci            SkCanvas* canvas = doc.beginPage(256, 256);
296cb93a386Sopenharmony_ci            canvas->clipPath(fPath);
297cb93a386Sopenharmony_ci            canvas->translate(4.0f/3, 4.0f/3);
298cb93a386Sopenharmony_ci            canvas->clipPath(fPath);
299cb93a386Sopenharmony_ci            canvas->clear(SK_ColorRED);
300cb93a386Sopenharmony_ci            doc.endPage();
301cb93a386Sopenharmony_ci        }
302cb93a386Sopenharmony_ci    }
303cb93a386Sopenharmony_ci};
304cb93a386Sopenharmony_ci
305cb93a386Sopenharmony_ci}  // namespace
306cb93a386Sopenharmony_ciDEF_BENCH(return new PDFImageBench;)
307cb93a386Sopenharmony_ciDEF_BENCH(return new PDFJpegImageBench;)
308cb93a386Sopenharmony_ciDEF_BENCH(return new PDFCompressionBench;)
309cb93a386Sopenharmony_ciDEF_BENCH(return new PDFColorComponentBench;)
310cb93a386Sopenharmony_ciDEF_BENCH(return new PDFShaderBench;)
311cb93a386Sopenharmony_ciDEF_BENCH(return new WritePDFTextBenchmark;)
312cb93a386Sopenharmony_ciDEF_BENCH(return new PDFClipPathBenchmark;)
313cb93a386Sopenharmony_ci
314cb93a386Sopenharmony_ci#ifdef SK_PDF_ENABLE_SLOW_TESTS
315cb93a386Sopenharmony_ci#include "include/core/SkExecutor.h"
316cb93a386Sopenharmony_cinamespace {
317cb93a386Sopenharmony_civoid big_pdf_test(SkDocument* doc, const SkBitmap& background) {
318cb93a386Sopenharmony_ci    static const char* kText[] = {
319cb93a386Sopenharmony_ci        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do",
320cb93a386Sopenharmony_ci        "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad",
321cb93a386Sopenharmony_ci        "minim veniam, quis nostrud exercitation ullamco laboris nisi ut",
322cb93a386Sopenharmony_ci        "aliquip ex ea commodo consequat. Duis aute irure dolor in",
323cb93a386Sopenharmony_ci        "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla",
324cb93a386Sopenharmony_ci        "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in",
325cb93a386Sopenharmony_ci        "culpa qui officia deserunt mollit anim id est laborum.",
326cb93a386Sopenharmony_ci        "",
327cb93a386Sopenharmony_ci        "Sed ut perspiciatis, unde omnis iste natus error sit voluptatem",
328cb93a386Sopenharmony_ci        "accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae",
329cb93a386Sopenharmony_ci        "ab illo inventore veritatis et quasi architecto beatae vitae dicta",
330cb93a386Sopenharmony_ci        "sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit,",
331cb93a386Sopenharmony_ci        "aspernatur aut odit aut fugit, sed quia consequuntur magni dolores",
332cb93a386Sopenharmony_ci        "eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est,",
333cb93a386Sopenharmony_ci        "qui dolorem ipsum, quia dolor sit amet consectetur adipiscing velit,",
334cb93a386Sopenharmony_ci        "sed quia non numquam do eius modi tempora incididunt, ut labore et",
335cb93a386Sopenharmony_ci        "dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam,",
336cb93a386Sopenharmony_ci        "quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi",
337cb93a386Sopenharmony_ci        "ut aliquid ex ea commodi consequatur? Quis autem vel eum iure",
338cb93a386Sopenharmony_ci        "reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae",
339cb93a386Sopenharmony_ci        "consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla",
340cb93a386Sopenharmony_ci        "pariatur?",
341cb93a386Sopenharmony_ci        "",
342cb93a386Sopenharmony_ci        "At vero eos et accusamus et iusto odio dignissimos ducimus, qui",
343cb93a386Sopenharmony_ci        "blanditiis praesentium voluptatum deleniti atque corrupti, quos",
344cb93a386Sopenharmony_ci        "dolores et quas molestias excepturi sint, obcaecati cupiditate non",
345cb93a386Sopenharmony_ci        "provident, similique sunt in culpa, qui officia deserunt mollitia",
346cb93a386Sopenharmony_ci        "animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis",
347cb93a386Sopenharmony_ci        "est et expedita distinctio. Nam libero tempore, cum soluta nobis est",
348cb93a386Sopenharmony_ci        "eligendi optio, cumque nihil impedit, quo minus id, quod maxime",
349cb93a386Sopenharmony_ci        "placeat, facere possimus, omnis voluptas assumenda est, omnis dolor",
350cb93a386Sopenharmony_ci        "repellendus. Temporibus autem quibusdam et aut officiis debitis aut",
351cb93a386Sopenharmony_ci        "rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint",
352cb93a386Sopenharmony_ci        "et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente",
353cb93a386Sopenharmony_ci        "delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut",
354cb93a386Sopenharmony_ci        "perferendis doloribus asperiores repellat",
355cb93a386Sopenharmony_ci        "",
356cb93a386Sopenharmony_ci        "Sed ut perspiciatis, unde omnis iste natus error sit voluptatem",
357cb93a386Sopenharmony_ci        "accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae",
358cb93a386Sopenharmony_ci        "ab illo inventore veritatis et quasi architecto beatae vitae dicta",
359cb93a386Sopenharmony_ci        "sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit,",
360cb93a386Sopenharmony_ci        "aspernatur aut odit aut fugit, sed quia consequuntur magni dolores",
361cb93a386Sopenharmony_ci        "eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est,",
362cb93a386Sopenharmony_ci        "qui dolorem ipsum, quia dolor sit amet consectetur adipiscing velit,",
363cb93a386Sopenharmony_ci        "sed quia non numquam do eius modi tempora incididunt, ut labore et",
364cb93a386Sopenharmony_ci        "dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam,",
365cb93a386Sopenharmony_ci        "quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi",
366cb93a386Sopenharmony_ci        "ut aliquid ex ea commodi consequatur? Quis autem vel eum iure",
367cb93a386Sopenharmony_ci        "reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae",
368cb93a386Sopenharmony_ci        "consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla",
369cb93a386Sopenharmony_ci        "pariatur?",
370cb93a386Sopenharmony_ci        "",
371cb93a386Sopenharmony_ci    };
372cb93a386Sopenharmony_ci    SkCanvas* canvas = nullptr;
373cb93a386Sopenharmony_ci    float x = 36;
374cb93a386Sopenharmony_ci    float y = 36;
375cb93a386Sopenharmony_ci    constexpr size_t kLineCount = SK_ARRAY_COUNT(kText);
376cb93a386Sopenharmony_ci    constexpr int kLoopCount = 200;
377cb93a386Sopenharmony_ci    SkFont font;
378cb93a386Sopenharmony_ci    SkPaint paint;
379cb93a386Sopenharmony_ci    for (int loop = 0; loop < kLoopCount; ++loop) {
380cb93a386Sopenharmony_ci        for (size_t line = 0; line < kLineCount; ++line) {
381cb93a386Sopenharmony_ci            y += font.getSpacing();
382cb93a386Sopenharmony_ci            if (!canvas || y > 792 - 36) {
383cb93a386Sopenharmony_ci                y = 36 + font.getSpacing();
384cb93a386Sopenharmony_ci                canvas = doc->beginPage(612, 792);
385cb93a386Sopenharmony_ci                background.notifyPixelsChanged();
386cb93a386Sopenharmony_ci                canvas->drawBitmap(background, 0, 0);
387cb93a386Sopenharmony_ci            }
388cb93a386Sopenharmony_ci            canvas->drawString(kText[line], x, y, font, paint);
389cb93a386Sopenharmony_ci        }
390cb93a386Sopenharmony_ci    }
391cb93a386Sopenharmony_ci}
392cb93a386Sopenharmony_ci
393cb93a386Sopenharmony_ciSkBitmap make_background() {
394cb93a386Sopenharmony_ci    SkBitmap background;
395cb93a386Sopenharmony_ci    SkBitmap bitmap;
396cb93a386Sopenharmony_ci    bitmap.allocN32Pixels(32, 32);
397cb93a386Sopenharmony_ci    bitmap.eraseColor(SK_ColorWHITE);
398cb93a386Sopenharmony_ci    SkCanvas tmp(bitmap);
399cb93a386Sopenharmony_ci    SkPaint gray;
400cb93a386Sopenharmony_ci    gray.setColor(SkColorSetARGB(0xFF, 0xEE, 0xEE, 0xEE));
401cb93a386Sopenharmony_ci    tmp.drawRect({0,0,16,16}, gray);
402cb93a386Sopenharmony_ci    tmp.drawRect({16,16,32,32}, gray);
403cb93a386Sopenharmony_ci    SkPaint shader;
404cb93a386Sopenharmony_ci    shader.setShader(
405cb93a386Sopenharmony_ci            SkShader::MakeBitmapShader(
406cb93a386Sopenharmony_ci                bitmap, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode));
407cb93a386Sopenharmony_ci    background.allocN32Pixels(612, 792);
408cb93a386Sopenharmony_ci    SkCanvas tmp2(background);
409cb93a386Sopenharmony_ci    tmp2.drawPaint(shader);
410cb93a386Sopenharmony_ci    return background;
411cb93a386Sopenharmony_ci}
412cb93a386Sopenharmony_ci
413cb93a386Sopenharmony_cistruct PDFBigDocBench : public Benchmark {
414cb93a386Sopenharmony_ci    bool fFast;
415cb93a386Sopenharmony_ci    SkBitmap fBackground;
416cb93a386Sopenharmony_ci    std::unique_ptr<SkExecutor> fExecutor;
417cb93a386Sopenharmony_ci    PDFBigDocBench(bool fast) : fFast(fast) {}
418cb93a386Sopenharmony_ci    void onDelayedSetup() override {
419cb93a386Sopenharmony_ci        fBackground = make_background();
420cb93a386Sopenharmony_ci        fExecutor = fFast ? SkExecutor::MakeFIFOThreadPool() : nullptr;
421cb93a386Sopenharmony_ci    }
422cb93a386Sopenharmony_ci    const char* onGetName() override {
423cb93a386Sopenharmony_ci        static const char kNameFast[] = "PDFBigDocBench_fast";
424cb93a386Sopenharmony_ci        static const char kNameSlow[] = "PDFBigDocBench_slow";
425cb93a386Sopenharmony_ci        return fFast ? kNameFast : kNameSlow;
426cb93a386Sopenharmony_ci    }
427cb93a386Sopenharmony_ci    bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
428cb93a386Sopenharmony_ci    void onDraw(int loops, SkCanvas*) override {
429cb93a386Sopenharmony_ci        while (loops-- > 0) {
430cb93a386Sopenharmony_ci            #ifdef SK_PDF_TEST_BIGDOCBENCH_OUTPUT
431cb93a386Sopenharmony_ci            SkFILEWStream wStream("/tmp/big_pdf.pdf");
432cb93a386Sopenharmony_ci            #else
433cb93a386Sopenharmony_ci            SkNullWStream wStream;
434cb93a386Sopenharmony_ci            #endif
435cb93a386Sopenharmony_ci            SkPDF::Metadata metadata;
436cb93a386Sopenharmony_ci            metadata.fExecutor = fExecutor.get();
437cb93a386Sopenharmony_ci            auto doc = SkPDF::MakeDocument(&wStream, metadata);
438cb93a386Sopenharmony_ci            big_pdf_test(doc.get(), fBackground);
439cb93a386Sopenharmony_ci        }
440cb93a386Sopenharmony_ci    }
441cb93a386Sopenharmony_ci};
442cb93a386Sopenharmony_ci}  // namespace
443cb93a386Sopenharmony_ciDEF_BENCH(return new PDFBigDocBench(false);)
444cb93a386Sopenharmony_ciDEF_BENCH(return new PDFBigDocBench(true);)
445cb93a386Sopenharmony_ci#endif
446cb93a386Sopenharmony_ci
447cb93a386Sopenharmony_ci#endif // SK_SUPPORT_PDF
448