SkShadowTessellator.h revision 958fbc460a1e680c6a9979e140da8bfc00b8831d
1bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth/* 2bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth * Copyright 2017 Google Inc. 3bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth * 4bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth * Use of this source code is governed by a BSD-style license that can be 5bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth * found in the LICENSE file. 6bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth */ 7bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth 8efe3dedbb3493b738abdb56041b093245e4e8711Jim Van Verth#ifndef SkShadowTessellator_DEFINED 9efe3dedbb3493b738abdb56041b093245e4e8711Jim Van Verth#define SkShadowTessellator_DEFINED 10bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth 11bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth#include "SkTDArray.h" 12958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon#include "SkRefCnt.h" 13bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth#include "SkPoint.h" 14bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth 15efe3dedbb3493b738abdb56041b093245e4e8711Jim Van Verth#include "SkColor.h" 16bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth 17bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verthclass SkMatrix; 18bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verthclass SkPath; 19bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth 20958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomonclass SkShadowVertices : public SkRefCnt { 2191af72703830f3946c538b47c6c7c96afc0adde2Jim Van Verthpublic: 22958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon /** 23958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon * This function generates an ambient shadow mesh for a path by walking the path, outsetting by 24958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon * the radius, and setting inner and outer colors to umbraColor and penumbraColor, respectively. 25958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon * If transparent is true, then the center of the ambient shadow will be filled in. 26958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon */ 27958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon static sk_sp<SkShadowVertices> MakeAmbient(const SkPath& path, SkScalar radius, 28958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon SkColor umbraColor, SkColor penumbraColor, 29958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon bool transparent); 30958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon 31958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon /** 32958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon * This function generates a spot shadow mesh for a path by walking the transformed path, 33958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon * further transforming by the scale and translation, and outsetting and insetting by a radius. 34958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon * The center will be clipped against the original path unless transparent is true. 35958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon */ 36958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon static sk_sp<SkShadowVertices> MakeSpot(const SkPath& path, SkScalar scale, 37958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon const SkVector& translate, SkScalar radius, 38958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon SkColor umbraColor, SkColor penumbraColor, 39958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon bool transparent); 40958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon 41958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon int vertexCount() const { return fVertexCnt; } 42958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon const SkPoint* positions() const { return fPositions.get(); } 43958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon const SkColor* colors() const { return fColors.get(); } 44958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon 45958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon int indexCount() const { return fIndexCnt; } 46958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon const uint16_t* indices() const { return fIndices.get(); } 4791af72703830f3946c538b47c6c7c96afc0adde2Jim Van Verth 4891af72703830f3946c538b47c6c7c96afc0adde2Jim Van Verthprivate: 49958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon template<typename T> using Deleter = SkTDArray<SkPoint>::Deleter; 50958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon template<typename T> using UniqueArray = std::unique_ptr<const T[], Deleter<T>>; 51958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon 52958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon SkShadowVertices(UniqueArray<SkPoint>&& positions, UniqueArray<SkColor>&& colors, 53958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon UniqueArray<uint16_t>&& indices, int vertexCnt, int indexCnt) 54958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon : fVertexCnt(vertexCnt) 55958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon , fIndexCnt(indexCnt) 56958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon , fPositions(std::move(positions)) 57958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon , fColors(std::move(colors)) 58958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon , fIndices(std::move(indices)) { 59958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon SkASSERT(SkToBool(indices) == SkToBool(indexCnt)); 60958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon } 61958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon 62958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon int fVertexCnt; 63958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon int fIndexCnt; 64958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon UniqueArray<SkPoint> fPositions; 65958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon UniqueArray<SkColor> fColors; 66958fbc460a1e680c6a9979e140da8bfc00b8831dBrian Salomon UniqueArray<uint16_t> fIndices; 6791af72703830f3946c538b47c6c7c96afc0adde2Jim Van Verth}; 6891af72703830f3946c538b47c6c7c96afc0adde2Jim Van Verth 69bce7496d7dd9131cc7121389a55f6d512ee7661eJim Van Verth#endif 70