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