|  | /* | 
|  | * Copyright 2015 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #ifndef GrQuad_DEFINED | 
|  | #define GrQuad_DEFINED | 
|  |  | 
|  | #include "SkMatrix.h" | 
|  | #include "SkNx.h" | 
|  | #include "SkPoint.h" | 
|  | #include "SkPoint3.h" | 
|  |  | 
|  | /** | 
|  | * GrQuad is a collection of 4 points which can be used to represent an arbitrary quadrilateral. The | 
|  | * points make a triangle strip with CCW triangles (top-left, bottom-left, top-right, bottom-right). | 
|  | */ | 
|  | class GrQuad { | 
|  | public: | 
|  | GrQuad() = default; | 
|  |  | 
|  | GrQuad(const GrQuad& that) = default; | 
|  |  | 
|  | explicit GrQuad(const SkRect& rect) | 
|  | : fX{rect.fLeft, rect.fLeft, rect.fRight, rect.fRight} | 
|  | , fY{rect.fTop, rect.fBottom, rect.fTop, rect.fBottom} {} | 
|  |  | 
|  | /** Sets the quad to the rect as transformed by the matrix. */ | 
|  | GrQuad(const SkRect&, const SkMatrix&); | 
|  |  | 
|  | explicit GrQuad(const SkPoint pts[4]) | 
|  | : fX{pts[0].fX, pts[1].fX, pts[2].fX, pts[3].fX} | 
|  | , fY{pts[0].fY, pts[1].fY, pts[2].fY, pts[3].fY} {} | 
|  |  | 
|  | GrQuad& operator=(const GrQuad& that) = default; | 
|  |  | 
|  | SkPoint point(int i) const { return {fX[i], fY[i]}; } | 
|  |  | 
|  | SkRect bounds() const { | 
|  | auto x = this->x4f(), y = this->y4f(); | 
|  | return {x.min(), y.min(), x.max(), y.max()}; | 
|  | } | 
|  |  | 
|  | float x(int i) const { return fX[i]; } | 
|  | float y(int i) const { return fY[i]; } | 
|  |  | 
|  | Sk4f x4f() const { return Sk4f::Load(fX); } | 
|  | Sk4f y4f() const { return Sk4f::Load(fY); } | 
|  |  | 
|  | private: | 
|  | float fX[4]; | 
|  | float fY[4]; | 
|  | }; | 
|  |  | 
|  | class GrPerspQuad { | 
|  | public: | 
|  | GrPerspQuad() = default; | 
|  |  | 
|  | GrPerspQuad(const SkRect&, const SkMatrix&); | 
|  |  | 
|  | GrPerspQuad& operator=(const GrPerspQuad&) = default; | 
|  |  | 
|  | SkPoint3 point(int i) const { return {fX[i], fY[i], fW[i]}; } | 
|  |  | 
|  | SkRect bounds() const { | 
|  | auto x = this->x4f() * this->iw4f(); | 
|  | auto y = this->y4f() * this->iw4f(); | 
|  | return {x.min(), y.min(), x.max(), y.max()}; | 
|  | } | 
|  |  | 
|  | float x(int i) const { return fX[i]; } | 
|  | float y(int i) const { return fY[i]; } | 
|  | float w(int i) const { return fW[i]; } | 
|  | float iw(int i) const { return fIW[i]; } | 
|  |  | 
|  | Sk4f x4f() const { return Sk4f::Load(fX); } | 
|  | Sk4f y4f() const { return Sk4f::Load(fY); } | 
|  | Sk4f w4f() const { return Sk4f::Load(fW); } | 
|  | Sk4f iw4f() const { return Sk4f::Load(fIW); } | 
|  |  | 
|  | private: | 
|  | float fX[4]; | 
|  | float fY[4]; | 
|  | float fW[4]; | 
|  | float fIW[4];  // 1/w | 
|  | }; | 
|  |  | 
|  | #endif |