105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2010 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifndef GrSamplerState_DEFINED
1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GrSamplerState_DEFINED
1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrTypes.h"
1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrMatrix.h"
1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define MAX_KERNEL_WIDTH 25
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrSamplerState {
2005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
2135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    enum Filter {
2235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        /**
2335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger         * Read the closest src texel to the sample position
2435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger         */
2535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        kNearest_Filter,
2635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        /**
2735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger         * Blend between closest 4 src texels to sample position (tent filter)
2835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger         */
2935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        kBilinear_Filter,
3035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        /**
3135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger         * Average of 4 bilinear filterings spaced +/- 1 texel from sample
3235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger         * position in x and y. Intended for averaging 16 texels in a downsample
3335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger         * pass. (rasterizing such that texture samples fall exactly halfway
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * between texels in x and y spaced 4 texels apart.) Only supported
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * on shader backends.
3635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger         */
3735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        k4x4Downsample_Filter,
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        /**
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         * Apply a separable convolution kernel.
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         */
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kConvolution_Filter,
424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        /**
434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger         * Apply a dilate filter (max over a 1D radius).
444f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger         */
454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        kDilate_Filter,
464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        /**
474f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger         * Apply an erode filter (min over a 1D radius).
484f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger         */
494f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        kErode_Filter,
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kDefault_Filter = kNearest_Filter
5235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    };
5335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * The intepretation of the texture matrix depends on the sample mode. The
5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * texture matrix is applied both when the texture coordinates are explicit
5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * and  when vertex positions are used as texture  coordinates. In the latter
5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * case the texture matrix is applied to the pre-view-matrix position
5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * values.
6005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *
6105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * kNormal_SampleMode
6205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  The post-matrix texture coordinates are in normalize space with (0,0) at
6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  the top-left and (1,1) at the bottom right.
6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * kRadial_SampleMode
6505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  The matrix specifies the radial gradient parameters.
6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  (0,0) in the post-matrix space is center of the radial gradient.
6705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * kRadial2_SampleMode
6805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *   Matrix transforms to space where first circle is centered at the
6905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *   origin. The second circle will be centered (x, 0) where x may be
7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *   0 and is provided by setRadial2Params. The post-matrix space is
7105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *   normalized such that 1 is the second radius - first radius.
7205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * kSweepSampleMode
7305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  The angle from the origin of texture coordinates in post-matrix space
7405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  determines the gradient value.
7505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
7605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    enum SampleMode {
7705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kNormal_SampleMode,     //!< sample color directly
7805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kRadial_SampleMode,     //!< treat as radial gradient
7905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kRadial2_SampleMode,    //!< treat as 2-point radial gradient
8005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kSweep_SampleMode,      //!< treat as sweep gradient
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kDefault_SampleMode = kNormal_SampleMode
8305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    };
8405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
8505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
8605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * Describes how a texture is sampled when coordinates are outside the
8705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * texture border
8805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
8905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    enum WrapMode {
9005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kClamp_WrapMode,
9105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kRepeat_WrapMode,
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kMirror_WrapMode,
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kDefault_WrapMode = kClamp_WrapMode
9505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    };
9605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
984f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     * For the filters which perform more than one texture sample (convolution,
994f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     * erode, dilate), this determines the direction in which the texture
1004f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     * coordinates will be incremented.
1014f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     */
1024f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    enum FilterDirection {
1034f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        kX_FilterDirection,
1044f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        kY_FilterDirection,
1054f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
1064f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        kDefault_FilterDirection = kX_FilterDirection,
1074f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    };
1084f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    /**
10905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * Default sampler state is set to clamp, use normal sampling mode, be
11005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * unfiltered, and use identity matrix.
11105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrSamplerState()
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    : fRadial2CenterX1()
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    , fRadial2Radius0()
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    , fRadial2PosRoot() {
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        this->reset();
11705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
11805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
11905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    WrapMode getWrapX() const { return fWrapX; }
12005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    WrapMode getWrapY() const { return fWrapY; }
1214f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    FilterDirection getFilterDirection() const { return fFilterDirection; }
12205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SampleMode getSampleMode() const { return fSampleMode; }
12305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const GrMatrix& getMatrix() const { return fMatrix; }
1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const GrRect& getTextureDomain() const { return fTextureDomain; }
1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bool hasTextureDomain() const {return SkIntToScalar(0) != fTextureDomain.right();}
12635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    Filter getFilter() const { return fFilter; }
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int getKernelWidth() const { return fKernelWidth; }
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const float* getKernel() const { return fKernel; }
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool swapsRAndB() const { return fSwapRAndB; }
13005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    bool isGradient() const {
13205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return  kRadial_SampleMode == fSampleMode ||
13305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                kRadial2_SampleMode == fSampleMode ||
13405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                kSweep_SampleMode == fSampleMode;
13505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
13605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void setWrapX(WrapMode mode) { fWrapX = mode; }
13805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void setWrapY(WrapMode mode) { fWrapY = mode; }
13905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void setSampleMode(SampleMode mode) { fSampleMode = mode; }
1404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    void setFilterDirection(FilterDirection mode) { fFilterDirection = mode; }
14105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
14205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Access the sampler's matrix. See SampleMode for explanation of
14405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * relationship between the matrix and sample mode.
14505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrMatrix* matrix() { return &fMatrix; }
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
14805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     * Sets the sampler's texture coordinate domain to a
1500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     * custom rectangle, rather than the default (0,1).
1510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     * This option is currently only supported with kClamp_WrapMode
1520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
1530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void setTextureDomain(const GrRect& textureDomain) { fTextureDomain = textureDomain; }
1540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /**
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Swaps the R and B components when reading from the texture. Has no effect
1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * if the texture is alpha only.
1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setRAndBSwap(bool swap) { fSwapRAndB = swap; }
1601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
16205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  Multiplies the current sampler matrix  a matrix
16305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *
16405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  After this call M' = M*m where M is the old matrix, m is the parameter
16505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  to this function, and M' is the new matrix. (We consider points to
16605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  be column vectors so tex cood vector t is transformed by matrix X as
16705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  t' = X*t.)
16805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *
16905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  @param matrix   the matrix used to modify the matrix.
17005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
17105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void preConcatMatrix(const GrMatrix& matrix) { fMatrix.preConcat(matrix); }
17205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
17305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
17435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * Sets filtering type.
17535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * @param filter    type of filtering to apply
17605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
17735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    void setFilter(Filter filter) { fFilter = filter; }
17805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void reset(WrapMode wrapXAndY,
1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger               Filter filter,
1814f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger               FilterDirection direction,
1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger               const GrMatrix& matrix) {
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fWrapX = wrapXAndY;
1841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fWrapY = wrapXAndY;
1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fSampleMode = kDefault_SampleMode;
1861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fFilter = filter;
1874f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fFilterDirection = direction;
1881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fMatrix = matrix;
1890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fTextureDomain.setEmpty();
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fSwapRAndB = false;
1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1924f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    void reset(WrapMode wrapXAndY, Filter filter, const GrMatrix& matrix) {
1934f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        this->reset(wrapXAndY, filter, kDefault_FilterDirection, matrix);
1944f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void reset(WrapMode wrapXAndY,
1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger               Filter filter) {
1974f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        this->reset(wrapXAndY, filter, kDefault_FilterDirection, GrMatrix::I());
1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void reset(const GrMatrix& matrix) {
2004f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        this->reset(kDefault_WrapMode, kDefault_Filter, kDefault_FilterDirection, matrix);
2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void reset() {
2034f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        this->reset(kDefault_WrapMode, kDefault_Filter, kDefault_FilterDirection, GrMatrix::I());
20405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
20505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
20605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrScalar getRadial2CenterX1() const { return fRadial2CenterX1; }
20705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrScalar getRadial2Radius0() const { return fRadial2Radius0; }
2081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool     isRadial2PosRoot() const { return SkToBool(fRadial2PosRoot); }
2091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // do the radial gradient params lead to a linear (rather than quadratic)
2101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // equation.
2111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool radial2IsDegenerate() const { return GR_Scalar1 == fRadial2CenterX1; }
21205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
21305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
21405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * Sets the parameters for kRadial2_SampleMode. The texture
21505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * matrix must be set so that the first point is at (0,0) and the second
21605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * point lies on the x-axis. The second radius minus the first is 1 unit.
21705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * The additional parameters to define the gradient are specified by this
21805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     * function.
21905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
22005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void setRadial2Params(GrScalar centerX1, GrScalar radius0, bool posRoot) {
22105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fRadial2CenterX1 = centerX1;
22205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fRadial2Radius0 = radius0;
22305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fRadial2PosRoot = posRoot;
22405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
22505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    void setConvolutionParams(int kernelWidth, const float* kernel) {
2271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(kernelWidth >= 0 && kernelWidth <= MAX_KERNEL_WIDTH);
2281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fKernelWidth = kernelWidth;
2291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (NULL != kernel) {
2301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            memcpy(fKernel, kernel, kernelWidth * sizeof(float));
2311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    }
2334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
2344f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    void setMorphologyRadius(int radius) {
2354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GrAssert(radius >= 0 && radius <= MAX_KERNEL_WIDTH);
2364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fKernelWidth = radius;
23705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
23805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
23905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
2404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    WrapMode            fWrapX : 8;
2414f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    WrapMode            fWrapY : 8;
2424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    FilterDirection     fFilterDirection : 8;
2434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    SampleMode          fSampleMode : 8;
2444f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    Filter              fFilter : 8;
2454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrMatrix            fMatrix;
2464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    bool                fSwapRAndB;
2474f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrRect              fTextureDomain;
24805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
24905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // these are undefined unless fSampleMode == kRadial2_SampleMode
2504f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrScalar            fRadial2CenterX1;
2514f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrScalar            fRadial2Radius0;
2524f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    SkBool8             fRadial2PosRoot;
25305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // These are undefined unless fFilter == kConvolution_Filter
2554f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    uint8_t             fKernelWidth;
2564f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    float               fKernel[MAX_KERNEL_WIDTH];
25705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
25805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
25905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
26005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
261