// 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 #include #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& 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_