| Index: src/core/SkLinearBitmapPipeline_matrix.h | 
| diff --git a/src/core/SkLinearBitmapPipeline_matrix.h b/src/core/SkLinearBitmapPipeline_matrix.h | 
| index b1bd81f1630f655a2a0dd8e208c3f3bf11651288..d194d0729a7fa30eb0b159f3af03e5dc63918410 100644 | 
| --- a/src/core/SkLinearBitmapPipeline_matrix.h | 
| +++ b/src/core/SkLinearBitmapPipeline_matrix.h | 
| @@ -85,6 +85,34 @@ private: | 
| const Sk4s fXSkew,   fYSkew; | 
| }; | 
|  | 
| +class PerspectiveMatrixStrategy { | 
| +public: | 
| +    PerspectiveMatrixStrategy(SkVector offset, SkVector scale, SkVector skew, | 
| +                              SkVector zSkew, SkScalar zOffset) | 
| +        : fXOffset{X(offset)}, fYOffset{Y(offset)}, fZOffset{zOffset} | 
| +        , fXScale{X(scale)},   fYScale{Y(scale)} | 
| +        , fXSkew{X(skew)},     fYSkew{Y(skew)}, fZXSkew{X(zSkew)}, fZYSkew{Y(zSkew)} { } | 
| +    void processPoints(Sk4s* xs, Sk4s* ys) { | 
| +        Sk4s newXs = fXScale * *xs +  fXSkew * *ys + fXOffset; | 
| +        Sk4s newYs =  fYSkew * *xs + fYScale * *ys + fYOffset; | 
| +        Sk4s newZs =  fZXSkew * *xs + fZYSkew * *ys + fZOffset; | 
| + | 
| +        *xs = newXs / newZs; | 
| +        *ys = newYs / newZs; | 
| +    } | 
| + | 
| +    template <typename Next> | 
| +    bool maybeProcessSpan(Span span, Next* next) { | 
| +        return false; | 
| +    } | 
| + | 
| +private: | 
| +    const Sk4s fXOffset, fYOffset, fZOffset; | 
| +    const Sk4s fXScale,  fYScale; | 
| +    const Sk4s fXSkew,   fYSkew, fZXSkew, fZYSkew; | 
| +}; | 
| + | 
| + | 
| }  // namespace | 
|  | 
| #endif  // SkLinearBitmapPipeline_matrix_DEFINED | 
|  |