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 |