e42716032b
No known clients (CanvasKit, Android) want to ignore the exif orientation in an animation. A follow-on CL will deprecate SkAndroidCodec::ExifOrientation, leaving it up to the client (e.g. SkAnimatedImage, hwui/ImageDecoder) to handle the orientation. Add SkEncodedOriginSwapsWidthHeight to assist clients to do so. Update stoplight_animated_image GM. It previously showed using SkAnimatedImage without respecting the orientation, which is no longer supported. The new version replaces the left half of the image with the right. Remove assert that is no longer true. Originally, an SkAnimatedImage was "simple" if it did not have a crop or postProcessor. This is no longer true if has an exif orientation. Add a test that calls the simple constructor and verifies it does not crash. Change-Id: I421fd02700f220fb90458cd03c4431dee7daf399 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/344762 Reviewed-by: Derek Sollenberger <djsollen@google.com> Commit-Queue: Leon Scroggins <scroggo@google.com>
55 lines
2.4 KiB
C
55 lines
2.4 KiB
C
/*
|
|
* Copyright 2017 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#ifndef SkEncodedOrigin_DEFINED
|
|
#define SkEncodedOrigin_DEFINED
|
|
|
|
#include "include/core/SkMatrix.h"
|
|
|
|
// These values match the orientation www.exif.org/Exif2-2.PDF.
|
|
enum SkEncodedOrigin {
|
|
kTopLeft_SkEncodedOrigin = 1, // Default
|
|
kTopRight_SkEncodedOrigin = 2, // Reflected across y-axis
|
|
kBottomRight_SkEncodedOrigin = 3, // Rotated 180
|
|
kBottomLeft_SkEncodedOrigin = 4, // Reflected across x-axis
|
|
kLeftTop_SkEncodedOrigin = 5, // Reflected across x-axis, Rotated 90 CCW
|
|
kRightTop_SkEncodedOrigin = 6, // Rotated 90 CW
|
|
kRightBottom_SkEncodedOrigin = 7, // Reflected across x-axis, Rotated 90 CW
|
|
kLeftBottom_SkEncodedOrigin = 8, // Rotated 90 CCW
|
|
kDefault_SkEncodedOrigin = kTopLeft_SkEncodedOrigin,
|
|
kLast_SkEncodedOrigin = kLeftBottom_SkEncodedOrigin,
|
|
};
|
|
|
|
/**
|
|
* Given an encoded origin and the width and height of the source data, returns a matrix
|
|
* that transforms the source rectangle with upper left corner at [0, 0] and origin to a correctly
|
|
* oriented destination rectangle of [0, 0, w, h].
|
|
*/
|
|
static inline SkMatrix SkEncodedOriginToMatrix(SkEncodedOrigin origin, int w, int h) {
|
|
switch (origin) {
|
|
case kTopLeft_SkEncodedOrigin: return SkMatrix::I();
|
|
case kTopRight_SkEncodedOrigin: return SkMatrix::MakeAll(-1, 0, w, 0, 1, 0, 0, 0, 1);
|
|
case kBottomRight_SkEncodedOrigin: return SkMatrix::MakeAll(-1, 0, w, 0, -1, h, 0, 0, 1);
|
|
case kBottomLeft_SkEncodedOrigin: return SkMatrix::MakeAll( 1, 0, 0, 0, -1, h, 0, 0, 1);
|
|
case kLeftTop_SkEncodedOrigin: return SkMatrix::MakeAll( 0, 1, 0, 1, 0, 0, 0, 0, 1);
|
|
case kRightTop_SkEncodedOrigin: return SkMatrix::MakeAll( 0, -1, w, 1, 0, 0, 0, 0, 1);
|
|
case kRightBottom_SkEncodedOrigin: return SkMatrix::MakeAll( 0, -1, w, -1, 0, h, 0, 0, 1);
|
|
case kLeftBottom_SkEncodedOrigin: return SkMatrix::MakeAll( 0, 1, 0, -1, 0, h, 0, 0, 1);
|
|
}
|
|
SK_ABORT("Unexpected origin");
|
|
}
|
|
|
|
/**
|
|
* Return true if the encoded origin includes a 90 degree rotation, in which case the width
|
|
* and height of the source data are swapped relative to a correctly oriented destination.
|
|
*/
|
|
static inline bool SkEncodedOriginSwapsWidthHeight(SkEncodedOrigin origin) {
|
|
return origin >= kLeftTop_SkEncodedOrigin;
|
|
}
|
|
|
|
#endif // SkEncodedOrigin_DEFINED
|