Index: cc/output/overlay_candidate.cc |
diff --git a/cc/output/overlay_candidate.cc b/cc/output/overlay_candidate.cc |
index 41682539a58223201db0063681e5d43a6d7f043d..46c3a7d2a2ef2094af71ba658a3cadaa495c96a5 100644 |
--- a/cc/output/overlay_candidate.cc |
+++ b/cc/output/overlay_candidate.cc |
@@ -24,7 +24,7 @@ OverlayCandidate::~OverlayCandidate() {} |
gfx::OverlayTransform OverlayCandidate::GetOverlayTransform( |
const gfx::Transform& quad_transform, |
bool flipped) { |
- if (!quad_transform.IsIdentityOrTranslation()) |
+ if (!quad_transform.IsPositiveScaleOrTranslation()) |
return gfx::OVERLAY_TRANSFORM_INVALID; |
return flipped ? gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL |
@@ -32,9 +32,105 @@ gfx::OverlayTransform OverlayCandidate::GetOverlayTransform( |
} |
// static |
+gfx::OverlayTransform OverlayCandidate::ModifyTransform( |
+ gfx::OverlayTransform in, |
+ gfx::OverlayTransform delta) { |
+ // There are 8 different possible transforms. We can characterize these |
+ // by looking at where the origin moves and the direction the horizontal goes. |
+ // (TL=top-left, BR=bottom-right, H=horizontal, V=vertical). |
+ // NONE: TL, H |
+ // FLIP_VERTICAL: BL, H |
+ // FLIP_HORIZONTAL: TR, H |
+ // ROTATE_90: TR, V |
+ // ROTATE_180: BR, H |
+ // ROTATE_270: BL, V |
+ // Missing transforms: TL, V & BR, V |
+ // Basic combinations: |
+ // Flip X & Y -> Rotate 180 (TL,H -> TR,H -> BR,H or TL,H -> BL,H -> BR,H) |
+ // Flip X or Y + Rotate 180 -> other flip (eg, TL,H -> TR,H -> BL,H) |
+ // Rotate + Rotate simply adds values. |
+ // Rotate 90/270 + flip is invalid because we can only have verticals with |
+ // the origin in TR or BL. |
+ if (delta == gfx::OVERLAY_TRANSFORM_NONE) |
+ return in; |
+ switch (in) { |
+ case gfx::OVERLAY_TRANSFORM_NONE: |
+ return delta; |
+ case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL: |
+ switch (delta) { |
+ case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL: |
+ return gfx::OVERLAY_TRANSFORM_NONE; |
+ case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL: |
+ return gfx::OVERLAY_TRANSFORM_ROTATE_180; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_180: |
+ return gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL; |
+ default: |
+ return gfx::OVERLAY_TRANSFORM_INVALID; |
+ } |
+ break; |
+ case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL: |
+ switch (delta) { |
+ case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL: |
+ return gfx::OVERLAY_TRANSFORM_NONE; |
+ case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL: |
+ return gfx::OVERLAY_TRANSFORM_ROTATE_180; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_90: |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_180: |
+ return gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_270: |
+ default: |
+ return gfx::OVERLAY_TRANSFORM_INVALID; |
+ } |
+ break; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_90: |
+ switch (delta) { |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_90: |
+ return gfx::OVERLAY_TRANSFORM_ROTATE_180; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_180: |
+ return gfx::OVERLAY_TRANSFORM_ROTATE_270; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_270: |
+ return gfx::OVERLAY_TRANSFORM_NONE; |
+ default: |
+ return gfx::OVERLAY_TRANSFORM_INVALID; |
+ } |
+ break; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_180: |
+ switch (delta) { |
+ case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL: |
+ return gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL; |
+ case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL: |
+ return gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_90: |
+ return gfx::OVERLAY_TRANSFORM_ROTATE_270; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_180: |
+ return gfx::OVERLAY_TRANSFORM_NONE; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_270: |
+ return gfx::OVERLAY_TRANSFORM_ROTATE_90; |
+ default: |
+ return gfx::OVERLAY_TRANSFORM_INVALID; |
+ } |
+ break; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_270: |
+ switch (delta) { |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_90: |
+ return gfx::OVERLAY_TRANSFORM_NONE; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_180: |
+ return gfx::OVERLAY_TRANSFORM_ROTATE_90; |
+ case gfx::OVERLAY_TRANSFORM_ROTATE_270: |
+ return gfx::OVERLAY_TRANSFORM_ROTATE_180; |
+ default: |
+ return gfx::OVERLAY_TRANSFORM_INVALID; |
+ } |
+ break; |
+ default: |
+ return gfx::OVERLAY_TRANSFORM_INVALID; |
+ } |
+} |
+ |
+// static |
gfx::Rect OverlayCandidate::GetOverlayRect(const gfx::Transform& quad_transform, |
const gfx::Rect& rect) { |
- DCHECK(quad_transform.IsIdentityOrTranslation()); |
+ DCHECK(quad_transform.IsPositiveScaleOrTranslation()); |
gfx::RectF float_rect(rect); |
quad_transform.TransformRect(&float_rect); |