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