1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38

pdf / page_orientation.cc [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>

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

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