gecko-dev/image/Orientation.h
Cameron McCormack edd1013c3e Bug 1616411 - Part 3: Make RasterImage deal with and apply image orientation. r=tnikkel
This makes EXIF orientation metadata honored by default.

Introduce OrientedPixel and UnorientedPixel typed rects and sizes and
use them throughout RasterImage so that we don't confuse which we want.

The reason for doing this rather than having the imgLoader wrap every
RasterImage it creates with an OrientedImage is that returning the
wrapper messes with various notifications, as OrientedImage is not an
ImageResource.

(It would be even better if the JPEG decoder could decode to imgFrames
handling the EXIF orientation itself, but that's a more complicated
change.)

Differential Revision: https://phabricator.services.mozilla.com/D70273

--HG--
extra : moz-landing-system : lando
2020-04-16 00:34:29 +00:00

63 lines
1.6 KiB
C++

/* -*- 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_Orientation_h
#define mozilla_image_Orientation_h
#include <stdint.h>
namespace mozilla {
namespace image {
enum class Angle : uint8_t { D0, D90, D180, D270 };
enum class Flip : uint8_t { Unflipped, Horizontal };
/**
* A struct that describes an image's orientation as a rotation optionally
* followed by a reflection. This may be used to be indicate an image's inherent
* orientation or a desired orientation for the image.
*/
struct Orientation {
explicit Orientation(Angle aRotation = Angle::D0,
Flip mFlip = Flip::Unflipped)
: rotation(aRotation), flip(mFlip) {}
bool IsIdentity() const {
return (rotation == Angle::D0) && (flip == Flip::Unflipped);
}
bool SwapsWidthAndHeight() const {
return (rotation == Angle::D90) || (rotation == Angle::D270);
}
bool operator==(const Orientation& aOther) const {
return (rotation == aOther.rotation) && (flip == aOther.flip);
}
bool operator!=(const Orientation& aOther) const {
return !(*this == aOther);
}
static Angle InvertAngle(Angle aAngle) {
switch (aAngle) {
case Angle::D90:
return Angle::D270;
case Angle::D270:
return Angle::D90;
default:
return aAngle;
}
}
Angle rotation;
Flip flip;
};
} // namespace image
} // namespace mozilla
#endif // mozilla_image_Orientation_h