1/*
2 * Copyright 2006 The Android Open Source Project
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 SkCoreBlitters_DEFINED
9#define SkCoreBlitters_DEFINED
10
11#include "SkBitmapProcShader.h"
12#include "SkBlitter.h"
13#include "SkBlitRow.h"
14#include "SkShader.h"
15#include "SkSmallAllocator.h"
16
17class SkRasterBlitter : public SkBlitter {
18public:
19    SkRasterBlitter(const SkBitmap& device) : fDevice(device) {}
20
21protected:
22    const SkBitmap& fDevice;
23
24private:
25    typedef SkBlitter INHERITED;
26};
27
28class SkShaderBlitter : public SkRasterBlitter {
29public:
30    /**
31      *  The storage for shaderContext is owned by the caller, but the object itself is not.
32      *  The blitter only ensures that the storage always holds a live object, but it may
33      *  exchange that object.
34      */
35    SkShaderBlitter(const SkBitmap& device, const SkPaint& paint,
36                    SkShader::Context* shaderContext);
37    virtual ~SkShaderBlitter();
38
39    /**
40      *  Create a new shader context and uses it instead of the old one if successful.
41      *  Will create the context at the same location as the old one (this is safe
42      *  because the shader itself is unchanged).
43      */
44    virtual bool resetShaderContext(const SkShader::ContextRec&) SK_OVERRIDE;
45
46    virtual SkShader::Context* getShaderContext() const SK_OVERRIDE { return fShaderContext; }
47
48protected:
49    uint32_t            fShaderFlags;
50    const SkShader*     fShader;
51    SkShader::Context*  fShaderContext;
52
53private:
54    // illegal
55    SkShaderBlitter& operator=(const SkShaderBlitter&);
56
57    typedef SkRasterBlitter INHERITED;
58};
59
60///////////////////////////////////////////////////////////////////////////////
61
62class SkA8_Coverage_Blitter : public SkRasterBlitter {
63public:
64    SkA8_Coverage_Blitter(const SkBitmap& device, const SkPaint& paint);
65    virtual void blitH(int x, int y, int width) SK_OVERRIDE;
66    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) SK_OVERRIDE;
67    virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE;
68    virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE;
69    virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE;
70    virtual const SkBitmap* justAnOpaqueColor(uint32_t*) SK_OVERRIDE;
71};
72
73class SkA8_Blitter : public SkRasterBlitter {
74public:
75    SkA8_Blitter(const SkBitmap& device, const SkPaint& paint);
76    virtual void blitH(int x, int y, int width);
77    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
78    virtual void blitV(int x, int y, int height, SkAlpha alpha);
79    virtual void blitRect(int x, int y, int width, int height);
80    virtual void blitMask(const SkMask&, const SkIRect&);
81    virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
82
83private:
84    unsigned fSrcA;
85
86    // illegal
87    SkA8_Blitter& operator=(const SkA8_Blitter&);
88
89    typedef SkRasterBlitter INHERITED;
90};
91
92class SkA8_Shader_Blitter : public SkShaderBlitter {
93public:
94    SkA8_Shader_Blitter(const SkBitmap& device, const SkPaint& paint,
95                        SkShader::Context* shaderContext);
96    virtual ~SkA8_Shader_Blitter();
97    virtual void blitH(int x, int y, int width);
98    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
99    virtual void blitMask(const SkMask&, const SkIRect&);
100
101private:
102    SkXfermode* fXfermode;
103    SkPMColor*  fBuffer;
104    uint8_t*    fAAExpand;
105
106    // illegal
107    SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&);
108
109    typedef SkShaderBlitter INHERITED;
110};
111
112////////////////////////////////////////////////////////////////
113
114class SkARGB32_Blitter : public SkRasterBlitter {
115public:
116    SkARGB32_Blitter(const SkBitmap& device, const SkPaint& paint);
117    virtual void blitH(int x, int y, int width);
118    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
119    virtual void blitV(int x, int y, int height, SkAlpha alpha);
120    virtual void blitRect(int x, int y, int width, int height);
121    virtual void blitMask(const SkMask&, const SkIRect&);
122    virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
123
124protected:
125    SkColor                fColor;
126    SkPMColor              fPMColor;
127    SkBlitRow::ColorProc   fColor32Proc;
128    SkBlitRow::ColorRectProc fColorRect32Proc;
129
130private:
131    unsigned fSrcA, fSrcR, fSrcG, fSrcB;
132
133    // illegal
134    SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
135
136    typedef SkRasterBlitter INHERITED;
137};
138
139class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
140public:
141    SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint)
142        : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
143    virtual void blitMask(const SkMask&, const SkIRect&);
144
145private:
146    typedef SkARGB32_Blitter INHERITED;
147};
148
149class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
150public:
151    SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint)
152        : INHERITED(device, paint) {}
153    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
154
155private:
156    typedef SkARGB32_Opaque_Blitter INHERITED;
157};
158
159class SkARGB32_Shader_Blitter : public SkShaderBlitter {
160public:
161    SkARGB32_Shader_Blitter(const SkBitmap& device, const SkPaint& paint,
162                            SkShader::Context* shaderContext);
163    virtual ~SkARGB32_Shader_Blitter();
164    virtual void blitH(int x, int y, int width) SK_OVERRIDE;
165    virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE;
166    virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE;
167    virtual void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) SK_OVERRIDE;
168    virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE;
169
170private:
171    SkXfermode*         fXfermode;
172    SkPMColor*          fBuffer;
173    SkBlitRow::Proc32   fProc32;
174    SkBlitRow::Proc32   fProc32Blend;
175    bool                fShadeDirectlyIntoDevice;
176    bool                fConstInY;
177
178    // illegal
179    SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
180
181    typedef SkShaderBlitter INHERITED;
182};
183
184///////////////////////////////////////////////////////////////////////////////
185
186/*  These return the correct subclass of blitter for their device config.
187
188    Currently, they make the following assumptions about the state of the
189    paint:
190
191    1. If there is an xfermode, there will also be a shader
192    2. If there is a colorfilter, there will be a shader that itself handles
193       calling the filter, so the blitter can always ignore the colorfilter obj
194
195    These pre-conditions must be handled by the caller, in our case
196    SkBlitter::Choose(...)
197 */
198
199SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device, const SkPaint& paint,
200                                SkShader::Context* shaderContext,
201                                SkTBlitterAllocator* allocator);
202
203#endif
204