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