| Index: src/core/SkLightingShader_NormalSource.cpp
 | 
| diff --git a/src/core/SkLightingShader_NormalSource.cpp b/src/core/SkLightingShader_NormalSource.cpp
 | 
| deleted file mode 100644
 | 
| index b96b1bf083c314b4f6e33f94bb21b5c0c5c0fb59..0000000000000000000000000000000000000000
 | 
| --- a/src/core/SkLightingShader_NormalSource.cpp
 | 
| +++ /dev/null
 | 
| @@ -1,290 +0,0 @@
 | 
| -/*
 | 
| - * Copyright 2016 Google Inc.
 | 
| - *
 | 
| - * Use of this source code is governed by a BSD-style license that can be
 | 
| - * found in the LICENSE file.
 | 
| - */
 | 
| -
 | 
| -#include "SkBitmapProcShader.h"
 | 
| -#include "SkError.h"
 | 
| -#include "SkErrorInternals.h"
 | 
| -#include "SkLightingShader.h"
 | 
| -#include "SkReadBuffer.h"
 | 
| -#include "SkWriteBuffer.h"
 | 
| -
 | 
| -// Genretating vtable
 | 
| -SkLightingShader::NormalSource::~NormalSource() {}
 | 
| -
 | 
| -///////////////////////////////////////////////////////////////////////////////
 | 
| -
 | 
| -class NormalMapSourceImpl : public SkLightingShader::NormalSource {
 | 
| -public:
 | 
| -    NormalMapSourceImpl(const SkBitmap &normal, const SkVector &invNormRotation,
 | 
| -                        const SkMatrix *normLocalM)
 | 
| -        : fNormalMap(normal)
 | 
| -        , fInvNormRotation(invNormRotation) {
 | 
| -
 | 
| -        if (normLocalM) {
 | 
| -            fNormLocalMatrix = *normLocalM;
 | 
| -        } else {
 | 
| -            fNormLocalMatrix.reset();
 | 
| -        }
 | 
| -        // Pre-cache so future calls to fNormLocalMatrix.getType() are threadsafe.
 | 
| -        (void)fNormLocalMatrix.getType();
 | 
| -    }
 | 
| -
 | 
| -#if SK_SUPPORT_GPU
 | 
| -    sk_sp<GrFragmentProcessor> asFragmentProcessor(GrContext*,
 | 
| -                                                   const SkMatrix& viewM,
 | 
| -                                                   const SkMatrix* localMatrix,
 | 
| -                                                   SkFilterQuality,
 | 
| -                                                   SkSourceGammaTreatment) const override;
 | 
| -#endif
 | 
| -
 | 
| -    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(NormalMapSourceImpl)
 | 
| -
 | 
| -protected:
 | 
| -    void flatten(SkWriteBuffer& buf) const override;
 | 
| -
 | 
| -private:
 | 
| -    SkBitmap        fNormalMap;
 | 
| -    SkMatrix        fNormLocalMatrix;
 | 
| -    SkVector        fInvNormRotation;
 | 
| -
 | 
| -    friend class SkLightingShader::NormalSource;
 | 
| -
 | 
| -    typedef SkLightingShader::NormalSource INHERITED;
 | 
| -};
 | 
| -
 | 
| -////////////////////////////////////////////////////////////////////////////
 | 
| -
 | 
| -#if SK_SUPPORT_GPU
 | 
| -
 | 
| -#include "GrCoordTransform.h"
 | 
| -#include "GrInvariantOutput.h"
 | 
| -#include "GrTextureParams.h"
 | 
| -#include "glsl/GrGLSLFragmentProcessor.h"
 | 
| -#include "glsl/GrGLSLFragmentShaderBuilder.h"
 | 
| -#include "SkGr.h"
 | 
| -
 | 
