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"
15a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org#include "SkSmallAllocator.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkRasterBlitter : public SkBlitter {
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkRasterBlitter(const SkBitmap& device) : fDevice(device) {}
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const SkBitmap& 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      */
3587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    SkShaderBlitter(const SkBitmap& device, const SkPaint& paint,
3687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org                    SkShader::Context* shaderContext);
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~SkShaderBlitter();
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    /**
4087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org      *  Create a new shader context and uses it instead of the old one if successful.
4187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org      *  Will create the context at the same location as the old one (this is safe
4287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org      *  because the shader itself is unchanged).
4387fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org      */
4480116dcf1e1baf9817ae42d0aca51f7eabaa2880commit-bot@chromium.org    virtual bool resetShaderContext(const SkShader::ContextRec&) SK_OVERRIDE;
4587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
4687fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    virtual SkShader::Context* getShaderContext() const SK_OVERRIDE { return fShaderContext; }
4787fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
4987fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    uint32_t            fShaderFlags;
5087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    const SkShader*     fShader;
5187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    SkShader::Context*  fShaderContext;
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkShaderBlitter& operator=(const SkShaderBlitter&);
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkRasterBlitter INHERITED;
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
62126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.comclass SkA8_Coverage_Blitter : public SkRasterBlitter {
63126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.compublic:
64126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com    SkA8_Coverage_Blitter(const SkBitmap& device, const SkPaint& paint);
65126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com    virtual void blitH(int x, int y, int width) SK_OVERRIDE;
66126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) SK_OVERRIDE;
67126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com    virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE;
68126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com    virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE;
69126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com    virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE;
70126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com    virtual const SkBitmap* justAnOpaqueColor(uint32_t*) SK_OVERRIDE;
71126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com};
72126f7f5244502c0cbf1e5fec1d2ad7a0f2eb6c34reed@google.com
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkA8_Blitter : public SkRasterBlitter {
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkA8_Blitter(const SkBitmap& device, const SkPaint& paint);
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitH(int x, int y, int width);
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitV(int x, int y, int height, SkAlpha alpha);
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitRect(int x, int y, int width, int height);
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitMask(const SkMask&, const SkIRect&);
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    unsigned fSrcA;
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkA8_Blitter& operator=(const SkA8_Blitter&);
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkRasterBlitter INHERITED;
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkA8_Shader_Blitter : public SkShaderBlitter {
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
9487fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    SkA8_Shader_Blitter(const SkBitmap& device, const SkPaint& paint,
9587fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org                        SkShader::Context* shaderContext);
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~SkA8_Shader_Blitter();
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitH(int x, int y, int width);
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitMask(const SkMask&, const SkIRect&);
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkXfermode* fXfermode;
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPMColor*  fBuffer;
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint8_t*    fAAExpand;
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&);
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkShaderBlitter INHERITED;
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkARGB32_Blitter : public SkRasterBlitter {
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkARGB32_Blitter(const SkBitmap& device, const SkPaint& paint);
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitH(int x, int y, int width);
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitV(int x, int y, int height, SkAlpha alpha);
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitRect(int x, int y, int width, int height);
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitMask(const SkMask&, const SkIRect&);
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
125ee467ee79d449ebe6ae7f7946e613cc70a479c69reed@google.com    SkColor                fColor;
126ee467ee79d449ebe6ae7f7946e613cc70a479c69reed@google.com    SkPMColor              fPMColor;
12729e5054dd07c97c2195c5f64bf67aaa6b5afa204senorblanco@chromium.org    SkBlitRow::ColorProc   fColor32Proc;
1288dd90a926a8660da2bacc7af149f4ac5b2e7c64ctomhudson@google.com    SkBlitRow::ColorRectProc fColorRect32Proc;
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    unsigned fSrcA, fSrcR, fSrcG, fSrcB;
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkRasterBlitter INHERITED;
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
139dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.comclass SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
141dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.com    SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint)
142dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.com        : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void blitMask(const SkMask&, const SkIRect&);
144dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.com
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkARGB32_Blitter INHERITED;
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
149dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.comclass SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
151dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.com    SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint)
152dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.com        : INHERITED(device, paint) {}
153dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.com    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
154b602b8e5334edc0bfcdf086c2ea58e2b5d5f1f3breed@android.com
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
156dafaf7ac4d89f183dc515907665cdac3e3098466reed@android.com    typedef SkARGB32_Opaque_Blitter INHERITED;
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkARGB32_Shader_Blitter : public SkShaderBlitter {
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
16187fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org    SkARGB32_Shader_Blitter(const SkBitmap& device, const SkPaint& paint,
16287fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org                            SkShader::Context* shaderContext);
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~SkARGB32_Shader_Blitter();
16413201e74f43b9c5fa173339eb36de515370e6973reed@google.com    virtual void blitH(int x, int y, int width) SK_OVERRIDE;
16513201e74f43b9c5fa173339eb36de515370e6973reed@google.com    virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE;
1663bafe74a29c37761082980ed4ee9b831256bd27ereed@google.com    virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE;
16713201e74f43b9c5fa173339eb36de515370e6973reed@google.com    virtual void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) SK_OVERRIDE;
16813201e74f43b9c5fa173339eb36de515370e6973reed@google.com    virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE;
169f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
171c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com    SkXfermode*         fXfermode;
172c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com    SkPMColor*          fBuffer;
173c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com    SkBlitRow::Proc32   fProc32;
174c4cae85752e3e486cf4eac8cd8128f57b6f40563reed@android.com    SkBlitRow::Proc32   fProc32Blend;
17513201e74f43b9c5fa173339eb36de515370e6973reed@google.com    bool                fShadeDirectlyIntoDevice;
17613201e74f43b9c5fa173339eb36de515370e6973reed@google.com    bool                fConstInY;
177f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // illegal
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
180f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkShaderBlitter INHERITED;
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1841fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com///////////////////////////////////////////////////////////////////////////////
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1861fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com/*  These return the correct subclass of blitter for their device config.
1871fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com
1881fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com    Currently, they make the following assumptions about the state of the
1891fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com    paint:
190981d4798007b91e2e19c13b171583927a56df63breed@google.com
1911fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com    1. If there is an xfermode, there will also be a shader
1921fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com    2. If there is a colorfilter, there will be a shader that itself handles
1931fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com       calling the filter, so the blitter can always ignore the colorfilter obj
1941fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com
1951fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com    These pre-conditions must be handled by the caller, in our case
1961fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com    SkBlitter::Choose(...)
1971fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com */
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
199a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.orgSkBlitter* SkBlitter_ChooseD565(const SkBitmap& device, const SkPaint& paint,
20087fcd950198a16211b3988610beebb5ca5bcf323commit-bot@chromium.org                                SkShader::Context* shaderContext,
201a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org                                SkTBlitterAllocator* allocator);
2021fc4c605def61d9e10489f9cd63dc378baa6ade3reed@android.com
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
204