/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkVertState.h" bool VertState::Triangles(VertState* state) { int index = state->fCurrIndex; if (index + 3 > state->fCount) { return false; } state->f0 = index + 0; state->f1 = index + 1; state->f2 = index + 2; state->fCurrIndex = index + 3; return true; } bool VertState::TrianglesX(VertState* state) { const uint16_t* indices = state->fIndices; int index = state->fCurrIndex; if (index + 3 > state->fCount) { return false; } state->f0 = indices[index + 0]; state->f1 = indices[index + 1]; state->f2 = indices[index + 2]; state->fCurrIndex = index + 3; return true; } bool VertState::TriangleStrip(VertState* state) { int index = state->fCurrIndex; if (index + 3 > state->fCount) { return false; } state->f2 = index + 2; if (index & 1) { state->f0 = index + 1; state->f1 = index + 0; } else { state->f0 = index + 0; state->f1 = index + 1; } state->fCurrIndex = index + 1; return true; } bool VertState::TriangleStripX(VertState* state) { const uint16_t* indices = state->fIndices; int index = state->fCurrIndex; if (index + 3 > state->fCount) { return false; } state->f2 = indices[index + 2]; if (index & 1) { state->f0 = indices[index + 1]; state->f1 = indices[index + 0]; } else { state->f0 = indices[index + 0]; state->f1 = indices[index + 1]; } state->fCurrIndex = index + 1; return true; } bool VertState::TriangleFan(VertState* state) { int index = state->fCurrIndex; if (index + 3 > state->fCount) { return false; } state->f0 = 0; state->f1 = index + 1; state->f2 = index + 2; state->fCurrIndex = index + 1; return true; } bool VertState::TriangleFanX(VertState* state) { const uint16_t* indices = state->fIndices; int index = state->fCurrIndex; if (index + 3 > state->fCount) { return false; } state->f0 = indices[0]; state->f1 = indices[index + 1]; state->f2 = indices[index + 2]; state->fCurrIndex = index + 1; return true; } VertState::Proc VertState::chooseProc(SkVertices::VertexMode mode) { switch (mode) { case SkVertices::kTriangles_VertexMode: return fIndices ? TrianglesX : Triangles; case SkVertices::kTriangleStrip_VertexMode: return fIndices ? TriangleStripX : TriangleStrip; case SkVertices::kTriangleFan_VertexMode: return fIndices ? TriangleFanX : TriangleFan; default: return nullptr; } }