1ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt/*
2ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt * Copyright 2015 Google Inc.
3ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt *
4ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt * Use of this source code is governed by a BSD-style license that can be
5ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt * found in the LICENSE file.
6ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt */
7ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt
8ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt#ifndef GrQuad_DEFINED
9ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt#define GrQuad_DEFINED
10ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt
11ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt#include "SkPoint.h"
12ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt#include "SkMatrix.h"
136a88206b2ece8b64534c87fca156e5fe161f884ereed#include "SkMatrixPriv.h"
14ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt
15ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt/**
16ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt * GrQuad is a collection of 4 points which can be used to represent an arbitrary quadrilateral
17ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt */
18ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualittclass GrQuad {
19ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualittpublic:
208cce8f139e4b91783722f11ccb6ac9bbdf8327e7joshualitt    GrQuad() {}
218cce8f139e4b91783722f11ccb6ac9bbdf8327e7joshualitt
22ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    GrQuad(const GrQuad& that) {
23ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt        *this = that;
24ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    }
25ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt
26ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    explicit GrQuad(const SkRect& rect) {
27ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt        this->set(rect);
28ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    }
29ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt
30ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    void set(const SkRect& rect) {
31ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt        fPoints->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
32ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    }
33ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt
34ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    void map(const SkMatrix& matrix) {
35ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt        matrix.mapPoints(fPoints, kNumPoints);
36ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    }
37ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt
38ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    void setFromMappedRect(const SkRect& rect, const SkMatrix& matrix) {
396a88206b2ece8b64534c87fca156e5fe161f884ereed        SkMatrixPriv::SetMappedRectFan(matrix, rect, fPoints);
40ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    }
41ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt
42ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    const GrQuad& operator=(const GrQuad& that) {
43ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt        memcpy(fPoints, that.fPoints, sizeof(SkPoint) * kNumPoints);
44ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt        return *this;
45ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    }
46ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt
47ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    SkPoint* points() {
48ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt        return fPoints;
49ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    }
50ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt
51ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    const SkPoint* points() const {
52ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt        return fPoints;
53ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    }
54ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt
558cce8f139e4b91783722f11ccb6ac9bbdf8327e7joshualitt    const SkPoint& point(int i) const {
568cce8f139e4b91783722f11ccb6ac9bbdf8327e7joshualitt        SkASSERT(i < kNumPoints);
578cce8f139e4b91783722f11ccb6ac9bbdf8327e7joshualitt        return fPoints[i];
588cce8f139e4b91783722f11ccb6ac9bbdf8327e7joshualitt    }
598cce8f139e4b91783722f11ccb6ac9bbdf8327e7joshualitt
60ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualittprivate:
61ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    static const int kNumPoints = 4;
62ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt    SkPoint fPoints[kNumPoints];
63ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt};
64ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt
65ae5b2c623b22b24ea7c0d6200298e5bc366faa63joshualitt#endif
66