1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2006 The Android Open Source Project
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SkCoreBlitters_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SkCoreBlitters_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmapProcShader.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBlitter.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBlitRow.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShaderBase.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkXfermodePriv.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkRasterBlitter : public SkBlitter {
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRasterBlitter(const SkPixmap& device) : fDevice(device) {}
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkPixmap fDevice;
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkBlitter INHERITED;
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkShaderBlitter : public SkRasterBlitter {
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot      *  The storage for shaderContext is owned by the caller, but the object itself is not.
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot      *  The blitter only ensures that the storage always holds a live object, but it may
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot      *  exchange that object.
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot      */
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkShaderBlitter(const SkPixmap& device, const SkPaint& paint,
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkShaderBase::Context* shaderContext);
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual ~SkShaderBlitter();
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint32_t                fShaderFlags;
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkShader*         fShader;
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkShaderBase::Context*  fShaderContext;
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool                    fConstInY;
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // illegal
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkShaderBlitter& operator=(const SkShaderBlitter&);
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkRasterBlitter INHERITED;
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkA8_Coverage_Blitter : public SkRasterBlitter {
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkA8_Coverage_Blitter(const SkPixmap& device, const SkPaint& paint);
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitH(int x, int y, int width) override;
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitV(int x, int y, int height, SkAlpha alpha) override;
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitRect(int x, int y, int width, int height) override;
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitMask(const SkMask&, const SkIRect&) override;
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkPixmap* justAnOpaqueColor(uint32_t*) override;
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkARGB32_Blitter : public SkRasterBlitter {
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkARGB32_Blitter(const SkPixmap& device, const SkPaint& paint);
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitH(int x, int y, int width) override;
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitV(int x, int y, int height, SkAlpha alpha) override;
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitRect(int x, int y, int width, int height) override;
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitMask(const SkMask&, const SkIRect&) override;
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkPixmap* justAnOpaqueColor(uint32_t*) override;
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkColor                fColor;
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPMColor              fPMColor;
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    unsigned fSrcA, fSrcR, fSrcG, fSrcB;
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // illegal
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkRasterBlitter INHERITED;
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkARGB32_Opaque_Blitter(const SkPixmap& device, const SkPaint& paint)
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitMask(const SkMask&, const SkIRect&) override;
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkARGB32_Blitter INHERITED;
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkARGB32_Black_Blitter(const SkPixmap& device, const SkPaint& paint)
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        : INHERITED(device, paint) {}
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkARGB32_Opaque_Blitter INHERITED;
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkARGB32_Shader_Blitter : public SkShaderBlitter {
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkARGB32_Shader_Blitter(const SkPixmap& device, const SkPaint& paint,
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                            SkShaderBase::Context* shaderContext);
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ~SkARGB32_Shader_Blitter() override;
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitH(int x, int y, int width) override;
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitV(int x, int y, int height, SkAlpha alpha) override;
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitRect(int x, int y, int width, int height) override;
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) override;
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitMask(const SkMask&, const SkIRect&) override;
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkXfermode*         fXfermode;
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPMColor*          fBuffer;
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlitRow::Proc32   fProc32;
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBlitRow::Proc32   fProc32Blend;
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool                fShadeDirectlyIntoDevice;
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // illegal
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkShaderBlitter INHERITED;
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////////////////////////
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottypedef void (*SkS32D16BlendProc)(uint16_t*, const SkPMColor*, int, uint8_t);
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkRGB565_Shader_Blitter : public SkShaderBlitter {
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRGB565_Shader_Blitter(const SkPixmap& device, const SkPaint&, SkShaderBase::Context*);
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ~SkRGB565_Shader_Blitter() override;
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitH(int x, int y, int width) override;
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) override;
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static bool Supports(const SkPixmap& device, const SkPaint&);
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPMColor*          fBuffer;
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkS32D16BlendProc   fBlend;
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkS32D16BlendProc   fBlendCoverage;
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkShaderBlitter INHERITED;
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Neither of these ever returns nullptr, but this first factory may return a SkNullBlitter.
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap&, const SkPaint&, const SkMatrix& ctm,
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                         SkArenaAlloc*);
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Use this if you've pre-baked a shader pipeline, including modulating with paint alpha.
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// This factory never returns an SkNullBlitter.
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap&, const SkPaint&,
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                         const SkRasterPipeline& shaderPipeline,
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                         bool shader_is_opaque,
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                         SkArenaAlloc*);
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
175