summaryrefslogtreecommitdiff
path: root/chromium/printing
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-04-05 17:15:33 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-04-11 07:47:18 +0000
commit7324afb043a0b1e623d8e8eb906cdc53bdeb4685 (patch)
treea3fe2d74ea9c9e142c390dac4ca0e219382ace46 /chromium/printing
parent6a4cabb866f66d4128a97cdc6d9d08ce074f1247 (diff)
downloadqtwebengine-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.gn1
-rw-r--r--chromium/printing/DEPS1
-rw-r--r--chromium/printing/OWNERS2
-rw-r--r--chromium/printing/metafile_skia_wrapper.cc9
-rw-r--r--chromium/printing/metafile_skia_wrapper.h7
-rw-r--r--chromium/printing/pdf_metafile_skia.cc27
-rw-r--r--chromium/printing/pdf_metafile_skia.h11
-rw-r--r--chromium/printing/pdf_render_settings.h61
-rw-r--r--chromium/printing/print_settings.cc2
-rw-r--r--chromium/printing/print_settings.h22
-rw-r--r--chromium/printing/print_settings_initializer_win.cc80
-rw-r--r--chromium/printing/printing_context.h5
-rw-r--r--chromium/printing/printing_context_chromeos.h3
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*>(&param);
+ int param_out = 0;
+ char* param_out_char_ptr = reinterpret_cast<char*>(&param_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_;