65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| // Copyright 2019 Google LLC.
 | ||
| // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
 | ||
| #include "tools/fiddle/examples.h"
 | ||
| REG_FIDDLE(PDF, 256, 256, true, 0) {
 | ||
| 
 | ||
| // Here is an example of using Skia’s PDF backend (SkPDF) via the SkDocument
 | ||
| // and SkCanvas APIs.
 | ||
| void WritePDF(SkWStream* outputStream,
 | ||
|               const char* documentTitle,
 | ||
|               void (*writePage)(SkCanvas*, int page),
 | ||
|               int numberOfPages,
 | ||
|               SkSize pageSize) {
 | ||
|     SkPDF::Metadata metadata;
 | ||
|     metadata.fTitle = documentTitle;
 | ||
|     metadata.fCreator = "Example WritePDF() Function";
 | ||
|     metadata.fCreation = {0, 2019, 1, 4, 31, 12, 34, 56};
 | ||
|     metadata.fModified = {0, 2019, 1, 4, 31, 12, 34, 56};
 | ||
|     auto pdfDocument = SkPDF::MakeDocument(outputStream, metadata);
 | ||
|     SkASSERT(pdfDocument);
 | ||
|     for (int page = 0; page < numberOfPages; ++page) {
 | ||
|         SkCanvas* pageCanvas = pdfDocument->beginPage(pageSize.width(),
 | ||
|                                                       pageSize.height());
 | ||
|         writePage(pageCanvas, page);
 | ||
|         pdfDocument->endPage();
 | ||
|     }
 | ||
|     pdfDocument->close();
 | ||
| }
 | ||
| 
 | ||
| // Print binary data to stdout as hex.
 | ||
| void print_data(const SkData* data, const char* name) {
 | ||
|     if (data) {
 | ||
|         SkDebugf("\nxxd -r -p > %s << EOF", name);
 | ||
|         size_t s = data->size();
 | ||
|         const uint8_t* d = data->bytes();
 | ||
|         for (size_t i = 0; i < s; ++i) {
 | ||
|             if (i % 40 == 0) { SkDebugf("\n"); }
 | ||
|             SkDebugf("%02x", d[i]);
 | ||
|         }
 | ||
|         SkDebugf("\nEOF\n\n");
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| // example function that draws on a SkCanvas.
 | ||
| void write_page(SkCanvas* canvas, int) {
 | ||
|     const SkScalar R = 115.2f, C = 128.0f;
 | ||
|     SkPath path;
 | ||
|     path.moveTo(C + R, C);
 | ||
|     for (int i = 1; i < 8; ++i) {
 | ||
|         SkScalar a = 2.6927937f * i;
 | ||
|         path.lineTo(C + R * cos(a), C + R * sin(a));
 | ||
|     }
 | ||
|     SkPaint paint;
 | ||
|     paint.setStyle(SkPaint::kStroke_Style);
 | ||
|     canvas->drawPath(path, paint);
 | ||
| }
 | ||
| 
 | ||
| void draw(SkCanvas*) {
 | ||
|     constexpr SkSize ansiLetterSize{8.5f * 72, 11.0f * 72};
 | ||
|     SkDynamicMemoryWStream buffer;
 | ||
|     WritePDF(&buffer, "SkPDF Example", &write_page, 1, ansiLetterSize);
 | ||
|     sk_sp<SkData> pdfData = buffer.detachAsData();
 | ||
|     print_data(pdfData.get(), "skpdf_example.pdf");
 | ||
| }
 | ||
| }  // END FIDDLE
 |