/* * 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 SkPatchUtils_DEFINED #define SkPatchUtils_DEFINED #include "SkColorPriv.h" #include "SkMatrix.h" class SK_API SkPatchUtils { public: /** * Structure that holds the vertex data related to the tessellation of a patch. 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(nullptr) , fTexCoords(nullptr) , fColors(nullptr) , fIndices(nullptr) { } ~VertexData() { delete[] fPoints; delete[] fTexCoords; delete[] fColors; delete[] fIndices; } }; // Enums for control points based on the order specified in the constructor (clockwise). 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, }; // Enum for corner also clockwise. enum Corner { kTopLeft_Corner = 0, kTopRight_Corner, kBottomRight_Corner, kBottomLeft_Corner }; enum { kNumCtrlPts = 12, kNumCorners = 4, kNumPtsCubic = 4 }; /** * Method that calculates a level of detail (number of subdivisions) for a patch in both axis. */ static SkISize GetLevelOfDetail(const SkPoint cubics[12], const SkMatrix* matrix); /** * Get the points corresponding to the top cubic of cubics. */ static void getTopCubic(const SkPoint cubics[12], SkPoint points[4]); /** * Get the points corresponding to the bottom cubic of cubics. */ static void getBottomCubic(const SkPoint cubics[12], SkPoint points[4]); /** * Get the points corresponding to the left cubic of cubics. */ static void getLeftCubic(const SkPoint cubics[12], SkPoint points[4]); /** * Get the points corresponding to the right cubic of cubics. */ static void getRightCubic(const SkPoint cubics[12], SkPoint points[4]); /** * Function that evaluates the coons patch interpolation. * data refers to the pointer of the PatchData struct in which the tessellation data is set. * cubics refers to the points of the cubics. * lod refers the level of detail for each axis. * colors refers to the corner colors that will be bilerp across the patch (optional parameter) * texCoords refers to the corner texture coordinates that will be bilerp across the patch (optional parameter) */ static bool getVertexData(SkPatchUtils::VertexData* data, const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4], int lodX, int lodY); }; #endif