1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkCoreBlitters_DEFINED
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkCoreBlitters_DEFINED
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
11a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org#include "SkBitmapProcShader.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkBlitter.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkBlitRow.h"
14a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org#include "SkShader.h"
15d47067392848ba132d4e86ffbeebe2dcacda9534Mike Reed#include "SkXfermodePriv.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkRasterBlitter : public SkBlitter {
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1941e010cb901c0da9066c4df562030808c9ccd7f8reed    SkRasterBlitter(const SkPixmap& device) : fDevice(device) {}
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
2241e010cb901c0da9066c4df562030808c9ccd7f8reed    const SkPixmap fDevice;
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkBlitter INHERITED;
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkShaderBlitter : public SkRasterBlitter {
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
3087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    /**
3187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org      *  The storage for shaderContext is owned by the caller, but the object itself is not.
3287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org      *  The blitter only ensures that the storage always holds a live object, but it may
3387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org      *  exchange that object.
3487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org      */
3541e010cb901c0da9066c4df562030808c9ccd7f8reed    SkShaderBlitter(const SkPixmap& device, const SkPaint& paint,
3687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org                    SkShader::Context* shaderContext);
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~SkShaderBlitter();
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
4087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    uint32_t            fShaderFlags;
4187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    const SkShader*     fShader;
4287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    SkShader::Context*  fShaderContext;
43a34be68a7eff0ae475b194f8a29975460cf3e456reed    bool                fConstInY;
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkShaderBlitter& operator=(const SkShaderBlitter&);
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkRasterBlitter INHERITED;
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
54126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.comclass SkA8_Coverage_Blitter : public SkRasterBlitter {
55126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.compublic:
5641e010cb901c0da9066c4df562030808c9ccd7f8reed    SkA8_Coverage_Blitter(const SkPixmap& device, const SkPaint& paint);
5736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void blitH(int x, int y, int width) override;
5836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
5936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void blitV(int x, int y, int height, SkAlpha alpha) override;
6036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void blitRect(int x, int y, int width, int height) override;
6136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void blitMask(const SkMask&, const SkIRect&) override;
6241e010cb901c0da9066c4df562030808c9ccd7f8reed    const SkPixmap* justAnOpaqueColor(uint32_t*) override;
63126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com};
64126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkA8_Blitter : public SkRasterBlitter {
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
6741e010cb901c0da9066c4df562030808c9ccd7f8reed    SkA8_Blitter(const SkPixmap& device, const SkPaint& paint);
683dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitH(int x, int y, int width) override;
693dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
703dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitV(int x, int y, int height, SkAlpha alpha) override;
713dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitRect(int x, int y, int width, int height) override;
723dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitMask(const SkMask&, const SkIRect&) override;
733dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    const SkPixmap* justAnOpaqueColor(uint32_t*) override;
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    unsigned fSrcA;
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkA8_Blitter& operator=(const SkA8_Blitter&);
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkRasterBlitter INHERITED;
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkA8_Shader_Blitter : public SkShaderBlitter {
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
8641e010cb901c0da9066c4df562030808c9ccd7f8reed    SkA8_Shader_Blitter(const SkPixmap& device, const SkPaint& paint,
8787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org                        SkShader::Context* shaderContext);
88d3b65972aad96453ff4510caa3e25a2b847c6d1eBrian Salomon    ~SkA8_Shader_Blitter() override;
893dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitH(int x, int y, int width) override;
903dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
913dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitMask(const SkMask&, const SkIRect&) override;
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkXfermode* fXfermode;
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPMColor*  fBuffer;
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint8_t*    fAAExpand;
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&);
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkShaderBlitter INHERITED;
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkARGB32_Blitter : public SkRasterBlitter {
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
10841e010cb901c0da9066c4df562030808c9ccd7f8reed    SkARGB32_Blitter(const SkPixmap& device, const SkPaint& paint);
1093dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitH(int x, int y, int width) override;
1103dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
1113dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitV(int x, int y, int height, SkAlpha alpha) override;
1123dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitRect(int x, int y, int width, int height) override;
1133dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitMask(const SkMask&, const SkIRect&) override;
1143dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    const SkPixmap* justAnOpaqueColor(uint32_t*) override;
1156983f66d8b3a489133b751e2cef03e72a03bfeaereed    void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
1166983f66d8b3a489133b751e2cef03e72a03bfeaereed    void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
119ee467ee79d449ebe6ae7f7946e613cc70a479c69reed@google.com    SkColor                fColor;
120ee467ee79d449ebe6ae7f7946e613cc70a479c69reed@google.com    SkPMColor              fPMColor;
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    unsigned fSrcA, fSrcR, fSrcG, fSrcB;
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkRasterBlitter INHERITED;
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
131dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.comclass SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
13341e010cb901c0da9066c4df562030808c9ccd7f8reed    SkARGB32_Opaque_Blitter(const SkPixmap& device, const SkPaint& paint)
134dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.com        : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
1353dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitMask(const SkMask&, const SkIRect&) override;
1366983f66d8b3a489133b751e2cef03e72a03bfeaereed    void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
1376983f66d8b3a489133b751e2cef03e72a03bfeaereed    void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
138dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.com
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkARGB32_Blitter INHERITED;
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
143dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.comclass SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
14541e010cb901c0da9066c4df562030808c9ccd7f8reed    SkARGB32_Black_Blitter(const SkPixmap& device, const SkPaint& paint)
146dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.com        : INHERITED(device, paint) {}
1473dfd133882fe9d9dc9db0897deac1ac1f4c99e01reed    void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
1486983f66d8b3a489133b751e2cef03e72a03bfeaereed    void blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) override;
1496983f66d8b3a489133b751e2cef03e72a03bfeaereed    void blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) override;
150b602b8e5334edc0bfcdf086c2ea58e2b5d5f1f3breed@android.com
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
152dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.com    typedef SkARGB32_Opaque_Blitter INHERITED;
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkARGB32_Shader_Blitter : public SkShaderBlitter {
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
15741e010cb901c0da9066c4df562030808c9ccd7f8reed    SkARGB32_Shader_Blitter(const SkPixmap& device, const SkPaint& paint,
15887fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org                            SkShader::Context* shaderContext);
159d3b65972aad96453ff4510caa3e25a2b847c6d1eBrian Salomon    ~SkARGB32_Shader_Blitter() override;
16036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void blitH(int x, int y, int width) override;
16136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void blitV(int x, int y, int height, SkAlpha alpha) override;
16236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void blitRect(int x, int y, int width, int height) override;
16336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) override;
16436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void blitMask(const SkMask&, const SkIRect&) override;
1659d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
167c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com    SkXfermode*         fXfermode;
168c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com    SkPMColor*          fBuffer;
169c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com    SkBlitRow::Proc32   fProc32;
170c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com    SkBlitRow::Proc32   fProc32Blend;
17113201e74f43b9c5fa173339eb36de515370e6973reed@google.com    bool                fShadeDirectlyIntoDevice;
1729d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
1759d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkShaderBlitter INHERITED;
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1793dc6aac5da2dbeb56cda025f3699cad72e1a4b4ereedSkBlitter* SkBlitter_ARGB32_Create(const SkPixmap& device, const SkPaint&, SkShader::Context*,
18083e939bcb79790f5ae3b28c398fbcf034675a6e5Herb Derby                                   SkArenaAlloc*);
181a34be68a7eff0ae475b194f8a29975460cf3e456reed
1823dc6aac5da2dbeb56cda025f3699cad72e1a4b4ereedSkBlitter* SkBlitter_F16_Create(const SkPixmap& device, const SkPaint&, SkShader::Context*,
18383e939bcb79790f5ae3b28c398fbcf034675a6e5Herb Derby                                SkArenaAlloc*);
184395eabeb0e72334c45324874c6e009b54634df21reed
1851fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com///////////////////////////////////////////////////////////////////////////////
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1871fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com/*  These return the correct subclass of blitter for their device config.
1881fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com
1891fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com    Currently, they make the following assumptions about the state of the
1901fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com    paint:
191981d4798007b91e2e19c13b171583927a56df63breed@google.com
1921fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com    1. If there is an xfermode, there will also be a shader
1931fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com    2. If there is a colorfilter, there will be a shader that itself handles
1941fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com       calling the filter, so the blitter can always ignore the colorfilter obj
1951fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com
1961fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com    These pre-conditions must be handled by the caller, in our case
1971fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com    SkBlitter::Choose(...)
1981fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com */
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
20041e010cb901c0da9066c4df562030808c9ccd7f8reedSkBlitter* SkBlitter_ChooseD565(const SkPixmap& device, const SkPaint& paint,
20187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org                                SkShader::Context* shaderContext,
20283e939bcb79790f5ae3b28c398fbcf034675a6e5Herb Derby                                SkArenaAlloc* allocator);
2031fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com
2049a5c47f4effba3b48a9a8c7c144b72b532d06efemtklein
2059a5c47f4effba3b48a9a8c7c144b72b532d06efemtklein// Returns nullptr if no SkRasterPipeline blitter can be constructed for this paint.
206fb191da789c988b6ed1502cc1c210be3f9c53b52Mike KleinSkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap&, const SkPaint&, const SkMatrix& ctm,
20725834ffc5a4f6c45830dded7d5d135df157870e6Matt Sarett                                         SkArenaAlloc*);
2089a5c47f4effba3b48a9a8c7c144b72b532d06efemtklein
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
210