forked from mozilla/gecko-dev
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Resolution.h
90 lines (72 loc) · 1.91 KB
/
Resolution.h
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