diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-04-05 17:15:33 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-04-11 07:47:18 +0000 |
commit | 7324afb043a0b1e623d8e8eb906cdc53bdeb4685 (patch) | |
tree | a3fe2d74ea9c9e142c390dac4ca0e219382ace46 /chromium/printing | |
parent | 6a4cabb866f66d4128a97cdc6d9d08ce074f1247 (diff) | |
download | qtwebengine-chromium-7324afb043a0b1e623d8e8eb906cdc53bdeb4685.tar.gz |
BASELINE: Update Chromium to 58.0.3029.54
Change-Id: I67f57065a7afdc8e4614adb5c0230281428df4d1
Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
Diffstat (limited to 'chromium/printing')
-rw-r--r-- | chromium/printing/BUILD.gn | 1 | ||||
-rw-r--r-- | chromium/printing/DEPS | 1 | ||||
-rw-r--r-- | chromium/printing/OWNERS | 2 | ||||
-rw-r--r-- | chromium/printing/metafile_skia_wrapper.cc | 9 | ||||
-rw-r--r-- | chromium/printing/metafile_skia_wrapper.h | 7 | ||||
-rw-r--r-- | chromium/printing/pdf_metafile_skia.cc | 27 | ||||
-rw-r--r-- | chromium/printing/pdf_metafile_skia.h | 11 | ||||
-rw-r--r-- | chromium/printing/pdf_render_settings.h | 61 | ||||
-rw-r--r-- | chromium/printing/print_settings.cc | 2 | ||||
-rw-r--r-- | chromium/printing/print_settings.h | 22 | ||||
-rw-r--r-- | chromium/printing/print_settings_initializer_win.cc | 80 | ||||
-rw-r--r-- | chromium/printing/printing_context.h | 5 | ||||
-rw-r--r-- | chromium/printing/printing_context_chromeos.h | 3 |
13 files changed, 160 insertions, 71 deletions
diff --git a/chromium/printing/BUILD.gn b/chromium/printing/BUILD.gn index ad70ef1e940..8883c7582e0 100644 --- a/chromium/printing/BUILD.gn +++ b/chromium/printing/BUILD.gn @@ -90,6 +90,7 @@ component("printing") { "//base", "//base:i18n", "//base/third_party/dynamic_annotations", + "//cc/paint", "//skia", "//third_party/icu", "//ui/gfx", diff --git a/chromium/printing/DEPS b/chromium/printing/DEPS index 97c498be708..038006b3bf4 100644 --- a/chromium/printing/DEPS +++ b/chromium/printing/DEPS @@ -1,4 +1,5 @@ include_rules = [ + "+cc/paint", "+jni", "+skia/ext", "+third_party/icu/source/common/unicode", diff --git a/chromium/printing/OWNERS b/chromium/printing/OWNERS index 7487e48a9ee..db535f8b460 100644 --- a/chromium/printing/OWNERS +++ b/chromium/printing/OWNERS @@ -7,3 +7,5 @@ vitalybuka@chromium.org per-file printing_context_android*=avayvod@chromium.org per-file printing_context_android*=dgn@chromium.org + +# COMPONENT: Internals>Printing diff --git a/chromium/printing/metafile_skia_wrapper.cc b/chromium/printing/metafile_skia_wrapper.cc index 5d3bd6e9d6c..3ba38f25958 100644 --- a/chromium/printing/metafile_skia_wrapper.cc +++ b/chromium/printing/metafile_skia_wrapper.cc @@ -3,7 +3,6 @@ // found in the LICENSE file. #include "printing/metafile_skia_wrapper.h" -#include "skia/ext/platform_canvas.h" #include "third_party/skia/include/core/SkMetaData.h" #include "third_party/skia/include/core/SkRefCnt.h" @@ -16,21 +15,21 @@ const char kMetafileKey[] = "CrMetafile"; } // namespace // static -void MetafileSkiaWrapper::SetMetafileOnCanvas(const SkCanvas& canvas, +void MetafileSkiaWrapper::SetMetafileOnCanvas(cc::PaintCanvas* canvas, PdfMetafileSkia* metafile) { sk_sp<MetafileSkiaWrapper> wrapper; // Can't use sk_make_sp<>() because the constructor is private. if (metafile) wrapper = sk_sp<MetafileSkiaWrapper>(new MetafileSkiaWrapper(metafile)); - SkMetaData& meta = skia::GetMetaData(canvas); + SkMetaData& meta = canvas->getMetaData(); meta.setRefCnt(kMetafileKey, wrapper.get()); } // static PdfMetafileSkia* MetafileSkiaWrapper::GetMetafileFromCanvas( - const SkCanvas& canvas) { - SkMetaData& meta = skia::GetMetaData(canvas); + cc::PaintCanvas* canvas) { + SkMetaData& meta = canvas->getMetaData(); SkRefCnt* value; if (!meta.findRefCnt(kMetafileKey, &value) || !value) return nullptr; diff --git a/chromium/printing/metafile_skia_wrapper.h b/chromium/printing/metafile_skia_wrapper.h index 6236e85a4c4..4bca57fd6af 100644 --- a/chromium/printing/metafile_skia_wrapper.h +++ b/chromium/printing/metafile_skia_wrapper.h @@ -5,11 +5,10 @@ #ifndef PRINTING_METAFILE_SKIA_WRAPPER_H_ #define PRINTING_METAFILE_SKIA_WRAPPER_H_ +#include "cc/paint/paint_canvas.h" #include "printing/printing_export.h" #include "third_party/skia/include/core/SkRefCnt.h" -class SkCanvas; - namespace printing { class PdfMetafileSkia; @@ -20,10 +19,10 @@ class PdfMetafileSkia; // as long as the canvas. class PRINTING_EXPORT MetafileSkiaWrapper : public SkRefCnt { public: - static void SetMetafileOnCanvas(const SkCanvas& canvas, + static void SetMetafileOnCanvas(cc::PaintCanvas* canvas, PdfMetafileSkia* metafile); - static PdfMetafileSkia* GetMetafileFromCanvas(const SkCanvas& canvas); + static PdfMetafileSkia* GetMetafileFromCanvas(cc::PaintCanvas* canvas); private: explicit MetafileSkiaWrapper(PdfMetafileSkia* metafile); diff --git a/chromium/printing/pdf_metafile_skia.cc b/chromium/printing/pdf_metafile_skia.cc index fa8c129e9d1..6b548afd76b 100644 --- a/chromium/printing/pdf_metafile_skia.cc +++ b/chromium/printing/pdf_metafile_skia.cc @@ -12,9 +12,11 @@ #include "base/files/file.h" #include "base/memory/ptr_util.h" #include "base/time/time.h" +#include "cc/paint/paint_canvas.h" +#include "cc/paint/paint_record.h" +#include "cc/paint/paint_recorder.h" #include "printing/print_settings.h" #include "third_party/skia/include/core/SkDocument.h" -#include "third_party/skia/include/core/SkPictureRecorder.h" #include "third_party/skia/include/core/SkStream.h" // Note that headers in third_party/skia/src are fragile. This is // an experimental, fragile, and diagnostic-only document type. @@ -77,7 +79,7 @@ sk_sp<SkDocument> MakePdfDocument(SkWStream* wStream) { namespace printing { struct Page { - Page(SkSize s, sk_sp<SkPicture> c) : size_(s), content_(std::move(c)) {} + Page(SkSize s, sk_sp<cc::PaintRecord> c) : size_(s), content_(std::move(c)) {} Page(Page&& that) : size_(that.size_), content_(std::move(that.content_)) {} Page(const Page&) = default; Page& operator=(const Page&) = default; @@ -87,17 +89,17 @@ struct Page { return *this; } SkSize size_; - sk_sp<SkPicture> content_; + sk_sp<cc::PaintRecord> content_; }; struct PdfMetafileSkiaData { - SkPictureRecorder recorder_; // Current recording + cc::PaintRecorder recorder_; // Current recording std::vector<Page> pages_; std::unique_ptr<SkStreamAsset> pdf_data_; // The scale factor is used because Blink occasionally calls - // SkCanvas::getTotalMatrix() even though the total matrix is not as + // PaintCanvas::getTotalMatrix() even though the total matrix is not as // meaningful for a vector canvas as for a raster canvas. float scale_factor_; SkSize size_; @@ -135,7 +137,7 @@ void PdfMetafileSkia::StartPage(const gfx::Size& page_size, DCHECK(!data_->recorder_.getRecordingCanvas()); float inverse_scale = 1.0 / scale_factor; - SkCanvas* canvas = data_->recorder_.beginRecording( + cc::PaintCanvas* canvas = data_->recorder_.beginRecording( inverse_scale * page_size.width(), inverse_scale * page_size.height()); // Recording canvas is owned by the data_->recorder_. No ref() necessary. if (content_area != gfx::Rect(page_size)) { @@ -154,7 +156,7 @@ void PdfMetafileSkia::StartPage(const gfx::Size& page_size, // http://crbug.com/469656 } -SkCanvas* PdfMetafileSkia::GetVectorCanvasForNewPage( +cc::PaintCanvas* PdfMetafileSkia::GetVectorCanvasForNewPage( const gfx::Size& page_size, const gfx::Rect& content_area, const float& scale_factor) { @@ -166,10 +168,10 @@ bool PdfMetafileSkia::FinishPage() { if (!data_->recorder_.getRecordingCanvas()) return false; - sk_sp<SkPicture> pic = data_->recorder_.finishRecordingAsPicture(); + sk_sp<cc::PaintRecord> pic = data_->recorder_.finishRecordingAsPicture(); if (data_->scale_factor_ != 1.0f) { - SkCanvas* canvas = data_->recorder_.beginRecording(data_->size_.width(), - data_->size_.height()); + cc::PaintCanvas* canvas = data_->recorder_.beginRecording( + data_->size_.width(), data_->size_.height()); canvas->scale(data_->scale_factor_, data_->scale_factor_); canvas->drawPicture(pic); pic = data_->recorder_.finishRecordingAsPicture(); @@ -198,7 +200,8 @@ bool PdfMetafileSkia::FinishDocument() { } for (const Page& page : data_->pages_) { - SkCanvas* canvas = doc->beginPage(page.size_.width(), page.size_.height()); + cc::PaintCanvas* canvas( + doc->beginPage(page.size_.width(), page.size_.height())); canvas->drawPicture(page.content_); doc->endPage(); } @@ -309,7 +312,7 @@ PdfMetafileSkia::PdfMetafileSkia(SkiaDocumentType type) std::unique_ptr<PdfMetafileSkia> PdfMetafileSkia::GetMetafileForCurrentPage( SkiaDocumentType type) { // If we only ever need the metafile for the last page, should we - // only keep a handle on one SkPicture? + // only keep a handle on one PaintRecord? std::unique_ptr<PdfMetafileSkia> metafile(new PdfMetafileSkia(type)); if (data_->pages_.size() == 0) diff --git a/chromium/printing/pdf_metafile_skia.h b/chromium/printing/pdf_metafile_skia.h index cb69b916857..948e27f45e0 100644 --- a/chromium/printing/pdf_metafile_skia.h +++ b/chromium/printing/pdf_metafile_skia.h @@ -11,6 +11,7 @@ #include "base/macros.h" #include "build/build_config.h" +#include "cc/paint/paint_canvas.h" #include "printing/metafile.h" #include "skia/ext/platform_canvas.h" @@ -18,8 +19,6 @@ #include <windows.h> #endif -class SkCanvas; - namespace printing { enum SkiaDocumentType { @@ -73,13 +72,13 @@ class PRINTING_EXPORT PdfMetafileSkia : public Metafile { // This method calls StartPage and then returns an appropriate // PlatformCanvas implementation bound to the context created by - // StartPage or NULL on error. The SkCanvas pointer that + // StartPage or NULL on error. The PaintCanvas pointer that // is returned is owned by this PdfMetafileSkia object and does not // need to be ref()ed or unref()ed. The canvas will remain valid // until FinishPage() or FinishDocument() is called. - SkCanvas* GetVectorCanvasForNewPage(const gfx::Size& page_size, - const gfx::Rect& content_area, - const float& scale_factor); + cc::PaintCanvas* GetVectorCanvasForNewPage(const gfx::Size& page_size, + const gfx::Rect& content_area, + const float& scale_factor); private: std::unique_ptr<PdfMetafileSkiaData> data_; diff --git a/chromium/printing/pdf_render_settings.h b/chromium/printing/pdf_render_settings.h index d9e8f9e7801..545def02da7 100644 --- a/chromium/printing/pdf_render_settings.h +++ b/chromium/printing/pdf_render_settings.h @@ -5,9 +5,13 @@ #ifndef PRINTING_PDF_RENDER_SETTINGS_H_ #define PRINTING_PDF_RENDER_SETTINGS_H_ +#include <stdint.h> + +#include "ipc/ipc_message_macros.h" #include "ipc/ipc_message_utils.h" #include "ipc/ipc_param_traits.h" #include "printing/printing_export.h" +#include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/ipc/geometry/gfx_param_traits.h" #include "ui/gfx/ipc/skia/gfx_skia_param_traits.h" @@ -16,45 +20,38 @@ namespace printing { // Defining PDF rendering settings. struct PdfRenderSettings { - PdfRenderSettings() : dpi(0), autorotate(false) {} - PdfRenderSettings(gfx::Rect area, int dpi, bool autorotate) - : area(area), dpi(dpi), autorotate(autorotate) {} + enum Mode { + NORMAL = 0, +#if defined(OS_WIN) + GDI_TEXT, + POSTSCRIPT_LEVEL2, + POSTSCRIPT_LEVEL3, + LAST = POSTSCRIPT_LEVEL3, +#else + LAST = NORMAL, +#endif + }; + + PdfRenderSettings() : dpi(0), autorotate(false), mode(Mode::NORMAL) {} + PdfRenderSettings(gfx::Rect area, + gfx::Point offsets, + int dpi, + bool autorotate, + Mode mode) + : area(area), + offsets(offsets), + dpi(dpi), + autorotate(autorotate), + mode(mode) {} ~PdfRenderSettings() {} gfx::Rect area; + gfx::Point offsets; int dpi; bool autorotate; + Mode mode; }; } // namespace printing -namespace IPC { -template <> -struct ParamTraits<printing::PdfRenderSettings> { - typedef printing::PdfRenderSettings param_type; - static void Write(base::Pickle* m, const param_type& p) { - WriteParam(m, p.area); - WriteParam(m, p.dpi); - WriteParam(m, p.autorotate); - } - - static bool Read(const base::Pickle* m, - base::PickleIterator* iter, - param_type* r) { - return ReadParam(m, iter, &r->area) && - ReadParam(m, iter, &r->dpi) && - ReadParam(m, iter, &r->autorotate); - } - - static void Log(const param_type& p, std::string* l) { - LogParam(p.area, l); - l->append(", "); - LogParam(p.dpi, l); - l->append(", "); - LogParam(p.autorotate, l); - } -}; - -} // namespace IPC - #endif // PRINTING_PDF_RENDER_SETTINGS_H_ diff --git a/chromium/printing/print_settings.cc b/chromium/printing/print_settings.cc index 00e1ccef113..a234cd92575 100644 --- a/chromium/printing/print_settings.cc +++ b/chromium/printing/print_settings.cc @@ -153,7 +153,7 @@ void PrintSettings::Clear() { supports_alpha_blend_ = true; #if defined(OS_WIN) print_text_with_gdi_ = false; - printer_is_xps_ = false; + printer_type_ = PrintSettings::PrinterType::TYPE_NONE; #endif } diff --git a/chromium/printing/print_settings.h b/chromium/printing/print_settings.h index 67ad091c180..1311ddbeb91 100644 --- a/chromium/printing/print_settings.h +++ b/chromium/printing/print_settings.h @@ -34,6 +34,15 @@ PRINTING_EXPORT const std::string& GetAgent(); // OS-independent print settings. class PRINTING_EXPORT PrintSettings { public: +#if defined(OS_WIN) + enum PrinterType { + TYPE_NONE = 0, + TYPE_XPS, + TYPE_POSTSCRIPT_LEVEL2, + TYPE_POSTSCRIPT_LEVEL3 + }; +#endif + // Media properties requested by the user. Default instance represents // default media selection. struct RequestedMedia { @@ -154,8 +163,14 @@ class PRINTING_EXPORT PrintSettings { void set_print_text_with_gdi(bool use_gdi) { print_text_with_gdi_ = use_gdi; } bool print_text_with_gdi() const { return print_text_with_gdi_; } - void set_printer_is_xps(bool is_xps) { printer_is_xps_ = is_xps; } - bool printer_is_xps() const { return printer_is_xps_; } + void set_printer_type(PrinterType type) { printer_type_ = type; } + bool printer_is_xps() const { return printer_type_ == PrinterType::TYPE_XPS;} + bool printer_is_ps2() const { + return printer_type_ == PrinterType::TYPE_POSTSCRIPT_LEVEL2; + } + bool printer_is_ps3() const { + return printer_type_ == PrinterType::TYPE_POSTSCRIPT_LEVEL3; + } #endif // Cookie generator. It is used to initialize PrintedDocument with its @@ -228,8 +243,7 @@ class PRINTING_EXPORT PrintSettings { // True to print text with GDI. bool print_text_with_gdi_; - // True if the printer is an XPS printer. - bool printer_is_xps_; + PrinterType printer_type_; #endif // If margin type is custom, this is what was requested. diff --git a/chromium/printing/print_settings_initializer_win.cc b/chromium/printing/print_settings_initializer_win.cc index 0776e9e5c0e..685c8fd6cf9 100644 --- a/chromium/printing/print_settings_initializer_win.cc +++ b/chromium/printing/print_settings_initializer_win.cc @@ -12,7 +12,7 @@ namespace printing { namespace { -bool HasEscapeSupprt(HDC hdc, DWORD escape) { +bool HasEscapeSupport(HDC hdc, DWORD escape) { const char* ptr = reinterpret_cast<const char*>(&escape); return ExtEscape(hdc, QUERYESCSUPPORT, sizeof(escape), ptr, 0, nullptr) > 0; } @@ -21,7 +21,7 @@ bool IsTechnology(HDC hdc, const char* technology) { if (::GetDeviceCaps(hdc, TECHNOLOGY) != DT_RASPRINTER) return false; - if (!HasEscapeSupprt(hdc, GETTECHNOLOGY)) + if (!HasEscapeSupport(hdc, GETTECHNOLOGY)) return false; char buf[256]; @@ -31,6 +31,61 @@ bool IsTechnology(HDC hdc, const char* technology) { return strcmp(buf, technology) == 0; } +void SetPrinterToGdiMode(HDC hdc) { + // Try to set to GDI centric mode + DWORD mode = PSIDENT_GDICENTRIC; + const char* ptr = reinterpret_cast<const char*>(&mode); + ExtEscape(hdc, POSTSCRIPT_IDENTIFY, sizeof(DWORD), ptr, 0, nullptr); +} + +int GetPrinterPostScriptLevel(HDC hdc) { + constexpr int param = FEATURESETTING_PSLEVEL; + const char* param_char_ptr = reinterpret_cast<const char*>(¶m); + int param_out = 0; + char* param_out_char_ptr = reinterpret_cast<char*>(¶m_out); + if (ExtEscape(hdc, GET_PS_FEATURESETTING, sizeof(param), param_char_ptr, + sizeof(param_out), param_out_char_ptr) > 0) { + return param_out; + } + return 0; +} + +bool IsPrinterPostScript(HDC hdc, int* level) { + static constexpr char kPostScriptDriver[] = "PostScript"; + + // If printer does not support POSTSCRIPT_IDENTIFY, it cannot be set to GDI + // mode to check the language level supported. See if it looks like a + // postscript printer and supports the postscript functions that are + // supported in compatability mode. If so set to level 2 postscript. + if (!HasEscapeSupport(hdc, POSTSCRIPT_IDENTIFY)) { + if (!IsTechnology(hdc, kPostScriptDriver)) + return false; + if (!HasEscapeSupport(hdc, POSTSCRIPT_PASSTHROUGH) || + !HasEscapeSupport(hdc, POSTSCRIPT_DATA)) { + return false; + } + *level = 2; + return true; + } + + // Printer supports POSTSCRIPT_IDENTIFY so we can assume it has a postscript + // driver. Set the printer to GDI mode in order to query the postscript + // level. Use GDI mode instead of PostScript mode so that if level detection + // fails or returns language level < 2 we can fall back to normal printing. + // Note: This escape must be called before other escapes. + SetPrinterToGdiMode(hdc); + if (!HasEscapeSupport(hdc, GET_PS_FEATURESETTING)) { + // Can't query the level, use level 2 to be safe + *level = 2; + return true; + } + + // Get the language level. If invalid or < 2, return false to set printer to + // normal printing mode. + *level = GetPrinterPostScriptLevel(hdc); + return *level == 2 || *level == 3; +} + bool IsPrinterXPS(HDC hdc) { static constexpr char kXPSDriver[] = "http://schemas.microsoft.com/xps/2005/06"; @@ -84,8 +139,25 @@ void PrintSettingsInitializerWin::InitPrintSettings( print_settings->SetPrinterPrintableArea(physical_size_device_units, printable_area_device_units, false); - - print_settings->set_printer_is_xps(IsPrinterXPS(hdc)); + // Check for postscript first so that we can change the mode with the + // first command. + int level; + if (IsPrinterPostScript(hdc, &level)) { + if (level == 2) { + print_settings->set_printer_type( + PrintSettings::PrinterType::TYPE_POSTSCRIPT_LEVEL2); + return; + } + DCHECK_EQ(3, level); + print_settings->set_printer_type( + PrintSettings::PrinterType::TYPE_POSTSCRIPT_LEVEL3); + return; + } + if (IsPrinterXPS(hdc)) { + print_settings->set_printer_type(PrintSettings::PrinterType::TYPE_XPS); + return; + } + print_settings->set_printer_type(PrintSettings::PrinterType::TYPE_NONE); } } // namespace printing diff --git a/chromium/printing/printing_context.h b/chromium/printing/printing_context.h index 6335461b06d..362dfe9ba6b 100644 --- a/chromium/printing/printing_context.h +++ b/chromium/printing/printing_context.h @@ -125,6 +125,8 @@ class PRINTING_EXPORT PrintingContext { return settings_; } + int job_id() const { return job_id_; } + protected: explicit PrintingContext(Delegate* delegate); @@ -146,6 +148,9 @@ class PRINTING_EXPORT PrintingContext { // Did the user cancel the print job. volatile bool abort_printing_; + // The job id for the current job. The value is 0 if no jobs are active. + int job_id_; + private: DISALLOW_COPY_AND_ASSIGN(PrintingContext); }; diff --git a/chromium/printing/printing_context_chromeos.h b/chromium/printing/printing_context_chromeos.h index efd2fb7cb1a..eec0e38a23d 100644 --- a/chromium/printing/printing_context_chromeos.h +++ b/chromium/printing/printing_context_chromeos.h @@ -45,9 +45,6 @@ class PRINTING_EXPORT PrintingContextChromeos : public PrintingContext { // Lazily initializes |printer_|. Result InitializeDevice(const std::string& device); - // id for ongoing print job. 0 if no job is active. - int job_id_; - CupsConnection connection_; std::unique_ptr<CupsPrinter> printer_; |