X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fthird_party%2Fskia%2Fsrc%2Feffects%2FSkDisplacementMapEffect.cpp;h=474d9a7dc8123f8eec5c76fd3bf5ae95d71f26d7;hb=3545e9f2671f595d2a2f3ee75ca0393b01e35ef6;hp=bae7ac098c7bdf376754ff508af432e3a3de45b6;hpb=7d210d4c7e9ba36e635eabc5b5780495f8a63292;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/third_party/skia/src/effects/SkDisplacementMapEffect.cpp b/src/third_party/skia/src/effects/SkDisplacementMapEffect.cpp index bae7ac0..474d9a7 100644 --- a/src/third_party/skia/src/effects/SkDisplacementMapEffect.cpp +++ b/src/third_party/skia/src/effects/SkDisplacementMapEffect.cpp @@ -13,9 +13,9 @@ #if SK_SUPPORT_GPU #include "GrContext.h" #include "GrCoordTransform.h" -#include "gl/GrGLEffect.h" -#include "gl/GrGLShaderBuilder.h" -#include "GrTBackendEffectFactory.h" +#include "gl/GrGLProcessor.h" +#include "gl/builders/GrGLProgramBuilder.h" +#include "GrTBackendProcessorFactory.h" #endif namespace { @@ -159,12 +159,29 @@ bool channel_selector_type_is_valid(SkDisplacementMapEffect::ChannelSelectorType /////////////////////////////////////////////////////////////////////////////// +SkDisplacementMapEffect* SkDisplacementMapEffect::Create(ChannelSelectorType xChannelSelector, + ChannelSelectorType yChannelSelector, + SkScalar scale, + SkImageFilter* displacement, + SkImageFilter* color, + const CropRect* cropRect, uint32_t uniqueID) { + if (!channel_selector_type_is_valid(xChannelSelector) || + !channel_selector_type_is_valid(yChannelSelector)) { + return NULL; + } + + SkImageFilter* inputs[2] = { displacement, color }; + return SkNEW_ARGS(SkDisplacementMapEffect, (xChannelSelector, yChannelSelector, scale, + inputs, cropRect, uniqueID)); +} + SkDisplacementMapEffect::SkDisplacementMapEffect(ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, SkScalar scale, SkImageFilter* inputs[2], - const CropRect* cropRect) - : INHERITED(2, inputs, cropRect) + const CropRect* cropRect, + uint32_t uniqueID) + : INHERITED(2, inputs, cropRect, uniqueID) , fXChannelSelector(xChannelSelector) , fYChannelSelector(yChannelSelector) , fScale(scale) @@ -174,6 +191,7 @@ SkDisplacementMapEffect::SkDisplacementMapEffect(ChannelSelectorType xChannelSel SkDisplacementMapEffect::~SkDisplacementMapEffect() { } +#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING SkDisplacementMapEffect::SkDisplacementMapEffect(SkReadBuffer& buffer) : INHERITED(2, buffer) { @@ -184,6 +202,15 @@ SkDisplacementMapEffect::SkDisplacementMapEffect(SkReadBuffer& buffer) channel_selector_type_is_valid(fYChannelSelector) && SkScalarIsFinite(fScale)); } +#endif + +SkFlattenable* SkDisplacementMapEffect::CreateProc(SkReadBuffer& buffer) { + SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 2); + ChannelSelectorType xsel = (ChannelSelectorType)buffer.readInt(); + ChannelSelectorType ysel = (ChannelSelectorType)buffer.readInt(); + SkScalar scale = buffer.readScalar(); + return Create(xsel, ysel, scale, common.getInput(0), common.getInput(1), &common.cropRect(), common.uniqueID()); +} void SkDisplacementMapEffect::flatten(SkWriteBuffer& buffer) const { this->INHERITED::flatten(buffer); @@ -227,7 +254,7 @@ bool SkDisplacementMapEffect::onFilterImage(Proxy* proxy, return false; } - if (!dst->allocPixels(color.info().makeWH(bounds.width(), bounds.height()))) { + if (!dst->tryAllocPixels(color.info().makeWH(bounds.width(), bounds.height()))) { return false; } @@ -270,41 +297,40 @@ bool SkDisplacementMapEffect::onFilterBounds(const SkIRect& src, const SkMatrix& /////////////////////////////////////////////////////////////////////////////// #if SK_SUPPORT_GPU -class GrGLDisplacementMapEffect : public GrGLEffect { +class GrGLDisplacementMapEffect : public GrGLFragmentProcessor { public: - GrGLDisplacementMapEffect(const GrBackendEffectFactory& factory, - const GrDrawEffect& drawEffect); + GrGLDisplacementMapEffect(const GrBackendProcessorFactory&, + const GrProcessor&); virtual ~GrGLDisplacementMapEffect(); - virtual void emitCode(GrGLShaderBuilder*, - const GrDrawEffect&, - const GrEffectKey&, + virtual void emitCode(GrGLProgramBuilder*, + const GrFragmentProcessor&, + const GrProcessorKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; - static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*); + static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*); - virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_OVERRIDE; + virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE; private: SkDisplacementMapEffect::ChannelSelectorType fXChannelSelector; SkDisplacementMapEffect::ChannelSelectorType fYChannelSelector; GrGLProgramDataManager::UniformHandle fScaleUni; - typedef GrGLEffect INHERITED; + typedef GrGLFragmentProcessor INHERITED; }; /////////////////////////////////////////////////////////////////////////////// -class GrDisplacementMapEffect : public GrEffect { +class GrDisplacementMapEffect : public GrFragmentProcessor { public: - static GrEffect* Create(SkDisplacementMapEffect::ChannelSelectorType xChannelSelector, - SkDisplacementMapEffect::ChannelSelectorType yChannelSelector, - SkVector scale, - GrTexture* displacement, const SkMatrix& offsetMatrix, - GrTexture* color) { + static GrFragmentProcessor* Create( + SkDisplacementMapEffect::ChannelSelectorType xChannelSelector, + SkDisplacementMapEffect::ChannelSelectorType yChannelSelector, SkVector scale, + GrTexture* displacement, const SkMatrix& offsetMatrix, GrTexture* color) { return SkNEW_ARGS(GrDisplacementMapEffect, (xChannelSelector, yChannelSelector, scale, @@ -315,20 +341,20 @@ public: virtual ~GrDisplacementMapEffect(); - virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; + virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERRIDE; SkDisplacementMapEffect::ChannelSelectorType xChannelSelector() const { return fXChannelSelector; } SkDisplacementMapEffect::ChannelSelectorType yChannelSelector() const { return fYChannelSelector; } const SkVector& scale() const { return fScale; } - typedef GrGLDisplacementMapEffect GLEffect; + typedef GrGLDisplacementMapEffect GLProcessor; static const char* Name() { return "DisplacementMap"; } virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; private: - virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; + virtual bool onIsEqual(const GrProcessor&) const SK_OVERRIDE; GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChannelSelector, SkDisplacementMapEffect::ChannelSelectorType yChannelSelector, @@ -336,7 +362,7 @@ private: GrTexture* displacement, const SkMatrix& offsetMatrix, GrTexture* color); - GR_DECLARE_EFFECT_TEST; + GR_DECLARE_FRAGMENT_PROCESSOR_TEST; GrCoordTransform fDisplacementTransform; GrTextureAccess fDisplacementAccess; @@ -346,7 +372,7 @@ private: SkDisplacementMapEffect::ChannelSelectorType fYChannelSelector; SkVector fScale; - typedef GrEffect INHERITED; + typedef GrFragmentProcessor INHERITED; }; bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx, @@ -400,11 +426,11 @@ bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src, ctx.ctm().mapVectors(&scale, 1); GrPaint paint; - SkMatrix offsetMatrix = GrEffect::MakeDivByTextureWHMatrix(displacement); + SkMatrix offsetMatrix = GrCoordTransform::MakeDivByTextureWHMatrix(displacement); offsetMatrix.preTranslate(SkIntToScalar(colorOffset.fX - displacementOffset.fX), SkIntToScalar(colorOffset.fY - displacementOffset.fY)); - paint.addColorEffect( + paint.addColorProcessor( GrDisplacementMapEffect::Create(fXChannelSelector, fYChannelSelector, scale, @@ -452,8 +478,8 @@ GrDisplacementMapEffect::GrDisplacementMapEffect( GrDisplacementMapEffect::~GrDisplacementMapEffect() { } -bool GrDisplacementMapEffect::onIsEqual(const GrEffect& sBase) const { - const GrDisplacementMapEffect& s = CastEffect(sBase); +bool GrDisplacementMapEffect::onIsEqual(const GrProcessor& sBase) const { + const GrDisplacementMapEffect& s = sBase.cast(); return fDisplacementAccess.getTexture() == s.fDisplacementAccess.getTexture() && fColorAccess.getTexture() == s.fColorAccess.getTexture() && fXChannelSelector == s.fXChannelSelector && @@ -461,8 +487,8 @@ bool GrDisplacementMapEffect::onIsEqual(const GrEffect& sBase) const { fScale == s.fScale; } -const GrBackendEffectFactory& GrDisplacementMapEffect::getFactory() const { - return GrTBackendEffectFactory::getInstance(); +const GrBackendFragmentProcessorFactory& GrDisplacementMapEffect::getFactory() const { + return GrTBackendFragmentProcessorFactory::getInstance(); } void GrDisplacementMapEffect::getConstantColorComponents(GrColor*, @@ -477,16 +503,16 @@ void GrDisplacementMapEffect::getConstantColorComponents(GrColor*, /////////////////////////////////////////////////////////////////////////////// -GR_DEFINE_EFFECT_TEST(GrDisplacementMapEffect); +GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrDisplacementMapEffect); -GrEffect* GrDisplacementMapEffect::TestCreate(SkRandom* random, +GrFragmentProcessor* GrDisplacementMapEffect::TestCreate(SkRandom* random, GrContext*, const GrDrawTargetCaps&, GrTexture* textures[]) { - int texIdxDispl = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx : - GrEffectUnitTest::kAlphaTextureIdx; - int texIdxColor = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx : - GrEffectUnitTest::kAlphaTextureIdx; + int texIdxDispl = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : + GrProcessorUnitTest::kAlphaTextureIdx; + int texIdxColor = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : + GrProcessorUnitTest::kAlphaTextureIdx; static const int kMaxComponent = 4; SkDisplacementMapEffect::ChannelSelectorType xChannelSelector = static_cast( @@ -504,26 +530,26 @@ GrEffect* GrDisplacementMapEffect::TestCreate(SkRandom* random, /////////////////////////////////////////////////////////////////////////////// -GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrBackendEffectFactory& factory, - const GrDrawEffect& drawEffect) +GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrBackendProcessorFactory& factory, + const GrProcessor& proc) : INHERITED(factory) - , fXChannelSelector(drawEffect.castEffect().xChannelSelector()) - , fYChannelSelector(drawEffect.castEffect().yChannelSelector()) { + , fXChannelSelector(proc.cast().xChannelSelector()) + , fYChannelSelector(proc.cast().yChannelSelector()) { } GrGLDisplacementMapEffect::~GrGLDisplacementMapEffect() { } -void GrGLDisplacementMapEffect::emitCode(GrGLShaderBuilder* builder, - const GrDrawEffect&, - const GrEffectKey& key, +void GrGLDisplacementMapEffect::emitCode(GrGLProgramBuilder* builder, + const GrFragmentProcessor&, + const GrProcessorKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, const TextureSamplerArray& samplers) { sk_ignore_unused_variable(inputColor); - fScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, + fScaleUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, kVec2f_GrSLType, "Scale"); const char* scaleUni = builder->getUniformCStr(fScaleUni); const char* dColor = "dColor"; @@ -533,29 +559,30 @@ void GrGLDisplacementMapEffect::emitCode(GrGLShaderBuilder* builder, // a number smaller than that to approximate 0, but // leave room for 32-bit float GPU rounding errors. - builder->fsCodeAppendf("\t\tvec4 %s = ", dColor); - builder->fsAppendTextureLookup(samplers[0], coords[0].c_str(), coords[0].type()); - builder->fsCodeAppend(";\n"); + GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + fsBuilder->codeAppendf("\t\tvec4 %s = ", dColor); + fsBuilder->appendTextureLookup(samplers[0], coords[0].c_str(), coords[0].getType()); + fsBuilder->codeAppend(";\n"); // Unpremultiply the displacement - builder->fsCodeAppendf("\t\t%s.rgb = (%s.a < %s) ? vec3(0.0) : clamp(%s.rgb / %s.a, 0.0, 1.0);", + fsBuilder->codeAppendf("\t\t%s.rgb = (%s.a < %s) ? vec3(0.0) : clamp(%s.rgb / %s.a, 0.0, 1.0);", dColor, dColor, nearZero, dColor, dColor); - builder->fsCodeAppendf("\t\tvec2 %s = %s + %s*(%s.", + fsBuilder->codeAppendf("\t\tvec2 %s = %s + %s*(%s.", cCoords, coords[1].c_str(), scaleUni, dColor); switch (fXChannelSelector) { case SkDisplacementMapEffect::kR_ChannelSelectorType: - builder->fsCodeAppend("r"); + fsBuilder->codeAppend("r"); break; case SkDisplacementMapEffect::kG_ChannelSelectorType: - builder->fsCodeAppend("g"); + fsBuilder->codeAppend("g"); break; case SkDisplacementMapEffect::kB_ChannelSelectorType: - builder->fsCodeAppend("b"); + fsBuilder->codeAppend("b"); break; case SkDisplacementMapEffect::kA_ChannelSelectorType: - builder->fsCodeAppend("a"); + fsBuilder->codeAppend("a"); break; case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: default: @@ -564,37 +591,36 @@ void GrGLDisplacementMapEffect::emitCode(GrGLShaderBuilder* builder, switch (fYChannelSelector) { case SkDisplacementMapEffect::kR_ChannelSelectorType: - builder->fsCodeAppend("r"); + fsBuilder->codeAppend("r"); break; case SkDisplacementMapEffect::kG_ChannelSelectorType: - builder->fsCodeAppend("g"); + fsBuilder->codeAppend("g"); break; case SkDisplacementMapEffect::kB_ChannelSelectorType: - builder->fsCodeAppend("b"); + fsBuilder->codeAppend("b"); break; case SkDisplacementMapEffect::kA_ChannelSelectorType: - builder->fsCodeAppend("a"); + fsBuilder->codeAppend("a"); break; case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: default: SkDEBUGFAIL("Unknown Y channel selector"); } - builder->fsCodeAppend("-vec2(0.5));\t\t"); + fsBuilder->codeAppend("-vec2(0.5));\t\t"); // FIXME : This can be achieved with a "clamp to border" texture repeat mode and // a 0 border color instead of computing if cCoords is out of bounds here. - builder->fsCodeAppendf( + fsBuilder->codeAppendf( "bool %s = (%s.x < 0.0) || (%s.y < 0.0) || (%s.x > 1.0) || (%s.y > 1.0);\t\t", outOfBounds, cCoords, cCoords, cCoords, cCoords); - builder->fsCodeAppendf("%s = %s ? vec4(0.0) : ", outputColor, outOfBounds); - builder->fsAppendTextureLookup(samplers[1], cCoords, coords[1].type()); - builder->fsCodeAppend(";\n"); + fsBuilder->codeAppendf("%s = %s ? vec4(0.0) : ", outputColor, outOfBounds); + fsBuilder->appendTextureLookup(samplers[1], cCoords, coords[1].getType()); + fsBuilder->codeAppend(";\n"); } void GrGLDisplacementMapEffect::setData(const GrGLProgramDataManager& pdman, - const GrDrawEffect& drawEffect) { - const GrDisplacementMapEffect& displacementMap = - drawEffect.castEffect(); + const GrProcessor& proc) { + const GrDisplacementMapEffect& displacementMap = proc.cast(); GrTexture* colorTex = displacementMap.texture(1); SkScalar scaleX = SkScalarDiv(displacementMap.scale().fX, SkIntToScalar(colorTex->width())); SkScalar scaleY = SkScalarDiv(displacementMap.scale().fY, SkIntToScalar(colorTex->height())); @@ -603,10 +629,9 @@ void GrGLDisplacementMapEffect::setData(const GrGLProgramDataManager& pdman, SkScalarToFloat(scaleY) : SkScalarToFloat(-scaleY)); } -void GrGLDisplacementMapEffect::GenKey(const GrDrawEffect& drawEffect, - const GrGLCaps&, GrEffectKeyBuilder* b) { - const GrDisplacementMapEffect& displacementMap = - drawEffect.castEffect(); +void GrGLDisplacementMapEffect::GenKey(const GrProcessor& proc, + const GrGLCaps&, GrProcessorKeyBuilder* b) { + const GrDisplacementMapEffect& displacementMap = proc.cast(); uint32_t xKey = displacementMap.xChannelSelector(); uint32_t yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBits;