skia2/include/core/SkPatch.h
dandov 50d715476b Added classes SkPatch and SkPatchMesh which help encapsulate and generalize this new primitive. The functionality and responsability of each class is better explained in the comments of the files.
Each patch defines a method genMesh that produces the geometry to draw. To do this they receive a SkPatchMesh object which they need to initialize in order to set up how the data is going to be formatted. Later they call function like setColor or pointAt to set the values at a specific index, the SkMeshPatch object handles the indices based on the format and makes it transparent to the client.

Added a slide to sample app to show how to set up this classes and how they interact.

BUG=skia:
R=jvanverth@google.com, egdaniel@google.com, bsalomon@google.com

Author: dandov@google.com

Review URL: https://codereview.chromium.org/405163003
2014-07-25 10:44:54 -07:00

125 lines
3.7 KiB
C++

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