| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "pdf/pdfium/pdfium_engine.h" | 5 #include "pdf/pdfium/pdfium_engine.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| (...skipping 3983 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3994 autorotate(autorotate) {} | 3994 autorotate(autorotate) {} |
| 3995 | 3995 |
| 3996 PDFEngineExports::RenderingSettings::RenderingSettings( | 3996 PDFEngineExports::RenderingSettings::RenderingSettings( |
| 3997 const RenderingSettings& that) = default; | 3997 const RenderingSettings& that) = default; |
| 3998 | 3998 |
| 3999 PDFEngineExports* PDFEngineExports::Get() { | 3999 PDFEngineExports* PDFEngineExports::Get() { |
| 4000 return g_pdf_engine_exports.Pointer(); | 4000 return g_pdf_engine_exports.Pointer(); |
| 4001 } | 4001 } |
| 4002 | 4002 |
| 4003 #if defined(OS_WIN) | 4003 #if defined(OS_WIN) |
| 4004 bool PDFiumEngineExports::RenderPDFPageToDC(const void* pdf_buffer, | 4004 bool PDFiumEngineExports::RenderPDFPageToDC(void* pdf_handle, |
| 4005 int buffer_size, | |
| 4006 int page_number, | 4005 int page_number, |
| 4007 const RenderingSettings& settings, | 4006 const RenderingSettings& settings, |
| 4008 HDC dc) { | 4007 HDC dc) { |
| 4009 FPDF_DOCUMENT doc = FPDF_LoadMemDocument(pdf_buffer, buffer_size, nullptr); | 4008 FPDF_DOCUMENT doc = pdf_handle; |
| 4010 if (!doc) | 4009 if (!doc) |
| 4011 return false; | 4010 return false; |
| 4012 FPDF_PAGE page = FPDF_LoadPage(doc, page_number); | 4011 FPDF_PAGE page = FPDF_LoadPage(doc, page_number); |
| 4013 if (!page) { | 4012 if (!page) |
| 4014 FPDF_CloseDocument(doc); | |
| 4015 return false; | 4013 return false; |
| 4016 } | 4014 |
| 4017 RenderingSettings new_settings = settings; | 4015 RenderingSettings new_settings = settings; |
| 4018 // calculate the page size | 4016 // calculate the page size |
| 4019 if (new_settings.dpi_x == -1) | 4017 if (new_settings.dpi_x == -1) |
| 4020 new_settings.dpi_x = GetDeviceCaps(dc, LOGPIXELSX); | 4018 new_settings.dpi_x = GetDeviceCaps(dc, LOGPIXELSX); |
| 4021 if (new_settings.dpi_y == -1) | 4019 if (new_settings.dpi_y == -1) |
| 4022 new_settings.dpi_y = GetDeviceCaps(dc, LOGPIXELSY); | 4020 new_settings.dpi_y = GetDeviceCaps(dc, LOGPIXELSY); |
| 4023 | 4021 |
| 4024 pp::Rect dest; | 4022 pp::Rect dest; |
| 4025 int rotate = CalculatePosition(page, new_settings, &dest); | 4023 int rotate = CalculatePosition(page, new_settings, &dest); |
| 4026 | 4024 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4060 StretchDIBits(dc, dest.x(), dest.y(), dest.width(), dest.height(), | 4058 StretchDIBits(dc, dest.x(), dest.y(), dest.width(), dest.height(), |
| 4061 0, 0, dest.width(), dest.height(), | 4059 0, 0, dest.width(), dest.height(), |
| 4062 FPDFBitmap_GetBuffer(bitmap), &bmi, DIB_RGB_COLORS, SRCCOPY); | 4060 FPDFBitmap_GetBuffer(bitmap), &bmi, DIB_RGB_COLORS, SRCCOPY); |
| 4063 FPDFBitmap_Destroy(bitmap); | 4061 FPDFBitmap_Destroy(bitmap); |
| 4064 } else { | 4062 } else { |
| 4065 FPDF_RenderPage(dc, page, dest.x(), dest.y(), dest.width(), dest.height(), | 4063 FPDF_RenderPage(dc, page, dest.x(), dest.y(), dest.width(), dest.height(), |
| 4066 rotate, FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); | 4064 rotate, FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); |
| 4067 } | 4065 } |
| 4068 RestoreDC(dc, save_state); | 4066 RestoreDC(dc, save_state); |
| 4069 FPDF_ClosePage(page); | 4067 FPDF_ClosePage(page); |
| 4070 FPDF_CloseDocument(doc); | |
| 4071 return true; | 4068 return true; |
| 4072 } | 4069 } |
| 4073 | 4070 |
| 4074 void PDFiumEngineExports::SetPDFEnsureTypefaceCharactersAccessible( | 4071 void PDFiumEngineExports::SetPDFEnsureTypefaceCharactersAccessible( |
| 4075 PDFEnsureTypefaceCharactersAccessible func) { | 4072 PDFEnsureTypefaceCharactersAccessible func) { |
| 4076 FPDF_SetTypefaceAccessibleFunc( | 4073 FPDF_SetTypefaceAccessibleFunc( |
| 4077 reinterpret_cast<PDFiumEnsureTypefaceCharactersAccessible>(func)); | 4074 reinterpret_cast<PDFiumEnsureTypefaceCharactersAccessible>(func)); |
| 4078 } | 4075 } |
| 4079 | 4076 |
| 4080 void PDFiumEngineExports::SetPDFUseGDIPrinting(bool enable) { | 4077 void PDFiumEngineExports::SetPDFUseGDIPrinting(bool enable) { |
| 4081 FPDF_SetPrintTextWithGDI(enable); | 4078 FPDF_SetPrintTextWithGDI(enable); |
| 4082 } | 4079 } |
| 4083 #endif // defined(OS_WIN) | 4080 #endif // defined(OS_WIN) |
| 4084 | 4081 |
| 4085 bool PDFiumEngineExports::RenderPDFPageToBitmap( | 4082 bool PDFiumEngineExports::RenderPDFPageToBitmap( |
| 4086 const void* pdf_buffer, | 4083 void* pdf_handle, |
| 4087 int pdf_buffer_size, | |
| 4088 int page_number, | 4084 int page_number, |
| 4089 const RenderingSettings& settings, | 4085 const RenderingSettings& settings, |
| 4090 void* bitmap_buffer) { | 4086 void* bitmap_buffer) { |
| 4091 FPDF_DOCUMENT doc = | 4087 FPDF_DOCUMENT doc = pdf_handle; |
| 4092 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); | |
| 4093 if (!doc) | 4088 if (!doc) |
| 4094 return false; | 4089 return false; |
| 4095 FPDF_PAGE page = FPDF_LoadPage(doc, page_number); | 4090 FPDF_PAGE page = FPDF_LoadPage(doc, page_number); |
| 4096 if (!page) { | 4091 if (!page) |
| 4097 FPDF_CloseDocument(doc); | |
| 4098 return false; | 4092 return false; |
| 4099 } | |
| 4100 | 4093 |
| 4101 pp::Rect dest; | 4094 pp::Rect dest; |
| 4102 int rotate = CalculatePosition(page, settings, &dest); | 4095 int rotate = CalculatePosition(page, settings, &dest); |
| 4103 | 4096 |
| 4104 FPDF_BITMAP bitmap = | 4097 FPDF_BITMAP bitmap = |
| 4105 FPDFBitmap_CreateEx(settings.bounds.width(), settings.bounds.height(), | 4098 FPDFBitmap_CreateEx(settings.bounds.width(), settings.bounds.height(), |
| 4106 FPDFBitmap_BGRA, bitmap_buffer, | 4099 FPDFBitmap_BGRA, bitmap_buffer, |
| 4107 settings.bounds.width() * 4); | 4100 settings.bounds.width() * 4); |
| 4108 // Clear the bitmap | 4101 // Clear the bitmap |
| 4109 FPDFBitmap_FillRect(bitmap, 0, 0, settings.bounds.width(), | 4102 FPDFBitmap_FillRect(bitmap, 0, 0, settings.bounds.width(), |
| 4110 settings.bounds.height(), 0xFFFFFFFF); | 4103 settings.bounds.height(), 0xFFFFFFFF); |
| 4111 // Shift top-left corner of bounds to (0, 0) if it's not there. | 4104 // Shift top-left corner of bounds to (0, 0) if it's not there. |
| 4112 dest.set_point(dest.point() - settings.bounds.point()); | 4105 dest.set_point(dest.point() - settings.bounds.point()); |
| 4113 FPDF_RenderPageBitmap( | 4106 FPDF_RenderPageBitmap( |
| 4114 bitmap, page, dest.x(), dest.y(), dest.width(), dest.height(), rotate, | 4107 bitmap, page, dest.x(), dest.y(), dest.width(), dest.height(), rotate, |
| 4115 FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); | 4108 FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); |
| 4116 FPDFBitmap_Destroy(bitmap); | 4109 FPDFBitmap_Destroy(bitmap); |
| 4117 FPDF_ClosePage(page); | 4110 FPDF_ClosePage(page); |
| 4118 FPDF_CloseDocument(doc); | |
| 4119 return true; | 4111 return true; |
| 4120 } | 4112 } |
| 4121 | 4113 |
| 4122 bool PDFiumEngineExports::GetPDFDocInfo(const void* pdf_buffer, | 4114 bool PDFiumEngineExports::GetPDFDocInfo(const void* pdf_buffer, |
| 4123 int buffer_size, | 4115 int buffer_size, |
| 4124 int* page_count, | 4116 int* page_count, |
| 4125 double* max_page_width) { | 4117 double* max_page_width, |
| 4118 void** pdf_handle) { |
| 4126 FPDF_DOCUMENT doc = FPDF_LoadMemDocument(pdf_buffer, buffer_size, nullptr); | 4119 FPDF_DOCUMENT doc = FPDF_LoadMemDocument(pdf_buffer, buffer_size, nullptr); |
| 4127 if (!doc) | 4120 if (!doc) |
| 4128 return false; | 4121 return false; |
| 4122 |
| 4129 int page_count_local = FPDF_GetPageCount(doc); | 4123 int page_count_local = FPDF_GetPageCount(doc); |
| 4130 if (page_count) { | 4124 if (page_count) |
| 4131 *page_count = page_count_local; | 4125 *page_count = page_count_local; |
| 4132 } | 4126 |
| 4133 if (max_page_width) { | 4127 if (max_page_width) { |
| 4134 *max_page_width = 0; | 4128 *max_page_width = 0; |
| 4135 for (int page_number = 0; page_number < page_count_local; page_number++) { | 4129 for (int page_number = 0; page_number < page_count_local; page_number++) { |
| 4136 double page_width = 0; | 4130 double page_width = 0; |
| 4137 double page_height = 0; | 4131 double page_height = 0; |
| 4138 FPDF_GetPageSizeByIndex(doc, page_number, &page_width, &page_height); | 4132 FPDF_GetPageSizeByIndex(doc, page_number, &page_width, &page_height); |
| 4139 if (page_width > *max_page_width) { | 4133 *max_page_width = std::max(*max_page_width, page_width); |
| 4140 *max_page_width = page_width; | |
| 4141 } | |
| 4142 } | 4134 } |
| 4143 } | 4135 } |
| 4144 FPDF_CloseDocument(doc); | 4136 |
| 4137 if (pdf_handle) |
| 4138 *pdf_handle = doc; // Caller takes ownership. |
| 4139 else |
| 4140 FPDF_CloseDocument(pdf_handle); |
| 4145 return true; | 4141 return true; |
| 4146 } | 4142 } |
| 4147 | 4143 |
| 4148 bool PDFiumEngineExports::GetPDFPageSizeByIndex( | 4144 void PDFiumEngineExports::ReleasePDFHandle(void* pdf_handle) { |
| 4149 const void* pdf_buffer, | 4145 FPDF_CloseDocument(pdf_handle); |
| 4150 int pdf_buffer_size, | 4146 } |
| 4151 int page_number, | 4147 |
| 4152 double* width, | 4148 bool PDFiumEngineExports::GetPDFPageSizeByIndex(void* pdf_handle, |
| 4153 double* height) { | 4149 int page_number, |
| 4154 FPDF_DOCUMENT doc = | 4150 double* width, |
| 4155 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); | 4151 double* height) { |
| 4156 if (!doc) | 4152 FPDF_DOCUMENT doc = pdf_handle; |
| 4157 return false; | 4153 return doc && FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; |
| 4158 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; | |
| 4159 FPDF_CloseDocument(doc); | |
| 4160 return success; | |
| 4161 } | 4154 } |
| 4162 | 4155 |
| 4163 } // namespace chrome_pdf | 4156 } // namespace chrome_pdf |
| OLD | NEW |