summaryrefslogtreecommitdiffstats
path: root/image/Resolution.h
diff options
context:
space:
mode:
Diffstat (limited to 'image/Resolution.h')
-rw-r--r--image/Resolution.h90
1 files changed, 90 insertions, 0 deletions
diff --git a/image/Resolution.h b/image/Resolution.h
new file mode 100644
index 0000000000..b305b867b2
--- /dev/null
+++ b/image/Resolution.h
@@ -0,0 +1,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