diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /image/Resolution.h | |
parent | Initial commit. (diff) | |
download | firefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'image/Resolution.h')
-rw-r--r-- | image/Resolution.h | 90 |
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 |