blob: 285184050ba88737b3b94391812a5af246e5da31 [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
commit-bot@chromium.orga5572e52014-03-07 03:24:41 +000011#include "SkBitmapProcShader.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000012#include "SkBlitter.h"
13#include "SkBlitRow.h"
commit-bot@chromium.orga5572e52014-03-07 03:24:41 +000014#include "SkShader.h"
15#include "SkSmallAllocator.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000016
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 SkShaderBlitter(const SkBitmap& device, const SkPaint& paint);
31 virtual ~SkShaderBlitter();
32
33protected:
reed@android.com5119bdb2009-06-12 21:27:03 +000034 uint32_t fShaderFlags;
35 SkShader* fShader;
reed@android.com8a1c16f2008-12-17 15:59:43 +000036
37private:
38 // illegal
39 SkShaderBlitter& operator=(const SkShaderBlitter&);
40
41 typedef SkRasterBlitter INHERITED;
42};
43
44///////////////////////////////////////////////////////////////////////////////
45
reed@google.com126f7f52013-11-07 16:06:53 +000046class SkA8_Coverage_Blitter : public SkRasterBlitter {
47public:
48 SkA8_Coverage_Blitter(const SkBitmap& device, const SkPaint& paint);
49 virtual void blitH(int x, int y, int width) SK_OVERRIDE;
50 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) SK_OVERRIDE;
51 virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE;
52 virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE;
53 virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE;
54 virtual const SkBitmap* justAnOpaqueColor(uint32_t*) SK_OVERRIDE;
55};
56
reed@android.com8a1c16f2008-12-17 15:59:43 +000057class SkA8_Blitter : public SkRasterBlitter {
58public:
59 SkA8_Blitter(const SkBitmap& device, const SkPaint& paint);
60 virtual void blitH(int x, int y, int width);
61 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
62 virtual void blitV(int x, int y, int height, SkAlpha alpha);
63 virtual void blitRect(int x, int y, int width, int height);
64 virtual void blitMask(const SkMask&, const SkIRect&);
65 virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
66
67private:
68 unsigned fSrcA;
69
70 // illegal
71 SkA8_Blitter& operator=(const SkA8_Blitter&);
72
73 typedef SkRasterBlitter INHERITED;
74};
75
76class SkA8_Shader_Blitter : public SkShaderBlitter {
77public:
78 SkA8_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
79 virtual ~SkA8_Shader_Blitter();
80 virtual void blitH(int x, int y, int width);
81 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
82 virtual void blitMask(const SkMask&, const SkIRect&);
83
84private:
85 SkXfermode* fXfermode;
86 SkPMColor* fBuffer;
87 uint8_t* fAAExpand;
88
89 // illegal
90 SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&);
91
92 typedef SkShaderBlitter INHERITED;
93};
94
95////////////////////////////////////////////////////////////////
96
97class SkARGB32_Blitter : public SkRasterBlitter {
98public:
99 SkARGB32_Blitter(const SkBitmap& device, const SkPaint& paint);
100 virtual void blitH(int x, int y, int width);
101 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
102 virtual void blitV(int x, int y, int height, SkAlpha alpha);
103 virtual void blitRect(int x, int y, int width, int height);
104 virtual void blitMask(const SkMask&, const SkIRect&);
105 virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
106
107protected:
reed@google.comee467ee2011-03-09 13:23:57 +0000108 SkColor fColor;
109 SkPMColor fPMColor;
senorblanco@chromium.org29e50542010-12-16 19:07:45 +0000110 SkBlitRow::ColorProc fColor32Proc;
tomhudson@google.com8dd90a92012-03-19 13:49:50 +0000111 SkBlitRow::ColorRectProc fColorRect32Proc;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000112
113private:
114 unsigned fSrcA, fSrcR, fSrcG, fSrcB;
115
116 // illegal
117 SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
118
119 typedef SkRasterBlitter INHERITED;
120};
121
reed@android.comdafaf7a2009-07-10 03:05:59 +0000122class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000123public:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000124 SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint)
125 : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000126 virtual void blitMask(const SkMask&, const SkIRect&);
reed@android.comdafaf7a2009-07-10 03:05:59 +0000127
reed@android.com8a1c16f2008-12-17 15:59:43 +0000128private:
129 typedef SkARGB32_Blitter INHERITED;
130};
131
reed@android.comdafaf7a2009-07-10 03:05:59 +0000132class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000133public:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000134 SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint)
135 : INHERITED(device, paint) {}
reed@android.comdafaf7a2009-07-10 03:05:59 +0000136 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
reed@android.comb602b8e2009-07-10 15:58:53 +0000137
reed@android.com8a1c16f2008-12-17 15:59:43 +0000138private:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000139 typedef SkARGB32_Opaque_Blitter INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000140};
141
142class SkARGB32_Shader_Blitter : public SkShaderBlitter {
143public:
144 SkARGB32_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
145 virtual ~SkARGB32_Shader_Blitter();
reed@google.com13201e72012-11-16 13:20:41 +0000146 virtual void blitH(int x, int y, int width) SK_OVERRIDE;
reed@google.com13201e72012-11-16 13:20:41 +0000147 virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE;
reed@google.com3bafe742012-10-12 18:56:18 +0000148 virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE;
reed@google.com13201e72012-11-16 13:20:41 +0000149 virtual void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) SK_OVERRIDE;
150 virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE;
skia.committer@gmail.comf57c01b2012-10-13 02:01:56 +0000151
reed@android.com8a1c16f2008-12-17 15:59:43 +0000152private:
reed@android.comc4cae852009-09-23 15:06:10 +0000153 SkXfermode* fXfermode;
154 SkPMColor* fBuffer;
155 SkBlitRow::Proc32 fProc32;
156 SkBlitRow::Proc32 fProc32Blend;
reed@google.com13201e72012-11-16 13:20:41 +0000157 bool fShadeDirectlyIntoDevice;
158 bool fConstInY;
skia.committer@gmail.comf57c01b2012-10-13 02:01:56 +0000159
reed@android.com8a1c16f2008-12-17 15:59:43 +0000160 // illegal
161 SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
skia.committer@gmail.comf57c01b2012-10-13 02:01:56 +0000162
reed@android.com8a1c16f2008-12-17 15:59:43 +0000163 typedef SkShaderBlitter INHERITED;
164};
165
reed@android.com1fc4c602009-10-02 16:34:57 +0000166///////////////////////////////////////////////////////////////////////////////
reed@android.com8a1c16f2008-12-17 15:59:43 +0000167
reed@android.com1fc4c602009-10-02 16:34:57 +0000168/* 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
commit-bot@chromium.orga5572e52014-03-07 03:24:41 +0000181SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device, const SkPaint& paint,
182 SkTBlitterAllocator* allocator);
reed@android.com1fc4c602009-10-02 16:34:57 +0000183
reed@android.com8a1c16f2008-12-17 15:59:43 +0000184#endif