IndexedDB: Protect against use-after-free in ChainedBlobWriter.
[chromium-blink-merge.git] / cc / output / overlay_candidate.cc
blob46c3a7d2a2ef2094af71ba658a3cadaa495c96a5
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"
7 #include <algorithm>
8 #include "base/logging.h"
9 #include "ui/gfx/geometry/rect_conversions.h"
11 namespace cc {
13 OverlayCandidate::OverlayCandidate()
14 : transform(gfx::OVERLAY_TRANSFORM_NONE),
15 format(RGBA_8888),
16 uv_rect(0.f, 0.f, 1.f, 1.f),
17 resource_id(0),
18 plane_z_order(0),
19 overlay_handled(false) {}
21 OverlayCandidate::~OverlayCandidate() {}
23 // static
24 gfx::OverlayTransform OverlayCandidate::GetOverlayTransform(
25 const gfx::Transform& quad_transform,
26 bool flipped) {
27 if (!quad_transform.IsPositiveScaleOrTranslation())
28 return gfx::OVERLAY_TRANSFORM_INVALID;
30 return flipped ? gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL
31 : gfx::OVERLAY_TRANSFORM_NONE;
34 // static
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).
41 // NONE: TL, H
42 // FLIP_VERTICAL: BL, H
43 // FLIP_HORIZONTAL: TR, H
44 // ROTATE_90: TR, V
45 // ROTATE_180: BR, H
46 // ROTATE_270: BL, V
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)
55 return in;
56 switch (in) {
57 case gfx::OVERLAY_TRANSFORM_NONE:
58 return delta;
59 case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL:
60 switch (delta) {
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;
67 default:
68 return gfx::OVERLAY_TRANSFORM_INVALID;
70 break;
71 case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL:
72 switch (delta) {
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:
81 default:
82 return gfx::OVERLAY_TRANSFORM_INVALID;
84 break;
85 case gfx::OVERLAY_TRANSFORM_ROTATE_90:
86 switch (delta) {
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;
93 default:
94 return gfx::OVERLAY_TRANSFORM_INVALID;
96 break;
97 case gfx::OVERLAY_TRANSFORM_ROTATE_180:
98 switch (delta) {
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;
109 default:
110 return gfx::OVERLAY_TRANSFORM_INVALID;
112 break;
113 case gfx::OVERLAY_TRANSFORM_ROTATE_270:
114 switch (delta) {
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;
121 default:
122 return gfx::OVERLAY_TRANSFORM_INVALID;
124 break;
125 default:
126 return gfx::OVERLAY_TRANSFORM_INVALID;
130 // static
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);
140 } // namespace cc