15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2014 Google Inc.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SkVertState_DEFINED
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SkVertState_DEFINED
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkCanvas.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/** \struct VertState
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    This is a helper for drawVertices(). It is used to iterate over the triangles
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    that are to be rendered based on an SkCanvas::VertexMode and (optionally) an
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    index array. It does not copy the index array and the client must ensure it
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    remains valid for the lifetime of the VertState object.
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct VertState {
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int f0, f1, f2;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /**
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  Construct a VertState from a vertex count, index array, and index count.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  If the vertices are unindexed pass NULL for indices.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VertState(int vCount, const uint16_t indices[], int indexCount)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            : fIndices(indices) {
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        fCurrIndex = 0;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (indices) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fCount = indexCount;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fCount = vCount;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef bool (*Proc)(VertState*);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)     *  Choose an appropriate function to traverse the vertices.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param mode    Specifies the SkCanvas::VertexMode.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Proc chooseProc(SkCanvas::VertexMode mode);
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int             fCount;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int             fCurrIndex;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint16_t* fIndices;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static bool Triangles(VertState*);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static bool TrianglesX(VertState*);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static bool TriangleStrip(VertState*);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static bool TriangleStripX(VertState*);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static bool TriangleFan(VertState*);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static bool TriangleFanX(VertState*);
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)