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