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

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

Issue 2541843005: Revert "Printing: Load the source PDF only once." (Closed)
Patch Set: Created 4 years 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 3989 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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