1
2/*
3 * Copyright 2006 The Android Open Source Project
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10#ifndef SkBitmapProcShader_DEFINED
11#define SkBitmapProcShader_DEFINED
12
13#include "SkShader.h"
14#include "SkBitmapProcState.h"
15#include "SkSmallAllocator.h"
16
17class SkBitmapProcShader : public SkShader {
18public:
19    SkBitmapProcShader(const SkBitmap& src, TileMode tx, TileMode ty,
20                       const SkMatrix* localMatrix = NULL);
21
22    // overrides from SkShader
23    virtual bool isOpaque() const SK_OVERRIDE;
24    virtual BitmapType asABitmap(SkBitmap*, SkMatrix*, TileMode*) const SK_OVERRIDE;
25
26    virtual size_t contextSize() const SK_OVERRIDE;
27
28    static bool CanDo(const SkBitmap&, TileMode tx, TileMode ty);
29
30    SK_TO_STRING_OVERRIDE()
31    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBitmapProcShader)
32
33
34    bool asFragmentProcessor(GrContext*, const SkPaint&, const SkMatrix*, GrColor*,
35                             GrFragmentProcessor**)
36            const SK_OVERRIDE;
37
38    class BitmapProcShaderContext : public SkShader::Context {
39    public:
40        // The context takes ownership of the state. It will call its destructor
41        // but will NOT free the memory.
42        BitmapProcShaderContext(const SkBitmapProcShader&, const ContextRec&, SkBitmapProcState*);
43        virtual ~BitmapProcShaderContext();
44
45        virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) SK_OVERRIDE;
46        virtual ShadeProc asAShadeProc(void** ctx) SK_OVERRIDE;
47        virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count) SK_OVERRIDE;
48
49        virtual uint32_t getFlags() const SK_OVERRIDE { return fFlags; }
50
51    private:
52        SkBitmapProcState*  fState;
53        uint32_t            fFlags;
54
55        typedef SkShader::Context INHERITED;
56    };
57
58protected:
59#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
60    SkBitmapProcShader(SkReadBuffer& );
61#endif
62    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
63    virtual Context* onCreateContext(const ContextRec&, void* storage) const SK_OVERRIDE;
64
65    SkBitmap    fRawBitmap;   // experimental for RLE encoding
66    uint8_t     fTileModeX, fTileModeY;
67
68private:
69    typedef SkShader INHERITED;
70};
71
72// Commonly used allocator. It currently is only used to allocate up to 3 objects. The total
73// bytes requested is calculated using one of our large shaders, its context size plus the size of
74// an Sk3DBlitter in SkDraw.cpp
75// Note that some contexts may contain other contexts (e.g. for compose shaders), but we've not
76// yet found a situation where the size below isn't big enough.
77typedef SkSmallAllocator<3, 1024> SkTBlitterAllocator;
78
79// If alloc is non-NULL, it will be used to allocate the returned SkShader, and MUST outlive
80// the SkShader.
81SkShader* CreateBitmapShader(const SkBitmap& src, SkShader::TileMode, SkShader::TileMode,
82                             const SkMatrix* localMatrix, SkTBlitterAllocator* alloc);
83
84#endif
85