OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkAlphaThresholdFilter.h" | 8 #include "SkAlphaThresholdFilter.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkDevice.h" | 10 #include "SkDevice.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 | 22 |
23 SK_TO_STRING_OVERRIDE() | 23 SK_TO_STRING_OVERRIDE() |
24 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkAlphaThresholdFilterIm
pl) | 24 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkAlphaThresholdFilterIm
pl) |
25 | 25 |
26 protected: | 26 protected: |
27 void flatten(SkWriteBuffer&) const override; | 27 void flatten(SkWriteBuffer&) const override; |
28 | 28 |
29 bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, | 29 bool onFilterImage(Proxy*, const SkBitmap& src, const Context&, |
30 SkBitmap* result, SkIPoint* offset) const override; | 30 SkBitmap* result, SkIPoint* offset) const override; |
31 #if SK_SUPPORT_GPU | 31 #if SK_SUPPORT_GPU |
32 bool asFragmentProcessor(GrFragmentProcessor**, GrTexture*, const SkMatrix&, | 32 bool asFragmentProcessor(GrFragmentProcessor**, GrTexture*, |
33 const SkIRect& bounds) const override; | 33 const SkMatrix&, const SkIRect& bounds, GrRenderTar
get* dst) const override; |
34 #endif | 34 #endif |
35 | 35 |
36 private: | 36 private: |
37 SkRegion fRegion; | 37 SkRegion fRegion; |
38 SkScalar fInnerThreshold; | 38 SkScalar fInnerThreshold; |
39 SkScalar fOuterThreshold; | 39 SkScalar fOuterThreshold; |
40 typedef SkImageFilter INHERITED; | 40 typedef SkImageFilter INHERITED; |
41 }; | 41 }; |
42 | 42 |
43 SkImageFilter* SkAlphaThresholdFilter::Create(const SkRegion& region, | 43 SkImageFilter* SkAlphaThresholdFilter::Create(const SkRegion& region, |
(...skipping 17 matching lines...) Expand all Loading... |
61 #include "glsl/GrGLSLFragmentShaderBuilder.h" | 61 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
62 #include "glsl/GrGLSLProgramBuilder.h" | 62 #include "glsl/GrGLSLProgramBuilder.h" |
63 #include "glsl/GrGLSLProgramDataManager.h" | 63 #include "glsl/GrGLSLProgramDataManager.h" |
64 | 64 |
65 class AlphaThresholdEffect : public GrFragmentProcessor { | 65 class AlphaThresholdEffect : public GrFragmentProcessor { |
66 | 66 |
67 public: | 67 public: |
68 static GrFragmentProcessor* Create(GrTexture* texture, | 68 static GrFragmentProcessor* Create(GrTexture* texture, |
69 GrTexture* maskTexture, | 69 GrTexture* maskTexture, |
70 float innerThreshold, | 70 float innerThreshold, |
71 float outerThreshold) { | 71 float outerThreshold, GrRenderTarget* dst
) { |
72 return new AlphaThresholdEffect(texture, maskTexture, innerThreshold, ou
terThreshold); | 72 return new AlphaThresholdEffect(texture, maskTexture, innerThreshold, |
| 73 outerThreshold, dst); |
73 } | 74 } |
74 | 75 |
75 virtual ~AlphaThresholdEffect() {}; | 76 virtual ~AlphaThresholdEffect() {}; |
76 | 77 |
77 const char* name() const override { return "Alpha Threshold"; } | 78 const char* name() const override { return "Alpha Threshold"; } |
78 | 79 |
79 float innerThreshold() const { return fInnerThreshold; } | 80 float innerThreshold() const { return fInnerThreshold; } |
80 float outerThreshold() const { return fOuterThreshold; } | 81 float outerThreshold() const { return fOuterThreshold; } |
81 | 82 |
82 private: | 83 private: |
83 AlphaThresholdEffect(GrTexture* texture, | 84 AlphaThresholdEffect(GrTexture* texture, |
84 GrTexture* maskTexture, | 85 GrTexture* maskTexture, |
85 float innerThreshold, | 86 float innerThreshold, |
86 float outerThreshold) | 87 float outerThreshold, |
| 88 GrRenderTarget* dst) |
87 : fInnerThreshold(innerThreshold) | 89 : fInnerThreshold(innerThreshold) |
88 , fOuterThreshold(outerThreshold) | 90 , fOuterThreshold(outerThreshold) |
89 , fImageCoordTransform(kLocal_GrCoordSet, | 91 , fImageCoordTransform(kLocal_GrCoordSet, |
90 GrCoordTransform::MakeDivByTextureWHMatrix(textur
e), texture, | 92 GrCoordTransform::MakeDivByTextureWHMatrix(textur
e), texture, |
91 GrTextureParams::kNone_FilterMode) | 93 GrTextureParams::kNone_FilterMode) |
92 , fImageTextureAccess(texture) | 94 , fImageTextureAccess(texture, GrTextureParams::kNone_FilterMode,SkShade
r::kClamp_TileMode, dst) |
93 , fMaskCoordTransform(kLocal_GrCoordSet, | 95 , fMaskCoordTransform(kLocal_GrCoordSet, |
94 GrCoordTransform::MakeDivByTextureWHMatrix(maskTex
ture), maskTexture, | 96 GrCoordTransform::MakeDivByTextureWHMatrix(maskTex
ture), maskTexture, |
95 GrTextureParams::kNone_FilterMode) | 97 GrTextureParams::kNone_FilterMode) |
96 , fMaskTextureAccess(maskTexture) { | 98 , fMaskTextureAccess(maskTexture, GrTextureParams::kNone_FilterMode,SkSh
ader::kClamp_TileMode, dst) { |
97 this->initClassID<AlphaThresholdEffect>(); | 99 this->initClassID<AlphaThresholdEffect>(); |
98 this->addCoordTransform(&fImageCoordTransform); | 100 this->addCoordTransform(&fImageCoordTransform); |
99 this->addTextureAccess(&fImageTextureAccess); | 101 this->addTextureAccess(&fImageTextureAccess); |
100 this->addCoordTransform(&fMaskCoordTransform); | 102 this->addCoordTransform(&fMaskCoordTransform); |
101 this->addTextureAccess(&fMaskTextureAccess); | 103 this->addTextureAccess(&fMaskTextureAccess); |
102 } | 104 } |
103 | 105 |
104 GrGLFragmentProcessor* onCreateGLInstance() const override; | 106 GrGLFragmentProcessor* onCreateGLInstance() const override; |
105 | 107 |
106 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; | 108 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 | 193 |
192 ///////////////////////////////////////////////////////////////////// | 194 ///////////////////////////////////////////////////////////////////// |
193 | 195 |
194 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(AlphaThresholdEffect); | 196 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(AlphaThresholdEffect); |
195 | 197 |
196 const GrFragmentProcessor* AlphaThresholdEffect::TestCreate(GrProcessorTestData*
d) { | 198 const GrFragmentProcessor* AlphaThresholdEffect::TestCreate(GrProcessorTestData*
d) { |
197 GrTexture* bmpTex = d->fTextures[GrProcessorUnitTest::kSkiaPMTextureIdx]; | 199 GrTexture* bmpTex = d->fTextures[GrProcessorUnitTest::kSkiaPMTextureIdx]; |
198 GrTexture* maskTex = d->fTextures[GrProcessorUnitTest::kAlphaTextureIdx]; | 200 GrTexture* maskTex = d->fTextures[GrProcessorUnitTest::kAlphaTextureIdx]; |
199 float innerThresh = d->fRandom->nextUScalar1(); | 201 float innerThresh = d->fRandom->nextUScalar1(); |
200 float outerThresh = d->fRandom->nextUScalar1(); | 202 float outerThresh = d->fRandom->nextUScalar1(); |
201 return AlphaThresholdEffect::Create(bmpTex, maskTex, innerThresh, outerThres
h); | 203 return AlphaThresholdEffect::Create(bmpTex, maskTex, innerThresh, |
| 204 outerThresh, NULL); |
202 } | 205 } |
203 | 206 |
204 /////////////////////////////////////////////////////////////////////////////// | 207 /////////////////////////////////////////////////////////////////////////////// |
205 | 208 |
206 void AlphaThresholdEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, | 209 void AlphaThresholdEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, |
207 GrProcessorKeyBuilder* b) const { | 210 GrProcessorKeyBuilder* b) const { |
208 GrGLAlphaThresholdEffect::GenKey(*this, caps, b); | 211 GrGLAlphaThresholdEffect::GenKey(*this, caps, b); |
209 } | 212 } |
210 | 213 |
211 GrGLFragmentProcessor* AlphaThresholdEffect::onCreateGLInstance() const { | 214 GrGLFragmentProcessor* AlphaThresholdEffect::onCreateGLInstance() const { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 : INHERITED(1, &input) | 249 : INHERITED(1, &input) |
247 , fRegion(region) | 250 , fRegion(region) |
248 , fInnerThreshold(innerThreshold) | 251 , fInnerThreshold(innerThreshold) |
249 , fOuterThreshold(outerThreshold) { | 252 , fOuterThreshold(outerThreshold) { |
250 } | 253 } |
251 | 254 |
252 #if SK_SUPPORT_GPU | 255 #if SK_SUPPORT_GPU |
253 bool SkAlphaThresholdFilterImpl::asFragmentProcessor(GrFragmentProcessor** fp, | 256 bool SkAlphaThresholdFilterImpl::asFragmentProcessor(GrFragmentProcessor** fp, |
254 GrTexture* texture, | 257 GrTexture* texture, |
255 const SkMatrix& inMatrix, | 258 const SkMatrix& inMatrix, |
256 const SkIRect&) const { | 259 const SkIRect&, GrRenderTar
get* dst) const { |
257 if (fp) { | 260 if (fp) { |
258 GrContext* context = texture->getContext(); | 261 GrContext* context = texture->getContext(); |
259 GrSurfaceDesc maskDesc; | 262 GrSurfaceDesc maskDesc; |
260 if (context->caps()->isConfigRenderable(kAlpha_8_GrPixelConfig, false))
{ | 263 if (context->caps()->isConfigRenderable(kAlpha_8_GrPixelConfig, false))
{ |
261 maskDesc.fConfig = kAlpha_8_GrPixelConfig; | 264 maskDesc.fConfig = kAlpha_8_GrPixelConfig; |
262 } else { | 265 } else { |
263 maskDesc.fConfig = kRGBA_8888_GrPixelConfig; | 266 maskDesc.fConfig = kRGBA_8888_GrPixelConfig; |
264 } | 267 } |
265 maskDesc.fFlags = kRenderTarget_GrSurfaceFlag; | 268 maskDesc.fFlags = kRenderTarget_GrSurfaceFlag; |
266 // Add one pixel of border to ensure that clamp mode will be all zeros | 269 // Add one pixel of border to ensure that clamp mode will be all zeros |
(...skipping 14 matching lines...) Expand all Loading... |
281 SkRegion::Iterator iter(fRegion); | 284 SkRegion::Iterator iter(fRegion); |
282 drawContext->clear(nullptr, 0x0, true); | 285 drawContext->clear(nullptr, 0x0, true); |
283 | 286 |
284 while (!iter.done()) { | 287 while (!iter.done()) { |
285 SkRect rect = SkRect::Make(iter.rect()); | 288 SkRect rect = SkRect::Make(iter.rect()); |
286 drawContext->drawRect(GrClip::WideOpen(), grPaint, inMatrix, rec
t); | 289 drawContext->drawRect(GrClip::WideOpen(), grPaint, inMatrix, rec
t); |
287 iter.next(); | 290 iter.next(); |
288 } | 291 } |
289 } | 292 } |
290 | 293 |
| 294 // TODO: whoever uses the resulting 'fp' needs to "use" the correct |
| 295 // drawContext |
291 *fp = AlphaThresholdEffect::Create(texture, | 296 *fp = AlphaThresholdEffect::Create(texture, |
292 maskTexture, | 297 maskTexture, |
293 fInnerThreshold, | 298 fInnerThreshold, |
294 fOuterThreshold); | 299 fOuterThreshold, dst); |
295 } | 300 } |
296 return true; | 301 return true; |
297 } | 302 } |
298 #endif | 303 #endif |
299 | 304 |
300 void SkAlphaThresholdFilterImpl::flatten(SkWriteBuffer& buffer) const { | 305 void SkAlphaThresholdFilterImpl::flatten(SkWriteBuffer& buffer) const { |
301 this->INHERITED::flatten(buffer); | 306 this->INHERITED::flatten(buffer); |
302 buffer.writeScalar(fInnerThreshold); | 307 buffer.writeScalar(fInnerThreshold); |
303 buffer.writeScalar(fOuterThreshold); | 308 buffer.writeScalar(fOuterThreshold); |
304 buffer.writeRegion(fRegion); | 309 buffer.writeRegion(fRegion); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 } | 375 } |
371 | 376 |
372 #ifndef SK_IGNORE_TO_STRING | 377 #ifndef SK_IGNORE_TO_STRING |
373 void SkAlphaThresholdFilterImpl::toString(SkString* str) const { | 378 void SkAlphaThresholdFilterImpl::toString(SkString* str) const { |
374 str->appendf("SkAlphaThresholdImageFilter: ("); | 379 str->appendf("SkAlphaThresholdImageFilter: ("); |
375 str->appendf("inner: %f outer: %f", fInnerThreshold, fOuterThreshold); | 380 str->appendf("inner: %f outer: %f", fInnerThreshold, fOuterThreshold); |
376 str->append(")"); | 381 str->append(")"); |
377 } | 382 } |
378 #endif | 383 #endif |
379 | 384 |
OLD | NEW |