blob: 47b20176e64bf13b6c229c0d94b9fa2895413f2c [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"
Florin Malita4aed1382017-05-25 10:38:07 -040014#include "SkShaderBase.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,
Florin Malita4aed1382017-05-25 10:38:07 -040036 SkShaderBase::Context* shaderContext);
reed@android.com8a1c16f2008-12-17 15:59:43 +000037 virtual ~SkShaderBlitter();
38
39protected:
Florin Malita4aed1382017-05-25 10:38:07 -040040 uint32_t fShaderFlags;
41 const SkShader* fShader;
42 SkShaderBase::Context* fShaderContext;
43 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 +000065////////////////////////////////////////////////////////////////
66
67class SkARGB32_Blitter : public SkRasterBlitter {
68public:
reed41e010c2015-06-09 12:16:53 -070069 SkARGB32_Blitter(const SkPixmap& device, const SkPaint& paint);
reed3dfd1332015-06-25 14:26:11 -070070 void blitH(int x, int y, int width) override;
71 void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
72 void blitV(int x, int y, int height, SkAlpha alpha) override;
73 void blitRect(int x, int y, int width, int height) override;
74 void blitMask(const SkMask&, const SkIRect&) override;
75 const SkPixmap* justAnOpaqueColor(uint32_t*) override;
reed6983f662015-04-15 18:23:03 -070076 void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
77 void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
reed@android.com8a1c16f2008-12-17 15:59:43 +000078
79protected:
reed@google.comee467ee2011-03-09 13:23:57 +000080 SkColor fColor;
81 SkPMColor fPMColor;
reed@android.com8a1c16f2008-12-17 15:59:43 +000082
83private:
84 unsigned fSrcA, fSrcR, fSrcG, fSrcB;
85
86 // illegal
87 SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
88
89 typedef SkRasterBlitter INHERITED;
90};
91
reed@android.comdafaf7a2009-07-10 03:05:59 +000092class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +000093public:
reed41e010c2015-06-09 12:16:53 -070094 SkARGB32_Opaque_Blitter(const SkPixmap& device, const SkPaint& paint)
reed@android.comdafaf7a2009-07-10 03:05:59 +000095 : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
reed3dfd1332015-06-25 14:26:11 -070096 void blitMask(const SkMask&, const SkIRect&) override;
reed6983f662015-04-15 18:23:03 -070097 void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
98 void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
reed@android.comdafaf7a2009-07-10 03:05:59 +000099
reed@android.com8a1c16f2008-12-17 15:59:43 +0000100private:
101 typedef SkARGB32_Blitter INHERITED;
102};
103
reed@android.comdafaf7a2009-07-10 03:05:59 +0000104class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000105public:
reed41e010c2015-06-09 12:16:53 -0700106 SkARGB32_Black_Blitter(const SkPixmap& device, const SkPaint& paint)
reed@android.comdafaf7a2009-07-10 03:05:59 +0000107 : INHERITED(device, paint) {}
reed3dfd1332015-06-25 14:26:11 -0700108 void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
reed6983f662015-04-15 18:23:03 -0700109 void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
110 void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
reed@android.comb602b8e2009-07-10 15:58:53 +0000111
reed@android.com8a1c16f2008-12-17 15:59:43 +0000112private:
reed@android.comdafaf7a2009-07-10 03:05:59 +0000113 typedef SkARGB32_Opaque_Blitter INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000114};
115
116class SkARGB32_Shader_Blitter : public SkShaderBlitter {
117public:
reed41e010c2015-06-09 12:16:53 -0700118 SkARGB32_Shader_Blitter(const SkPixmap& device, const SkPaint& paint,
Florin Malita4aed1382017-05-25 10:38:07 -0400119 SkShaderBase::Context* shaderContext);
Brian Salomond3b65972017-03-22 12:05:03 -0400120 ~SkARGB32_Shader_Blitter() override;
mtklein36352bf2015-03-25 18:17:31 -0700121 void blitH(int x, int y, int width) override;
122 void blitV(int x, int y, int height, SkAlpha alpha) override;
123 void blitRect(int x, int y, int width, int height) override;
124 void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) override;
125 void blitMask(const SkMask&, const SkIRect&) override;
halcanary9d524f22016-03-29 09:03:52 -0700126
reed@android.com8a1c16f2008-12-17 15:59:43 +0000127private:
reed@android.comc4cae852009-09-23 15:06:10 +0000128 SkXfermode* fXfermode;
129 SkPMColor* fBuffer;
130 SkBlitRow::Proc32 fProc32;
131 SkBlitRow::Proc32 fProc32Blend;
reed@google.com13201e72012-11-16 13:20:41 +0000132 bool fShadeDirectlyIntoDevice;
halcanary9d524f22016-03-29 09:03:52 -0700133
reed@android.com8a1c16f2008-12-17 15:59:43 +0000134 // illegal
135 SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
halcanary9d524f22016-03-29 09:03:52 -0700136
reed@android.com8a1c16f2008-12-17 15:59:43 +0000137 typedef SkShaderBlitter INHERITED;
138};
139
reed@android.com1fc4c602009-10-02 16:34:57 +0000140///////////////////////////////////////////////////////////////////////////////
reed@android.com8a1c16f2008-12-17 15:59:43 +0000141
Mike Kleinb35cb312017-05-19 12:01:01 -0400142// Neither of these ever returns nullptr, but this first factory may return a SkNullBlitter.
Mike Kleinfb191da2016-11-15 13:20:33 -0500143SkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap&, const SkPaint&, const SkMatrix& ctm,
Matt Sarett25834ff2017-02-15 15:54:35 -0500144 SkArenaAlloc*);
Mike Kleinb35cb312017-05-19 12:01:01 -0400145// Use this if you've pre-baked a shader pipeline, including modulating with paint alpha.
146// This factory never returns an SkNullBlitter.
147SkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap&, const SkPaint&,
Mike Reed02640952017-05-19 15:32:13 -0400148 const SkRasterPipeline& shaderPipeline,
Mike Kleinb35cb312017-05-19 12:01:01 -0400149 bool shader_is_opaque,
Mike Reed02640952017-05-19 15:32:13 -0400150 SkArenaAlloc*);
mtklein9a5c47f2016-07-22 11:05:04 -0700151
reed@android.com8a1c16f2008-12-17 15:59:43 +0000152#endif