1 | use crate::{prelude::*, ISize, Matrix}; |
2 | use skia_bindings::{self as sb, SkEncodedOrigin}; |
3 | |
4 | // Even though possible, we are not using the original SkEncodedOrigin enum, because of the |
5 | // `to_matrix()` implementation below, which needs an `ISize` and so can not be implemented in the |
6 | // skia-bindings crate. |
7 | |
8 | /// These values match the orientation www.exif.org/Exif2-2.PDF. |
9 | #[repr (i32)] |
10 | #[derive (Copy, Clone, PartialEq, Eq, Hash, Debug, Default)] |
11 | pub enum EncodedOrigin { |
12 | /// Default |
13 | #[default] |
14 | TopLeft = SkEncodedOrigin::TopLeft as _, |
15 | /// Reflected across y-axis |
16 | TopRight = SkEncodedOrigin::TopRight as _, |
17 | /// Rotated 180 |
18 | BottomRight = SkEncodedOrigin::BottomRight as _, |
19 | /// Reflected across x-axis |
20 | BottomLeft = SkEncodedOrigin::BottomLeft as _, |
21 | /// Reflected across x-axis, Rotated 90 CCW |
22 | LeftTop = SkEncodedOrigin::LeftTop as _, |
23 | /// Rotated 90 CW |
24 | RightTop = SkEncodedOrigin::RightTop as _, |
25 | /// Reflected across x-axis, Rotated 90 CW |
26 | RightBottom = SkEncodedOrigin::RightBottom as _, |
27 | /// Rotated 90 CCW |
28 | LeftBottom = SkEncodedOrigin::LeftBottom as _, |
29 | } |
30 | |
31 | native_transmutable!(SkEncodedOrigin, EncodedOrigin, encoded_origin_layout); |
32 | |
33 | impl EncodedOrigin { |
34 | pub const LAST: Self = EncodedOrigin::LeftBottom; |
35 | pub const DEFAULT: Self = EncodedOrigin::TopLeft; |
36 | |
37 | /// Given an width and height of the source data, returns a matrix that transforms the source |
38 | /// rectangle with upper left corner at `[0, 0]` and origin to a correctly oriented destination |
39 | /// rectangle of `[0, 0, w, h]`. |
40 | pub fn to_matrix(self, size: impl Into<ISize>) -> Matrix { |
41 | let size = size.into(); |
42 | let mut m = Matrix::default(); |
43 | unsafe { |
44 | sb::C_SkEncodedOriginToMatrix( |
45 | self.into_native(), |
46 | size.width, |
47 | size.height, |
48 | m.native_mut(), |
49 | ) |
50 | }; |
51 | m |
52 | } |
53 | |
54 | /// Return `true` if the encoded origin includes a 90 degree rotation, in which case the width |
55 | /// and height of the source data are swapped relative to a correctly oriented destination. |
56 | pub fn swaps_width_height(self) -> bool { |
57 | (self as i32) >= EncodedOrigin::LeftTop as i32 |
58 | } |
59 | } |
60 | |