/* * 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