Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(276)

Unified Diff: printing/pdf_metafile_skia.cc

Issue 704813002: PdfMetafileSkia gives out a SkCanvas, not a SkBaseDevice. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comples Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: printing/pdf_metafile_skia.cc
diff --git a/printing/pdf_metafile_skia.cc b/printing/pdf_metafile_skia.cc
index 36a42d9d135cc875e803c8f01a3c2b5b048d5e8c..24aa12ebac8e2612bd06ab2d64e4614622bf93b9 100644
--- a/printing/pdf_metafile_skia.cc
+++ b/printing/pdf_metafile_skia.cc
@@ -10,7 +10,7 @@
#include "base/numerics/safe_conversions.h"
#include "base/posix/eintr_wrapper.h"
#include "skia/ext/refptr.h"
-#include "skia/ext/vector_platform_device_skia.h"
+#include "skia/ext/vector_canvas.h"
#include "third_party/skia/include/core/SkData.h"
#include "third_party/skia/include/core/SkRefCnt.h"
#include "third_party/skia/include/core/SkScalar.h"
@@ -33,7 +33,11 @@
namespace printing {
struct PdfMetafileSkiaData {
+ // True when finish page is outstanding for current page.
+ bool PageOutstanding() { return current_page_canvas_; }
Vitaly Buka (NO REVIEWS) 2014/11/05 22:21:38 Can you make it pure struct without methods? I see
hal.canary 2014/11/05 23:10:58 Done.
+
skia::RefPtr<SkPDFDevice> current_page_;
+ skia::RefPtr<SkCanvas> current_page_canvas_;
SkPDFDocument pdf_doc_;
SkDynamicMemoryWStream pdf_stream_;
#if defined(OS_MACOSX)
@@ -51,11 +55,10 @@ bool PdfMetafileSkia::InitFromData(const void* src_buffer,
return data_->pdf_stream_.write(src_buffer, src_buffer_size);
}
-SkBaseDevice* PdfMetafileSkia::StartPageForVectorCanvas(
- const gfx::Size& page_size, const gfx::Rect& content_area,
- const float& scale_factor) {
- DCHECK(!page_outstanding_);
- page_outstanding_ = true;
+bool PdfMetafileSkia::StartPage(const gfx::Size& page_size,
+ const gfx::Rect& content_area,
+ const float& scale_factor) {
+ DCHECK(!data_->PageOutstanding());
// Adjust for the margins and apply the scale factor.
SkMatrix transform;
@@ -67,25 +70,29 @@ SkBaseDevice* PdfMetafileSkia::StartPageForVectorCanvas(
SkISize pdf_page_size = SkISize::Make(page_size.width(), page_size.height());
SkISize pdf_content_size =
SkISize::Make(content_area.width(), content_area.height());
+
skia::RefPtr<SkPDFDevice> pdf_device =
Vitaly Buka (NO REVIEWS) 2014/11/05 22:21:38 can you just assing directly into data_->current_p
hal.canary 2014/11/05 23:10:58 Done.
- skia::AdoptRef(new skia::VectorPlatformDeviceSkia(
+ skia::AdoptRef(new SkPDFDevice(
pdf_page_size, pdf_content_size, transform));
data_->current_page_ = pdf_device;
- return pdf_device.get();
+ data_->current_page_canvas_ =
+ skia::AdoptRef(new SkCanvas(data_->current_page_.get()));
+ return true;
}
-bool PdfMetafileSkia::StartPage(const gfx::Size& page_size,
- const gfx::Rect& content_area,
- const float& scale_factor) {
- NOTREACHED();
- return false;
+skia::VectorCanvas* PdfMetafileSkia::GetVectorCanvasForNewPage(
+ const gfx::Size& page_size, const gfx::Rect& content_area,
Vitaly Buka (NO REVIEWS) 2014/11/05 22:21:38 seems running "git cl format" may fix this formatt
hal.canary 2014/11/05 23:10:58 Done. For some reason I had to `chmod +x buildtoo
+ const float& scale_factor) {
+ (void)this->StartPage(page_size, content_area, scale_factor);
Vitaly Buka (NO REVIEWS) 2014/11/05 22:21:38 if (!StartPage(page_size, content_area, scale_fact
hal.canary 2014/11/05 23:10:58 Done.
+ return data_->current_page_canvas_.get();
}
bool PdfMetafileSkia::FinishPage() {
+ DCHECK(data_->PageOutstanding());
DCHECK(data_->current_page_.get());
+ data_->current_page_canvas_.clear(); // Unref SkCanvas.
data_->pdf_doc_.appendPage(data_->current_page_.get());
- page_outstanding_ = false;
return true;
}
@@ -94,7 +101,7 @@ bool PdfMetafileSkia::FinishDocument() {
if (data_->pdf_stream_.getOffset())
return true;
- if (page_outstanding_)
+ if (data_->PageOutstanding())
FinishPage();
data_->current_page_.clear();
@@ -179,6 +186,18 @@ bool PdfMetafileSkia::RenderPage(unsigned int page_number,
}
#endif
+bool PdfMetafileSkia::SaveTo(base::File* file) const {
+ DCHECK(file);
Vitaly Buka (NO REVIEWS) 2014/11/05 22:21:38 no need DCHECK here. It will crash on file-> anywa
hal.canary 2014/11/05 23:10:58 Done.
+ if (GetDataSize() == 0U)
+ return false;
+ SkAutoDataUnref data(data_->pdf_stream_.copyToData());
+ // TODO(halcanary): rewrite this function without extra data copy
+ // using SkStreamAsset.
+ const char* ptr = reinterpret_cast<const char*>(data->data());
+ int size = base::checked_cast<int>(data->size());
+ return file->WriteAtCurrentPos(ptr, size) == size;
+}
+
#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
bool PdfMetafileSkia::SaveToFD(const base::FileDescriptor& fd) const {
DCHECK_GT(data_->pdf_stream_.getOffset(), 0U);
@@ -188,10 +207,7 @@ bool PdfMetafileSkia::SaveToFD(const base::FileDescriptor& fd) const {
return false;
}
base::File file(fd.fd);
- SkAutoDataUnref data(data_->pdf_stream_.copyToData());
- bool result =
- file.WriteAtCurrentPos(reinterpret_cast<const char*>(data->data()),
- GetDataSize()) == static_cast<int>(GetDataSize());
+ bool result = this->SaveTo(&file);
Vitaly Buka (NO REVIEWS) 2014/11/05 22:21:38 no need this->
hal.canary 2014/11/05 23:10:58 Done.
DLOG_IF(ERROR, !result) << "Failed to save file with fd " << fd.fd;
if (!fd.auto_close)
@@ -201,8 +217,7 @@ bool PdfMetafileSkia::SaveToFD(const base::FileDescriptor& fd) const {
#endif
PdfMetafileSkia::PdfMetafileSkia()
- : data_(new PdfMetafileSkiaData),
- page_outstanding_(false) {
+ : data_(new PdfMetafileSkiaData) {
}
scoped_ptr<PdfMetafileSkia> PdfMetafileSkia::GetMetafileForCurrentPage() {

Powered by Google App Engine
This is Rietveld 408576698