| /* |
| * 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 "GrPrimitiveProcessor.h" |
| |
| #include "GrCoordTransform.h" |
| |
| /** |
| * The key for an individual coord transform is made up of a matrix type, and a bit that indicates |
| * the source of the input coords. |
| */ |
| enum { |
| kMatrixTypeKeyBits = 1, |
| kPositionCoords_Flag = 1 << kMatrixTypeKeyBits, |
| kTransformKeyBits = kMatrixTypeKeyBits + 1, |
| }; |
| |
| /** |
| * We specialize the vertex code for each of these matrix types. |
| */ |
| enum MatrixType { |
| kNoPersp_MatrixType = 0, |
| kGeneral_MatrixType = 1, |
| }; |
| |
| uint32_t |
| GrPrimitiveProcessor::getTransformKey(const SkTArray<const GrCoordTransform*, true>& coords, |
| int numCoords) const { |
| uint32_t totalKey = 0; |
| for (int t = 0; t < numCoords; ++t) { |
| uint32_t key = 0; |
| const GrCoordTransform* coordTransform = coords[t]; |
| if (coordTransform->getMatrix().hasPerspective()) { |
| key |= kGeneral_MatrixType; |
| } else { |
| key |= kNoPersp_MatrixType; |
| } |
| |
| if (!this->hasExplicitLocalCoords()) { |
| key |= kPositionCoords_Flag; |
| } |
| |
| key <<= kTransformKeyBits * t; |
| |
| SkASSERT(0 == (totalKey & key)); // keys for each transform ought not to overlap |
| totalKey |= key; |
| } |
| return totalKey; |
| } |