Index: pdf/pdf.cc |
=================================================================== |
--- pdf/pdf.cc (revision 0) |
+++ pdf/pdf.cc (revision 0) |
@@ -0,0 +1,244 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "pdf/pdf.h" |
+ |
+#if defined(OS_WIN) |
+#include <windows.h> |
+#endif |
+ |
+#include "base/command_line.h" |
+#include "base/logging.h" |
+#include "pdf/instance.h" |
+#include "pdf/out_of_process_instance.h" |
+#include "ppapi/c/ppp.h" |
+#include "ppapi/cpp/private/pdf.h" |
+ |
+bool g_sdk_initialized_via_pepper = false; |
+ |
+// The Mac release builds discard CreateModule and the entire PDFModule |
+// definition because they are not referenced here. This causes the Pepper |
+// exports (PPP_GetInterface etc) to not be exported. So we force the linker |
+// to include this code by using __attribute__((used)). |
+#if __GNUC__ >= 4 |
+#define PDF_USED __attribute__((used)) |
+#else |
+#define PDF_USED |
+#endif |
+ |
+#if defined(OS_WIN) |
+HMODULE g_hmodule; |
+ |
+void HandleInvalidParameter(const wchar_t* expression, |
+ const wchar_t* function, |
+ const wchar_t* file, |
+ unsigned int line, |
+ uintptr_t reserved) { |
+ // Do the same as Chrome's CHECK(false) which is undefined. |
+ ::base::debug::BreakDebugger(); |
+ return; |
+} |
+ |
+void HandlePureVirtualCall() { |
+ // Do the same as Chrome's CHECK(false) which is undefined. |
+ ::base::debug::BreakDebugger(); |
+ return; |
+} |
+ |
+ |
+BOOL APIENTRY DllMain(HMODULE module, DWORD reason_for_call, LPVOID reserved) { |
+ g_hmodule = module; |
+ if (reason_for_call == DLL_PROCESS_ATTACH) { |
+ // On windows following handlers work only inside module. So breakpad in |
+ // chrome.dll does not catch that. To avoid linking related code or |
+ // duplication breakpad_win.cc::InitCrashReporter() just catch errors here |
+ // and crash in a way interceptable by breakpad of parent module. |
+ _set_invalid_parameter_handler(HandleInvalidParameter); |
+ _set_purecall_handler(HandlePureVirtualCall); |
+ } |
+ return TRUE; |
+} |
+ |
+#endif |
+ |
+namespace pp { |
+ |
+PDF_USED Module* CreateModule() { |
+ return new chrome_pdf::PDFModule(); |
+} |
+ |
+} // namespace pp |
+ |
+namespace chrome_pdf { |
+ |
+PDFModule::PDFModule() { |
+} |
+ |
+PDFModule::~PDFModule() { |
+ if (g_sdk_initialized_via_pepper) { |
+ chrome_pdf::ShutdownSDK(); |
+ g_sdk_initialized_via_pepper = false; |
+ } |
+} |
+ |
+bool PDFModule::Init() { |
+ return true; |
+} |
+ |
+pp::Instance* PDFModule::CreateInstance(PP_Instance instance) { |
+ if (!g_sdk_initialized_via_pepper) { |
+ void* data = NULL; |
+#if defined(OS_WIN) |
+ data = g_hmodule; |
+#endif |
+ if (!chrome_pdf::InitializeSDK(data)) |
+ return NULL; |
+ g_sdk_initialized_via_pepper = true; |
+ } |
+ |
+ if (pp::PDF::IsOutOfProcess(pp::InstanceHandle(instance))) |
+ return new OutOfProcessInstance(instance); |
+ return new Instance(instance); |
+} |
+ |
+} // namespace chrome_pdf |
+ |
+extern "C" { |
+ |
+// TODO(sanjeevr): It might make sense to provide more stateful wrappers over |
+// the internal PDF SDK (such as LoadDocument, LoadPage etc). Determine if we |
+// need to provide this. |
+// Wrapper exports over the PDF engine that can be used by an external module |
+// such as Chrome (since Chrome cannot directly pull in PDFium sources). |
+#if defined(OS_WIN) |
+// |pdf_buffer| is the buffer that contains the entire PDF document to be |
+// rendered. |
+// |buffer_size| is the size of pdf_buffer in bytes. |
+// |page_number| is the 0-based index of the page to be rendered. |
+// |dc| is the device context to render into. |
+// |dpi_x| and |dpi_y| are the x and y resolutions respectively. If either value |
+// is -1, the dpi from the DC will be used. |
+// |bounds_origin_x|, |bounds_origin_y|, |bounds_width| and |bounds_height| |
+// specify a bounds rectangle within the DC in which to render the PDF page. |
+// |fit_to_bounds| specifies whether the output should be shrunk to fit the |
+// supplied bounds if the page size is larger than the bounds in any |
+// dimension. If this is false, parts of the PDF page that lie outside the |
+// bounds will be clipped. |
+// |stretch_to_bounds| specifies whether the output should be stretched to fit |
+// the supplied bounds if the page size is smaller than the bounds in any |
+// dimension. |
+// If both |fit_to_bounds| and |stretch_to_bounds| are true, then |
+// |fit_to_bounds| is honored first. |
+// |keep_aspect_ratio| If any scaling is to be done is true, this flag specifies |
+// whether the original aspect ratio of the page should be preserved while |
+// scaling. |
+// |center_in_bounds| specifies whether the final image (after any scaling is |
+// done) should be centered within the given bounds. |
+// |autorotate| specifies whether the final image should be rotated to match |
+// the output bound. |
+// Returns false if the document or the page number are not valid. |
+PP_EXPORT bool RenderPDFPageToDC(const void* pdf_buffer, |
+ int buffer_size, |
+ int page_number, |
+ HDC dc, |
+ int dpi_x, |
+ int dpi_y, |
+ int bounds_origin_x, |
+ int bounds_origin_y, |
+ int bounds_width, |
+ int bounds_height, |
+ bool fit_to_bounds, |
+ bool stretch_to_bounds, |
+ bool keep_aspect_ratio, |
+ bool center_in_bounds, |
+ bool autorotate) { |
+ if (!g_sdk_initialized_via_pepper) { |
+ if (!chrome_pdf::InitializeSDK(g_hmodule)) { |
+ return false; |
+ } |
+ } |
+ scoped_ptr<chrome_pdf::PDFEngineExports> engine_exports( |
+ chrome_pdf::PDFEngineExports::Create()); |
+ chrome_pdf::PDFEngineExports::RenderingSettings settings( |
+ dpi_x, dpi_y, pp::Rect(bounds_origin_x, bounds_origin_y, bounds_width, |
+ bounds_height), |
+ fit_to_bounds, stretch_to_bounds, keep_aspect_ratio, center_in_bounds, |
+ autorotate); |
+ bool ret = engine_exports->RenderPDFPageToDC(pdf_buffer, buffer_size, |
+ page_number, settings, dc); |
+ if (!g_sdk_initialized_via_pepper) { |
+ chrome_pdf::ShutdownSDK(); |
+ } |
+ return ret; |
+} |
+ |
+#endif // OS_WIN |
+ |
+// |page_count| and |max_page_width| are optional and can be NULL. |
+// Returns false if the document is not valid. |
+PDF_USED PP_EXPORT |
+bool GetPDFDocInfo(const void* pdf_buffer, |
+ int buffer_size, int* page_count, |
+ double* max_page_width) { |
+ if (!g_sdk_initialized_via_pepper) { |
+ void* data = NULL; |
+#if defined(OS_WIN) |
+ data = g_hmodule; |
+#endif |
+ if (!chrome_pdf::InitializeSDK(data)) |
+ return false; |
+ } |
+ scoped_ptr<chrome_pdf::PDFEngineExports> engine_exports( |
+ chrome_pdf::PDFEngineExports::Create()); |
+ bool ret = engine_exports->GetPDFDocInfo( |
+ pdf_buffer, buffer_size, page_count, max_page_width); |
+ if (!g_sdk_initialized_via_pepper) { |
+ chrome_pdf::ShutdownSDK(); |
+ } |
+ return ret; |
+} |
+ |
+// Renders PDF page into 4-byte per pixel BGRA color bitmap. |
+// |pdf_buffer| is the buffer that contains the entire PDF document to be |
+// rendered. |
+// |pdf_buffer_size| is the size of pdf_buffer in bytes. |
+// |page_number| is the 0-based index of the page to be rendered. |
+// |bitmap_buffer| is the output buffer for bitmap. |
+// |bitmap_width| is the width of the output bitmap. |
+// |bitmap_height| is the height of the output bitmap. |
+// |dpi| is the resolutions. |
+// |autorotate| specifies whether the final image should be rotated to match |
+// the output bound. |
+// Returns false if the document or the page number are not valid. |
+PDF_USED PP_EXPORT |
+bool RenderPDFPageToBitmap(const void* pdf_buffer, |
+ int pdf_buffer_size, |
+ int page_number, |
+ void* bitmap_buffer, |
+ int bitmap_width, |
+ int bitmap_height, |
+ int dpi, |
+ bool autorotate) { |
+ if (!g_sdk_initialized_via_pepper) { |
+ void* data = NULL; |
+#if defined(OS_WIN) |
+ data = g_hmodule; |
+#endif |
+ if (!chrome_pdf::InitializeSDK(data)) |
+ return false; |
+ } |
+ scoped_ptr<chrome_pdf::PDFEngineExports> engine_exports( |
+ chrome_pdf::PDFEngineExports::Create()); |
+ chrome_pdf::PDFEngineExports::RenderingSettings settings( |
+ dpi, dpi, pp::Rect(bitmap_width, bitmap_height), true, false, true, true, |
+ autorotate); |
+ bool ret = engine_exports->RenderPDFPageToBitmap( |
+ pdf_buffer, pdf_buffer_size, page_number, settings, bitmap_buffer); |
+ if (!g_sdk_initialized_via_pepper) { |
+ chrome_pdf::ShutdownSDK(); |
+ } |
+ return ret; |
+} |
+ |
+} // extern "C" |
Property changes on: pdf\pdf.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |