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