| // Copyright 2022 Google LLC |
| // SPDX-License-Identifier: BSD-2-Clause |
| |
| #include "avifexif.h" |
| #include "avif/avif.h" |
| |
| uint8_t avifImageGetExifOrientationFromIrotImir(const avifImage * image) |
| { |
| if ((image->transformFlags & AVIF_TRANSFORM_IROT) && (image->irot.angle == 1)) { |
| if (image->transformFlags & AVIF_TRANSFORM_IMIR) { |
| if (image->imir.axis) { |
| return 7; // 90 degrees anti-clockwise then swap left and right. |
| } |
| return 5; // 90 degrees anti-clockwise then swap top and bottom. |
| } |
| return 6; // 90 degrees anti-clockwise. |
| } |
| if ((image->transformFlags & AVIF_TRANSFORM_IROT) && (image->irot.angle == 2)) { |
| if (image->transformFlags & AVIF_TRANSFORM_IMIR) { |
| if (image->imir.axis) { |
| return 4; // 180 degrees anti-clockwise then swap left and right. |
| } |
| return 2; // 180 degrees anti-clockwise then swap top and bottom. |
| } |
| return 3; // 180 degrees anti-clockwise. |
| } |
| if ((image->transformFlags & AVIF_TRANSFORM_IROT) && (image->irot.angle == 3)) { |
| if (image->transformFlags & AVIF_TRANSFORM_IMIR) { |
| if (image->imir.axis) { |
| return 5; // 270 degrees anti-clockwise then swap left and right. |
| } |
| return 7; // 270 degrees anti-clockwise then swap top and bottom. |
| } |
| return 8; // 270 degrees anti-clockwise. |
| } |
| if (image->transformFlags & AVIF_TRANSFORM_IMIR) { |
| if (image->imir.axis) { |
| return 2; // Swap left and right. |
| } |
| return 4; // Swap top and bottom. |
| } |
| return 1; // Default orientation ("top-left", no-op). |
| } |
| |
| avifResult avifSetExifOrientation(avifRWData * exif, uint8_t orientation) |
| { |
| size_t offset; |
| const avifResult result = avifGetExifOrientationOffset(exif->data, exif->size, &offset); |
| if (result != AVIF_RESULT_OK) { |
| return result; |
| } |
| if (offset < exif->size) { |
| exif->data[offset] = orientation; |
| return AVIF_RESULT_OK; |
| } |
| // No Exif orientation was found. |
| if (orientation == 1) { |
| // The default orientation is 1, so if the given orientation is 1 too, do nothing. |
| return AVIF_RESULT_OK; |
| } |
| // Adding an orientation tag to an Exif payload is involved. |
| return AVIF_RESULT_NOT_IMPLEMENTED; |
| } |