Chromium Code Reviews| Index: dm/DMSrcSink.cpp |
| diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp |
| index 9e9a77c27124e85350406c7e84ec3b2f8f5f0886..391df8b0108339e2ad290e5cdbcdfa3fb4f68dde 100644 |
| --- a/dm/DMSrcSink.cpp |
| +++ b/dm/DMSrcSink.cpp |
| @@ -371,63 +371,81 @@ Error GPUSink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString* log) co |
| /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
|
mtklein
2015/04/14 20:46:27
Let's just DEFINE_bool(multiPage, false, "...") he
hal.canary
2015/04/14 20:50:02
Done.
|
| -static Error draw_skdocument(const Src& src, SkDocument* doc, SkWStream* dst) { |
| +static Error draw_skdocument(const Src& src, |
| + SkDocument* doc, |
| + bool multiPage, |
| + SkWStream* dst) { |
| // Print the given DM:Src to a document, breaking on 8.5x11 pages. |
| SkASSERT(doc); |
| int width = src.size().width(), |
| height = src.size().height(); |
| - const int kLetterWidth = 612, // 8.5 * 72 |
| - kLetterHeight = 792; // 11 * 72 |
| - const SkRect letter = SkRect::MakeWH(SkIntToScalar(kLetterWidth), |
| - SkIntToScalar(kLetterHeight)); |
| - |
| - int xPages = ((width - 1) / kLetterWidth) + 1; |
| - int yPages = ((height - 1) / kLetterHeight) + 1; |
| - |
| - for (int y = 0; y < yPages; ++y) { |
| - for (int x = 0; x < xPages; ++x) { |
| - int w = SkTMin(kLetterWidth, width - (x * kLetterWidth)); |
| - int h = SkTMin(kLetterHeight, height - (y * kLetterHeight)); |
| - SkCanvas* canvas = |
| - doc->beginPage(SkIntToScalar(w), SkIntToScalar(h)); |
| - if (!canvas) { |
| - return "SkDocument::beginPage(w,h) returned NULL"; |
| - } |
| - canvas->clipRect(letter); |
| - canvas->translate(-letter.width() * x, -letter.height() * y); |
| - Error err = src.draw(canvas); |
| - if (!err.isEmpty()) { |
| - return err; |
| + if (multiPage) { |
| + const int kLetterWidth = 612, // 8.5 * 72 |
| + kLetterHeight = 792; // 11 * 72 |
| + const SkRect letter = SkRect::MakeWH(SkIntToScalar(kLetterWidth), |
| + SkIntToScalar(kLetterHeight)); |
| + |
| + int xPages = ((width - 1) / kLetterWidth) + 1; |
| + int yPages = ((height - 1) / kLetterHeight) + 1; |
| + |
| + for (int y = 0; y < yPages; ++y) { |
| + for (int x = 0; x < xPages; ++x) { |
| + int w = SkTMin(kLetterWidth, width - (x * kLetterWidth)); |
| + int h = SkTMin(kLetterHeight, height - (y * kLetterHeight)); |
| + SkCanvas* canvas = |
| + doc->beginPage(SkIntToScalar(w), SkIntToScalar(h)); |
| + if (!canvas) { |
| + return "SkDocument::beginPage(w,h) returned NULL"; |
| + } |
| + canvas->clipRect(letter); |
| + canvas->translate(-letter.width() * x, -letter.height() * y); |
| + Error err = src.draw(canvas); |
| + if (!err.isEmpty()) { |
| + return err; |
| + } |
| + doc->endPage(); |
| } |
| - doc->endPage(); |
| } |
| + } else { |
| + SkCanvas* canvas = |
| + doc->beginPage(SkIntToScalar(width), SkIntToScalar(height)); |
| + if (!canvas) { |
| + return "SkDocument::beginPage(w,h) returned NULL"; |
| + } |
| + Error err = src.draw(canvas); |
| + if (!err.isEmpty()) { |
| + return err; |
| + } |
| + doc->endPage(); |
| + } |
| + if (!doc->close()) { |
| + return "SkDocument::close() returned false"; |
| } |
| - doc->close(); |
| dst->flush(); |
| return ""; |
| } |
| -PDFSink::PDFSink() {} |
| +PDFSink::PDFSink(bool multiPage) : fMultiPage(multiPage) {} |
| Error PDFSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const { |
| SkAutoTUnref<SkDocument> doc(SkDocument::CreatePDF(dst)); |
| if (!doc) { |
| return "SkDocument::CreatePDF() returned NULL"; |
| } |
| - return draw_skdocument(src, doc.get(), dst); |
| + return draw_skdocument(src, doc.get(), fMultiPage, dst); |
| } |
| /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
| -XPSSink::XPSSink() {} |
| +XPSSink::XPSSink(bool multiPage) : fMultiPage(multiPage) {} |
| Error XPSSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const { |
| SkAutoTUnref<SkDocument> doc(SkDocument::CreateXPS(dst)); |
| if (!doc) { |
| return "SkDocument::CreateXPS() returned NULL"; |
| } |
| - return draw_skdocument(src, doc.get(), dst); |
| + return draw_skdocument(src, doc.get(), fMultiPage, dst); |
| } |
| /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |