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