android13/external/skia/docs/examples/PDF.cpp

65 lines
2.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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 Skias 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