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