15970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org/*
25970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org * Copyright 2014 Google Inc.
35970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org *
45970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
55970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org * found in the LICENSE file.
65970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org */
75970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org
85970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#ifndef SkLocalMatrixShader_DEFINED
95970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#define SkLocalMatrixShader_DEFINED
105970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org
115970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#include "SkShader.h"
125970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#include "SkReadBuffer.h"
135970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#include "SkWriteBuffer.h"
145970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org
155970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.orgclass SkLocalMatrixShader : public SkShader {
165970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.orgpublic:
175970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    SkLocalMatrixShader(SkShader* proxy, const SkMatrix& localMatrix)
18c870d494dd0dc88f3f4155a0d6257a1be8280880scroggo    : INHERITED(&localMatrix)
19c870d494dd0dc88f3f4155a0d6257a1be8280880scroggo    , fProxyShader(SkRef(proxy))
205970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    {}
21e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.com
225970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    virtual size_t contextSize() const SK_OVERRIDE {
235970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org        return fProxyShader->contextSize();
245970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    }
25e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.com
265970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    virtual BitmapType asABitmap(SkBitmap* bitmap, SkMatrix* matrix,
275970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org                                 TileMode* mode) const SK_OVERRIDE {
285970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org        return fProxyShader->asABitmap(bitmap, matrix, mode);
295970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    }
30e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.com
315970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    virtual GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE {
325970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org        return fProxyShader->asAGradient(info);
335970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    }
34e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.com
359de5b514d38c5b36066bcdc14fba2f7e5196d372dandov#if SK_SUPPORT_GPU
369de5b514d38c5b36066bcdc14fba2f7e5196d372dandov
37b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual bool asFragmentProcessor(GrContext* context, const SkPaint& paint,
38b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                     const SkMatrix* localMatrix, GrColor* grColor,
39b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                     GrFragmentProcessor** fp) const SK_OVERRIDE {
40c870d494dd0dc88f3f4155a0d6257a1be8280880scroggo        SkMatrix tmp = this->getLocalMatrix();
415970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org        if (localMatrix) {
425970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org            tmp.preConcat(*localMatrix);
435970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org        }
44b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        return fProxyShader->asFragmentProcessor(context, paint, &tmp, grColor, fp);
455970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    }
469de5b514d38c5b36066bcdc14fba2f7e5196d372dandov
479de5b514d38c5b36066bcdc14fba2f7e5196d372dandov#else
489de5b514d38c5b36066bcdc14fba2f7e5196d372dandov
49b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    virtual bool asFragmentProcessor(GrContext*, const SkPaint&, const SkMatrix*, GrColor*,
50b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                     GrFragmentProcessor**) const SK_OVERRIDE {
519de5b514d38c5b36066bcdc14fba2f7e5196d372dandov        SkDEBUGFAIL("Should not call in GPU-less build");
529de5b514d38c5b36066bcdc14fba2f7e5196d372dandov        return false;
539de5b514d38c5b36066bcdc14fba2f7e5196d372dandov    }
549de5b514d38c5b36066bcdc14fba2f7e5196d372dandov
559de5b514d38c5b36066bcdc14fba2f7e5196d372dandov#endif
569de5b514d38c5b36066bcdc14fba2f7e5196d372dandov
575970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    virtual SkShader* refAsALocalMatrixShader(SkMatrix* localMatrix) const SK_OVERRIDE {
585970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org        if (localMatrix) {
59c870d494dd0dc88f3f4155a0d6257a1be8280880scroggo            *localMatrix = this->getLocalMatrix();
605970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org        }
615970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org        return SkRef(fProxyShader.get());
625970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    }
63e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.com
645970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    SK_TO_STRING_OVERRIDE()
655970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLocalMatrixShader)
66e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.com
675970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.orgprotected:
689fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
695970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    SkLocalMatrixShader(SkReadBuffer&);
709fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif
715970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
725970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    virtual Context* onCreateContext(const ContextRec&, void*) const SK_OVERRIDE;
73e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.com
745970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.orgprivate:
755970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    SkAutoTUnref<SkShader> fProxyShader;
76e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.com
775970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    typedef SkShader INHERITED;
785970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org};
795970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org
805970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#endif
81