diff options
Diffstat (limited to 'printing/page_number.cc')
-rw-r--r-- | printing/page_number.cc | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/printing/page_number.cc b/printing/page_number.cc new file mode 100644 index 0000000..8e92870 --- /dev/null +++ b/printing/page_number.cc @@ -0,0 +1,83 @@ +// Copyright (c) 2006-2008 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. + +#include "printing/page_number.h" + +#include <limits> + +#include "base/logging.h" +#include "printing/print_settings.h" + +namespace printing { + +PageNumber::PageNumber(const PrintSettings& settings, int document_page_count) { + Init(settings, document_page_count); +} + +PageNumber::PageNumber() + : ranges_(NULL), + page_number_(-1), + page_range_index_(-1), + document_page_count_(0) { +} + +void PageNumber::operator=(const PageNumber& other) { + ranges_ = other.ranges_; + page_number_ = other.page_number_; + page_range_index_ = other.page_range_index_; + document_page_count_ = other.document_page_count_; +} + +void PageNumber::Init(const PrintSettings& settings, int document_page_count) { + DCHECK(document_page_count); + ranges_ = settings.ranges.empty() ? NULL : &settings.ranges; + document_page_count_ = document_page_count; + if (ranges_) { + page_range_index_ = 0; + page_number_ = (*ranges_)[0].from; + } else { + if (document_page_count) { + page_number_ = 0; + } else { + page_number_ = -1; + } + page_range_index_ = -1; + } +} + +int PageNumber::operator++() { + if (!ranges_) { + // Switch to next page. + if (++page_number_ == document_page_count_) { + // Finished. + *this = npos(); + } + } else { + // Switch to next page. + ++page_number_; + // Page ranges are inclusive. + if (page_number_ > (*ranges_)[page_range_index_].to) { + DCHECK(ranges_->size() <= static_cast<size_t>( + std::numeric_limits<int>::max())); + if (++page_range_index_ == static_cast<int>(ranges_->size())) { + // Finished. + *this = npos(); + } else { + page_number_ = (*ranges_)[page_range_index_].from; + } + } + } + return ToInt(); +} + +bool PageNumber::operator==(const PageNumber& other) const { + return page_number_ == other.page_number_ && + page_range_index_ == other.page_range_index_; +} +bool PageNumber::operator!=(const PageNumber& other) const { + return page_number_ != other.page_number_ || + page_range_index_ != other.page_range_index_; +} + +} // namespace printing |