1 /* 2 SPDX-FileCopyrightText: 2006-2015 Gilles Caulier <caulier dot gilles at gmail dot com> 3 SPDX-FileCopyrightText: 2004-2012 Marcel Wiesweg <marcel dot wiesweg at gmx dot de> 4 5 SPDX-License-Identifier: GPL-2.0-or-later 6 7 */ 8 9 #ifndef LIBKEXIV2_ROTATIONMATRIX_H 10 #define LIBKEXIV2_ROTATIONMATRIX_H 11 12 // Qt includes 13 14 #include <QMatrix> 15 16 // Local includes 17 18 #include "kexiv2.h" 19 #include "libkexiv2_export.h" 20 21 namespace KExiv2Iface 22 { 23 24 /** 25 * @class RotationMatrix rotationmatrix.h <KExiv2/RotationMatrix> 26 * 27 * RotationMatrix 28 */ 29 class LIBKEXIV2_EXPORT RotationMatrix 30 { 31 32 public: 33 34 /** This describes single transform primitives. 35 * Note some of the defined Exif rotation flags combine 36 * two of these actions. 37 * The enum values correspond to those defined 38 * as JXFORM_CODE in the often used the JPEG tool transupp.h. 39 */ 40 enum TransformationAction 41 { 42 NoTransformation = 0, /// no transformation 43 FlipHorizontal = 1, /// horizontal flip 44 FlipVertical = 2, /// vertical flip 45 Rotate90 = 5, /// 90-degree clockwise rotation 46 Rotate180 = 6, /// 180-degree rotation 47 Rotate270 = 7 /// 270-degree clockwise (or 90 ccw) 48 }; 49 50 public: 51 52 /// Constructs the identity matrix (the matrix describing no transformation) 53 RotationMatrix(); 54 /// Returns the matrix corresponding to the given TransformationAction 55 RotationMatrix(TransformationAction action); 56 /// Returns the matrix corresponding to the given TransformationAction 57 RotationMatrix(KExiv2::ImageOrientation exifOrientation); 58 59 bool operator==(const RotationMatrix& ma) const; 60 bool operator!=(const RotationMatrix& ma) const; 61 62 /// Returns true of this matrix describes no transformation (is the identity matrix) 63 bool isNoTransform() const; 64 65 RotationMatrix& operator*=(const RotationMatrix& ma); 66 67 /// Applies the given transform to this matrix 68 RotationMatrix& operator*=(TransformationAction action); 69 70 /// Applies the given transform actions to this matrix 71 RotationMatrix& operator*=(QList<TransformationAction> actions); 72 73 /// Applies the given Exif orientation flag to this matrix 74 RotationMatrix& operator*=(KExiv2::ImageOrientation exifOrientation); 75 76 /** Returns the actions described by this matrix. The order matters. 77 * Not all possible matrices are supported, but all those that can be combined 78 * by Exif rotation flags and the transform actions above. 79 * If isNoTransform() or the matrix is not supported returns an empty list. */ 80 QList<TransformationAction> transformations() const; 81 82 /** Returns the Exif orienation flag describing this matrix. 83 * Returns ORIENTATION_UNSPECIFIED if no flag matches this matrix. 84 */ 85 KExiv2::ImageOrientation exifOrientation() const; 86 87 /// Returns a QMatrix representing this matrix 88 QMatrix toMatrix() const; 89 90 /// Returns a QMatrix for the given Exif orientation 91 static QMatrix toMatrix(KExiv2::ImageOrientation orientation); 92 93 RotationMatrix(int m11, int m12, int m21, int m22); 94 95 protected: 96 97 void set(int m11, int m12, int m21, int m22); 98 99 protected: 100 101 int m[2][2]; 102 }; 103 104 } // namespace KExiv2Iface 105 106 #endif // LIBKEXIV2_ROTATIONMATRIX_H 107