page_number.cc 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright 2006-2008 The Chromium Authors
  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. if (page_number_ >= document_page_count_) {
  52. // Finished.
  53. *this = npos();
  54. }
  55. }
  56. }
  57. return ToUint();
  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. bool PageNumber::operator!=(const PageNumber& other) const {
  64. return page_number_ != other.page_number_ ||
  65. page_range_index_ != other.page_range_index_;
  66. }
  67. // static
  68. std::vector<uint32_t> PageNumber::GetPages(PageRanges ranges,
  69. uint32_t page_count) {
  70. PageRange::Normalize(ranges);
  71. std::vector<uint32_t> printed_pages;
  72. static constexpr uint32_t kMaxNumberOfPages = 100000;
  73. printed_pages.reserve(std::min(page_count, kMaxNumberOfPages));
  74. for (PageNumber page_number(ranges, std::min(page_count, kMaxNumberOfPages));
  75. page_number != PageNumber::npos(); ++page_number) {
  76. printed_pages.push_back(page_number.ToUint());
  77. }
  78. return printed_pages;
  79. }
  80. } // namespace printing