| Index: include/gpu/GrCoordTransform.h
|
| diff --git a/include/gpu/GrCoordTransform.h b/include/gpu/GrCoordTransform.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..afe2e5ba2f05ac3c5cb72f2149b907e01bddec3e
|
| --- /dev/null
|
| +++ b/include/gpu/GrCoordTransform.h
|
| @@ -0,0 +1,91 @@
|
| +/*
|
| + * Copyright 2013 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#ifndef GrCoordTransform_DEFINED
|
| +#define GrCoordTransform_DEFINED
|
| +
|
| +#include "GrEffect.h"
|
| +#include "SkMatrix.h"
|
| +#include "GrTexture.h"
|
| +#include "GrTypes.h"
|
| +
|
| +/**
|
| + * Coordinates available to GrEffect subclasses for requesting transformations. Transformed
|
| + * coordinates are made available in the the portion of fragment shader emitted by the effect.
|
| + */
|
| +enum GrCoordSet {
|
| + /**
|
| + * The user-space coordinates that map to the fragment being rendered. These coords account for
|
| + * any change of coordinate system done on the CPU by GrContext before rendering, and also are
|
| + * correct for draws that take explicit local coords rather than inferring them from the
|
| + * primitive's positions (e.g. drawVertices). These are usually the coords a GrEffect wants.
|
| + */
|
| + kLocal_GrCoordSet,
|
| +
|
| + /**
|
| + * The actual vertex position. Note that GrContext may not draw using the original view matrix
|
| + * specified by the caller, as it may have transformed vertices into another space. These are
|
| + * usually not the coordinates a GrEffect wants.
|
| + */
|
| + kPosition_GrCoordSet
|
| +};
|
| +
|
| +/**
|
| + * A class representing a linear transformation from one of the built-in coordinate sets (local or
|
| + * position). GrEffects just define these transformations, and the framework does the rest of the
|
| + * work to make the transformed coordinates available in their fragment shader.
|
| + */
|
| +class GrCoordTransform : public SkNoncopyable {
|
| +public:
|
| + GrCoordTransform() {}
|
| +
|
| + /**
|
| + * Create a transformation that maps [0, 1] to a texture's boundaries.
|
| + */
|
| + GrCoordTransform(GrCoordSet sourceCoords, const GrTexture* texture) {
|
| + this->reset(sourceCoords, texture);
|
| + }
|
| +
|
| + /**
|
| + * Create a transformation from a matrix. The optional texture parameter is used to infer if the
|
| + * framework should internally do a y reversal to account for it being upside down by Skia's
|
| + * coord convention.
|
| + */
|
| + GrCoordTransform(GrCoordSet sourceCoords, const SkMatrix& m, const GrTexture* texture = NULL) {
|
| + this->reset(sourceCoords, m, texture);
|
| + }
|
| +
|
| + void reset(GrCoordSet sourceCoords, const GrTexture* texture) {
|
| + SkASSERT(NULL != texture);
|
| + this->reset(sourceCoords, GrEffect::MakeDivByTextureWHMatrix(texture), texture);
|
| + }
|
| +
|
| + void reset(GrCoordSet sourceCoords, const SkMatrix& m, const GrTexture* texture = NULL) {
|
| + fSourceCoords = sourceCoords;
|
| + fMatrix = m;
|
| + fReverseY = NULL != texture && kBottomLeft_GrSurfaceOrigin == texture->origin();
|
| + }
|
| +
|
| + bool operator== (const GrCoordTransform& other) const {
|
| + return fSourceCoords == other.fSourceCoords &&
|
| + fMatrix.cheapEqualTo(other.fMatrix) &&
|
| + fReverseY == other.fReverseY;
|
| + }
|
| +
|
| + GrCoordSet sourceCoords() const { return fSourceCoords; }
|
| + const SkMatrix& getMatrix() const { return fMatrix; }
|
| + bool reverseY() const { return fReverseY; }
|
| +
|
| +private:
|
| + GrCoordSet fSourceCoords;
|
| + SkMatrix fMatrix;
|
| + bool fReverseY;
|
| +
|
| + typedef SkNoncopyable INHERITED;
|
| +};
|
| +
|
| +#endif
|
|
|