| -class NormalMapFP : public GrFragmentProcessor {
 | 
| -public:
 | 
| -    NormalMapFP(GrTexture* normal, const SkMatrix& normMatrix, const GrTextureParams& normParams,
 | 
| -                const SkVector& invNormRotation)
 | 
| -        : fNormDeviceTransform(kLocal_GrCoordSet, normMatrix, normal, normParams.filterMode())
 | 
| -        , fNormalTextureAccess(normal, normParams)
 | 
| -        , fInvNormRotation(invNormRotation) {
 | 
| -        this->addCoordTransform(&fNormDeviceTransform);
 | 
| -        this->addTextureAccess(&fNormalTextureAccess);
 | 
| -
 | 
| -        this->initClassID<NormalMapFP>();
 | 
| -    }
 | 
| -
 | 
| -    class GLSLNormalMapFP : public GrGLSLFragmentProcessor {
 | 
| -    public:
 | 
| -        GLSLNormalMapFP() {
 | 
| -            fInvNormRotation.set(0.0f, 0.0f);
 | 
| -        }
 | 
| -
 | 
| -        void emitCode(EmitArgs& args) override {
 | 
| -
 | 
| -            GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
 | 
| -            GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
 | 
| -
 | 
| -            // add uniform
 | 
| -            const char* xformUniName = nullptr;
 | 
| -            fXformUni = uniformHandler->addUniform(kFragment_GrShaderFlag,
 | 
| -                                                   kVec2f_GrSLType, kDefault_GrSLPrecision,
 | 
| -                                                   "Xform", &xformUniName);
 | 
| -
 | 
| -            fragBuilder->codeAppend("vec4 normalColor = ");
 | 
| -            fragBuilder->appendTextureLookup(args.fTexSamplers[0],
 | 
| -                                             args.fCoords[0].c_str(),
 | 
| -                                             args.fCoords[0].getType());
 | 
| -            fragBuilder->codeAppend(";");
 | 
| -
 | 
| -            fragBuilder->codeAppend("vec3 normal = normalColor.rgb - vec3(0.5);");
 | 
| -
 | 
| -            // TODO: inverse map the light direction vectors in the vertex shader rather than
 | 
| -            // transforming all the normals here!
 | 
| -            fragBuilder->codeAppendf(
 | 
| -                    "mat3 m = mat3(%s.x, -%s.y, 0.0, %s.y, %s.x, 0.0, 0.0, 0.0, 1.0);",
 | 
| -                    xformUniName, xformUniName, xformUniName, xformUniName);
 | 
| -
 | 
| -            fragBuilder->codeAppend("normal = normalize(m*normal);");
 | 
| -            fragBuilder->codeAppendf("%s = vec4(normal, 0);", args.fOutputColor);
 | 
| -        }
 | 
| -
 | 
| -        static void GenKey(const GrProcessor& proc, const GrGLSLCaps&,
 | 
| -                           GrProcessorKeyBuilder* b) {
 | 
| -            b->add32(0x0);
 | 
| -        }
 | 
| -
 | 
| -    protected:
 | 
| -        void onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& proc) override {
 | 
| -            const NormalMapFP& normalMapFP = proc.cast<NormalMapFP>();
 | 
| -
 | 
| -            const SkVector& invNormRotation = normalMapFP.invNormRotation();
 | 
| -            if (invNormRotation != fInvNormRotation) {
 | 
| -                pdman.set2fv(fXformUni, 1, &invNormRotation.fX);
 | 
| -                fInvNormRotation = invNormRotation;
 | 
| -            }
 | 
| -        }
 | 
| -
 | 
| -    private:
 | 
| -        SkVector fInvNormRotation;
 | 
| -        GrGLSLProgramDataManager::UniformHandle fXformUni;
 | 
| -    };
 | 
| -
 | 
| -    void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override {
 | 
| -        GLSLNormalMapFP::GenKey(*this, caps, b);
 | 
| -    }
 | 
| -
 | 
| -    const char* name() const override { return "NormalMapFP"; }
 | 
| -
 | 
| -    void onComputeInvariantOutput(GrInvariantOutput* inout) const override {
 | 
| -        inout->setToUnknown(GrInvariantOutput::ReadInput::kWillNot_ReadInput);
 | 
| -    }
 | 
| -
 | 
| -    const SkVector& invNormRotation() const { return fInvNormRotation; }
 | 
| -
 | 
| -private:
 | 
| -    GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { return new GLSLNormalMapFP; }
 | 
| -
 | 
| -    bool onIsEqual(const GrFragmentProcessor& proc) const override {
 | 
| -        const NormalMapFP& normalMapFP = proc.cast<NormalMapFP>();
 | 
| -        return fNormDeviceTransform == normalMapFP.fNormDeviceTransform &&
 | 
| -               fNormalTextureAccess == normalMapFP.fNormalTextureAccess &&
 | 
| -               fInvNormRotation     == normalMapFP.fInvNormRotation;
 | 
| -    }
 | 
| -
 | 
| -    GrCoordTransform fNormDeviceTransform;
 | 
| -    GrTextureAccess  fNormalTextureAccess;
 | 
| -    SkVector         fInvNormRotation;
 | 
| -};
 | 
| -
 | 
| -// TODO same code at SkLightingShader.cpp. Refactor to common source!
 | 
| -static bool make_mat(const SkBitmap& bm,
 | 
| -                     const SkMatrix& localMatrix1,
 | 
| -                     const SkMatrix* localMatrix2,
 | 
| -                     SkMatrix* result) {
 | 
| -
 | 
| -    result->setIDiv(bm.width(), bm.height());
 | 
| -
 | 
| -    SkMatrix lmInverse;
 | 
| -    if (!localMatrix1.invert(&lmInverse)) {
 | 
| -        return false;
 | 
| -    }
 | 
| -    if (localMatrix2) {
 | 
| -        SkMatrix inv;
 | 
| -        if (!localMatrix2->invert(&inv)) {
 | 
| -            return false;
 | 
| -        }
 | 
| -        lmInverse.postConcat(inv);
 | 
| -    }
 | 
| -    result->preConcat(lmInverse);
 | 
| -
 | 
| -    return true;
 | 
| -}
 | 
| -
 | 
