From 597516370da37bcd593e06f9369aa31c432013f9 Mon Sep 17 00:00:00 2001
From: "kmadhusu@chromium.org"
 <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>
Date: Fri, 1 Jul 2011 05:10:44 +0000
Subject: PrintPreview: Implement GetMetafileForCurrentPage() function in
 PdfMetafileSkia.

This function is required for  print preview pipeline sequence.

BUG=none
TEST=none


Review URL: http://codereview.chromium.org/7274026

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@91269 0039d316-1c4b-4281-b951-d872f2087c98
---
 printing/pdf_metafile_skia.cc | 29 +++++++++++++++++++++++++----
 printing/pdf_metafile_skia.h  |  6 ++++++
 2 files changed, 31 insertions(+), 4 deletions(-)

(limited to 'printing')

diff --git a/printing/pdf_metafile_skia.cc b/printing/pdf_metafile_skia.cc
index 69cae9e..d265ca0 100644
--- a/printing/pdf_metafile_skia.cc
+++ b/printing/pdf_metafile_skia.cc
@@ -51,7 +51,8 @@ bool PdfMetafileSkia::InitFromData(const void* src_buffer,
 SkDevice* PdfMetafileSkia::StartPageForVectorCanvas(
     const gfx::Size& page_size, const gfx::Rect& content_area,
     const float& scale_factor) {
-  DCHECK(data_->current_page_.get() == NULL);
+  DCHECK (!page_outstanding_);
+  page_outstanding_ = true;
 
   // Adjust for the margins and apply the scale factor.
   SkMatrix transform;
@@ -84,7 +85,7 @@ bool PdfMetafileSkia::FinishPage() {
   DCHECK(data_->current_page_.get());
 
   data_->pdf_doc_.appendPage(data_->current_page_);
-  data_->current_page_ = NULL;
+  page_outstanding_ = false;
   return true;
 }
 
@@ -93,9 +94,10 @@ bool PdfMetafileSkia::FinishDocument() {
   if (data_->pdf_stream_.getOffset())
     return true;
 
-  if (data_->current_page_.get())
+  if (page_outstanding_)
     FinishPage();
 
+  data_->current_page_ = NULL;
   base::hash_set<SkFontID> font_set;
 
   const SkTDArray<SkPDFPage*>& pages = data_->pdf_doc_.getPages();
@@ -234,6 +236,25 @@ bool PdfMetafileSkia::SaveToFD(const base::FileDescriptor& fd) const {
 
 PdfMetafileSkia::PdfMetafileSkia()
     : data_(new PdfMetafileSkiaData),
-      draft_(false) {}
+      draft_(false),
+      page_outstanding_(false) {}
+
+PdfMetafileSkia* PdfMetafileSkia::GetMetafileForCurrentPage() {
+  SkPDFDocument pdf_doc;
+  SkDynamicMemoryWStream pdf_stream;
+  if (!pdf_doc.appendPage(data_->current_page_))
+    return NULL;
+
+  if (!pdf_doc.emitPDF(&pdf_stream))
+    return NULL;
+
+  SkAutoDataUnref data(pdf_stream.copyToData());
+  if (data.size() == 0)
+    return NULL;
+
+  PdfMetafileSkia* metafile = new printing::PdfMetafileSkia;
+  metafile->InitFromData(data.bytes(), data.size());
+  return metafile;
+}
 
 }  // namespace printing
diff --git a/printing/pdf_metafile_skia.h b/printing/pdf_metafile_skia.h
index c28cd08..5d6d448 100644
--- a/printing/pdf_metafile_skia.h
+++ b/printing/pdf_metafile_skia.h
@@ -68,12 +68,18 @@ class PdfMetafileSkia : public Metafile {
   virtual bool SaveToFD(const base::FileDescriptor& fd) const;
 #endif  // if defined(OS_CHROMEOS)
 
+  // Return a new metafile containing just the current page in draft mode.
+  PdfMetafileSkia* GetMetafileForCurrentPage();
+
  private:
   scoped_ptr<PdfMetafileSkiaData> data_;
 
   // True when a draft version of metafile is requested.
   mutable bool draft_;
 
+  // True when finish page is outstanding for current page.
+  bool page_outstanding_;
+
   DISALLOW_COPY_AND_ASSIGN(PdfMetafileSkia);
 };
 
-- 
cgit v1.1