blob: 0e8b819c672ac0efb61e0af87dca9c780a062147 [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"
Mike Reedd4706732016-11-15 16:44:34 -050015#include "SkXfermodePriv.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000016
17class SkRasterBlitter : public SkBlitter {
18public:
reed41e010c2015-06-09 12:16:53 -070019 SkRasterBlitter(const SkPixmap& device) : fDevice(device) {}
reed@android.com8a1c16f2008-12-17 15:59:43 +000020
21protected:
reed41e010c2015-06-09 12:16:53 -070022 const SkPixmap fDevice;
reed@android.com8a1c16f2008-12-17 15:59:43 +000023
24private:
25 typedef SkBlitter INHERITED;
26};
27
28class SkShaderBlitter : public SkRasterBlitter {
29public:
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000030 /**
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 */
reed41e010c2015-06-09 12:16:53 -070035 SkShaderBlitter(const SkPixmap& device, const SkPaint& paint,
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000036 SkShader::Context* shaderContext);
reed@android.com8a1c16f2008-12-17 15:59:43 +000037 virtual ~SkShaderBlitter();
38
39protected:
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000040 uint32_t fShaderFlags;
41 const SkShader* fShader;
42 SkShader::Context* fShaderContext;
reeda34be682016-02-15 07:48:35 -080043 bool fConstInY;
reed@android.com8a1c16f2008-12-17 15:59:43 +000044
45private:
46 // illegal
47 SkShaderBlitter& operator=(const SkShaderBlitter&);
48
49 typedef SkRasterBlitter INHERITED;
50};
51
52///////////////////////////////////////////////////////////////////////////////
53
reed@google.com126f7f52013-11-07 16:06:53 +000054class SkA8_Coverage_Blitter : public SkRasterBlitter {
55public:
reed41e010c2015-06-09 12:16:53 -070056 SkA8_Coverage_Blitter(const SkPixmap& device, const SkPaint& paint);
mtklein36352bf2015-03-25 18:17:31 -070057 void blitH(int x, int y, int width) override;
58 void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
59 void blitV(int x, int y, int height, SkAlpha alpha) override;
60 void blitRect(int x, int y, int width, int height) override;
61 void blitMask(const SkMask&, const SkIRect&) override;
reed41e010c2015-06-09 12:16:53 -070062 const SkPixmap* justAnOpaqueColor(uint32_t*) override;
reed@google.com126f7f52013-11-07 16:06:53 +000063};
64
reed@android.com8a1c16f2008-12-17 15:59:43 +000065class SkA8_Blitter : public SkRasterBlitter {
66public:
reed41e010c2015-06-09 12:16:53 -070067 SkA8_Blitter(const SkPixmap& device, const SkPaint& paint);
reed3dfd1332015-06-25 14:26:11 -070068 void blitH(int x, int y, int width) override;
69 void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
70 void blitV(int x, int y, int height, SkAlpha alpha) override;
71 void blitRect(int x, int y, int width, int height) override;
72 void blitMask(const SkMask&, const SkIRect&) override;
73 const SkPixmap* justAnOpaqueColor(uint32_t*) override;
reed@android.com8a1c16f2008-12-17 15:59:43 +000074
75private:
76 unsigned fSrcA;
77
78 // illegal
79 SkA8_Blitter& operator=(const SkA8_Blitter&);
80
81 typedef SkRasterBlitter INHERITED;
82};
83
84class SkA8_Shader_Blitter : public SkShaderBlitter {
85public:
reed41e010c2015-06-09 12:16:53 -070086 SkA8_Shader_Blitter(const SkPixmap& device, const SkPaint& paint,
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000087 SkShader::Context* shaderContext);
Brian Salomond3b65972017-03-22 12:05:03 -040088 ~SkA8_Shader_Blitter() override;
reed3dfd1332015-06-25 14:26:11 -070089 void blitH(int x, int y, int width) override;
90 void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
91 void blitMask(const SkMask&, const SkIRect&) override;
reed@android.com8a1c16f2008-12-17 15:59:43 +000092
93private:
94 SkXfermode* fXfermode;
95 SkPMColor* fBuffer;
96 uint8_t* fAAExpand;
97
98 // illegal
99 SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&);
100
101 typedef SkShaderBlitter INHERITED;
102};
103
104////////////////////////////////////////////////////////////////
105
106class SkARGB32_Blitter : public SkRasterBlitter {
107public:
reed41e010c2015-06-09 12:16:53 -0700108 SkARGB32_Blitter(const SkPixmap& device, const SkPaint& paint);
reed3dfd1332015-06-25 14:26:11 -0700109 void blitH(int x, int y, int width) override;
110 void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
111 void blitV(int x, int y, int height, SkAlpha alpha) override;
112 void blitRect(int x, int y, int width, int height) override;
113 void blitMask(const SkMask&, const SkIRect&) override;
114 const SkPixmap* justAnOpaqueColor(uint32_t*) override;
reed6983f662015-04-15 18:23:03 -0700115 void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
116 void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000117
118protected:
reed@google.comee467ee2011-03-09 13:23:57 +0000119 SkColor fColor;
120 SkPMColor fPMColor;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000121
122private:
123 unsigned fSrcA, fSrcR, fSrcG, fSrcB;
124
125 // illegal
126 SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
127
128 typedef SkRasterBlitter INHERITED;
129};
130
reed@android.comdafaf7a2009-07-10 03:05:59 +0000131class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000132public:
reed41e010c2015-06-09 12:16:53 -0700133 SkARGB32_Opaque_Blitter(const SkPixmap& device, const SkPaint& paint)
reed@android.comdafaf7a2009-07-10 03:05:59 +0000134 : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
reed3dfd1332015-06-25 14:26:11 -0700135 void blitMask(const SkMask&, const SkIRect&) override;
reed6983f662015-04-15 18:23:03 -0700136 void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
137 void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
reed@android.comdafaf7a2009-07-10 03:05:59 +0000138
reed@android.com8a1c16f2008-12-17 15:59:43 +0000139private:
140 typedef SkARGB32_Blitter INHERITED;
141};
142
reed@android.comdafaf7a2009-07-10 03:05:59 +0000143class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000144public:
reed41e010c2015-06-09 12:16:53 -0700145 SkARGB32_Black_Blitter(const SkPixmap& device, const SkPaint& paint)
reed@android.comdafaf7a2009-07-10 03:05:59 +0000146 : INHERITED(device, paint) {}
reed3dfd1332015-06-25 14:26:11 -0700147 void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
reed6983f662015-04-15 18:23:03 -0700148 void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
149 void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
reed@android.comb602b8e2009-07-10 15:58:53 +0000150
reed@android.com8a1c16f2008-12-17 15:59:43 +0000151private:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000152 typedef SkARGB32_Opaque_Blitter INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000153};
154
155class SkARGB32_Shader_Blitter : public SkShaderBlitter {
156public:
reed41e010c2015-06-09 12:16:53 -0700157 SkARGB32_Shader_Blitter(const SkPixmap& device, const SkPaint& paint,
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000158 SkShader::Context* shaderContext);
Brian Salomond3b65972017-03-22 12:05:03 -0400159 ~SkARGB32_Shader_Blitter() override;
mtklein36352bf2015-03-25 18:17:31 -0700160 void blitH(int x, int y, int width) override;
161 void blitV(int x, int y, int height, SkAlpha alpha) override;
162 void blitRect(int x, int y, int width, int height) override;
163 void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) override;
164 void blitMask(const SkMask&, const SkIRect&) override;
halcanary9d524f22016-03-29 09:03:52 -0700165
reed@android.com8a1c16f2008-12-17 15:59:43 +0000166private:
reed@android.comc4cae852009-09-23 15:06:10 +0000167 SkXfermode* fXfermode;
168 SkPMColor* fBuffer;
169 SkBlitRow::Proc32 fProc32;
170 SkBlitRow::Proc32 fProc32Blend;
reed@google.com13201e72012-11-16 13:20:41 +0000171 bool fShadeDirectlyIntoDevice;
halcanary9d524f22016-03-29 09:03:52 -0700172
reed@android.com8a1c16f2008-12-17 15:59:43 +0000173 // illegal
174 SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
halcanary9d524f22016-03-29 09:03:52 -0700175
reed@android.com8a1c16f2008-12-17 15:59:43 +0000176 typedef SkShaderBlitter INHERITED;
177};
178
reed3dc6aac2016-04-14 09:02:14 -0700179SkBlitter* SkBlitter_ARGB32_Create(const SkPixmap& device, const SkPaint&, SkShader::Context*,
Herb Derby83e939b2017-02-07 14:25:11 -0500180 SkArenaAlloc*);
reeda34be682016-02-15 07:48:35 -0800181
reed3dc6aac2016-04-14 09:02:14 -0700182SkBlitter* SkBlitter_F16_Create(const SkPixmap& device, const SkPaint&, SkShader::Context*,
Herb Derby83e939b2017-02-07 14:25:11 -0500183 SkArenaAlloc*);
reed395eabe2016-01-30 18:52:31 -0800184
reed@android.com1fc4c602009-10-02 16:34:57 +0000185///////////////////////////////////////////////////////////////////////////////
reed@android.com8a1c16f2008-12-17 15:59:43 +0000186
reed@android.com1fc4c602009-10-02 16:34:57 +0000187/* These return the correct subclass of blitter for their device config.
188
189 Currently, they make the following assumptions about the state of the
190 paint:
reed@google.com981d4792011-03-09 12:55:47 +0000191
reed@android.com1fc4c602009-10-02 16:34:57 +0000192 1. If there is an xfermode, there will also be a shader
193 2. If there is a colorfilter, there will be a shader that itself handles
194 calling the filter, so the blitter can always ignore the colorfilter obj
195
196 These pre-conditions must be handled by the caller, in our case
197 SkBlitter::Choose(...)
198 */
reed@android.com8a1c16f2008-12-17 15:59:43 +0000199
reed41e010c2015-06-09 12:16:53 -0700200SkBlitter* SkBlitter_ChooseD565(const SkPixmap& device, const SkPaint& paint,
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +0000201 SkShader::Context* shaderContext,
Herb Derby83e939b2017-02-07 14:25:11 -0500202 SkArenaAlloc* allocator);
reed@android.com1fc4c602009-10-02 16:34:57 +0000203
mtklein9a5c47f2016-07-22 11:05:04 -0700204
205// Returns nullptr if no SkRasterPipeline blitter can be constructed for this paint.
Mike Kleinfb191da2016-11-15 13:20:33 -0500206SkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap&, const SkPaint&, const SkMatrix& ctm,
Matt Sarett25834ff2017-02-15 15:54:35 -0500207 SkArenaAlloc*);
mtklein9a5c47f2016-07-22 11:05:04 -0700208
reed@android.com8a1c16f2008-12-17 15:59:43 +0000209#endif