blob: 673b8745456061f85e37dfafcb05b0d4e68c73dc [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
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
reed@android.com8a1c16f2008-12-17 15:59:43 +00008#ifndef SkCoreBlitters_DEFINED
9#define SkCoreBlitters_DEFINED
10
11#include "SkBlitter.h"
12#include "SkBlitRow.h"
13
14class SkRasterBlitter : public SkBlitter {
15public:
16 SkRasterBlitter(const SkBitmap& device) : fDevice(device) {}
17
18protected:
19 const SkBitmap& fDevice;
20
21private:
22 typedef SkBlitter INHERITED;
23};
24
25class SkShaderBlitter : public SkRasterBlitter {
26public:
27 SkShaderBlitter(const SkBitmap& device, const SkPaint& paint);
28 virtual ~SkShaderBlitter();
29
30protected:
reed@android.com5119bdb2009-06-12 21:27:03 +000031 uint32_t fShaderFlags;
32 SkShader* fShader;
reed@android.com8a1c16f2008-12-17 15:59:43 +000033
34private:
35 // illegal
36 SkShaderBlitter& operator=(const SkShaderBlitter&);
37
38 typedef SkRasterBlitter INHERITED;
39};
40
41///////////////////////////////////////////////////////////////////////////////
42
reed@google.com126f7f52013-11-07 16:06:53 +000043class SkA8_Coverage_Blitter : public SkRasterBlitter {
44public:
45 SkA8_Coverage_Blitter(const SkBitmap& device, const SkPaint& paint);
46 virtual void blitH(int x, int y, int width) SK_OVERRIDE;
47 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) SK_OVERRIDE;
48 virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE;
49 virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE;
50 virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE;
51 virtual const SkBitmap* justAnOpaqueColor(uint32_t*) SK_OVERRIDE;
52};
53
reed@android.com8a1c16f2008-12-17 15:59:43 +000054class SkA8_Blitter : public SkRasterBlitter {
55public:
56 SkA8_Blitter(const SkBitmap& device, const SkPaint& paint);
57 virtual void blitH(int x, int y, int width);
58 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
59 virtual void blitV(int x, int y, int height, SkAlpha alpha);
60 virtual void blitRect(int x, int y, int width, int height);
61 virtual void blitMask(const SkMask&, const SkIRect&);
62 virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
63
64private:
65 unsigned fSrcA;
66
67 // illegal
68 SkA8_Blitter& operator=(const SkA8_Blitter&);
69
70 typedef SkRasterBlitter INHERITED;
71};
72
73class SkA8_Shader_Blitter : public SkShaderBlitter {
74public:
75 SkA8_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
76 virtual ~SkA8_Shader_Blitter();
77 virtual void blitH(int x, int y, int width);
78 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
79 virtual void blitMask(const SkMask&, const SkIRect&);
80
81private:
82 SkXfermode* fXfermode;
83 SkPMColor* fBuffer;
84 uint8_t* fAAExpand;
85
86 // illegal
87 SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&);
88
89 typedef SkShaderBlitter INHERITED;
90};
91
92////////////////////////////////////////////////////////////////
93
94class SkARGB32_Blitter : public SkRasterBlitter {
95public:
96 SkARGB32_Blitter(const SkBitmap& device, const SkPaint& paint);
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 blitV(int x, int y, int height, SkAlpha alpha);
100 virtual void blitRect(int x, int y, int width, int height);
101 virtual void blitMask(const SkMask&, const SkIRect&);
102 virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
103
104protected:
reed@google.comee467ee2011-03-09 13:23:57 +0000105 SkColor fColor;
106 SkPMColor fPMColor;
senorblanco@chromium.org29e50542010-12-16 19:07:45 +0000107 SkBlitRow::ColorProc fColor32Proc;
tomhudson@google.com8dd90a92012-03-19 13:49:50 +0000108 SkBlitRow::ColorRectProc fColorRect32Proc;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000109
110private:
111 unsigned fSrcA, fSrcR, fSrcG, fSrcB;
112
113 // illegal
114 SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
115
116 typedef SkRasterBlitter INHERITED;
117};
118
reed@android.comdafaf7a2009-07-10 03:05:59 +0000119class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000120public:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000121 SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint)
122 : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000123 virtual void blitMask(const SkMask&, const SkIRect&);
reed@android.comdafaf7a2009-07-10 03:05:59 +0000124
reed@android.com8a1c16f2008-12-17 15:59:43 +0000125private:
126 typedef SkARGB32_Blitter INHERITED;
127};
128
reed@android.comdafaf7a2009-07-10 03:05:59 +0000129class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000130public:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000131 SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint)
132 : INHERITED(device, paint) {}
reed@android.comdafaf7a2009-07-10 03:05:59 +0000133 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
reed@android.comb602b8e2009-07-10 15:58:53 +0000134
reed@android.com8a1c16f2008-12-17 15:59:43 +0000135private:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000136 typedef SkARGB32_Opaque_Blitter INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000137};
138
139class SkARGB32_Shader_Blitter : public SkShaderBlitter {
140public:
141 SkARGB32_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
142 virtual ~SkARGB32_Shader_Blitter();
reed@google.com13201e72012-11-16 13:20:41 +0000143 virtual void blitH(int x, int y, int width) SK_OVERRIDE;
reed@google.com13201e72012-11-16 13:20:41 +0000144 virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE;
reed@google.com3bafe742012-10-12 18:56:18 +0000145 virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE;
reed@google.com13201e72012-11-16 13:20:41 +0000146 virtual void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) SK_OVERRIDE;
147 virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE;
skia.committer@gmail.comf57c01b2012-10-13 02:01:56 +0000148
reed@android.com8a1c16f2008-12-17 15:59:43 +0000149private:
reed@android.comc4cae852009-09-23 15:06:10 +0000150 SkXfermode* fXfermode;
151 SkPMColor* fBuffer;
152 SkBlitRow::Proc32 fProc32;
153 SkBlitRow::Proc32 fProc32Blend;
reed@google.com13201e72012-11-16 13:20:41 +0000154 bool fShadeDirectlyIntoDevice;
155 bool fConstInY;
skia.committer@gmail.comf57c01b2012-10-13 02:01:56 +0000156
reed@android.com8a1c16f2008-12-17 15:59:43 +0000157 // illegal
158 SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
skia.committer@gmail.comf57c01b2012-10-13 02:01:56 +0000159
reed@android.com8a1c16f2008-12-17 15:59:43 +0000160 typedef SkShaderBlitter INHERITED;
161};
162
reed@android.com1fc4c602009-10-02 16:34:57 +0000163///////////////////////////////////////////////////////////////////////////////
reed@android.com8a1c16f2008-12-17 15:59:43 +0000164
165class SkA1_Blitter : public SkRasterBlitter {
166public:
167 SkA1_Blitter(const SkBitmap& device, const SkPaint& paint);
reed@google.com6ba45722013-06-21 18:30:53 +0000168 virtual void blitH(int x, int y, int width) SK_OVERRIDE;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000169
170private:
171 uint8_t fSrcA;
172
173 // illegal
174 SkA1_Blitter& operator=(const SkA1_Blitter&);
reed@google.com981d4792011-03-09 12:55:47 +0000175
reed@android.com8a1c16f2008-12-17 15:59:43 +0000176 typedef SkRasterBlitter INHERITED;
177};
178
reed@android.com1fc4c602009-10-02 16:34:57 +0000179///////////////////////////////////////////////////////////////////////////////
180
181/* These return the correct subclass of blitter for their device config.
182
183 Currently, they make the following assumptions about the state of the
184 paint:
reed@google.com981d4792011-03-09 12:55:47 +0000185
reed@android.com1fc4c602009-10-02 16:34:57 +0000186 1. If there is an xfermode, there will also be a shader
187 2. If there is a colorfilter, there will be a shader that itself handles
188 calling the filter, so the blitter can always ignore the colorfilter obj
189
190 These pre-conditions must be handled by the caller, in our case
191 SkBlitter::Choose(...)
192 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000193
reed@android.com1fc4c602009-10-02 16:34:57 +0000194extern SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device,
195 const SkPaint& paint,
196 void* storage, size_t storageSize);
197
reed@android.com8a1c16f2008-12-17 15:59:43 +0000198#endif