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