| -sk_sp<GrFragmentProcessor> NormalMapSourceImpl::asFragmentProcessor(
 | 
| -                                                     GrContext *context,
 | 
| -                                                     const SkMatrix &viewM,
 | 
| -                                                     const SkMatrix *localMatrix,
 | 
| -                                                     SkFilterQuality filterQuality,
 | 
| -                                                     SkSourceGammaTreatment gammaTreatment) const {
 | 
| -
 | 
| -    // TODO Here, the old code was checking that diffuse map and normal map are same size, that
 | 
| -    //      will be addressed when diffuse maps are factored out of SkLightingShader in a future CL
 | 
| -
 | 
| -    SkMatrix normM;
 | 
| -    if (!make_mat(fNormalMap, fNormLocalMatrix, localMatrix, &normM)) {
 | 
| -        return nullptr;
 | 
| -    }
 | 
| -
 | 
| -    bool doBicubic;
 | 
| -    GrTextureParams::FilterMode normFilterMode = GrSkFilterQualityToGrFilterMode(
 | 
| -            SkTMin(filterQuality, kMedium_SkFilterQuality),
 | 
| -            viewM,
 | 
| -            fNormLocalMatrix,
 | 
| -            &doBicubic);
 | 
| -    SkASSERT(!doBicubic);
 | 
| -
 | 
| -    // TODO: support other tile modes
 | 
| -    GrTextureParams normParams(SkShader::kClamp_TileMode, normFilterMode);
 | 
| -    SkAutoTUnref<GrTexture> normalTexture(GrRefCachedBitmapTexture(context,
 | 
| -                                                                   fNormalMap,
 | 
| -                                                                   normParams,
 | 
| -                                                                   gammaTreatment));
 | 
| -    if (!normalTexture) {
 | 
| -        SkErrorInternals::SetError(kInternalError_SkError, "Couldn't convert bitmap to texture.");
 | 
| -        return nullptr;
 | 
| -    }
 | 
| -
 | 
| -    return sk_make_sp<NormalMapFP>(normalTexture, normM, normParams, fInvNormRotation);
 | 
| -}
 | 
| -
 | 
| -#endif // SK_SUPPORT_GPU
 | 
| -
 | 
| -////////////////////////////////////////////////////////////////////////////
 | 
| -
 | 
| -sk_sp<SkFlattenable> NormalMapSourceImpl::CreateProc(SkReadBuffer& buf) {
 | 
| -
 | 
| -    SkMatrix normLocalM;
 | 
| -    bool hasNormLocalM = buf.readBool();
 | 
| -    if (hasNormLocalM) {
 | 
| -        buf.readMatrix(&normLocalM);
 | 
| -    } else {
 | 
| -        normLocalM.reset();
 | 
| -    }
 | 
| -
 | 
| -    SkBitmap normal;
 | 
| -    if (!buf.readBitmap(&normal)) {
 | 
| -        return nullptr;
 | 
| -    }
 | 
| -    normal.setImmutable();
 | 
| -
 | 
| -    SkVector invNormRotation = {1,0};
 | 
| -    if (!buf.isVersionLT(SkReadBuffer::kLightingShaderWritesInvNormRotation)) {
 | 
| -        invNormRotation = buf.readPoint();
 | 
| -    }
 | 
| -
 | 
| -    return sk_make_sp<NormalMapSourceImpl>(normal, invNormRotation, &normLocalM);
 | 
| -}
 | 
| -
 | 
| -void NormalMapSourceImpl::flatten(SkWriteBuffer& buf) const {
 | 
| -    this->INHERITED::flatten(buf);
 | 
| -
 | 
| -    bool hasNormLocalM = !fNormLocalMatrix.isIdentity();
 | 
| -    buf.writeBool(hasNormLocalM);
 | 
| -    if (hasNormLocalM) {
 | 
| -        buf.writeMatrix(fNormLocalMatrix);
 | 
| -    }
 | 
| -
 | 
| -    buf.writeBitmap(fNormalMap);
 | 
| -    buf.writePoint(fInvNormRotation);
 | 
| -}
 | 
| -
 | 
| -////////////////////////////////////////////////////////////////////////////
 | 
| -
 | 
| -sk_sp<SkLightingShader::NormalSource> SkLightingShader::NormalSource::MakeMap(
 | 
| -        const SkBitmap &normal, const SkVector &invNormRotation, const SkMatrix *normLocalM) {
 | 
| -
 | 
| -    // TODO not checking normal and diffuse maps to be same size, will be addressed when diffuse
 | 
| -    //      maps are factored out of SkLightingShader in a future CL
 | 
| -    if (normal.isNull() || SkBitmapProcShader::BitmapIsTooBig(normal)) {
 | 
| -        return nullptr;
 | 
| -    }
 | 
| -
 | 
| -    SkASSERT(SkScalarNearlyEqual(invNormRotation.lengthSqd(), SK_Scalar1));
 | 
| -
 | 
| -    return sk_make_sp<NormalMapSourceImpl>(normal, invNormRotation, normLocalM);
 | 
| -}
 | 
| -
 | 
| -////////////////////////////////////////////////////////////////////////////
 | 
| -
 | 
| -SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingShader::NormalSource)
 | 
| -    SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(NormalMapSourceImpl)
 | 
| -SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
 | 
| -
 | 
| -////////////////////////////////////////////////////////////////////////////
 | 
| 
 |