Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(438)

Side by Side Diff: pdf/pdfium/pdfium_engine.cc

Issue 2508563003: Printing: Load the source PDF only once. (Closed)
Patch Set: More renaming Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pdf/pdfium/pdfium_engine.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « pdf/pdfium/pdfium_engine.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698