summaryrefslogtreecommitdiffstats
path: root/image/Resolution.h
blob: b305b867b2a869f9b798eb96793a76c173781822 (plain)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_image_Resolution_h
#define mozilla_image_Resolution_h

#include "mozilla/Assertions.h"
#include <cmath>

namespace mozilla {
namespace image {

/**
 * The resolution of an image, in dppx.
 */
struct Resolution {
  Resolution() = default;
  Resolution(float aX, float aY) : mX(aX), mY(aY) {
    MOZ_ASSERT(mX != 0.0f);
    MOZ_ASSERT(mY != 0.0f);
  }

  bool operator==(const Resolution& aOther) const {
    return mX == aOther.mX && mY == aOther.mY;
  }
  bool operator!=(const Resolution& aOther) const { return !(*this == aOther); }

  float mX = 1.0f;
  float mY = 1.0f;

  void ScaleBy(float aScale) {
    if (MOZ_LIKELY(aScale != 0.0f)) {
      mX *= aScale;
      mY *= aScale;
    }
  }

  void ApplyXTo(int32_t& aWidth) const {
    if (mX != 1.0f) {
      aWidth = std::round(float(aWidth) / mX);
    }
  }

  void ApplyXTo(float& aWidth) const {
    if (mX != 1.0f) {
      aWidth /= mX;
    }
  }

  void ApplyYTo(int32_t& aHeight) const {
    if (mY != 1.0f) {
      aHeight = std::round(float(aHeight) / mY);
    }
  }

  void ApplyYTo(float& aHeight) const {
    if (mY != 1.0f) {
      aHeight /= mY;
    }
  }

  void ApplyTo(int32_t& aWidth, int32_t& aHeight) const {
    ApplyXTo(aWidth);
    ApplyYTo(aHeight);
  }

  void ApplyTo(float& aWidth, float& aHeight) const {
    ApplyXTo(aWidth);
    ApplyYTo(aHeight);
  }

  void ApplyInverseTo(int32_t& aWidth, int32_t& aHeight) {
    if (mX != 1.0f) {
      aWidth = std::round(float(aWidth) * mX);
    }
    if (mY != 1.0f) {
      aHeight = std::round(float(aHeight) * mY);
    }
  }
};

}  // namespace image

using ImageResolution = image::Resolution;

}  // namespace mozilla

#endif