page_number.cc 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "printing/page_number.h"
  5. #include <algorithm>
  6. #include <limits>
  7. #include "base/check_op.h"
  8. #include "printing/print_job_constants.h"
  9. namespace printing {
  10. PageNumber::PageNumber(const PageRanges& ranges, uint32_t document_page_count) {
  11. Init(ranges, document_page_count);
  12. }
  13. PageNumber::PageNumber()
  14. : ranges_(nullptr),
  15. page_number_(kInvalidPageIndex),
  16. page_range_index_(kInvalidPageIndex),
  17. document_page_count_(0) {}
  18. PageNumber::PageNumber(const PageNumber& other) = default;
  19. PageNumber& PageNumber::operator=(const PageNumber& other) = default;
  20. void PageNumber::Init(const PageRanges& ranges, uint32_t document_page_count) {
  21. DCHECK(document_page_count);
  22. ranges_ = ranges.empty() ? nullptr : &ranges;
  23. document_page_count_ = document_page_count;
  24. if (ranges_) {
  25. uint32_t first_page = (*ranges_)[0].from;
  26. if (first_page < document_page_count) {
  27. page_range_index_ = 0;
  28. page_number_ = (*ranges_)[0].from;
  29. } else {
  30. page_range_index_ = kInvalidPageIndex;
  31. page_number_ = kInvalidPageIndex;
  32. }
  33. } else {
  34. page_range_index_ = kInvalidPageIndex;
  35. page_number_ = 0;
  36. }
  37. }
  38. uint32_t PageNumber::operator++() {
  39. ++page_number_;
  40. if (page_number_ >= document_page_count_) {
  41. // Finished.
  42. *this = npos();
  43. } else if (ranges_ && page_number_ > (*ranges_)[page_range_index_].to) {
  44. DCHECK_LE(ranges_->size(),
  45. static_cast<size_t>(std::numeric_limits<int>::max()));
  46. if (++page_range_index_ == ranges_->size()) {
  47. // Finished.
  48. *this = npos();
  49. } else {
  50. page_number_ = (*ranges_)[page_range_index_].from;
  51. }
  52. }
  53. return ToUint();
  54. }
  55. bool PageNumber::operator==(const PageNumber& other) const {
  56. return page_number_ == other.page_number_ &&
  57. page_range_index_ == other.page_range_index_;
  58. }
  59. bool PageNumber::operator!=(const PageNumber& other) const {
  60. return page_number_ != other.page_number_ ||
  61. page_range_index_ != other.page_range_index_;
  62. }
  63. // static
  64. std::vector<uint32_t> PageNumber::GetPages(PageRanges ranges,
  65. uint32_t page_count) {
  66. PageRange::Normalize(ranges);
  67. std::vector<uint32_t> printed_pages;
  68. static constexpr uint32_t kMaxNumberOfPages = 100000;
  69. printed_pages.reserve(std::min(page_count, kMaxNumberOfPages));
  70. for (PageNumber page_number(ranges, std::min(page_count, kMaxNumberOfPages));
  71. page_number != PageNumber::npos(); ++page_number) {
  72. printed_pages.push_back(page_number.ToUint());
  73. }
  74. return printed_pages;
  75. }
  76. } // namespace printing