910e62b5创建于 1月15日历史提交
// 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