1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2014 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrPrimitiveProcessor.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrCoordTransform.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The key for an individual coord transform is made up of a matrix type, and a bit that indicates 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * the source of the input coords. 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotenum { 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kMatrixTypeKeyBits = 1, 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kPositionCoords_Flag = 1 << kMatrixTypeKeyBits, 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kTransformKeyBits = kMatrixTypeKeyBits + 1, 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * We specialize the vertex code for each of these matrix types. 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotenum MatrixType { 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kNoPersp_MatrixType = 0, 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kGeneral_MatrixType = 1, 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotuint32_t 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotGrPrimitiveProcessor::getTransformKey(const SkTArray<const GrCoordTransform*, true>& coords, 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int numCoords) const { 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t totalKey = 0; 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int t = 0; t < numCoords; ++t) { 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t key = 0; 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrCoordTransform* coordTransform = coords[t]; 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (coordTransform->getMatrix().hasPerspective()) { 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot key |= kGeneral_MatrixType; 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot key |= kNoPersp_MatrixType; 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!this->hasExplicitLocalCoords()) { 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot key |= kPositionCoords_Flag; 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot key <<= kTransformKeyBits * t; 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(0 == (totalKey & key)); // keys for each transform ought not to overlap 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot totalKey |= key; 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return totalKey; 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 54