aboutsummaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-05-31 18:40:36 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-05-31 18:40:36 +0000
commitb505a128efae9debcaa9642bade90bab5525d477 (patch)
tree8ba6050a03c34a2f1165915c44f361e1512406b9 /include
parent0d10280190c411b18feb569a2248552047d1aa93 (diff)
Implement morphology as a custom effect
Review URL: http://codereview.appspot.com/6250073/ git-svn-id: http://skia.googlecode.com/svn/trunk@4102 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include')
-rw-r--r--include/gpu/GrContext.h10
-rw-r--r--include/gpu/GrCustomStage.h2
-rw-r--r--include/gpu/GrProgramStageFactory.h8
-rw-r--r--include/gpu/GrSamplerState.h70
4 files changed, 19 insertions, 71 deletions
diff --git a/include/gpu/GrContext.h b/include/gpu/GrContext.h
index c9c15dfcac..876852825c 100644
--- a/include/gpu/GrContext.h
+++ b/include/gpu/GrContext.h
@@ -617,6 +617,14 @@ public:
float sigmaX, float sigmaY);
/**
+ * This enum is used with the function below, applyMorphology.
+ */
+ enum MorphologyType {
+ kErode_MorphologyType,
+ kDilate_MorphologyType,
+ };
+
+ /**
* Applies a 2D morphology to a given texture.
* @param srcTexture The source texture to be blurred.
* @param rect The destination rectangle.
@@ -632,7 +640,7 @@ public:
GrTexture* applyMorphology(GrTexture* srcTexture,
const GrRect& rect,
GrTexture* temp1, GrTexture* temp2,
- GrSamplerState::Filter filter,
+ MorphologyType type,
SkISize radius);
///////////////////////////////////////////////////////////////////////////
diff --git a/include/gpu/GrCustomStage.h b/include/gpu/GrCustomStage.h
index cb9471e939..5eea9f4929 100644
--- a/include/gpu/GrCustomStage.h
+++ b/include/gpu/GrCustomStage.h
@@ -57,7 +57,7 @@ public:
For equivalence (that they will generate the same
shader, but perhaps have different uniforms), check equality
of the stageKey produced by the GrProgramStageFactory. */
- virtual bool isEqual(const GrCustomStage *) const = 0;
+ virtual bool isEqual(const GrCustomStage&) const = 0;
/** Human-meaningful string to identify this effect; may be embedded
in generated shader code. */
diff --git a/include/gpu/GrProgramStageFactory.h b/include/gpu/GrProgramStageFactory.h
index 2795deb85e..0fac7dbc07 100644
--- a/include/gpu/GrProgramStageFactory.h
+++ b/include/gpu/GrProgramStageFactory.h
@@ -26,9 +26,9 @@ public:
kProgramStageKeyBits = 10,
};
- virtual StageKey glStageKey(const GrCustomStage* stage) const = 0;
+ virtual StageKey glStageKey(const GrCustomStage& stage) const = 0;
virtual GrGLProgramStage* createGLInstance(
- const GrCustomStage* stage) const = 0;
+ const GrCustomStage& stage) const = 0;
bool operator ==(const GrProgramStageFactory& b) const {
return fStageClassID == b.fStageClassID;
@@ -79,7 +79,7 @@ public:
id identifies the GrCustomShader subclass. The remainder is based
on the aspects of the GrCustomStage object's configuration that affect
GLSL code generation. */
- virtual StageKey glStageKey(const GrCustomStage* stage) const SK_OVERRIDE {
+ virtual StageKey glStageKey(const GrCustomStage& stage) const SK_OVERRIDE {
GrAssert(kIllegalStageClassID != fStageClassID);
StageKey stageID = GLProgramStage::GenKey(stage);
#if GR_DEBUG
@@ -94,7 +94,7 @@ public:
for the given GrCustomStage; caller is responsible for deleting
the object. */
virtual GLProgramStage* createGLInstance(
- const GrCustomStage* stage) const SK_OVERRIDE {
+ const GrCustomStage& stage) const SK_OVERRIDE {
return new GLProgramStage(*this, stage);
}
diff --git a/include/gpu/GrSamplerState.h b/include/gpu/GrSamplerState.h
index 952169c6d7..4d2d5f20f5 100644
--- a/include/gpu/GrSamplerState.h
+++ b/include/gpu/GrSamplerState.h
@@ -15,8 +15,6 @@
#include "GrMatrix.h"
#include "GrTypes.h"
-#define MAX_KERNEL_WIDTH 25
-
class GrSamplerState {
public:
enum Filter {
@@ -36,18 +34,6 @@ public:
* on shader backends.
*/
k4x4Downsample_Filter,
- /**
- * Apply a separable convolution kernel.
- */
- kConvolution_Filter,
- /**
- * Apply a dilate filter (max over a 1D radius).
- */
- kDilate_Filter,
- /**
- * Apply an erode filter (min over a 1D radius).
- */
- kErode_Filter,
kDefault_Filter = kNearest_Filter
};
@@ -96,17 +82,6 @@ public:
};
/**
- * For the filters which perform more than one texture sample (convolution,
- * erode, dilate), this determines the direction in which the texture
- * coordinates will be incremented.
- */
- enum FilterDirection {
- kX_FilterDirection,
- kY_FilterDirection,
-
- kDefault_FilterDirection = kX_FilterDirection,
- };
- /**
* Default sampler state is set to clamp, use normal sampling mode, be
* unfiltered, and use identity matrix.
*/
@@ -135,7 +110,7 @@ public:
(fCustomStage && s.fCustomStage &&
(fCustomStage->getFactory() ==
s.fCustomStage->getFactory()) &&
- fCustomStage->isEqual(s.fCustomStage)));
+ fCustomStage->isEqual(*s.fCustomStage)));
}
bool operator !=(const GrSamplerState& s) const { return !(*this == s); }
@@ -143,7 +118,6 @@ public:
// memcpy() breaks refcounting
fWrapX = s.fWrapX;
fWrapY = s.fWrapY;
- fFilterDirection = s.fFilterDirection;
fSampleMode = s.fSampleMode;
fFilter = s.fFilter;
fMatrix = s.fMatrix;
@@ -154,11 +128,6 @@ public:
fRadial2Radius0 = s.fRadial2Radius0;
fRadial2PosRoot = s.fRadial2PosRoot;
- fKernelWidth = s.fKernelWidth;
- if (kConvolution_Filter == fFilter) {
- memcpy(fKernel, s.fKernel, MAX_KERNEL_WIDTH * sizeof(float));
- }
-
fCustomStage = s.fCustomStage;
SkSafeRef(fCustomStage);
@@ -167,16 +136,12 @@ public:
WrapMode getWrapX() const { return fWrapX; }
WrapMode getWrapY() const { return fWrapY; }
- FilterDirection getFilterDirection() const { return fFilterDirection; }
SampleMode getSampleMode() const { return fSampleMode; }
const GrMatrix& getMatrix() const { return fMatrix; }
const GrRect& getTextureDomain() const { return fTextureDomain; }
bool hasTextureDomain() const {return SkIntToScalar(0) != fTextureDomain.right();}
Filter getFilter() const { return fFilter; }
- int getKernelWidth() const { return fKernelWidth; }
- const float* getKernel() const { return fKernel; }
bool swapsRAndB() const { return fSwapRAndB; }
-
bool isGradient() const {
return kRadial_SampleMode == fSampleMode ||
kRadial2_SampleMode == fSampleMode ||
@@ -186,7 +151,6 @@ public:
void setWrapX(WrapMode mode) { fWrapX = mode; }
void setWrapY(WrapMode mode) { fWrapY = mode; }
void setSampleMode(SampleMode mode) { fSampleMode = mode; }
- void setFilterDirection(FilterDirection mode) { fFilterDirection = mode; }
/**
* Access the sampler's matrix. See SampleMode for explanation of
@@ -227,30 +191,24 @@ public:
void reset(WrapMode wrapXAndY,
Filter filter,
- FilterDirection direction,
const GrMatrix& matrix) {
fWrapX = wrapXAndY;
fWrapY = wrapXAndY;
fSampleMode = kDefault_SampleMode;
fFilter = filter;
- fFilterDirection = direction;
fMatrix = matrix;
fTextureDomain.setEmpty();
fSwapRAndB = false;
GrSafeSetNull(fCustomStage);
}
- void reset(WrapMode wrapXAndY, Filter filter, const GrMatrix& matrix) {
- this->reset(wrapXAndY, filter, kDefault_FilterDirection, matrix);
- }
- void reset(WrapMode wrapXAndY,
- Filter filter) {
- this->reset(wrapXAndY, filter, kDefault_FilterDirection, GrMatrix::I());
+ void reset(WrapMode wrapXAndY, Filter filter) {
+ this->reset(wrapXAndY, filter, GrMatrix::I());
}
void reset(const GrMatrix& matrix) {
- this->reset(kDefault_WrapMode, kDefault_Filter, kDefault_FilterDirection, matrix);
+ this->reset(kDefault_WrapMode, kDefault_Filter, matrix);
}
void reset() {
- this->reset(kDefault_WrapMode, kDefault_Filter, kDefault_FilterDirection, GrMatrix::I());
+ this->reset(kDefault_WrapMode, kDefault_Filter, GrMatrix::I());
}
GrScalar getRadial2CenterX1() const { return fRadial2CenterX1; }
@@ -273,19 +231,6 @@ public:
fRadial2PosRoot = posRoot;
}
- void setConvolutionParams(int kernelWidth, const float* kernel) {
- GrAssert(kernelWidth >= 0 && kernelWidth <= MAX_KERNEL_WIDTH);
- fKernelWidth = kernelWidth;
- if (NULL != kernel) {
- memcpy(fKernel, kernel, kernelWidth * sizeof(float));
- }
- }
-
- void setMorphologyRadius(int radius) {
- GrAssert(radius >= 0 && radius <= MAX_KERNEL_WIDTH);
- fKernelWidth = radius;
- }
-
void setCustomStage(GrCustomStage* stage) {
GrSafeAssign(fCustomStage, stage);
}
@@ -294,7 +239,6 @@ public:
private:
WrapMode fWrapX : 8;
WrapMode fWrapY : 8;
- FilterDirection fFilterDirection : 8;
SampleMode fSampleMode : 8;
Filter fFilter : 8;
GrMatrix fMatrix;
@@ -306,10 +250,6 @@ private:
GrScalar fRadial2Radius0;
SkBool8 fRadial2PosRoot;
- // These are undefined unless fFilter == kConvolution_Filter
- uint8_t fKernelWidth;
- float fKernel[MAX_KERNEL_WIDTH];
-
GrCustomStage* fCustomStage;
};