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