| Index: pdf/pdfium/pdfium_engine.cc
|
| diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
|
| index 7e167042640850a2a3b2566a8cb1768da51414df..863108861822fe3c77b6d5d6bca8785a09e86185 100644
|
| --- a/pdf/pdfium/pdfium_engine.cc
|
| +++ b/pdf/pdfium/pdfium_engine.cc
|
| @@ -36,6 +36,7 @@
|
| #include "ppapi/cpp/url_response_info.h"
|
| #include "ppapi/cpp/var.h"
|
| #include "ppapi/cpp/var_dictionary.h"
|
| +#include "printing/pdf_transform.h"
|
| #include "printing/units.h"
|
| #include "third_party/pdfium/public/fpdf_edit.h"
|
| #include "third_party/pdfium/public/fpdf_ext.h"
|
| @@ -46,6 +47,7 @@
|
| #include "third_party/pdfium/public/fpdf_sysfontinfo.h"
|
| #include "third_party/pdfium/public/fpdf_transformpage.h"
|
| #include "ui/events/keycodes/keyboard_codes.h"
|
| +#include "ui/gfx/geometry/rect.h"
|
| #include "v8/include/v8.h"
|
|
|
| using printing::ConvertUnit;
|
| @@ -323,163 +325,6 @@ void SetPageSizeAndContentRect(bool rotated,
|
| }
|
| }
|
|
|
| -// Calculate the scale factor between |content_rect| and a page of size
|
| -// |src_width| x |src_height|.
|
| -//
|
| -// |content_rect| specifies the printable area of the destination page, with
|
| -// origin at left-bottom. Values are in points.
|
| -// |src_width| specifies the source page width in points.
|
| -// |src_height| specifies the source page height in points.
|
| -// |rotated| True if source page is rotated 90 degree or 270 degree.
|
| -double CalculateScaleFactor(const pp::Rect& content_rect,
|
| - double src_width,
|
| - double src_height,
|
| - bool rotated) {
|
| - if (src_width == 0 || src_height == 0)
|
| - return 1.0;
|
| -
|
| - double actual_source_page_width = rotated ? src_height : src_width;
|
| - double actual_source_page_height = rotated ? src_width : src_height;
|
| - double ratio_x = static_cast<double>(content_rect.width()) /
|
| - actual_source_page_width;
|
| - double ratio_y = static_cast<double>(content_rect.height()) /
|
| - actual_source_page_height;
|
| - return std::min(ratio_x, ratio_y);
|
| -}
|
| -
|
| -// A rect struct for use with FPDF bounding box functions.
|
| -// Remember with PDFs, origin is bottom-left.
|
| -struct ClipBox {
|
| - float left;
|
| - float right;
|
| - float top;
|
| - float bottom;
|
| -};
|
| -
|
| -// Make the default size to be letter size (8.5" X 11"). We are just following
|
| -// the PDFium way of handling these corner cases. PDFium always consider
|
| -// US-Letter as the default page size.
|
| -void SetDefaultClipBox(bool rotated, ClipBox* clip_box) {
|
| - const int kDpi = 72;
|
| - const float kPaperWidth = 8.5 * kDpi;
|
| - const float kPaperHeight = 11 * kDpi;
|
| - clip_box->left = 0;
|
| - clip_box->bottom = 0;
|
| - clip_box->right = rotated ? kPaperHeight : kPaperWidth;
|
| - clip_box->top = rotated ? kPaperWidth : kPaperHeight;
|
| -}
|
| -
|
| -// Set the media box and/or crop box as needed. If both boxes are there, then
|
| -// nothing needs to be done. If one box is missing, then fill it with the value
|
| -// from the other box. If both boxes are missing, then they both get the default
|
| -// value from SetDefaultClipBox(), based on |rotated|.
|
| -void CalculateMediaBoxAndCropBox(bool rotated,
|
| - bool has_media_box,
|
| - bool has_crop_box,
|
| - ClipBox* media_box,
|
| - ClipBox* crop_box) {
|
| - if (!has_media_box && !has_crop_box) {
|
| - SetDefaultClipBox(rotated, crop_box);
|
| - SetDefaultClipBox(rotated, media_box);
|
| - } else if (has_crop_box && !has_media_box) {
|
| - *media_box = *crop_box;
|
| - } else if (has_media_box && !has_crop_box) {
|
| - *crop_box = *media_box;
|
| - }
|
| -}
|
| -
|
| -// Compute source clip box boundaries based on the crop box / media box of
|
| -// source page.
|
| -//
|
| -// |media_box| The PDF's media box.
|
| -// |crop_box| The PDF's crop box.
|
| -ClipBox CalculateClipBoxBoundary(const ClipBox& media_box,
|
| - const ClipBox& crop_box) {
|
| - ClipBox clip_box;
|
| -
|
| - // Clip |media_box| to the size of |crop_box|, but ignore |crop_box| if it is
|
| - // bigger than |media_box|.
|
| - clip_box.left =
|
| - (crop_box.left < media_box.left) ? media_box.left : crop_box.left;
|
| - clip_box.right =
|
| - (crop_box.right > media_box.right) ? media_box.right : crop_box.right;
|
| - clip_box.top = (crop_box.top > media_box.top) ? media_box.top : crop_box.top;
|
| - clip_box.bottom =
|
| - (crop_box.bottom < media_box.bottom) ? media_box.bottom : crop_box.bottom;
|
| - return clip_box;
|
| -}
|
| -
|
| -// Scale |box| by |scale_factor|.
|
| -void ScaleClipBox(double scale_factor, ClipBox* box) {
|
| - box->left *= scale_factor;
|
| - box->right *= scale_factor;
|
| - box->bottom *= scale_factor;
|
| - box->top *= scale_factor;
|
| -}
|
| -
|
| -// Calculate the clip box translation offset for a page that does need to be
|
| -// scaled. All parameters are in points.
|
| -//
|
| -// |content_rect| specifies the printable area of the destination page, with
|
| -// origin at left-bottom.
|
| -// |source_clip_box| specifies the source clip box positions, relative to
|
| -// origin at left-bottom.
|
| -// |offset_x| and |offset_y| will contain the final translation offsets for the
|
| -// source clip box, relative to origin at left-bottom.
|
| -void CalculateScaledClipBoxOffset(const pp::Rect& content_rect,
|
| - const ClipBox& source_clip_box,
|
| - double* offset_x, double* offset_y) {
|
| - const float clip_box_width = source_clip_box.right - source_clip_box.left;
|
| - const float clip_box_height = source_clip_box.top - source_clip_box.bottom;
|
| -
|
| - // Center the intended clip region to real clip region.
|
| - *offset_x = (content_rect.width() - clip_box_width) / 2 + content_rect.x() -
|
| - source_clip_box.left;
|
| - *offset_y = (content_rect.height() - clip_box_height) / 2 + content_rect.y() -
|
| - source_clip_box.bottom;
|
| -}
|
| -
|
| -// Calculate the clip box offset for a page that does not need to be scaled.
|
| -// All parameters are in points.
|
| -//
|
| -// |content_rect| specifies the printable area of the destination page, with
|
| -// origin at left-bottom.
|
| -// |rotation| specifies the source page rotation values which are N / 90
|
| -// degrees.
|
| -// |page_width| specifies the screen destination page width.
|
| -// |page_height| specifies the screen destination page height.
|
| -// |source_clip_box| specifies the source clip box positions, relative to origin
|
| -// at left-bottom.
|
| -// |offset_x| and |offset_y| will contain the final translation offsets for the
|
| -// source clip box, relative to origin at left-bottom.
|
| -void CalculateNonScaledClipBoxOffset(const pp::Rect& content_rect, int rotation,
|
| - int page_width, int page_height,
|
| - const ClipBox& source_clip_box,
|
| - double* offset_x, double* offset_y) {
|
| - // Align the intended clip region to left-top corner of real clip region.
|
| - switch (rotation) {
|
| - case 0:
|
| - *offset_x = -1 * source_clip_box.left;
|
| - *offset_y = page_height - source_clip_box.top;
|
| - break;
|
| - case 1:
|
| - *offset_x = 0;
|
| - *offset_y = -1 * source_clip_box.bottom;
|
| - break;
|
| - case 2:
|
| - *offset_x = page_width - source_clip_box.right;
|
| - *offset_y = 0;
|
| - break;
|
| - case 3:
|
| - *offset_x = page_height - source_clip_box.right;
|
| - *offset_y = page_width - source_clip_box.top;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -}
|
| -
|
| // This formats a string with special 0xfffe end-of-line hyphens the same way
|
| // as Adobe Reader. When a hyphen is encountered, the next non-CR/LF whitespace
|
| // becomes CR+LF and the hyphen is erased. If there is no whitespace between
|
| @@ -3419,13 +3264,17 @@ void PDFiumEngine::TransformPDFPageForPrinting(
|
| const int actual_page_height =
|
| rotated ? page_size.width() : page_size.height();
|
|
|
| + const gfx::Rect gfx_content_rect(content_rect.x(),
|
| + content_rect.y(),
|
| + content_rect.width(),
|
| + content_rect.height());
|
| const double scale_factor = fit_to_page ?
|
| - CalculateScaleFactor(
|
| - content_rect, src_page_width, src_page_height, rotated) : 1.0;
|
| + printing::CalculateScaleFactor(
|
| + gfx_content_rect, src_page_width, src_page_height, rotated) : 1.0;
|
|
|
| // Calculate positions for the clip box.
|
| - ClipBox media_box;
|
| - ClipBox crop_box;
|
| + printing::ClipBox media_box;
|
| + printing::ClipBox crop_box;
|
| bool has_media_box = !!FPDFPage_GetMediaBox(page,
|
| &media_box.left,
|
| &media_box.bottom,
|
| @@ -3436,21 +3285,23 @@ void PDFiumEngine::TransformPDFPageForPrinting(
|
| &crop_box.bottom,
|
| &crop_box.right,
|
| &crop_box.top);
|
| - CalculateMediaBoxAndCropBox(
|
| + printing::CalculateMediaBoxAndCropBox(
|
| rotated, has_media_box, has_crop_box, &media_box, &crop_box);
|
| - ClipBox source_clip_box = CalculateClipBoxBoundary(media_box, crop_box);
|
| - ScaleClipBox(scale_factor, &source_clip_box);
|
| + printing::ClipBox source_clip_box =
|
| + printing::CalculateClipBoxBoundary(media_box, crop_box);
|
| + printing::ScaleClipBox(scale_factor, &source_clip_box);
|
|
|
| // Calculate the translation offset values.
|
| double offset_x = 0;
|
| double offset_y = 0;
|
| if (fit_to_page) {
|
| - CalculateScaledClipBoxOffset(content_rect, source_clip_box, &offset_x,
|
| - &offset_y);
|
| + printing::CalculateScaledClipBoxOffset(
|
| + gfx_content_rect, source_clip_box, &offset_x, &offset_y);
|
| } else {
|
| - CalculateNonScaledClipBoxOffset(content_rect, src_page_rotation,
|
| - actual_page_width, actual_page_height,
|
| - source_clip_box, &offset_x, &offset_y);
|
| + printing::CalculateNonScaledClipBoxOffset(
|
| + gfx_content_rect, src_page_rotation,
|
| + actual_page_width, actual_page_height,
|
| + source_clip_box, &offset_x, &offset_y);
|
| }
|
|
|
| // Reset the media box and crop box. When the page has crop box and media box,
|
|
|