| // Copyright 2019 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. |
| |
| #ifndef PDF_DRAW_UTILS_COORDINATES_H_ |
| #define PDF_DRAW_UTILS_COORDINATES_H_ |
| |
| #include <stddef.h> |
| |
| #include <vector> |
| |
| #include "ui/gfx/geometry/rect.h" |
| |
| namespace gfx { |
| class Point; |
| class Size; |
| } // namespace gfx |
| |
| namespace chrome_pdf { |
| namespace draw_utils { |
| |
| // Struct for sending the sizes of the insets applied to the page to accommodate |
| // for shadows/separators. I.e. the left component corresponds to the amount a |
| // page was inset on the left side. |
| struct PageInsetSizes { |
| int left; |
| int top; |
| int right; |
| int bottom; |
| }; |
| |
| // Struct for sending a page's gfx::Rect object along with its corresponding |
| // index in the PDF document. |
| struct IndexedPage { |
| IndexedPage(int index, const gfx::Rect& rect); |
| IndexedPage(const IndexedPage& other); |
| IndexedPage& operator=(const IndexedPage& other); |
| ~IndexedPage(); |
| |
| int index; |
| gfx::Rect rect; |
| }; |
| |
| // Given a right page's `bottom_gap`, reduce it to only the part of `bottom_gap` |
| // that is directly below the right page by translating `bottom_gap` to `page_x` |
| // and halving its width. This avoids over-drawing empty space on the already |
| // drawn left page and the empty space to the right of the page. |
| void AdjustBottomGapForRightSidePage(int page_x, gfx::Rect* bottom_gap); |
| |
| // Given `doc_width`, horizontally center `rect` within the document. |
| // `doc_width` must be greater than or equal to `rect`. |
| void CenterRectHorizontally(int doc_width, gfx::Rect* rect); |
| |
| // Given `rect_size`, sets the width of `doc_size` to the max of `rect_size`'s |
| // width and `doc_size`'s width. Also adds the height of `rect_size` to |
| // `doc_size`'s height. |
| void ExpandDocumentSize(const gfx::Size& rect_size, gfx::Size* doc_size); |
| |
| // Given `page_rect_bottom` and `bottom_rect` in the same coordinate space, |
| // return a gfx::Rect object representing the portion of `bottom_rect` that is |
| // below `page_rect_bottom`. Returns an empty rectangle if `page_rect_bottom` |
| // is greater than or equal to `bottom_rect.bottom()`. |
| gfx::Rect GetBottomGapBetweenRects(int page_rect_bottom, |
| const gfx::Rect& bottom_rect); |
| |
| // Given `visible_pages` and `visible_screen` in the same coordinates, return |
| // the index of the page in `visible_pages` which has the largest proportion of |
| // its area intersecting with `visible_screen`. If there is a tie, return the |
| // page with the lower index. Returns -1 if `visible_pages` is empty. Returns |
| // first page in `visible_pages` if no page intersects with `visible_screen`. |
| int GetMostVisiblePage(const std::vector<IndexedPage>& visible_pages, |
| const gfx::Rect& visible_screen); |
| |
| // Given `page_index`, and `num_of_pages`, return the configuration of |
| // `single_view_insets` and `horizontal_separator` for the current page in |
| // two-up view. |
| PageInsetSizes GetPageInsetsForTwoUpView( |
| size_t page_index, |
| size_t num_of_pages, |
| const PageInsetSizes& single_view_insets, |
| int horizontal_separator); |
| |
| // Given `rect_size` and `document_size` create a horizontally centered |
| // gfx::Rect placed at the bottom of the current document. |
| gfx::Rect GetRectForSingleView(const gfx::Size& rect_size, |
| const gfx::Size& document_size); |
| |
| // Given `rect` in document coordinates, a `position` in screen coordinates, |
| // and a `zoom` factor, returns the rectangle in screen coordinates (i.e. |
| // 0,0 is top left corner of plugin area). An empty `rect` will always |
| // result in an empty output rect. For `zoom`, a value of 1 means 100%. |
| // `zoom` is never less than or equal to 0. |
| gfx::Rect GetScreenRect(const gfx::Rect& rect, |
| const gfx::Point& position, |
| double zoom); |
| |
| // Given `page_y`, `page_height`, `inset_sizes`, `doc_width`, and |
| // `bottom_separator` all in the same coordinate space, return the page and its |
| // surrounding border areas and `bottom_separator`. This includes the sides if |
| // the page is narrower than the document. |
| gfx::Rect GetSurroundingRect(int page_y, |
| int page_height, |
| const PageInsetSizes& inset_sizes, |
| int doc_width, |
| int bottom_separator); |
| |
| // Given `page_rect` in document coordinates, `inset_sizes`, and |
| // `bottom_separator`, return a gfx::Rect object representing the gap on the |
| // left side of the page created by insetting the page. I.e. the difference, |
| // on the left side, between the initial `page_rect` and the `page_rect` inset |
| // with `inset_sizes` (current value of `page_rect`). |
| // The x coordinate of `page_rect` must be greater than or equal to |
| // `inset_sizes.left`. |
| gfx::Rect GetLeftFillRect(const gfx::Rect& page_rect, |
| const PageInsetSizes& inset_sizes, |
| int bottom_separator); |
| |
| // Same as GetLeftFillRect(), but for the right side of `page_rect` and also |
| // depends on the `doc_width`. Additionally, `doc_width` must be greater than or |
| // equal to the sum of `page_rect.right` and `inset_sizes.right`. |
| gfx::Rect GetRightFillRect(const gfx::Rect& page_rect, |
| const PageInsetSizes& inset_sizes, |
| int doc_width, |
| int bottom_separator); |
| |
| // Same as GetLeftFillRect(), but for the bottom side of `page_rect`. |
| gfx::Rect GetBottomFillRect(const gfx::Rect& page_rect, |
| const PageInsetSizes& inset_sizes, |
| int bottom_separator); |
| |
| // Given `rect_size`, create a gfx::Rect where the top-right corner lies at |
| // `position`. The width of `rect_size` must be less than or equal to the x |
| // value for `position`. |
| gfx::Rect GetLeftRectForTwoUpView(const gfx::Size& rect_size, |
| const gfx::Point& position); |
| |
| // Given `rect_size`, create a gfx::Rect where the top-left corner lies at |
| // `position`. |
| gfx::Rect GetRightRectForTwoUpView(const gfx::Size& rect_size, |
| const gfx::Point& position); |
| |
| } // namespace draw_utils |
| } // namespace chrome_pdf |
| |
| #endif // PDF_DRAW_UTILS_COORDINATES_H_ |