1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/utility/printing_handler.h"
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/lazy_instance.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/path_service.h"
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/scoped_native_library.h"
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/chrome_utility_printing_messages.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/utility/cloud_print/bitmap_image.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/utility/cloud_print/pwg_encoder.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/utility/utility_thread.h"
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/page_range.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/pdf_render_settings.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_WIN)
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/win/iat_patch_function.h"
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/emf_win.h"
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/gfx/gdi_util.h"
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_FULL_PRINTING)
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/crash_keys.h"
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/backend/print_backend.h"
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace {
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool Send(IPC::Message* message) {
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return content::UtilityThread::Get()->Send(message);
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ReleaseProcessIfNeeded() {
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  content::UtilityThread::Get()->ReleaseProcessIfNeeded();
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class PdfFunctionsBase {
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PdfFunctionsBase() : render_pdf_to_bitmap_func_(NULL),
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       get_pdf_doc_info_func_(NULL) {}
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool Init() {
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::FilePath pdf_module_path;
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf_module_path) ||
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        !base::PathExists(pdf_module_path)) {
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return false;
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    pdf_lib_.Reset(base::LoadNativeLibrary(pdf_module_path, NULL));
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!pdf_lib_.is_valid()) {
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      LOG(WARNING) << "Couldn't load PDF plugin";
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return false;
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    render_pdf_to_bitmap_func_ =
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        reinterpret_cast<RenderPDFPageToBitmapProc>(
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            pdf_lib_.GetFunctionPointer("RenderPDFPageToBitmap"));
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    LOG_IF(WARNING, !render_pdf_to_bitmap_func_) <<
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        "Missing RenderPDFPageToBitmap";
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    get_pdf_doc_info_func_ =
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        reinterpret_cast<GetPDFDocInfoProc>(
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            pdf_lib_.GetFunctionPointer("GetPDFDocInfo"));
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    LOG_IF(WARNING, !get_pdf_doc_info_func_) << "Missing GetPDFDocInfo";
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!render_pdf_to_bitmap_func_ || !get_pdf_doc_info_func_ ||
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        !PlatformInit(pdf_module_path, pdf_lib_)) {
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      Reset();
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return IsValid();
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool IsValid() const {
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return pdf_lib_.is_valid();
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void Reset() {
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    pdf_lib_.Reset(NULL);
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool RenderPDFPageToBitmap(const void* pdf_buffer,
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             int pdf_buffer_size,
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             int page_number,
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             void* bitmap_buffer,
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             int bitmap_width,
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             int bitmap_height,
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             int dpi_x,
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             int dpi_y,
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             bool autorotate) {
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!render_pdf_to_bitmap_func_)
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return false;
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return render_pdf_to_bitmap_func_(pdf_buffer, pdf_buffer_size, page_number,
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      bitmap_buffer, bitmap_width,
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      bitmap_height, dpi_x, dpi_y, autorotate);
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool GetPDFDocInfo(const void* pdf_buffer,
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     int buffer_size,
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     int* page_count,
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     double* max_page_width) {
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!get_pdf_doc_info_func_)
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return false;
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return get_pdf_doc_info_func_(pdf_buffer, buffer_size, page_count,
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  max_page_width);
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected:
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual bool PlatformInit(
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const base::FilePath& pdf_module_path,
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const base::ScopedNativeLibrary& pdf_lib) {
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return true;
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Exported by PDF plugin.
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  typedef bool (*RenderPDFPageToBitmapProc)(const void* pdf_buffer,
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                            int pdf_buffer_size,
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                            int page_number,
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                            void* bitmap_buffer,
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                            int bitmap_width,
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                            int bitmap_height,
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                            int dpi_x,
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                            int dpi_y,
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                            bool autorotate);
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  typedef bool (*GetPDFDocInfoProc)(const void* pdf_buffer,
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                    int buffer_size, int* page_count,
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                    double* max_page_width);
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  RenderPDFPageToBitmapProc render_pdf_to_bitmap_func_;
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetPDFDocInfoProc get_pdf_doc_info_func_;
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::ScopedNativeLibrary pdf_lib_;
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PdfFunctionsBase);
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_WIN)
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// The 2 below IAT patch functions are almost identical to the code in
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// render_process_impl.cc. This is needed to work around specific Windows APIs
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// used by the Chrome PDF plugin that will fail in the sandbox.
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)static base::win::IATPatchFunction g_iat_patch_createdca;
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)HDC WINAPI UtilityProcess_CreateDCAPatch(LPCSTR driver_name,
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                         LPCSTR device_name,
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                         LPCSTR output,
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                         const DEVMODEA* init_data) {
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (driver_name && (std::string("DISPLAY") == driver_name)) {
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // CreateDC fails behind the sandbox, but not CreateCompatibleDC.
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return CreateCompatibleDC(NULL);
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  NOTREACHED();
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return CreateDCA(driver_name, device_name, output, init_data);
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)static base::win::IATPatchFunction g_iat_patch_get_font_data;
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)DWORD WINAPI UtilityProcess_GetFontDataPatch(
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    HDC hdc, DWORD table, DWORD offset, LPVOID buffer, DWORD length) {
161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int rv = GetFontData(hdc, table, offset, buffer, length);
162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (rv == GDI_ERROR && hdc) {
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    HFONT font = static_cast<HFONT>(GetCurrentObject(hdc, OBJ_FONT));
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    LOGFONT logfont;
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (GetObject(font, sizeof(LOGFONT), &logfont)) {
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      content::UtilityThread::Get()->PreCacheFont(logfont);
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      rv = GetFontData(hdc, table, offset, buffer, length);
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      content::UtilityThread::Get()->ReleaseCachedFonts();
170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return rv;
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class PdfFunctionsWin : public PdfFunctionsBase {
176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PdfFunctionsWin() : render_pdf_to_dc_func_(NULL) {
178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool PlatformInit(
181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const base::FilePath& pdf_module_path,
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const base::ScopedNativeLibrary& pdf_lib) OVERRIDE {
183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Patch the IAT for handling specific APIs known to fail in the sandbox.
184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!g_iat_patch_createdca.is_patched()) {
185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      g_iat_patch_createdca.Patch(pdf_module_path.value().c_str(),
186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  "gdi32.dll", "CreateDCA",
187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  UtilityProcess_CreateDCAPatch);
188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!g_iat_patch_get_font_data.is_patched()) {
191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      g_iat_patch_get_font_data.Patch(pdf_module_path.value().c_str(),
192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      "gdi32.dll", "GetFontData",
193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      UtilityProcess_GetFontDataPatch);
194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    render_pdf_to_dc_func_ =
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      reinterpret_cast<RenderPDFPageToDCProc>(
197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          pdf_lib.GetFunctionPointer("RenderPDFPageToDC"));
198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    LOG_IF(WARNING, !render_pdf_to_dc_func_) << "Missing RenderPDFPageToDC";
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return render_pdf_to_dc_func_ != NULL;
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool RenderPDFPageToDC(const void* pdf_buffer,
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         int buffer_size,
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         int page_number,
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         HDC dc,
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         int dpi_x,
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         int dpi_y,
209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         int bounds_origin_x,
210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         int bounds_origin_y,
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         int bounds_width,
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         int bounds_height,
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         bool fit_to_bounds,
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         bool stretch_to_bounds,
215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         bool keep_aspect_ratio,
216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         bool center_in_bounds,
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         bool autorotate) {
218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!render_pdf_to_dc_func_)
219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return false;
220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return render_pdf_to_dc_func_(pdf_buffer, buffer_size, page_number,
221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  dc, dpi_x, dpi_y, bounds_origin_x,
222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  bounds_origin_y, bounds_width, bounds_height,
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  fit_to_bounds, stretch_to_bounds,
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  keep_aspect_ratio, center_in_bounds,
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  autorotate);
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Exported by PDF plugin.
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  typedef bool (*RenderPDFPageToDCProc)(
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const void* pdf_buffer, int buffer_size, int page_number, HDC dc,
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      int dpi_x, int dpi_y, int bounds_origin_x, int bounds_origin_y,
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      int bounds_width, int bounds_height, bool fit_to_bounds,
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      bool stretch_to_bounds, bool keep_aspect_ratio, bool center_in_bounds,
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      bool autorotate);
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  RenderPDFPageToDCProc render_pdf_to_dc_func_;
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PdfFunctionsWin);
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef PdfFunctionsWin PdfFunctions;
242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else  // OS_WIN
243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef PdfFunctionsBase PdfFunctions;
244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // OS_WIN
245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::LazyInstance<PdfFunctions> g_pdf_lib = LAZY_INSTANCE_INITIALIZER;
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)PrintingHandler::PrintingHandler() {}
251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)PrintingHandler::~PrintingHandler() {}
253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static
255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintingHandler::PreSandboxStartup() {
256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  g_pdf_lib.Get().Init();
257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool PrintingHandler::OnMessageReceived(const IPC::Message& message) {
260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool handled = true;
261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(PrintingHandler, message)
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN)
263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles,
264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        OnRenderPDFPagesToMetafile)
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage,
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        OnRenderPDFPagesToMetafileGetPage)
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop,
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        OnRenderPDFPagesToMetafileStop)
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // OS_WIN
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_FULL_PRINTING)
271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster,
272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        OnRenderPDFPagesToPWGRaster)
273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterCapsAndDefaults,
274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        OnGetPrinterCapsAndDefaults)
275f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterSemanticCapsAndDefaults,
276f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        OnGetPrinterSemanticCapsAndDefaults)
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // ENABLE_FULL_PRINTING
278f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return handled;
281f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN)
284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintingHandler::OnRenderPDFPagesToMetafile(
285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    IPC::PlatformFileForTransit pdf_transit,
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const printing::PdfRenderSettings& settings) {
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pdf_rendering_settings_ = settings;
288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit);
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int page_count = LoadPDF(pdf_file.Pass());
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Send(
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount(page_count));
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PrintingHandler::OnRenderPDFPagesToMetafileGetPage(
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int page_number,
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IPC::PlatformFileForTransit output_file) {
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::File emf_file = IPC::PlatformFileForTransitToFile(output_file);
298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  double scale_factor = 1.0;
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool success =
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      RenderPdfPageToMetafile(page_number, emf_file.Pass(), &scale_factor);
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone(
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      success, scale_factor));
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PrintingHandler::OnRenderPDFPagesToMetafileStop() {
306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ReleaseProcessIfNeeded();
307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // OS_WIN
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_FULL_PRINTING)
312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintingHandler::OnRenderPDFPagesToPWGRaster(
313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    IPC::PlatformFileForTransit pdf_transit,
314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const printing::PdfRenderSettings& settings,
315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const printing::PwgRasterSettings& bitmap_settings,
316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    IPC::PlatformFileForTransit bitmap_transit) {
317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::File pdf = IPC::PlatformFileForTransitToFile(pdf_transit);
318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::File bitmap = IPC::PlatformFileForTransitToFile(bitmap_transit);
319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (RenderPDFPagesToPWGRaster(pdf.Pass(), settings, bitmap_settings,
320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                bitmap.Pass())) {
321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Succeeded());
322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  } else {
323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed());
324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ReleaseProcessIfNeeded();
326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // ENABLE_FULL_PRINTING
328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN)
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint PrintingHandler::LoadPDF(base::File pdf_file) {
331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!g_pdf_lib.Get().IsValid())
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int64 length = pdf_file.GetLength();
335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (length < 0)
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pdf_data_.resize(length);
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (length != pdf_file.Read(0, pdf_data_.data(), pdf_data_.size()))
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int total_page_count = 0;
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!g_pdf_lib.Get().GetPDFDocInfo(
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          &pdf_data_.front(), pdf_data_.size(), &total_page_count, NULL)) {
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return total_page_count;
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool PrintingHandler::RenderPdfPageToMetafile(int page_number,
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              base::File output_file,
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              double* scale_factor) {
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  printing::Emf metafile;
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  metafile.Init();
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // We need to scale down DC to fit an entire page into DC available area.
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Current metafile is based on screen DC and have current screen size.
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Writing outside of those boundaries will result in the cut-off output.
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // On metafiles (this is the case here), scaling down will still record
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // original coordinates and we'll be able to print in full resolution.
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Before playback we'll need to counter the scaling up that will happen
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // in the service (print_system_win.cc).
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *scale_factor =
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gfx::CalculatePageScale(metafile.context(),
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              pdf_rendering_settings_.area().right(),
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              pdf_rendering_settings_.area().bottom());
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::ScaleDC(metafile.context(), *scale_factor);
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The underlying metafile is of type Emf and ignores the arguments passed
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // to StartPage.
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  metafile.StartPage(gfx::Size(), gfx::Rect(), 1);
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!g_pdf_lib.Get().RenderPDFPageToDC(
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          &pdf_data_.front(),
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          pdf_data_.size(),
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          page_number,
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          metafile.context(),
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          pdf_rendering_settings_.dpi(),
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          pdf_rendering_settings_.dpi(),
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          pdf_rendering_settings_.area().x(),
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          pdf_rendering_settings_.area().y(),
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          pdf_rendering_settings_.area().width(),
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          pdf_rendering_settings_.area().height(),
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          true,
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          false,
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          true,
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          true,
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          pdf_rendering_settings_.autorotate())) {
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  metafile.FinishPage();
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  metafile.FinishDocument();
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return metafile.SaveTo(&output_file);
393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
394f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // OS_WIN
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_FULL_PRINTING)
398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool PrintingHandler::RenderPDFPagesToPWGRaster(
399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::File pdf_file,
400f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const printing::PdfRenderSettings& settings,
401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const printing::PwgRasterSettings& bitmap_settings,
402f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::File bitmap_file) {
403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool autoupdate = true;
404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!g_pdf_lib.Get().IsValid())
405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::File::Info info;
408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!pdf_file.GetInfo(&info) || info.size <= 0)
409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string data(info.size, 0);
412f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int data_size = pdf_file.Read(0, &data[0], data.size());
413f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (data_size != static_cast<int>(data.size()))
414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
415f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int total_page_count = 0;
417f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!g_pdf_lib.Get().GetPDFDocInfo(data.data(), data.size(),
418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     &total_page_count, NULL)) {
419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  cloud_print::PwgEncoder encoder;
423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string pwg_header;
424f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  encoder.EncodeDocumentHeader(&pwg_header);
425f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int bytes_written = bitmap_file.WriteAtCurrentPos(pwg_header.data(),
426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                    pwg_header.size());
427f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (bytes_written != static_cast<int>(pwg_header.size()))
428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
429f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
430f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  cloud_print::BitmapImage image(settings.area().size(),
431f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 cloud_print::BitmapImage::BGRA);
432f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (int i = 0; i < total_page_count; ++i) {
433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    int page_number = i;
434f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (bitmap_settings.reverse_page_order) {
436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      page_number = total_page_count - 1 - page_number;
437f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
439f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!g_pdf_lib.Get().RenderPDFPageToBitmap(data.data(),
440f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               data.size(),
441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               page_number,
442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               image.pixel_data(),
443f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               image.size().width(),
444f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               image.size().height(),
445f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               settings.dpi(),
446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               settings.dpi(),
447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               autoupdate)) {
448f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return false;
449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
450f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    cloud_print::PwgHeaderInfo header_info;
452f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    header_info.dpi = settings.dpi();
453f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    header_info.total_pages = total_page_count;
454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Transform odd pages.
456f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (page_number % 2) {
457f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      switch (bitmap_settings.odd_page_transform) {
458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case printing::TRANSFORM_NORMAL:
459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          break;
460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case printing::TRANSFORM_ROTATE_180:
461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          header_info.flipx = true;
462f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          header_info.flipy = true;
463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          break;
464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case printing::TRANSFORM_FLIP_HORIZONTAL:
465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          header_info.flipx = true;
466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          break;
467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        case printing::TRANSFORM_FLIP_VERTICAL:
468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          header_info.flipy = true;
469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          break;
470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      }
471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (bitmap_settings.rotate_all_pages) {
474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      header_info.flipx = !header_info.flipx;
475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      header_info.flipy = !header_info.flipy;
476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    std::string pwg_page;
479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!encoder.EncodePage(image, header_info, &pwg_page))
480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return false;
481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    bytes_written = bitmap_file.WriteAtCurrentPos(pwg_page.data(),
482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                  pwg_page.size());
483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (bytes_written != static_cast<int>(pwg_page.size()))
484f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return false;
485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return true;
487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintingHandler::OnGetPrinterCapsAndDefaults(
490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& printer_name) {
491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_refptr<printing::PrintBackend> print_backend =
492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      printing::PrintBackend::CreateInstance(NULL);
493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  printing::PrinterCapsAndDefaults printer_info;
494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  crash_keys::ScopedPrinterInfo crash_key(
496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      print_backend->GetPrinterDriverInfo(printer_name));
497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (print_backend->GetPrinterCapsAndDefaults(printer_name, &printer_info)) {
499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    Send(new ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Succeeded(
500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        printer_name, printer_info));
501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  } else  {
502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    Send(new ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Failed(
503f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        printer_name));
504f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
505f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ReleaseProcessIfNeeded();
506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintingHandler::OnGetPrinterSemanticCapsAndDefaults(
509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& printer_name) {
510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_refptr<printing::PrintBackend> print_backend =
511f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      printing::PrintBackend::CreateInstance(NULL);
512f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  printing::PrinterSemanticCapsAndDefaults printer_info;
513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
514f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  crash_keys::ScopedPrinterInfo crash_key(
515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      print_backend->GetPrinterDriverInfo(printer_name));
516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (print_backend->GetPrinterSemanticCapsAndDefaults(printer_name,
518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                       &printer_info)) {
519f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded(
520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        printer_name, printer_info));
521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  } else {
522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed(
523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        printer_name));
524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ReleaseProcessIfNeeded();
526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // ENABLE_FULL_PRINTING
528