Movatterモバイル変換


[0]ホーム

URL:


Google Git
Sign in
chromium /chromium /src /refs/heads/main /. /pdf /document_layout.h
blob: 2c93d70fcbc6bb7cd3ca8676ad4debca7508f9e2 [file] [log] [blame] [edit]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PDF_DOCUMENT_LAYOUT_H_
#define PDF_DOCUMENT_LAYOUT_H_
#include<cstddef>
#include<vector>
#include"base/check_op.h"
#include"base/i18n/rtl.h"
#include"base/values.h"
#include"pdf/page_orientation.h"
#include"ui/gfx/geometry/insets.h"
#include"ui/gfx/geometry/rect.h"
#include"ui/gfx/geometry/size.h"
namespace chrome_pdf{
// Layout of pages within a PDF document. Pages are placed as rectangles
// (possibly rotated) in a non-overlapping vertical sequence.
//
// All layout units are pixels.
//
// The `Options` class controls the behavior of the layout, such as the default
// orientation of pages.
classDocumentLayoutfinal{
public:
// TODO(crbug.com/40155509): Add `kTwoUpEven` page spread support.
enumclassPageSpread{
kOneUp=0,// One page per spread.
kTwoUpOdd=1,// Two pages per spread, with odd pages first.
};
// Options controlling layout behavior.
classOptionsfinal{
public:
Options();
Options(constOptions& other);
Options&operator=(constOptions& other);
~Options();
friendbooloperator==(constOptions& lhs,constOptions& rhs){
return lhs.direction()== rhs.direction()&&
lhs.default_page_orientation()== rhs.default_page_orientation()&&
lhs.page_spread()== rhs.page_spread();
}
friendbooloperator!=(constOptions& lhs,constOptions& rhs){
return!(lhs== rhs);
}
// Serializes layout options to a base::Value::Dict.
base::Value::DictToValue()const;
// Deserializes layout options from a base::Value::Dict.
voidFromValue(constbase::Value::Dict& value);
// Page layout direction. This is tied to the direction of the user's UI,
// rather than the direction of individual pages.
base::i18n::TextDirection direction()const{return direction_;}
void set_direction(base::i18n::TextDirection direction){
direction_= direction;
}
PageOrientation default_page_orientation()const{
return default_page_orientation_;
}
// Rotates default page orientation 90 degrees clockwise.
voidRotatePagesClockwise();
// Rotates default page orientation 90 degrees counterclockwise.
voidRotatePagesCounterclockwise();
PageSpread page_spread()const{return page_spread_;}
// Changes two-up view status.
void set_page_spread(PageSpread spread){ page_spread_= spread;}
private:
base::i18n::TextDirection direction_=base::i18n::UNKNOWN_DIRECTION;
PageOrientation default_page_orientation_=PageOrientation::kOriginal;
PageSpread page_spread_=PageSpread::kOneUp;
};
staticconstexpr gfx::Insets kSingleViewInsets=
gfx::Insets::TLBR(/*top=*/3,/*left=*/5,/*bottom=*/7,/*right=*/5);
staticconstexprint32_t kBottomSeparator=4;
staticconstexprint32_t kHorizontalSeparator=1;
DocumentLayout();
DocumentLayout(constDocumentLayout& other)=delete;
DocumentLayout&operator=(constDocumentLayout& other)=delete;
~DocumentLayout();
// Returns the layout options.
constOptions& options()const{return options_;}
// Sets the layout options. If certain options with immediate effect change
// (such as the default page orientation), the layout will be marked dirty.
//
// TODO(kmoon): We shouldn't have layout options that take effect immediately.
voidSetOptions(constOptions& options);
// Returns true if the layout has been modified since the last call to
// clear_dirty(). The initial state is false (clean), which assumes
// appropriate default behavior for an initially empty layout.
bool dirty()const{return dirty_;}
// Clears the dirty() state of the layout. This should be called after any
// layout changes have been applied.
void clear_dirty(){ dirty_=false;}
// Returns the layout's total size.
const gfx::Size& size()const{return size_;}
size_t page_count()const{return page_layouts_.size();}
// Gets the layout rectangle for a page. Only valid after computing a layout.
const gfx::Rect& page_rect(size_t page_index)const{
DCHECK_LT(page_index, page_count());
return page_layouts_[page_index].outer_rect;
}
// Gets the layout rectangle for a page's bounds (which excludes additional
// regions like page shadows). Only valid after computing a layout.
const gfx::Rect& page_bounds_rect(size_t page_index)const{
DCHECK_LT(page_index, page_count());
return page_layouts_[page_index].inner_rect;
}
// Computes the layout for a given list of `page_sizes` based on `options_`.
voidComputeLayout(const std::vector<gfx::Size>& page_sizes);
private:
// Layout of a single page.
structPageLayout{
// Bounding rectangle for the page with decorations.
gfx::Rect outer_rect;
// Bounding rectangle for the page without decorations.
gfx::Rect inner_rect;
};
// Helpers for ComputeLayout() handling different page spreads.
voidComputeOneUpLayout(const std::vector<gfx::Size>& page_sizes);
voidComputeTwoUpOddLayout(const std::vector<gfx::Size>& page_sizes);
// Copies `source_rect` to `destination_rect`, setting `dirty_` to true if
// `destination_rect` is modified as a result.
voidCopyRectIfModified(const gfx::Rect& source_rect,
gfx::Rect& destination_rect);
Options options_;
// Indicates if the layout has changed in an externally-observable way,
// usually as a result of calling `ComputeLayout()` with different inputs.
//
// Some operations that may trigger layout changes:
// * Changing page sizes
// * Adding or removing pages
// * Changing page orientations
bool dirty_=false;
// Layout's total size.
gfx::Size size_;
std::vector<PageLayout> page_layouts_;
};
}// namespace chrome_pdf
#endif// PDF_DOCUMENT_LAYOUT_H_

[8]ページ先頭

©2009-2025 Movatter.jp