Index: printing/pdf_transform.cc |
diff --git a/printing/pdf_transform.cc b/printing/pdf_transform.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f13a6390635e30fbc7f55555f6805f8c27465e00 |
--- /dev/null |
+++ b/printing/pdf_transform.cc |
@@ -0,0 +1,123 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "printing/pdf_transform.h" |
+ |
+#include <algorithm> |
+ |
+#include "base/logging.h" |
+#include "ui/gfx/geometry/rect.h" |
+ |
+namespace printing { |
+ |
+double CalculateScaleFactor(const gfx::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); |
+} |
+ |
+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; |
+} |
+ |
+void CalculateMediaBoxAndCropBox(bool rotated, |
+ bool has_media_box, |
+ bool has_crop_box, |
+ printing::ClipBox* media_box, |
+ printing::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; |
+ } |
+} |
+ |
+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; |
+} |
+ |
+void ScaleClipBox(double scale_factor, ClipBox* box) { |
+ box->left *= scale_factor; |
+ box->right *= scale_factor; |
+ box->bottom *= scale_factor; |
+ box->top *= scale_factor; |
+} |
+ |
+void CalculateScaledClipBoxOffset(const gfx::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; |
+} |
+ |
+void CalculateNonScaledClipBoxOffset(const gfx::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; |
+ } |
+} |
+ |
+} // namespace printing |