1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/output/overlay_candidate.h"
8 #include "base/logging.h"
9 #include "ui/gfx/geometry/rect_conversions.h"
13 OverlayCandidate::OverlayCandidate()
14 : transform(gfx::OVERLAY_TRANSFORM_NONE
),
16 uv_rect(0.f
, 0.f
, 1.f
, 1.f
),
19 overlay_handled(false) {}
21 OverlayCandidate::~OverlayCandidate() {}
24 gfx::OverlayTransform
OverlayCandidate::GetOverlayTransform(
25 const gfx::Transform
& quad_transform
,
27 if (!quad_transform
.IsPositiveScaleOrTranslation())
28 return gfx::OVERLAY_TRANSFORM_INVALID
;
30 return flipped
? gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL
31 : gfx::OVERLAY_TRANSFORM_NONE
;
35 gfx::OverlayTransform
OverlayCandidate::ModifyTransform(
36 gfx::OverlayTransform in
,
37 gfx::OverlayTransform delta
) {
38 // There are 8 different possible transforms. We can characterize these
39 // by looking at where the origin moves and the direction the horizontal goes.
40 // (TL=top-left, BR=bottom-right, H=horizontal, V=vertical).
42 // FLIP_VERTICAL: BL, H
43 // FLIP_HORIZONTAL: TR, H
47 // Missing transforms: TL, V & BR, V
48 // Basic combinations:
49 // Flip X & Y -> Rotate 180 (TL,H -> TR,H -> BR,H or TL,H -> BL,H -> BR,H)
50 // Flip X or Y + Rotate 180 -> other flip (eg, TL,H -> TR,H -> BL,H)
51 // Rotate + Rotate simply adds values.
52 // Rotate 90/270 + flip is invalid because we can only have verticals with
53 // the origin in TR or BL.
54 if (delta
== gfx::OVERLAY_TRANSFORM_NONE
)
57 case gfx::OVERLAY_TRANSFORM_NONE
:
59 case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL
:
61 case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL
:
62 return gfx::OVERLAY_TRANSFORM_NONE
;
63 case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL
:
64 return gfx::OVERLAY_TRANSFORM_ROTATE_180
;
65 case gfx::OVERLAY_TRANSFORM_ROTATE_180
:
66 return gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL
;
68 return gfx::OVERLAY_TRANSFORM_INVALID
;
71 case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL
:
73 case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL
:
74 return gfx::OVERLAY_TRANSFORM_NONE
;
75 case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL
:
76 return gfx::OVERLAY_TRANSFORM_ROTATE_180
;
77 case gfx::OVERLAY_TRANSFORM_ROTATE_90
:
78 case gfx::OVERLAY_TRANSFORM_ROTATE_180
:
79 return gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL
;
80 case gfx::OVERLAY_TRANSFORM_ROTATE_270
:
82 return gfx::OVERLAY_TRANSFORM_INVALID
;
85 case gfx::OVERLAY_TRANSFORM_ROTATE_90
:
87 case gfx::OVERLAY_TRANSFORM_ROTATE_90
:
88 return gfx::OVERLAY_TRANSFORM_ROTATE_180
;
89 case gfx::OVERLAY_TRANSFORM_ROTATE_180
:
90 return gfx::OVERLAY_TRANSFORM_ROTATE_270
;
91 case gfx::OVERLAY_TRANSFORM_ROTATE_270
:
92 return gfx::OVERLAY_TRANSFORM_NONE
;
94 return gfx::OVERLAY_TRANSFORM_INVALID
;
97 case gfx::OVERLAY_TRANSFORM_ROTATE_180
:
99 case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL
:
100 return gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL
;
101 case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL
:
102 return gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL
;
103 case gfx::OVERLAY_TRANSFORM_ROTATE_90
:
104 return gfx::OVERLAY_TRANSFORM_ROTATE_270
;
105 case gfx::OVERLAY_TRANSFORM_ROTATE_180
:
106 return gfx::OVERLAY_TRANSFORM_NONE
;
107 case gfx::OVERLAY_TRANSFORM_ROTATE_270
:
108 return gfx::OVERLAY_TRANSFORM_ROTATE_90
;
110 return gfx::OVERLAY_TRANSFORM_INVALID
;
113 case gfx::OVERLAY_TRANSFORM_ROTATE_270
:
115 case gfx::OVERLAY_TRANSFORM_ROTATE_90
:
116 return gfx::OVERLAY_TRANSFORM_NONE
;
117 case gfx::OVERLAY_TRANSFORM_ROTATE_180
:
118 return gfx::OVERLAY_TRANSFORM_ROTATE_90
;
119 case gfx::OVERLAY_TRANSFORM_ROTATE_270
:
120 return gfx::OVERLAY_TRANSFORM_ROTATE_180
;
122 return gfx::OVERLAY_TRANSFORM_INVALID
;
126 return gfx::OVERLAY_TRANSFORM_INVALID
;
131 gfx::Rect
OverlayCandidate::GetOverlayRect(const gfx::Transform
& quad_transform
,
132 const gfx::Rect
& rect
) {
133 DCHECK(quad_transform
.IsPositiveScaleOrTranslation());
135 gfx::RectF
float_rect(rect
);
136 quad_transform
.TransformRect(&float_rect
);
137 return gfx::ToNearestRect(float_rect
);