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
6#ifndef CC_RESOURCES_LAYER_QUAD_H_
7#define CC_RESOURCES_LAYER_QUAD_H_
8
9#include "base/basictypes.h"
10#include "cc/base/cc_export.h"
11#include "ui/gfx/point_f.h"
12
13namespace gfx {
14class QuadF;
15}
16
17static const float kAntiAliasingInflateDistance = 0.5f;
18
19namespace cc {
20
21class CC_EXPORT LayerQuad {
22 public:
23  class Edge {
24   public:
25    Edge() : x_(0), y_(0), z_(0) {}
26    Edge(const gfx::PointF& p, const gfx::PointF& q);
27
28    float x() const { return x_; }
29    float y() const { return y_; }
30    float z() const { return z_; }
31
32    void set_x(float x) { x_ = x; }
33    void set_y(float y) { y_ = y; }
34    void set_z(float z) { z_ = z; }
35    void set(float x, float y, float z) {
36      x_ = x;
37      y_ = y;
38      z_ = z;
39    }
40
41    void move_x(float dx) { x_ += dx; }
42    void move_y(float dy) { y_ += dy; }
43    void move_z(float dz) { z_ += dz; }
44    void move(float dx, float dy, float dz) {
45      x_ += dx;
46      y_ += dy;
47      z_ += dz;
48    }
49
50    void scale_x(float sx) { x_ *= sx; }
51    void scale_y(float sy) { y_ *= sy; }
52    void scale_z(float sz) { z_ *= sz; }
53    void scale(float sx, float sy, float sz) {
54      x_ *= sx;
55      y_ *= sy;
56      z_ *= sz;
57    }
58    void scale(float s) { scale(s, s, s); }
59
60    gfx::PointF Intersect(const Edge& e) const {
61      return gfx::PointF(
62          (y() * e.z() - e.y() * z()) / (x() * e.y() - e.x() * y()),
63          (x() * e.z() - e.x() * z()) / (e.x() * y() - x() * e.y()));
64    }
65
66   private:
67    float x_;
68    float y_;
69    float z_;
70  };
71
72  LayerQuad(const Edge& left,
73            const Edge& top,
74            const Edge& right,
75            const Edge& bottom);
76  explicit LayerQuad(const gfx::QuadF& quad);
77
78  Edge left() const { return left_; }
79  Edge top() const { return top_; }
80  Edge right() const { return right_; }
81  Edge bottom() const { return bottom_; }
82
83  void InflateX(float dx) {
84    left_.move_z(dx);
85    right_.move_z(dx);
86  }
87  void InflateY(float dy) {
88    top_.move_z(dy);
89    bottom_.move_z(dy);
90  }
91  void Inflate(float d) {
92    InflateX(d);
93    InflateY(d);
94  }
95  void InflateAntiAliasingDistance() {
96    Inflate(kAntiAliasingInflateDistance);
97  }
98
99  gfx::QuadF ToQuadF() const;
100
101  void ToFloatArray(float flattened[12]) const;
102
103 private:
104  Edge left_;
105  Edge top_;
106  Edge right_;
107  Edge bottom_;
108
109  DISALLOW_COPY_AND_ASSIGN(LayerQuad);
110};
111
112}  // namespace cc
113
114#endif  // CC_RESOURCES_LAYER_QUAD_H_
115