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