1cb93a386Sopenharmony_ci// Copyright 2019 Google LLC.
2cb93a386Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3cb93a386Sopenharmony_ci#include "tools/fiddle/examples.h"
4cb93a386Sopenharmony_ciREG_FIDDLE(PDF, 256, 256, true, 0) {
5cb93a386Sopenharmony_ci
6cb93a386Sopenharmony_ci// Here is an example of using Skia’s PDF backend (SkPDF) via the SkDocument
7cb93a386Sopenharmony_ci// and SkCanvas APIs.
8cb93a386Sopenharmony_civoid WritePDF(SkWStream* outputStream,
9cb93a386Sopenharmony_ci              const char* documentTitle,
10cb93a386Sopenharmony_ci              void (*writePage)(SkCanvas*, int page),
11cb93a386Sopenharmony_ci              int numberOfPages,
12cb93a386Sopenharmony_ci              SkSize pageSize) {
13cb93a386Sopenharmony_ci    SkPDF::Metadata metadata;
14cb93a386Sopenharmony_ci    metadata.fTitle = documentTitle;
15cb93a386Sopenharmony_ci    metadata.fCreator = "Example WritePDF() Function";
16cb93a386Sopenharmony_ci    metadata.fCreation = {0, 2019, 1, 4, 31, 12, 34, 56};
17cb93a386Sopenharmony_ci    metadata.fModified = {0, 2019, 1, 4, 31, 12, 34, 56};
18cb93a386Sopenharmony_ci    auto pdfDocument = SkPDF::MakeDocument(outputStream, metadata);
19cb93a386Sopenharmony_ci    SkASSERT(pdfDocument);
20cb93a386Sopenharmony_ci    for (int page = 0; page < numberOfPages; ++page) {
21cb93a386Sopenharmony_ci        SkCanvas* pageCanvas = pdfDocument->beginPage(pageSize.width(),
22cb93a386Sopenharmony_ci                                                      pageSize.height());
23cb93a386Sopenharmony_ci        writePage(pageCanvas, page);
24cb93a386Sopenharmony_ci        pdfDocument->endPage();
25cb93a386Sopenharmony_ci    }
26cb93a386Sopenharmony_ci    pdfDocument->close();
27cb93a386Sopenharmony_ci}
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ci// Print binary data to stdout as hex.
30cb93a386Sopenharmony_civoid print_data(const SkData* data, const char* name) {
31cb93a386Sopenharmony_ci    if (data) {
32cb93a386Sopenharmony_ci        SkDebugf("\nxxd -r -p > %s << EOF", name);
33cb93a386Sopenharmony_ci        size_t s = data->size();
34cb93a386Sopenharmony_ci        const uint8_t* d = data->bytes();
35cb93a386Sopenharmony_ci        for (size_t i = 0; i < s; ++i) {
36cb93a386Sopenharmony_ci            if (i % 40 == 0) { SkDebugf("\n"); }
37cb93a386Sopenharmony_ci            SkDebugf("%02x", d[i]);
38cb93a386Sopenharmony_ci        }
39cb93a386Sopenharmony_ci        SkDebugf("\nEOF\n\n");
40cb93a386Sopenharmony_ci    }
41cb93a386Sopenharmony_ci}
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_ci// example function that draws on a SkCanvas.
44cb93a386Sopenharmony_civoid write_page(SkCanvas* canvas, int) {
45cb93a386Sopenharmony_ci    const SkScalar R = 115.2f, C = 128.0f;
46cb93a386Sopenharmony_ci    SkPath path;
47cb93a386Sopenharmony_ci    path.moveTo(C + R, C);
48cb93a386Sopenharmony_ci    for (int i = 1; i < 8; ++i) {
49cb93a386Sopenharmony_ci        SkScalar a = 2.6927937f * i;
50cb93a386Sopenharmony_ci        path.lineTo(C + R * cos(a), C + R * sin(a));
51cb93a386Sopenharmony_ci    }
52cb93a386Sopenharmony_ci    SkPaint paint;
53cb93a386Sopenharmony_ci    paint.setStyle(SkPaint::kStroke_Style);
54cb93a386Sopenharmony_ci    canvas->drawPath(path, paint);
55cb93a386Sopenharmony_ci}
56cb93a386Sopenharmony_ci
57cb93a386Sopenharmony_civoid draw(SkCanvas*) {
58cb93a386Sopenharmony_ci    constexpr SkSize ansiLetterSize{8.5f * 72, 11.0f * 72};
59cb93a386Sopenharmony_ci    SkDynamicMemoryWStream buffer;
60cb93a386Sopenharmony_ci    WritePDF(&buffer, "SkPDF Example", &write_page, 1, ansiLetterSize);
61cb93a386Sopenharmony_ci    sk_sp<SkData> pdfData = buffer.detachAsData();
62cb93a386Sopenharmony_ci    print_data(pdfData.get(), "skpdf_example.pdf");
63cb93a386Sopenharmony_ci}
64cb93a386Sopenharmony_ci}  // END FIDDLE
65