1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/core/SkCoreBlitters.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,184 @@ 1.4 +/* 1.5 + * Copyright 2006 The Android Open Source Project 1.6 + * 1.7 + * Use of this source code is governed by a BSD-style license that can be 1.8 + * found in the LICENSE file. 1.9 + */ 1.10 + 1.11 +#ifndef SkCoreBlitters_DEFINED 1.12 +#define SkCoreBlitters_DEFINED 1.13 + 1.14 +#include "SkBitmapProcShader.h" 1.15 +#include "SkBlitter.h" 1.16 +#include "SkBlitRow.h" 1.17 +#include "SkShader.h" 1.18 +#include "SkSmallAllocator.h" 1.19 + 1.20 +class SkRasterBlitter : public SkBlitter { 1.21 +public: 1.22 + SkRasterBlitter(const SkBitmap& device) : fDevice(device) {} 1.23 + 1.24 +protected: 1.25 + const SkBitmap& fDevice; 1.26 + 1.27 +private: 1.28 + typedef SkBlitter INHERITED; 1.29 +}; 1.30 + 1.31 +class SkShaderBlitter : public SkRasterBlitter { 1.32 +public: 1.33 + SkShaderBlitter(const SkBitmap& device, const SkPaint& paint); 1.34 + virtual ~SkShaderBlitter(); 1.35 + 1.36 +protected: 1.37 + uint32_t fShaderFlags; 1.38 + SkShader* fShader; 1.39 + 1.40 +private: 1.41 + // illegal 1.42 + SkShaderBlitter& operator=(const SkShaderBlitter&); 1.43 + 1.44 + typedef SkRasterBlitter INHERITED; 1.45 +}; 1.46 + 1.47 +/////////////////////////////////////////////////////////////////////////////// 1.48 + 1.49 +class SkA8_Coverage_Blitter : public SkRasterBlitter { 1.50 +public: 1.51 + SkA8_Coverage_Blitter(const SkBitmap& device, const SkPaint& paint); 1.52 + virtual void blitH(int x, int y, int width) SK_OVERRIDE; 1.53 + virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) SK_OVERRIDE; 1.54 + virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE; 1.55 + virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE; 1.56 + virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE; 1.57 + virtual const SkBitmap* justAnOpaqueColor(uint32_t*) SK_OVERRIDE; 1.58 +}; 1.59 + 1.60 +class SkA8_Blitter : public SkRasterBlitter { 1.61 +public: 1.62 + SkA8_Blitter(const SkBitmap& device, const SkPaint& paint); 1.63 + virtual void blitH(int x, int y, int width); 1.64 + virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 1.65 + virtual void blitV(int x, int y, int height, SkAlpha alpha); 1.66 + virtual void blitRect(int x, int y, int width, int height); 1.67 + virtual void blitMask(const SkMask&, const SkIRect&); 1.68 + virtual const SkBitmap* justAnOpaqueColor(uint32_t*); 1.69 + 1.70 +private: 1.71 + unsigned fSrcA; 1.72 + 1.73 + // illegal 1.74 + SkA8_Blitter& operator=(const SkA8_Blitter&); 1.75 + 1.76 + typedef SkRasterBlitter INHERITED; 1.77 +}; 1.78 + 1.79 +class SkA8_Shader_Blitter : public SkShaderBlitter { 1.80 +public: 1.81 + SkA8_Shader_Blitter(const SkBitmap& device, const SkPaint& paint); 1.82 + virtual ~SkA8_Shader_Blitter(); 1.83 + virtual void blitH(int x, int y, int width); 1.84 + virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 1.85 + virtual void blitMask(const SkMask&, const SkIRect&); 1.86 + 1.87 +private: 1.88 + SkXfermode* fXfermode; 1.89 + SkPMColor* fBuffer; 1.90 + uint8_t* fAAExpand; 1.91 + 1.92 + // illegal 1.93 + SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&); 1.94 + 1.95 + typedef SkShaderBlitter INHERITED; 1.96 +}; 1.97 + 1.98 +//////////////////////////////////////////////////////////////// 1.99 + 1.100 +class SkARGB32_Blitter : public SkRasterBlitter { 1.101 +public: 1.102 + SkARGB32_Blitter(const SkBitmap& device, const SkPaint& paint); 1.103 + virtual void blitH(int x, int y, int width); 1.104 + virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 1.105 + virtual void blitV(int x, int y, int height, SkAlpha alpha); 1.106 + virtual void blitRect(int x, int y, int width, int height); 1.107 + virtual void blitMask(const SkMask&, const SkIRect&); 1.108 + virtual const SkBitmap* justAnOpaqueColor(uint32_t*); 1.109 + 1.110 +protected: 1.111 + SkColor fColor; 1.112 + SkPMColor fPMColor; 1.113 + SkBlitRow::ColorProc fColor32Proc; 1.114 + SkBlitRow::ColorRectProc fColorRect32Proc; 1.115 + 1.116 +private: 1.117 + unsigned fSrcA, fSrcR, fSrcG, fSrcB; 1.118 + 1.119 + // illegal 1.120 + SkARGB32_Blitter& operator=(const SkARGB32_Blitter&); 1.121 + 1.122 + typedef SkRasterBlitter INHERITED; 1.123 +}; 1.124 + 1.125 +class SkARGB32_Opaque_Blitter : public SkARGB32_Blitter { 1.126 +public: 1.127 + SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint) 1.128 + : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); } 1.129 + virtual void blitMask(const SkMask&, const SkIRect&); 1.130 + 1.131 +private: 1.132 + typedef SkARGB32_Blitter INHERITED; 1.133 +}; 1.134 + 1.135 +class SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter { 1.136 +public: 1.137 + SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint) 1.138 + : INHERITED(device, paint) {} 1.139 + virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]); 1.140 + 1.141 +private: 1.142 + typedef SkARGB32_Opaque_Blitter INHERITED; 1.143 +}; 1.144 + 1.145 +class SkARGB32_Shader_Blitter : public SkShaderBlitter { 1.146 +public: 1.147 + SkARGB32_Shader_Blitter(const SkBitmap& device, const SkPaint& paint); 1.148 + virtual ~SkARGB32_Shader_Blitter(); 1.149 + virtual void blitH(int x, int y, int width) SK_OVERRIDE; 1.150 + virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE; 1.151 + virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE; 1.152 + virtual void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) SK_OVERRIDE; 1.153 + virtual void blitMask(const SkMask&, const SkIRect&) SK_OVERRIDE; 1.154 + 1.155 +private: 1.156 + SkXfermode* fXfermode; 1.157 + SkPMColor* fBuffer; 1.158 + SkBlitRow::Proc32 fProc32; 1.159 + SkBlitRow::Proc32 fProc32Blend; 1.160 + bool fShadeDirectlyIntoDevice; 1.161 + bool fConstInY; 1.162 + 1.163 + // illegal 1.164 + SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&); 1.165 + 1.166 + typedef SkShaderBlitter INHERITED; 1.167 +}; 1.168 + 1.169 +/////////////////////////////////////////////////////////////////////////////// 1.170 + 1.171 +/* These return the correct subclass of blitter for their device config. 1.172 + 1.173 + Currently, they make the following assumptions about the state of the 1.174 + paint: 1.175 + 1.176 + 1. If there is an xfermode, there will also be a shader 1.177 + 2. If there is a colorfilter, there will be a shader that itself handles 1.178 + calling the filter, so the blitter can always ignore the colorfilter obj 1.179 + 1.180 + These pre-conditions must be handled by the caller, in our case 1.181 + SkBlitter::Choose(...) 1.182 + */ 1.183 + 1.184 +SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device, const SkPaint& paint, 1.185 + SkTBlitterAllocator* allocator); 1.186 + 1.187 +#endif