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