| Index: include/core/SkPatch.h
|
| diff --git a/include/core/SkPatch.h b/include/core/SkPatch.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2354423aba21f8004fac0c66649d22a37f49aa20
|
| --- /dev/null
|
| +++ b/include/core/SkPatch.h
|
| @@ -0,0 +1,124 @@
|
| +/*
|
| + * Copyright 2014 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#ifndef SkPatch_DEFINED
|
| +#define SkPatch_DEFINED
|
| +
|
| +#include "SkColor.h"
|
| +#include "SkPreConfig.h"
|
| +#include "SkPoint.h"
|
| +
|
| +/**
|
| + * Class that represents a coons patch.
|
| + */
|
| +class SK_API SkPatch {
|
| +
|
| +public:
|
| + /**
|
| + * Structure that holds the vertex data related to the tessellation of a SkPatch. It is passed
|
| + * as a parameter to the function getVertexData which sets the points, colors and texture
|
| + * coordinates of the vertices and the indices for them to be drawn as triangles.
|
| + */
|
| + struct VertexData {
|
| + int fVertexCount, fIndexCount;
|
| + SkPoint* fPoints;
|
| + SkPoint* fTexCoords;
|
| + uint32_t* fColors;
|
| + uint16_t* fIndices;
|
| +
|
| + VertexData()
|
| + : fVertexCount(0)
|
| + , fIndexCount(0)
|
| + , fPoints(NULL)
|
| + , fTexCoords(NULL)
|
| + , fColors(NULL)
|
| + , fIndices(NULL) { }
|
| +
|
| + ~VertexData() {
|
| + SkDELETE_ARRAY(fPoints);
|
| + SkDELETE_ARRAY(fTexCoords);
|
| + SkDELETE_ARRAY(fColors);
|
| + SkDELETE_ARRAY(fIndices);
|
| + }
|
| + };
|
| +
|
| + enum CubicCtrlPts {
|
| + kTopP0_CubicCtrlPts = 0,
|
| + kTopP1_CubicCtrlPts = 1,
|
| + kTopP2_CubicCtrlPts = 2,
|
| + kTopP3_CubicCtrlPts = 3,
|
| +
|
| + kRightP0_CubicCtrlPts = 3,
|
| + kRightP1_CubicCtrlPts = 4,
|
| + kRightP2_CubicCtrlPts = 5,
|
| + kRightP3_CubicCtrlPts = 6,
|
| +
|
| + kBottomP0_CubicCtrlPts = 9,
|
| + kBottomP1_CubicCtrlPts = 8,
|
| + kBottomP2_CubicCtrlPts = 7,
|
| + kBottomP3_CubicCtrlPts = 6,
|
| +
|
| + kLeftP0_CubicCtrlPts = 0,
|
| + kLeftP1_CubicCtrlPts = 11,
|
| + kLeftP2_CubicCtrlPts = 10,
|
| + kLeftP3_CubicCtrlPts = 9,
|
| + };
|
| +
|
| + /**
|
| + * Points are in the following order:
|
| + * (top curve)
|
| + * 0 1 2 3
|
| + * (left curve) 11 4 (right curve)
|
| + * 10 5
|
| + * 9 8 7 6
|
| + * (bottom curve)
|
| + * Used pointer to an array to guarantee that this method receives an array of 4 SkColors
|
| + */
|
| + SkPatch(SkPoint points[12], SkColor colors[4]);
|
| +
|
| + /**
|
| + * Function that evaluates the coons patch interpolation.
|
| + * data refers to the pointer of the PatchData struct in which the tessellation data is set.
|
| + * divisions defines the number of steps in which the SkPatch is going to be subdivided per
|
| + * axis.
|
| + */
|
| + bool getVertexData(SkPatch::VertexData* data, int divisions);
|
| +
|
| + void getTopPoints(SkPoint points[4]) {
|
| + points[0] = fCtrlPoints[kTopP0_CubicCtrlPts];
|
| + points[1] = fCtrlPoints[kTopP1_CubicCtrlPts];
|
| + points[2] = fCtrlPoints[kTopP2_CubicCtrlPts];
|
| + points[3] = fCtrlPoints[kTopP3_CubicCtrlPts];
|
| + }
|
| +
|
| + void getBottomPoints(SkPoint points[4]) {
|
| + points[0] = fCtrlPoints[kBottomP0_CubicCtrlPts];
|
| + points[1] = fCtrlPoints[kBottomP1_CubicCtrlPts];
|
| + points[2] = fCtrlPoints[kBottomP2_CubicCtrlPts];
|
| + points[3] = fCtrlPoints[kBottomP3_CubicCtrlPts];
|
| + }
|
| +
|
| + void getLeftPoints(SkPoint points[4]) {
|
| + points[0] = fCtrlPoints[kLeftP0_CubicCtrlPts];
|
| + points[1] = fCtrlPoints[kLeftP1_CubicCtrlPts];
|
| + points[2] = fCtrlPoints[kLeftP2_CubicCtrlPts];
|
| + points[3] = fCtrlPoints[kLeftP3_CubicCtrlPts];
|
| + }
|
| +
|
| + void getRightPoints(SkPoint points[4]) {
|
| + points[0] = fCtrlPoints[kRightP0_CubicCtrlPts];
|
| + points[1] = fCtrlPoints[kRightP1_CubicCtrlPts];
|
| + points[2] = fCtrlPoints[kRightP2_CubicCtrlPts];
|
| + points[3] = fCtrlPoints[kRightP3_CubicCtrlPts];
|
| + }
|
| +
|
| +private:
|
| + SkPoint fCtrlPoints[12];
|
| + SkPMColor fCornerColors[4];
|
| +};
|
| +
|
| +#endif
|
|
|