blob: 4808a494c007da201d9ad8550fd46c98ab9e68bf [file] [log] [blame]
// 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.
#include "pdf/page_orientation.h"
#include <type_traits>
#include "base/notreached.h"
namespace chrome_pdf {
namespace {
// Adds two PageOrientation values together. This works because the underlying
// integer values have been chosen to allow modular arithmetic.
PageOrientation AddOrientations(PageOrientation first, PageOrientation second) {
using IntType = std::underlying_type<PageOrientation>::type;
constexpr auto kOrientationCount =
static_cast<IntType>(PageOrientation::kLast) + 1;
auto first_int = static_cast<IntType>(first);
auto second_int = static_cast<IntType>(second);
return static_cast<PageOrientation>((first_int + second_int) %
kOrientationCount);
}
} // namespace
bool IsTransposedPageOrientation(PageOrientation orientation) {
switch (orientation) {
case PageOrientation::kOriginal:
case PageOrientation::kClockwise180:
return false;
case PageOrientation::kClockwise90:
case PageOrientation::kClockwise270:
return true;
}
NOTREACHED();
}
PageOrientation RotateClockwise(PageOrientation orientation) {
return AddOrientations(orientation, PageOrientation::kClockwise90);
}
PageOrientation RotateCounterclockwise(PageOrientation orientation) {
// Adding `kLast` is equivalent to rotating one step counterclockwise.
return AddOrientations(orientation, PageOrientation::kLast);
}
} // namespace chrome_pdf