blob: 6da90909149daac0b8f0ad8f3ff85da42c4f287e [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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
reed@android.com8a1c16f2008-12-17 15:59:43 +00009
10#ifndef SkCoreBlitters_DEFINED
11#define SkCoreBlitters_DEFINED
12
13#include "SkBlitter.h"
14#include "SkBlitRow.h"
15
16class SkRasterBlitter : public SkBlitter {
17public:
18 SkRasterBlitter(const SkBitmap& device) : fDevice(device) {}
19
20protected:
21 const SkBitmap& fDevice;
22
23private:
24 typedef SkBlitter INHERITED;
25};
26
27class SkShaderBlitter : public SkRasterBlitter {
28public:
29 SkShaderBlitter(const SkBitmap& device, const SkPaint& paint);
30 virtual ~SkShaderBlitter();
31
32protected:
reed@android.com5119bdb2009-06-12 21:27:03 +000033 uint32_t fShaderFlags;
34 SkShader* fShader;
reed@android.com8a1c16f2008-12-17 15:59:43 +000035
36private:
37 // illegal
38 SkShaderBlitter& operator=(const SkShaderBlitter&);
39
40 typedef SkRasterBlitter INHERITED;
41};
42
43///////////////////////////////////////////////////////////////////////////////
44
45class SkA8_Blitter : public SkRasterBlitter {
46public:
47 SkA8_Blitter(const SkBitmap& device, const SkPaint& paint);
48 virtual void blitH(int x, int y, int width);
49 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
50 virtual void blitV(int x, int y, int height, SkAlpha alpha);
51 virtual void blitRect(int x, int y, int width, int height);
52 virtual void blitMask(const SkMask&, const SkIRect&);
53 virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
54
55private:
56 unsigned fSrcA;
57
58 // illegal
59 SkA8_Blitter& operator=(const SkA8_Blitter&);
60
61 typedef SkRasterBlitter INHERITED;
62};
63
64class SkA8_Shader_Blitter : public SkShaderBlitter {
65public:
66 SkA8_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
67 virtual ~SkA8_Shader_Blitter();
68 virtual void blitH(int x, int y, int width);
69 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
70 virtual void blitMask(const SkMask&, const SkIRect&);
71
72private:
73 SkXfermode* fXfermode;
74 SkPMColor* fBuffer;
75 uint8_t* fAAExpand;
76
77 // illegal
78 SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&);
79
80 typedef SkShaderBlitter INHERITED;
81};
82
83////////////////////////////////////////////////////////////////
84
85class SkARGB32_Blitter : public SkRasterBlitter {
86public:
87 SkARGB32_Blitter(const SkBitmap& device, const SkPaint& paint);
88 virtual void blitH(int x, int y, int width);
89 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
90 virtual void blitV(int x, int y, int height, SkAlpha alpha);
91 virtual void blitRect(int x, int y, int width, int height);
92 virtual void blitMask(const SkMask&, const SkIRect&);
93 virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
94
95protected:
reed@google.comee467ee2011-03-09 13:23:57 +000096 SkColor fColor;
97 SkPMColor fPMColor;
senorblanco@chromium.org29e50542010-12-16 19:07:45 +000098 SkBlitRow::ColorProc fColor32Proc;
reed@google.com981d4792011-03-09 12:55:47 +000099 SkBlitMask::Proc fBlitMaskProc;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000100
101private:
102 unsigned fSrcA, fSrcR, fSrcG, fSrcB;
103
104 // illegal
105 SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
106
107 typedef SkRasterBlitter INHERITED;
108};
109
reed@android.comdafaf7a2009-07-10 03:05:59 +0000110class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000111public:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000112 SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint)
113 : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000114 virtual void blitMask(const SkMask&, const SkIRect&);
reed@android.comdafaf7a2009-07-10 03:05:59 +0000115
reed@android.com8a1c16f2008-12-17 15:59:43 +0000116private:
117 typedef SkARGB32_Blitter INHERITED;
118};
119
reed@android.comdafaf7a2009-07-10 03:05:59 +0000120class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000121public:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000122 SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint)
123 : INHERITED(device, paint) {}
reed@android.com8a1c16f2008-12-17 15:59:43 +0000124 virtual void blitMask(const SkMask&, const SkIRect&);
reed@android.comdafaf7a2009-07-10 03:05:59 +0000125 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
reed@android.comb602b8e2009-07-10 15:58:53 +0000126
reed@android.com8a1c16f2008-12-17 15:59:43 +0000127private:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000128 typedef SkARGB32_Opaque_Blitter INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000129};
130
131class SkARGB32_Shader_Blitter : public SkShaderBlitter {
132public:
133 SkARGB32_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
134 virtual ~SkARGB32_Shader_Blitter();
135 virtual void blitH(int x, int y, int width);
136 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
137
138private:
reed@android.comc4cae852009-09-23 15:06:10 +0000139 SkXfermode* fXfermode;
140 SkPMColor* fBuffer;
141 SkBlitRow::Proc32 fProc32;
142 SkBlitRow::Proc32 fProc32Blend;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000143
144 // illegal
145 SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
146
147 typedef SkShaderBlitter INHERITED;
148};
149
reed@android.com1fc4c602009-10-02 16:34:57 +0000150///////////////////////////////////////////////////////////////////////////////
reed@android.com8a1c16f2008-12-17 15:59:43 +0000151
152class SkA1_Blitter : public SkRasterBlitter {
153public:
154 SkA1_Blitter(const SkBitmap& device, const SkPaint& paint);
155 virtual void blitH(int x, int y, int width);
156
157private:
158 uint8_t fSrcA;
159
160 // illegal
161 SkA1_Blitter& operator=(const SkA1_Blitter&);
reed@google.com981d4792011-03-09 12:55:47 +0000162
reed@android.com8a1c16f2008-12-17 15:59:43 +0000163 typedef SkRasterBlitter INHERITED;
164};
165
reed@android.com1fc4c602009-10-02 16:34:57 +0000166///////////////////////////////////////////////////////////////////////////////
167
168/* These return the correct subclass of blitter for their device config.
169
170 Currently, they make the following assumptions about the state of the
171 paint:
reed@google.com981d4792011-03-09 12:55:47 +0000172
reed@android.com1fc4c602009-10-02 16:34:57 +0000173 1. If there is an xfermode, there will also be a shader
174 2. If there is a colorfilter, there will be a shader that itself handles
175 calling the filter, so the blitter can always ignore the colorfilter obj
176
177 These pre-conditions must be handled by the caller, in our case
178 SkBlitter::Choose(...)
179 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000180
181extern SkBlitter* SkBlitter_ChooseD4444(const SkBitmap& device,
182 const SkPaint& paint,
183 void* storage, size_t storageSize);
184
reed@android.com1fc4c602009-10-02 16:34:57 +0000185extern SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device,
186 const SkPaint& paint,
187 void* storage, size_t storageSize);
188
reed@android.com8a1c16f2008-12-17 15:59:43 +0000189#endif
190