1 // Copyright 2011 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.
4
5 #include "cc/resources/layer_quad.h"
6
7 #include "base/logging.h"
8 #include "ui/gfx/quad_f.h"
9
10 namespace cc {
11
Edge(gfx::PointF p,gfx::PointF q)12 LayerQuad::Edge::Edge(gfx::PointF p, gfx::PointF q) {
13 DCHECK(p != q);
14
15 gfx::Vector2dF tangent(p.y() - q.y(), q.x() - p.x());
16 float cross2 = p.x() * q.y() - q.x() * p.y();
17
18 set(tangent.x(), tangent.y(), cross2);
19 scale(1.0f / tangent.Length());
20 }
21
LayerQuad(const gfx::QuadF & quad)22 LayerQuad::LayerQuad(const gfx::QuadF& quad) {
23 // Create edges.
24 left_ = Edge(quad.p4(), quad.p1());
25 right_ = Edge(quad.p2(), quad.p3());
26 top_ = Edge(quad.p1(), quad.p2());
27 bottom_ = Edge(quad.p3(), quad.p4());
28
29 float sign = quad.IsCounterClockwise() ? -1 : 1;
30 left_.scale(sign);
31 right_.scale(sign);
32 top_.scale(sign);
33 bottom_.scale(sign);
34 }
35
LayerQuad(const Edge & left,const Edge & top,const Edge & right,const Edge & bottom)36 LayerQuad::LayerQuad(const Edge& left,
37 const Edge& top,
38 const Edge& right,
39 const Edge& bottom)
40 : left_(left),
41 top_(top),
42 right_(right),
43 bottom_(bottom) {}
44
ToQuadF() const45 gfx::QuadF LayerQuad::ToQuadF() const {
46 return gfx::QuadF(left_.Intersect(top_),
47 top_.Intersect(right_),
48 right_.Intersect(bottom_),
49 bottom_.Intersect(left_));
50 }
51
ToFloatArray(float flattened[12]) const52 void LayerQuad::ToFloatArray(float flattened[12]) const {
53 flattened[0] = left_.x();
54 flattened[1] = left_.y();
55 flattened[2] = left_.z();
56 flattened[3] = top_.x();
57 flattened[4] = top_.y();
58 flattened[5] = top_.z();
59 flattened[6] = right_.x();
60 flattened[7] = right_.y();
61 flattened[8] = right_.z();
62 flattened[9] = bottom_.x();
63 flattened[10] = bottom_.y();
64 flattened[11] = bottom_.z();
65 }
66
67 } // namespace cc
68