Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2016 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkLinearBitmapPipeline_DEFINED
      9 #define SkLinearBitmapPipeline_DEFINED
     10 
     11 #include "SkArenaAlloc.h"
     12 #include "SkColor.h"
     13 #include "SkImageInfo.h"
     14 #include "SkMatrix.h"
     15 #include "SkShader.h"
     16 
     17 class SkEmbeddableLinearPipeline;
     18 
     19 enum SkGammaType {
     20     kLinear_SkGammaType,
     21     kSRGB_SkGammaType,
     22 };
     23 
     24 ///////////////////////////////////////////////////////////////////////////////////////////////////
     25 // SkLinearBitmapPipeline - encapsulates all the machinery for doing floating point pixel
     26 // processing in a linear color space.
     27 // Note: this class has unusual alignment requirements due to its use of SIMD instructions. The
     28 // class SkEmbeddableLinearPipeline below manages these requirements.
     29 class SkLinearBitmapPipeline {
     30 public:
     31     SkLinearBitmapPipeline(
     32         const SkMatrix& inverse,
     33         SkFilterQuality filterQuality,
     34         SkShader::TileMode xTile, SkShader::TileMode yTile,
     35         SkColor paintColor,
     36         const SkPixmap& srcPixmap,
     37         SkArenaAlloc* allocator);
     38 
     39     SkLinearBitmapPipeline(
     40         const SkLinearBitmapPipeline& pipeline,
     41         const SkPixmap& srcPixmap,
     42         SkBlendMode,
     43         const SkImageInfo& dstInfo,
     44         SkArenaAlloc* allocator);
     45 
     46     static SkLinearBitmapPipeline* ClonePipelineForBlitting(
     47         const SkLinearBitmapPipeline& pipeline,
     48         SkMatrix::TypeMask matrixMask,
     49         SkFilterQuality filterQuality,
     50         const SkPixmap& srcPixmap,
     51         float finalAlpha,
     52         SkBlendMode,
     53         const SkImageInfo& dstInfo,
     54         SkArenaAlloc* allocator);
     55 
     56     ~SkLinearBitmapPipeline();
     57 
     58     void shadeSpan4f(int x, int y, SkPM4f* dst, int count);
     59     void blitSpan(int32_t x, int32_t y, void* dst, int count);
     60 
     61     class PointProcessorInterface;
     62     class SampleProcessorInterface;
     63     class BlendProcessorInterface;
     64     class DestinationInterface;
     65     class PixelAccessorInterface;
     66 
     67     using MatrixCloner =
     68         std::function<PointProcessorInterface* (PointProcessorInterface*, SkArenaAlloc*)>;
     69     using TilerCloner =
     70         std::function<PointProcessorInterface* (SampleProcessorInterface*, SkArenaAlloc*)>;
     71 
     72     PointProcessorInterface* chooseMatrix(
     73         PointProcessorInterface* next,
     74         const SkMatrix& inverse,
     75         SkArenaAlloc* allocator);
     76 
     77     template <typename Tiler>
     78     PointProcessorInterface* createTiler(SampleProcessorInterface* next, SkISize dimensions,
     79                                          SkArenaAlloc* allocator);
     80 
     81     template <typename XStrategy>
     82     PointProcessorInterface* chooseTilerYMode(
     83         SampleProcessorInterface* next, SkShader::TileMode yMode, SkISize dimensions,
     84         SkArenaAlloc* allocator);
     85 
     86     PointProcessorInterface* chooseTiler(
     87         SampleProcessorInterface* next,
     88         SkISize dimensions,
     89         SkShader::TileMode xMode, SkShader::TileMode yMode,
     90         SkFilterQuality filterQuality,
     91         SkScalar dx,
     92         SkArenaAlloc* allocator);
     93 
     94     template <SkColorType colorType>
     95     PixelAccessorInterface* chooseSpecificAccessor(const SkPixmap& srcPixmap,
     96                                                    SkArenaAlloc* allocator);
     97 
     98     PixelAccessorInterface* choosePixelAccessor(
     99         const SkPixmap& srcPixmap,
    100         const SkColor A8TintColor,
    101         SkArenaAlloc* allocator);
    102 
    103     SampleProcessorInterface* chooseSampler(
    104         BlendProcessorInterface* next,
    105         SkFilterQuality filterQuality,
    106         SkShader::TileMode xTile, SkShader::TileMode yTile,
    107         const SkPixmap& srcPixmap,
    108         const SkColor A8TintColor,
    109         SkArenaAlloc* allocator);
    110 
    111     BlendProcessorInterface* chooseBlenderForShading(
    112         SkAlphaType alphaType,
    113         float postAlpha,
    114         SkArenaAlloc* allocator);
    115 
    116     PointProcessorInterface* fFirstStage;
    117     MatrixCloner             fMatrixStageCloner;
    118     TilerCloner              fTileStageCloner;
    119     DestinationInterface*    fLastStage;
    120 };
    121 
    122 #endif  // SkLinearBitmapPipeline_DEFINED
    123