1/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkLocalMatrixShader_DEFINED
9#define SkLocalMatrixShader_DEFINED
10
11#include "SkShaderBase.h"
12#include "SkReadBuffer.h"
13#include "SkWriteBuffer.h"
14
15class GrFragmentProcessor;
16class SkArenaAlloc;
17class SkColorSpaceXformer;
18
19class SkLocalMatrixShader final : public SkShaderBase {
20public:
21    SkLocalMatrixShader(sk_sp<SkShader> proxy, const SkMatrix& localMatrix)
22    : INHERITED(&localMatrix)
23    , fProxyShader(std::move(proxy))
24    {}
25
26    GradientType asAGradient(GradientInfo* info) const override {
27        return fProxyShader->asAGradient(info);
28    }
29
30#if SK_SUPPORT_GPU
31    std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
32#endif
33
34    sk_sp<SkShader> makeAsALocalMatrixShader(SkMatrix* localMatrix) const override {
35        if (localMatrix) {
36            *localMatrix = this->getLocalMatrix();
37        }
38        return fProxyShader;
39    }
40
41    SK_TO_STRING_OVERRIDE()
42    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLocalMatrixShader)
43
44protected:
45    void flatten(SkWriteBuffer&) const override;
46
47    Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
48
49    SkImage* onIsAImage(SkMatrix* matrix, TileMode* mode) const override;
50
51    bool onAppendStages(const StageRec&) const override;
52
53    sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override {
54        return as_SB(fProxyShader)->makeColorSpace(xformer)->makeWithLocalMatrix(
55            this->getLocalMatrix());
56    }
57
58#ifdef SK_SUPPORT_LEGACY_SHADER_ISABITMAP
59    bool onIsABitmap(SkBitmap* bitmap, SkMatrix* matrix, TileMode* mode) const override {
60        return fProxyShader->isABitmap(bitmap, matrix, mode);
61    }
62#endif
63
64    bool onIsRasterPipelineOnly(const SkMatrix& ctm) const override {
65        return as_SB(fProxyShader)->isRasterPipelineOnly(SkMatrix::Concat(ctm,
66                                                                          this->getLocalMatrix()));
67    }
68
69private:
70    sk_sp<SkShader> fProxyShader;
71
72    typedef SkShaderBase INHERITED;
73};
74
75#endif
76