|  | /* | 
|  | * Copyright 2016 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #ifndef SkLinearBitmapPipeline_DEFINED | 
|  | #define SkLinearBitmapPipeline_DEFINED | 
|  |  | 
|  | #include "SkArenaAlloc.h" | 
|  | #include "SkColor.h" | 
|  | #include "SkImageInfo.h" | 
|  | #include "SkMatrix.h" | 
|  | #include "SkShader.h" | 
|  |  | 
|  | class SkEmbeddableLinearPipeline; | 
|  |  | 
|  | enum SkGammaType { | 
|  | kLinear_SkGammaType, | 
|  | kSRGB_SkGammaType, | 
|  | }; | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
|  | // SkLinearBitmapPipeline - encapsulates all the machinery for doing floating point pixel | 
|  | // processing in a linear color space. | 
|  | // Note: this class has unusual alignment requirements due to its use of SIMD instructions. The | 
|  | // class SkEmbeddableLinearPipeline below manages these requirements. | 
|  | class SkLinearBitmapPipeline { | 
|  | public: | 
|  | SkLinearBitmapPipeline( | 
|  | const SkMatrix& inverse, | 
|  | SkFilterQuality filterQuality, | 
|  | SkShader::TileMode xTile, SkShader::TileMode yTile, | 
|  | SkColor paintColor, | 
|  | const SkPixmap& srcPixmap, | 
|  | SkArenaAlloc* allocator); | 
|  |  | 
|  | SkLinearBitmapPipeline( | 
|  | const SkLinearBitmapPipeline& pipeline, | 
|  | const SkPixmap& srcPixmap, | 
|  | SkBlendMode, | 
|  | const SkImageInfo& dstInfo, | 
|  | SkArenaAlloc* allocator); | 
|  |  | 
|  | ~SkLinearBitmapPipeline(); | 
|  |  | 
|  | void shadeSpan4f(int x, int y, SkPM4f* dst, int count); | 
|  | void blitSpan(int32_t x, int32_t y, void* dst, int count); | 
|  |  | 
|  | class PointProcessorInterface; | 
|  | class SampleProcessorInterface; | 
|  | class BlendProcessorInterface; | 
|  | class DestinationInterface; | 
|  | class PixelAccessorInterface; | 
|  |  | 
|  | using MatrixCloner = | 
|  | std::function<PointProcessorInterface* (PointProcessorInterface*, SkArenaAlloc*)>; | 
|  | using TilerCloner = | 
|  | std::function<PointProcessorInterface* (SampleProcessorInterface*, SkArenaAlloc*)>; | 
|  |  | 
|  | PointProcessorInterface* chooseMatrix( | 
|  | PointProcessorInterface* next, | 
|  | const SkMatrix& inverse, | 
|  | SkArenaAlloc* allocator); | 
|  |  | 
|  | template <typename Tiler> | 
|  | PointProcessorInterface* createTiler(SampleProcessorInterface* next, SkISize dimensions, | 
|  | SkArenaAlloc* allocator); | 
|  |  | 
|  | template <typename XStrategy> | 
|  | PointProcessorInterface* chooseTilerYMode( | 
|  | SampleProcessorInterface* next, SkShader::TileMode yMode, SkISize dimensions, | 
|  | SkArenaAlloc* allocator); | 
|  |  | 
|  | PointProcessorInterface* chooseTiler( | 
|  | SampleProcessorInterface* next, | 
|  | SkISize dimensions, | 
|  | SkShader::TileMode xMode, SkShader::TileMode yMode, | 
|  | SkFilterQuality filterQuality, | 
|  | SkScalar dx, | 
|  | SkArenaAlloc* allocator); | 
|  |  | 
|  | template <SkColorType colorType> | 
|  | PixelAccessorInterface* chooseSpecificAccessor(const SkPixmap& srcPixmap, | 
|  | SkArenaAlloc* allocator); | 
|  |  | 
|  | PixelAccessorInterface* choosePixelAccessor( | 
|  | const SkPixmap& srcPixmap, | 
|  | const SkColor A8TintColor, | 
|  | SkArenaAlloc* allocator); | 
|  |  | 
|  | SampleProcessorInterface* chooseSampler( | 
|  | BlendProcessorInterface* next, | 
|  | SkFilterQuality filterQuality, | 
|  | SkShader::TileMode xTile, SkShader::TileMode yTile, | 
|  | const SkPixmap& srcPixmap, | 
|  | const SkColor A8TintColor, | 
|  | SkArenaAlloc* allocator); | 
|  |  | 
|  | BlendProcessorInterface* chooseBlenderForShading( | 
|  | SkAlphaType alphaType, | 
|  | float postAlpha, | 
|  | SkArenaAlloc* allocator); | 
|  |  | 
|  | PointProcessorInterface* fFirstStage; | 
|  | MatrixCloner             fMatrixStageCloner; | 
|  | TilerCloner              fTileStageCloner; | 
|  | DestinationInterface*    fLastStage; | 
|  | }; | 
|  |  | 
|  | #endif  // SkLinearBitmapPipeline_DEFINED |