12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/layer_quad.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/quad_f.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)LayerQuad::Edge::Edge(const gfx::PointF& p, const gfx::PointF& q) {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(p != q);
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2dF tangent(p.y() - q.y(), q.x() - p.x());
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float cross2 = p.x() * q.y() - q.x() * p.y();
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set(tangent.x(), tangent.y(), cross2);
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scale(1.0f / tangent.Length());
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerQuad::LayerQuad(const gfx::QuadF& quad) {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create edges.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  left_ = Edge(quad.p4(), quad.p1());
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  right_ = Edge(quad.p2(), quad.p3());
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  top_ = Edge(quad.p1(), quad.p2());
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_ = Edge(quad.p3(), quad.p4());
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float sign = quad.IsCounterClockwise() ? -1 : 1;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  left_.scale(sign);
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  right_.scale(sign);
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  top_.scale(sign);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bottom_.scale(sign);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerQuad::LayerQuad(const Edge& left,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const Edge& top,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const Edge& right,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const Edge& bottom)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : left_(left),
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      top_(top),
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      right_(right),
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bottom_(bottom) {}
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::QuadF LayerQuad::ToQuadF() const {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::QuadF(left_.Intersect(top_),
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    top_.Intersect(right_),
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    right_.Intersect(bottom_),
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    bottom_.Intersect(left_));
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerQuad::ToFloatArray(float flattened[12]) const {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  flattened[0] = left_.x();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  flattened[1] = left_.y();
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  flattened[2] = left_.z();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  flattened[3] = top_.x();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  flattened[4] = top_.y();
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  flattened[5] = top_.z();
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  flattened[6] = right_.x();
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  flattened[7] = right_.y();
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  flattened[8] = right_.z();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  flattened[9] = bottom_.x();
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  flattened[10] = bottom_.y();
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  flattened[11] = bottom_.z();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
68